diff --git a/.gitignore b/.gitignore index e2c97967..039c0ab7 100644 --- a/.gitignore +++ b/.gitignore @@ -297,3 +297,5 @@ __pycache__/ /Nuget /Xml /Svn +/Examples/Angular/Fluent/NpmPackage/package/*.tgz +/Examples/Angular/Fluent/NpmPackage/package diff --git a/Angular.Tests/FullStageTests.cs b/Angular.Tests/FullStageTests.cs index eeeb5661..1b4595aa 100644 --- a/Angular.Tests/FullStageTests.cs +++ b/Angular.Tests/FullStageTests.cs @@ -1,9 +1,7 @@ using System; -using System.Collections.Generic; using KY.Core.Dependency; using KY.Generator.Angular.Tests.Properties; using KY.Generator.AspDotNet; -using KY.Generator.Configuration; using KY.Generator.Csharp; using KY.Generator.Mappings; using KY.Generator.Output; diff --git a/Angular.Tests/KY.Generator.Angular.Tests.csproj b/Angular.Tests/KY.Generator.Angular.Tests.csproj index 83f3483c..33feef6a 100644 --- a/Angular.Tests/KY.Generator.Angular.Tests.csproj +++ b/Angular.Tests/KY.Generator.Angular.Tests.csproj @@ -1,13 +1,15 @@  - netcoreapp2.1 + net6.0 false + + latest - + @@ -16,7 +18,7 @@ - + @@ -35,4 +37,10 @@ + + + ..\..\Assemblies\Core.Common.Standard\bin\Debug\netstandard2.0\KY.Core.Common.dll + + + diff --git a/Angular/AngularModule.cs b/Angular/AngularModule.cs index dedc8c9b..4b857417 100644 --- a/Angular/AngularModule.cs +++ b/Angular/AngularModule.cs @@ -1,25 +1,21 @@ using KY.Core.Dependency; using KY.Core.Module; using KY.Generator.Angular.Commands; -using KY.Generator.Angular.Configurations; -using KY.Generator.Angular.Writers; +using KY.Generator.Angular.Languages; using KY.Generator.Command; -using KY.Generator.Configuration; +using KY.Generator.Languages; -namespace KY.Generator.Angular +namespace KY.Generator.Angular; + +public class AngularModule : ModuleBase { - public class AngularModule : ModuleBase + public AngularModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public AngularModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - } - - public override void Initialize() - { - this.DependencyResolver.Get().Map("angular"); - } + this.DependencyResolver.Get().Register(AngularServiceCommand.Names); + this.DependencyResolver.Get().Register(AngularModelCommand.Names); + this.DependencyResolver.Get().Register(AngularPackageCommand.Names); + this.DependencyResolver.Bind().To(); + this.DependencyResolver.Bind().ToSingleton(); } } \ No newline at end of file diff --git a/Angular/Commands/AngularModelCommand.cs b/Angular/Commands/AngularModelCommand.cs index e4295655..55f9d56a 100644 --- a/Angular/Commands/AngularModelCommand.cs +++ b/Angular/Commands/AngularModelCommand.cs @@ -1,58 +1,38 @@ -using System.Collections.Generic; -using System.Linq; -using KY.Core.Dependency; -using KY.Generator.Angular.Configurations; +using KY.Core.Dependency; +using KY.Generator.Angular.Languages; using KY.Generator.Angular.Writers; using KY.Generator.Command; +using KY.Generator.Command.Extensions; using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Transfer; using KY.Generator.TypeScript; using KY.Generator.TypeScript.Transfer; -namespace KY.Generator.Angular.Commands -{ - public class AngularModelCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - - public override string[] Names { get; } = { "angular-model" }; - - public AngularModelCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } - - public override IGeneratorCommandResult Run(IOutput output) - { - AngularWriteConfiguration writeConfiguration = new AngularWriteConfiguration(); - writeConfiguration.AddHeader = !this.Parameters.SkipHeader; - writeConfiguration.FormatNames = this.Parameters.FormatNames; - writeConfiguration.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - writeConfiguration.Model = new AngularWriteModelConfiguration(); - writeConfiguration.Model.CopyBaseFrom(writeConfiguration); - writeConfiguration.Model.Namespace = this.Parameters.Namespace; - writeConfiguration.Model.RelativePath = this.Parameters.RelativePath; - writeConfiguration.Model.SkipNamespace = this.Parameters.SkipNamespace; - writeConfiguration.Model.PropertiesToFields = this.Parameters.PropertiesToFields; - writeConfiguration.Model.FieldsToProperties = this.Parameters.FieldsToProperties; - writeConfiguration.Model.PreferInterfaces = this.Parameters.PreferInterfaces; - writeConfiguration.Model.WithOptionalProperties = this.Parameters.WithOptionalProperties; - writeConfiguration.Model.FormatNames = this.Parameters.FormatNames; +namespace KY.Generator.Angular.Commands; - output.DeleteAllRelatedFiles(writeConfiguration.OutputId, this.Parameters.RelativePath); - - if (this.Parameters.Strict && !this.TransferObjects.OfType().Any()) - { - this.TransferObjects.Add(new TsConfig { CompilerOptions = { Strict = true } }); - } - TypeScriptStrictHelper.Read(this.Parameters.RelativePath, output, this.resolver, this.TransferObjects); +public class AngularModelCommand(IDependencyResolver resolver) : GeneratorCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(AngularModelCommand)), "angular-model"]; - List files = new List(); - this.resolver.Create().Write(writeConfiguration, this.TransferObjects, files); - files.ForEach(file => writeConfiguration.Language.Write(file, output)); + public override void Prepare() + { + Options options = resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = resolver.Get(); + generatorOptions.Formatting.AllowedSpecialCharacters = "$"; + generatorOptions.SkipNamespace = true; + generatorOptions.PropertiesToFields = true; + TypeScriptOptions typeScriptOptions = options.Get(); + // TODO: Fix path is null + typeScriptOptions.SetStrict(this.Parameters.RelativePath, resolver); + } - return this.Success(); - } + public override IGeneratorCommandResult Run() + { + // TODO: Fix path is null + resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); + resolver.Create().FormatNames().Write(this.Parameters.RelativePath); + resolver.Create().Execute(this.Parameters.RelativePath); + return this.Success(); } -} +} \ No newline at end of file diff --git a/Angular/Commands/AngularModelCommandParameters.cs b/Angular/Commands/AngularModelCommandParameters.cs deleted file mode 100644 index 2d6ea6a0..00000000 --- a/Angular/Commands/AngularModelCommandParameters.cs +++ /dev/null @@ -1,10 +0,0 @@ -using KY.Generator.Command; - -namespace KY.Generator.Angular.Commands -{ - public class AngularModelCommandParameters : GeneratorCommandParameters - { - public string Namespace { get; set; } - public bool Strict { get; set; } - } -} diff --git a/Angular/Commands/AngularPackageCommand.cs b/Angular/Commands/AngularPackageCommand.cs new file mode 100644 index 00000000..34818e4f --- /dev/null +++ b/Angular/Commands/AngularPackageCommand.cs @@ -0,0 +1,84 @@ +using KY.Core; +using KY.Core.DataAccess; +using KY.Core.Dependency; +using KY.Generator.Angular.Languages; +using KY.Generator.Angular.Writers; +using KY.Generator.Command; +using KY.Generator.Command.Extensions; +using KY.Generator.Output; +using KY.Generator.TypeScript; + +namespace KY.Generator.Angular.Commands; + +public class AngularPackageCommand : GeneratorCommand +{ + private readonly IDependencyResolver resolver; + private readonly IOutput output; + private string nameWithoutScope; + private string packagePath; + private string relativePackagePath; + + public static string[] Names { get; } = [ToCommand(nameof(AngularPackageCommand)), "angular-package"]; + public List Commands { get; } = []; + + public AngularPackageCommand(IDependencyResolver resolver, IOutput output) + { + this.resolver = resolver; + this.output = output; + } + + public override void Prepare() + { + this.nameWithoutScope = this.Parameters.Name.Split('/').Last(); + this.relativePackagePath = FileSystem.Combine(this.Parameters.RelativePath, AngularPackageWriter.BasePackageName, "projects", this.nameWithoutScope); + this.packagePath = FileSystem.Combine(this.output.ToString(), this.relativePackagePath); + base.Prepare(); + this.Commands.ForEach(command => command.Prepare()); + } + + public override IGeneratorCommandResult Run() + { + Options options = this.resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = this.resolver.Get(); + generatorOptions.Formatting.AllowedSpecialCharacters = "$"; + generatorOptions.SkipNamespace = true; + generatorOptions.PropertiesToFields = true; + TypeScriptOptions typeScriptOptions = options.Get(); + typeScriptOptions.SetStrict(this.Parameters.RelativePath, this.resolver); + typeScriptOptions.ForceIndex = true; + + string servicePath = this.Commands.OfType().FirstOrDefault()?.Parameters.RelativePath; + string modelPath = this.Commands.OfType().FirstOrDefault()?.Parameters.RelativePath; + string libPath = FileSystem.Combine(this.relativePackagePath, "src", "lib"); + this.Commands.ForEach(command => command.Parameters.RelativePath = FileSystem.Combine(libPath, command.Parameters.RelativePath)); + this.Commands.OfType().ForEach(command => command.Parameters.RelativeModelPath = FileSystem.Combine(libPath, command.Parameters.RelativeModelPath)); + + AngularPackageWriter writer = this.resolver.Create(); + writer.Write(this.nameWithoutScope, this.Parameters.Name, this.Parameters.Version, this.packagePath, this.Parameters.DependsOn, this.Parameters.CliVersion, servicePath, modelPath, this.Parameters.IncrementVersion, this.Parameters.VersionFromNpm); + this.Commands.ForEach(command => command.Run()); + return this.Success(); + } + + public override void FollowUp() + { + base.FollowUp(); + this.Commands.ForEach(command => command.FollowUp()); + bool publish = this.Parameters.Publish || this.Parameters.PublishLocal; + if (!this.Parameters.Build && !publish) + { + return; + } + AngularPackageBuilder builder = this.resolver.Create(); + builder.Build(this.packagePath); + if (this.Parameters.Publish) + { + builder.Publish(this.packagePath); + } + if (this.Parameters.PublishLocal) + { + builder.PublishLocal(this.packagePath); + } + } +} diff --git a/Angular/Commands/AngularPackageCommandParameters.cs b/Angular/Commands/AngularPackageCommandParameters.cs new file mode 100644 index 00000000..692838d9 --- /dev/null +++ b/Angular/Commands/AngularPackageCommandParameters.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using KY.Generator.Angular.Models; +using KY.Generator.Command; + +namespace KY.Generator.Angular.Commands +{ + public class AngularPackageCommandParameters : GeneratorCommandParameters + { + public string Name { get; set; } + public string Version { get; set; } + public string CliVersion { get; set; } + public List DependsOn { get; set; } = new(); + public bool Build { get; set; } + public bool Publish { get; set; } + public bool PublishLocal { get; set; } + public bool VersionFromNpm { get; set; } + public IncrementVersion IncrementVersion { get; set; } + } +} diff --git a/Angular/Commands/AngularPackageDependsOnParameter.cs b/Angular/Commands/AngularPackageDependsOnParameter.cs new file mode 100644 index 00000000..6d6b770b --- /dev/null +++ b/Angular/Commands/AngularPackageDependsOnParameter.cs @@ -0,0 +1,14 @@ +namespace KY.Generator.Angular.Commands +{ + public class AngularPackageDependsOnParameter + { + public string Name { get; } + public string Version { get; } + + public AngularPackageDependsOnParameter(string name, string version) + { + this.Name = name; + this.Version = version; + } + } +} diff --git a/Angular/Commands/AngularServiceCommand.cs b/Angular/Commands/AngularServiceCommand.cs index 08ceac09..2131bcaa 100644 --- a/Angular/Commands/AngularServiceCommand.cs +++ b/Angular/Commands/AngularServiceCommand.cs @@ -1,65 +1,62 @@ -using System.Collections.Generic; -using System.Linq; -using KY.Core.Dependency; +using KY.Core.Dependency; using KY.Generator.Angular.Configurations; +using KY.Generator.Angular.Languages; using KY.Generator.Angular.Writers; using KY.Generator.Command; +using KY.Generator.Command.Extensions; using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Transfer; using KY.Generator.TypeScript; using KY.Generator.TypeScript.Transfer; -namespace KY.Generator.Angular.Commands +namespace KY.Generator.Angular.Commands; + +public class AngularServiceCommand : GeneratorCommand { - public class AngularServiceCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "angular-service" }; + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(AngularServiceCommand)), "angular-service"]; - public AngularServiceCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public AngularServiceCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) - { - AngularWriteConfiguration writeConfiguration = new AngularWriteConfiguration(); - writeConfiguration.AddHeader = !this.Parameters.SkipHeader; - writeConfiguration.FormatNames = this.Parameters.FormatNames; - writeConfiguration.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - writeConfiguration.Service = new AngularWriteServiceConfiguration(); - writeConfiguration.Service.Name = this.Parameters.Name; - writeConfiguration.Service.RelativePath = this.Parameters.RelativePath; - writeConfiguration.Service.EndlessTries = this.Parameters.EndlessTries; - writeConfiguration.Service.Timeouts = this.Parameters.Timeouts; - writeConfiguration.Model.RelativePath = this.Parameters.RelativeModelPath; - writeConfiguration.Service.HttpClient.Name = this.Parameters.HttpClient; - writeConfiguration.Service.HttpClient.Import = this.Parameters.HttpClientUsing; - writeConfiguration.Service.HttpClient.Get = this.Parameters.HttpClientGet; - writeConfiguration.Service.HttpClient.HasGetOptions = this.Parameters.HttpClientGetOptions; - writeConfiguration.Service.HttpClient.Post = this.Parameters.HttpClientPost; - writeConfiguration.Service.HttpClient.HasPostOptions = this.Parameters.HttpClientPostOptions; - writeConfiguration.Service.HttpClient.Patch = this.Parameters.HttpClientPatch; - writeConfiguration.Service.HttpClient.HasPatchOptions = this.Parameters.HttpClientPatchOptions; - writeConfiguration.Service.HttpClient.Put = this.Parameters.HttpClientPut; - writeConfiguration.Service.HttpClient.HasPutOptions = this.Parameters.HttpClientPutOptions; - writeConfiguration.Service.HttpClient.Delete = this.Parameters.HttpClientDelete; - writeConfiguration.Service.HttpClient.HasDeleteOptions = this.Parameters.HttpClientDeleteOptions; + public override IGeneratorCommandResult Run() + { + Options options = this.resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = this.resolver.Get(); + generatorOptions.Formatting.AllowedSpecialCharacters = "$"; + generatorOptions.SkipNamespace = true; + generatorOptions.PropertiesToFields = true; + TypeScriptOptions typeScriptOptions = options.Get(); + typeScriptOptions.SetStrict(this.Parameters.RelativePath, this.resolver); - output.DeleteAllRelatedFiles(writeConfiguration.OutputId, this.Parameters.RelativePath); + AngularWriteConfiguration writeConfiguration = new(); + writeConfiguration.Service = new AngularWriteServiceConfiguration(); + writeConfiguration.Service.Name = this.Parameters.Name; + writeConfiguration.Service.RelativePath = this.Parameters.RelativePath; + writeConfiguration.Service.EndlessTries = this.Parameters.EndlessTries; + writeConfiguration.Service.Timeouts = this.Parameters.Timeouts; + writeConfiguration.Model.RelativePath = this.Parameters.RelativeModelPath; + writeConfiguration.Service.HttpClient.Name = this.Parameters.HttpClient; + writeConfiguration.Service.HttpClient.Import = this.Parameters.HttpClientUsing; + writeConfiguration.Service.HttpClient.Get = this.Parameters.HttpClientGet; + writeConfiguration.Service.HttpClient.HasGetOptions = this.Parameters.HttpClientGetOptions; + writeConfiguration.Service.HttpClient.Post = this.Parameters.HttpClientPost; + writeConfiguration.Service.HttpClient.HasPostOptions = this.Parameters.HttpClientPostOptions; + writeConfiguration.Service.HttpClient.Patch = this.Parameters.HttpClientPatch; + writeConfiguration.Service.HttpClient.HasPatchOptions = this.Parameters.HttpClientPatchOptions; + writeConfiguration.Service.HttpClient.Put = this.Parameters.HttpClientPut; + writeConfiguration.Service.HttpClient.HasPutOptions = this.Parameters.HttpClientPutOptions; + writeConfiguration.Service.HttpClient.Delete = this.Parameters.HttpClientDelete; + writeConfiguration.Service.HttpClient.HasDeleteOptions = this.Parameters.HttpClientDeleteOptions; - if (this.Parameters.Strict && !this.TransferObjects.OfType().Any()) - { - this.TransferObjects.Add(new TsConfig { CompilerOptions = { Strict = true } }); - } - TypeScriptStrictHelper.Read(this.Parameters.RelativePath, output, this.resolver, this.TransferObjects); + this.resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); - List files = new List(); - this.resolver.Create().Write(writeConfiguration, this.TransferObjects, files); - files.ForEach(file => writeConfiguration.Language.Write(file, output)); + this.resolver.Create().Write(writeConfiguration); + this.resolver.Create().Execute(this.Parameters.RelativePath); - return this.Success(); - } + return this.Success(); } } diff --git a/Angular/Commands/AngularServiceCommandParameters.cs b/Angular/Commands/AngularServiceCommandParameters.cs index 0afc6546..3004d805 100644 --- a/Angular/Commands/AngularServiceCommandParameters.cs +++ b/Angular/Commands/AngularServiceCommandParameters.cs @@ -9,7 +9,6 @@ public class AngularServiceCommandParameters : GeneratorCommandParameters public string RelativeModelPath { get; set; } public bool EndlessTries { get; set; } public List Timeouts { get; set; } - public bool Strict { get; set; } public string HttpClient { get; set; } public string HttpClientUsing { get; set; } public string HttpClientGet { get; set; } diff --git a/Angular/Configurations/AngularWriteConfiguration.cs b/Angular/Configurations/AngularWriteConfiguration.cs index aff09256..58678ea8 100644 --- a/Angular/Configurations/AngularWriteConfiguration.cs +++ b/Angular/Configurations/AngularWriteConfiguration.cs @@ -1,27 +1,15 @@ -using System; -using KY.Generator.Angular.Languages; -using KY.Generator.Configurations; - -namespace KY.Generator.Angular.Configurations +namespace KY.Generator.Angular.Configurations { - public class AngularWriteConfiguration : ConfigurationBase, IFormattableConfiguration + public class AngularWriteConfiguration { public AngularWriteServiceConfiguration Service { get; set; } public AngularWriteModelConfiguration Model { get; set; } - public bool FormatNames { get; set; } public bool WriteModels { get; set; } - public AngularWriteConfiguration(ConfigurationBase copyFrom = null) + public AngularWriteConfiguration() { - if (copyFrom != null) - { - this.CopyBaseFrom(copyFrom); - } - this.Language = new AngularTypeScriptLanguage(); - this.FormatNames = true; this.WriteModels = true; this.Model = new AngularWriteModelConfiguration(); - this.Formatting.AllowedSpecialCharacters = "$"; } } -} \ No newline at end of file +} diff --git a/Angular/Configurations/AngularWriteModelConfiguration.cs b/Angular/Configurations/AngularWriteModelConfiguration.cs index 81f8c1f2..0de80cea 100644 --- a/Angular/Configurations/AngularWriteModelConfiguration.cs +++ b/Angular/Configurations/AngularWriteModelConfiguration.cs @@ -5,10 +5,5 @@ namespace KY.Generator.Angular.Configurations { public class AngularWriteModelConfiguration : ModelWriteConfiguration { - public AngularWriteModelConfiguration() - { - this.Language = TypeScriptLanguage.Instance; - this.SkipNamespace = true; - } } } diff --git a/Angular/Fluent/AngularModelSyntax.cs b/Angular/Fluent/AngularModelSyntax.cs index d24921bb..9808be57 100644 --- a/Angular/Fluent/AngularModelSyntax.cs +++ b/Angular/Fluent/AngularModelSyntax.cs @@ -1,23 +1,24 @@ using System.Linq; using KY.Core; using KY.Generator.Angular.Commands; +using KY.Generator.Syntax; namespace KY.Generator.Angular.Fluent { internal class AngularModelSyntax : IAngularModelSyntax { - private readonly AngularWriteSyntax syntax; + private readonly IExecutableSyntax syntax; private readonly AngularModelCommand command; - public AngularModelSyntax(AngularWriteSyntax syntax, AngularModelCommand command) + public AngularModelSyntax(IExecutableSyntax syntax, AngularModelCommand command) { this.syntax = syntax; this.command = command; } - public IAngularModelSyntax SkipHeader() + public IAngularModelSyntax NoHeader() { - this.command.Parameters.SkipHeader = true; + this.command.Parameters.NoHeader = true; return this; } @@ -52,12 +53,6 @@ public IAngularModelSyntax FieldsToProperties(bool value = true) return this; } - public IAngularModelSyntax Strict(bool value = true) - { - this.command.Parameters.Strict = value; - return this; - } - public IAngularModelSyntax PreferInterfaces() { this.command.Parameters.PreferInterfaces = true; diff --git a/Angular/Fluent/AngularPackageSyntax.cs b/Angular/Fluent/AngularPackageSyntax.cs new file mode 100644 index 00000000..a2c9c150 --- /dev/null +++ b/Angular/Fluent/AngularPackageSyntax.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Generic; +using KY.Core.Dependency; +using KY.Generator.Angular.Commands; +using KY.Generator.Angular.Models; +using KY.Generator.Command; +using KY.Generator.Syntax; + +namespace KY.Generator.Angular.Fluent +{ + internal class AngularPackageSyntax : IAngularPackageSyntax, IExecutableSyntax + { + private readonly IDependencyResolver resolver; + private readonly AngularPackageCommand command; + + public List Commands => this.command.Commands; + + public AngularPackageSyntax(IDependencyResolver resolver, AngularPackageCommand command) + { + this.resolver = resolver; + this.command = command; + } + + public IAngularPackageSyntax Name(string packageName) + { + this.command.Parameters.Name = packageName; + return this; + } + + public IAngularPackageSyntax Version(string version) + { + this.command.Parameters.Version = version; + return this; + } + + public IAngularPackageSyntax VersionFromNpm() + { + this.command.Parameters.VersionFromNpm = true; + return this; + } + + public IAngularPackageSyntax IncrementMajorVersion() + { + this.command.Parameters.IncrementVersion = IncrementVersion.Major; + return this; + } + + public IAngularPackageSyntax IncrementMinorVersion() + { + this.command.Parameters.IncrementVersion = IncrementVersion.Minor; + return this; + } + + public IAngularPackageSyntax IncrementPatchVersion() + { + this.command.Parameters.IncrementVersion = IncrementVersion.Patch; + return this; + } + + public IAngularPackageSyntax CliVersion(string version) + { + this.command.Parameters.CliVersion = version; + return this; + } + + public IAngularPackageSyntax DependsOn(string packageName, string version) + { + this.command.Parameters.DependsOn.Add(new AngularPackageDependsOnParameter(packageName, version)); + return this; + } + + public IAngularPackageSyntax OutputPath(string path) + { + this.command.Parameters.RelativePath = path; + return this; + } + + public IAngularPackageSyntax Build() + { + this.command.Parameters.Build = true; + return this; + } + + public IAngularPackageSyntax Publish() + { + this.command.Parameters.Publish = true; + return this; + } + + public IAngularPackageSyntax PublishLocal() + { + this.command.Parameters.PublishLocal = true; + return this; + } + + public IAngularPackageSyntax Models(Action action = null) + { + AngularModelCommand modelCommand = this.resolver.Create(); + this.Commands.Add(modelCommand); + action?.Invoke(new AngularModelSyntax(this, modelCommand)); + return this; + } + + public IAngularPackageSyntax Services(Action action = null) + { + AngularServiceCommand serviceCommand = this.resolver.Create(); + this.Commands.Add(serviceCommand); + action?.Invoke(new AngularServiceSyntax(this, serviceCommand)); + return this; + } + } +} diff --git a/Angular/Fluent/AngularServiceSyntax.cs b/Angular/Fluent/AngularServiceSyntax.cs index d4ac863f..8dcfd3a0 100644 --- a/Angular/Fluent/AngularServiceSyntax.cs +++ b/Angular/Fluent/AngularServiceSyntax.cs @@ -1,24 +1,25 @@ using System; using System.Linq; using KY.Generator.Angular.Commands; +using KY.Generator.Syntax; namespace KY.Generator.Angular.Fluent { internal class AngularServiceSyntax : IAngularServiceSyntax, IAngularHttpClientSyntax { - private readonly AngularWriteSyntax syntax; + private readonly IExecutableSyntax syntax; private readonly AngularServiceCommand command; - public AngularServiceSyntax(AngularWriteSyntax syntax, AngularServiceCommand command) + public AngularServiceSyntax(IExecutableSyntax syntax, AngularServiceCommand command) { this.syntax = syntax; this.command = command; this.command.Parameters.RelativeModelPath = this.syntax.Commands.OfType().FirstOrDefault()?.Parameters.RelativePath; } - public IAngularServiceSyntax SkipHeader() + public IAngularServiceSyntax NoHeader() { - this.command.Parameters.SkipHeader = true; + this.command.Parameters.NoHeader = true; return this; } @@ -34,12 +35,6 @@ public IAngularServiceSyntax OutputPath(string path) return this; } - public IAngularServiceSyntax Strict(bool value = true) - { - this.command.Parameters.Strict = value; - return this; - } - public IAngularServiceSyntax Name(string name) { this.command.Parameters.Name = name; diff --git a/Angular/Fluent/AngularWriteSyntax.cs b/Angular/Fluent/AngularWriteSyntax.cs index d4578ad1..61fb5e70 100644 --- a/Angular/Fluent/AngularWriteSyntax.cs +++ b/Angular/Fluent/AngularWriteSyntax.cs @@ -1,36 +1,47 @@ using System; using System.Collections.Generic; +using KY.Core; +using KY.Core.Dependency; using KY.Generator.Angular.Commands; using KY.Generator.Command; using KY.Generator.Syntax; namespace KY.Generator.Angular.Fluent { - internal class AngularWriteSyntax : IAngularWriteSyntax + internal class AngularWriteSyntax : IAngularWriteSyntax, IExecutableSyntax { - private readonly IWriteFluentSyntaxInternal syntax; + private readonly IDependencyResolver resolver; - public List Commands => this.syntax.Commands; + public List Commands { get; } = new(); - public AngularWriteSyntax(IWriteFluentSyntaxInternal syntax) + public AngularWriteSyntax(IDependencyResolver resolver) { - this.syntax = syntax; + this.resolver = resolver; } public IAngularWriteSyntax Models(Action action = null) { - AngularModelCommand command = new(this.syntax.Resolver); - this.syntax.Commands.Add(command); + AngularModelCommand command = this.resolver.Create(); + this.Commands.Add(command); action?.Invoke(new AngularModelSyntax(this, command)); return this; } public IAngularWriteSyntax Services(Action action = null) { - AngularServiceCommand command = new(this.syntax.Resolver); - this.syntax.Commands.Add(command); + AngularServiceCommand command = this.resolver.Create(); + this.Commands.Add(command); action?.Invoke(new AngularServiceSyntax(this, command)); return this; } + + public IAngularWriteSyntax Package(Action action) + { + action.AssertIsNotNull(); + AngularPackageCommand command = this.resolver.Create(); + this.Commands.Add(command); + action.Invoke(new AngularPackageSyntax(this.resolver, command)); + return this; + } } } diff --git a/Angular/Fluent/Extensions/WriteFluentSyntaxExtension.cs b/Angular/Fluent/Extensions/WriteFluentSyntaxExtension.cs new file mode 100644 index 00000000..ea709286 --- /dev/null +++ b/Angular/Fluent/Extensions/WriteFluentSyntaxExtension.cs @@ -0,0 +1,24 @@ +using System; +using KY.Core; +using KY.Generator.Angular.Fluent; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace +namespace KY.Generator +{ + public static class WriteFluentSyntaxExtension + { + /// + /// Executes the Angular write commands. Use at least one command! + /// + public static IWriteFluentSyntax Angular(this IWriteFluentSyntax syntax, Action action) + { + IFluentInternalSyntax internalSyntax = syntax.CastTo(); + AngularWriteSyntax writeSyntax = internalSyntax.Resolver.Create(); + internalSyntax.Syntaxes.Add(writeSyntax); + action(writeSyntax); + writeSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Angular)} action requires at least one command. E.g. '.{nameof(Angular)}(write => write.{nameof(IAngularWriteSyntax.Models)}(...))'"); + return syntax; + } + } +} diff --git a/Angular/Fluent/IAngularModelSyntax.cs b/Angular/Fluent/IAngularModelSyntax.cs index 35c2e2a2..88c09d03 100644 --- a/Angular/Fluent/IAngularModelSyntax.cs +++ b/Angular/Fluent/IAngularModelSyntax.cs @@ -5,7 +5,7 @@ public interface IAngularModelSyntax /// /// Skips the <auto-generated> header. DO NOT USE THIS IN PRODUCTION. This is only meant unit testing /// - IAngularModelSyntax SkipHeader(); + IAngularModelSyntax NoHeader(); /// /// If set to false, stops formatting the language specific naming like from C# property MyProperty to TypeScript property myProperty @@ -35,13 +35,6 @@ public interface IAngularModelSyntax /// IAngularModelSyntax FieldsToProperties(bool value = true); - /// - /// Generates code, valid for strict mode - /// - /// - /// - IAngularModelSyntax Strict(bool value = true); - /// /// Tries to generate all models as interfaces /// diff --git a/Angular/Fluent/IAngularPackageSyntax.cs b/Angular/Fluent/IAngularPackageSyntax.cs new file mode 100644 index 00000000..248a29b9 --- /dev/null +++ b/Angular/Fluent/IAngularPackageSyntax.cs @@ -0,0 +1,63 @@ +namespace KY.Generator.Angular.Fluent +{ + public interface IAngularPackageSyntax : IAngularWriteBaseSyntax + { + /// + /// Set the name of the packages (scope is optional) e.g. @scope/my-lib [REQUIRED] + /// + IAngularPackageSyntax Name(string packageName); + + /// + /// Set the version of the package (semver is allowed) [REQUIRED] + /// + IAngularPackageSyntax Version(string version); + + /// + /// Reads the latest version from npm + /// + IAngularPackageSyntax VersionFromNpm(); + + /// + /// Increments the major (1.0.0) version of the package when changes are found + /// + IAngularPackageSyntax IncrementMajorVersion(); + + /// + /// Increments the minor (0.1.0) version of the package when changes are found + /// + IAngularPackageSyntax IncrementMinorVersion(); + + /// + /// Increments the patch/bugfix/revision (0.0.1) version of the package when changes are found + /// + IAngularPackageSyntax IncrementPatchVersion(); + + /// + /// Set the version of the angular cli (semver is allowed) + /// + IAngularPackageSyntax CliVersion(string version); + + /// + /// Adds a peer dependency to the package. Version is required and can look like: ^1.2.3 + /// + IAngularPackageSyntax DependsOn(string packageName, string version); + + /// + IAngularPackageSyntax OutputPath(string path); + + /// + /// Builds the package after generation is done + /// + IAngularPackageSyntax Build(); + + /// + /// Builds and publish the package after generation is done + /// + IAngularPackageSyntax Publish(); + + /// + /// Builds and publish the package to the root folder of the package after generation is done + /// + IAngularPackageSyntax PublishLocal(); + } +} diff --git a/Angular/Fluent/IAngularServiceSyntax.cs b/Angular/Fluent/IAngularServiceSyntax.cs index 16a6c9f3..e880cc83 100644 --- a/Angular/Fluent/IAngularServiceSyntax.cs +++ b/Angular/Fluent/IAngularServiceSyntax.cs @@ -2,8 +2,8 @@ { public interface IAngularServiceSyntax { - /// - IAngularServiceSyntax SkipHeader(); + /// + IAngularServiceSyntax NoHeader(); /// IAngularServiceSyntax FormatNames(bool value = true); @@ -11,9 +11,6 @@ public interface IAngularServiceSyntax /// IAngularServiceSyntax OutputPath(string path); - /// - IAngularServiceSyntax Strict(bool value = true); - /// /// Renames the controller. Use {0} to inject the controller name without "Controller" /// diff --git a/Angular/Fluent/IAngularWriteBaseSyntax.cs b/Angular/Fluent/IAngularWriteBaseSyntax.cs new file mode 100644 index 00000000..b24fb495 --- /dev/null +++ b/Angular/Fluent/IAngularWriteBaseSyntax.cs @@ -0,0 +1,17 @@ +using System; + +namespace KY.Generator.Angular.Fluent +{ + public interface IAngularWriteBaseSyntax + { + /// + /// Writes all models (POCOs) from all previous read actions to the output, with some angular specific modifications + /// + T Models(Action action = null); + + /// + /// Writes all services from all previous read actions to the output + /// + T Services(Action action = null); + } +} diff --git a/Angular/Fluent/IAngularWriteSyntax.cs b/Angular/Fluent/IAngularWriteSyntax.cs index bb6a26b6..b577e6a9 100644 --- a/Angular/Fluent/IAngularWriteSyntax.cs +++ b/Angular/Fluent/IAngularWriteSyntax.cs @@ -2,16 +2,11 @@ namespace KY.Generator.Angular.Fluent { - public interface IAngularWriteSyntax + public interface IAngularWriteSyntax : IAngularWriteBaseSyntax { /// - /// Writes all models (POCOs) from all previous read actions to the output, with some angular specific modifications + /// Creates the code for a npm package /// - IAngularWriteSyntax Models(Action action = null); - - /// - /// Writes all services from all previous read actions to the output - /// - IAngularWriteSyntax Services(Action action = null); + IAngularWriteSyntax Package(Action action); } -} \ No newline at end of file +} diff --git a/Angular/Fluent/WriteFluentSyntaxExtension.cs b/Angular/Fluent/WriteFluentSyntaxExtension.cs deleted file mode 100644 index dfe45351..00000000 --- a/Angular/Fluent/WriteFluentSyntaxExtension.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using KY.Generator.Angular.Fluent; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace -namespace KY.Generator -{ - public static class WriteFluentSyntaxExtension - { - public static IWriteFluentSyntax Angular(this IWriteFluentSyntax syntax, Action action) - { - action(new AngularWriteSyntax((IWriteFluentSyntaxInternal)syntax)); - return syntax; - } - } -} \ No newline at end of file diff --git a/Angular/KY.Generator.Angular.csproj b/Angular/KY.Generator.Angular.csproj index 64878b1f..7b45b348 100644 --- a/Angular/KY.Generator.Angular.csproj +++ b/Angular/KY.Generator.Angular.csproj @@ -1,41 +1,47 @@  - - netstandard2.0 - KY-Programming - KY-Programming - KY.Generator - 7.6.0 - 2021 - KY-Programming - Angular Module for KY-Generator -Download KY.Generator to use this module - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator Angular - latest - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + KY.Generator + 10.0.0-preview.2 + 2025 - KY-Programming + Angular Module for KY-Generator + Download KY.Generator to use this module + + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator Angular + latest + - - ..\bin\Debug - 1701;1702 - + + ..\bin\Debug + 1701;1702 + - - ..\bin\Release - 1701;1702;1591 - ..\bin\Release\KY.Generator.Angular.xml - + + ..\bin\Release + 1701;1702;1591 + ..\bin\Release\KY.Generator.Angular.xml + - - - + + + + + + - - - - - + + + + diff --git a/Angular/KY.Generator.Angular.csproj.DotSettings b/Angular/KY.Generator.Angular.csproj.DotSettings new file mode 100644 index 00000000..e46c24fe --- /dev/null +++ b/Angular/KY.Generator.Angular.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Angular/Languages/AngularTypeScriptLanguage.cs b/Angular/Languages/AngularTypeScriptLanguage.cs index 71a82cb3..7e5600bc 100644 --- a/Angular/Languages/AngularTypeScriptLanguage.cs +++ b/Angular/Languages/AngularTypeScriptLanguage.cs @@ -1,23 +1,15 @@ -using System; +using KY.Core.Dependency; +using KY.Generator.Models; using KY.Generator.TypeScript.Languages; namespace KY.Generator.Angular.Languages { internal class AngularTypeScriptLanguage : TypeScriptLanguage { - public AngularTypeScriptLanguage() + public AngularTypeScriptLanguage(IDependencyResolver resolver) + : base(resolver) { - this.Key = TypeScriptLanguage.Instance.Key; - } - - public override string FormatFileName(string fileName, string fileType = null) - { - string formattedFileName = base.FormatFileName(fileName, fileType); - if ("service".Equals(fileType, StringComparison.CurrentCultureIgnoreCase)) - { - formattedFileName = formattedFileName.Replace("-service.ts", ".service.ts"); - } - return formattedFileName; + this.Formatting.Add(new FileNameReplacer("angular-service", "^(.*)-service$", "$1.service", "service")); } } -} \ No newline at end of file +} diff --git a/Angular/Models/IncrementVersion.cs b/Angular/Models/IncrementVersion.cs new file mode 100644 index 00000000..24f4d870 --- /dev/null +++ b/Angular/Models/IncrementVersion.cs @@ -0,0 +1,10 @@ +namespace KY.Generator.Angular.Models +{ + public enum IncrementVersion + { + None, + Major, + Minor, + Patch + } +} diff --git a/Angular/Options/AngularOptions.cs b/Angular/Options/AngularOptions.cs new file mode 100644 index 00000000..5cce1837 --- /dev/null +++ b/Angular/Options/AngularOptions.cs @@ -0,0 +1,20 @@ +namespace KY.Generator.Angular; + +public class AngularOptions(AngularOptions? parent, AngularOptions? global, object? target = null) + : OptionsBase(parent, global, target) +{ + private string? modelOutput; + private string? serviceOutput; + + public string? ModelOutput + { + get => this.GetValue(x => x.modelOutput); + set => this.modelOutput = value; + } + + public string? ServiceOutput + { + get => this.GetValue(x => x.serviceOutput); + set => this.serviceOutput = value; + } +} diff --git a/Angular/Options/AngularOptionsFactory.cs b/Angular/Options/AngularOptionsFactory.cs new file mode 100644 index 00000000..8ad9d9bc --- /dev/null +++ b/Angular/Options/AngularOptionsFactory.cs @@ -0,0 +1,47 @@ +using System.Reflection; + +namespace KY.Generator.Angular; + +public class AngularOptionsFactory : IOptionsFactory +{ + public bool CanCreate(Type optionsType) + { + return optionsType == typeof(AngularOptions); + } + + public object Create(Type optionsType, object key, object? parent, object global) + { + return new AngularOptions(parent as AngularOptions, global as AngularOptions, key); + } + + public object CreateGlobal(Type optionsType, object key, object? parent) + { + return key switch + { + Assembly assembly => this.CreateFromCustomAttributes(assembly.GetCustomAttributes(), key, parent as AngularOptions), + MemberInfo member => this.CreateFromCustomAttributes(member.GetCustomAttributes(), key, parent as AngularOptions), + ParameterInfo parameter => this.CreateFromCustomAttributes(parameter.GetCustomAttributes(), key, parent as AngularOptions), + Options.GlobalKey => new AngularOptions(parent as AngularOptions, null, "global"), + _ => new AngularOptions(parent as AngularOptions, null, key) + // _ => throw new InvalidOperationException($"Could not create {nameof(AngularOptions)} {key.GetType()}") + }; + } + + private AngularOptions CreateFromCustomAttributes(IEnumerable customAttributes, object key, AngularOptions parent) + { + AngularOptions options = new(parent, null, key); + foreach (Attribute attribute in customAttributes) + { + switch (attribute) + { + case GenerateServiceOutputAttribute serviceOutputAttribute: + options.ServiceOutput = serviceOutputAttribute.RelativePath; + break; + case GenerateModelOutputAttribute modelOutputAttribute: + options.ModelOutput = modelOutputAttribute.RelativePath; + break; + } + } + return options; + } +} diff --git a/Angular/Writers/AngularModelWriter.cs b/Angular/Writers/AngularModelWriter.cs index fe77fe0b..7d26c9a0 100644 --- a/Angular/Writers/AngularModelWriter.cs +++ b/Angular/Writers/AngularModelWriter.cs @@ -1,29 +1,24 @@ using System.Collections.Generic; using System.Linq; -using KY.Generator.Angular.Configurations; -using KY.Generator.Templates; using KY.Generator.Transfer; using KY.Generator.TypeScript.Transfer; -namespace KY.Generator.Angular.Writers +namespace KY.Generator.Angular.Writers; + +public class AngularModelWriter(TypeScriptModelWriter modelWriter, IEnumerable transferObjects, Options options) { - public class AngularModelWriter + public AngularModelWriter FormatNames() { - private readonly TypeScriptModelWriter modelWriter; - - public AngularModelWriter(TypeScriptModelWriter modelWriter) - { - this.modelWriter = modelWriter; - } + modelWriter.FormatNames(); + return this; + } - public void Write(AngularWriteConfiguration configuration, List transferObjects, List files) + public void Write(string relativePath) + { + foreach (ModelTransferObject model in transferObjects.OfType()) { - if (configuration.Model != null) - { - configuration.Model.FormatNames = configuration.FormatNames; - configuration.Model.OutputId = configuration.OutputId; - this.modelWriter.Write(configuration.Model, transferObjects).ForEach(files.Add); - } + AngularOptions angularOptions = options.Get(model); + modelWriter.Write(relativePath ?? angularOptions.ModelOutput ?? "/ClientApp/src/app/models"); } } } diff --git a/Angular/Writers/AngularPackageBuilder.cs b/Angular/Writers/AngularPackageBuilder.cs new file mode 100644 index 00000000..e7afebff --- /dev/null +++ b/Angular/Writers/AngularPackageBuilder.cs @@ -0,0 +1,57 @@ +using System; +using System.Runtime.InteropServices; +using System.Text; +using KY.Core; +using KY.Core.DataAccess; + +namespace KY.Generator.Angular.Writers +{ + public class AngularPackageBuilder + { + public void Build(string packagePath) + { + Logger.Trace("Build npm package. This can take a few minutes..."); + StringBuilder builder = new(); + builder.AppendLine($"cd {FileSystem.Combine(packagePath, "../..")}"); + builder.AppendLine(packagePath.Substring(0, 2)); + builder.AppendLine($"npm run build"); + if (!CommandLineHelper.RunWithTrace(builder)) + { + Logger.Error("Package build failed. See error above..."); + } + } + + public void Publish(string packagePath) + { + Logger.Trace("Publish npm package. This can take a few minutes..."); + StringBuilder builder = new(); + builder.AppendLine($"cd {FileSystem.Combine(packagePath, "../..")}"); + builder.AppendLine(packagePath.Substring(0, 2)); + builder.AppendLine($"npm run publish"); + if (!CommandLineHelper.RunWithTrace(builder)) + { + Logger.Error("Package publish failed. See error above..."); + } + } + + public void PublishLocal(string packagePath) + { + Logger.Trace("Publish npm package local. This can take a few minutes..."); + StringBuilder builder = new(); + builder.AppendLine($"cd {FileSystem.Combine(packagePath, "../..")}"); + builder.AppendLine(packagePath.Substring(0, 2)); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + builder.AppendLine($"npm run publish:local:linux"); + } + else + { + builder.AppendLine($"npm run publish:local:windows"); + } + if (!CommandLineHelper.RunWithTrace(builder)) + { + Logger.Error("Package local publish failed. See error above..."); + } + } + } +} diff --git a/Angular/Writers/AngularPackageWriter.cs b/Angular/Writers/AngularPackageWriter.cs new file mode 100644 index 00000000..4ec3b6c4 --- /dev/null +++ b/Angular/Writers/AngularPackageWriter.cs @@ -0,0 +1,166 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Text; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Angular.Commands; +using KY.Generator.Angular.Models; +using Newtonsoft.Json; +using Newtonsoft.Json.Linq; + +namespace KY.Generator.Angular.Writers +{ + public class AngularPackageWriter + { + public const string BasePackageName = "package"; + + public void Write(string name, string fullName, string version, string packagePath, List dependsOn, string cliVersion, string servicePath, string modelPath, IncrementVersion incrementVersion, bool versionFromNpm) + { + if (!InitializeProject(dependsOn, packagePath, name, cliVersion, servicePath, modelPath)) + { + return; + } + if (!UpdateProjectPackageJson(name, fullName, version, dependsOn, packagePath, incrementVersion, versionFromNpm)) + { + return; + } + if (!UpdatePackageJson(packagePath, name)) + { + return; + } + } + + private static bool InitializeProject(List dependsOn, string packagePath, string name, string cliVersion, string servicePath, string modelPath) + { + if (FileSystem.FileExists(packagePath, "../../angular.json")) + { + return true; + } + cliVersion = cliVersion != null ? "@" + cliVersion.TrimStart('@') : null; + Logger.Trace("Prepare angular workspace and create a default npm package. This can take a few minutes..."); + StringBuilder builder = new(); + builder.AppendLine($"cd {FileSystem.Combine(packagePath, "../../..")}"); + builder.AppendLine(packagePath.Substring(0, 2)); + builder.AppendLine($"npx -p @angular/cli{cliVersion} ng new {BasePackageName} --create-application false --strict=false"); + builder.AppendLine($"cd {BasePackageName}"); + if (dependsOn.Count > 0) + { + IEnumerable dependsOnNames = dependsOn.Select(package => $"{package.Name}@{package.Version}"); + builder.AppendLine($"npm i {string.Join(" ", dependsOnNames)} --save"); + } + builder.AppendLine($"npm run-script ng g library {name}"); + if (!CommandLineHelper.RunWithTrace(builder)) + { + Logger.Error("Prepare package failed. See error above..."); + return false; + } + string sourcePath = FileSystem.Combine(packagePath, "src"); + FileSystem.DeleteDirectory(sourcePath, "lib"); + modelPath = FileSystem.Combine("./lib", modelPath).Replace(FileSystem.DirectorySeparator(), "/"); + servicePath = FileSystem.Combine("./lib", servicePath).Replace(FileSystem.DirectorySeparator(), "/"); + FileSystem.WriteAllText(FileSystem.Combine(sourcePath, "public-api.ts"), $"export * from '{modelPath}';" + Environment.NewLine + $"export * from '{servicePath}';" + Environment.NewLine); + return true; + } + + private static bool UpdateProjectPackageJson(string name, string fullName, string version, List dependsOn, string packagePath, IncrementVersion incrementVersion, bool versionFromNpm) + { + Logger.Trace("Update package.json..."); + string packageJsonPath = FileSystem.Combine(packagePath, "package.json"); + if (!FileSystem.FileExists(packageJsonPath)) + { + Logger.Error("package.json not found. Try to delete the whole package folder"); + return false; + } + JObject packageJson = JsonConvert.DeserializeObject(FileSystem.ReadAllText(packageJsonPath)); + JProperty nameProperty = packageJson.Property("name"); + JProperty versionProperty = packageJson.Property("version"); + JObject peerDependencies = packageJson.Property("peerDependencies")?.Value as JObject; + if (nameProperty == null || versionProperty == null || peerDependencies == null) + { + Logger.Error("Invalid package.json structure. Try to delete the whole package folder"); + return false; + } + nameProperty.Value = fullName; + versionProperty.Value = UpdateVersion(fullName, version, versionProperty.Value.ToString(), incrementVersion, versionFromNpm); + foreach (AngularPackageDependsOnParameter package in dependsOn) + { + peerDependencies[package.Name] = package.Version; + } + Logger.Trace("Write package.json to disk..."); + FileSystem.WriteAllText(packageJsonPath, JsonConvert.SerializeObject(packageJson, Formatting.Indented)); + return true; + } + + private static bool UpdatePackageJson(string packagePath, string name) + { + Logger.Trace("Add some scripts..."); + string packageJsonPath = FileSystem.Combine(packagePath, "../../package.json"); + if (!FileSystem.FileExists(packageJsonPath)) + { + Logger.Error("package.json not found. Try to delete the whole package folder"); + return false; + } + JObject packageJson = JsonConvert.DeserializeObject(FileSystem.ReadAllText(packageJsonPath)); + JObject scriptsProperty = packageJson.Property("scripts")?.Value as JObject; + if (scriptsProperty == null) + { + Logger.Error("Invalid package.json structure. Try to delete the whole package folder"); + return false; + } + if (scriptsProperty["build"]?.Value() == "ng build") + { + scriptsProperty["build"] = $"ng build {name}"; + } + scriptsProperty["publish"] ??= $"cd ./dist/{name} && npm publish && cd ../.."; + scriptsProperty["publish:local:linux"] ??= $"cd ./dist/{name} && npm pack && cp *.tgz ../../ && cd ../.."; + scriptsProperty["publish:local:windows"] ??= $"cd ./dist/{name} && npm pack && copy *.tgz ..\\..\\ && cd ../.."; + Logger.Trace("Write package.json to disk..."); + FileSystem.WriteAllText(packageJsonPath, JsonConvert.SerializeObject(packageJson, Formatting.Indented)); + return true; + } + + private static string UpdateVersion(string fullName, string templateVersionString, string packageJsonVersionString, IncrementVersion incrementVersion, bool versionFromNpm) + { + SemanticVersion packageJsonVersion = new(packageJsonVersionString); + SemanticVersion templateVersion = new(templateVersionString); + if (versionFromNpm) + { + Logger.Trace("Read version from npm..."); + if (!CommandLineHelper.RunWithResult($"npm view {fullName} version", out string npmVersionString)) + { + return templateVersionString; + } + SemanticVersion npmVersion = new(npmVersionString); + if (templateVersion.Major > npmVersion.Major + || templateVersion.Major == npmVersion.Major && templateVersion.Minor > npmVersion.Minor + || templateVersion.Major == npmVersion.Major && templateVersion.Minor == npmVersion.Minor && templateVersion.Build > npmVersion.Build + ) + { + return templateVersionString; + } + return IncrementVersionBy(templateVersion, npmVersion, incrementVersion); + } + return IncrementVersionBy(templateVersion, packageJsonVersion, incrementVersion); + } + + private static string IncrementVersionBy(SemanticVersion templateVersion, SemanticVersion currentVersion, IncrementVersion incrementVersion) + { + switch (incrementVersion) + { + case IncrementVersion.None: + return templateVersion.ToString(); + case IncrementVersion.Major: + return new SemanticVersion(currentVersion.Major + 1, 0, 0).ToString(); + case IncrementVersion.Minor: + return new SemanticVersion(currentVersion.Major, currentVersion.Minor + 1, 0).ToString(); + case IncrementVersion.Patch: + return new SemanticVersion(currentVersion.Major, currentVersion.Minor, currentVersion.Build + 1).ToString(); + default: + throw new ArgumentOutOfRangeException(nameof(incrementVersion), incrementVersion, null); + } + } + } +} diff --git a/Angular/Writers/AngularServiceWriter.cs b/Angular/Writers/AngularServiceWriter.cs index f1415336..03f56e5b 100644 --- a/Angular/Writers/AngularServiceWriter.cs +++ b/Angular/Writers/AngularServiceWriter.cs @@ -1,11 +1,7 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; +using KY.Core; using KY.Core.DataAccess; using KY.Generator.Angular.Commands; using KY.Generator.Angular.Configurations; -using KY.Generator.Configurations; using KY.Generator.Extensions; using KY.Generator.Languages; using KY.Generator.Mappings; @@ -18,634 +14,749 @@ using KY.Generator.TypeScript.Extensions; using KY.Generator.TypeScript.Languages; using KY.Generator.TypeScript.Templates; +using KY.Generator.TypeScript.Templates.Extensions; -namespace KY.Generator.Angular.Writers +namespace KY.Generator.Angular.Writers; + +public class AngularServiceWriter : TransferWriter { - public class AngularServiceWriter : TransferWriter - { - private const string apiVersionKey = "{version:apiVersion}"; + private const string apiVersionKey = "{version:apiVersion}"; + private readonly List transferObjects; + private readonly List files; - public AngularServiceWriter(ITypeMapping typeMapping) - : base(typeMapping) - { } + public AngularServiceWriter(Options options, ITypeMapping typeMapping, List transferObjects, List files) + : base(options, typeMapping) + { + this.transferObjects = transferObjects; + this.files = files; + } - public virtual void Write(AngularWriteConfiguration configuration, List transferObjects, List files) + public virtual void Write(AngularWriteConfiguration configuration) + { + Logger.Trace("Generate angular service for ASP.NET controller..."); + GeneratorOptions generatorOptions = this.Options.Get(); + if (!generatorOptions.Language.IsTypeScript()) { - Logger.Trace("Generate angular service for ASP.NET controller..."); - if (!configuration.Language.IsTypeScript()) - { - throw new InvalidOperationException($"Can not generate service for ASP.NET controller for language {configuration.Language?.Name ?? "Empty"}"); - } - if (configuration.Model?.RelativePath == null && configuration.Service.RelativePath?.Count(x => x == '/' || x == '\\') > 1) - { - Logger.Warning("No model path found for Angular Service command. This may lead to wrong model imports!"); - } - string httpClient = configuration.Service.HttpClient?.Name ?? "HttpClient"; - string httpClientImport = configuration.Service.HttpClient?.Import ?? "@angular/common/http"; - Dictionary actionTypeMapping = new() - { - { HttpServiceActionTypeTransferObject.Get, configuration.Service?.HttpClient?.Get ?? "get" }, - { HttpServiceActionTypeTransferObject.Post, configuration.Service?.HttpClient?.Post ?? "post" }, - { HttpServiceActionTypeTransferObject.Put, configuration.Service?.HttpClient?.Put ?? "put" }, - { HttpServiceActionTypeTransferObject.Patch, configuration.Service?.HttpClient?.Patch ?? "patch" }, - { HttpServiceActionTypeTransferObject.Delete, configuration.Service?.HttpClient?.Delete ?? "delete" } - }; - Dictionary actionTypeOptions = new() - { - { HttpServiceActionTypeTransferObject.Get, configuration.Service?.HttpClient?.HasGetOptions }, - { HttpServiceActionTypeTransferObject.Post, configuration.Service?.HttpClient?.HasPostOptions }, - { HttpServiceActionTypeTransferObject.Put, configuration.Service?.HttpClient?.HasPutOptions }, - { HttpServiceActionTypeTransferObject.Patch, configuration.Service?.HttpClient?.HasPatchOptions }, - { HttpServiceActionTypeTransferObject.Delete, configuration.Service?.HttpClient?.HasDeleteOptions } - }; - foreach (HttpServiceTransferObject controller in transferObjects.OfType()) + throw new InvalidOperationException($"Can not generate service for ASP.NET controller for language {generatorOptions.Language?.Name ?? "Empty"}"); + } + if (configuration.Model?.RelativePath == null && configuration.Service.RelativePath?.Count(x => x == '/' || x == '\\') > 1) + { + Logger.Warning("No model path found for Angular Service command. This may lead to wrong model imports!"); + } + string httpClient = configuration.Service.HttpClient?.Name ?? "HttpClient"; + string httpClientImport = configuration.Service.HttpClient?.Import ?? "@angular/common/http"; + Dictionary actionTypeMapping = new() + { + { HttpServiceActionTypeTransferObject.Get, configuration.Service?.HttpClient?.Get ?? "get" }, + { HttpServiceActionTypeTransferObject.Post, configuration.Service?.HttpClient?.Post ?? "post" }, + { HttpServiceActionTypeTransferObject.Put, configuration.Service?.HttpClient?.Put ?? "put" }, + { HttpServiceActionTypeTransferObject.Patch, configuration.Service?.HttpClient?.Patch ?? "patch" }, + { HttpServiceActionTypeTransferObject.Delete, configuration.Service?.HttpClient?.Delete ?? "delete" } + }; + Dictionary actionTypeOptions = new() + { + { HttpServiceActionTypeTransferObject.Get, configuration.Service?.HttpClient?.HasGetOptions }, + { HttpServiceActionTypeTransferObject.Post, configuration.Service?.HttpClient?.HasPostOptions }, + { HttpServiceActionTypeTransferObject.Put, configuration.Service?.HttpClient?.HasPutOptions }, + { HttpServiceActionTypeTransferObject.Patch, configuration.Service?.HttpClient?.HasPatchOptions }, + { HttpServiceActionTypeTransferObject.Delete, configuration.Service?.HttpClient?.HasDeleteOptions } + }; + foreach (HttpServiceTransferObject controller in this.transferObjects.OfType()) + { + GeneratorOptions controllerOptions = this.Options.Get(controller); + Dictionary mapping = new(); + string controllerName = controller.Name.TrimEnd("Controller"); + string className = configuration.Service.Name?.Replace("{0}", controllerName) ?? controllerName + "Service"; + FileTemplate file = this.files.AddFile(configuration.Service.RelativePath, controllerOptions) + .WithName(Formatter.FormatFile(className, controllerOptions, "service")); + ClassTemplate classTemplate = file.AddNamespace(string.Empty) + .AddClass(className) + .FormatName(controllerOptions, true) + .FormatPrefix(controllerOptions) + .WithUsing(httpClient, httpClientImport) + .WithUsing("Injectable", "@angular/core") + .WithUsing("Observable", "rxjs") + .WithUsing("Subject", "rxjs") + .WithAttribute("Injectable", Code.AnonymousObject().WithProperty("providedIn", Code.String("root"))); + FieldTemplate httpField = classTemplate.AddField("http", Code.Type(httpClient)).Readonly().FormatName(controllerOptions); + FieldTemplate serviceUrlField = classTemplate.AddField("serviceUrlValue", Code.Type("string")).FormatName(controllerOptions).Default(Code.String(string.Empty)); + FieldTemplate httpOptionsField = classTemplate.AddField("httpOptions", Code.Type("{}")).Public().FormatName(controllerOptions).Default(Code.Local("{}")); + PropertyTemplate serviceUrlProperty = classTemplate.AddProperty("serviceUrl", Code.Type("string")) + .WithGetter(Code.Return(Code.This().Field(serviceUrlField))) + .WithSetter(Code.This().Field(serviceUrlField).Assign(Code.Local("value").Method("replace", Code.TypeScript(@"/\/+$/"), Code.String(""))).Close()); + classTemplate.AddConstructor().WithParameter(Code.Type(httpClient), "http") + .WithCode(Code.This().Field(httpField).Assign(Code.Local("http")).Close()) + .WithCode(Code.This().Property(serviceUrlProperty).Assign(Code.Local("document").Property("baseURI").NullCoalescing(Code.String(string.Empty).Close()))); + + List convertDateMethods = new(); + string relativeModelPath = FileSystem.RelativeTo(configuration.Model?.RelativePath ?? ".", configuration.Service.RelativePath); + relativeModelPath = string.IsNullOrEmpty(relativeModelPath) ? "." : relativeModelPath; + bool addAppendMethod = false; + bool addAppendDateMethod = false; + bool appendConvertDateMethod = false; + foreach (HttpServiceActionTransferObject action in controller.Actions) { - IMappableLanguage controllerLanguage = controller.Language as IMappableLanguage; - IMappableLanguage configurationLanguage = configuration.Language as IMappableLanguage; - Dictionary mapping = new Dictionary(); - string controllerName = controller.Name.TrimEnd("Controller"); - FileTemplate file = files.AddFile(configuration.Service.RelativePath, configuration.AddHeader, configuration.OutputId) - .WithType("service"); - ClassTemplate classTemplate = file.AddNamespace(string.Empty) - .AddClass(configuration.Service.Name?.Replace("{0}", controllerName) ?? controllerName + "Service") - .FormatName(configuration, true) - .WithUsing(httpClient, httpClientImport) - .WithUsing("Injectable", "@angular/core") - .WithUsing("Observable", "rxjs") - .WithUsing("Subject", "rxjs") - .WithAttribute("Injectable", Code.AnonymousObject().WithProperty("providedIn", Code.String("root"))); - FieldTemplate httpField = classTemplate.AddField("http", Code.Type(httpClient)).Readonly().FormatName(configuration); - FieldTemplate serviceUrlField = classTemplate.AddField("serviceUrlValue", Code.Type("string")).FormatName(configuration).Default(Code.String(string.Empty)); - PropertyTemplate serviceUrlProperty = classTemplate.AddProperty("serviceUrl", Code.Type("string")) - .WithGetter(Code.Return(Code.This().Field(serviceUrlField))) - .WithSetter(Code.This().Field(serviceUrlField).Assign(Code.Local("value").Method("replace", Code.TypeScript(@"/\/+$/"), Code.String(""))).Close()); - classTemplate.AddConstructor().WithParameter(Code.Type(httpClient), "http") - .WithCode(Code.This().Field(httpField).Assign(Code.Local("http")).Close()); - string relativeModelPath = FileSystem.RelativeTo(configuration.Model?.RelativePath ?? ".", configuration.Service.RelativePath); - relativeModelPath = string.IsNullOrEmpty(relativeModelPath) ? "." : relativeModelPath; - bool appendConvertAnyMethod = false; - bool appendConvertFromDateMethod = false; - bool appendConvertToDateMethod = false; - foreach (HttpServiceActionTransferObject action in controller.Actions) - { - string subjectName = action.Parameters.Any(x => x.Name == "subject") ? "rxjsSubject" : "subject"; - bool isEnumerable = action.ReturnType.IsEnumerable(); - bool isGuidReturnType = action.ReturnType.Name.Equals(nameof(Guid), StringComparison.CurrentCultureIgnoreCase); - bool isDateReturnType = action.ReturnType.Name.Equals(nameof(DateTime), StringComparison.CurrentCultureIgnoreCase); - bool isDateArrayReturnType = isEnumerable && action.ReturnType.Generics.Count == 1 && action.ReturnType.Generics.First().Type.Name.Equals(nameof(DateTime), StringComparison.CurrentCultureIgnoreCase); - bool isStringReturnType = action.ReturnType.Name.Equals(nameof(String), StringComparison.CurrentCultureIgnoreCase); - ICodeFragment errorCode = Code.Lambda("error", Code.Local(subjectName).Method("error", Code.Local("error"))); - if (controllerLanguage != null && configurationLanguage != null) + string subjectName = action.Parameters.Any(x => x.Name == "subject") ? "rxjsSubject" : "subject"; + bool isEnumerable = action.ReturnType.IsEnumerable(); + bool isGuidReturnType = action.ReturnType.Name.Equals(nameof(Guid), StringComparison.CurrentCultureIgnoreCase); + bool isDateReturnType = action.ReturnType.Name.Equals(nameof(DateTime), StringComparison.CurrentCultureIgnoreCase); + bool isDateArrayReturnType = isEnumerable && action.ReturnType.Generics.Count == 1 && action.ReturnType.Generics.First().Type.Name.Equals(nameof(DateTime), StringComparison.CurrentCultureIgnoreCase); + bool isStringReturnType = action.ReturnType.Name.Equals(nameof(String), StringComparison.CurrentCultureIgnoreCase); + ICodeFragment errorCode = Code.Lambda("error", Code.Local(subjectName).Method("error", Code.Local("error"))); + if (controller.Language != null && controllerOptions.Language != null) + { + this.MapType(controller.Language, controllerOptions.Language, action.ReturnType); + } + TypeTemplate returnType = action.ReturnType.ToTemplate(); + TypeTransferObject returnModelType = isEnumerable ? action.ReturnType.Generics.First().Type : action.ReturnType; + ModelTransferObject returnModel = returnModelType as ModelTransferObject ?? this.transferObjects.OfType().FirstOrDefault(x => x.Equals(returnModelType)); + this.AddUsing(action.ReturnType, classTemplate, controllerOptions, relativeModelPath); + TypeTemplate aliasType = null; + if (returnType.Name == "unknown") + { + aliasType = Code.Type("TDefault"); + returnType = aliasType; + } + MethodTemplate methodTemplate = classTemplate.AddMethod(action.Name, Code.Generic("Observable", returnType)) + .FormatName(controllerOptions); + if (aliasType != null) + { + methodTemplate.WithGeneric(aliasType.Name, Code.Type("unknown")); + } + TypeTemplate subjectType = Code.Generic("Subject", returnType); + methodTemplate.WithCode(Code.Declare(subjectType, subjectName, Code.New(subjectType))); + foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) + { + if (controller.Language != null && controllerOptions.Language != null) { - this.MapType(controllerLanguage, configurationLanguage, action.ReturnType); + this.MapType(controller.Language, controllerOptions.Language, parameter.Type); } - TypeTemplate returnType = action.ReturnType.ToTemplate(); - TypeTransferObject returnModelType = isEnumerable ? action.ReturnType.Generics.First().Type : action.ReturnType; - ModelTransferObject returnModel = returnModelType as ModelTransferObject ?? transferObjects.OfType().FirstOrDefault(x => x.Equals(returnModelType)); - this.AddUsing(action.ReturnType, classTemplate, configuration, relativeModelPath); - TypeTemplate aliasType = null; - if (returnType.Name == "unknown") + this.AddUsing(parameter.Type, classTemplate, controllerOptions, relativeModelPath); + string parameterName = this.GetAllowedName(controllerOptions.Language, parameter.Name); + ParameterTemplate parameterTemplate = methodTemplate.AddParameter(parameter.Type.ToTemplate(), parameterName).FormatName(controllerOptions); + if (parameter.IsOptional) { - aliasType = Code.Type("TDefault"); - returnType = aliasType; + parameterTemplate.Optional(); } - MethodTemplate methodTemplate = classTemplate.AddMethod(action.Name, Code.Generic("Observable", returnType)) - .FormatName(configuration); - if (aliasType != null) + mapping.Add(parameter, parameterTemplate); + } + if (actionTypeOptions[action.Type]?.HasHttpOptions ?? true) + { + methodTemplate.AddParameter(Code.Type("{}"), "httpOptions").Optional(); + if (isStringReturnType) { - methodTemplate.WithGeneric(aliasType.Name, Code.Type("unknown")); + methodTemplate.WithCode(Code.TypeScript("httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}").Close()); } - TypeTemplate subjectType = Code.Generic("Subject", returnType); - methodTemplate.WithCode(Code.Declare(subjectType, subjectName, Code.New(subjectType))); - foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) + else { - if (controllerLanguage != null && configurationLanguage != null) - { - this.MapType(controllerLanguage, configurationLanguage, parameter.Type); - } - this.AddUsing(parameter.Type, classTemplate, configuration, relativeModelPath); - string parameterName = this.GetAllowedName(configuration.Language, parameter.Name); - ParameterTemplate parameterTemplate = methodTemplate.AddParameter(parameter.Type.ToTemplate(), parameterName).FormatName(configuration); - if (parameter.IsOptional) - { - parameterTemplate.Optional(); - } - mapping.Add(parameter, parameterTemplate); - if (action.Type == HttpServiceActionTypeTransferObject.Get && parameter.Type.Name == "Array") - { - methodTemplate.WithCode(Code.Declare( - Code.Type("string"), - $"{parameterTemplate.Name}Join", - Code.Local(parameterTemplate).Method("map", Code.Lambda(new[] { "x", "index" }, - Code.InlineIf(Code.Local("index"), - Code.String($"{parameter.Name}=").Append(Code.This().Method("convertAny", Code.Local("x"))), - Code.This().Method("convertAny", Code.Local("x"))) - )).Method("join", Code.String("&")))); - } + methodTemplate.WithCode(Code.TypeScript("httpOptions = { ...this.httpOptions, ...httpOptions}").Close()); } - if (actionTypeOptions[action.Type]?.HasHttpOptions ?? true) + } + if (isDateReturnType && isDateArrayReturnType) + { + appendConvertDateMethod = true; + } + string controllerRoute = controller.Route?.Trim('/').Replace("[controller]", controllerName.ToLower()) ?? controllerName.ToLower(); + string actionRoute = action.Route?.TrimEnd('/').Replace("[action]", action.Name.ToLower()).Replace("[controller]", controllerName.ToLower()); + string uri = actionRoute == null ? $"/{controllerRoute}" : actionRoute.StartsWith("/") ? actionRoute : $"/{controllerRoute}/{actionRoute}"; + + List inlineParameters = action.Parameters + .Where(x => (!x.FromBody || !action.CanHaveBodyParameter) && x.Inline) + .OrderBy(x => x.InlineIndex) + .ToList(); + List urlParameters = action.Parameters + .Where(x => (!x.FromBody || !action.CanHaveBodyParameter) && !x.Inline && x.AppendName) + .ToList(); + List urlDirectParameters = action.Parameters + .Where(x => (!x.FromBody || !action.CanHaveBodyParameter) && !x.Inline && !x.AppendName) + .ToList(); + MultilineCodeFragment code = Code.Multiline(); + bool hasReturnType = returnType.Name != "void" && returnType.Name != "Task"; + ExecuteMethodTemplate nextMethod = Code.Local(subjectName).Method("next"); + if (hasReturnType) + { + LocalVariableTemplate localCode = Code.Local("result"); + ICodeFragment nextCode = localCode; + if (isGuidReturnType) { - methodTemplate.AddParameter(Code.Type("{}"), "httpOptions").Optional(); - if (isStringReturnType) - { - methodTemplate.WithCode(Code.TypeScript("httpOptions = { responseType: 'text', ...httpOptions}").Close()); - } + nextCode = localCode.NullConditional().Method("replace", Code.TypeScript("/(^\"|\"$)/g"), Code.String(string.Empty)); } - if (isDateReturnType && isDateArrayReturnType) + if (isDateReturnType) { - appendConvertToDateMethod = true; + nextCode = Code.This().Method("convertDate", nextCode); } - string uri = ("/" + (controller.Route?.Replace("[controller]", controllerName.ToLower()).TrimEnd('/') ?? controllerName.ToLower()) + "/" + action.Route?.Replace("[action]", action.Name.ToLower())).TrimEnd('/'); - - List inlineParameters = action.Parameters.Where(x => !x.FromBody && x.Inline).OrderBy(x => x.InlineIndex).ToList(); - List urlParameters = action.Parameters.Where(x => !x.FromBody && !x.Inline && x.AppendName).ToList(); - List urlDirectParameters = action.Parameters.Where(x => !x.FromBody && !x.Inline && !x.AppendName).ToList(); - MultilineCodeFragment code = Code.Multiline(); - bool hasReturnType = returnType.Name != "void" && returnType.Name != "Task"; - ExecuteMethodTemplate nextMethod = Code.Local(subjectName).Method("next"); - if (hasReturnType) + if (isDateArrayReturnType) { - LocalVariableTemplate localCode = Code.Local("result"); - ICodeFragment nextCode = localCode; - if (isGuidReturnType) - { - nextCode = localCode.Method("replace", Code.TypeScript("/(^\"|\"$)/g"), Code.String(string.Empty)); - } - if (isDateReturnType) - { - nextCode = Code.This().Method("convertToDate", nextCode); - } - if (isDateArrayReturnType) - { - nextCode = localCode.Method("map", Code.Lambda("entry", Code.This().Method("convertToDate", Code.Local("entry")))); - } - nextMethod.WithParameter(nextCode); - appendConvertToDateMethod = this.WriteDateFixes(returnModel, isEnumerable, code, new List { "result" }, new List { returnModel }, transferObjects, configuration) || appendConvertToDateMethod; + nextCode = localCode.Method("map", Code.Lambda("entry", Code.This().Method("convertDate", Code.Local("entry")))); } - if (action.FixCasingWithMapping) + nextMethod.WithParameter(Code.This().Method("fixUndefined", nextCode)); + if (this.WriteDateFixes(classTemplate, convertDateMethods, returnModel, controllerOptions, relativeModelPath)) { - IEnumerable members = (returnModel?.Fields ?? new List()).Concat(returnModel?.Properties ?? new List()); + appendConvertDateMethod = true; + string methodName = $"convert{returnModel.Name.ToPascalCase()}Date"; if (isEnumerable) { - MultilineCodeFragment innerCode = new MultilineCodeFragment(); - foreach (MemberTransferObject member in members) - { - string formattedName = member is PropertyTransferObject ? Formatter.FormatProperty(member.Name, configuration) : Formatter.FormatField(member.Name, configuration); - if (formattedName != member.Name) - { - innerCode.AddLine(Code.Local("entry").Field(formattedName).Assign(Code.Local("entry").Field(formattedName).Or().Local("entry").Index(Code.String(member.Name))).Close()) - .AddLine(Code.TypeScript($"delete entry['{member.Name}']").Close()); - } - } - code.AddLine(Code.If(Code.Local("result")).WithCode(Code.Local("result").Method("forEach", Code.Lambda("entry", innerCode)))); + code.AddLine(Code.Local("result").Method("forEach", Code.Lambda("m", + Code.This().Method(methodName, Code.Local("m")) + )).Close()); } else { - foreach (MemberTransferObject member in members) - { - string formattedName = member is PropertyTransferObject ? Formatter.FormatProperty(member.Name, configuration) : Formatter.FormatField(member.Name, configuration); - if (formattedName != member.Name) - { - code.AddLine(Code.Local("result").Field(formattedName).Assign(Code.Local("result").Field(formattedName).Or().Local("result").Index(Code.String(member.Name))).Close()) - .AddLine(Code.TypeScript($"delete result['{member.Name}']").Close()); - } - } + code.AddLine(Code.This().Method(methodName, Code.Local("result")).Close()); } } - code.AddLine(nextMethod.Close()) - .AddLine(Code.Local(subjectName).Method("complete").Close()); - ChainedCodeFragment parameterUrl = Code.This().Property(serviceUrlProperty); - string actionVersion = action.Version ?? controller.Version; - bool isUrlApiVersion = false; - if (uri?.Contains(apiVersionKey) ?? false) - { - isUrlApiVersion = true; - uri = uri.Replace(apiVersionKey, actionVersion); - } - foreach (HttpServiceActionParameterTransferObject parameter in inlineParameters) - { - string[] chunks = uri.Split(new[] { $"{{{parameter.Name}}}" }, StringSplitOptions.RemoveEmptyEntries); - parameterUrl = parameterUrl.Append(Code.String(chunks[0])).Append(Code.Local(mapping[parameter])); - uri = chunks.Length == 1 ? string.Empty : chunks[1]; - } - if (!string.IsNullOrEmpty(uri)) - { - parameterUrl = parameterUrl.Append(Code.String(uri)); - } - bool isFirst = true; - if (actionVersion != null && !isUrlApiVersion) - { - isFirst = false; - parameterUrl = parameterUrl.Append(Code.String($"?api-version={actionVersion}")); - } - foreach (HttpServiceActionParameterTransferObject parameter in urlDirectParameters) + } + if (action.FixCasingWithMapping) + { + IEnumerable members = (returnModel?.Fields ?? new List()).Concat(returnModel?.Properties ?? new List()); + if (isEnumerable) { - if (isFirst) + MultilineCodeFragment innerCode = new(); + foreach (MemberTransferObject member in members) { - isFirst = false; - parameterUrl = parameterUrl.Append(Code.String("?")).Append(Code.Local(parameter.Name)); + string formattedName = member is PropertyTransferObject ? Formatter.FormatProperty(member.Name, controllerOptions) : Formatter.FormatField(member.Name, controllerOptions); + if (formattedName != member.Name) + { + innerCode.AddLine(Code.Local("entry").Field(formattedName).Assign(Code.Local("entry").Field(formattedName).Or().Local("entry").Index(Code.String(member.Name))).Close()) + .AddLine(Code.TypeScript($"delete entry['{member.Name}']").Close()); + } } - else + code.AddLine(Code.If(Code.Local("result")).WithCode(Code.Local("result").Method("forEach", Code.Lambda("entry", innerCode)))); + } + else + { + foreach (MemberTransferObject member in members) { - parameterUrl = parameterUrl.Append(Code.String("&")).Append(Code.Local(parameter.Name)); + string formattedName = member is PropertyTransferObject ? Formatter.FormatProperty(member.Name, controllerOptions) : Formatter.FormatField(member.Name, controllerOptions); + if (formattedName != member.Name) + { + code.AddLine(Code.Local("result").Field(formattedName).Assign(Code.Local("result").Field(formattedName).Or().Local("result").Index(Code.String(member.Name))).Close()) + .AddLine(Code.TypeScript($"delete result['{member.Name}']").Close()); + } } } - foreach (HttpServiceActionParameterTransferObject parameter in urlParameters) + } + code.AddLine(nextMethod.Close()) + .AddLine(Code.Local(subjectName).Method("complete").Close()); + ExecutePropertyTemplate propertyTemplate = Code.This().Property(serviceUrlProperty); + DeclareTemplate urlTemplate = Code.Declare(Code.Type("string"), "url", propertyTemplate); + methodTemplate.WithCode(urlTemplate); + string actionVersion = action.Version ?? controller.Version; + bool isUrlApiVersion = false; + if (uri?.Contains(apiVersionKey) ?? false) + { + isUrlApiVersion = true; + uri = uri.Replace(apiVersionKey, actionVersion); + } + foreach (HttpServiceActionParameterTransferObject parameter in inlineParameters) + { + string[] chunks = uri.Split(new[] { $"{{{parameter.Name}}}" }, StringSplitOptions.RemoveEmptyEntries) + .Select(chunk => chunk.TrimEnd("/")).ToArray(); + if (chunks[0].Length > 0) { - parameterUrl = parameterUrl.Append(isFirst ? Code.String($"?{parameter.Name}=") : Code.String($"&{parameter.Name}=")); - if (parameter.FromQuery && parameter.Type.Name == "Array") + if (propertyTemplate != null) { - appendConvertAnyMethod = true; - parameterUrl = parameterUrl.Append(Code.This().Method("convertAny", Code.Local(mapping[parameter].Name + "Join"))); + propertyTemplate.Append(Code.String(chunks[0])); } else { - if (parameter.Type.IgnoreNullable().Name == "Date") - { - appendConvertFromDateMethod = true; - parameterUrl = parameterUrl.Append(Code.This().Method("convertFromDate", Code.Local(mapping[parameter]))); - } - else - { - appendConvertAnyMethod = true; - parameterUrl = parameterUrl.Append(Code.This().Method("convertAny", Code.Local(mapping[parameter]))); - } + methodTemplate.WithCode(Code.Local(urlTemplate).AppendAssign(Code.String(chunks[0])).Close()); } - isFirst = false; - } - ChainedCodeFragment executeAction = Code.This().Field(httpField); - List parameters = new() { parameterUrl }; - if (action.Parameters.Any(x => x.FromBody)) - { - parameters.Add(Code.Local(action.Parameters.Single(x => x.FromBody).Name)); } - if (actionTypeOptions[action.Type]?.HasHttpOptions ?? false) - { - parameters.Add(Code.Local("httpOptions")); - } - if (actionTypeOptions[action.Type]?.NotGeneric ?? false) - { - executeAction = executeAction.Method(actionTypeMapping[action.Type], parameters); - } - else if (actionTypeOptions[action.Type]?.ParameterGeneric ?? false) + propertyTemplate = null; + addAppendMethod = true; + methodTemplate.WithCode(Code.Local(urlTemplate).Assign(Code.This().Method("append", Code.Local(urlTemplate), Code.Local(mapping[parameter]), Code.Null(), Code.String("/"))).Close()); + uri = chunks.Length == 1 ? string.Empty : chunks[1]; + } + if (!string.IsNullOrEmpty(uri)) + { + if (propertyTemplate == null) { - executeAction = executeAction.GenericMethod(actionTypeMapping[action.Type], Code.Type("unknown"), parameters.ToArray()); + methodTemplate.WithCode(Code.Local(urlTemplate).AppendAssign(Code.String(uri)).Close()); } else { - executeAction = executeAction.GenericMethod(actionTypeMapping[action.Type], returnType, parameters.ToArray()); + propertyTemplate.Append(Code.String(uri)); + propertyTemplate = null; } - LambdaTemplate lambda; - if (actionTypeOptions[action.Type]?.ReturnsAny ?? false) + } + if (actionVersion != null && !isUrlApiVersion) + { + methodTemplate.WithCode(Code.Local(urlTemplate).AppendAssign(Code.String($"?api-version={actionVersion}")).Close()); + } + foreach (HttpServiceActionParameterTransferObject parameter in urlDirectParameters) + { + addAppendMethod = true; + methodTemplate.WithCode(Code.Local(urlTemplate).Assign(Code.This().Method("append", + Code.Local(urlTemplate), + Code.Local(mapping[parameter]), + Code.String(parameter.Name))).Close()); + } + foreach (HttpServiceActionParameterTransferObject parameter in urlParameters) + { + if (parameter.FromQuery && parameter.Type.Name == "Array") { - lambda = Code.Lambda(hasReturnType ? new ParameterTemplate(returnType, "result") : null, code); + addAppendMethod = true; + LambdaTemplate forEachLambda = Code.Lambda("entry", Code.Local(urlTemplate).Assign( + Code.This().Method("append", + Code.Local(urlTemplate), + Code.Local("entry"), + Code.String(parameter.Name) + ))); + methodTemplate.WithCode(Code.Local(mapping[parameter]).NullConditional().Method("forEach", forEachLambda).Close()); } else { - lambda = Code.Lambda(hasReturnType ? "result" : null, code); + string appendMethodName = "append"; + if (parameter.Type.IgnoreNullable().Name == "Date") + { + addAppendDateMethod = true; + appendMethodName = "appendDate"; + } + else + { + addAppendMethod = true; + } + + methodTemplate.WithCode(Code.Local(urlTemplate).Assign(Code.This().Method(appendMethodName, + Code.Local(urlTemplate), + Code.Local(mapping[parameter]), + Code.String(parameter.Name))).Close()); } - methodTemplate.WithCode(executeAction.Method("subscribe", lambda, errorCode).Close()) - .WithCode(Code.Return(Code.Local(subjectName))); } - - if (appendConvertAnyMethod) + ChainedCodeFragment executeAction = Code.This().Field(httpField); + List parameters = new() { Code.Local(urlTemplate) }; + if (action.CanHaveBodyParameter) + { + HttpServiceActionParameterTransferObject bodyParameter = action.Parameters.SingleOrDefault(x => x.FromBody); + parameters.Add(bodyParameter == null ? Code.Undefined() : Code.Local(mapping[bodyParameter])); + } + if (actionTypeOptions[action.Type]?.HasHttpOptions ?? false) { - this.AppendConvertAnyMethod(classTemplate); + parameters.Add(Code.Local("httpOptions")); } - if (appendConvertFromDateMethod) + if (actionTypeOptions[action.Type]?.NotGeneric ?? false) { - this.AppendConvertFromDateMethod(classTemplate); + executeAction = executeAction.Method(actionTypeMapping[action.Type], parameters); } - if (appendConvertToDateMethod) + else if (actionTypeOptions[action.Type]?.ParameterGeneric ?? false) { - this.AppendConvertToDateMethod(classTemplate); + executeAction = executeAction.GenericMethod(actionTypeMapping[action.Type], Code.Type("unknown"), parameters.ToArray()); } + else + { + executeAction = executeAction.GenericMethod(actionTypeMapping[action.Type], returnType, parameters.ToArray()); + } + LambdaTemplate lambda; + if (actionTypeOptions[action.Type]?.ReturnsAny ?? false) + { + lambda = Code.Lambda(hasReturnType ? new ParameterTemplate(returnType, "result") : null, code); + } + else + { + lambda = Code.Lambda(hasReturnType ? "result" : null, code); + } + methodTemplate.WithCode(executeAction.Method("subscribe", lambda, errorCode).Close()) + .WithCode(Code.Return(Code.Local(subjectName))); } - List hubs = transferObjects.OfType().ToList(); - FileTemplate connectionStatusFileTemplate = null; - EnumTemplate connectionStatusEnum = null; - if (hubs.Count > 0) + + if (addAppendMethod || addAppendDateMethod) { - connectionStatusFileTemplate = files.AddFile(configuration.Model.RelativePath, configuration.AddHeader, configuration.OutputId); - connectionStatusEnum = connectionStatusFileTemplate - .AddNamespace(string.Empty) - .AddEnum("ConnectionStatus") - .FormatName(configuration) - .AddValue("connecting") - .AddValue("connected") - .AddValue("sleeping") - .AddValue("disconnected"); + this.AddAppendMethod(classTemplate); } - foreach (SignalRHubTransferObject hub in hubs) + if (addAppendDateMethod) { - string relativeModelPath = FileSystem.RelativeTo(configuration.Model?.RelativePath ?? ".", configuration.Service.RelativePath); - IMappableLanguage hubLanguage = hub.Language as IMappableLanguage; - IMappableLanguage configurationLanguage = configuration.Language as IMappableLanguage; - FileTemplate file = files.AddFile(configuration.Service.RelativePath, configuration.AddHeader, configuration.OutputId) - .WithType("service"); - NamespaceTemplate namespaceTemplate = file.AddNamespace(string.Empty); - ClassTemplate classTemplate = namespaceTemplate - .AddClass(configuration.Service.Name?.Replace("{0}", hub.Name) ?? hub.Name + "Service") - .FormatName(configuration, true) - .WithUsing("Injectable", "@angular/core") - .WithUsing("Subject", "rxjs") - .WithUsing("Observable", "rxjs") - .WithUsing("ReplaySubject", "rxjs") - .WithUsing("filter", "rxjs/operators") - .WithUsing("map", "rxjs/operators") - .WithUsing("mergeMap", "rxjs/operators") - .WithUsing("take", "rxjs/operators") - .WithUsing("HubConnectionBuilder", "@microsoft/signalr") - .WithUsing("HubConnection", "@microsoft/signalr") - .WithUsing("IHttpConnectionOptions", "@microsoft/signalr") - .WithUsing("LogLevel", "@microsoft/signalr") - .WithUsing(connectionStatusEnum.Name, FileSystem.Combine(relativeModelPath, Formatter.FormatFile(connectionStatusFileTemplate.Name, configuration, true)).Replace("\\", "/")) - .WithAttribute("Injectable", Code.AnonymousObject().WithProperty("providedIn", Code.String("root"))); - FieldTemplate isClosedField = classTemplate.AddField("isClosed", Code.Type("boolean")); - FieldTemplate serviceUrlField = classTemplate.AddField("serviceUrl", Code.Type("string")).Public().FormatName(configuration).Default(Code.String(string.Empty)); - FieldTemplate optionsField = classTemplate.AddField("options", Code.Type("IHttpConnectionOptions")).Public().FormatName(configuration); - FieldTemplate logLevelField = classTemplate.AddField("logLevel", Code.Type("LogLevel")).Public().FormatName(configuration).Default(Code.Static(Code.Type("LogLevel")).Field("Error")); - FieldTemplate connectionField = classTemplate.AddField("connection", Code.Generic("ReplaySubject", Code.Type("HubConnection"))); - FieldTemplate timeoutsField = null; - if (configuration.Service.Timeouts?.Count > 0) - { - timeoutsField = classTemplate.AddField("timeouts", Code.Generic("Array", Code.Type("number"))).Readonly() - .Default(Code.TypeScript($"[{string.Join(", ", configuration.Service.Timeouts)}]")); - } - FieldTemplate statusSubjectField = classTemplate.AddField("statusSubject", Code.Generic("ReplaySubject", connectionStatusEnum.ToType())).Readonly() - .Default(Code.New(Code.Generic("ReplaySubject", connectionStatusEnum.ToType()), Code.Number(1))); - classTemplate.AddField("status$", Code.Generic("Observable", connectionStatusEnum.ToType())).FormatName(configuration).Readonly().Public() - .Default(Code.This().Local(statusSubjectField).Method("asObservable")); - MultilineCodeFragment createConnectionCode = Code.Multiline(); - MultilineCodeFragment errorCode = Code.Multiline(); - if (timeoutsField != null) - { - errorCode.AddLine(Code.If(Code.This().Field(isClosedField)).WithCode(Code.Return())) - .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("sleeping")).Close()) - .AddLine(Code.Declare(Code.Type("number"), "timeout", Code.This().Field(timeoutsField).Index(Code.Local("trial")))) - .AddLine(Code.Local("trial++").Close()); - if (configuration.Service.EndlessTries) - { - errorCode.AddLine(Code.Local("timeout").Assign(Code.Local("timeout").Or().This().Field(timeoutsField).Index(Code.This().Field(timeoutsField).Field("length").Subtract().Number(1)).Or().Number(0)).Close()); - } - else - { - errorCode.AddLine(Code.If(Code.Local("timeout").Equals().Undefined()) - .WithCode(Code.This().Method("disconnect").Close()) - .WithCode(Code.Local("subject").Method("error", Code.Local("error")).Close()).WithCode(Code.Return())); - } - errorCode.AddLine(Code.Method("setTimeout", - Code.Lambda(Code.Multiline() - .AddLine(Code.If(Code.This().Field(isClosedField)).WithCode(Code.Return())) - .AddLine(Code.Method("startConnection").Method("subscribe", - Code.Lambda(Code.Multiline() - .AddLine(Code.Local("subject").Method("next").Close()) - .AddLine(Code.Local("subject").Method("complete").Close())), - Code.Lambda("innerError", Code.Local("subject").Method("error", Code.Local("innerError"))) - ))), - Code.Local("timeout") - ).Close()); + this.AddAppendDateMethod(classTemplate); + } + if (appendConvertDateMethod) + { + this.AppendConvertDateMethod(classTemplate); + } + classTemplate.Methods.RemoveRange(convertDateMethods); + classTemplate.Methods.AddRange(convertDateMethods); + this.AppendFixUndefined(classTemplate); + } + List hubs = this.transferObjects.OfType().ToList(); + FileTemplate connectionStatusFileTemplate = null; + EnumTemplate connectionStatusEnum = null; + if (hubs.Count > 0) + { + string className = "ConnectionStatus"; + GeneratorOptions anyOptions = this.Options.Get(hubs.First()); + connectionStatusFileTemplate = this.files.AddFile(configuration.Model.RelativePath, anyOptions) + .WithName(Formatter.FormatFile(className, anyOptions)); + connectionStatusEnum = connectionStatusFileTemplate + .AddNamespace(string.Empty) + .AddEnum(className) + .FormatName(this.Options.Get(hubs.First())) + .AddValue("connecting") + .AddValue("connected") + .AddValue("sleeping") + .AddValue("disconnected"); + } + foreach (SignalRHubTransferObject hub in hubs) + { + GeneratorOptions hubOptions = this.Options.Get(hub); + string relativeModelPath = FileSystem.RelativeTo(configuration.Model?.RelativePath ?? ".", configuration.Service.RelativePath); + string className = configuration.Service.Name?.Replace("{0}", hub.Name) ?? hub.Name + "Service"; + FileTemplate file = this.files.AddFile(configuration.Service.RelativePath, hubOptions) + .WithName(Formatter.FormatFile(className, hubOptions, "service")); + NamespaceTemplate namespaceTemplate = file.AddNamespace(string.Empty); + ClassTemplate classTemplate = namespaceTemplate + .AddClass(className) + .FormatName(hubOptions, true) + .FormatPrefix(hubOptions) + .WithUsing("Injectable", "@angular/core") + .WithUsing("Subject", "rxjs") + .WithUsing("Observable", "rxjs") + .WithUsing("ReplaySubject", "rxjs") + .WithUsing("filter", "rxjs/operators") + .WithUsing("map", "rxjs/operators") + .WithUsing("mergeMap", "rxjs/operators") + .WithUsing("take", "rxjs/operators") + .WithUsing("HubConnectionBuilder", "@microsoft/signalr") + .WithUsing("HubConnection", "@microsoft/signalr") + .WithUsing("IHttpConnectionOptions", "@microsoft/signalr") + .WithUsing("LogLevel", "@microsoft/signalr") + .WithUsing(connectionStatusEnum.Name, FileSystem.Combine(relativeModelPath, connectionStatusFileTemplate.Name).Replace("\\", "/")) + .WithAttribute("Injectable", Code.AnonymousObject().WithProperty("providedIn", Code.String("root"))); + FieldTemplate isClosedField = classTemplate.AddField("isClosed", Code.Type("boolean")).Default(Code.Boolean(true)); + FieldTemplate serviceUrlField = classTemplate.AddField("serviceUrl", Code.Type("string")).Public().FormatName(hubOptions).Default(Code.String(string.Empty)); + FieldTemplate optionsField = classTemplate.AddField("options", Code.Type("IHttpConnectionOptions")).Public().FormatName(hubOptions).Default(Code.AnonymousObject()); + FieldTemplate logLevelField = classTemplate.AddField("logLevel", Code.Type("LogLevel")).Public().FormatName(hubOptions).Default(Code.Static(Code.Type("LogLevel")).Field("Error")); + FieldTemplate connectionField = classTemplate.AddField("connection", Code.Generic("ReplaySubject", Code.Type("HubConnection"))).Optional(); + FieldTemplate timeoutsField = null; + if (configuration.Service.Timeouts?.Count > 0) + { + timeoutsField = classTemplate.AddField("timeouts", Code.Generic("Array", Code.Type("number"))).Readonly() + .Default(Code.TypeScript($"[{string.Join(", ", configuration.Service.Timeouts)}]")); + } + FieldTemplate statusSubjectField = classTemplate.AddField("statusSubject", Code.Generic("ReplaySubject", connectionStatusEnum.ToType())).Readonly() + .Default(Code.New(Code.Generic("ReplaySubject", connectionStatusEnum.ToType()), Code.Number(1))); + classTemplate.AddField("status$", Code.Generic("Observable", connectionStatusEnum.ToType())).FormatName(hubOptions).Readonly().Public() + .Default(Code.This().Local(statusSubjectField).Method("asObservable")); + MultilineCodeFragment createConnectionCode = Code.Multiline(); + MultilineCodeFragment errorCode = Code.Multiline(); + if (timeoutsField != null) + { + errorCode.AddLine(Code.If(Code.This().Field(isClosedField)).WithCode(Code.Return())) + .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("sleeping")).Close()) + .AddLine(Code.Declare(Code.Type("number"), "timeout", Code.This().Field(timeoutsField).Index(Code.Local("trial")))) + .AddLine(Code.Local("trial++").Close()); + if (configuration.Service.EndlessTries) + { + errorCode.AddLine(Code.Local("timeout").Assign(Code.Local("timeout").Or().This().Field(timeoutsField).Index(Code.This().Field(timeoutsField).Field("length").Subtract().Number(1)).Or().Number(0)).Close()); } else { - errorCode.AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("disconnected")).Close()) - .AddLine(Code.Local("subject").Method("error", Code.Local("error")).Close()); + errorCode.AddLine(Code.If(Code.Local("timeout").Equals().Undefined()) + .WithCode(Code.This().Method("disconnect").Close()) + .WithCode(Code.Local("subject").Method("error", Code.Local("error")).Close()).WithCode(Code.Return())); } + errorCode.AddLine(Code.Method("setTimeout", + Code.Lambda(Code.Multiline() + .AddLine(Code.If(Code.This().Field(isClosedField)).WithCode(Code.Return())) + .AddLine(Code.Method("startConnection").Method("subscribe", + Code.Lambda(Code.Multiline() + .AddLine(Code.Local("subject").Method("next").Close()) + .AddLine(Code.Local("subject").Method("complete").Close())), + Code.Lambda("innerError", Code.Local("subject").Method("error", Code.Local("innerError"))) + ))), + Code.Local("timeout") + ).Close()); + } + else + { + errorCode.AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("disconnected")).Close()) + .AddLine(Code.Local("subject").Method("error", Code.Local("error")).Close()); + } - MethodTemplate connectMethod = classTemplate.AddMethod("Connect", Code.Generic("Observable", Code.Void())).FormatName(configuration) - .WithComment("Connects to the hub via given serviceUrl.\nAutomatically reconnects on connection loss. \nIf timeout is configured, goes to sleeping state and reconnects after the timeout") - .WithCode(Code.If(Code.Not().This().Local(serviceUrlField)) - .WithCode(Code.Throw(Code.Type("Error"), Code.String("serviceUrl can not be empty. Set it via service.serviceUrl.")))) - .WithCode(Code.If(Code.This().Field(connectionField).And().Not().This().Field(isClosedField)) - .WithCode(Code.Return(Code.This().Local("status$").Method("pipe", - Code.Method("filter", Code.Lambda("status", Code.Local("status").Equals().Local("ConnectionStatus").Field("connected"))), - Code.Method("take", Code.Number(1)), - Code.Method("map", Code.Lambda(Code.AnonymousObject())) - )))) - .WithCode(Code.This().Field(isClosedField).Assign(Code.Boolean(false)).Close()) - .WithCode(Code.This().Field(connectionField).Assign(Code.InlineIf(Code.This().Field(connectionField), Code.This().Field(connectionField), Code.New(connectionField.Type, Code.Number(1)))).Close()) - .WithCode(Code.Declare(Code.Type("HubConnection"), "hubConnection", Code.New(Code.Type("HubConnectionBuilder")) - .Method("withUrl", Code.This().Local(serviceUrlField), Code.This().Local(optionsField)) - .Method("configureLogging", Code.This().Field(logLevelField)) - .Method("build"))) - .WithCode(Code.Declare(Code.Type("() => Observable"), "startConnection", Code.Lambda( - Code.Multiline() - .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Local("connecting")).Close()) - .AddLine(Code.Declare(Code.Generic("Subject", Code.Void()), "subject", Code.New(Code.Generic("Subject", Code.Void())))) - .AddLine(Code.Local("hubConnection").Method("start") - .Method("then", Code.Lambda(Code.Multiline() - .AddLine(Code.Local("subject").Method("next").Close()) - .AddLine(Code.Local("subject").Method("complete").Close()) - .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("connected")).Close()))) - .Method("catch", Code.Lambda("error", errorCode)).Close()) - .AddLine(Code.Return(Code.Local("subject"))) - ))) - .WithCode(createConnectionCode) - .WithCode(Code.Local("hubConnection").Method("onclose", Code.Lambda(Code.Multiline() - .AddLine(Code.If(Code.Not().This().Field(isClosedField)) - .WithCode(Code.Method("startConnection").Close()))) - ).Close()) - .WithCode(Code.This().Field(connectionField).Method("next", Code.Local("hubConnection")).Close()) - .WithCode(Code.Return(Code.Method("startConnection"))); + MethodTemplate connectMethod = classTemplate.AddMethod("Connect", Code.Generic("Observable", Code.Void())).FormatName(hubOptions) + .WithComment("Connects to the hub via given serviceUrl.\nAutomatically reconnects on connection loss. \nIf timeout is configured, goes to sleeping state and reconnects after the timeout") + .WithCode(Code.If(Code.Not().This().Local(serviceUrlField)) + .WithCode(Code.Throw(Code.Type("Error"), Code.String("serviceUrl can not be empty. Set it via service.serviceUrl.")))) + .WithCode(Code.If(Code.This().Field(connectionField).And().Not().This().Field(isClosedField)) + .WithCode(Code.Return(Code.This().Local("status$").Method("pipe", + Code.Method("filter", Code.Lambda("status", Code.Local("status").Equals().Local("ConnectionStatus").Field("connected"))), + Code.Method("take", Code.Number(1)), + Code.Method("map", Code.Lambda(Code.AnonymousObject())) + )))) + .WithCode(Code.This().Field(isClosedField).Assign(Code.Boolean(false)).Close()) + .WithCode(Code.This().Field(connectionField).Assign(Code.InlineIf(Code.This().Field(connectionField), Code.This().Field(connectionField), Code.New(connectionField.Type, Code.Number(1)))).Close()) + .WithCode(Code.Declare(Code.Type("HubConnection"), "hubConnection", Code.New(Code.Type("HubConnectionBuilder")) + .Method("withUrl", Code.This().Local(serviceUrlField), Code.This().Local(optionsField)) + .Method("configureLogging", Code.This().Field(logLevelField)) + .Method("build"))) + .WithCode(Code.Declare(Code.Type("() => Observable"), "startConnection", Code.Lambda( + Code.Multiline() + .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Local("connecting")).Close()) + .AddLine(Code.Declare(Code.Generic("Subject", Code.Void()), "subject", Code.New(Code.Generic("Subject", Code.Void())))) + .AddLine(Code.Local("hubConnection").Method("start") + .Method("then", Code.Lambda(Code.Multiline() + .AddLine(Code.Local("subject").Method("next").Close()) + .AddLine(Code.Local("subject").Method("complete").Close()) + .AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local(connectionStatusEnum.Name).Field("connected")).Close()))) + .Method("catch", Code.Lambda("error", errorCode)).Close()) + .AddLine(Code.Return(Code.Local("subject"))) + ))) + .WithCode(createConnectionCode) + .WithCode(Code.Local("hubConnection").Method("onclose", Code.Lambda(Code.Multiline() + .AddLine(Code.If(Code.Not().This().Field(isClosedField)) + .WithCode(Code.Method("startConnection").Close()))) + ).Close()) + .WithCode(Code.This().Field(connectionField).Method("next", Code.Local("hubConnection")).Close()) + .WithCode(Code.Return(Code.Method("startConnection"))); - classTemplate.AddMethod("disconnect", Code.Void()) - .WithComment("Close an active connection to the hub.\nIf the service is reconnecting/sleeping the connection attempt will be canceled") - .WithCode(Code.This().Field(isClosedField).Assign(Code.Boolean(true)).Close()) - .WithCode(Code.This().Field(connectionField).NullConditional().Method("pipe", Code.Method("take", Code.Number(1))) - .Method("subscribe", Code.Lambda("hubConnection", Code.Multiline() - .AddLine(Code.Local("hubConnection").Method("stop").Method("then", Code.Lambda(Code.Multiline().AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local("ConnectionStatus").Field("disconnected")).Close()))).Close()) - )).Close()); + classTemplate.AddMethod("disconnect", Code.Void()) + .WithComment("Close an active connection to the hub.\nIf the service is reconnecting/sleeping the connection attempt will be canceled") + .WithCode(Code.This().Field(isClosedField).Assign(Code.Boolean(true)).Close()) + .WithCode(Code.This().Field(connectionField).NullConditional().Method("pipe", Code.Method("take", Code.Number(1))) + .Method("subscribe", Code.Lambda("hubConnection", Code.Multiline() + .AddLine(Code.Local("hubConnection").Method("stop").Method("then", Code.Lambda(Code.Multiline().AddLine(Code.This().Field(statusSubjectField).Method("next", Code.Local("ConnectionStatus").Field("disconnected")).Close()))).Close()) + )).Close()); - if (timeoutsField != null) - { - connectMethod.AddParameter(Code.Type("number"), "trial", Code.Number(0)); - } + if (timeoutsField != null) + { + connectMethod.AddParameter(Code.Type("number"), "trial", Code.Number(0)); + } - foreach (HttpServiceActionTransferObject action in hub.Actions) + foreach (HttpServiceActionTransferObject action in hub.Actions) + { + MethodTemplate methodTemplate = classTemplate.AddMethod(action.Name, Code.Generic("Observable", Code.Type("void"))) + .FormatName(hubOptions) + .WithComment($"Send a \"{action.Name}\" message to the hub with the given parameters. Automatically connects to the hub."); + foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) { - MethodTemplate methodTemplate = classTemplate.AddMethod(action.Name, Code.Generic("Observable", Code.Type("void"))) - .FormatName(configuration) - .WithComment($"Send a \"{action.Name}\" message to the hub with the given parameters. Automatically connects to the hub."); - foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) + if (hub.Language != null && hubOptions.Language != null) { - if (hubLanguage != null && configurationLanguage != null) - { - this.MapType(hubLanguage, configurationLanguage, parameter.Type); - } - this.AddUsing(parameter.Type, classTemplate, configuration, relativeModelPath); - methodTemplate.AddParameter(parameter.Type.ToTemplate(), parameter.Name, parameter.IsOptional ? Code.Null() : null).FormatName(configuration); + this.MapType(hub.Language, hubOptions.Language, parameter.Type); } + this.AddUsing(parameter.Type, classTemplate, hubOptions, relativeModelPath); + methodTemplate.AddParameter(parameter.Type.ToTemplate(), parameter.Name, parameter.IsOptional ? Code.Null() : null).FormatName(hubOptions); + } - List parameters = new List(); - parameters.Add(Code.String(action.Name)); - parameters.AddRange(action.Parameters.Select(parameter => Code.Local(parameter.Name))); + List parameters = new(); + parameters.Add(Code.String(action.Name)); + parameters.AddRange(action.Parameters.Select(parameter => Code.Local(parameter.Name))); - string subjectName = action.Parameters.Any(x => x.Name == "subject") ? "rxjsSubject" : "subject"; - methodTemplate.WithCode(Code.Declare(Code.Generic("Subject", Code.Void()), subjectName, Code.New(Code.Generic("Subject", Code.Void())))) - .WithCode( - Code.This().Method(connectMethod).Method("pipe", - Code.Method("mergeMap", Code.Lambda(Code.This().Field(connectionField))), - Code.Method("take", Code.Number(1)), - Code.Method("mergeMap", Code.Lambda("connection", Code.Local("connection").Method("send", parameters)) - )) - .Method("subscribe", Code.Lambda(Code.Multiline() - .AddLine(Code.Local(subjectName).Method("next").Close()) - .AddLine(Code.Local(subjectName).Method("complete").Close())), - Code.Lambda("error", Code.Local(subjectName).Method("error", Code.Local("error")))).Close()) - .WithCode(Code.Return(Code.Local(subjectName))); - } - foreach (HttpServiceActionTransferObject action in hub.Events) + string subjectName = action.Parameters.Any(x => x.Name == "subject") ? "rxjsSubject" : "subject"; + methodTemplate.WithCode(Code.Declare(Code.Generic("Subject", Code.Void()), subjectName, Code.New(Code.Generic("Subject", Code.Void())))) + .WithCode( + Code.This().Method(connectMethod).Method("pipe", + Code.Method("mergeMap", Code.Lambda(Code.This().Field(connectionField.Name + "!"))), + Code.Method("take", Code.Number(1)), + Code.Method("mergeMap", Code.Lambda("connection", Code.Local("connection").Method("send", parameters)) + )) + .Method("subscribe", Code.Lambda(Code.Multiline() + .AddLine(Code.Local(subjectName).Method("next").Close()) + .AddLine(Code.Local(subjectName).Method("complete").Close())), + Code.Lambda("error", Code.Local(subjectName).Method("error", Code.Local("error")))).Close()) + .WithCode(Code.Return(Code.Local(subjectName))); + } + foreach (HttpServiceActionTransferObject action in hub.Events) + { + foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) { - foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) - { - if (hubLanguage != null && configurationLanguage != null) - { - this.MapType(hubLanguage, configurationLanguage, parameter.Type); - } - this.AddUsing(parameter.Type, classTemplate, configuration, relativeModelPath); - } - TypeTemplate eventType; - List eventResult = new List(); - if (action.Parameters.Count == 0) + if (hub.Language != null && hubOptions.Language != null) { - eventType = Code.Void(); + this.MapType(hub.Language, hubOptions.Language, parameter.Type); } - else if (action.Parameters.Count == 1) - { - eventType = action.Parameters.First().Type.ToTemplate(); - eventResult.Add(Code.Local(action.Parameters.Single().Name)); - } - else + this.AddUsing(parameter.Type, classTemplate, hubOptions, relativeModelPath); + } + TypeTemplate eventType; + List eventResult = new(); + if (action.Parameters.Count == 0) + { + eventType = Code.Void(); + } + else if (action.Parameters.Count == 1) + { + eventType = action.Parameters.First().Type.ToTemplate(); + eventResult.Add(Code.Local(action.Parameters.Single().Name)); + } + else + { + AnonymousObjectTemplate eventTypeObject = Code.AnonymousObject(); + AnonymousObjectTemplate resultObject = Code.AnonymousObject(); + foreach (HttpServiceActionParameterTransferObject parameter in action.Parameters) { - AnonymousObjectTemplate anonymousObject = Code.AnonymousObject(); - action.Parameters.ForEach(parameter => anonymousObject.AddProperty(parameter.Name).FormatName(configuration)); - DeclareTypeTemplate declareTypeTemplate = namespaceTemplate.AddDeclareType(action.Name + "Event", anonymousObject).FormatName(configuration); - eventType = Code.Type(declareTypeTemplate.Name); - eventResult.Add(anonymousObject); + eventTypeObject.AddProperty(parameter.Name, parameter.Type.ToTemplate()).FormatName(hubOptions); + resultObject.AddProperty(parameter.Name).FormatName(hubOptions); } - GenericTypeTemplate subjectType = Code.Generic("Subject", eventType); - FieldTemplate eventPrivateField = classTemplate.AddField(action.Name + "Subject", subjectType).Readonly().FormatName(configuration).Default(Code.New(subjectType)); - FieldTemplate eventPublicField = classTemplate.AddField(action.Name + "$", Code.Generic("Observable", eventType)).Public().Readonly().FormatName(configuration) - .Default(Code.This().Local(eventPrivateField).Method("asObservable")); - MultilineCodeFragment code = new MultilineCodeFragment(); - code.AddLine(Code.This().Local(eventPrivateField).Method("next", eventResult.ToArray()).Close()); - List parameters = new List(); - parameters.Add(Code.String(action.Name)); - parameters.Add(Code.Lambda(action.Parameters.Select(x => new ParameterTemplate(x.Type.ToTemplate(), x.Name)).ToList(), code)); - createConnectionCode.AddLine(Code.Local("hubConnection").Method("on", parameters).Close()); + DeclareTypeTemplate declareTypeTemplate = namespaceTemplate.AddDeclareType(action.Name + "Event", eventTypeObject).FormatName(hubOptions); + eventType = Code.Type(declareTypeTemplate.Name); + eventResult.Add(resultObject); } + GenericTypeTemplate subjectType = Code.Generic("Subject", eventType); + FieldTemplate eventPrivateField = classTemplate.AddField(action.Name + "Subject", subjectType).Readonly().FormatName(hubOptions).Default(Code.New(subjectType)); + FieldTemplate eventPublicField = classTemplate.AddField(action.Name + "$", Code.Generic("Observable", eventType)).Public().Readonly().FormatName(hubOptions) + .Default(Code.This().Local(eventPrivateField).Method("asObservable")); + MultilineCodeFragment code = new(); + code.AddLine(Code.This().Local(eventPrivateField).Method("next", eventResult.ToArray()).Close()); + List parameters = new(); + parameters.Add(Code.String(action.Name)); + parameters.Add(Code.Lambda(action.Parameters.Select(x => new ParameterTemplate(x.Type.ToTemplate(), x.Name)).ToList(), code)); + createConnectionCode.AddLine(Code.Local("hubConnection").Method("on", parameters).Close()); } } + } - private bool WriteDateFixes(ModelTransferObject model, bool isModelEnumerable, MultilineCodeFragment code, IReadOnlyList chain, IReadOnlyList typeChain, List transferObjects, IConfiguration configuration) + private bool WriteDateFixes(ClassTemplate classTemplate, List convertDateMethods, ModelTransferObject model, GeneratorOptions controllerOptions, string relativeModelPath) + { + if (model == null) { - if (model == null) - { - return false; - } - bool datePropertyFound = false; - IfTemplate ifTemplate = Code.If(this.WriteFieldChain(chain)); - MultilineCodeFragment innerCode = ifTemplate.Code; - if (isModelEnumerable) - { - innerCode = Code.Multiline(); - ifTemplate.WithCode(this.WriteFieldChain(chain).Method("forEach", Code.Lambda("entry", innerCode)).Close()); - chain = new List { "entry" }; - } - foreach (PropertyTransferObject property in model.Properties) + return false; + } + string methodName = $"convert{model.Name.ToPascalCase()}Date"; + if (convertDateMethods.Any(x => x.Name.Equals(methodName, StringComparison.InvariantCultureIgnoreCase))) + { + return true; + } + this.AddUsing(model, classTemplate, controllerOptions, relativeModelPath); + bool hasLocalDateProperty = false; + MethodTemplate convertDateMethodTemplate = classTemplate.AddMethod(methodName, Code.Void()) + .WithParameter(model.ToTemplate(), "model?") + .WithCode(Code.If(Code.Local("!model")).WithCode(Code.Return())); + convertDateMethods.Add(convertDateMethodTemplate); + foreach (PropertyTransferObject property in model.Properties) + { + TypeTransferObject type = model.Generics.FirstOrDefault(generic => generic.Alias?.Name == property.Name)?.Type ?? property.Type; + GeneratorOptions propertyOptions = this.Options.Get(property); + string propertyName = Formatter.FormatProperty(property.Name, propertyOptions); + if (type.IgnoreNullable().OriginalName == nameof(DateTime)) { - TypeTransferObject type = model.Generics.FirstOrDefault(generic => generic.Alias?.Name == property.Name)?.Type ?? property.Type; - if (typeChain.Any(typeFromChain => typeFromChain.Name == property.Type.Name && typeFromChain.Namespace == property.Type.Namespace)) + hasLocalDateProperty = true; + AssignTemplate assignTemplate = Code.Local("model").Field(propertyName).Assign(Code.This().Method("convertDate", Code.Local("model").Field(propertyName))); + ICodeFragment lineTemplate; + if (property.IsOptional || property.Type.IsNullable) { - continue; + lineTemplate = assignTemplate.Close(); } - string propertyName = Formatter.FormatProperty(property.Name, configuration); - if (type.Name == nameof(DateTime)) + else { - datePropertyFound = true; - if (isModelEnumerable) - { - innerCode.AddLine(Code.Local("entry").Field(propertyName).Assign(Code.This().Method("convertToDate", Code.Local("entry").Field(propertyName))).Close()); - } - else - { - innerCode.AddLine(this.WriteFieldChain(chain).Field(propertyName).Assign(Code.This().Method("convertToDate", this.WriteFieldChain(chain).Field(propertyName))).Close()); - } + lineTemplate = assignTemplate.NullCoalescing(Code.Local("model").Field(propertyName).Close()); } - ModelTransferObject propertyModel = type as ModelTransferObject; - TypeTransferObject entryType = propertyModel?.Generics.FirstOrDefault()?.Type; - entryType = entryType == null ? null : model.Generics.FirstOrDefault(generic => generic.Alias?.Name == entryType.Name)?.Type ?? entryType; - ModelTransferObject entryModel = entryType as ModelTransferObject ?? transferObjects.OfType().FirstOrDefault(x => x.Name == entryType?.Name && x.Namespace == entryType?.Namespace); - List nextChain = new List(chain); - nextChain.Add(propertyName); - List nextTypeChain = new List(typeChain); - nextTypeChain.Add(type); - if (propertyModel != null && propertyModel.IsEnumerable() && entryModel != null) + convertDateMethodTemplate.WithCode(lineTemplate); + } + ModelTransferObject propertyModel = type as ModelTransferObject; + TypeTransferObject entryType = propertyModel?.Generics.FirstOrDefault()?.Type; + entryType = entryType == null ? null : model.Generics.FirstOrDefault(generic => generic.Alias?.Name == entryType.Name)?.Type ?? entryType; + ModelTransferObject entryModel = entryType as ModelTransferObject ?? this.transferObjects.OfType().FirstOrDefault(x => x.Name == entryType?.Name && x.Namespace == entryType?.Namespace); + if (propertyModel != null && propertyModel.IsEnumerable() && entryModel != null) + { + if (entryModel.OriginalName == nameof(DateTime)) { - datePropertyFound = this.WriteDateFixes(entryModel, true, innerCode, nextChain, nextTypeChain, transferObjects, configuration) || datePropertyFound; + hasLocalDateProperty = true; + convertDateMethodTemplate.WithCode(Code.Local("model").Field(propertyName).Assign( + Code.Local("model").Field(propertyName).Method("map", Code.Lambda("m", + Code.This().Method("convertDate", Code.Local("m")) + ))) + ); } - else if (propertyModel != null && propertyModel.Properties.Count > 0) + else if (this.WriteDateFixes(classTemplate, convertDateMethods, entryModel, controllerOptions, relativeModelPath)) { - datePropertyFound = this.WriteDateFixes(propertyModel, false, innerCode, nextChain, nextTypeChain, transferObjects, configuration) || datePropertyFound; + hasLocalDateProperty = true; + GenericAliasTransferObject aliasedType = model.Generics.FirstOrDefault(x => x.Alias.Name == property.Type.Generics.Single().Alias.Name) + ?? property.Type.Generics.Single(); + string convertMethodName = $"convert{aliasedType.Type.Name.ToPascalCase()}Date"; + convertDateMethodTemplate.WithCode(Code.Local("model").Field(propertyName + "?").Method("forEach", Code.Lambda("m", Code.This().Method(convertMethodName, Code.Local("m")))).Close()); } } - if (datePropertyFound) + else if (propertyModel != null && propertyModel.Properties.Count > 0) { - code.AddLine(ifTemplate); + if (this.WriteDateFixes(classTemplate, convertDateMethods, propertyModel, controllerOptions, relativeModelPath)) + { + hasLocalDateProperty = true; + string convertMethodName = $"convert{property.Type.Name.ToPascalCase()}Date"; + convertDateMethodTemplate.WithCode(Code.This().Method(convertMethodName, Code.Local("model").Field(propertyName)).Close()); + } } - return datePropertyFound; } - - private ChainedCodeFragment WriteFieldChain(IEnumerable chain) + if (hasLocalDateProperty) { - List chainList = chain.ToList(); - ChainedCodeFragment code = Code.Local(chainList.First()); - foreach (string field in chainList.Skip(1)) - { - code = code.Field(field); - } - return code; + return true; } + convertDateMethods.Remove(convertDateMethodTemplate); + classTemplate.Methods.Remove(convertDateMethodTemplate); + return false; + } - private void AppendConvertAnyMethod(ClassTemplate classTemplate) - { - classTemplate.AddMethod("convertAny", Code.Type("string")) - .WithParameter(Code.Type("any"), "value") - .WithCode(Code.Return(Code.InlineIf(Code.Local("value").Equals().ForceNull().Or().Local("value").Equals().Undefined(), - Code.String(string.Empty), - Code.Local("value").Method("toString") - ) - )); - } + private void AddAppendMethod(ClassTemplate classTemplate) + { + MultilineCodeFragment code = Code.Multiline().AddLine( + Code.If(Code.Not().Local("parameterName")) + .WithCode(Code.Return(Code.Local("url") + .Append(Code.Local("separator")) + .Append(Code.Parenthesis(Code.InlineIf(Code.Local("value").Equals().ForceNull().Or().Local("value").Equals().Undefined(), + Code.String(string.Empty), + Code.Local("value").Method("toString") + ))) + )) + ); + code.AddLine(Code.If(Code.Local("value").NotEquals().ForceNull().And().Local("value").NotEquals().Undefined()) + .WithCode(Code.Return(Code.Local("url") + .Append(Code.Parenthesis(Code.InlineIf(Code.Local("url").Method("indexOf", Code.String("?")).Equals().Number(-1), Code.String("?"), Code.String("&")))) + .Append(Code.Local("parameterName")) + .Append(Code.String("=")) + .Append(Code.Local("value").Method("toString")) + )) + ); + code.AddLine(Code.Return(Code.Local("url"))); + classTemplate.AddMethod("append", Code.Type("string")) + .WithParameter(Code.Type("string"), "url") + .WithParameter(Code.Type("{toString(): string} | undefined | null"), "value") + .WithParameter(Code.Type("string"), "parameterName", Code.String(string.Empty)) + .WithParameter(Code.Type("string"), "separator", Code.String(string.Empty)) + .WithCode(code); + } - private void AppendConvertFromDateMethod(ClassTemplate classTemplate) - { - classTemplate.AddMethod("convertFromDate", Code.Type("string")) - .WithParameter(Code.Type("Date"), "date") - .WithCode(Code.Return(Code.InlineIf(Code.Local("date").Equals().ForceNull().Or().Local("date").Equals().Undefined(), - Code.String(string.Empty), - Code.InlineIf(Code.TypeScript($"typeof(date) === \"string\""), - Code.Local("date"), - Code.Local("date").Method("toISOString") - ) - ) - )); - } + private void AddAppendDateMethod(ClassTemplate classTemplate) + { + ICodeFragment code = Code.InlineIf(Code.Local("date").Equals().ForceNull().Or().Local("date").Equals().Undefined(), + Code.String(string.Empty), + Code.InlineIf(Code.TypeScript("typeof(date) === \"string\""), + Code.Local("date"), + Code.Local("date").Method("toISOString") + ) + ); + classTemplate.AddMethod("appendDate", Code.Type("string")).Private() + .WithParameter(Code.Type("string"), "url") + .WithParameter(Code.Type("Date | null | undefined | string"), "date") + .WithParameter(Code.Type("string"), "parameterName", Code.String(string.Empty)) + .WithParameter(Code.Type("string"), "separator", Code.String(string.Empty)) + .WithCode(Code.Return(Code.This().Method("append", Code.Local("url"), code, Code.Local("parameterName"), Code.Local("separator")))); + } - private void AppendConvertToDateMethod(ClassTemplate classTemplate) - { - classTemplate.AddMethod("convertToDate", Code.Type("Date")) - .WithParameter(Code.Type("string | Date"), "value") - .WithCode(Code.Return(Code.InlineIf(Code.TypeScript($"typeof(value) === \"string\""), - Code.New(Code.Type("Date"), Code.Local("value")), - Code.Local("value") - ) - )); - } + private void AppendConvertDateMethod(ClassTemplate classTemplate) + { + classTemplate.AddMethod("convertDate", Code.UnionType(Code.Type("Date"), Code.Undefined())).Private() + .WithParameter(Code.UnionType(Code.Type("string"), Code.Type("Date"), Code.Undefined()), "value") + .AddOverload(overload => overload + .WithParameter(Code.UnionType(Code.Type("string"), Code.Type("Date")), "value") + .WithReturnType(Code.Type("Date")) + ) + .WithCode(Code.Return(Code.InlineIf(Code.Local("value").Equals().String("0001-01-01T00:00:00"), + Code.New(Code.Type("Date"), Code.String("0001-01-01T00:00:00Z")), + Code.InlineIf(Code.TypeScript("typeof(value) === \"string\""), + Code.New(Code.Type("Date"), Code.Local("value")), + Code.Local("value") + ) + ))); + } - private string GetAllowedName(ILanguage language, string name) - { - return language.ReservedKeywords.ContainsKey(name) ? language.ReservedKeywords[name] : name; - } + private void AppendFixUndefined(ClassTemplate classTemplate) + { + classTemplate.AddMethod("fixUndefined", Code.Type("any")).Private() + .WithParameter(Code.Type("any"), "value") + .WithCode(Code.If(Code.Not().Local("value")).WithCode(Code.Return(Code.Local("value").NullCoalescing().Local("undefined")))) + .WithCode(Code.If(Code.Static(Code.Type("Array")).Method("isArray", Code.Local("value"))) + .WithCode(Code.TypeScript("value.forEach((entry, index) => value[index] = this.fixUndefined(entry));"))) + .WithCode(Code.If(Code.TypeScript("typeof value === 'object'")).WithCode(Code.TypeScript("for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); }"))) + .WithCode(Code.Return(Code.Local("value"))); + } + + private string GetAllowedName(ILanguage language, string name) + { + return language.ReservedKeywords.ContainsKey(name) ? language.ReservedKeywords[name] : name; } } diff --git a/Angular/Writers/AngularWriter.cs b/Angular/Writers/AngularWriter.cs deleted file mode 100644 index 04a5fe4d..00000000 --- a/Angular/Writers/AngularWriter.cs +++ /dev/null @@ -1,37 +0,0 @@ -using System.Collections.Generic; -using KY.Core.Dependency; -using KY.Generator.Angular.Configurations; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Writers; - -namespace KY.Generator.Angular.Writers -{ - internal class AngularWriter : ITransferWriter - { - private readonly IDependencyResolver resolver; - - public AngularWriter(IDependencyResolver resolver) - { - this.resolver = resolver; - } - - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - AngularWriteConfiguration configuration = (AngularWriteConfiguration)configurationBase; - List files = new List(); - if (configuration.Service != null) - { - this.resolver.Create().Write(configuration, transferObjects, files); - } - if (configuration.WriteModels) - { - this.resolver.Create().Write(configuration, transferObjects, files); - } - files.ForEach(file => configuration.Language.Write(file, output)); - } - } -} \ No newline at end of file diff --git a/Annotations/Angular/GenerateAngularHubAttribute.cs b/Annotations/Angular/GenerateAngularHubAttribute.cs index 27ded871..e6cc6bfe 100644 --- a/Annotations/Angular/GenerateAngularHubAttribute.cs +++ b/Annotations/Angular/GenerateAngularHubAttribute.cs @@ -13,12 +13,12 @@ public IEnumerable Commands return new[] { new AttributeCommandConfiguration("asp-read-hub", "-namespace=$NAMESPACE$", "-name=$NAME$"), - new AttributeCommandConfiguration("angular-service", this.ServiceParameters), - new AttributeCommandConfiguration("angular-model", this.ModelParameters) + new AttributeCommandConfiguration("angular-model", this.ModelParameters), + new AttributeCommandConfiguration("angular-service", this.ServiceParameters) }; } } - + private List ServiceParameters { get @@ -36,30 +36,6 @@ private List ServiceParameters { parameter.Add($"-name={this.Name}"); } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatHubNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatHubNames == Option.No) - { - parameter.Add("-formatNames=false"); - } return parameter; } } @@ -73,30 +49,6 @@ private List ModelParameters { parameter.Add($"-relativePath={this.RelativeModelPath}"); } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatModelNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatModelNames == Option.No) - { - parameter.Add("-formatNames=false"); - } return parameter; } } @@ -104,23 +56,15 @@ private List ModelParameters public string RelativePath { get; } public string RelativeModelPath { get; set; } public string Name { get; } - public Option PropertiesToFields { get; } - public Option FieldsToProperties { get; } - public Option FormatHubNames { get; } - public Option FormatModelNames { get; } public GenerateAngularHubAttribute() { } - public GenerateAngularHubAttribute(string relativeServicePath, string relativeModelPath, string name = null, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit, Option formatHubNames = Option.Inherit, Option formatModelNames = Option.Inherit) + public GenerateAngularHubAttribute(string relativeServicePath, string relativeModelPath, string name = null) { this.RelativePath = relativeServicePath; this.RelativeModelPath = relativeModelPath; this.Name = name; - this.PropertiesToFields = propertiesToFields; - this.FieldsToProperties = fieldsToProperties; - this.FormatHubNames = formatNames == Option.Inherit ? formatHubNames : formatNames; - this.FormatModelNames = formatNames == Option.Inherit ? formatModelNames : formatNames; } } -} \ No newline at end of file +} diff --git a/Annotations/Angular/GenerateAngularIndexAttribute.cs b/Annotations/Angular/GenerateAngularIndexAttribute.cs deleted file mode 100644 index d6010a8c..00000000 --- a/Annotations/Angular/GenerateAngularIndexAttribute.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator -{ - [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - public class GenerateAngularIndexAttribute : Attribute, IGeneratorCommandAttribute - { - public IEnumerable Commands - { - get { return new[] - { - new AttributeCommandConfiguration("reflection-read", "-namespace=$NAMESPACE$", "-name=$NAME$", "-skipSelf"), - new AttributeCommandConfiguration("angular-model", this.Parameters) - }; } - } - - private List Parameters - { - get - { - List parameter = new List(); - if (this.RelativePath != null) - { - parameter.Add($"-relativePath={this.RelativePath}"); - } - if (this.SkipNamespace == Option.Yes) - { - parameter.Add("-skipNamespace"); - } - else if (this.SkipNamespace == Option.No) - { - parameter.Add("-skipNamespace=false"); - } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatNames == Option.No) - { - parameter.Add("-formatNames=false"); - } - return parameter; - } - } - - public string RelativePath { get; } - public Option SkipNamespace { get; } - public Option PropertiesToFields { get; } - public Option FieldsToProperties { get; } - public Option FormatNames { get; } - - public GenerateAngularIndexAttribute(string relativePath = null, Option skipNamespace = Option.Inherit, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit) - { - this.RelativePath = relativePath; - this.SkipNamespace = skipNamespace; - this.PropertiesToFields = propertiesToFields; - this.FieldsToProperties = fieldsToProperties; - this.FormatNames = formatNames; - } - } -} \ No newline at end of file diff --git a/Annotations/Angular/GenerateAngularModelAttribute.cs b/Annotations/Angular/GenerateAngularModelAttribute.cs index 69d94f4e..dbef90e1 100644 --- a/Annotations/Angular/GenerateAngularModelAttribute.cs +++ b/Annotations/Angular/GenerateAngularModelAttribute.cs @@ -1,78 +1,27 @@ -using System; -using System.Collections.Generic; +namespace KY.Generator; -namespace KY.Generator +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] +public class GenerateAngularModelAttribute(string relativePath = "") + : Attribute, IGeneratorCommandAttribute { - [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - public class GenerateAngularModelAttribute : Attribute, IGeneratorCommandAttribute - { - public IEnumerable Commands - { - get { return new[] - { - new AttributeCommandConfiguration("reflection-read", "-namespace=$NAMESPACE$", "-name=$NAME$"), - new AttributeCommandConfiguration("angular-model", this.Parameters) - }; } - } + public string RelativePath { get; } = relativePath; - private List Parameters + public IEnumerable Commands => + [ + new("reflection-read", "-namespace=$NAMESPACE$", "-name=$NAME$"), + new("angular-model", this.Parameters) + ]; + + private List Parameters + { + get { - get + List parameter = []; + if (this.RelativePath != string.Empty) { - List parameter = new List(); - if (this.RelativePath != null) - { - parameter.Add($"-relativePath={this.RelativePath}"); - } - if (this.SkipNamespace == Option.Yes) - { - parameter.Add("-skipNamespace"); - } - else if (this.SkipNamespace == Option.No) - { - parameter.Add("-skipNamespace=false"); - } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatNames == Option.No) - { - parameter.Add("-formatNames=false"); - } - return parameter; + parameter.Add($"-relativePath={this.RelativePath}"); } - } - - public string RelativePath { get; } - public Option SkipNamespace { get; } - public Option PropertiesToFields { get; } - public Option FieldsToProperties { get; } - public Option FormatNames { get; } - - public GenerateAngularModelAttribute(string relativePath = null, Option skipNamespace = Option.Inherit, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit) - { - this.RelativePath = relativePath; - this.SkipNamespace = skipNamespace; - this.PropertiesToFields = propertiesToFields; - this.FieldsToProperties = fieldsToProperties; - this.FormatNames = formatNames; + return parameter; } } -} \ No newline at end of file +} diff --git a/Annotations/Angular/GenerateAngularServiceAttribute.cs b/Annotations/Angular/GenerateAngularServiceAttribute.cs index 24a9f731..2f0e1091 100644 --- a/Annotations/Angular/GenerateAngularServiceAttribute.cs +++ b/Annotations/Angular/GenerateAngularServiceAttribute.cs @@ -1,126 +1,69 @@ using System; using System.Collections.Generic; -namespace KY.Generator +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] +public class GenerateAngularServiceAttribute : Attribute, IGeneratorCommandAttribute { - [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - public class GenerateAngularServiceAttribute : Attribute, IGeneratorCommandAttribute + public IEnumerable Commands { - public IEnumerable Commands + get { - get - { - return new[] - { - new AttributeCommandConfiguration("asp-read-controller", "-namespace=$NAMESPACE$", "-name=$NAME$"), - new AttributeCommandConfiguration("angular-service", this.ServiceParameters), - new AttributeCommandConfiguration("angular-model", this.ModelParameters) - }; - } + return new[] + { + new AttributeCommandConfiguration("asp-read-controller", "-namespace=$NAMESPACE$", "-name=$NAME$"), + new AttributeCommandConfiguration("angular-model", this.ModelParameters), + new AttributeCommandConfiguration("angular-service", this.ServiceParameters) + }; } + } - private List ServiceParameters + private List ServiceParameters + { + get { - get + List parameter = []; + if (this.RelativePath != null) + { + parameter.Add($"-relativePath={this.RelativePath}"); + } + if (this.RelativeModelPath != null) { - List parameter = new List(); - if (this.RelativePath != null) - { - parameter.Add($"-relativePath={this.RelativePath}"); - } - if (this.RelativeModelPath != null) - { - parameter.Add($"-relativeModelPath={this.RelativeModelPath}"); - } - if (this.Name != null) - { - parameter.Add($"-name={this.Name}"); - } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatServiceNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatServiceNames == Option.No) - { - parameter.Add("-formatNames=false"); - } - return parameter; + parameter.Add($"-relativeModelPath={this.RelativeModelPath}"); } + if (this.Name != null) + { + parameter.Add($"-name={this.Name}"); + } + return parameter; } + } - private List ModelParameters + private List ModelParameters + { + get { - get + List parameter = []; + if (this.RelativePath != null) { - List parameter = new List(); - if (this.RelativePath != null) - { - parameter.Add($"-relativePath={this.RelativeModelPath}"); - } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatModelNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatModelNames == Option.No) - { - parameter.Add("-formatNames=false"); - } - return parameter; + parameter.Add($"-relativePath={this.RelativeModelPath}"); } + return parameter; } + } - public string RelativePath { get; } - public string RelativeModelPath { get; set; } - public string Name { get; } - public Option PropertiesToFields { get; } - public Option FieldsToProperties { get; } - public Option FormatServiceNames { get; } - public Option FormatModelNames { get; } + public string RelativePath { get; } + public string RelativeModelPath { get; set; } + public string Name { get; } - public GenerateAngularServiceAttribute() - { } + public GenerateAngularServiceAttribute() + { } - public GenerateAngularServiceAttribute(string relativeServicePath, string relativeModelPath, string name = null, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit, Option formatServiceNames = Option.Inherit, Option formatModelNames = Option.Inherit) - { - this.RelativePath = relativeServicePath; - this.RelativeModelPath = relativeModelPath; - this.Name = name; - this.PropertiesToFields = propertiesToFields; - this.FieldsToProperties = fieldsToProperties; - this.FormatServiceNames = formatNames == Option.Inherit ? formatServiceNames : formatNames; - this.FormatModelNames = formatNames == Option.Inherit ? formatModelNames : formatNames; - } + public GenerateAngularServiceAttribute(string relativeServicePath = null, string relativeModelPath = null, string name = null) + { + this.RelativePath = relativeServicePath; + this.RelativeModelPath = relativeModelPath; + this.Name = name; } -} \ No newline at end of file +} diff --git a/Annotations/Angular/GenerateServiceOutputAttribute.cs b/Annotations/Angular/GenerateServiceOutputAttribute.cs new file mode 100644 index 00000000..0e489917 --- /dev/null +++ b/Annotations/Angular/GenerateServiceOutputAttribute.cs @@ -0,0 +1,29 @@ +using System; +using System.Collections.Generic; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateServiceOutputAttribute(string relativePath) : Attribute, IGeneratorCommandAdditionalParameterAttribute +{ + public string RelativePath { get; } = relativePath; + + public IEnumerable Commands => + [ + new AttributeCommandConfiguration("angular-model", this.Parameters), + new AttributeCommandConfiguration("angular-service", this.Parameters) + ]; + + private List Parameters + { + get + { + List parameter = []; + if (this.RelativePath != null) + { + parameter.Add($"-relativePath={this.RelativePath}"); + } + return parameter; + } + } +} diff --git a/Annotations/Core/GenerateFieldsAsPropertiesAttribute.cs b/Annotations/Core/GenerateFieldsAsPropertiesAttribute.cs new file mode 100644 index 00000000..b38f2219 --- /dev/null +++ b/Annotations/Core/GenerateFieldsAsPropertiesAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace KY.Generator +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] + public class GenerateFieldsAsPropertiesAttribute : Attribute + { } +} diff --git a/Annotations/Core/GenerateFormatNamesAttribute.cs b/Annotations/Core/GenerateFormatNamesAttribute.cs new file mode 100644 index 00000000..0c435e22 --- /dev/null +++ b/Annotations/Core/GenerateFormatNamesAttribute.cs @@ -0,0 +1,15 @@ +using System; + +namespace KY.Generator +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] + public class GenerateFormatNamesAttribute : Attribute + { + public bool FormatNames { get; } + + public GenerateFormatNamesAttribute(bool formatNames = true) + { + this.FormatNames = formatNames; + } + } +} \ No newline at end of file diff --git a/Annotations/Core/GenerateModelOutputAttribute.cs b/Annotations/Core/GenerateModelOutputAttribute.cs new file mode 100644 index 00000000..186cfb45 --- /dev/null +++ b/Annotations/Core/GenerateModelOutputAttribute.cs @@ -0,0 +1,27 @@ +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateModelOutputAttribute(string relativePath) : Attribute, IGeneratorCommandAdditionalParameterAttribute +{ + public string RelativePath { get; } = relativePath; + + public IEnumerable Commands => + [ + new("angular-model", this.Parameters), + new("angular-service", this.Parameters), + new("reflection", this.Parameters) + ]; + + private List Parameters + { + get + { + List parameter = []; + if (!string.IsNullOrEmpty(this.RelativePath)) + { + parameter.Add($"-relativeModelPath={this.RelativePath}"); + } + return parameter; + } + } +} diff --git a/Annotations/Core/GenerateNoHeaderAttribute.cs b/Annotations/Core/GenerateNoHeaderAttribute.cs new file mode 100644 index 00000000..f2d4c317 --- /dev/null +++ b/Annotations/Core/GenerateNoHeaderAttribute.cs @@ -0,0 +1,7 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateNoHeaderAttribute : Attribute +{ } diff --git a/Annotations/Core/GenerateNoOptionalAttribute.cs b/Annotations/Core/GenerateNoOptionalAttribute.cs new file mode 100644 index 00000000..f3818da3 --- /dev/null +++ b/Annotations/Core/GenerateNoOptionalAttribute.cs @@ -0,0 +1,7 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateNoOptionalAttribute : Attribute +{ } diff --git a/Annotations/Core/GenerateOnlySubTypesAttribute.cs b/Annotations/Core/GenerateOnlySubTypesAttribute.cs new file mode 100644 index 00000000..11d34d26 --- /dev/null +++ b/Annotations/Core/GenerateOnlySubTypesAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace KY.Generator +{ + [AttributeUsage(AttributeTargets.Class, Inherited = false)] + public class GenerateOnlySubTypesAttribute : Attribute + { } +} diff --git a/Annotations/Core/GenerateOption.cs b/Annotations/Core/GenerateOption.cs deleted file mode 100644 index 90fc517e..00000000 --- a/Annotations/Core/GenerateOption.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator -{ - public static class GenerateOption - { - public const string SkipHeader = "-skipHeader"; - } -} \ No newline at end of file diff --git a/Annotations/Core/GenerateOptionAttribute.cs b/Annotations/Core/GenerateOptionAttribute.cs deleted file mode 100644 index e538c007..00000000 --- a/Annotations/Core/GenerateOptionAttribute.cs +++ /dev/null @@ -1,27 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator -{ - [AttributeUsage(AttributeTargets.Class)] - public class GenerateOptionAttribute : Attribute, IGeneratorCommandAdditionalParameterAttribute - { - private readonly string[] options; - - public IEnumerable Commands - { - get - { - return new[] - { - new AttributeCommandConfiguration("*", this.options) - }; - } - } - - public GenerateOptionAttribute(params string[] options) - { - this.options = options; - } - } -} \ No newline at end of file diff --git a/Annotations/Core/GeneratePreferInterfacesAttribute.cs b/Annotations/Core/GeneratePreferInterfacesAttribute.cs index 07544810..cadd0ddb 100644 --- a/Annotations/Core/GeneratePreferInterfacesAttribute.cs +++ b/Annotations/Core/GeneratePreferInterfacesAttribute.cs @@ -1,20 +1,13 @@ using System; using System.Collections.Generic; -namespace KY.Generator +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GeneratePreferInterfacesAttribute : Attribute, IGeneratorCommandAdditionalParameterAttribute { - [AttributeUsage(AttributeTargets.Class, Inherited = false)] - public class GeneratePreferInterfacesAttribute : Attribute, IGeneratorCommandAdditionalParameterAttribute - { - public IEnumerable Commands - { - get - { - return new[] - { - new AttributeCommandConfiguration("angular-model", "-prefer-interfaces") - }; - } - } - } + public IEnumerable Commands => + [ + new AttributeCommandConfiguration("angular-model", "-prefer-interfaces") + ]; } diff --git a/Annotations/Core/GeneratePropertiesAsFieldsAttribute.cs b/Annotations/Core/GeneratePropertiesAsFieldsAttribute.cs new file mode 100644 index 00000000..91b8e374 --- /dev/null +++ b/Annotations/Core/GeneratePropertiesAsFieldsAttribute.cs @@ -0,0 +1,9 @@ +using System; + +namespace KY.Generator +{ + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] + public class GeneratePropertiesAsFieldsAttribute : Attribute + { + } +} diff --git a/Annotations/Core/GenerateRenameAttribute.cs b/Annotations/Core/GenerateRenameAttribute.cs index 8809d7e5..f45fbcf6 100644 --- a/Annotations/Core/GenerateRenameAttribute.cs +++ b/Annotations/Core/GenerateRenameAttribute.cs @@ -1,36 +1,13 @@ using System; -using System.Collections.Generic; namespace KY.Generator { [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - public class GenerateRenameAttribute : Attribute, IGeneratorCommandAdditionalParameterAttribute + public class GenerateRenameAttribute : Attribute { public string Replace { get; } public string With { get; } - public IEnumerable Commands - { - get - { - return new[] - { - new AttributeCommandConfiguration("asp-read-controller", this.Parameters) - }; - } - } - - private List Parameters - { - get - { - List parameter = new List(); - parameter.Add($"-replace-name={this.Replace}"); - parameter.Add($"-replace-with-name={this.With}"); - return parameter; - } - } - public GenerateRenameAttribute(string replace, string with = null) { this.Replace = replace; diff --git a/Annotations/Core/GenerateReturnTypeAttribute.cs b/Annotations/Core/GenerateReturnTypeAttribute.cs new file mode 100644 index 00000000..d5090b3f --- /dev/null +++ b/Annotations/Core/GenerateReturnTypeAttribute.cs @@ -0,0 +1,33 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field, Inherited = false, AllowMultiple = true)] +public class GenerateReturnTypeAttribute : Attribute +{ + public string FileName { get; } + public Type Type { get; } + public string TypeName { get; set; } + public string OverrideName { get; set; } + + /// + /// Changes the return type + /// + public GenerateReturnTypeAttribute(Type type) + { + this.Type = type; + } + + /// + /// Changes the return type with an custom import + /// + /// Type used for the return of the property/method + /// File used for the using/import + /// Optional import type. Overrides the type on the using/import + public GenerateReturnTypeAttribute(string type, string fileName, string importType = null) + { + this.FileName = fileName; + this.TypeName = type; + this.OverrideName = importType; + } +} diff --git a/Annotations/Core/Option.cs b/Annotations/Core/Option.cs deleted file mode 100644 index 40165c78..00000000 --- a/Annotations/Core/Option.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KY.Generator -{ - public enum Option - { - Inherit, - Yes, - No - } -} \ No newline at end of file diff --git a/Annotations/Csharp/GenerateCsharpModelAttribute.cs b/Annotations/Csharp/GenerateCsharpModelAttribute.cs new file mode 100644 index 00000000..a05a0b3d --- /dev/null +++ b/Annotations/Csharp/GenerateCsharpModelAttribute.cs @@ -0,0 +1,37 @@ +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] +public class GenerateCsharpModelAttribute(string relativePath = "", bool onlySubTypes = false) + : Attribute, IGeneratorCommandAttribute +{ + public string RelativePath { get; } = relativePath; + public bool OnlySubTypes { get; } = onlySubTypes; + + public IEnumerable Commands => + [ + new("reflection", this.Parameters) + ]; + + private IEnumerable Parameters + { + get + { + List parameter = + [ + "-namespace=$NAMESPACE$", + "-name=$NAME$", + $"-language={OutputLanguage.Csharp}" + ]; + + if (this.RelativePath != string.Empty) + { + parameter.Add($"-relativePath={this.RelativePath}"); + } + if (this.OnlySubTypes) + { + parameter.Add("-onlySubTypes"); + } + return parameter; + } + } +} diff --git a/Annotations/KY.Generator.Annotations.csproj b/Annotations/KY.Generator.Annotations.csproj index ef9371d1..e63fdda8 100644 --- a/Annotations/KY.Generator.Annotations.csproj +++ b/Annotations/KY.Generator.Annotations.csproj @@ -1,28 +1,37 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - Annotations for KY-Generator - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator Annotations - KY.Generator - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + Annotations for KY-Generator + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator Annotations + KY.Generator + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + + + + + + diff --git a/Annotations/KY.Generator.Annotations.csproj.DotSettings b/Annotations/KY.Generator.Annotations.csproj.DotSettings index f6563b48..61d9014f 100644 --- a/Annotations/KY.Generator.Annotations.csproj.DotSettings +++ b/Annotations/KY.Generator.Annotations.csproj.DotSettings @@ -1,6 +1,7 @@  True True + True False True True diff --git a/Annotations/README.md b/Annotations/README.md new file mode 100644 index 00000000..83f126af --- /dev/null +++ b/Annotations/README.md @@ -0,0 +1,33 @@ +# KY.Generator.Annotations ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) + +[Documentation](https://generator.ky-programming.de) | [Getting Started](https://generator.ky-programming.de/start) | [Supported Platforms](https://generator.ky-programming.de/start/platforms) | [Need Help?](https://generator.ky-programming.de/start/help) + +## Generate via Attributes + +Annotations are attributes on classes, methods or properties. + +The annotations are found in the KY.Generator.Annotations package + +In example decorate an ASP.NET Core controller with an GenerateAngularService attribute to generate a full Angular service with all http request to your controller + +``` +using KY.Generator; +... + +namespace ServiceFromAspNetCoreAnnotation.Controllers +{ + [GenerateAngularService("\\ClientApp\\src\\app\\services", "\\ClientApp\\src\\app\\models")] + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + ... + } +} +``` + +## This is a library package! +This package does not contains any directly executable assemblies. You need at least the [KY.Generator](https://www.nuget.org/packages/KY.Generator/) ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) package + +## Read More +Continue reading with [Annotations Overview](https://generator.ky-programming.de/start/code/annotations) diff --git a/Annotations/Reflection/GenerateAttribute.cs b/Annotations/Reflection/GenerateAttribute.cs deleted file mode 100644 index 1907ee4c..00000000 --- a/Annotations/Reflection/GenerateAttribute.cs +++ /dev/null @@ -1,94 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator -{ - [AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] - public class GenerateAttribute : Attribute, IGeneratorCommandAttribute - { - public IEnumerable Commands - { - get { return new[] { new AttributeCommandConfiguration("reflection", this.Parameters) }; } - } - - private IEnumerable Parameters - { - get - { - List parameter = new List - { - "-namespace=$NAMESPACE$", - "-name=$NAME$" - }; - if (this.Language != OutputLanguage.Inherit) - { - parameter.Add($"-language={this.Language}"); - } - if (this.RelativePath != null) - { - parameter.Add($"-relativePath={this.RelativePath}"); - } - if (this.SkipNamespace == Option.Yes) - { - parameter.Add("-skipNamespace"); - } - else if (this.SkipNamespace == Option.No) - { - parameter.Add("-skipNamespace=false"); - } - if (this.PropertiesToFields == Option.Yes) - { - parameter.Add("-propertiesToFields"); - } - else if (this.PropertiesToFields == Option.No) - { - parameter.Add("-propertiesToFields=false"); - } - if (this.FieldsToProperties == Option.Yes) - { - parameter.Add("-fieldsToProperties"); - } - else if (this.FieldsToProperties == Option.No) - { - parameter.Add("-fieldsToProperties=false"); - } - if (this.FormatNames == Option.Yes) - { - parameter.Add("-formatNames"); - } - else if (this.FormatNames == Option.No) - { - parameter.Add("-formatNames=false"); - } - if (this.SkipSelf == Option.Yes) - { - parameter.Add("-skipSelf"); - } - else if (this.SkipSelf == Option.No) - { - parameter.Add("-skipSelf=false"); - } - return parameter; - } - } - - public OutputLanguage Language { get; } - public string RelativePath { get; } - public Option SkipNamespace { get; } - public Option PropertiesToFields { get; } - public Option FieldsToProperties { get; } - public Option FormatNames { get; } - public Option SkipSelf { get; } - - public GenerateAttribute(OutputLanguage language = OutputLanguage.Inherit, string relativePath = null, Option skipNamespace = Option.Inherit, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit, Option skipSelf = Option.Inherit) - { - this.Language = language; - this.RelativePath = relativePath; - this.SkipNamespace = skipNamespace; - this.PropertiesToFields = propertiesToFields; - this.FieldsToProperties = fieldsToProperties; - this.FormatNames = formatNames; - this.SkipSelf = skipSelf; - } - } -} \ No newline at end of file diff --git a/Annotations/Reflection/GenerateIgnoreAttribute.cs b/Annotations/Reflection/GenerateIgnoreAttribute.cs index 7f6c66cc..16079853 100644 --- a/Annotations/Reflection/GenerateIgnoreAttribute.cs +++ b/Annotations/Reflection/GenerateIgnoreAttribute.cs @@ -2,7 +2,7 @@ namespace KY.Generator { - [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, Inherited = false)] + [AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Field | AttributeTargets.Property | AttributeTargets.Method, Inherited = false)] public class GenerateIgnoreAttribute : Attribute { } -} \ No newline at end of file +} diff --git a/Annotations/Reflection/GenerateIndexAttribute.cs b/Annotations/Reflection/GenerateIndexAttribute.cs deleted file mode 100644 index ad7ac865..00000000 --- a/Annotations/Reflection/GenerateIndexAttribute.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace KY.Generator -{ - [AttributeUsage(AttributeTargets.Class, Inherited = false)] - public class GenerateIndexAttribute : GenerateAttribute - { - public GenerateIndexAttribute(OutputLanguage language = OutputLanguage.Inherit, string relativePath = null, Option skipNamespace = Option.Inherit, Option propertiesToFields = Option.Inherit, Option fieldsToProperties = Option.Inherit, Option formatNames = Option.Inherit) - : base(language, relativePath, skipNamespace, propertiesToFields, fieldsToProperties, formatNames, Option.Yes) - { - } - } -} \ No newline at end of file diff --git a/Annotations/TypeScript/GenerateForceIndexAttribute.cs b/Annotations/TypeScript/GenerateForceIndexAttribute.cs new file mode 100644 index 00000000..adab8ba2 --- /dev/null +++ b/Annotations/TypeScript/GenerateForceIndexAttribute.cs @@ -0,0 +1,8 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateForceIndexAttribute : Attribute +{ +} \ No newline at end of file diff --git a/Annotations/TypeScript/GenerateImportAttribute.cs b/Annotations/TypeScript/GenerateImportAttribute.cs new file mode 100644 index 00000000..ec0941f0 --- /dev/null +++ b/Annotations/TypeScript/GenerateImportAttribute.cs @@ -0,0 +1,18 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateImportAttribute : Attribute +{ + public Type Type { get; } + public string FileName { get; } + public string TypeName { get; } + + public GenerateImportAttribute(Type type, string fileName, string typeName) + { + this.Type = type; + this.FileName = fileName; + this.TypeName = typeName; + } +} diff --git a/Annotations/TypeScript/GenerateNoIndexAttribute.cs b/Annotations/TypeScript/GenerateNoIndexAttribute.cs new file mode 100644 index 00000000..d20430ce --- /dev/null +++ b/Annotations/TypeScript/GenerateNoIndexAttribute.cs @@ -0,0 +1,7 @@ +using System; + +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] +public class GenerateNoIndexAttribute : Attribute +{ } \ No newline at end of file diff --git a/Annotations/TypeScript/GenerateStrictAttribute.cs b/Annotations/TypeScript/GenerateStrictAttribute.cs index e3c9f6db..1dd29d13 100644 --- a/Annotations/TypeScript/GenerateStrictAttribute.cs +++ b/Annotations/TypeScript/GenerateStrictAttribute.cs @@ -4,12 +4,13 @@ namespace KY.Generator { [AttributeUsage(AttributeTargets.Class | AttributeTargets.Assembly, Inherited = false)] - public class GenerateStrictAttribute : Attribute, IGeneratorCommandAdditionalParameterAttribute + public class GenerateStrictAttribute : Attribute { - public IEnumerable Commands { get; } = new[] - { - new AttributeCommandConfiguration("angular-service", "-strict"), - new AttributeCommandConfiguration("angular-model", "-strict") - }; + public bool Strict { get; } + + public GenerateStrictAttribute(bool strict = true) + { + this.Strict = strict; + } } } diff --git a/Annotations/TypeScript/GenerateTypeScriptModelAttribute.cs b/Annotations/TypeScript/GenerateTypeScriptModelAttribute.cs new file mode 100644 index 00000000..5b9e3cc4 --- /dev/null +++ b/Annotations/TypeScript/GenerateTypeScriptModelAttribute.cs @@ -0,0 +1,32 @@ +namespace KY.Generator; + +[AttributeUsage(AttributeTargets.Class, Inherited = false, AllowMultiple = true)] +public class GenerateTypeScriptModelAttribute(string relativePath = "", bool onlySubTypes = false) + : Attribute, IGeneratorCommandAttribute +{ + public string RelativePath { get; } = relativePath; + public bool OnlySubTypes { get; } = onlySubTypes; + + public IEnumerable Commands => + [ + new("reflection-read", "-namespace=$NAMESPACE$", "-name=$NAME$"), + new("typescript-model", this.Parameters) + ]; + + private IEnumerable Parameters + { + get + { + List parameter = []; + if (this.RelativePath != string.Empty) + { + parameter.Add($"-relativePath={this.RelativePath}"); + } + if (this.OnlySubTypes) + { + parameter.Add("-onlySubTypes"); + } + return parameter; + } + } +} diff --git a/AspDotNet.Tests/FullStageTests.cs b/AspDotNet.Tests/FullStageTests.cs index 96116783..51646ce5 100644 --- a/AspDotNet.Tests/FullStageTests.cs +++ b/AspDotNet.Tests/FullStageTests.cs @@ -1,8 +1,6 @@ using System; -using System.Collections.Generic; using KY.Core.Dependency; using KY.Generator.AspDotNet.Tests.Properties; -using KY.Generator.Configuration; using KY.Generator.Csharp; using KY.Generator.Mappings; using KY.Generator.Output; @@ -21,7 +19,6 @@ public void Initialize() { this.resolver = new DependencyResolver(); this.resolver.Bind().ToSingleton(); - this.resolver.Bind().ToSingleton(); this.resolver.Create().Initialize(); this.resolver.Create().Initialize(); this.resolver.Create().Initialize(); diff --git a/AspDotNet.Tests/KY.Generator.AspDotNet.Tests.csproj b/AspDotNet.Tests/KY.Generator.AspDotNet.Tests.csproj index 25c66ca0..463fa503 100644 --- a/AspDotNet.Tests/KY.Generator.AspDotNet.Tests.csproj +++ b/AspDotNet.Tests/KY.Generator.AspDotNet.Tests.csproj @@ -1,13 +1,15 @@  - netcoreapp2.1 + net6.0 false + + latest - + @@ -15,7 +17,7 @@ - + diff --git a/AspDotNet.Tests/Properties/Resources.Designer.cs b/AspDotNet.Tests/Properties/Resources.Designer.cs index dd4a31a6..c1e21a7e 100644 --- a/AspDotNet.Tests/Properties/Resources.Designer.cs +++ b/AspDotNet.Tests/Properties/Resources.Designer.cs @@ -118,7 +118,7 @@ internal static string generator_controller_generator { ///using System.Linq; ///using System.Web.Http; ///using KY.Generator; - ///using KY.Generator.Output; + ///using KY.Generator.RelativePath; /// ///namespace KY.Generator.Test.Controllers ///{ @@ -144,7 +144,7 @@ internal static string GeneratorController_cs { ///using System.Collections.Generic; ///using System.Linq; ///using KY.Generator; - ///using KY.Generator.Output; + ///using KY.Generator.RelativePath; ///using Microsoft.AspNetCore.Mvc; /// ///namespace KY.Generator.Test.Controllers diff --git a/AspDotNet.Tests/more-tests.md b/AspDotNet.Tests/more-tests.md index 4839b31b..8f1057d8 100644 --- a/AspDotNet.Tests/more-tests.md +++ b/AspDotNet.Tests/more-tests.md @@ -1 +1 @@ -More ASP.NET tests are found in [KY.Generator.Angular.Tests](https://github.com/KY-Programming/generator/tree/master/Angular.Tests) \ No newline at end of file +More ASP.NET tests are found in [KY.Generator.Angular.Tests](https://github.com/KY-Programming/generator/tree/master/Angular.Tests) diff --git a/AspDotNet/AspDotNetModule.cs b/AspDotNet/AspDotNetModule.cs index 6a56a350..e23dbd88 100644 --- a/AspDotNet/AspDotNetModule.cs +++ b/AspDotNet/AspDotNetModule.cs @@ -1,29 +1,17 @@ using KY.Core.Dependency; using KY.Core.Module; using KY.Generator.AspDotNet.Commands; -using KY.Generator.AspDotNet.Configurations; -using KY.Generator.AspDotNet.Readers; -using KY.Generator.AspDotNet.Writers; using KY.Generator.Command; -using KY.Generator.Configuration; -namespace KY.Generator.AspDotNet +namespace KY.Generator.AspDotNet; + +public class AspDotNetModule : ModuleBase { - public class AspDotNetModule : ModuleBase + public AspDotNetModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public AspDotNetModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - } - - public override void Initialize() - { - this.DependencyResolver.Get() - .Map("asp") - .Map("asp") - .Map("asp-core"); - } + this.DependencyResolver.Get().Register(AspDotNetReadControllerCommand.Names); + this.DependencyResolver.Get().Register(AspDotNetReadHubCommand.Names); + this.DependencyResolver.Bind().ToSingleton(); } } \ No newline at end of file diff --git a/AspDotNet/Commands/AspDotNetReadControllerCommand.cs b/AspDotNet/Commands/AspDotNetReadControllerCommand.cs index df3cdca3..8ecfb732 100644 --- a/AspDotNet/Commands/AspDotNetReadControllerCommand.cs +++ b/AspDotNet/Commands/AspDotNetReadControllerCommand.cs @@ -2,33 +2,33 @@ using KY.Generator.AspDotNet.Configurations; using KY.Generator.AspDotNet.Readers; using KY.Generator.Command; -using KY.Generator.Output; +using KY.Generator.Command.Extensions; -namespace KY.Generator.AspDotNet.Commands +namespace KY.Generator.AspDotNet.Commands; + +internal class AspDotNetReadControllerCommand : GeneratorCommand { - internal class AspDotNetReadControllerCommand : GeneratorCommand + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(AspDotNetReadControllerCommand)), "asp-read-controller"]; + + public AspDotNetReadControllerCommand(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "asp-read-controller" }; + this.resolver = resolver; + } - public AspDotNetReadControllerCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public override IGeneratorCommandResult Run() + { + Options options = this.resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); - public override IGeneratorCommandResult Run(IOutput output) - { - AspDotNetReadConfiguration readConfiguration = new AspDotNetReadConfiguration(); - readConfiguration.AddHeader = !this.Parameters.SkipHeader; - readConfiguration.Controller = new AspDotNetReadControllerConfiguration(); - readConfiguration.Controller.Namespace = this.Parameters.Namespace; - readConfiguration.Controller.Name = this.Parameters.Name; - readConfiguration.Controller.ReplaceName = this.Parameters.ReplaceName; - readConfiguration.Controller.ReplaceWithName = this.Parameters.ReplaceWithName; + AspDotNetReadConfiguration readConfiguration = new(); + readConfiguration.Controller = new AspDotNetReadControllerConfiguration(); + readConfiguration.Controller.Namespace = this.Parameters.Namespace; + readConfiguration.Controller.Name = this.Parameters.Name; - this.resolver.Create().Read(readConfiguration, this.TransferObjects); + this.resolver.Create().Read(readConfiguration); - return this.Success(); - } + return this.Success(); } } diff --git a/AspDotNet/Commands/AspDotNetReadControllerCommandParameters.cs b/AspDotNet/Commands/AspDotNetReadControllerCommandParameters.cs index 854400ef..9b2702df 100644 --- a/AspDotNet/Commands/AspDotNetReadControllerCommandParameters.cs +++ b/AspDotNet/Commands/AspDotNetReadControllerCommandParameters.cs @@ -1,5 +1,4 @@ -using System.Collections.Generic; -using KY.Generator.Command; +using KY.Generator.Command; namespace KY.Generator.AspDotNet.Commands { @@ -7,7 +6,5 @@ internal class AspDotNetReadControllerCommandParameters : GeneratorCommandParame { public string Namespace { get; set; } public string Name { get; set; } - public List ReplaceName { get; } = new(); - public List ReplaceWithName { get; } = new(); } } diff --git a/AspDotNet/Commands/AspDotNetReadHubCommand.cs b/AspDotNet/Commands/AspDotNetReadHubCommand.cs index 4f7224fd..cfd06c34 100644 --- a/AspDotNet/Commands/AspDotNetReadHubCommand.cs +++ b/AspDotNet/Commands/AspDotNetReadHubCommand.cs @@ -2,31 +2,33 @@ using KY.Generator.AspDotNet.Configurations; using KY.Generator.AspDotNet.Readers; using KY.Generator.Command; -using KY.Generator.Output; +using KY.Generator.Command.Extensions; -namespace KY.Generator.AspDotNet.Commands +namespace KY.Generator.AspDotNet.Commands; + +internal class AspDotNetReadHubCommand : GeneratorCommand { - internal class AspDotNetReadHubCommand : GeneratorCommand + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(AspDotNetReadHubCommand)), "asp-read-hub"]; + + public AspDotNetReadHubCommand(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "asp-read-hub" }; + this.resolver = resolver; + } - public AspDotNetReadHubCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public override IGeneratorCommandResult Run() + { + Options options = this.resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); - public override IGeneratorCommandResult Run(IOutput output) - { - AspDotNetReadConfiguration readConfiguration = new AspDotNetReadConfiguration(); - readConfiguration.AddHeader = !this.Parameters.SkipHeader; - readConfiguration.Hub = new AspDotNetReadHubConfiguration(); - readConfiguration.Hub.Namespace = this.Parameters.Namespace; - readConfiguration.Hub.Name = this.Parameters.Name; + AspDotNetReadConfiguration readConfiguration = new(); + readConfiguration.Hub = new AspDotNetReadHubConfiguration(); + readConfiguration.Hub.Namespace = this.Parameters.Namespace; + readConfiguration.Hub.Name = this.Parameters.Name; - this.resolver.Create().Read(readConfiguration, this.TransferObjects); + this.resolver.Create().Read(readConfiguration); - return this.Success(); - } + return this.Success(); } -} \ No newline at end of file +} diff --git a/AspDotNet/Configurations/AspDotNetReadConfiguration.cs b/AspDotNet/Configurations/AspDotNetReadConfiguration.cs index 3f237460..dcd4b79f 100644 --- a/AspDotNet/Configurations/AspDotNetReadConfiguration.cs +++ b/AspDotNet/Configurations/AspDotNetReadConfiguration.cs @@ -1,10 +1,8 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.AspDotNet.Configurations +namespace KY.Generator.AspDotNet.Configurations { - public class AspDotNetReadConfiguration : ReadConfigurationBase + public class AspDotNetReadConfiguration { public AspDotNetReadControllerConfiguration Controller { get; set; } public AspDotNetReadHubConfiguration Hub { get; set; } } -} \ No newline at end of file +} diff --git a/AspDotNet/Configurations/AspDotNetReadControllerConfiguration.cs b/AspDotNet/Configurations/AspDotNetReadControllerConfiguration.cs index 1a31b154..3752adab 100644 --- a/AspDotNet/Configurations/AspDotNetReadControllerConfiguration.cs +++ b/AspDotNet/Configurations/AspDotNetReadControllerConfiguration.cs @@ -1,14 +1,9 @@ -using System.Collections.Generic; -using KY.Generator.Transfer.Extensions; - -namespace KY.Generator.AspDotNet.Configurations +namespace KY.Generator.AspDotNet.Configurations { - public class AspDotNetReadControllerConfiguration : IFromTypeOptions + public class AspDotNetReadControllerConfiguration { public string Name { get; set; } public string Namespace { get; set; } public string Assembly { get; set; } - public List ReplaceName { get; set; } - public List ReplaceWithName { get; set; } } } diff --git a/AspDotNet/Configurations/AspDotNetReadHubConfiguration.cs b/AspDotNet/Configurations/AspDotNetReadHubConfiguration.cs index f4f5bd95..e451636f 100644 --- a/AspDotNet/Configurations/AspDotNetReadHubConfiguration.cs +++ b/AspDotNet/Configurations/AspDotNetReadHubConfiguration.cs @@ -1,14 +1,9 @@ -using System.Collections.Generic; -using KY.Generator.Transfer.Extensions; - -namespace KY.Generator.AspDotNet.Configurations +namespace KY.Generator.AspDotNet.Configurations { - public class AspDotNetReadHubConfiguration : IFromTypeOptions + public class AspDotNetReadHubConfiguration { public string Name { get; set; } public string Namespace { get; set; } public string Assembly { get; set; } - public List ReplaceName { get; set; } - public List ReplaceWithName { get; set; } } } diff --git a/AspDotNet/Configurations/AspDotNetWriteConfiguration.cs b/AspDotNet/Configurations/AspDotNetWriteConfiguration.cs index 29a6cb8d..c68ee82b 100644 --- a/AspDotNet/Configurations/AspDotNetWriteConfiguration.cs +++ b/AspDotNet/Configurations/AspDotNetWriteConfiguration.cs @@ -1,16 +1,12 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using KY.Generator.AspDotNet.Templates; -using KY.Generator.Configurations; -using KY.Generator.Csharp.Languages; namespace KY.Generator.AspDotNet.Configurations { - public class AspDotNetWriteConfiguration : ConfigurationBase, IFormattableConfiguration + public class AspDotNetWriteConfiguration { public string Namespace { get; set; } public string RelativePath { get; set; } - public bool FormatNames { get; set; } public AspDotNetGeneratorControllerConfiguration GeneratorController { get; set; } public List Controllers { get; set; } public List Usings { get; set; } @@ -18,8 +14,7 @@ public class AspDotNetWriteConfiguration : ConfigurationBase, IFormattableConfig public AspDotNetWriteConfiguration() { - this.Language = CsharpLanguage.Instance; - this.FormatNames = true; + // this.Language = CsharpLanguage.Instance; this.Controllers = new List(); this.Usings = new List(); this.Template = new DotNetFrameworkTemplate(); diff --git a/AspDotNet/Fluent/AspDotNetControllerSyntax.cs b/AspDotNet/Fluent/AspDotNetControllerSyntax.cs deleted file mode 100644 index e432e6f4..00000000 --- a/AspDotNet/Fluent/AspDotNetControllerSyntax.cs +++ /dev/null @@ -1,32 +0,0 @@ -using KY.Generator.AspDotNet.Commands; -using KY.Generator.Syntax; - -namespace KY.Generator.AspDotNet.Fluent -{ - internal class AspDotNetControllerSyntax : IAspDotNetControllerOrReadSyntax - { - private readonly AspDotNetReadSyntax syntax; - private readonly AspDotNetReadControllerCommand command; - - public AspDotNetControllerSyntax(AspDotNetReadSyntax syntax, AspDotNetReadControllerCommand command) - { - this.syntax = syntax; - this.command = command; - } - - public IAspDotNetControllerOrReadSyntax FromController() - { - return this.syntax.FromController(); - } - - public IAspDotNetHubOrReadSyntax FromHub() - { - return this.syntax.FromHub(); - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); - } - } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/AspDotNetHubSyntax.cs b/AspDotNet/Fluent/AspDotNetHubSyntax.cs deleted file mode 100644 index d66b4640..00000000 --- a/AspDotNet/Fluent/AspDotNetHubSyntax.cs +++ /dev/null @@ -1,32 +0,0 @@ -using KY.Generator.AspDotNet.Commands; -using KY.Generator.Syntax; - -namespace KY.Generator.AspDotNet.Fluent -{ - internal class AspDotNetHubSyntax : IAspDotNetHubOrReadSyntax - { - private readonly AspDotNetReadSyntax syntax; - private readonly AspDotNetReadHubCommand command; - - public AspDotNetHubSyntax(AspDotNetReadSyntax syntax, AspDotNetReadHubCommand command) - { - this.syntax = syntax; - this.command = command; - } - - public IAspDotNetControllerOrReadSyntax FromController() - { - return this.syntax.FromController(); - } - - public IAspDotNetHubOrReadSyntax FromHub() - { - return this.syntax.FromHub(); - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); - } - } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/AspDotNetReadSyntax.cs b/AspDotNet/Fluent/AspDotNetReadSyntax.cs index dba322e1..7ac066e7 100644 --- a/AspDotNet/Fluent/AspDotNetReadSyntax.cs +++ b/AspDotNet/Fluent/AspDotNetReadSyntax.cs @@ -1,43 +1,43 @@ using System; +using System.Collections.Generic; +using KY.Core.Dependency; using KY.Generator.AspDotNet.Commands; +using KY.Generator.Command; using KY.Generator.Syntax; namespace KY.Generator.AspDotNet.Fluent { - internal class AspDotNetReadSyntax : IAspDotNetReadSyntax + internal class AspDotNetReadSyntax : IAspDotNetReadSyntax, IExecutableSyntax { - private readonly IReadFluentSyntaxInternal syntax; + private readonly IDependencyResolver resolver; - public AspDotNetReadSyntax(IReadFluentSyntaxInternal syntax) + public List Commands { get; } = new(); + + public AspDotNetReadSyntax(IDependencyResolver resolver) { - this.syntax = syntax; + this.resolver = resolver; } - public IAspDotNetControllerOrReadSyntax FromController() + public IAspDotNetReadSyntax FromController() { Type type = typeof(T); - AspDotNetReadControllerCommand command = new AspDotNetReadControllerCommand(this.syntax.Resolver); + AspDotNetReadControllerCommand command = this.resolver.Create(); command.Parameters.Assembly = type.Assembly.Location; command.Parameters.Namespace = type.Namespace; command.Parameters.Name = type.Name; - this.syntax.Commands.Add(command); - return new AspDotNetControllerSyntax(this, command); + this.Commands.Add(command); + return this; } - public IAspDotNetHubOrReadSyntax FromHub() + public IAspDotNetReadSyntax FromHub() { Type type = typeof(T); - AspDotNetReadHubCommand command = new AspDotNetReadHubCommand(this.syntax.Resolver); + AspDotNetReadHubCommand command = this.resolver.Create(); command.Parameters.Assembly = type.Assembly.Location; command.Parameters.Namespace = type.Namespace; command.Parameters.Name = type.Name; - this.syntax.Commands.Add(command); - return new AspDotNetHubSyntax(this, command); - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); + this.Commands.Add(command); + return this; } } -} \ No newline at end of file +} diff --git a/AspDotNet/Fluent/Extensions/ReadFluentSyntaxExtension.cs b/AspDotNet/Fluent/Extensions/ReadFluentSyntaxExtension.cs new file mode 100644 index 00000000..b0338a4f --- /dev/null +++ b/AspDotNet/Fluent/Extensions/ReadFluentSyntaxExtension.cs @@ -0,0 +1,24 @@ +using System; +using KY.Core; +using KY.Generator.AspDotNet.Fluent; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace : Easier usage on lower namespace +namespace KY.Generator +{ + public static class ReadFluentSyntaxExtension + { + /// + /// Executes the ASP.NET read commands. Use at least one command! + /// + public static IReadFluentSyntax AspDotNet(this IReadFluentSyntax syntax, Action action) + { + IReadFluentSyntaxInternal internalSyntax = (IReadFluentSyntaxInternal)syntax; + AspDotNetReadSyntax readSyntax = internalSyntax.Resolver.Create(); + internalSyntax.Syntaxes.Add(readSyntax); + action(readSyntax); + readSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(AspDotNet)} action requires at least one command. E.g. '.{nameof(AspDotNet)}(read => read.{nameof(IAspDotNetReadSyntax.FromController)}())'"); + return internalSyntax; + } + } +} diff --git a/AspDotNet/Fluent/IAspDotNetControllerOrReadSyntax.cs b/AspDotNet/Fluent/IAspDotNetControllerOrReadSyntax.cs deleted file mode 100644 index 53cf0c9c..00000000 --- a/AspDotNet/Fluent/IAspDotNetControllerOrReadSyntax.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace KY.Generator.AspDotNet.Fluent -{ - public interface IAspDotNetControllerOrReadSyntax : IAspDotNetControllerSyntax, IAspDotNetReadSyntax - { } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/IAspDotNetControllerSyntax.cs b/AspDotNet/Fluent/IAspDotNetControllerSyntax.cs deleted file mode 100644 index 10935128..00000000 --- a/AspDotNet/Fluent/IAspDotNetControllerSyntax.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace KY.Generator.AspDotNet.Fluent -{ - public interface IAspDotNetControllerSyntax - { } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/IAspDotNetHubOrReadSyntax.cs b/AspDotNet/Fluent/IAspDotNetHubOrReadSyntax.cs deleted file mode 100644 index 0b804977..00000000 --- a/AspDotNet/Fluent/IAspDotNetHubOrReadSyntax.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace KY.Generator.AspDotNet.Fluent -{ - public interface IAspDotNetHubOrReadSyntax : IAspDotNetHubSyntax, IAspDotNetReadSyntax - { } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/IAspDotNetHubSyntax.cs b/AspDotNet/Fluent/IAspDotNetHubSyntax.cs deleted file mode 100644 index a4e3ec8d..00000000 --- a/AspDotNet/Fluent/IAspDotNetHubSyntax.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace KY.Generator.AspDotNet.Fluent -{ - public interface IAspDotNetHubSyntax - { } -} \ No newline at end of file diff --git a/AspDotNet/Fluent/IAspDotNetReadSyntax.cs b/AspDotNet/Fluent/IAspDotNetReadSyntax.cs index 882ec02a..577e9f39 100644 --- a/AspDotNet/Fluent/IAspDotNetReadSyntax.cs +++ b/AspDotNet/Fluent/IAspDotNetReadSyntax.cs @@ -1,39 +1,36 @@ -using KY.Generator.Syntax; +namespace KY.Generator.AspDotNet.Fluent; -namespace KY.Generator.AspDotNet.Fluent +public interface IAspDotNetReadSyntax { - public interface IAspDotNetReadSyntax : ISwitchToWriteSyntax - { - /// - /// Read all metadata from this controller and provide it to the following write actions. - /// This method does not generate anything. You need at least on write action. Use .Write() method. - /// - /// - /// - /// this.Read() - /// .FromController<MyTestController>() - /// .Write() - /// .AngularModels().OutputPath("Output/Models").SkipHeader() - /// .AngularServices().OutputPath("Output/Services").SkipHeader(); - /// - /// - /// Type which should be generated - IAspDotNetControllerOrReadSyntax FromController(); + /// + /// Read all metadata from this controller and provide it to the following write actions. + /// This method does not generate anything. You need at least on write action. Use .Write() method. + /// + /// + /// + /// this.Read() + /// .FromController<MyTestController>() + /// .Write() + /// .AngularModels().OutputPath("RelativePath/Models").NoHeader() + /// .AngularServices().OutputPath("RelativePath/Services").NoHeader(); + /// + /// + /// Type which should be generated + IAspDotNetReadSyntax FromController(); - /// - /// Read all metadata from this SignalR hub and provide it to the following write actions. - /// This method does not generate anything. You need at least on write action. Use .Write() method. - /// - /// - /// - /// this.Read() - /// .FromHub<MyTestHub>() - /// .Write() - /// .AngularModels().OutputPath("Output/Models").SkipHeader() - /// .AngularServices().OutputPath("Output/Services").SkipHeader(); - /// - /// - /// Type which should be generated - IAspDotNetHubOrReadSyntax FromHub(); - } + /// + /// Read all metadata from this SignalR hub and provide it to the following write actions. + /// This method does not generate anything. You need at least on write action. Use .Write() method. + /// + /// + /// + /// this.Read() + /// .FromHub<MyTestHub>() + /// .Write() + /// .AngularModels().OutputPath("RelativePath/Models").NoHeader() + /// .AngularServices().OutputPath("RelativePath/Services").NoHeader(); + /// + /// + /// Type which should be generated + IAspDotNetReadSyntax FromHub(); } \ No newline at end of file diff --git a/AspDotNet/Fluent/ReadFluentSyntaxExtension.cs b/AspDotNet/Fluent/ReadFluentSyntaxExtension.cs deleted file mode 100644 index 4156e40e..00000000 --- a/AspDotNet/Fluent/ReadFluentSyntaxExtension.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using KY.Generator.AspDotNet.Fluent; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace : Easier usage on lower namespace -namespace KY.Generator -{ - public static class ReadFluentSyntaxExtension - { - public static IReadFluentOrSwitchToWriteSyntax AspDotNet(this IReadFluentSyntax syntax, Action action) - { - action(new AspDotNetReadSyntax((IReadFluentSyntaxInternal)syntax)); - return (IReadFluentSyntaxInternal)syntax; - } - } -} \ No newline at end of file diff --git a/AspDotNet/KY.Generator.AspDotNet.csproj b/AspDotNet/KY.Generator.AspDotNet.csproj index 60096064..de4e8a45 100644 --- a/AspDotNet/KY.Generator.AspDotNet.csproj +++ b/AspDotNet/KY.Generator.AspDotNet.csproj @@ -1,40 +1,49 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - ASP.net Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator ASP.net - latest - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + ASP.net Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator ASP.net + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - ..\bin\Release\KY.Generator.AspDotNet.xml - 1701;1702;1591 - + + ..\bin\Release + ..\bin\Release\KY.Generator.AspDotNet.xml + 1701;1702;1591 + - - - + + + - - - - - + + + + + + + + + + diff --git a/AspDotNet/KY.Generator.AspDotNet.csproj.DotSettings b/AspDotNet/KY.Generator.AspDotNet.csproj.DotSettings new file mode 100644 index 00000000..3dde2437 --- /dev/null +++ b/AspDotNet/KY.Generator.AspDotNet.csproj.DotSettings @@ -0,0 +1,3 @@ + + True + True \ No newline at end of file diff --git a/AspDotNet/Options/AspDotNetOptions.cs b/AspDotNet/Options/AspDotNetOptions.cs new file mode 100644 index 00000000..9ba6bd52 --- /dev/null +++ b/AspDotNet/Options/AspDotNetOptions.cs @@ -0,0 +1,150 @@ +namespace KY.Generator.AspDotNet; + +public class AspDotNetOptions(AspDotNetOptions? parent, AspDotNetOptions? global, object? target = null) + : OptionsBase(parent, global, target) +{ + private bool? httpGet; + private string? httpGetRoute; + private bool? httpPost; + private string? httpPostRoute; + private bool? httpPatch; + private string? httpPatchRoute; + private bool? httpPut; + private string? httpPutRoute; + private bool? httpDelete; + private string? httpDeleteRoute; + private bool? isNonAction; + private bool? isFromServices; + private bool? isFromHeader; + private bool? isFromBody; + private bool? isFromQuery; + private List? apiVersion; + private string? route; + private Type? produces; + private List? ignoreGenerics; + private bool? fixCasingWithMapping; + + public bool HttpGet + { + get => this.GetOwnValue(x => x.httpGet); + set => this.httpGet = value; + } + + public string? HttpGetRoute + { + get => this.GetOwnValue(x => x.httpGetRoute); + set => this.httpGetRoute = value; + } + + public bool HttpPost + { + get => this.GetOwnValue(x => x.httpPost); + set => this.httpPost = value; + } + + public string? HttpPostRoute + { + get => this.GetOwnValue(x => x.httpPostRoute); + set => this.httpPostRoute = value; + } + + public bool HttpPatch + { + get => this.GetOwnValue(x => x.httpPatch); + set => this.httpPatch = value; + } + + public string? HttpPatchRoute + { + get => this.GetOwnValue(x => x.httpPatchRoute); + set => this.httpPatchRoute = value; + } + + public bool HttpPut + { + get => this.GetOwnValue(x => x.httpPut); + set => this.httpPut = value; + } + + public string? HttpPutRoute + { + get => this.GetOwnValue(x => x.httpPutRoute); + set => this.httpPutRoute = value; + } + + public bool HttpDelete + { + get => this.GetOwnValue(x => x.httpDelete); + set => this.httpDelete = value; + } + + public string? HttpDeleteRoute + { + get => this.GetOwnValue(x => x.httpDeleteRoute); + set => this.httpDeleteRoute = value; + } + + public bool IsNonAction + { + get => this.GetOwnValue(x => x.isNonAction); + set => this.isNonAction = value; + } + + public bool IsFromServices + { + get => this.GetOwnValue(x => x.isFromServices); + set => this.isFromServices = value; + } + + public bool IsFromHeader + { + get => this.GetOwnValue(x => x.isFromHeader); + set => this.isFromHeader = value; + } + + public bool IsFromBody + { + get => this.GetOwnValue(x => x.isFromBody); + set => this.isFromBody = value; + } + + public bool IsFromQuery + { + get => this.GetOwnValue(x => x.isFromQuery); + set => this.isFromQuery = value; + } + + public IReadOnlyList ApiVersion => this.GetList(x => x.apiVersion); + + public string? Route + { + get => this.GetOwnValue(x => x.route); + set => this.route = value; + } + + public Type? Produces + { + get => this.GetOwnValue(x => x.produces); + set => this.produces = value; + } + + public IReadOnlyList IgnoreGenerics => this.GetList(x => x.ignoreGenerics); + + public bool FixCasingWithMapping + { + get => this.GetValue(x => x.fixCasingWithMapping); + set => this.fixCasingWithMapping = value; + } + + public void AddToApiVersion(params IEnumerable versions) + { + this.apiVersion ??= []; + this.apiVersion.AddRange(versions); + } + + public void AddToIgnoreGenerics(params IEnumerable types) + { + this.ignoreGenerics ??= []; + this.ignoreGenerics.AddRange(types); + } +} diff --git a/AspDotNet/Options/AspDotNetOptionsFactory.cs b/AspDotNet/Options/AspDotNetOptionsFactory.cs new file mode 100644 index 00000000..a65da4a6 --- /dev/null +++ b/AspDotNet/Options/AspDotNetOptionsFactory.cs @@ -0,0 +1,117 @@ +using System.Collections; +using System.Reflection; +using KY.Core; + +namespace KY.Generator.AspDotNet; + +public class AspDotNetOptionsFactory : IOptionsFactory +{ + public bool CanCreate(Type optionsType) + { + return optionsType == typeof(AspDotNetOptions); + } + + public object Create(Type optionsType, object key, object? parent, object global) + { + return new AspDotNetOptions(parent as AspDotNetOptions, global as AspDotNetOptions, key); + } + + public object CreateGlobal(Type optionsType, object key, object? parent) + { + return key switch + { + Assembly assembly => this.CreateFromCustomAttributes(assembly.GetCustomAttributes(), key, parent as AspDotNetOptions), + MemberInfo member => this.CreateFromCustomAttributes(member.GetCustomAttributes(), key, parent as AspDotNetOptions), + ParameterInfo parameter => this.CreateFromCustomAttributes(parameter.GetCustomAttributes(), key, parent as AspDotNetOptions), + Options.GlobalKey => new AspDotNetOptions(parent as AspDotNetOptions, null, "global"), + _ => new AspDotNetOptions(parent as AspDotNetOptions, null, key) + // _ => throw new InvalidOperationException($"Could not create {nameof(AspDotNetOptions)} {key.GetType()}") + }; + } + + private AspDotNetOptions CreateFromCustomAttributes(IEnumerable customAttributes, object key, AspDotNetOptions? parent) + { + AspDotNetOptions options = new(parent, null, key); + foreach (Attribute attribute in customAttributes) + { + switch (attribute.GetType().Name) + { + case "HttpGetAttribute": + options.HttpGet = true; + options.HttpGetRoute = GetRoute(attribute); + break; + case "HttpPostAttribute": + options.HttpPost = true; + options.HttpPostRoute = GetRoute(attribute); + break; + case "HttpPatchAttribute": + options.HttpPatch = true; + options.HttpPatchRoute = GetRoute(attribute); + break; + case "HttpPutAttribute": + options.HttpPut = true; + options.HttpPutRoute = GetRoute(attribute); + break; + case "HttpDeleteAttribute": + options.HttpDelete = true; + options.HttpDeleteRoute = GetRoute(attribute); + break; + case "NonActionAttribute": + options.IsNonAction = true; + break; + case "FromServicesAttribute": + options.IsFromServices = true; + break; + case "FromHeaderAttribute": + options.IsFromHeader = true; + break; + case "FromBodyAttribute": + options.IsFromBody = true; + break; + case "FromQueryAttribute": + options.IsFromQuery = true; + break; + case "ApiVersionAttribute": + options.AddToApiVersion( + attribute.GetType().GetProperty("Versions")? + .GetValue(attribute)?.CastSafeTo().OfType() + .Select(x => x.ToString()).OrderBy(x => x) + ); + break; + case "RouteAttribute": + options.Route = GetRoute(attribute); + break; + case "ProducesResponseTypeAttribute": + case "ProducesAttribute": + options.Produces = GetProduces(attribute) ?? options.Produces; + break; + } + switch (attribute) + { + case GenerateIgnoreGenericAttribute ignoreGenericAttribute: + options.AddToIgnoreGenerics(ignoreGenericAttribute.Type); + break; + case GenerateFixCasingWithMappingAttribute: + options.FixCasingWithMapping = true; + break; + } + } + return options; + } + + private static string GetRoute(object attribute) + { + return attribute.GetType().GetProperty("Template")?.GetValue(attribute)?.ToString(); + } + + private static Type GetProduces(object attribute) + { + Type type = attribute.GetType(); + int? statusCode = (int?)type.GetProperty("StatusCode")?.GetMethod.Invoke(attribute, null); + if (statusCode == 200) + { + return (Type)type.GetProperty("Type")?.GetMethod.Invoke(attribute, null); + } + return null; + } +} diff --git a/AspDotNet/Readers/AspDotNetControllerReader.cs b/AspDotNet/Readers/AspDotNetControllerReader.cs index 905508ba..9a49ec6c 100644 --- a/AspDotNet/Readers/AspDotNetControllerReader.cs +++ b/AspDotNet/Readers/AspDotNetControllerReader.cs @@ -1,8 +1,4 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; +using System.Reflection; using System.Text.RegularExpressions; using KY.Core; using KY.Generator.AspDotNet.Configurations; @@ -10,253 +6,208 @@ using KY.Generator.Reflection.Language; using KY.Generator.Reflection.Readers; using KY.Generator.Transfer; -using KY.Generator.Transfer.Extensions; -namespace KY.Generator.AspDotNet.Readers +namespace KY.Generator.AspDotNet.Readers; + +public class AspDotNetControllerReader { - public class AspDotNetControllerReader + private readonly ReflectionModelReader modelReader; + private readonly Options options; + private readonly List transferObjects; + + public AspDotNetControllerReader(ReflectionModelReader modelReader, Options options, List transferObjects) { - private readonly ReflectionModelReader modelReader; + this.modelReader = modelReader; + this.options = options; + this.transferObjects = transferObjects; + } - public AspDotNetControllerReader(ReflectionModelReader modelReader) + public virtual void Read(AspDotNetReadConfiguration configuration) + { + configuration.Controller.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}"); + configuration.Controller.Name.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}.{nameof(configuration.Controller.Name)}"); + configuration.Controller.Namespace.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}.{nameof(configuration.Controller.Namespace)}"); + Logger.Trace($"Read ASP.NET controller {configuration.Controller.Namespace}.{configuration.Controller.Name}..."); + Type? type = GeneratorTypeLoader.Get(configuration.Controller.Assembly, configuration.Controller.Namespace, configuration.Controller.Name); + if (type == null) { - this.modelReader = modelReader; + return; } - public virtual void Read(AspDotNetReadConfiguration configuration, List transferObjects) + HttpServiceTransferObject controller = new(); + controller.Name = type.Name; + controller.Language = ReflectionLanguage.Instance; + + AspDotNetOptions typeAspOptions = this.options.Get(type); + controller.Route = typeAspOptions.Route; + controller.Version = typeAspOptions.ApiVersion?.LastOrDefault(); + this.options.Map(controller, () => this.options.Get(type, null)); + + List methods = []; + Type currentTyp = type; + while (currentTyp?.Namespace != null && !currentTyp.Namespace.StartsWith("Microsoft") && !currentTyp.Namespace.StartsWith("System")) { - configuration.Controller.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}"); - configuration.Controller.Name.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}.{nameof(configuration.Controller.Name)}"); - configuration.Controller.Namespace.AssertIsNotNull($"ASP: {nameof(configuration.Controller)}.{nameof(configuration.Controller.Namespace)}"); - Logger.Trace($"Read ASP.NET controller {configuration.Controller.Namespace}.{configuration.Controller.Name}..."); - Type type = GeneratorTypeLoader.Get(configuration.Controller.Assembly, configuration.Controller.Namespace, configuration.Controller.Name); - if (type == null) + GeneratorOptions currentOptions = this.options.Get(currentTyp); + if (currentOptions.Ignore) { - return; + break; } - - HttpServiceTransferObject controller = new HttpServiceTransferObject(); - controller.Name = type.Name; - controller.Language = ReflectionLanguage.Instance; - - List typeAttributes = type.GetCustomAttributes().ToList(); - Attribute routeAttribute = typeAttributes.FirstOrDefault(x => x.GetType().Name == "RouteAttribute"); - controller.Route = routeAttribute?.GetType().GetProperty("Template")?.GetValue(routeAttribute)?.ToString(); - - Attribute apiVersionAttribute = typeAttributes.FirstOrDefault(x => x.GetType().Name == "ApiVersionAttribute"); - IEnumerable versions = apiVersionAttribute?.GetType().GetProperty("Versions")?.GetValue(apiVersionAttribute) as IEnumerable; - controller.Version = versions?.Last().ToString(); - - List methods = new(); - Type currentTyp = type; - while (currentTyp?.Namespace != null && !currentTyp.Namespace.StartsWith("Microsoft") && !currentTyp.Namespace.StartsWith("System")) + methods.AddRange(currentTyp.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) + // Remove all overwritten methods + .Where(method => methods.All(m => m.GetBaseDefinition() != method)) + ); + currentTyp = currentTyp.BaseType; + } + foreach (MethodInfo method in methods) + { + GeneratorOptions methodOptions = this.options.Get(method); + AspDotNetOptions methodAspOptions = this.options.Get(method); + if (methodOptions.Ignore || methodAspOptions.IsNonAction) { - if (currentTyp.GetCustomAttribute() != null) - { - break; - } - methods.AddRange(currentTyp.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly) - // Remove all overwritten methods - .Where(method => methods.All(m => m.GetBaseDefinition() != method)) - ); - currentTyp = currentTyp.BaseType; + continue; } - foreach (MethodInfo method in methods) + + this.options.Map(method, () => this.options.Get(method, null)); + Dictionary actionTypes = this.GetActionTypes(methodAspOptions); + if (actionTypes.Count == 0) { - List methodAttributes = method.GetCustomAttributes().ToList(); - if (methodAttributes.Any(attribute => attribute is GenerateIgnoreAttribute || attribute.GetType().Name == "NonActionAttribute")) - { - continue; - } + Logger.Error($"{type.FullName}.{method.Name} has to be decorated with at least one of [HttpGet], [HttpPost], [HttpPut], [HttpPatch], [HttpDelete], [NonAction] or with [GenerateIgnore]."); + continue; + } + Type returnType = (methodAspOptions.Produces ?? method.ReturnType) + .IgnoreGeneric("System.Threading.Tasks", "Task") + .IgnoreGeneric("Microsoft.AspNetCore.Mvc", "IActionResult") + .IgnoreGeneric("Microsoft.AspNetCore.Mvc", "ActionResult") + .IgnoreGeneric("System.Web.Mvc", "ActionResult") + .IgnoreGeneric("System.Web.Mvc", "ContentResult") + .IgnoreGeneric("System.Web.Mvc", "EmptyResult") + .IgnoreGeneric("System.Web.Mvc", "FileContentResult") + .IgnoreGeneric("System.Web.Mvc", "FilePathResult") + .IgnoreGeneric("System.Web.Mvc", "FileResult") + .IgnoreGeneric("System.Web.Mvc", "FileStreamResult") + .IgnoreGeneric("System.Web.Mvc", "JsonResult") + .IgnoreGeneric(methodAspOptions.IgnoreGenerics); - Dictionary actionTypes = this.GetActionTypes(methodAttributes); - if (actionTypes.Count == 0) + Type returnEntryType = returnType.IgnoreGeneric(typeof(IEnumerable<>)).IgnoreGeneric(typeof(List<>)).IgnoreGeneric(typeof(IList<>)); + AspDotNetOptions returnEntryTypeOptions = this.options.Get(returnEntryType, methodAspOptions); + foreach (KeyValuePair actionType in actionTypes) + { + HttpServiceActionTransferObject action = new(); + action.Name = actionTypes.Count == 1 ? method.Name : $"{actionType.Key}{method.Name.FirstCharToUpper()}"; + action.ReturnType = this.modelReader.Read(methodOptions.ReturnType, methodOptions) ?? this.modelReader.Read(returnType, methodOptions); + action.Route = actionType.Value ?? methodAspOptions.Route; + if (action.Route?.Contains(":") ?? false) { - Logger.Error($"{type.FullName}.{method.Name} has to be decorated with at least one of [HttpGet], [HttpPost], [HttpPut], [HttpPatch], [HttpDelete], [NonAction] or with [GenerateIgnore]."); - continue; + action.Route = Regex.Replace(action.Route, "({[^:]*)((:apiVersion)|:[^}?]+)(\\??})", "$1$3$4"); } - - string fallbackRoute = null; - Type returnType = method.ReturnType.IgnoreGeneric("System.Threading.Tasks", "Task") - .IgnoreGeneric("Microsoft.AspNetCore.Mvc", "IActionResult") - .IgnoreGeneric("Microsoft.AspNetCore.Mvc", "ActionResult") - .IgnoreGeneric("System.Web.Mvc", "ActionResult") - .IgnoreGeneric("System.Web.Mvc", "ContentResult") - .IgnoreGeneric("System.Web.Mvc", "EmptyResult") - .IgnoreGeneric("System.Web.Mvc", "FileContentResult") - .IgnoreGeneric("System.Web.Mvc", "FilePathResult") - .IgnoreGeneric("System.Web.Mvc", "FileResult") - .IgnoreGeneric("System.Web.Mvc", "FileStreamResult") - .IgnoreGeneric("System.Web.Mvc", "JsonResult"); - - IEnumerable responseTypeAttributes = methodAttributes.Where(x => x.GetType().Name == "ProducesResponseTypeAttribute" || x.GetType().Name == "ProducesAttribute"); - foreach (Attribute responseTypeAttribute in responseTypeAttributes) + action.Type = actionType.Key; + action.Version = methodAspOptions.ApiVersion?.OrderByDescending(x => x).FirstOrDefault(); + action.FixCasingWithMapping = (methodOptions.ReturnType == null && returnEntryTypeOptions.FixCasingWithMapping) || methodAspOptions.FixCasingWithMapping; + action.RequireBodyParameter = action.Type.IsBodyParameterRequired(); + action.CanHaveBodyParameter = action.Type.IsBodyParameterAllowed(); + List parameters = method.GetParameters().Where( + parameter => !this.options.Get(parameter, methodAspOptions).IsFromHeader + && !this.options.Get(parameter, methodAspOptions).IsFromServices + && parameter.ParameterType.FullName != "System.Threading.CancellationToken" + ).ToList(); + foreach (ParameterInfo parameter in parameters) { - Type responseTypeAttributeType = responseTypeAttribute.GetType(); - int statusCode = (int)responseTypeAttributeType.GetProperty("StatusCode").GetMethod.Invoke(responseTypeAttribute, null); - if (statusCode == 200) + AspDotNetOptions parameterOptions = this.options.Get(parameter, methodAspOptions); + string fullRoute = $"{controller.Route}/{action.Route}"; + HttpServiceActionParameterTransferObject actionParameter = new(); + actionParameter.Name = parameter.Name; + actionParameter.Type = this.modelReader.Read(parameter.ParameterType, methodOptions); + actionParameter.FromBody = parameterOptions.IsFromBody || (action.Type != HttpServiceActionTypeTransferObject.Get && !parameter.ParameterType.IsValueType && parameter.ParameterType != typeof(string)); + actionParameter.FromQuery = parameterOptions.IsFromQuery; + actionParameter.Inline = fullRoute.Contains($"{{{parameter.Name}}}"); + actionParameter.InlineIndex = actionParameter.Inline && action.Route != null ? action.Route.IndexOf($"{{{parameter.Name}}}") : 0; + actionParameter.IsOptional = parameter.IsOptional || Nullable.GetUnderlyingType(parameter.ParameterType) != null; + if (fullRoute.Contains($"{{{parameter.Name}?}}")) + { + actionParameter.Inline = true; + actionParameter.IsOptional = true; + actionParameter.InlineIndex = fullRoute.IndexOf($"{{{parameter.Name}?}}"); + action.Route = action.Route.Replace($"{{{parameter.Name}?}}", $"{{{parameter.Name}}}"); + } + action.Parameters.Add(actionParameter); + if (action.Type == HttpServiceActionTypeTransferObject.Get && actionParameter.Type.Name == "List" && !actionParameter.FromQuery) + { + Logger.Error($"HttpGet methods with list parameter '{parameter.Name}' of {type.FullName}.{method.Name} has to be decorated with [FromQuery]"); + } + if (actionParameter.FromBody && !action.CanHaveBodyParameter) { - returnType = (Type)responseTypeAttributeType.GetProperty("Type").GetMethod.Invoke(responseTypeAttribute, null) ?? returnType; + Logger.Warning($"{controller.Name}.{method.Name} with [Http{action.Type}] attribute does not supports [FromBody] parameters"); } } - - IEnumerable typesToIgnore = method.GetCustomAttributes() - .Concat(type.GetCustomAttributes()) - .Select(x => x.Type); - List methodVersions = new List(); - Attribute versionAttribute = methodAttributes.FirstOrDefault(x => x.GetType().Name == "ApiVersionAttribute"); - object apiVersions = versionAttribute?.GetType().GetProperty("Versions")?.GetValue(versionAttribute); - if (apiVersions is IEnumerable enumerableVersions) + if (action.RequireBodyParameter) { - foreach (object version in enumerableVersions) + if (action.Parameters.Count == 0) + { + throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} requires at least one parameter, but no parameter found. Use [GenerateIgnore] to skip generation for that method"); + } + if (action.Parameters.Count == 1) + { + action.Parameters.Single().FromBody = true; + } + else if (action.Parameters.All(x => !x.FromBody)) { - methodVersions.Add(version.ToString()); + throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} requires at least one parameter marked with [FromBody] or can have only one parameter"); } } - methodVersions.Sort(); - returnType = returnType.IgnoreGeneric(typesToIgnore); - Type returnEntryType = returnType.IgnoreGeneric(typeof(IEnumerable<>)).IgnoreGeneric(typeof(List<>)).IgnoreGeneric(typeof(IList<>)); - Attribute methodRouteAttribute = methodAttributes.FirstOrDefault(x => x.GetType().Name == "RouteAttribute"); - if (methodRouteAttribute != null) + if (action.Parameters.Count(x => x.FromBody) > 1) { - fallbackRoute = methodRouteAttribute.GetType().GetProperty("Template")?.GetValue(methodRouteAttribute)?.ToString(); + throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} can have only one parameter marked with [FromBody] or only one reference type"); } - foreach (KeyValuePair actionType in actionTypes) + int tries = 0; + while (controller.Actions.Any(a => a.Name == action.Name)) { - HttpServiceActionTransferObject action = new(); - action.Name = actionTypes.Count == 1 ? method.Name : $"{actionType.Key}{method.Name.FirstCharToUpper()}"; - action.ReturnType = this.modelReader.Read(returnType, transferObjects, configuration.Controller); - action.Route = actionType.Value ?? fallbackRoute; - if (action.Route?.Contains(":") ?? false) + if (tries > 10) { - action.Route = Regex.Replace(action.Route, "({[^:]*)(:[^}]+)(})", "$1$3") ; + throw new InvalidOperationException($"Can not find a suitable name for {action.Name}"); } - action.Type = actionType.Key; - action.Version = methodVersions.LastOrDefault(); - action.FixCasingWithMapping = returnEntryType.GetCustomAttribute() != null || typeAttributes.Any(x => x is GenerateFixCasingWithMappingAttribute); - ParameterInfo[] parameters = method.GetParameters().Where(parameter => parameter.GetCustomAttributes().Select(attribute => attribute.GetType().Name).All(attributeName => attributeName != "FromServicesAttribute" && attributeName != "FromHeaderAttribute")).ToArray(); - action.RequireBodyParameter = action.Type.IsBodyParameterRequired(); - foreach (ParameterInfo parameter in parameters) + if (parameters.Count > 0 && tries == 0) { - if (parameter.ParameterType.FullName == "System.Threading.CancellationToken") - { - continue; - } - string fullRoute = $"{controller.Route}/{action.Route}"; - HttpServiceActionParameterTransferObject actionParameter = new(); - actionParameter.Name = parameter.Name; - actionParameter.Type = this.modelReader.Read(parameter.ParameterType, transferObjects, configuration.Controller); - actionParameter.FromBody = this.IsFromBodyParameter(parameter, action.Type); - actionParameter.FromQuery = this.IsFromQueryParameter(parameter); - actionParameter.Inline = fullRoute.Contains($"{{{parameter.Name}}}"); - actionParameter.InlineIndex = actionParameter.Inline && action.Route != null ? action.Route.IndexOf($"{{{parameter.Name}}}", StringComparison.Ordinal) : 0; - actionParameter.IsOptional = parameter.IsOptional; - if (fullRoute.Contains($"{{{parameter.Name}?}}")) - { - actionParameter.Inline = true; - actionParameter.IsOptional = true; - action.Route = action.Route.Replace($"{{{parameter.Name}?}}", $"{{{parameter.Name}}}"); - } - action.Parameters.Add(actionParameter); - if (action.Type == HttpServiceActionTypeTransferObject.Get && actionParameter.Type.Name == "List" && !actionParameter.FromQuery) - { - Logger.Error($"HttpGet methods with list parameter '{parameter.Name}' of {type.FullName}.{method.Name} has to be decorated with [FromQuery]"); - } + action.Name += "By" + parameters.First().Name.FirstCharToUpper(); } - if (action.RequireBodyParameter) + else if (parameters.Count > tries) { - if (action.Parameters.Count == 0) - { - throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} requires at least one parameter, but no parameter found. Use [GenerateIgnore] to skip generation for that method"); - } - if (action.Parameters.Count == 1) - { - action.Parameters.Single().FromBody = true; - } - else if (action.Parameters.All(x => !x.FromBody)) - { - throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} requires at least one parameter marked with [FromBody] or can have only one parameter"); - } + action.Name += "And" + parameters.Skip(tries).First().Name.FirstCharToUpper(); } - if (action.Parameters.Count(x => x.FromBody) > 1) + else { - throw new InvalidOperationException($"Can not write {method.Name}. {action.Type} can have only one parameter marked with [FromBody] or only one reference type"); + action.Name += tries - parameters.Count + 1; } - int tries = 0; - while (controller.Actions.Any(a => a.Name == action.Name)) - { - if (tries > 10) - { - throw new InvalidOperationException($"Can not find a suitable name for {action.Name}"); - } - if (parameters.Length > 0 && tries == 0) - { - action.Name += "By" + parameters.First().Name.FirstCharToUpper(); - } - else if (parameters.Length > tries) - { - action.Name += "And" + parameters.Skip(tries).First().Name.FirstCharToUpper(); - } - else - { - action.Name += tries - parameters.Length + 1; - } - tries++; - } - controller.Actions.Add(action); + tries++; } + controller.Actions.Add(action); } - transferObjects.Add(controller); } + this.transferObjects.Add(controller); + } - private Dictionary GetActionTypes(List methodAttributes) + private Dictionary GetActionTypes(AspDotNetOptions options) + { + Dictionary dictionary = new(); + if (options.HttpGet) { - return methodAttributes.Select(attribute => - { - Type attributeType = attribute.GetType(); - string route = attributeType.GetProperty("Template")?.GetValue(attribute)?.ToString(); - switch (attributeType.Name) - { - case "HttpGetAttribute": - return Tuple.Create(HttpServiceActionTypeTransferObject.Get, route); - case "HttpPostAttribute": - return Tuple.Create(HttpServiceActionTypeTransferObject.Post, route); - case "HttpPatchAttribute": - return Tuple.Create(HttpServiceActionTypeTransferObject.Patch, route); - case "HttpPutAttribute": - return Tuple.Create(HttpServiceActionTypeTransferObject.Put, route); - case "HttpDeleteAttribute": - return Tuple.Create(HttpServiceActionTypeTransferObject.Delete, route); - case "ConditionalAttribute": - case "DebuggerStepThroughAttribute": - case "AsyncStateMachineAttribute": - case "AuthorizeAttribute": - case "RouteAttribute": - case "ProducesAttribute": - case "ProducesResponseTypeAttribute": - case "ApiVersionAttribute": - case "EnableCorsAttribute": - case nameof(GenerateIgnoreGenericAttribute): - // Ignore these attributes - return null; - default: - Logger.Warning($"Unknown controller action attribute {attributeType.Name}"); - return null; - } - }) - .Where(x => x != null) - .ToDictionary(x => x.Item1, x => x.Item2); + dictionary.Add(HttpServiceActionTypeTransferObject.Get, options.HttpGetRoute); } - - private bool IsFromBodyParameter(ParameterInfo parameter, HttpServiceActionTypeTransferObject method) + if (options.HttpPost) { - bool hasAttribute = parameter.GetCustomAttributes().Any(parameterAttribute => parameterAttribute.GetType().Name == "FromBodyAttribute"); - return hasAttribute || method != HttpServiceActionTypeTransferObject.Get && !parameter.ParameterType.IsValueType && parameter.ParameterType != typeof(string); + dictionary.Add(HttpServiceActionTypeTransferObject.Post, options.HttpPostRoute); } - - private bool IsFromQueryParameter(ParameterInfo parameter) + if (options.HttpPatch) + { + dictionary.Add(HttpServiceActionTypeTransferObject.Patch, options.HttpPatchRoute); + } + if (options.HttpPut) + { + dictionary.Add(HttpServiceActionTypeTransferObject.Put, options.HttpPutRoute); + } + if (options.HttpDelete) { - return parameter.GetCustomAttributes().Any(parameterAttribute => parameterAttribute.GetType().Name == "FromQueryAttribute"); + dictionary.Add(HttpServiceActionTypeTransferObject.Delete, options.HttpDeleteRoute); } + return dictionary; } } diff --git a/AspDotNet/Readers/AspDotNetHubReader.cs b/AspDotNet/Readers/AspDotNetHubReader.cs index 615aa752..521e7424 100644 --- a/AspDotNet/Readers/AspDotNetHubReader.cs +++ b/AspDotNet/Readers/AspDotNetHubReader.cs @@ -1,87 +1,87 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using System.Threading.Tasks; +using System.Reflection; using KY.Core; using KY.Generator.AspDotNet.Configurations; using KY.Generator.Reflection.Language; using KY.Generator.Reflection.Readers; using KY.Generator.Transfer; -using KY.Generator.Transfer.Extensions; -namespace KY.Generator.AspDotNet.Readers +namespace KY.Generator.AspDotNet.Readers; + +public class AspDotNetHubReader { - public class AspDotNetHubReader + private readonly ReflectionModelReader modelReader; + private readonly Options options; + private readonly List transferObjects; + + public AspDotNetHubReader(ReflectionModelReader modelReader, Options options, List transferObjects) { - private readonly ReflectionModelReader modelReader; + this.modelReader = modelReader; + this.options = options; + this.transferObjects = transferObjects; + } - public AspDotNetHubReader(ReflectionModelReader modelReader) + public void Read(AspDotNetReadConfiguration configuration) + { + configuration.Hub.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}"); + configuration.Hub.Name.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}.{nameof(configuration.Hub.Name)}"); + configuration.Hub.Namespace.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}.{nameof(configuration.Hub.Namespace)}"); + Logger.Trace($"Read SignalR hub {configuration.Hub.Namespace}.{configuration.Hub.Name}..."); + Type type = GeneratorTypeLoader.Get(configuration.Hub.Assembly, configuration.Hub.Namespace, configuration.Hub.Name); + if (type == null || type.BaseType == null || type.BaseType.Name != "Hub`1") + { + return; + } + if (!type.BaseType.IsGenericType) { - this.modelReader = modelReader; + Logger.Error("Implement generic Hub instead of non-generic Hub type"); } - public void Read(AspDotNetReadConfiguration configuration, List transferObjects) + SignalRHubTransferObject hub = new(); + hub.Name = type.Name; + hub.Language = ReflectionLanguage.Instance; + + MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (MethodInfo method in methods) { - configuration.Hub.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}"); - configuration.Hub.Name.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}.{nameof(configuration.Hub.Name)}"); - configuration.Hub.Namespace.AssertIsNotNull($"SignalR: {nameof(configuration.Hub)}.{nameof(configuration.Hub.Namespace)}"); - Logger.Trace($"Read SignalR hub {configuration.Hub.Namespace}.{configuration.Hub.Name}..."); - Type type = GeneratorTypeLoader.Get(configuration.Hub.Assembly, configuration.Hub.Namespace, configuration.Hub.Name); - if (type == null || type.BaseType == null || type.BaseType.Name != "Hub`1") + if (method.Name == "OnConnectedAsync" || method.Name == "OnDisconnectedAsync") { - return; + continue; } - if (!type.BaseType.IsGenericType) + GeneratorOptions methodOptions = this.options.Get(method); + HttpServiceActionTransferObject action = new(); + action.Name = method.Name; + if (method.ReturnType.Name != typeof(void).Name && method.ReturnType.Name != nameof(Task)) { - Logger.Error("Implement generic Hub instead of non-generic Hub type"); + Logger.Error($"Return type of method {method.Name} in {hub.Name} has to be void or Task"); } - - SignalRHubTransferObject hub = new SignalRHubTransferObject(); - hub.Name = type.Name; - hub.Language = ReflectionLanguage.Instance; - - MethodInfo[] methods = type.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - foreach (MethodInfo method in methods) + foreach (ParameterInfo parameter in method.GetParameters()) { - if (method.Name == "OnConnectedAsync" || method.Name == "OnDisconnectedAsync") - { - continue; - } - HttpServiceActionTransferObject action = new HttpServiceActionTransferObject(); - action.Name = method.Name; - if (method.ReturnType.Name != typeof(void).Name && method.ReturnType.Name != nameof(Task)) - { - Logger.Error($"Return type of method {method.Name} in {hub.Name} has to be void or Task"); - } - foreach (ParameterInfo parameter in method.GetParameters()) - { - action.Parameters.Add(new HttpServiceActionParameterTransferObject - { - Name = parameter.Name, - Type = this.modelReader.Read(parameter.ParameterType, transferObjects, configuration.Hub) - }); - } - hub.Actions.Add(action); + action.Parameters.Add(new HttpServiceActionParameterTransferObject + { + Name = parameter.Name, + Type = this.modelReader.Read(parameter.ParameterType, methodOptions) + }); } + hub.Actions.Add(action); + } - Type notificationType = type.BaseType.GetGenericArguments().Single(); - MethodInfo[] notificationMethods = notificationType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - foreach (MethodInfo method in notificationMethods) + Type notificationType = type.BaseType.GetGenericArguments().Single(); + MethodInfo[] notificationMethods = notificationType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (MethodInfo method in notificationMethods) + { + GeneratorOptions methodOptions = this.options.Get(method); + HttpServiceActionTransferObject action = new(); + action.Name = method.Name; + foreach (ParameterInfo parameter in method.GetParameters()) { - HttpServiceActionTransferObject action = new HttpServiceActionTransferObject(); - action.Name = method.Name; - foreach (ParameterInfo parameter in method.GetParameters()) - { - action.Parameters.Add(new HttpServiceActionParameterTransferObject - { - Name = parameter.Name, - Type = this.modelReader.Read(parameter.ParameterType, transferObjects, configuration.Hub) - }); - } - hub.Events.Add(action); + action.Parameters.Add(new HttpServiceActionParameterTransferObject + { + Name = parameter.Name, + Type = this.modelReader.Read(parameter.ParameterType, methodOptions) + }); } - transferObjects.Add(hub); + hub.Events.Add(action); } + this.transferObjects.Add(hub); } } diff --git a/AspDotNet/Readers/AspDotNetReader.cs b/AspDotNet/Readers/AspDotNetReader.cs index 4a59d886..d07899ad 100644 --- a/AspDotNet/Readers/AspDotNetReader.cs +++ b/AspDotNet/Readers/AspDotNetReader.cs @@ -16,17 +16,16 @@ public AspDotNetReader(IDependencyResolver resolver) this.resolver = resolver; } - public virtual void Read(ConfigurationBase configurationBase, List transferObjects) + public virtual void Read(AspDotNetReadConfiguration configuration) { - AspDotNetReadConfiguration configuration = (AspDotNetReadConfiguration)configurationBase; if (configuration.Controller != null) { - this.resolver.Create().Read(configuration, transferObjects); + this.resolver.Create().Read(configuration); } if (configuration.Hub != null) { - this.resolver.Create().Read(configuration, transferObjects); + this.resolver.Create().Read(configuration); } } } -} \ No newline at end of file +} diff --git a/AspDotNet/Writers/AspDotNetEntityControllerWriter.cs b/AspDotNet/Writers/AspDotNetEntityControllerWriter.cs index 025daf14..47ab8b0a 100644 --- a/AspDotNet/Writers/AspDotNetEntityControllerWriter.cs +++ b/AspDotNet/Writers/AspDotNetEntityControllerWriter.cs @@ -10,108 +10,123 @@ using KY.Generator.Transfer; using KY.Generator.Transfer.Extensions; -namespace KY.Generator.AspDotNet.Writers +namespace KY.Generator.AspDotNet.Writers; + +public class AspDotNetEntityControllerWriter : Codeable { - public class AspDotNetEntityControllerWriter : Codeable + private readonly Options options; + private readonly List transferObjects; + private readonly List files; + + public AspDotNetEntityControllerWriter(Options options, List transferObjects, List files) { - public virtual void Write(AspDotNetWriteConfiguration configuration, List transferObjects, List files) + this.options = options; + this.transferObjects = transferObjects; + this.files = files; + } + + public virtual void Write(AspDotNetWriteConfiguration configuration) + { + GeneratorOptions generatorOptions = this.options.Get(); + if (!generatorOptions.Language.IsCsharp()) { - if (!configuration.Language.IsCsharp()) - { - throw new InvalidOperationException($"Can not generate ASP.net Controller for language {configuration.Language?.Name ?? "Empty"}. Only Csharp is currently implemented"); - } - foreach (AspDotNetWriteEntityControllerConfiguration controllerConfiguration in configuration.Controllers) - { - EntityTransferObject entity = transferObjects.OfType().FirstOrDefault(x => x.Name == controllerConfiguration.Entity) - .AssertIsNotNull(nameof(controllerConfiguration.Entity), $"Entity {controllerConfiguration.Entity} not found. Ensure it is read before."); - - string nameSpace = (controllerConfiguration.Namespace ?? configuration.Namespace).AssertIsNotNull(nameof(configuration.Namespace), "asp writer requires a namespace"); - ClassTemplate controller = files.AddFile(configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - .AddNamespace(nameSpace) - .AddClass(controllerConfiguration.Name ?? entity.Name + "Controller", Code.Type(configuration.Template.ControllerBase)) - .FormatName(configuration) - .WithAttribute("Route", Code.String(controllerConfiguration.Route ?? "[controller]")); + throw new InvalidOperationException($"Can not generate ASP.net Controller for language {generatorOptions.Language?.Name ?? "Empty"}. Only Csharp is currently implemented"); + } + foreach (AspDotNetWriteEntityControllerConfiguration controllerConfiguration in configuration.Controllers) + { + EntityTransferObject entity = this.transferObjects.OfType().FirstOrDefault(x => x.Name == controllerConfiguration.Entity) + .AssertIsNotNull(nameof(controllerConfiguration.Entity), $"Entity {controllerConfiguration.Entity} not found. Ensure it is read before."); + GeneratorOptions entityOptions = this.options.Get(entity); + string nameSpace = (controllerConfiguration.Namespace ?? configuration.Namespace).AssertIsNotNull(nameof(configuration.Namespace), "asp writer requires a namespace"); + string className = controllerConfiguration.Name ?? entity.Name + "Controller"; + ClassTemplate controller = this.files.AddFile(configuration.RelativePath, entityOptions) + .WithName(Formatter.FormatFile(className, entityOptions)) + .AddNamespace(nameSpace) + .AddClass(className, Code.Type(configuration.Template.ControllerBase)) + .FormatName(entityOptions) + .FormatPrefix(entityOptions) + .WithAttribute("Route", Code.String(controllerConfiguration.Route ?? "[controller]")); - controller.Usings.AddRange(configuration.Template.Usings); + controller.Usings.AddRange(configuration.Template.Usings); - TypeTemplate modelType = entity.Model.ToTemplate(); + TypeTemplate modelType = entity.Model.ToTemplate(); - configuration.Usings.ForEach(x => controller.AddUsing(x)); - controllerConfiguration.Usings.ForEach(x => controller.AddUsing(x)); + configuration.Usings.ForEach(x => controller.AddUsing(x)); + controllerConfiguration.Usings.ForEach(x => controller.AddUsing(x)); - FieldTemplate repositoryField = controller.AddField("repository", Code.Type(entity.Name + "Repository")).Readonly(); - controller.AddConstructor().Code.AddLine(Code.This().Field(repositoryField).Assign(Code.New(repositoryField.Type)).Close()); + FieldTemplate repositoryField = controller.AddField("repository", Code.Type(entity.Name + "Repository")).Readonly(); + controller.AddConstructor().Code.AddLine(Code.This().Field(repositoryField).Assign(Code.New(repositoryField.Type)).Close()); - if (controllerConfiguration.Get != null) + if (controllerConfiguration.Get != null) + { + controller.AddUsing("System.Linq"); + MethodTemplate method = controller.AddMethod("Get", Code.Generic("IEnumerable", modelType)); + if (configuration.Template.UseAttributes) { - controller.AddUsing("System.Linq"); - MethodTemplate method = controller.AddMethod("Get", Code.Generic("IEnumerable", modelType)); - if (configuration.Template.UseAttributes) - { - method.WithAttribute("HttpGet", Code.String(controllerConfiguration.Get.Name ?? "[action]")); - } - DeclareTemplate queryable = Code.Declare(Code.Generic("IQueryable", modelType), "queryable", Code.This().Field(repositoryField).Method("Get")); - method.Code.AddLine(queryable); - foreach (PropertyTransferObject property in entity.Model.Properties) - { - ParameterTemplate parameter = method.AddParameter(property.Type.ToTemplate(), property.Name, Code.Local("default")).FormatName(configuration); - method.Code.AddLine(Code.If(Code.Local(parameter).NotEquals().Local("default"), x => x.Code.AddLine(Code.Local(queryable).Assign(Code.Local(queryable).Method("Where", Code.Lambda("x", Code.Local("x").Property(property.Name).Equals().Local(parameter)))).Close()))); - } - method.Code.AddLine(Code.Return(Code.Local(queryable))); + method.WithAttribute("HttpGet", Code.String(controllerConfiguration.Get.Name ?? "[action]")); } - if (controllerConfiguration.Post != null) + DeclareTemplate queryable = Code.Declare(Code.Generic("IQueryable", modelType), "queryable", Code.This().Field(repositoryField).Method("Get")); + method.Code.AddLine(queryable); + foreach (PropertyTransferObject property in entity.Model.Properties) { - MethodTemplate method = controller.AddMethod("Post", Code.Void()); - if (configuration.Template.UseAttributes) - { - method.WithAttribute("HttpPost", Code.String(controllerConfiguration.Post.Name ?? "[action]")); - } - ParameterTemplate parameter = method.AddParameter(modelType, "entity") - .WithAttribute("FromBody"); - - method.Code.AddLine(Code.This().Field(repositoryField).Method("Add", Code.Local(parameter)).Close()); + ParameterTemplate parameter = method.AddParameter(property.Type.ToTemplate(), property.Name, Code.Local("default")) /*.FormatName(configuration)*/; + method.Code.AddLine(Code.If(Code.Local(parameter).NotEquals().Local("default"), x => x.Code.AddLine(Code.Local(queryable).Assign(Code.Local(queryable).Method("Where", Code.Lambda("x", Code.Local("x").Property(property.Name).Equals().Local(parameter)))).Close()))); } - if (controllerConfiguration.Patch != null) + method.Code.AddLine(Code.Return(Code.Local(queryable))); + } + if (controllerConfiguration.Post != null) + { + MethodTemplate method = controller.AddMethod("Post", Code.Void()); + if (configuration.Template.UseAttributes) { - MethodTemplate method = controller.AddMethod("Patch", Code.Void()); - if (configuration.Template.UseAttributes) - { - method.WithAttribute("HttpPatch", Code.String(controllerConfiguration.Patch.Name ?? "[action]")); - } - ParameterTemplate parameter = method.AddParameter(modelType, "entity") - .WithAttribute("FromBody"); + method.WithAttribute("HttpPost", Code.String(controllerConfiguration.Post.Name ?? "[action]")); + } + ParameterTemplate parameter = method.AddParameter(modelType, "entity") + .WithAttribute("FromBody"); - method.Code.AddLine(Code.This().Field(repositoryField).Method("Update", Code.Local(parameter)).Close()); + method.Code.AddLine(Code.This().Field(repositoryField).Method("Add", Code.Local(parameter)).Close()); + } + if (controllerConfiguration.Patch != null) + { + MethodTemplate method = controller.AddMethod("Patch", Code.Void()); + if (configuration.Template.UseAttributes) + { + method.WithAttribute("HttpPatch", Code.String(controllerConfiguration.Patch.Name ?? "[action]")); } - if (controllerConfiguration.Put != null) + ParameterTemplate parameter = method.AddParameter(modelType, "entity") + .WithAttribute("FromBody"); + + method.Code.AddLine(Code.This().Field(repositoryField).Method("Update", Code.Local(parameter)).Close()); + } + if (controllerConfiguration.Put != null) + { + MethodTemplate method = controller.AddMethod("Put", Code.Void()); + if (configuration.Template.UseAttributes) { - MethodTemplate method = controller.AddMethod("Put", Code.Void()); - if (configuration.Template.UseAttributes) - { - method.WithAttribute("HttpPut", Code.String(controllerConfiguration.Put.Name ?? "[action]")); - } - ParameterTemplate parameter = method.AddParameter(modelType, "entity") - .WithAttribute("FromBody"); + method.WithAttribute("HttpPut", Code.String(controllerConfiguration.Put.Name ?? "[action]")); + } + ParameterTemplate parameter = method.AddParameter(modelType, "entity") + .WithAttribute("FromBody"); - method.Code.AddLine(Code.This().Field(repositoryField).Method("Update", Code.Local(parameter)).Close()); + method.Code.AddLine(Code.This().Field(repositoryField).Method("Update", Code.Local(parameter)).Close()); + } + if (controllerConfiguration.Delete != null) + { + MethodTemplate method = controller.AddMethod("Delete", Code.Void()); + if (configuration.Template.UseAttributes) + { + method.WithAttribute("HttpDelete", Code.String(controllerConfiguration.Delete.Name ?? "[action]")); } - if (controllerConfiguration.Delete != null) + List parameters = new(); + foreach (EntityKeyTransferObject key in entity.Keys) { - MethodTemplate method = controller.AddMethod("Delete", Code.Void()); - if (configuration.Template.UseAttributes) - { - method.WithAttribute("HttpDelete", Code.String(controllerConfiguration.Delete.Name ?? "[action]")); - } - List parameters = new List(); - foreach (EntityKeyTransferObject key in entity.Keys) - { - PropertyTransferObject property = entity.Model.Properties.First(x => x.Name.Equals(key.Name, StringComparison.InvariantCultureIgnoreCase)); - parameters.Add(method.AddParameter(property.Type.ToTemplate(), property.Name) - .FormatName(configuration)); - } - method.Code.AddLine(Code.This().Field(repositoryField).Method("Delete", parameters.Select(x => Code.Local(x))).Close()); + PropertyTransferObject property = entity.Model.Properties.First(x => x.Name.Equals(key.Name, StringComparison.InvariantCultureIgnoreCase)); + GeneratorOptions propertyOptions = this.options.Get(property); + parameters.Add(method.AddParameter(property.Type.ToTemplate(), property.Name) + .FormatName(propertyOptions)); } + method.Code.AddLine(Code.This().Field(repositoryField).Method("Delete", parameters.Select(x => Code.Local(x))).Close()); } } } -} \ No newline at end of file +} diff --git a/AspDotNet/Writers/AspDotNetGeneratorControllerWriter.cs b/AspDotNet/Writers/AspDotNetGeneratorControllerWriter.cs index dd611045..400a2786 100644 --- a/AspDotNet/Writers/AspDotNetGeneratorControllerWriter.cs +++ b/AspDotNet/Writers/AspDotNetGeneratorControllerWriter.cs @@ -8,133 +8,144 @@ using KY.Generator.Templates; using KY.Generator.Templates.Extensions; -namespace KY.Generator.AspDotNet.Writers +namespace KY.Generator.AspDotNet.Writers; + +public class AspDotNetGeneratorControllerWriter : Codeable { - public class AspDotNetGeneratorControllerWriter : Codeable + private readonly Options options; + + public AspDotNetGeneratorControllerWriter(Options options) + { + this.options = options; + } + + public virtual void Write(AspDotNetWriteConfiguration configuration, List files) { - public virtual void Write(AspDotNetWriteConfiguration configuration, List files) + Logger.Trace("Generate generator controller for ASP.net..."); + GeneratorOptions generatorOptions = this.options.Get(); + if (!generatorOptions.Language.IsCsharp()) { - Logger.Trace("Generate generator controller for ASP.net..."); - if (!configuration.Language.IsCsharp()) - { - throw new InvalidOperationException($"Can not generate ASP.net Controller for language {configuration.Language?.Name ?? "Empty"}. Only Csharp is currently implemented"); - } - string nameSpace = (configuration.GeneratorController.Namespace ?? configuration.Namespace).AssertIsNotNull(nameof(configuration.Namespace), "asp writer requires a namespace"); - ClassTemplate classTemplate = files.AddFile(configuration.GeneratorController.RelativePath ?? configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - .AddNamespace(nameSpace) - .AddClass("GeneratorController", Code.Type(configuration.Template.ControllerBase)) - .WithUsing("System") - .WithUsing("System.Linq") - .WithUsing("KY.Generator") - .WithUsing("KY.Generator.Output"); + throw new InvalidOperationException($"Can not generate ASP.net Controller for language {generatorOptions.Language?.Name ?? "Empty"}. Only Csharp is currently implemented"); + } + string nameSpace = (configuration.GeneratorController.Namespace ?? configuration.Namespace).AssertIsNotNull(nameof(configuration.Namespace), "asp writer requires a namespace"); + string className = "GeneratorController"; + ClassTemplate classTemplate = files.AddFile(configuration.GeneratorController.RelativePath ?? configuration.RelativePath, generatorOptions) + .WithName(Formatter.FormatFile(className, generatorOptions)) + .AddNamespace(nameSpace) + .AddClass(className, Code.Type(configuration.Template.ControllerBase)) + .FormatName(generatorOptions) + .FormatPrefix(generatorOptions) + .WithUsing("System") + .WithUsing("System.Linq") + .WithUsing("KY.Generator") + .WithUsing("KY.Generator.RelativePath"); - classTemplate.Usings.AddRange(configuration.Template.Usings); + classTemplate.Usings.AddRange(configuration.Template.Usings); - if (configuration.Template.UseOwnCache) - { - GenericTypeTemplate type = Code.Generic("Dictionary", Code.Type("string"), Code.Type("MemoryOutput")); - classTemplate.AddField("cache", type) - .FormatName(configuration) - .Static() - .Readonly() - .DefaultValue = Code.New(type); - } + if (configuration.Template.UseOwnCache) + { + GenericTypeTemplate type = Code.Generic("Dictionary", Code.Type("string"), Code.Type("MemoryOutput")); + classTemplate.AddField("cache", type) + // .FormatName(configuration) + .Static() + .Readonly() + .DefaultValue = Code.New(type); + } - MethodTemplate createMethod = classTemplate.AddMethod("Create", Code.Type("string")) - .FormatName(configuration) - .WithParameter(Code.Type("string"), "configuration"); - if (!configuration.Template.ValidateInput) - { - createMethod.WithAttribute("ValidateInput", Code.Local("false")); - } + MethodTemplate createMethod = classTemplate.AddMethod("Create", Code.Type("string")) + // .FormatName(configuration) + .WithParameter(Code.Type("string"), "configuration"); + if (!configuration.Template.ValidateInput) + { + createMethod.WithAttribute("ValidateInput", Code.Local("false")); + } - MethodTemplate commandMethod = classTemplate.AddMethod("Command", Code.Type("string")) - .FormatName(configuration) - .WithParameter(Code.Type("string"), "command"); + MethodTemplate commandMethod = classTemplate.AddMethod("Command", Code.Type("string")) + // .FormatName(configuration) + .WithParameter(Code.Type("string"), "command"); - MultilineCodeFragment createCode = createMethod.Code; - createCode.AddLine(Code.Declare(Code.Type("string"), "id", Code.Local("Guid").Method("NewGuid").Method("ToString"))) - .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", Code.New(Code.Type("MemoryOutput")))) - .AddLine(Code.Declare(Code.Type("Generator"), "generator", Code.New(Code.Type("Generator")))) - .AddLine(Code.Local("generator").Method("SetOutput", Code.Local("output")).Close()); - MultilineCodeFragment commandCode = commandMethod.Code; - commandCode.AddLine(Code.Declare(Code.Type("string"), "id", Code.Local("Guid").Method("NewGuid").Method("ToString"))) - .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", Code.New(Code.Type("MemoryOutput")))) - .AddLine(Code.Declare(Code.Type("Generator"), "generator", Code.New(Code.Type("Generator")))) - .AddLine(Code.Local("generator").Method("SetOutput", Code.Local("output")).Close()); - foreach (string ns in configuration.GeneratorController.Usings) - { - classTemplate.AddUsing(ns); - } - foreach (string moduleType in configuration.GeneratorController.PreloadModules) - { - createCode.AddLine(Code.Local("generator").GenericMethod("PreloadModule", Code.Type(moduleType)).Close()); - commandCode.AddLine(Code.Local("generator").GenericMethod("PreloadModule", Code.Type(moduleType)).Close()); - } - foreach (AspDotNetControllerConfigureModule configure in configuration.GeneratorController.Configures) - { - createCode.AddLine(Code.Local("generator").Method(configure.Module, Code.Lambda("x", Code.Csharp("x." + configure.Action)))); - commandCode.AddLine(Code.Local("generator").Method(configure.Module, Code.Lambda("x", Code.Csharp("x." + configure.Action)))); - } - createCode.AddLine(Code.Local("generator").Method("ParseConfiguration", Code.Local("configuration")).Close()) - .AddLine(Code.Local("generator").Method("Run").Close()) - .AddBlankLine(); - commandCode.AddLine(Code.Local("generator").Method("ParseCommand", Code.Local("command")).Close()) - .AddLine(Code.Local("generator").Method("Run").Close()) - .AddBlankLine(); - if (configuration.Template.UseOwnCache) - { - createCode.AddLine(Code.Local("cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); - commandCode.AddLine(Code.Local("cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); - } - else - { - createCode.AddLine(Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); - commandCode.AddLine(Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); - } - createCode.AddLine(Code.Return(Code.Local("id"))); - commandCode.AddLine(Code.Return(Code.Local("id"))); + MultilineCodeFragment createCode = createMethod.Code; + createCode.AddLine(Code.Declare(Code.Type("string"), "id", Code.Local("Guid").Method("NewGuid").Method("ToString"))) + .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", Code.New(Code.Type("MemoryOutput")))) + .AddLine(Code.Declare(Code.Type("Generator"), "generator", Code.New(Code.Type("Generator")))) + .AddLine(Code.Local("generator").Method("SetOutput", Code.Local("output")).Close()); + MultilineCodeFragment commandCode = commandMethod.Code; + commandCode.AddLine(Code.Declare(Code.Type("string"), "id", Code.Local("Guid").Method("NewGuid").Method("ToString"))) + .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", Code.New(Code.Type("MemoryOutput")))) + .AddLine(Code.Declare(Code.Type("Generator"), "generator", Code.New(Code.Type("Generator")))) + .AddLine(Code.Local("generator").Method("SetOutput", Code.Local("output")).Close()); + foreach (string ns in configuration.GeneratorController.Usings) + { + classTemplate.AddUsing(ns); + } + foreach (string moduleType in configuration.GeneratorController.PreloadModules) + { + createCode.AddLine(Code.Local("generator").GenericMethod("PreloadModule", Code.Type(moduleType)).Close()); + commandCode.AddLine(Code.Local("generator").GenericMethod("PreloadModule", Code.Type(moduleType)).Close()); + } + foreach (AspDotNetControllerConfigureModule configure in configuration.GeneratorController.Configures) + { + createCode.AddLine(Code.Local("generator").Method(configure.Module, Code.Lambda("x", Code.Csharp("x." + configure.Action)))); + commandCode.AddLine(Code.Local("generator").Method(configure.Module, Code.Lambda("x", Code.Csharp("x." + configure.Action)))); + } + createCode.AddLine(Code.Local("generator").Method("ParseConfiguration", Code.Local("configuration")).Close()) + .AddLine(Code.Local("generator").Method("Run").Close()) + .AddBlankLine(); + commandCode.AddLine(Code.Local("generator").Method("ParseCommand", Code.Local("command")).Close()) + .AddLine(Code.Local("generator").Method("Run").Close()) + .AddBlankLine(); + if (configuration.Template.UseOwnCache) + { + createCode.AddLine(Code.Local("cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); + commandCode.AddLine(Code.Local("cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); + } + else + { + createCode.AddLine(Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); + commandCode.AddLine(Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache").Index(Code.Local("id")).Assign(Code.Local("output")).Close()); + } + createCode.AddLine(Code.Return(Code.Local("id"))); + commandCode.AddLine(Code.Return(Code.Local("id"))); - ChainedCodeFragment getFromCacheForFilesFragment = configuration.Template.UseOwnCache - ? (ChainedCodeFragment)Code.Local("cache") - : Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache"); - MethodTemplate getFilesMethod = classTemplate.AddMethod("GetFiles", Code.Type("string")) - .FormatName(configuration) - .WithParameter(Code.Type("string"), "id"); - getFilesMethod.Code.AddLine(Code.If(Code.Local("id").Equals().Null(), x => x.Code.AddLine(Code.Return(Code.Null())))) - .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", getFromCacheForFilesFragment.Index(Code.Local("id")).As(Code.Type("MemoryOutput")))) - .AddLine(Code.Return(Code.InlineIf(Code.Local("output").Equals().Null(), - Code.Null(), - Code.Local("string").Method("Join", Code.Local("Environment").Property("NewLine"), - Code.Local("output").Property("Files").Method("Select", Code.Lambda("x", Code.Local("x").Property("Key"))))))); + ChainedCodeFragment getFromCacheForFilesFragment = configuration.Template.UseOwnCache + ? (ChainedCodeFragment)Code.Local("cache") + : Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache"); + MethodTemplate getFilesMethod = classTemplate.AddMethod("GetFiles", Code.Type("string")) + // .FormatName(configuration) + .WithParameter(Code.Type("string"), "id"); + getFilesMethod.Code.AddLine(Code.If(Code.Local("id").Equals().Null(), x => x.Code.AddLine(Code.Return(Code.Null())))) + .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", getFromCacheForFilesFragment.Index(Code.Local("id")).As(Code.Type("MemoryOutput")))) + .AddLine(Code.Return(Code.InlineIf(Code.Local("output").Equals().Null(), + Code.Null(), + Code.Local("string").Method("Join", Code.Local("GeneratorEnvironment").Property("NewLine"), + Code.Local("output").Property("Files").Method("Select", Code.Lambda("x", Code.Local("x").Property("Key"))))))); - ChainedCodeFragment getFromCacheForFileFragment = configuration.Template.UseOwnCache - ? (ChainedCodeFragment)Code.Local("cache") - : Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache"); - MethodTemplate getFileMethod = classTemplate.AddMethod("GetFile", Code.Type("string")) - .FormatName(configuration) - .WithParameter(Code.Type("string"), "id") - .WithParameter(Code.Type("string"), "path"); - getFileMethod.Code.AddLine(Code.If(Code.Local("id").Equals().Null(), x => x.Code.AddLine(Code.Return(Code.Null())))) - .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", getFromCacheForFileFragment.Index(Code.Local("id")).As(Code.Type("MemoryOutput")))) - .AddLine(Code.Return(Code.InlineIf(Code.Local("output").Equals().Null().Or().Not().Local("output").Property("Files").Method("ContainsKey", Code.Local("path")), - Code.Null(), - Code.Local("output").Property("Files").Index(Code.Local("path"))))); - MethodTemplate availableMethod = classTemplate.AddMethod("Available", Code.Type("bool")) - .FormatName(configuration); - availableMethod.Code.AddLine(Code.Return(Code.Local("true"))); + ChainedCodeFragment getFromCacheForFileFragment = configuration.Template.UseOwnCache + ? (ChainedCodeFragment)Code.Local("cache") + : Code.Static(Code.Type("HttpContext")).Property("Current").Property("Cache"); + MethodTemplate getFileMethod = classTemplate.AddMethod("GetFile", Code.Type("string")) + // .FormatName(configuration) + .WithParameter(Code.Type("string"), "id") + .WithParameter(Code.Type("string"), "path"); + getFileMethod.Code.AddLine(Code.If(Code.Local("id").Equals().Null(), x => x.Code.AddLine(Code.Return(Code.Null())))) + .AddLine(Code.Declare(Code.Type("MemoryOutput"), "output", getFromCacheForFileFragment.Index(Code.Local("id")).As(Code.Type("MemoryOutput")))) + .AddLine(Code.Return(Code.InlineIf(Code.Local("output").Equals().Null().Or().Not().Local("output").Property("Files").Method("ContainsKey", Code.Local("path")), + Code.Null(), + Code.Local("output").Property("Files").Index(Code.Local("path"))))); + MethodTemplate availableMethod = classTemplate.AddMethod("Available", Code.Type("bool")); + // .FormatName(configuration); + availableMethod.Code.AddLine(Code.Return(Code.Local("true"))); - if (configuration.Template.UseAttributes) - { - classTemplate.WithUsing("Microsoft.AspNetCore.Mvc") - .WithAttribute("Route", Code.String("[controller]")) - .WithAttribute("Route", Code.String("api/v1/[controller]")); - createMethod.WithAttribute("HttpPost", Code.String("[action]")); - commandMethod.WithAttribute("HttpPost", Code.String("[action]")); - getFilesMethod.WithAttribute("HttpPost", Code.String("[action]")); - getFileMethod.WithAttribute("HttpPost", Code.String("[action]")); - availableMethod.WithAttribute("HttpGet", Code.String("[action]")); - } + if (configuration.Template.UseAttributes) + { + classTemplate.WithUsing("Microsoft.AspNetCore.Mvc") + .WithAttribute("Route", Code.String("[controller]")) + .WithAttribute("Route", Code.String("api/v1/[controller]")); + createMethod.WithAttribute("HttpPost", Code.String("[action]")); + commandMethod.WithAttribute("HttpPost", Code.String("[action]")); + getFilesMethod.WithAttribute("HttpPost", Code.String("[action]")); + getFileMethod.WithAttribute("HttpPost", Code.String("[action]")); + availableMethod.WithAttribute("HttpGet", Code.String("[action]")); } } } \ No newline at end of file diff --git a/AspDotNet/Writers/AspDotNetWriter.cs b/AspDotNet/Writers/AspDotNetWriter.cs index 1b01d8e2..4b1cf64c 100644 --- a/AspDotNet/Writers/AspDotNetWriter.cs +++ b/AspDotNet/Writers/AspDotNetWriter.cs @@ -1,37 +1,30 @@ using System.Collections.Generic; using KY.Core.Dependency; using KY.Generator.AspDotNet.Configurations; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Output; using KY.Generator.Templates; -using KY.Generator.Transfer; using KY.Generator.Transfer.Writers; -namespace KY.Generator.AspDotNet.Writers +namespace KY.Generator.AspDotNet.Writers; + +public class AspDotNetWriter : ITransferWriter { - public class AspDotNetWriter : ITransferWriter + private readonly IDependencyResolver resolver; + + public AspDotNetWriter(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; + this.resolver = resolver; + } - public AspDotNetWriter(IDependencyResolver resolver) + public virtual void Write(AspDotNetWriteConfiguration configuration) + { + List files = new(); + if (configuration.GeneratorController != null) { - this.resolver = resolver; + this.resolver.Create().Write(configuration, files); } - - public virtual void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) + if (configuration.Controllers.Count > 0) { - AspDotNetWriteConfiguration configuration = (AspDotNetWriteConfiguration)configurationBase; - List files = new List(); - if (configuration.GeneratorController != null) - { - this.resolver.Create().Write(configuration, files); - } - if (configuration.Controllers.Count > 0) - { - this.resolver.Create().Write(configuration, transferObjects, files); - } - files.ForEach(file => configuration.Language.Write(file, output)); + this.resolver.Create().Write(configuration); } } -} \ No newline at end of file +} diff --git a/CLI/App.config b/CLI/App.config index bae5d6d8..1de6ab88 100644 --- a/CLI/App.config +++ b/CLI/App.config @@ -1,6 +1,6 @@ - - + + diff --git a/CLI/FodyWeavers.xsd b/CLI/FodyWeavers.xsd index 44a53744..05e92c11 100644 --- a/CLI/FodyWeavers.xsd +++ b/CLI/FodyWeavers.xsd @@ -17,6 +17,16 @@ A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + + A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks + + + + + A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks. + + A list of unmanaged 32 bit assembly names to include, delimited with line breaks. @@ -43,6 +53,16 @@ Controls if .pdbs for reference assemblies are also embedded. + + + Controls if runtime assemblies are also embedded. + + + + + Controls whether the runtime assemblies are embedded with their full path or only with their assembly name. + + Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option. @@ -73,6 +93,16 @@ A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + + A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with | + + + + + A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |. + + A list of unmanaged 32 bit assembly names to include, delimited with |. diff --git a/CLI/KY.Generator.CLI.csproj b/CLI/KY.Generator.CLI.csproj index 51c1f70c..77371bb2 100644 --- a/CLI/KY.Generator.CLI.csproj +++ b/CLI/KY.Generator.CLI.csproj @@ -1,6 +1,6 @@  - + Debug @@ -16,6 +16,7 @@ + latest AnyCPU @@ -37,24 +38,106 @@ 4 - - ..\packages\Costura.Fody.3.3.2\lib\net40\Costura.dll + + ..\packages\Costura.Fody.5.7.0\lib\netstandard1.0\Costura.dll + True + + + ..\packages\KY.Core.Common.4.34.1\lib\netstandard2.0\KY.Core.Common.dll - - ..\packages\KY.Core.Common.4.20.1\lib\netstandard2.0\KY.Core.Common.dll + + ..\packages\Microsoft.Win32.Primitives.4.3.0\lib\net46\Microsoft.Win32.Primitives.dll True - - ..\packages\Newtonsoft.Json.12.0.3\lib\net45\Newtonsoft.Json.dll + + + ..\packages\Newtonsoft.Json.13.0.3\lib\net45\Newtonsoft.Json.dll + + ..\packages\System.AppContext.4.3.0\lib\net46\System.AppContext.dll + True + + + ..\packages\System.Buffers.4.5.1\lib\net461\System.Buffers.dll + + + + ..\packages\System.Console.4.3.1\lib\net46\System.Console.dll + True + + + ..\packages\System.Diagnostics.DiagnosticSource.8.0.0\lib\netstandard2.0\System.Diagnostics.DiagnosticSource.dll + + + ..\packages\System.Globalization.Calendars.4.3.0\lib\net46\System.Globalization.Calendars.dll + True + + + ..\packages\System.IO.Compression.4.3.0\lib\net46\System.IO.Compression.dll + True + + + + ..\packages\System.IO.Compression.ZipFile.4.3.0\lib\net46\System.IO.Compression.ZipFile.dll + True + + + ..\packages\System.IO.FileSystem.4.3.0\lib\net46\System.IO.FileSystem.dll + True + + + ..\packages\System.IO.FileSystem.Primitives.4.3.0\lib\net46\System.IO.FileSystem.Primitives.dll + True + + + ..\packages\System.Memory.4.5.5\lib\net461\System.Memory.dll + + + ..\packages\System.Net.Http.4.3.4\lib\net46\System.Net.Http.dll + True + + + ..\packages\System.Net.Sockets.4.3.0\lib\net46\System.Net.Sockets.dll + True + + + + ..\packages\System.Numerics.Vectors.4.5.0\lib\net46\System.Numerics.Vectors.dll + + + ..\packages\System.Runtime.CompilerServices.Unsafe.6.0.0\lib\net461\System.Runtime.CompilerServices.Unsafe.dll + + + ..\packages\System.Runtime.InteropServices.RuntimeInformation.4.3.0\lib\net45\System.Runtime.InteropServices.RuntimeInformation.dll + True + + + ..\packages\System.Security.Cryptography.Algorithms.4.3.1\lib\net461\System.Security.Cryptography.Algorithms.dll + True + + + ..\packages\System.Security.Cryptography.Encoding.4.3.0\lib\net46\System.Security.Cryptography.Encoding.dll + True + + + ..\packages\System.Security.Cryptography.Primitives.4.3.0\lib\net46\System.Security.Cryptography.Primitives.dll + True + + + ..\packages\System.Security.Cryptography.X509Certificates.4.3.2\lib\net461\System.Security.Cryptography.X509Certificates.dll + True + - + + ..\packages\System.Xml.ReaderWriter.4.3.1\lib\net46\System.Xml.ReaderWriter.dll + True + @@ -74,9 +157,9 @@ {5915BD99-7A27-4A49-B31D-0CB8A3E07795} KY.Generator.AspDotNet - + {8c35562d-fbce-4588-ab3b-fcc6deadebae} - KY.Generator.Core + KY.Generator.Common {D23DC658-3C95-4A73-BBC7-22A94E81AEE8} @@ -120,12 +203,14 @@ - + - This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}. + This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. - - + + + + \ No newline at end of file diff --git a/CLI/Program.cs b/CLI/Program.cs index 5745ea21..849be547 100644 --- a/CLI/Program.cs +++ b/CLI/Program.cs @@ -21,7 +21,7 @@ private static void Main(string[] args) { Generator.InitializeLogger(args); - bool success = Generator.Initialize() + bool success = Generator.Create() .PreloadModule() .PreloadModule() .PreloadModule() diff --git a/CLI/Properties/AssemblyInfo.cs b/CLI/Properties/AssemblyInfo.cs index 4fd2b4df..b92f6d00 100644 --- a/CLI/Properties/AssemblyInfo.cs +++ b/CLI/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -12,7 +11,7 @@ [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] [assembly: AssemblyCompany("KY-Programming")] -[assembly: AssemblyCopyright("Copyright © KY-Programming 2006-2021")] +[assembly: AssemblyCopyright("2023 - KY-Programming")] // Setting ComVisible to false makes the types in this assembly not visible // to COM components. If you need to access a type in this assembly from @@ -32,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.6.0")] -[assembly: AssemblyFileVersion("7.6.0")] +[assembly: AssemblyVersion("10.0.0.0")] +[assembly: AssemblyFileVersion("10.0.0.0")] \ No newline at end of file diff --git a/CLI/nuget.nuspec b/CLI/nuget.nuspec index bc5eaef2..b72379e9 100644 --- a/CLI/nuget.nuspec +++ b/CLI/nuget.nuspec @@ -1,26 +1,29 @@ - - - KY.Generator.CLI - - 7.6.0 - Codestin Search App - KY-Programming - KY-Programming - https://github.com/KY-Programming/generator/blob/master/LICENSE - https://github.com/KY-Programming/generator - https://ky-programming.de/images/logos/128.png - false - Command Line Interface for KY-Generator. -Generate C# or TypeScript classes from .NET assemblies, JSON, TSQL or oData. -Support for Angular, ASP.NET, ASP.NET Core, C# POCOs, TypeScript POCOs, Entity Framework and more. - - - Copyright 2021 - KY-Generator KY Generator CLI - - - - - + + + KY.Generator.CLI + + 10.0.0-preview.2 + Codestin Search App + KY-Programming + KY-Programming + MIT + https://github.com/KY-Programming/generator + assets\icon.png + false + Command Line Interface for KY-Generator. + Generate C# or TypeScript classes from .NET assemblies, JSON, TSQL or oData. + Support for Angular, ASP.NET, ASP.NET Core, C# POCOs, TypeScript POCOs, Entity Framework and more. + + + 2024 - KY-Programming + KY-Generator KY.Generator CLI + docs\README.md + + + + + + + diff --git a/CLI/packages.config b/CLI/packages.config index 189ccbb1..3c18aa8d 100644 --- a/CLI/packages.config +++ b/CLI/packages.config @@ -1,7 +1,57 @@  - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Core.Tests/CaseTest.cs b/Common.Tests/CaseTest.cs similarity index 75% rename from Core.Tests/CaseTest.cs rename to Common.Tests/CaseTest.cs index 47e5be10..c3f0ac16 100644 --- a/Core.Tests/CaseTest.cs +++ b/Common.Tests/CaseTest.cs @@ -1,7 +1,8 @@ using KY.Generator.Extensions; +using KY.Generator.Models; using Microsoft.VisualStudio.TestTools.UnitTesting; -namespace KY.Generator.Core.Tests +namespace KY.Generator.Common.Tests { [TestClass] public class CaseTest @@ -15,11 +16,13 @@ public void TestPascalAllLower() { Assert.AreEqual("Alllower", "alllower".ToPascalCase()); } + [TestMethod] public void TestPascalAllLowerNumber() { Assert.AreEqual("Alllower1", "alllower1".ToPascalCase()); } + [TestMethod] public void TestPascalAllLowerNumbers() { @@ -155,11 +158,13 @@ public void TestCamelAllLower() { Assert.AreEqual("alllower", "alllower".ToCamelCase()); } + [TestMethod] public void TestCamelAllLowerNumber() { Assert.AreEqual("alllower1", "alllower1".ToCamelCase()); } + [TestMethod] public void TestCamelAllLowerNumbers() { @@ -285,5 +290,81 @@ public void TestCamelKebabCaseAllowedSpecial() { Assert.AreEqual("kebabCase$", "kebab-case$".ToCamelCase("$")); } + + /*************** + * AspDotNet * + ***************/ + + [TestMethod] + public void TestAspDotNetUpperSnakeCase() + { + Assert.AreEqual("uppeR_SNAKE_CASE", "UPPER_SNAKE_CASE".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetUnderscoredUpperSnakeCase() + { + Assert.AreEqual("_UPPER_SNAKE_CASE", "_UPPER_SNAKE_CASE".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetUpperSnakeCaseShort() + { + Assert.AreEqual("s_UPPER_SNAKE_CASE", "S_UPPER_SNAKE_CASE".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetUpperSnakeCaseShortFirstLower() + { + Assert.AreEqual("s_UPPER_SNAKE_CASE", "s_UPPER_SNAKE_CASE".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetUpperSnakeCaseShortFirstLower2() + { + Assert.AreEqual("sUPPER_SNAKE_CASE", "sUPPER_SNAKE_CASE".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetAllUpper() + { + Assert.AreEqual("allupper", "ALLUPPER".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetAllLower() + { + Assert.AreEqual("alllower", "alllower".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetPascalCase() + { + Assert.AreEqual("pascalCase", "PascalCase".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetSnakeCase() + { + Assert.AreEqual("snake_case", "snake_case".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetCamelCase() + { + Assert.AreEqual("camelCase", "camelCase".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetDarwinCase() + { + Assert.AreEqual("darwin_Case", "Darwin_Case".ToAspDotNetCompatibleFirstLowerCase()); + } + + [TestMethod] + public void TestAspDotNetSpecial1() + { + Assert.AreEqual("myTest", "MYTest".ToAspDotNetCompatibleFirstLowerCase()); + } } -} \ No newline at end of file +} diff --git a/Common.Tests/CliCommandReaderTest.cs b/Common.Tests/CliCommandReaderTest.cs new file mode 100644 index 00000000..5cba9c4f --- /dev/null +++ b/Common.Tests/CliCommandReaderTest.cs @@ -0,0 +1,218 @@ +using System.Collections.Generic; +using KY.Generator.Command; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace KY.Generator.Common.Tests; + +[TestClass] +public class CliCommandReaderTest +{ + [TestInitialize] + public void Initialize() + { } + + [TestMethod] + public void TestEmptyParameters() + { + List commands = CliCommandReader.Read(); + Assert.AreEqual(0, commands.Count); + } + + [TestMethod] + public void TestInvalidCommandOrder() + { + string[] parameters = { "-parameter", "command" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(0, commands.Count); + } + + [TestMethod] + public void TestGlobalParameterFirst() + { + string[] parameters = { "--global", "command" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(1, commands.Count); + Assert.AreEqual("command", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("global", commands[0].Parameters[0].Name); + } + + [TestMethod] + public void TestOneCommandWithOneSimpleParameter() + { + string[] parameters = { "command", "-parameter" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(1, commands.Count); + Assert.AreEqual("command", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("parameter", commands[0].Parameters[0].Name); + } + + [TestMethod] + public void TestOneCommandWithTwoSimpleParameters() + { + string[] parameters = { "command", "-parameter1", "-parameter2" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(1, commands.Count); + Assert.AreEqual("command", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); + } + + [TestMethod] + public void TestOneCommandWithOneValueParameter() + { + string[] parameters = { "command", "-parameter=test" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(1, commands.Count); + Assert.AreEqual("command", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("parameter", commands[0].Parameters[0].Name); + Assert.AreEqual("test", commands[0].Parameters[0].Value); + } + + [TestMethod] + public void TestOneCommandWithTwoValueParameters() + { + string[] parameters = { "command", "-parameter1=test1", "-parameter2=test2" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(1, commands.Count); + Assert.AreEqual("command", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("test1", commands[0].Parameters[0].Value); + Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); + Assert.AreEqual("test2", commands[0].Parameters[1].Value); + } + + [TestMethod] + public void TestTwoCommandsWithTheSameSimpleParameter() + { + string[] parameters = { "command1", "-parameter", "command2", "-parameter" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("parameter", commands[1].Parameters[0].Name); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(1, commands[1].Parameters.Count); + Assert.AreEqual("parameter", commands[1].Parameters[0].Name); + } + + [TestMethod] + public void TestTwoCommandsWithDifferentSimpleParameter() + { + string[] parameters = { "command1", "-parameter1", "command2", "-parameter2" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(1, commands[1].Parameters.Count); + Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); + } + + [TestMethod] + public void TestTwoCommandsWithTheSameTwoSimpleParameters() + { + string[] parameters = { "command1", "-parameter1", "-parameter2", "command2", "-parameter1", "-parameter2" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(2, commands[1].Parameters.Count); + Assert.AreEqual("parameter1", commands[1].Parameters[0].Name); + Assert.AreEqual("parameter2", commands[1].Parameters[1].Name); + } + + [TestMethod] + public void TestTwoCommandsWithDifferentTwoSimpleParameters() + { + string[] parameters = { "command1", "-parameter1", "-parameter2", "command2", "-parameter3", "-parameter4" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(2, commands[1].Parameters.Count); + Assert.AreEqual("parameter3", commands[1].Parameters[0].Name); + Assert.AreEqual("parameter4", commands[1].Parameters[1].Name); + } + + [TestMethod] + public void TestTwoCommandsWithOneValueParameter() + { + string[] parameters = { "command1", "-parameter=test1", "command2", "-parameter=test2" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(1, commands[0].Parameters.Count); + Assert.AreEqual("parameter", commands[0].Parameters[0].Name); + Assert.AreEqual("test1", commands[0].Parameters[0].Value); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(1, commands[1].Parameters.Count); + Assert.AreEqual("parameter", commands[1].Parameters[0].Name); + Assert.AreEqual("test2", commands[1].Parameters[0].Value); + } + + [TestMethod] + public void TestTwoCommandsWithTwoValueParameters() + { + string[] parameters = { "command1", "-parameter1=test1", "-parameter2=test2", "command2", "-parameter3=test3", "-parameter4=test4" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("test1", commands[0].Parameters[0].Value); + Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); + Assert.AreEqual("test2", commands[0].Parameters[1].Value); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(2, commands[1].Parameters.Count); + Assert.AreEqual("parameter3", commands[1].Parameters[0].Name); + Assert.AreEqual("test3", commands[1].Parameters[0].Value); + Assert.AreEqual("parameter4", commands[1].Parameters[1].Name); + Assert.AreEqual("test4", commands[1].Parameters[1].Value); + } + + [TestMethod] + public void TestTwoCommandsWithOneSimpleAndOneGlobalSimpleParameter() + { + string[] parameters = { "command1", "-parameter1", "command2", "-parameter2", "--global" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("global", commands[0].Parameters[1].Name); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(2, commands[1].Parameters.Count); + Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); + Assert.AreEqual("global", commands[1].Parameters[1].Name); + } + + [TestMethod] + public void TestTwoCommandsWithOneSimpleAndOneGlobalValueParameter() + { + string[] parameters = { "command1", "-parameter1", "command2", "-parameter2", "--global=everywhere" }; + List commands = CliCommandReader.Read(parameters); + Assert.AreEqual(2, commands.Count); + Assert.AreEqual("command1", commands[0].Name); + Assert.AreEqual(2, commands[0].Parameters.Count); + Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); + Assert.AreEqual("global", commands[0].Parameters[1].Name); + Assert.AreEqual("everywhere", commands[0].Parameters[1].Value); + Assert.AreEqual("command2", commands[1].Name); + Assert.AreEqual(2, commands[1].Parameters.Count); + Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); + Assert.AreEqual("global", commands[1].Parameters[1].Name); + Assert.AreEqual("everywhere", commands[1].Parameters[1].Value); + } +} \ No newline at end of file diff --git a/Core.Tests/KY.Generator.Core.Tests.csproj b/Common.Tests/KY.Generator.Common.Tests.csproj similarity index 64% rename from Core.Tests/KY.Generator.Core.Tests.csproj rename to Common.Tests/KY.Generator.Common.Tests.csproj index 1402150a..ca596666 100644 --- a/Core.Tests/KY.Generator.Core.Tests.csproj +++ b/Common.Tests/KY.Generator.Common.Tests.csproj @@ -1,20 +1,22 @@  - netcoreapp2.1 + net6.0 false + + latest - + - + diff --git a/Common.Tests/ModelWriterTests.cs b/Common.Tests/ModelWriterTests.cs new file mode 100644 index 00000000..ebd60c04 --- /dev/null +++ b/Common.Tests/ModelWriterTests.cs @@ -0,0 +1,138 @@ +using System.Collections.Generic; +using KY.Core.Dependency; +using KY.Generator.Common.Tests.Models; +using KY.Generator.Mappings; +using KY.Generator.Transfer; +using KY.Generator.Transfer.Writers; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace KY.Generator.Common.Tests; + +[TestClass] +public class ModelWriterTests +{ + private IDependencyResolver resolver; + private ModelWriter writer; + private List transferObjects; + + [TestInitialize] + public void Initialize() + { + this.transferObjects = new List(); + this.resolver = new DependencyResolver(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind>().To(this.transferObjects); + this.writer = this.resolver.Create(); + } + + [TestMethod] + public void File() + { + TestOutput output = new(); + ModelTransferObject model = new() + { + Name = "Test1", + Language = new TestLanguage(this.resolver) + }; + this.transferObjects.Add(model); + this.writer.Write(string.Empty); + Assert.AreEqual(1, output.Files.Count, "Unexpected number of files"); + Assert.AreEqual("Test1", output.Files[0].Name, "Unexpected file name"); + } + + // [TestMethod] + // public void Namespace() + // { + // TestConfiguration configuration = new(); + // List transferObjects = new(); + // ModelTransferObject model = new() + // { + // Namespace = "KY.Test", + // Language = new TestLanguage() + // }; + // transferObjects.Add(model); + // List files = this.writer.Write(configuration, transferObjects); + // Assert.AreEqual(1, files[0].Namespaces.Count, "Unexpected number of namespace"); + // Assert.AreEqual("KY.Test", files[0].Namespaces[0].Name, "Unexpected namespace"); + // } + // + // [TestMethod] + // public void ClassName() + // { + // TestConfiguration configuration = new(); + // List transferObjects = new(); + // ModelTransferObject model = new() + // { + // Name = "Test1", + // Language = new TestLanguage() + // }; + // transferObjects.Add(model); + // List files = this.writer.Write(configuration, transferObjects); + // Assert.AreEqual("Test1", files[0].Namespaces[0].Children[0].Name, "Unexpected class name"); + // } + // + // [TestMethod] + // public void OneField() + // { + // TestConfiguration configuration = new(); + // List transferObjects = new(); + // ModelTransferObject model = new() + // { + // Name = "Test1", + // Namespace = "KY.Test", + // Language = new TestLanguage() + // }; + // model.Fields.Add(new FieldTransferObject { Name = "Field1", Type = new TypeTransferObject { Name = "string" } }); + // transferObjects.Add(model); + // List files = this.writer.Write(configuration, transferObjects); + // ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; + // Assert.AreEqual(1, classTemplate.Fields.Count, "Unexpected number of fields"); + // Assert.AreEqual("Field1", classTemplate.Fields[0].Name, "Unexpected field name"); + // Assert.AreEqual("string", classTemplate.Fields[0].Type.Name, "Unexpected field type"); + // Assert.AreEqual(0, classTemplate.Properties.Count, "Unexpected number of properties"); + // } + // + // [TestMethod] + // public void OneProperty() + // { + // TestConfiguration configuration = new(); + // List transferObjects = new(); + // ModelTransferObject model = new() + // { + // Name = "Test1", + // Namespace = "KY.Test", + // Language = new TestLanguage() + // }; + // model.Properties.Add(new PropertyTransferObject { Name = "Prop1", Type = new TypeTransferObject { Name = "string" } }); + // transferObjects.Add(model); + // List files = this.writer.Write(configuration, transferObjects); + // ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; + // Assert.AreEqual(1, classTemplate.Properties.Count, "Unexpected number of properties"); + // Assert.AreEqual("Prop1", classTemplate.Properties[0].Name, "Unexpected property name"); + // Assert.AreEqual("string", classTemplate.Properties[0].Type.Name, "Unexpected property type"); + // Assert.AreEqual(0, classTemplate.Fields.Count, "Unexpected number of fields"); + // } + // + // [TestMethod] + // public void OnePropertyWithDifferentNamespace() + // { + // TestConfiguration configuration = new(); + // List transferObjects = new(); + // ModelTransferObject model = new() + // { + // Name = "Test1", + // Namespace = "KY.Test", + // Language = new TestLanguage() + // }; + // model.Properties.Add(new PropertyTransferObject { Name = "Prop1", Type = new TypeTransferObject { Name = "Test2", Namespace = "KY.Test.Different" } }); + // transferObjects.Add(model); + // List files = this.writer.Write(configuration, transferObjects); + // ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; + // Assert.AreEqual(1, classTemplate.Properties.Count, "Unexpected number of properties"); + // Assert.AreEqual("Prop1", classTemplate.Properties[0].Name, "Unexpected property name"); + // Assert.AreEqual("Test2", classTemplate.Properties[0].Type.Name, "Unexpected property type"); + // Assert.AreEqual(1, classTemplate.Usings.Count, "Unexpected number of usings"); + // Assert.AreEqual("KY.Test.Different", classTemplate.Usings[0].Namespace, "Unexpected property namespace"); + // Assert.AreEqual(0, classTemplate.Fields.Count, "Unexpected number of fields"); + // } +} diff --git a/Core.Tests/Models/TestConfiguration.cs b/Common.Tests/Models/TestConfiguration.cs similarity index 65% rename from Core.Tests/Models/TestConfiguration.cs rename to Common.Tests/Models/TestConfiguration.cs index 7439ffb8..ba07b95b 100644 --- a/Core.Tests/Models/TestConfiguration.cs +++ b/Common.Tests/Models/TestConfiguration.cs @@ -1,10 +1,8 @@ using System; using System.Collections.Generic; -using KY.Generator.Configuration; using KY.Generator.Configurations; -using KY.Generator.Languages; -namespace KY.Generator.Core.Tests.Models +namespace KY.Generator.Common.Tests.Models { internal class TestConfiguration : IModelConfiguration { @@ -16,14 +14,10 @@ internal class TestConfiguration : IModelConfiguration public List Usings { get; } public Guid? OutputId { get; set; } public bool FormatNames { get; set; } - public ILanguage Language { get; set; } - public ConfigurationFormatting Formatting { get; } public TestConfiguration() { - this.Language = new TestLanguage(); this.Usings = new List(); - this.Formatting = new ConfigurationFormatting(); } } -} \ No newline at end of file +} diff --git a/Common.Tests/Models/TestLanguage.cs b/Common.Tests/Models/TestLanguage.cs new file mode 100644 index 00000000..2cb1c668 --- /dev/null +++ b/Common.Tests/Models/TestLanguage.cs @@ -0,0 +1,16 @@ +using KY.Core.Dependency; +using KY.Generator.Languages; + +namespace KY.Generator.Common.Tests.Models +{ + public class TestLanguage : BaseLanguage + { + public override string Name => "Test"; + public override bool ImportFromSystem => true; + public override bool IsGenericTypeWithSameNameAllowed { get; } + + public TestLanguage(IDependencyResolver resolver) + : base(resolver) + { } + } +} diff --git a/Common.Tests/Models/TestOutput.cs b/Common.Tests/Models/TestOutput.cs new file mode 100644 index 00000000..432080e9 --- /dev/null +++ b/Common.Tests/Models/TestOutput.cs @@ -0,0 +1,43 @@ +using System.Collections.Generic; +using System.Linq; +using KY.Generator.Output; + +namespace KY.Generator.Common.Tests.Models; + +public class TestOutput : IOutput +{ + public List Files { get; } = new(); + + public long Lines { get; } + + public void Write(string fileName, string content, GeneratorOptions options, bool ignoreOutputId = false, bool forceOverwrite = false) + { + this.Files.Add(new TestFile(fileName, content)); + } + + public void Delete(string fileName) + { + this.Files.Remove(this.Files.FirstOrDefault(x => x.Name == fileName)); + } + + public void DeleteAllRelatedFiles(string relativePath = null) + { } + + public void Execute() + { } + + public void Move(string relativePath) + { } +} + +public class TestFile +{ + public string Name { get; } + public string Content { get; } + + public TestFile(string name, string content) + { + this.Name = name; + this.Content = content; + } +} diff --git a/Common.Tests/TemplateWriterTests.cs b/Common.Tests/TemplateWriterTests.cs new file mode 100644 index 00000000..944d4a4e --- /dev/null +++ b/Common.Tests/TemplateWriterTests.cs @@ -0,0 +1,457 @@ +using KY.Core; +using KY.Core.Dependency; +using KY.Generator.Common.Tests.Models; +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.Templates.Extensions; +using KY.Generator.Writers; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using FileWriter = KY.Generator.Output.FileWriter; + +namespace KY.Generator.Common.Tests; + +[TestClass] +public class TemplateWriterTests : Codeable +{ + private IDependencyResolver resolver; + private IOutputCache output; + private Options options; + + [TestInitialize] + public void Initialize() + { + this.resolver = new DependencyResolver(); + this.options = new Options(); + GeneratorOptions generatorOptions = this.options.Get(); + generatorOptions.Language = new TestLanguage(this.resolver); + this.output = new FileWriter(generatorOptions); + } + + [TestMethod] + public void AccessIndexWriter() + { + AccessIndexWriter writer = new(); + writer.Write(new AccessIndexTemplate(Code.Local("test")), this.output); + Assert.AreEqual("[test]", this.output.ToString()); + } + + [TestMethod] + public void AppendStringWriter() + { + AppendStringWriter writer = new(); + writer.Write(new AppendStringTemplate(Code.Local("test")), this.output); + Assert.AreEqual(" + test", this.output.ToString()); + } + + [TestMethod] + public void AssignWriter() + { + AssignWriter writer = new(); + writer.Write(new AssignTemplate(Code.Local("test")), this.output); + Assert.AreEqual("= test", this.output.ToString()); + } + + [TestMethod] + public void AsWriter() + { + AsWriter writer = new(); + writer.Write(new AsTemplate(Code.Type("test")), this.output); + Assert.AreEqual("as test", this.output.ToString()); + } + + [TestMethod] + public void BlankLineWriter() + { + BlankLineWriter writer = new(); + writer.Write(new BlankLineTemplate(), this.output); + Assert.AreEqual("", this.output.ToString()); + } + + [TestMethod] + public void CaseWriter() + { + CaseWriter writer = new(); + CaseTemplate template = new(Code.String("test")); + template.Code.AddLine(Code.Comment("code here")); + writer.Write(template, this.output); + Assert.AreEqual("case \"test\":\r\n // code here\r\n break;", this.output.ToString()); + } + + [TestMethod] + public void ClassGenericWriter() + { + Assert.Inconclusive("Not implemented yet"); + ClassGenericWriter writer = new(); + writer.Write(new ClassGenericTemplate("test"), this.output); + Assert.AreEqual("test", this.output.ToString()); + } + + [TestMethod] + public void ClassWriter() + { + ClassWriter writer = new(this.options); + writer.Write(new ClassTemplate((NamespaceTemplate)null, "test"), this.output); + Assert.AreEqual("public partial class test\r\n{\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassOneProperty() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddProperty("Prop1", Code.Type("string")); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassOnePropertyAndOneMethod() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddProperty("Prop1", Code.Type("string")); + template.AddMethod("Meth1", Code.Type("string")); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n public string Meth1()\r\n {\r\n }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassWithComment() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.Comment = Code.Comment("test comment"); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("// test comment\r\npublic partial class test\r\n{\r\n}", this.output.ToString()); + } + + [TestMethod] + public void CommentWriter() + { + CommentWriter writer = new(); + writer.Write(new CommentTemplate("first line"), this.output); + Assert.AreEqual("// first line", this.output.ToString()); + } + + [TestMethod] + public void MultilineComment() + { + CommentWriter writer = new(); + writer.Write(new CommentTemplate("first line\r\nsecond line\r\nthird line"), this.output); + Assert.AreEqual("// first line\r\n// second line\r\n// third line", this.output.ToString()); + } + + [TestMethod] + public void ElseIfWriter() + { + ElseIfTemplate template = new(null, Code.Local("variable")); + template.Code.AddLine(Code.Comment("Some code here")); + ElseIfWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("else if (variable)\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ElseWriter() + { + ElseTemplate template = new(null); + template.Code.AddLine(Code.Comment("Some code here")); + ElseWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("else\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void EnumWriter() + { + EnumTemplate template = new((NamespaceTemplate)null, "test"); + template.Values.Add(new EnumValueTemplate("value", Code.Number(0))); + EnumWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public enum test\r\n{\r\n value = 0\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ExecuteFieldWriter() + { + ExecuteFieldWriter writer = new(); + writer.Write(new ExecuteFieldTemplate("field"), this.output); + Assert.AreEqual("field", this.output.ToString()); + } + + [TestMethod] + public void ExecuteGenericMethodWriter() + { + ExecuteGenericMethodWriter writer = new(); + writer.Write(new ExecuteGenericMethodTemplate("test", Code.Type("type").Yield(), Code.Local("parameter")), this.output); + Assert.AreEqual("test(parameter)", this.output.ToString()); + } + + [TestMethod] + public void ExecuteMethodWriter() + { + ExecuteMethodWriter writer = new(); + writer.Write(new ExecuteMethodTemplate("test", Code.Local("parameter1"), Code.Local("parameter2")), this.output); + Assert.AreEqual("test(parameter1, parameter2)", this.output.ToString()); + } + + [TestMethod] + public void ExecutePropertyWriter() + { + ExecutePropertyWriter writer = new(); + writer.Write(new ExecutePropertyTemplate("test"), this.output); + Assert.AreEqual("test", this.output.ToString()); + } + + [TestMethod] + public void FieldWriter() + { + FieldWriter writer = new(); + writer.Write(new FieldTemplate(null, "test", Code.Type("type")), this.output); + Assert.AreEqual("private type test;", this.output.ToString()); + } + + [TestMethod] + public void FieldDefaultValue() + { + FieldTemplate template = new(null, "test", Code.Type("type")); + template.DefaultValue = Code.String("default"); + FieldWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("private type test = \"default\";", this.output.ToString()); + } + + [TestMethod] + public void IfWriter() + { + Assert.Inconclusive("Not implemented yet"); + IfTemplate template = new(Code.Local("test").Equals().String("string")); + template.Code.AddLine(Code.Comment("Some code here")); + IfWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("if (test == \"string\")\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void InlineIfWriter() + { + InlineIfTemplate template = new(Code.Local("test"), Code.String("true"), Code.String("false")); + InlineIfWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("test ? \"true\" : \"false\"", this.output.ToString()); + } + + [TestMethod] + public void LambdaWriter() + { + LambdaTemplate template = new("parameter".Yield(), Code.Local("parameter").Method("test")); + LambdaWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("parameter => parameter.test()", this.output.ToString()); + } + + [TestMethod] + public void LambdaMultiline() + { + LambdaTemplate template = new("parameter".Yield(), Code.Multiline().AddLine(Code.Local("parameter").Method("test").Close())); + LambdaWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("parameter =>\r\n{\r\n parameter.test();\r\n}", this.output.ToString()); + } + + [TestMethod] + public void LocalVariableWriter() + { + LocalVariableWriter writer = new(); + writer.Write(new LocalVariableTemplate("test"), this.output); + Assert.AreEqual("test", this.output.ToString()); + } + + [TestMethod] + public void MethodWriter() + { + MethodTemplate template = new(null, "test", Code.Type("type")); + template.Code.AddLine(Code.Comment("Some code here")); + MethodWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("public type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void NullWriter() + { + NullWriter writer = new(); + writer.Write(new NullTemplate(), this.output); + Assert.AreEqual("null", this.output.ToString()); + } + + [TestMethod] + public void StaticMethod() + { + MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")).Static(); + template.Code.AddLine(Code.Comment("Some code here")); + MethodWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("public static type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void OverrideMethod() + { + MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")).Override(); + template.Code.AddLine(Code.Comment("Some code here")); + MethodWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("public override type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ParameterMethod() + { + Assert.Inconclusive("Not implemented yet"); + MethodTemplate template = new(null, "test", Code.Type("type")); + template.Parameters.Add(new ParameterTemplate(Code.Type("other"), "param")); + template.Code.AddLine(Code.Comment("Some code here")); + MethodWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("public type test(other param)\r\n{\r\n // Some code here\r\n}", this.output.ToString()); + } + + [TestMethod] + public void PropertyWithEmptyComment() + { + PropertyTemplate template = new PropertyTemplate(null, "Property", Code.Type("string")) + .WithComment(""); + this.output.Add(template); + Assert.AreEqual("public string Property { get; set; }", this.output.ToString()); + } + + [TestMethod] + public void NamespaceWriter() + { + NamespaceTemplate template = new(null, "test"); + template.AddClass("testClass"); + NamespaceWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("namespace test\r\n{\r\n public partial class testClass\r\n {\r\n }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void NewWriter() + { + NewWriter writer = new(); + writer.Write(new NewTemplate(Code.Type("type")), this.output); + Assert.AreEqual("new type()", this.output.ToString()); + } + + [TestMethod] + public void NewWithParameter() + { + NewWriter writer = new(); + writer.Write(new NewTemplate(Code.Type("type"), Code.Local("parameter")), this.output); + Assert.AreEqual("new type(parameter)", this.output.ToString()); + } + + [TestMethod] + public void NotWriter() + { + NotWriter writer = new(); + writer.Write(new NotTemplate(), this.output); + Assert.AreEqual("!", this.output.ToString()); + } + + [TestMethod] + public void NullValueWriter() + { + NullValueWriter writer = new(); + writer.Write(new NullValueTemplate(), this.output); + Assert.AreEqual("null", this.output.ToString()); + } + + [TestMethod] + public void NumberWriter() + { + NumberWriter writer = new(); + writer.Write(new NumberTemplate(1), this.output); + Assert.AreEqual("1", this.output.ToString()); + } + + [TestMethod] + public void OperatorWriter() + { + OperatorWriter writer = new(); + writer.Write(new OperatorTemplate(Operator.And), this.output); + Assert.AreEqual("&&", this.output.ToString()); + } + + [TestMethod] + public void PropertyWriter() + { + PropertyWriter writer = new(); + writer.Write(new PropertyTemplate(null, "test", Code.Type("type")), this.output); + Assert.AreEqual("public type test { get; set; }", this.output.ToString()); + } + + [TestMethod] + public void PropertyDefaultValue() + { + PropertyTemplate template = new(null, "test", Code.Type("type")); + template.DefaultValue = Code.String("value"); + PropertyWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("public type test { get; set; } = \"value\";", this.output.ToString()); + } + + [TestMethod] + public void ReturnWriter() + { + ReturnWriter writer = new(); + writer.Write(new ReturnTemplate(Code.String("string")), this.output); + Assert.AreEqual("return \"string\";", this.output.ToString()); + } + + [TestMethod] + public void StringWriter() + { + StringWriter writer = new(this.options); + writer.Write(new StringTemplate("string"), this.output); + Assert.AreEqual("\"string\"", this.output.ToString()); + } + + [TestMethod] + public void SwitchWriter() + { + SwitchTemplate template = new(Code.Local("value")); + CaseTemplate caseTemplate = new(Code.String("one")); + caseTemplate.Code.AddLine(Code.Comment("Some code here")); + template.Cases.Add(caseTemplate); + template.Default.AddLine(Code.Comment("Some code here")); + SwitchWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("switch (value)\r\n{\r\n case \"one\":\r\n // Some code here\r\n break;\r\n default:\r\n // Some code here\r\n break;\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ThisWriter() + { + ThisWriter writer = new(); + writer.Write(new ThisTemplate(), this.output); + Assert.AreEqual("this", this.output.ToString()); + } + + [TestMethod] + public void TypeOfWriter() + { + TypeOfWriter writer = new(); + writer.Write(new TypeOfTemplate(Code.Type("test")), this.output); + Assert.AreEqual("typeof(test)", this.output.ToString()); + } + + [TestMethod] + public void VoidWriter() + { + VoidWriter writer = new(); + writer.Write(new VoidTemplate(), this.output); + Assert.AreEqual("void", this.output.ToString()); + } +} diff --git a/Core/Client/ClientCommand.cs b/Common/Client/ClientCommand.cs similarity index 96% rename from Core/Client/ClientCommand.cs rename to Common/Client/ClientCommand.cs index f1c35f0e..eb79d1d4 100644 --- a/Core/Client/ClientCommand.cs +++ b/Common/Client/ClientCommand.cs @@ -1,7 +1,5 @@ using System; using System.Net.Http; -using KY.Core; -using KY.Core.DataAccess; using KY.Generator.Command; using KY.Generator.Output; @@ -66,7 +64,7 @@ namespace KY.Generator.Client // Logger.Error($"Connection to generator failed: {getFilesResponse.StatusCode}"); // return false; // } - // string[] filePaths = getFilesResponse.Content.ReadAsStringAsync().Result.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + // string[] filePaths = getFilesResponse.Content.ReadAsStringAsync().Result.Split(new[] { GeneratorEnvironment.NewLine }, StringSplitOptions.RemoveEmptyEntries); // if (filePaths.Length == 0) // { // Logger.Warning("No files generated"); diff --git a/Core/Client/GeneratorClient.cs b/Common/Client/GeneratorClient.cs similarity index 100% rename from Core/Client/GeneratorClient.cs rename to Common/Client/GeneratorClient.cs diff --git a/Core/Client/GeneratorClientConfiguration.cs b/Common/Client/GeneratorClientConfiguration.cs similarity index 100% rename from Core/Client/GeneratorClientConfiguration.cs rename to Common/Client/GeneratorClientConfiguration.cs diff --git a/Common/Client/GeneratorConfiguration.cs b/Common/Client/GeneratorConfiguration.cs new file mode 100644 index 00000000..12298c36 --- /dev/null +++ b/Common/Client/GeneratorConfiguration.cs @@ -0,0 +1,7 @@ +namespace KY.Generator.Client +{ + internal class GeneratorConfiguration + { + public GeneratorClientConfiguration Client { get; set; } + } +} diff --git a/Common/Command/CliCommand.cs b/Common/Command/CliCommand.cs new file mode 100644 index 00000000..f89ed258 --- /dev/null +++ b/Common/Command/CliCommand.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using System.Diagnostics; + +namespace KY.Generator.Command; + +[DebuggerDisplay("{Name}*{Parameters.Count}")] +public class CliCommand +{ + public string Name { get; } + public List Parameters { get; } = new(); + + public CliCommand(string name) + { + this.Name = name; + } +} \ No newline at end of file diff --git a/Common/Command/CliCommandParameter.cs b/Common/Command/CliCommandParameter.cs new file mode 100644 index 00000000..1c9bf6d8 --- /dev/null +++ b/Common/Command/CliCommandParameter.cs @@ -0,0 +1,43 @@ +using System; +using System.Diagnostics; +using System.Text.RegularExpressions; + +namespace KY.Generator.Command; + +[DebuggerDisplay("{Name,nq}={Value}")] +public class CliCommandParameter +{ + private static readonly Regex regex = new(@"^-\*?(?[a-zA-Z0-9-]+)(=(?.*))?$"); + + public string Name { get; } + public string Value { get; set; } + + public CliCommandParameter(string name, string value) + { + this.Name = name; + this.Value = value; + } + + public static CliCommandParameter Parse(string text) + { + Match match = regex.Match(text); + if (!match.Success) + { + throw new InvalidOperationException($"Invalid parameter '{text}'"); + } + string name = FormatName(match.Groups["name"].Value); + string value = match.Groups["value"].Value; + return new CliCommandParameter(name, value); + } + + public static string FormatName(string name) + { + return name?.Replace("-", string.Empty)?.ToLowerInvariant(); + } + + public override string ToString() + { + string value = string.IsNullOrEmpty(this.Value) ? string.Empty : $"=\"{this.Value.TrimEnd('\\')}\""; + return $"-{this.Name}{value}"; + } +} \ No newline at end of file diff --git a/Common/Command/CliCommandReader.cs b/Common/Command/CliCommandReader.cs new file mode 100644 index 00000000..12a96a2e --- /dev/null +++ b/Common/Command/CliCommandReader.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; +using KY.Core; + +namespace KY.Generator.Command; + +public static class CliCommandReader +{ + public static List Read(params string[] parameters) + { + List commands = []; + foreach (string parameter in parameters) + { + if (parameter.StartsWith("-")) + { + if (commands.Count == 0) + { + Logger.Error("The first parameter has to be a command (must not start with a dash '-')"); + break; + } + commands.Last().Parameters.Add(CliCommandParameter.Parse(parameter)); + } + else + { + commands.Add(new CliCommand(parameter)); + } + } + return commands; + } +} \ No newline at end of file diff --git a/Core/Command/ErrorResult.cs b/Common/Command/ErrorResult.cs similarity index 100% rename from Core/Command/ErrorResult.cs rename to Common/Command/ErrorResult.cs diff --git a/Common/Command/Extensions/OptionsExtension.cs b/Common/Command/Extensions/OptionsExtension.cs new file mode 100644 index 00000000..89b0c239 --- /dev/null +++ b/Common/Command/Extensions/OptionsExtension.cs @@ -0,0 +1,36 @@ +namespace KY.Generator.Command.Extensions; + +public static class OptionsExtension +{ + public static void SetFromParameter(this GeneratorOptions options, GeneratorCommandParameters parameters) + { + if (parameters.NoHeader != null) + { + options.AddHeader = !parameters.NoHeader.Value; + } + if (parameters.FormatNames != null) + { + options.FormatNames = parameters.FormatNames.Value; + } + if (parameters.FieldsToProperties != null) + { + options.FieldsToProperties = parameters.FieldsToProperties.Value; + } + if (parameters.PropertiesToFields != null) + { + options.PropertiesToFields = parameters.PropertiesToFields.Value; + } + if (parameters.SkipNamespace != null) + { + options.SkipNamespace = parameters.SkipNamespace.Value; + } + if (parameters.PreferInterfaces != null) + { + options.PreferInterfaces = parameters.PreferInterfaces.Value; + } + if (parameters.WithOptionalProperties != null) + { + options.WithOptionalProperties = parameters.WithOptionalProperties.Value; + } + } +} \ No newline at end of file diff --git a/Common/Command/GeneratorCommand.cs b/Common/Command/GeneratorCommand.cs new file mode 100644 index 00000000..0b060a25 --- /dev/null +++ b/Common/Command/GeneratorCommand.cs @@ -0,0 +1,202 @@ +using System.Collections; +using System.Reflection; +using KY.Core; +using KY.Generator.Extensions; +using KY.Generator.Models; + +namespace KY.Generator.Command; + +public abstract class GeneratorCommand : IGeneratorCommand + where T : GeneratorCommandParameters, new() +{ + public T Parameters { get; } = new(); + GeneratorCommandParameters IGeneratorCommand.Parameters => this.Parameters; + public List OriginalParameters { get; set; } + + public bool Parse() + { + Type type = typeof(T); + Dictionary mapping = new(); + foreach (PropertyInfo property in type.GetProperties()) + { + foreach (GeneratorParameterAttribute attribute in property.GetCustomAttributes()) + { + mapping.AddIfNotExists(CliCommandParameter.FormatName(attribute.ParameterName), property); + } + foreach (GeneratorGlobalParameterAttribute attribute in property.GetCustomAttributes().Where(x => !string.IsNullOrEmpty(x.ParameterName))) + { + mapping.AddIfNotExists(CliCommandParameter.FormatName(attribute.ParameterName), property); + } + mapping.AddIfNotExists(CliCommandParameter.FormatName(property.Name), property); + } + foreach (CliCommandParameter parameter in this.OriginalParameters) + { + string parameterName = parameter.Name.ToLowerInvariant(); + if (!mapping.ContainsKey(parameterName)) + { + Logger.Warning($"Unknown parameter '{parameter.Name}' on '{this.GetType().Name}' command"); + continue; + } + PropertyInfo property = mapping[parameterName]; + bool isList = property.PropertyType.Name.StartsWith("List`"); + if (isList && this.OriginalParameters.Count(p => p.Name == parameter.Name) > 1) + { + IList list = property.GetMethod.Invoke(this.Parameters, null) as IList; + if (list == null) + { + Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.GetType().Name}' command. Parameter is from type List and has to be always initialized"); + return false; + } + Type itemType = property.PropertyType.GetGenericArguments().First(); + if (!GeneratorCommand.ParameterParser.ContainsKey(itemType)) + { + Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.GetType().Name}' command. No converter from List to List<{itemType.FullName}> found. Use {nameof(GeneratorCommand)}.{nameof(GeneratorCommand.ParameterParser)} to set a custom parser. Do not map List map T instead"); + return false; + } + list.Add(GeneratorCommand.ParameterParser[itemType].Invoke(parameter.Value)); + } + else + { + if (!property.CanWrite) + { + Logger.Warning($"Can not write parameter '{parameter.Name}' on '{this.GetType().Name}' command. Ensure command property has a public setter."); + continue; + } + + if (!GeneratorCommand.ParameterParser.ContainsKey(property.PropertyType)) + { + Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.GetType().Name}' command. No converter from System.String to {property.PropertyType.FullName} found. Use {nameof(GeneratorCommand)}.{nameof(GeneratorCommand.ParameterParser)} to set a custom parser"); + return false; + } + try + { + property.SetMethod.Invoke(this.Parameters, [GeneratorCommand.ParameterParser[property.PropertyType].Invoke(parameter.Value)]); + } + catch (Exception exception) + { + Logger.Error($"Can not set parameter '{this.GetType().Name}.{parameter.Name}'. {exception.Message}"); + return false; + } + } + } + return true; + } + + public virtual void Prepare() + { } + + public virtual void FollowUp() + { } + + public abstract IGeneratorCommandResult Run(); + + protected SuccessResult Success() + { + return new SuccessResult(); + } + + protected ErrorResult Error() + { + return new ErrorResult(); + } + + protected SwitchContextResult SwitchContext(SwitchableFramework switchToFramework) + { + return new SwitchContextResult(null, switchToFramework); + } + + protected SwitchContextResult SwitchContext(ProcessorArchitecture? switchToArchitecture, SwitchableFramework switchToFramework = SwitchableFramework.None) + { + return new SwitchContextResult(switchToArchitecture, switchToFramework); + } + + protected SwitchAsyncResult SwitchAsync() + { + return new SwitchAsyncResult(); + } + + public override string ToString() + { + return $" {ToCommand(this.GetType().Name)} {(this.OriginalParameters == null ? string.Join(" ", this.ParametersToString()) : string.Join(" ", this.OriginalParameters))}"; + } + + protected static string ToCommand(string className) + { + return className.TrimEnd("Command").ToKebabCase(); + } + + private IEnumerable ParametersToString() + { + foreach (PropertyInfo property in this.Parameters.GetType().GetProperties().Where(x => x.CanRead)) + { + object value = property.GetMethod.Invoke(this.Parameters, null); + if (value != null) + { + yield return new CliCommandParameter(property.Name, value.ToString()).ToString(); + } + } + } +} + +public static class GeneratorCommand +{ + internal static Dictionary> ParameterParser { get; } = new(); + + static GeneratorCommand() + { + AddParser(value => value); + AddParser(value => !value?.Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase) ?? true); + AddParser(value => !value?.Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase)); + AddParser(value => value?.Split(',').Select(x => !x.Trim().Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase)).ToList()); + AddParser(byte.Parse); + AddParser(value => value == null ? (byte?)null : byte.Parse(value)); + AddParser(value => value?.Split(',').Select(byte.Parse).ToList()); + AddParser(sbyte.Parse); + AddParser(value => value == null ? (sbyte?)null : sbyte.Parse(value)); + AddParser(value => value?.Split(',').Select(sbyte.Parse).ToList()); + AddParser(char.Parse); + AddParser(value => value == null ? (char?)null : char.Parse(value)); + AddParser(value => value?.Split(',').Select(char.Parse).ToList()); + AddParser(DateTime.Parse); + AddParser(value => value == null ? (DateTime?)null : DateTime.Parse(value)); + AddParser(value => value?.Split(',').Select(DateTime.Parse).ToList()); + AddParser(decimal.Parse); + AddParser(value => value == null ? (decimal?)null : decimal.Parse(value)); + AddParser(value => value?.Split(',').Select(decimal.Parse).ToList()); + AddParser(short.Parse); + AddParser(value => value == null ? (short?)null : short.Parse(value)); + AddParser(value => value?.Split(',').Select(short.Parse).ToList()); + AddParser(int.Parse); + AddParser(value => value == null ? (int?)null : int.Parse(value)); + AddParser(value => value?.Split(',').Select(int.Parse).ToList()); + AddParser(long.Parse); + AddParser(value => value == null ? (long?)null : long.Parse(value)); + AddParser(value => value?.Split(',').Select(long.Parse).ToList()); + AddParser(ushort.Parse); + AddParser(value => value == null ? (ushort?)null : ushort.Parse(value)); + AddParser(value => value?.Split(',').Select(ushort.Parse).ToList()); + AddParser(uint.Parse); + AddParser(value => value == null ? (uint?)null : uint.Parse(value)); + AddParser(value => value?.Split(',').Select(uint.Parse).ToList()); + AddParser(ulong.Parse); + AddParser(value => value == null ? (ulong?)null : ulong.Parse(value)); + AddParser(value => value?.Split(',').Select(ulong.Parse).ToList()); + AddParser(float.Parse); + AddParser(value => value == null ? (float?)null : float.Parse(value)); + AddParser(value => value?.Split(',').Select(float.Parse).ToList()); + AddParser(double.Parse); + AddParser(value => value == null ? (double?)null : double.Parse(value)); + AddParser(value => value?.Split(',').Select(double.Parse).ToList()); + AddParser(Guid.Parse); + AddParser(value => value == null ? (Guid?)null : Guid.Parse(value)); + AddParser(value => value?.Split(',').Select(Guid.Parse).ToList()); + AddParser(TimeSpan.Parse); + AddParser(value => value == null ? (TimeSpan?)null : TimeSpan.Parse(value)); + AddParser(value => value?.Split(',').Select(TimeSpan.Parse).ToList()); + } + + public static void AddParser(Func parseAction) + { + ParameterParser.Add(typeof(T), value => parseAction(value)); + } +} diff --git a/Common/Command/GeneratorCommandFactory.cs b/Common/Command/GeneratorCommandFactory.cs new file mode 100644 index 00000000..224fdc1f --- /dev/null +++ b/Common/Command/GeneratorCommandFactory.cs @@ -0,0 +1,74 @@ +using KY.Core; +using KY.Core.Dependency; +using KY.Generator.Models; + +namespace KY.Generator.Command; + +public class GeneratorCommandFactory(IDependencyResolver resolverFallback) +{ + private readonly Dictionary commands = new(); + private readonly List prepareCommands = []; + + public void Register(IEnumerable names) where T : IGeneratorCommand + { + this.Register(typeof(T), names.Unique()); + if (typeof(IPrepareCommand).IsAssignableFrom(typeof(T))) + { + this.prepareCommands.Add(typeof(T)); + } + } + + public void Register(Type command, IEnumerable names) + { + foreach (string name in names) + { + if (this.commands.ContainsKey(name)) + { + throw new InvalidOperationException($"Command '{name}' is already registered."); + } + this.commands.Add(name, command); + } + } + + public List Create(params string[] parameters) + { + return this.Create(CliCommandReader.Read(parameters)); + } + + public List Create(IEnumerable cliCommands, IDependencyResolver? resolver = null) + { + bool allCommandsFound = true; + List foundCommands = []; + foreach (CliCommand cliCommand in cliCommands) + { + if (!this.commands.TryGetValue(cliCommand.Name, out Type type)) + { + allCommandsFound = false; + GeneratorErrors.CommandNotFoundError(cliCommand); + continue; + } + IGeneratorCommand command = this.Create(type, cliCommand.Parameters, resolver); + foundCommands.Add(command); + } + if (!allCommandsFound) + { + GeneratorErrors.CommandDocumentationHint(); + } + return foundCommands; + } + + private IGeneratorCommand Create(Type type, IEnumerable? parameters = null, IDependencyResolver? resolver = null) + { + resolver ??= resolverFallback.CloneForCommand(); + List globalParameters = resolver.Get().Parameters; + parameters ??= []; + IGeneratorCommand command = (IGeneratorCommand)resolver.Create(type); + command.OriginalParameters = parameters.Concat(globalParameters).ToList(); + return command; + } + + public IEnumerable CreatePrepareCommands() + { + return this.prepareCommands.Select(type => (IPrepareCommand)this.Create(type)); + } +} \ No newline at end of file diff --git a/Core/Command/GeneratorCommandParameters.cs b/Common/Command/GeneratorCommandParameters.cs similarity index 59% rename from Core/Command/GeneratorCommandParameters.cs rename to Common/Command/GeneratorCommandParameters.cs index 5529999b..9bf5ccd7 100644 --- a/Core/Command/GeneratorCommandParameters.cs +++ b/Common/Command/GeneratorCommandParameters.cs @@ -2,6 +2,12 @@ { public class GeneratorCommandParameters { + [GeneratorGlobalParameter] + public string Project { get; set; } + + [GeneratorGlobalParameter] + public string Solution { get; set; } + [GeneratorGlobalParameter] public string Output { get; set; } @@ -20,21 +26,24 @@ public class GeneratorCommandParameters public bool? IsAsyncAssembly { get; set; } [GeneratorGlobalParameter] - public bool SkipHeader { get; set; } + public bool? NoHeader { get; set; } [GeneratorGlobalParameter] public bool VerifySsl { get; set; } [GeneratorGlobalParameter] public bool SkipAsyncCheck { get; set; } + + [GeneratorGlobalParameter] + public bool Force { get; set; } public string Assembly { get; set; } public string RelativePath { get; set; } - public bool SkipNamespace { get; set; } = true; - public bool PropertiesToFields { get; set; } = true; - public bool FieldsToProperties { get; set; } - public bool PreferInterfaces { get; set; } - public bool WithOptionalProperties { get; set; } - public bool FormatNames { get; set; } = true; + public bool? SkipNamespace { get; set; } + public bool? PropertiesToFields { get; set; } + public bool? FieldsToProperties { get; set; } + public bool? PreferInterfaces { get; set; } + public bool? WithOptionalProperties { get; set; } + public bool? FormatNames { get; set; } } } diff --git a/Common/Command/GeneratorCommandRunner.cs b/Common/Command/GeneratorCommandRunner.cs new file mode 100644 index 00000000..55c1a517 --- /dev/null +++ b/Common/Command/GeneratorCommandRunner.cs @@ -0,0 +1,72 @@ +using KY.Generator.Extensions; +using KY.Generator.Output; +using KY.Generator.Statistics; + +namespace KY.Generator.Command; + +public class GeneratorCommandRunner(IOutput output, StatisticsService statisticsService) +{ + public IGeneratorCommandResult Run(IEnumerable commands) + { + List list = commands.ToList(); + IGeneratorCommandResult? result = null; + list.ForEach(command => command.Prepare()); + foreach (IGeneratorCommand command in list) + { + result = this.Run(command); + if (!result.Success) + { + return result; + } + } + return result ?? new SuccessResult(); + } + + public IGeneratorCommandResult Run(IGeneratorCommand command) + { + if (!string.IsNullOrEmpty(command.Parameters.Output)) + { + output.Move(command.Parameters.Output); + } + if (!command.Parameters.SkipAsyncCheck) + { + if (!command.Parameters.IsOnlyAsync && command.Parameters.IsAsync) + { + return new SwitchAsyncResult(); + } + bool? isAssemblyAsync = command.Parameters.IsAsyncAssembly; + if (!command.Parameters.IsAsync) + { + if (!string.IsNullOrEmpty(command.Parameters.Assembly)) + { + LocateAssemblyResult locateAssemblyResult = GeneratorAssemblyLocator.Locate(command.Parameters.Assembly, command.Parameters.IsBeforeBuild); + if (locateAssemblyResult.SwitchContext) + { + return locateAssemblyResult; + } + isAssemblyAsync = locateAssemblyResult.Assembly?.IsAsync(); + } + } + if (isAssemblyAsync != null) + { + if (!command.Parameters.IsOnlyAsync && isAssemblyAsync.Value) + { + return new SwitchAsyncResult(); + } + if (command.Parameters.IsOnlyAsync && !command.Parameters.IsAsync && !isAssemblyAsync.Value) + { + return new SwitchAsyncResult(); + } + } + } + Measurement measurement = statisticsService.StartMeasurement(); + try + { + return command.Run(); + } + finally + { + statisticsService.Measure(measurement, command); + } + } +} diff --git a/Core/Command/GeneratorGlobalParameterAttribute.cs b/Common/Command/GeneratorGlobalParameterAttribute.cs similarity index 100% rename from Core/Command/GeneratorGlobalParameterAttribute.cs rename to Common/Command/GeneratorGlobalParameterAttribute.cs diff --git a/Core/Command/GeneratorParameterAttribute.cs b/Common/Command/GeneratorParameterAttribute.cs similarity index 100% rename from Core/Command/GeneratorParameterAttribute.cs rename to Common/Command/GeneratorParameterAttribute.cs diff --git a/Common/Command/IGeneratorCommand.cs b/Common/Command/IGeneratorCommand.cs new file mode 100644 index 00000000..086ea773 --- /dev/null +++ b/Common/Command/IGeneratorCommand.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; + +namespace KY.Generator.Command; + +public interface IGeneratorCommand +{ + GeneratorCommandParameters Parameters { get; } + List OriginalParameters { get; set; } + + bool Parse(); + void Prepare(); + void FollowUp(); + IGeneratorCommandResult Run(); +} diff --git a/Core/Command/IGeneratorCommandResult.cs b/Common/Command/IGeneratorCommandResult.cs similarity index 100% rename from Core/Command/IGeneratorCommandResult.cs rename to Common/Command/IGeneratorCommandResult.cs diff --git a/Common/Command/IPrepareCommand.cs b/Common/Command/IPrepareCommand.cs new file mode 100644 index 00000000..8cf296f5 --- /dev/null +++ b/Common/Command/IPrepareCommand.cs @@ -0,0 +1,6 @@ +namespace KY.Generator.Command; + +public interface IPrepareCommand : IGeneratorCommand +{ + +} diff --git a/Core/Command/SuccessResult.cs b/Common/Command/SuccessResult.cs similarity index 100% rename from Core/Command/SuccessResult.cs rename to Common/Command/SuccessResult.cs diff --git a/Core/Command/SwitchAsyncResult.cs b/Common/Command/SwitchAsyncResult.cs similarity index 100% rename from Core/Command/SwitchAsyncResult.cs rename to Common/Command/SwitchAsyncResult.cs diff --git a/Core/Command/SwitchContextResult.cs b/Common/Command/SwitchContextResult.cs similarity index 100% rename from Core/Command/SwitchContextResult.cs rename to Common/Command/SwitchContextResult.cs diff --git a/Common/Commands/CleanupCommand.cs b/Common/Commands/CleanupCommand.cs new file mode 100644 index 00000000..2ed75ae6 --- /dev/null +++ b/Common/Commands/CleanupCommand.cs @@ -0,0 +1,28 @@ +using KY.Generator.Command; +using KY.Generator.Statistics; + +namespace KY.Generator.Commands; + +public class CleanupCommand : GeneratorCommand +{ + private readonly StatisticsService statisticsService; + public static string[] Names { get; } = [ToCommand(nameof(CleanupCommand)), "cleanup"]; + + public CleanupCommand(StatisticsService statisticsService) + { + this.statisticsService = statisticsService; + } + + public override IGeneratorCommandResult Run() + { + if (this.Parameters.Logs) + { + // TODO: Cleanup logs + } + if (this.Parameters.Statistics) + { + this.statisticsService.Cleanup(); + } + return this.Success(); + } +} diff --git a/Common/Commands/CleanupCommandParameters.cs b/Common/Commands/CleanupCommandParameters.cs new file mode 100644 index 00000000..5e5f3499 --- /dev/null +++ b/Common/Commands/CleanupCommandParameters.cs @@ -0,0 +1,10 @@ +using KY.Generator.Command; + +namespace KY.Generator.Commands +{ + public class CleanupCommandParameters : GeneratorCommandParameters + { + public bool Logs { get; set; } = true; + public bool Statistics { get; set; } = true; + } +} diff --git a/Common/Commands/GetLicenseCommand.cs b/Common/Commands/GetLicenseCommand.cs new file mode 100644 index 00000000..0c10f613 --- /dev/null +++ b/Common/Commands/GetLicenseCommand.cs @@ -0,0 +1,23 @@ +using KY.Core; +using KY.Generator.Command; +using KY.Generator.Settings; + +namespace KY.Generator.Commands; + +internal class GetLicenseCommand : GeneratorCommand +{ + private readonly GlobalSettingsService globalSettingsService; + public static string[] Names { get; } = [ToCommand(nameof(GetLicenseCommand)), "get-license", "l"]; + + public GetLicenseCommand(GlobalSettingsService globalSettingsService) + { + this.globalSettingsService = globalSettingsService; + } + + public override IGeneratorCommandResult Run() + { + Logger.Trace("Execute license command..."); + Logger.Trace("Current license id: " + this.globalSettingsService.Read().License); + return this.Success(); + } +} diff --git a/Common/Commands/GetLicenseCommandParameters.cs b/Common/Commands/GetLicenseCommandParameters.cs new file mode 100644 index 00000000..06fdb38e --- /dev/null +++ b/Common/Commands/GetLicenseCommandParameters.cs @@ -0,0 +1,7 @@ +using KY.Generator.Command; + +namespace KY.Generator.Commands; + +internal class GetLicenseCommandParameters : GeneratorCommandParameters +{ +} \ No newline at end of file diff --git a/Common/Commands/OptionsCommand.cs b/Common/Commands/OptionsCommand.cs new file mode 100644 index 00000000..4fcefbaf --- /dev/null +++ b/Common/Commands/OptionsCommand.cs @@ -0,0 +1,48 @@ +using KY.Core; +using KY.Generator.Command; +using KY.Generator.Settings; +using KY.Generator.Statistics; + +namespace KY.Generator.Commands; + +internal class OptionsCommand : GeneratorCommand +{ + private readonly StatisticsService statisticsService; + private readonly GlobalStatisticsService globalStatisticsService; + private readonly GlobalSettingsService globalSettingsService; + public static string[] Names { get; } = [ToCommand(nameof(OptionsCommand)), "set"]; + + public OptionsCommand(StatisticsService statisticsService, GlobalStatisticsService globalStatisticsService, GlobalSettingsService globalSettingsService) + { + this.statisticsService = statisticsService; + this.globalStatisticsService = globalStatisticsService; + this.globalSettingsService = globalSettingsService; + } + + public override IGeneratorCommandResult Run() + { + if ("statistics".Equals(this.Parameters.Option, StringComparison.CurrentCultureIgnoreCase)) + { + List ids = this.globalStatisticsService.GetIds(); + if ("disable".Equals(this.Parameters.Value, StringComparison.CurrentCultureIgnoreCase)) + { + this.statisticsService.Disable(ids); + } + else if ("enable".Equals(this.Parameters.Value, StringComparison.CurrentCultureIgnoreCase)) + { + this.statisticsService.Enable(ids); + } + else + { + Logger.Error($"Invalid value '{this.Parameters.Value}' for option '{this.Parameters.Option}'. Valid values are 'enable' or 'disable'"); + return this.Error(); + } + } + else + { + Logger.Error($"Unknown option \"{this.Parameters.Option}\" found."); + return this.Error(); + } + return this.Success(); + } +} diff --git a/Common/Commands/OptionsCommandParameters.cs b/Common/Commands/OptionsCommandParameters.cs new file mode 100644 index 00000000..7ace1d40 --- /dev/null +++ b/Common/Commands/OptionsCommandParameters.cs @@ -0,0 +1,10 @@ +using KY.Generator.Command; + +namespace KY.Generator.Commands +{ + internal class OptionsCommandParameters : GeneratorCommandParameters + { + public string Option { get; set; } + public string Value { get; set; } + } +} diff --git a/Common/Commands/ReadProjectCommand.cs b/Common/Commands/ReadProjectCommand.cs new file mode 100644 index 00000000..2b774b47 --- /dev/null +++ b/Common/Commands/ReadProjectCommand.cs @@ -0,0 +1,92 @@ +using System.Diagnostics; +using KY.Core; +using KY.Core.DataAccess; +using KY.Core.Dependency; +using KY.Generator.Command; +using KY.Generator.Models; + +namespace KY.Generator.Commands; + +internal class ReadProjectCommand(IDependencyResolver resolver) : GeneratorCommand, IPrepareCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(ReadProjectCommand)), "read-project", "readProject", "readid"]; + + public override IGeneratorCommandResult Run() + { + string projectFileName = FileSystem.GetFileName(this.Parameters.Project); + VisualStudioParser parser = new(); + VisualStudioSolutionProject project = parser.ParseProject(this.Parameters.Project); + if (project == null || project.Id == Guid.Empty) + { + VisualStudioSolution solution = parser.ParseSolution(this.Parameters.Solution) ?? this.FindSolution(parser); + VisualStudioSolutionProject solutionProject = solution?.Projects.FirstOrDefault(x => x.Path.EndsWith(projectFileName)); + if (project == null) + { + project = solutionProject; + } + else + { + project.Id = solutionProject?.Id ?? Guid.Empty; + } + } + if (project != null && project.Id == Guid.Empty) + { + project.Id = Guid.NewGuid(); + Logger.Warning("Project has no id and solution could not be found. A new id was generated and set to project."); + parser.SetProjectGuid(this.Parameters.Project, project.Id); + } + if (project != null && project.Name == null) + { + project.Name = projectFileName.Replace(Path.GetExtension(projectFileName), string.Empty); + } + if (project == null || project.Id == Guid.Empty) + { + Logger.Warning($"Can not read project id. No solution for project '{this.Parameters.Project}' found. Automatic file cleanup deactivated!"); + return this.Success(); + } + IEnvironment environment = resolver.Get(); + environment.OutputId = project.Id; + environment.Name = project.Name; + Options.GetGlobal().Nullable = project.Nullable ?? false; + AssemblyCache assemblyCache = resolver.Get(); + assemblyCache.LoadLocal(this.Parameters.Project); + + return this.Success().ForceRerunOnAsync(); + } + + private VisualStudioSolution FindSolution(VisualStudioParser parser, int levelToGoUp = 3) + { + Stopwatch stopwatch = new(); + stopwatch.Start(); + try + { + string projectFileName = FileSystem.GetFileName(this.Parameters.Project); + string solutionDirectory = this.Parameters.Project; + while (levelToGoUp > 0) + { + solutionDirectory = FileSystem.Parent(solutionDirectory); + string[] solutionFiles = FileSystem.GetFiles(solutionDirectory, "*.sln"); + foreach (string solutionFile in solutionFiles) + { + VisualStudioSolution solution = parser.ParseSolution(solutionFile); + if (solution.Projects.Any(x => x.Path.EndsWith(projectFileName))) + { + return solution; + } + } + levelToGoUp--; + } + } + catch (Exception exception) + { + Logger.Warning($"Can not find solution for project '{this.Parameters.Project}'. {exception.Message}"); + } + finally + { + stopwatch.Stop(); + Logger.Trace($"Searching for solution in {(stopwatch.ElapsedMilliseconds >= 1 ? stopwatch.ElapsedMilliseconds.ToString() : "<1")} ms"); + Logger.Trace("To skip the previous step, build the solution instead the project or set a in the project file."); + } + return null; + } +} diff --git a/Common/Commands/ReadProjectCommandParameters.cs b/Common/Commands/ReadProjectCommandParameters.cs new file mode 100644 index 00000000..80b3997c --- /dev/null +++ b/Common/Commands/ReadProjectCommandParameters.cs @@ -0,0 +1,8 @@ +using KY.Generator.Command; + +namespace KY.Generator.Commands +{ + internal class ReadProjectCommandParameters : GeneratorCommandParameters + { + } +} diff --git a/Common/Commands/StatisticsCommand.cs b/Common/Commands/StatisticsCommand.cs new file mode 100644 index 00000000..3e8ce64a --- /dev/null +++ b/Common/Commands/StatisticsCommand.cs @@ -0,0 +1,39 @@ +using KY.Generator.Command; +using KY.Generator.Settings; +using KY.Generator.Statistics; + +namespace KY.Generator.Commands; + +internal class StatisticsCommand : GeneratorCommand +{ + private readonly GlobalStatisticsService globalStatisticsService; + private readonly StatisticsService statisticsService; + private readonly GlobalSettingsService globalSettingsService; + public static string[] Names { get; } = [ToCommand(nameof(StatisticsCommand)), "statistics", "statistic", "stats", "stat"]; + + public StatisticsCommand(GlobalStatisticsService globalStatisticsService, StatisticsService statisticsService, GlobalSettingsService globalSettingsService) + { + this.globalStatisticsService = globalStatisticsService; + this.statisticsService = statisticsService; + this.globalSettingsService = globalSettingsService; + } + + public override IGeneratorCommandResult Run() + { + Statistic statistic = this.statisticsService.Read(this.Parameters.File); + if (statistic == null) + { + return this.Success(); + } + this.globalStatisticsService.Read(); + this.globalStatisticsService.Append(statistic); + this.globalStatisticsService.Write(); + if (this.globalSettingsService.Read().StatisticsEnabled) + { + this.statisticsService.Anonymize(statistic); + this.statisticsService.Submit(statistic); + } + this.statisticsService.Delete(this.Parameters.File); + return this.Success(); + } +} diff --git a/Common/Commands/StatisticsCommandParameters.cs b/Common/Commands/StatisticsCommandParameters.cs new file mode 100644 index 00000000..088db8ca --- /dev/null +++ b/Common/Commands/StatisticsCommandParameters.cs @@ -0,0 +1,9 @@ +using KY.Generator.Command; + +namespace KY.Generator.Commands +{ + internal class StatisticsCommandParameters : GeneratorCommandParameters + { + public string File { get; set; } + } +} \ No newline at end of file diff --git a/Common/Commands/VersionCommand.cs b/Common/Commands/VersionCommand.cs new file mode 100644 index 00000000..1660da6c --- /dev/null +++ b/Common/Commands/VersionCommand.cs @@ -0,0 +1,21 @@ +using KY.Core; +using KY.Generator.Command; + +namespace KY.Generator.Commands; + +internal class VersionCommand : GeneratorCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(VersionCommand)), "version", "v"]; + + public override IGeneratorCommandResult Run() + { + Logger.Trace("Execute version command..."); + Logger.Trace("Loaded assemblies:"); + + AppDomain.CurrentDomain.GetAssemblies() + .Select(x => x.GetName()) + .OrderBy(x => x.Name) + .ForEach(x => Logger.Trace($"{x.Name} {x.Version} {(this.Parameters.ShowDetailed ? x.CodeBase.TrimStart("file:///") : "")}")); + return this.Success(); + } +} diff --git a/Core/Commands/VersionCommandParameters.cs b/Common/Commands/VersionCommandParameters.cs similarity index 100% rename from Core/Commands/VersionCommandParameters.cs rename to Common/Commands/VersionCommandParameters.cs diff --git a/Core/Configurations/CookieConfiguration.cs b/Common/Configurations/CookieConfiguration.cs similarity index 53% rename from Core/Configurations/CookieConfiguration.cs rename to Common/Configurations/CookieConfiguration.cs index 394c24b9..9edaaef0 100644 --- a/Core/Configurations/CookieConfiguration.cs +++ b/Common/Configurations/CookieConfiguration.cs @@ -1,15 +1,11 @@ -using KY.Generator.Configuration; - -namespace KY.Generator.Configurations +namespace KY.Generator.Configurations { - public class CookieConfiguration : ConfigurationBase + public class CookieConfiguration { - public override bool RequireLanguage => false; - public string Url { get; set; } public string Name { get; set; } public string Value { get; set; } public string Path { get; set; } public string Domain { get; set; } } -} \ No newline at end of file +} diff --git a/Core/Configurations/ExecuteConfiguration.cs b/Common/Configurations/ExecuteConfiguration.cs similarity index 60% rename from Core/Configurations/ExecuteConfiguration.cs rename to Common/Configurations/ExecuteConfiguration.cs index 9c7320be..3d3f908a 100644 --- a/Core/Configurations/ExecuteConfiguration.cs +++ b/Common/Configurations/ExecuteConfiguration.cs @@ -1,7 +1,7 @@ namespace KY.Generator.Configurations { - public class ExecuteConfiguration : ReadConfigurationBase + public class ExecuteConfiguration { public string File { get; set; } } -} \ No newline at end of file +} diff --git a/Common/Configurations/IModelConfiguration.cs b/Common/Configurations/IModelConfiguration.cs new file mode 100644 index 00000000..69f64144 --- /dev/null +++ b/Common/Configurations/IModelConfiguration.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; + +namespace KY.Generator.Configurations +{ + public interface IModelConfiguration + { + string Name { get; set; } + string Namespace { get; } + string RelativePath { get; } + List Usings { get; } + } +} diff --git a/Common/Configurations/ModelWriteConfiguration.cs b/Common/Configurations/ModelWriteConfiguration.cs new file mode 100644 index 00000000..d98bb166 --- /dev/null +++ b/Common/Configurations/ModelWriteConfiguration.cs @@ -0,0 +1,17 @@ +using System.Collections.Generic; + +namespace KY.Generator.Configurations +{ + public class ModelWriteConfiguration : IModelConfiguration + { + public string Name { get; set; } + public string Namespace { get; set; } + public string RelativePath { get; set; } + public List Usings { get; set; } + + public ModelWriteConfiguration() + { + this.Usings = new List(); + } + } +} diff --git a/Common/CoreModule.cs b/Common/CoreModule.cs new file mode 100644 index 00000000..9d455f5e --- /dev/null +++ b/Common/CoreModule.cs @@ -0,0 +1,37 @@ +using System.Collections.Generic; +using System.Runtime.CompilerServices; +using KY.Core.Dependency; +using KY.Core.Module; +using KY.Generator.Command; +using KY.Generator.Commands; +using KY.Generator.Languages; + +[assembly: InternalsVisibleTo("KY.Generator.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Common.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Reflection.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Csharp.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Json.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.TypeScript.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.AspDotNet.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.OData.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Tsql.Tests")] +[assembly: InternalsVisibleTo("KY.Generator.Angular.Tests")] + +namespace KY.Generator; + +internal class CoreModule : ModuleBase +{ + public CoreModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) + { + this.DependencyResolver.Get().Register(VersionCommand.Names); + this.DependencyResolver.Get().Register(ReadProjectCommand.Names); + this.DependencyResolver.Get().Register(StatisticsCommand.Names); + this.DependencyResolver.Get().Register(OptionsCommand.Names); + this.DependencyResolver.Get().Register(CleanupCommand.Names); + this.DependencyResolver.Get().Register(GetLicenseCommand.Names); + this.DependencyResolver.Bind().To(); + this.DependencyResolver.Bind().ToSingleton(); + Options.Register(() => this.DependencyResolver.Get>()); + } +} diff --git a/Common/DEPRECATED.md b/Common/DEPRECATED.md new file mode 100644 index 00000000..fca627d3 --- /dev/null +++ b/Common/DEPRECATED.md @@ -0,0 +1,9 @@ +# KY.Generator ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) + +[Documentation](https://generator.ky-programming.de) | [Getting Started](https://generator.ky-programming.de/start) | [Supported Platforms](https://generator.ky-programming.de/start/platforms) | [Need Help?](https://generator.ky-programming.de/start/help) + +## This package is DEPRECATED! +Use the new [KY.Generator](https://www.nuget.org/packages/KY.Generator/) ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) package + +## Read More +For complete overview see our [documentation](https://generator.ky-programming.de) diff --git a/Core/Extensions/AssemblyExtension.cs b/Common/Extensions/AssemblyExtension.cs similarity index 100% rename from Core/Extensions/AssemblyExtension.cs rename to Common/Extensions/AssemblyExtension.cs diff --git a/Common/Extensions/DependencyResolverExtension.cs b/Common/Extensions/DependencyResolverExtension.cs new file mode 100644 index 00000000..bc63b745 --- /dev/null +++ b/Common/Extensions/DependencyResolverExtension.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using KY.Core.Dependency; +using KY.Generator.Transfer; + +namespace KY.Generator; + +public static class DependencyResolverExtension +{ + public static IDependencyResolver CloneForCommand(this IDependencyResolver resolver) + { + DependencyResolver newResolver = new(resolver); + newResolver.Bind().ToSingleton(); + newResolver.Bind>().To([]); + return newResolver; + } +} \ No newline at end of file diff --git a/Common/Extensions/FileNameReplacerExtension.cs b/Common/Extensions/FileNameReplacerExtension.cs new file mode 100644 index 00000000..28b620ca --- /dev/null +++ b/Common/Extensions/FileNameReplacerExtension.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Linq; +using KY.Generator.Models; + +namespace KY.Generator.Extensions +{ + public static class FileNameReplacerExtension + { + public static FileNameReplacer Get(this IReadOnlyList list, string key) + { + return list.FirstOrDefault(item => item.Key == key); + } + + public static FileNameReplacer SetPattern(this FileNameReplacer replacer, string pattern) + { + replacer.Pattern = pattern; + return replacer; + } + + public static FileNameReplacer SetReplacement(this FileNameReplacer replacer, string replacement) + { + replacer.Replacement = replacement; + return replacer; + } + + public static FileNameReplacer SetMatchingType(this FileNameReplacer replacer, string matchingType) + { + replacer.MatchingType = matchingType; + return replacer; + } + } +} diff --git a/Common/Extensions/FileTemplateExtension.cs b/Common/Extensions/FileTemplateExtension.cs new file mode 100644 index 00000000..c007f462 --- /dev/null +++ b/Common/Extensions/FileTemplateExtension.cs @@ -0,0 +1,24 @@ +using System.Collections.Generic; +using KY.Core; +using KY.Core.Dependency; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator; + +public static class FileTemplateExtension +{ + public static void Write(this IEnumerable files, IOutput output, IDependencyResolver resolver) + { + files.ForEach(file => file.Write(output, resolver)); + } + + public static void Write(this FileTemplate file, IOutput output, IDependencyResolver resolver) + { + // Logger.Trace($"Start generate file {file.Name}"); + FileWriter writer = resolver.Create(file.Options); + writer.Add(file); + output.Write(file.FullPath, writer.ToString(), file.Options, !file.WriteOutputId, file.ForceOverwrite); + // Logger.Trace($"Finish generate file {file.Name}"); + } +} diff --git a/Core/Extensions/FrameworkNameExtension.cs b/Common/Extensions/FrameworkNameExtension.cs similarity index 61% rename from Core/Extensions/FrameworkNameExtension.cs rename to Common/Extensions/FrameworkNameExtension.cs index fcfc7878..29a1f613 100644 --- a/Core/Extensions/FrameworkNameExtension.cs +++ b/Common/Extensions/FrameworkNameExtension.cs @@ -24,7 +24,23 @@ public static SwitchableFramework GetSwitchableFramework(this FrameworkName targ { return SwitchableFramework.Net5; } + if (targetFramework.IsCore() && targetFramework.Version.Major == 6) + { + return SwitchableFramework.Net6; + } + if (targetFramework.IsCore() && targetFramework.Version.Major == 7) + { + return SwitchableFramework.Net7; + } + if (targetFramework.IsCore() && targetFramework.Version.Major == 8) + { + return SwitchableFramework.Net8; + } + if (targetFramework.IsCore() && targetFramework.Version.Major == 9) + { + return SwitchableFramework.Net9; + } return SwitchableFramework.None; } } -} \ No newline at end of file +} diff --git a/Common/Extensions/StringExtensions.cs b/Common/Extensions/StringExtensions.cs new file mode 100644 index 00000000..ad5f9561 --- /dev/null +++ b/Common/Extensions/StringExtensions.cs @@ -0,0 +1,114 @@ +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.Extension; + +namespace KY.Generator.Extensions; + +public static class StringExtensions +{ + public static string ToPascalCase(this string value, string allowedCharacters = "") + { + return string.Join("", Split(value, allowedCharacters).Select(x => x.FirstCharToUpper())); + } + + public static string ToCamelCase(this string value, string allowedCharacters = "") + { + return string.Join("", Split(value, allowedCharacters).Select(x => x.FirstCharToUpper())).FirstCharToLower(); + } + + public static string ToKebabCase(this string value, string allowedCharacters = "") + { + return string.Join("-", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant())); + } + + public static string ToSnakeCase(this string value, string allowedCharacters = "") + { + return string.Join("_", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant())); + } + + public static string ToDarwinCase(this string value, string allowedCharacters = "") + { + return string.Join("_", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant().FirstCharToUpper())); + } + + public static string ToAspDotNetCompatibleFirstLowerCase(this string value) + { + Match match = new Regex(@"^(?[A-Z]*)(?[A-Z])(?.*)$").Match(value); + if (!match.Success) + { + return value; + } + if (match.Groups["else"].Length == 0) + { + return value.ToLowerInvariant(); + } + if (match.Groups["upper"].Length == 0) + { + return match.Groups["special"].Value.ToLowerInvariant() + match.Groups["else"].Value; + } + return match.Groups["upper"].Value.ToLowerInvariant() + match.Groups["special"].Value + match.Groups["else"].Value; + } + + private static IEnumerable Split(string value, string allowedCharacters) + { + if (value.ToUpperInvariant() == value) + { + value = value.ToLowerInvariant(); + } + List matches = Regex.Matches(value, @"([a-z]+|[A-Z]+|[0-9]+|[^a-zA-Z0-9]+)").Cast().Select(x => x.Value) + .Where(x => Regex.IsMatch(x, $"^[a-zA-Z0-9{Regex.Escape(allowedCharacters ?? string.Empty)}]+$")) + .ToList(); + string transfer = string.Empty; + for (int index = 0; index < matches.Count; index++) + { + string match = transfer + matches[index]; + transfer = string.Empty; + bool allUpper = match.ToUpperInvariant() == match; + bool nextAllLower = matches.Count > index + 1 && matches[index + 1].ToLowerInvariant() == matches[index + 1]; + if (allUpper && nextAllLower) + { + if (match.Length == 1) + { + match = match + matches[index + 1]; + index++; + } + else + { + transfer = match.Substring(match.Length - 1, 1); + match = match.Substring(0, match.Length - 1); + } + } + yield return match; + } + } + + public static int IndexOf(this string value, Regex regex) + { + return regex.Match(value).Index; + } + + public static string Prefix(this string value, string prefix) + { + if (string.IsNullOrEmpty(value) || string.IsNullOrEmpty(prefix)) + { + return value; + } + if (!value.StartsWith(prefix)) + { + return prefix + value; + } + CaseType firstCharCase = value[0].GetCaseType(); + CaseType secondCharCase = value[1].GetCaseType(); + CaseType prefixCase = prefix[0].GetCaseType(); + if (firstCharCase != prefixCase || firstCharCase != secondCharCase) + { + return prefix + value; + } + return value; + } + + public static string Replace(this string value, IReadOnlyDictionary? replaceName) + { + return replaceName == null ? value : replaceName.Aggregate(value, (current, pair) => current.Replace(pair.Key, pair.Value)); + } +} diff --git a/Common/Extensions/SwitchableFrameworkExtension.cs b/Common/Extensions/SwitchableFrameworkExtension.cs new file mode 100644 index 00000000..7f31cbf5 --- /dev/null +++ b/Common/Extensions/SwitchableFrameworkExtension.cs @@ -0,0 +1,13 @@ +using System.Reflection; +using KY.Generator.Models; + +namespace KY.Generator.Extensions; + +public static class SwitchableFrameworkExtension +{ + public static string? FrameworkName(this SwitchableFramework framework) + { + FieldInfo memberInfos = framework.GetType().GetField(framework.ToString()); + return memberInfos?.GetCustomAttribute()?.Name; + } +} diff --git a/Common/Extensions/TimeSpanExtension.cs b/Common/Extensions/TimeSpanExtension.cs new file mode 100644 index 00000000..1f04a3f7 --- /dev/null +++ b/Common/Extensions/TimeSpanExtension.cs @@ -0,0 +1,20 @@ +using System; + +namespace KY.Generator.Extensions +{ + public static class TimeSpanExtension + { + public static string Format(this TimeSpan timeSpan) + { + if (timeSpan.TotalSeconds >= 1) + { + return $"{timeSpan.TotalSeconds:0.#} sec"; + } + if (timeSpan.TotalMilliseconds >= 1) + { + return $"{timeSpan.TotalMilliseconds:0} ms"; + } + return ">1 ms"; + } + } +} diff --git a/Core/Extensions/TypeExtension.cs b/Common/Extensions/TypeExtension.cs similarity index 87% rename from Core/Extensions/TypeExtension.cs rename to Common/Extensions/TypeExtension.cs index 8b67b34b..de4f4402 100644 --- a/Core/Extensions/TypeExtension.cs +++ b/Common/Extensions/TypeExtension.cs @@ -14,6 +14,10 @@ public static Type IgnoreGeneric(this Type type, string nameSpace, string typeNa public static Type IgnoreGeneric(this Type type, params Type[] typesToIgnore) { + if (typesToIgnore == null) + { + return type; + } bool isChanged = false; foreach (Type typeToIgnore in typesToIgnore) { @@ -30,7 +34,7 @@ public static Type IgnoreGeneric(this Type type, params Type[] typesToIgnore) public static Type IgnoreGeneric(this Type type, IEnumerable typesToIgnore) { - return type.IgnoreGeneric(typesToIgnore.ToArray()); + return type.IgnoreGeneric(typesToIgnore?.ToArray()); } } -} \ No newline at end of file +} diff --git a/Core/Extensions/TypeTransferObjectExtension.cs b/Common/Extensions/TypeTransferObjectExtension.cs similarity index 87% rename from Core/Extensions/TypeTransferObjectExtension.cs rename to Common/Extensions/TypeTransferObjectExtension.cs index 0f6484ed..d98cccdc 100644 --- a/Core/Extensions/TypeTransferObjectExtension.cs +++ b/Common/Extensions/TypeTransferObjectExtension.cs @@ -16,7 +16,7 @@ public static TypeTransferObject IgnoreNullable(this TypeTransferObject type) public static bool IsEnumerable(this TypeTransferObject type) { - return type.Name == "Array" || type.Name == "List" || type.Name == "IList" || type.Name == "IEnumerable" || type.Name == "ICollection"; + return type.Name == "Array" || type.Name == "List" || type.Name == "IList" || type.Name == "IEnumerable" || type.Name == "ICollection" || type.Name == "IReadOnlyList" || type.Name == "IReadOnlyCollection"; } } } diff --git a/Common/Generator.cs b/Common/Generator.cs new file mode 100644 index 00000000..6a2df566 --- /dev/null +++ b/Common/Generator.cs @@ -0,0 +1,432 @@ +using System.Diagnostics; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Versioning; +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.DataAccess; +using KY.Core.Dependency; +using KY.Core.Extension; +using KY.Core.Module; +using KY.Core.Nuget; +using KY.Generator.Command; +using KY.Generator.Commands; +using KY.Generator.Extensions; +using KY.Generator.Languages; +using KY.Generator.Licensing; +using KY.Generator.Mappings; +using KY.Generator.Models; +using KY.Generator.Output; +using KY.Generator.Settings; +using KY.Generator.Statistics; +using KY.Generator.Syntax; +using KY.Generator.Templates; +using KY.Generator.Transfer.Writers; + +namespace KY.Generator; + +public class Generator : IGeneratorRunSyntax +{ + private readonly IOutput output; + private readonly DependencyResolver resolver; + private readonly List commands = []; + private readonly GeneratorEnvironment environment = new(); + private readonly StatisticsService statisticsService; + private readonly LicenseService licenseService; + private readonly AssemblyCache assemblyCache; + private bool initializationFailed; + private readonly List initializationErrors = []; + + public Generator() + { + DateTime start = DateTime.Now; + Logger.Added += this.OnLoggerAdded; + Assembly callingAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly(); + FrameworkName framework = callingAssembly.GetTargetFramework(); + Logger.Trace($"KY-Generator v{callingAssembly.GetName().Version} ({framework.Identifier.Replace("App", string.Empty)} {framework.Version.Major}.{framework.Version.Minor})"); + Logger.Trace("Current Directory: " + Environment.CurrentDirectory); + Logger.Trace("Log Directory: " + Logger.File.Path); + + Stopwatch prepareEnvironmentStopwatch = new(); + prepareEnvironmentStopwatch.Start(); + this.PrepareEnvironment(); + prepareEnvironmentStopwatch.Stop(); + Logger.Trace($"Prepared environment in {prepareEnvironmentStopwatch.ElapsedMilliseconds} ms"); + + Stopwatch runtimeStopwatch = new(); + runtimeStopwatch.Start(); + this.assemblyCache = new AssemblyCache(this.environment); + runtimeStopwatch.Stop(); + Logger.Trace($"Installed runtimes searched in {runtimeStopwatch.ElapsedMilliseconds} ms"); + + NugetPackageDependencyLoader.Activate(this.assemblyCache); + NugetPackageDependencyLoader.ResolveDependencies(this.GetType().Assembly); + + this.resolver = new DependencyResolver(); + this.resolver.Bind().To(this.assemblyCache); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSelf(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSelf(); + this.resolver.Bind().To(this.environment); + this.output = new FileOutput(this.resolver.Get(), Environment.CurrentDirectory); + this.resolver.Bind().To(this.output); + this.resolver.Bind>().To([]); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSingleton(); + this.resolver.Bind().ToSingleton(); + this.licenseService = this.resolver.Get(); + this.licenseService.Check(); + + Logger.Added -= this.OnLoggerAdded; + this.statisticsService = this.resolver.Get(); + this.statisticsService.ProgramStart(start); + this.statisticsService.Data.Errors.AddRange(this.initializationErrors); + + ModuleFinder moduleFinder = this.resolver.Get(); + this.InitializeModules(moduleFinder.Modules); + } + + private void PrepareEnvironment() + { + try + { + FileSystem.CreateDirectory(this.environment.ApplicationData); + } + catch (Exception exception) + { + Logger.Error($"Could not prepare environment. Could not create directory {this.environment.ApplicationData}. {exception.Message}"); + this.initializationFailed = true; + } + try + { + FileSystem.CreateDirectory(this.environment.LocalApplicationData); + } + catch (Exception exception) + { + Logger.Error($"Could not prepare environment. Could not create directory {this.environment.LocalApplicationData}. {exception.Message}"); + this.initializationFailed = true; + } + } + + public static Generator Create() + { + return new Generator(); + } + + public Generator SharedAssemblies(string sharedPath) + { + NugetPackageDependencyLoader.Locations.Insert(0, new SearchLocation(sharedPath) /*.Local()*/.SearchOnlyLocal()); + return this; + } + + public Generator PreloadModules(string path, string? moduleFileNameSearchPattern = default) + { + ModuleFinder moduleFinder = this.resolver.Get(); + List loadedModules = moduleFinder.LoadFrom(path, moduleFileNameSearchPattern); + this.InitializeModules(loadedModules); + return this; + } + + public Generator PreloadModule() where T : ModuleBase + { + return this; + } + + public Generator SetOutput(string path) + { + this.output.Move(path); + return this; + } + + public Generator RegisterCommand(IEnumerable names) where T : IGeneratorCommand + { + this.resolver.Get().Register(names); + return this; + } + + public Generator RegisterCommand(Type command, IEnumerable names) + { + this.resolver.Get().Register(command, names); + return this; + } + + public IGeneratorRunSyntax ParseAttributes(string assemblyName) + { + Logger.Trace($"Read attributes from assembly {assemblyName}"); + throw new NotImplementedException(); + // List generatorCommands = this.resolver.Get().Create("RunByAttributes"); + // foreach (IGeneratorCommand command in generatorCommands) + // { + // command.Parse( + // new CliCommandParameter("assembly", assemblyName), + // new CliCommandParameter("SkipAsyncCheck", bool.TrueString) + // ); + // this.commands.Add(command); + // } + return this; + } + + public IGeneratorRunSyntax SetParameters(params string[] parameters) + { + if (parameters.Length == 0) + { + Logger.Error("No parameters found. Provide at least a command or a path to a configuration file. Generation aborted!"); + GeneratorErrors.CommandDocumentationHint(); + return this; + } + Logger.Trace("Parameters: " + string.Join(" ", parameters)); + + List commandsStringsWithParameters = []; + foreach (string parameter in parameters) + { + if (parameter.StartsWith("-*")) + { + this.environment.Parameters.Add(CliCommandParameter.Parse(parameter)); + parameter.Remove(parameter); + } + else + { + commandsStringsWithParameters.Add(parameter); + } + } + + List cliCommands = CliCommandReader.Read(commandsStringsWithParameters.ToArray()); + this.commands.AddRange(this.resolver.Get().Create(cliCommands)); + return this; + } + + public bool Run() + { + this.statisticsService.InitializationEnd(); + bool success = true; + try + { + if (this.initializationFailed) + { + success = false; + } + List languages = this.resolver.Get>(); + GeneratorCommand.AddParser(value => languages.FirstOrDefault(x => x.Name.Equals(value, StringComparison.CurrentCultureIgnoreCase))); + GeneratorCommandRunner runner = this.resolver.Get(); + List asyncCommands = []; + IGeneratorCommandResult? switchContext = null; + List files = []; + bool switchAsync = false; + this.commands.Sort((left, right) => left is IPrepareCommand && right is IPrepareCommand ? 0 : left is IPrepareCommand ? -1 : 1); + foreach (IGeneratorCommand command in this.commands) + { + command.Parse(); + command.Prepare(); + } + this.statisticsService.Data.IsMsBuild = this.statisticsService.Data.IsMsBuild || this.commands.Any(x => x.Parameters.IsMsBuild); + this.statisticsService.Data.IsBeforeBuild = this.statisticsService.Data.IsBeforeBuild || this.commands.Any(x => x.Parameters.IsBeforeBuild); + if (success || this.commands.Any(x => x.Parameters.Force)) + { + foreach (IGeneratorCommand command in this.commands) + { + IGeneratorCommandResult result = runner.Run(command); + success &= result.Success; + switchAsync = switchAsync || result.SwitchToAsync; + if (result.SwitchContext) + { + switchContext ??= result; + } + if (result.SwitchContext || result.SwitchToAsync || result.RerunOnAsync) + { + asyncCommands.Add(command); + } + } + this.statisticsService.RunEnd(this.environment.OutputId, this.environment.Name); + files = this.resolver.Get>(); + if (files.Count > 0) + { + this.licenseService.WaitOrKill(); + if (this.licenseService.IsValid) + { + Logger.Trace("Generate code..."); + files.Write(this.output, this.resolver); + this.statisticsService.GenerateEnd(this.output.Lines); + files.ForEach(file => this.statisticsService.Count(file)); + } + else if (this.licenseService.ValidUntil > DateTime.MinValue) + { + Logger.Error("License has expired. Ensure that https://generator.ky-programming.de is reachable or generate a new offline license at https://generator.ky-programming.de/license"); + Logger.Error("Generate code canceled!"); + success = false; + } + else + { + Logger.Error("No valid license found. Ensure that https://generator.ky-programming.de is reachable or generate an offline license at https://generator.ky-programming.de/license"); + Logger.Error("Generate code canceled!"); + success = false; + } + } + } + if (success) + { + this.output.Execute(); + this.commands.ForEach(command => command.FollowUp()); + } + else + { + this.statisticsService.RunFailed(); + } + this.assemblyCache.Save(); + if (switchAsync) + { + return this.SwitchToAsync(asyncCommands); + } + if (switchContext != null) + { + return this.SwitchContext(switchContext, asyncCommands); + } + this.statisticsService.ProgramEnd(files.Count); + this.licenseService.ShowMessages(); + } + catch (Exception exception) + { + Logger.Error(exception); + success = false; + } + if (!success) + { + string message = "\n\n>>> NEED HELP?\n" + + ">>> check https://generator.ky-programming.de\n" + + $">>> or contact support{(char)64}ky-programming.de\n\n"; + if (Logger.ErrorTargets.Contains(Logger.MsBuildOutput)) + { + message += $"\nSee the full log in: {Logger.File.Path}"; + } + Logger.Error(message); + } + try + { + if (this.commands.Any() && !this.commands.OfType().Any() && this.resolver.Get().Read().StatisticsEnabled) + { + string fileName = this.statisticsService.Write(); + this.resolver.Get().StartCalculation(fileName); + } + } + catch (Exception exception) + { + Logger.Error(exception); + } + Logger.Trace("==============================="); + return success; + } + + private void OnLoggerAdded(object sender, EventArgs args) + { + if (args.Value.Type != LogType.Trace) + { + this.initializationErrors.Add(args.Value.Message); + } + } + + private bool SwitchContext(IGeneratorCommandResult result, IEnumerable commandsToRun) + { + if (result.SwitchToArchitecture != null && !RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + // TODO: Check other possibilities to run x86 in not Windows environments + Logger.Error($"Can not start {result.SwitchToArchitecture} process. Your system does not support this process type."); + return false; + } + if (result.SwitchToArchitecture != null) + { + Logger.Trace($"Different assembly architecture found. Switching to {result.SwitchToArchitecture}..."); + } + if (result.SwitchToFramework != SwitchableFramework.None) + { + Logger.Trace($"Different assembly framework found. Switching to {result.SwitchToFramework}..."); + } + string location = Assembly.GetEntryAssembly()?.Location ?? throw new InvalidOperationException("No location found"); + Regex regex = new(@"(?[\\/])(?net[^\\/]+)[\\/]"); + Match match = regex.Match(location); + if (!match.Success) + { + throw new InvalidOperationException($"Invalid location {location}. Location has to include the framework to switch the context"); + } + string framework = match.Groups["framework"].Value; + string separator = match.Groups["separator"].Value; + string switchedFramework = (result.SwitchToFramework.FrameworkName() ?? framework) + + (result.SwitchToArchitecture != null ? $"-{result.SwitchToArchitecture.ToString().ToLower()}" : ""); + location = location.Replace(separator + framework + separator, separator + switchedFramework + separator); + string locationExe = location.Replace(".dll", ".exe"); + if (FileSystem.FileExists(location) || FileSystem.FileExists(locationExe)) + { + string arguments = string.Empty; + if (result.SwitchToArchitecture != null) + { + arguments += $" --switchedFromArchitecture=\"{result.SwitchToArchitecture}\""; + } + if (result.SwitchToFramework != SwitchableFramework.None) + { + arguments += $" --switchedFromFramework=\"{result.SwitchToFramework}\""; + } + Logger.Trace("==============================="); + Process process = GeneratorProcess.Start(location, commandsToRun, arguments); + process.WaitForExit(); + Logger.Trace($"{result.SwitchToArchitecture?.ToString() ?? result.SwitchToFramework.ToString()} process exited with code {process.ExitCode}"); + return process.ExitCode == 0; + } + Logger.Error($"Can not start {result.SwitchToArchitecture} process. File \"{location}\" not found. Try to update to .net Core Framework 3.0 or later."); + return false; + } + + private bool SwitchToAsync(IEnumerable commandsToRun) + { + Logger.Trace($"The generation is continued in a separate asynchronous process. You can find the output log here: {Logger.File.Path}"); + GeneratorProcess.StartHidden(commandsToRun, " -*only-async"); + return true; + } + + public static void InitializeLogger(string[] parameters) + { + Logger.CatchAll(); + Logger.Console.ShortenEntries = false; + Logger.AllTargets.Add(Logger.VisualStudioOutput); + if (parameters.Any(parameter => parameter.ToLowerInvariant().Contains("forwardlogging"))) + { + ForwardConsoleTarget target = new(); + Logger.AllTargets.Clear(); + Logger.AllTargets.Add(target); + Logger.TraceTargets.Clear(); + Logger.TraceTargets.Add(target); + Logger.ErrorTargets.Clear(); + Logger.ErrorTargets.Add(target); + } + if (parameters.Any(parameter => parameter?.EndsWith("msbuild", StringComparison.CurrentCultureIgnoreCase) ?? false)) + { + Logger.Trace("MsBuild trace mode activated"); + Logger.WarningTargets.Add(Logger.MsBuildOutput); + Logger.ErrorTargets.Add(Logger.MsBuildOutput); + Logger.WarningTargets.Remove(Logger.VisualStudioOutput); + Logger.ErrorTargets.Remove(Logger.VisualStudioOutput); + } + } + + private void InitializeModules(IEnumerable modules) + { + List list = modules.ToList(); + Dictionary stopwatches = list.ToDictionary(x => x, _ => new Stopwatch()); + this.statisticsService.Data.InitializedModules = list.Count; + foreach (ModuleBase module in list) + { + stopwatches[module].Start(); + this.resolver.Bind().To(module); + stopwatches[module].Stop(); + } + foreach (ModuleBase module in list) + { + Stopwatch stopwatch = stopwatches[module]; + stopwatch.Start(); + module.Initialize(); + stopwatch.Stop(); + Logger.Trace($"{module.GetType().Name.Replace("Module", "")}-{module.GetType().Assembly.GetName().Version} module loaded in {(stopwatch.ElapsedMilliseconds >= 1 ? stopwatch.ElapsedMilliseconds.ToString() : "<1")} ms"); + } + } +} diff --git a/Common/Helpers/AssemblyCache.cs b/Common/Helpers/AssemblyCache.cs new file mode 100644 index 00000000..4dc8c394 --- /dev/null +++ b/Common/Helpers/AssemblyCache.cs @@ -0,0 +1,107 @@ +using System.Collections.Generic; +using System.Linq; +using System.Runtime.InteropServices; +using KY.Core; +using KY.Core.Crypt; +using KY.Core.DataAccess; +using KY.Generator.Models; +using Newtonsoft.Json; + +namespace KY.Generator; + +public class AssemblyCache : IAssemblyCache +{ + private readonly string globalCacheFileName = "global-assembly-cache.json"; + private string localCacheFileName; + private readonly IEnvironment environment; + private Dictionary global = new(); + private Dictionary local = new(); + private readonly List globalPaths; + + public AssemblyCache(IEnvironment environment) + { + this.environment = environment; + this.LoadGlobal(); + this.globalPaths = InstalledRuntime.GetCurrent().Select(x => x.Path).ToList(); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + this.globalPaths.Add(NugetPackageDependencyLoader.WindowsNugetFallbackPath); + this.globalPaths.Add(NugetPackageDependencyLoader.WindowsNugetCachePath); + } + else + { + this.globalPaths.Add(NugetPackageDependencyLoader.LinuxNugetCachePath); + } + } + + public void Add(string name, string location) + { + if (name.StartsWith("KY.Generator")) + { + return; + } + if (this.globalPaths.Any(location.StartsWith)) + { + this.global[name] = location; + } + else + { + this.local[name] = location; + } + } + + public void LoadGlobal() + { + string fileName = FileSystem.Combine(this.environment.LocalApplicationData, this.globalCacheFileName); + if (FileSystem.FileExists(fileName)) + { + string json = FileSystem.ReadAllText(fileName); + this.global = JsonConvert.DeserializeObject>(json); + } + } + + public void LoadLocal(string projectFilePath) + { + if (projectFilePath == null) + { + return; + } + string hash = Sha1.Create(projectFilePath).ToString().Substring(0, 8); + this.localCacheFileName = $"{this.environment.Name}-{hash}-assembly-cache.json"; + string fileName = FileSystem.Combine(this.environment.LocalApplicationData, this.localCacheFileName); + if (FileSystem.FileExists(fileName)) + { + string json = FileSystem.ReadAllText(fileName); + this.local = JsonConvert.DeserializeObject>(json); + } + } + + public string Resolve(string name) + { + if (this.global.TryGetValue(name, out string globalLocation)) + { + Logger.Trace($"Assembly found in global assembly cache: {globalLocation}"); + return globalLocation; + } + if (this.local.TryGetValue(name, out string localLocation)) + { + Logger.Trace($"Assembly found in local assembly cache: {localLocation}"); + return localLocation; + } + return null; + } + + public void Save() + { + if (this.global.Count > 0) + { + string fileName = FileSystem.Combine(this.environment.LocalApplicationData, this.globalCacheFileName); + FileSystem.WriteAllText(fileName, JsonConvert.SerializeObject(this.global)); + } + if (this.local.Count > 0 && this.localCacheFileName != null) + { + string fileName = FileSystem.Combine(this.environment.LocalApplicationData, this.localCacheFileName); + FileSystem.WriteAllText(fileName, JsonConvert.SerializeObject(this.local)); + } + } +} diff --git a/Core/Helpers/Case.cs b/Common/Helpers/Case.cs similarity index 100% rename from Core/Helpers/Case.cs rename to Common/Helpers/Case.cs diff --git a/Core/Helpers/Code.cs b/Common/Helpers/Code.cs similarity index 100% rename from Core/Helpers/Code.cs rename to Common/Helpers/Code.cs diff --git a/Core/Helpers/Codeable.cs b/Common/Helpers/Codeable.cs similarity index 100% rename from Core/Helpers/Codeable.cs rename to Common/Helpers/Codeable.cs diff --git a/Common/Helpers/CommandLineHelper.cs b/Common/Helpers/CommandLineHelper.cs new file mode 100644 index 00000000..2166a671 --- /dev/null +++ b/Common/Helpers/CommandLineHelper.cs @@ -0,0 +1,78 @@ +using System.Diagnostics; +using System.Text; +using KY.Core; + +namespace KY.Generator +{ + public static class CommandLineHelper + { + public static bool RunWithTrace(StringBuilder commands) + { + return RunWithTrace(commands.ToString()); + } + + public static bool RunWithTrace(string commands) + { + return Run(commands, out string _); + } + + public static bool RunWithResult(string commands, out string result) + { + return Run(commands, out result, Mode.Output); + } + + private static bool Run(string commands, out string result, Mode mode = Mode.Trace) + { + StringBuilder errorBuilder = new(); + StringBuilder outputBuilder = new(); + Process cmd = new(); + cmd.StartInfo.FileName = "cmd.exe"; + cmd.StartInfo.Arguments = "/k"; + cmd.StartInfo.RedirectStandardInput = true; + cmd.StartInfo.RedirectStandardOutput = true; + cmd.StartInfo.RedirectStandardError = true; + cmd.StartInfo.CreateNoWindow = true; + cmd.StartInfo.UseShellExecute = false; + if (mode == Mode.Trace) + { + cmd.OutputDataReceived += (sender, args) => Logger.Trace(args.Data); + } + if (mode == Mode.Output) + { + commands = "@echo OFF\nset PROMPT=$+\n" + commands; + cmd.OutputDataReceived += (sender, args) => outputBuilder.AppendLine(args.Data); + } + cmd.ErrorDataReceived += (sender, args) => errorBuilder.AppendLine(args.Data); + cmd.Start(); + cmd.BeginOutputReadLine(); + cmd.BeginErrorReadLine(); + cmd.StandardInput.WriteLine(commands); + cmd.StandardInput.Flush(); + cmd.StandardInput.Close(); + cmd.WaitForExit(); + result = outputBuilder.ToString().Replace("\r", string.Empty); + int commandsIndex = result.IndexOf(commands.Replace("\r", string.Empty)); + if (commandsIndex >= 0) + { + int commandsEnd = commandsIndex + commands.Length; + result = result.Substring(commandsEnd, result.Length - commandsEnd).Trim(); + } + if (errorBuilder.Length > 0 && cmd.ExitCode != 0) + { + Logger.Error(errorBuilder.ToString()); + return false; + } + if (errorBuilder.Length > 0) + { + Logger.Warning(errorBuilder.ToString()); + } + return true; + } + + private enum Mode + { + Trace, + Output + } + } +} diff --git a/Core/Helpers/ExecutingCode.cs b/Common/Helpers/ExecutingCode.cs similarity index 97% rename from Core/Helpers/ExecutingCode.cs rename to Common/Helpers/ExecutingCode.cs index ed9a9e81..6ed30116 100644 --- a/Core/Helpers/ExecutingCode.cs +++ b/Common/Helpers/ExecutingCode.cs @@ -153,5 +153,10 @@ public static WhileTemplate While(this Code _, ICodeFragment condition, ICodeFra { return new WhileTemplate(condition, code); } + + public static ParenthesisTemplate Parenthesis(this Code _, ICodeFragment code) + { + return new ParenthesisTemplate(code); + } } } diff --git a/Common/Helpers/Formatter.cs b/Common/Helpers/Formatter.cs new file mode 100644 index 00000000..19607cc5 --- /dev/null +++ b/Common/Helpers/Formatter.cs @@ -0,0 +1,90 @@ +using System; +using KY.Core; +using KY.Generator.Extensions; +using KY.Generator.Models; + +namespace KY.Generator; + +public static class Formatter +{ + public static string FormatFile(string name, GeneratorOptions options, string type = null, bool force = true) + { + return options.Language?.FormatFile(name, options, type, force) ?? Format(name, options.Formatting.FileCase, options, force); + } + + public static string FormatClass(string name, GeneratorOptions options, bool force = false) + { + return Format(name, options.Formatting.ClassCase, options, force); + } + + public static string FormatField(string name, GeneratorOptions options, bool force = false) + { + return Format(name, options.Formatting.FieldCase, options, force, options.Formatting.CaseMode); + } + + public static string FormatProperty(string name, GeneratorOptions options, bool force = false) + { + return Format(name, options.Formatting.PropertyCase, options, force, options.Formatting.CaseMode); + } + + public static string FormatMethod(string name, GeneratorOptions options, bool force = false) + { + return Format(name, options.Formatting.MethodCase, options, force); + } + + public static string FormatParameter(string name, GeneratorOptions options, bool force = false) + { + return Format(name, options.Formatting.ParameterCase, options, force); + } + + public static string Format(string name, string casing, GeneratorOptions options, bool force = false, CaseMode mode = CaseMode.Fix) + { + if (options.FormatNames || force) + { + return Format(name, casing, options, mode); + } + return name; + } + + public static string Format(string name, string casing, GeneratorOptions options, CaseMode mode) + { + casing.AssertIsNotNullOrEmpty(nameof(casing)); + if (options.Language.ReservedKeywords.ContainsKey(name)) + { + name = options.Language.ReservedKeywords[name]; + } + if (mode == CaseMode.AspDotNetCompatible) + { + return name?.ToAspDotNetCompatibleFirstLowerCase(); + } + if (casing.Equals(Case.CamelCase, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.ToCamelCase(options.Formatting.AllowedSpecialCharacters); + } + if (casing.Equals(Case.PascalCase, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.ToPascalCase(options.Formatting.AllowedSpecialCharacters); + } + if (casing.Equals(Case.KebabCase, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.ToKebabCase(options.Formatting.AllowedSpecialCharacters); + } + if (casing.Equals(Case.SnakeCase, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.ToSnakeCase(options.Formatting.AllowedSpecialCharacters); + } + if (casing.Equals(Case.DarwinCase, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.ToDarwinCase(options.Formatting.AllowedSpecialCharacters); + } + if (casing.Equals(Case.FirstCharToLower, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.FirstCharToLower(); + } + if (casing.Equals(Case.FirstCharToUpper, StringComparison.CurrentCultureIgnoreCase)) + { + return name?.FirstCharToUpper(); + } + throw new ArgumentOutOfRangeException(nameof(casing)); + } +} \ No newline at end of file diff --git a/Core/Helpers/ForwardConsoleTarget.cs b/Common/Helpers/ForwardConsoleTarget.cs similarity index 100% rename from Core/Helpers/ForwardConsoleTarget.cs rename to Common/Helpers/ForwardConsoleTarget.cs diff --git a/Core/Helpers/GeneratorAssemblyLocator.cs b/Common/Helpers/GeneratorAssemblyLocator.cs similarity index 74% rename from Core/Helpers/GeneratorAssemblyLocator.cs rename to Common/Helpers/GeneratorAssemblyLocator.cs index cf07715a..65d194fc 100644 --- a/Core/Helpers/GeneratorAssemblyLocator.cs +++ b/Common/Helpers/GeneratorAssemblyLocator.cs @@ -27,16 +27,19 @@ public static LocateAssemblyResult Locate(string assemblyName, bool isBeforeBuil } Assembly entryAssembly = Assembly.GetEntryAssembly(); - ProcessorArchitecture entryArchitecture = entryAssembly.GetName().ProcessorArchitecture; + ProcessorArchitecture? entryArchitecture = entryAssembly?.GetName().ProcessorArchitecture; try { ProcessorArchitecture assemblyArchitecture = AssemblyName.GetAssemblyName(assemblyName).ProcessorArchitecture; - bool isCompatible64 = (entryArchitecture == ProcessorArchitecture.Amd64 || entryArchitecture == ProcessorArchitecture.MSIL) - && (assemblyArchitecture == ProcessorArchitecture.Amd64 || assemblyArchitecture == ProcessorArchitecture.MSIL); - bool isCompatible86 = entryArchitecture == ProcessorArchitecture.X86 && assemblyArchitecture == ProcessorArchitecture.X86; - if (!isCompatible64 && !isCompatible86) + if (assemblyArchitecture != ProcessorArchitecture.None) { - return new LocateAssemblyResult(assemblyArchitecture); + bool isCompatible64 = (entryArchitecture == ProcessorArchitecture.Amd64 || entryArchitecture == ProcessorArchitecture.MSIL) + && (assemblyArchitecture == ProcessorArchitecture.Amd64 || assemblyArchitecture == ProcessorArchitecture.MSIL); + bool isCompatible86 = entryArchitecture == ProcessorArchitecture.X86 && assemblyArchitecture == ProcessorArchitecture.X86; + if (!isCompatible64 && !isCompatible86) + { + return new LocateAssemblyResult(assemblyArchitecture); + } } } catch (FileNotFoundException) @@ -47,14 +50,25 @@ public static LocateAssemblyResult Locate(string assemblyName, bool isBeforeBuil } throw; } + catch (DirectoryNotFoundException) + { + if (isBeforeBuild) + { + return new LocateAssemblyResult(); + } + throw; + } try { SwitchableFramework? assemblyFramework = null; string[] frameworkFiles = FileSystem.GetFiles(RuntimeEnvironment.GetRuntimeDirectory(), "*.dll"); - IEnumerable loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies().Where(x => !x.IsDynamic).Select(x => x.Location); - PathAssemblyResolver resolver = new PathAssemblyResolver(loadedAssemblies.Concat(frameworkFiles)); - MetadataLoadContext metadataLoadContext = new MetadataLoadContext(resolver); + IEnumerable loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies() + .Where(x => !x.IsDynamic) + .Select(x => x.Location) + .Where(x => !string.IsNullOrEmpty(x)); + PathAssemblyResolver resolver = new(loadedAssemblies.Concat(frameworkFiles)); + MetadataLoadContext metadataLoadContext = new(resolver); using (metadataLoadContext) { @@ -65,18 +79,18 @@ public static LocateAssemblyResult Locate(string assemblyName, bool isBeforeBuil { try { - assemblyFramework = assemblyFramework ?? attributeData.ConstructorArguments.Select(x => x.Value as string) - .Where(x => x != null) - .Select(TryParseFrameworkName) - .FirstOrDefault()? - .GetSwitchableFramework(); + assemblyFramework ??= attributeData.ConstructorArguments.Select(x => x.Value as string) + .Where(x => x != null) + .Select(TryParseFrameworkName) + .FirstOrDefault()? + .GetSwitchableFramework(); } catch { // Some unnecessary attributes can not be read by a assembly with the wrong framework version, so ignore them } } - assemblyFramework = assemblyFramework ?? SwitchableFramework.None; + assemblyFramework ??= SwitchableFramework.None; } SwitchableFramework entryFramework = entryAssembly.GetSwitchableFramework(); @@ -155,4 +169,4 @@ public LocateAssemblyResult(SwitchableFramework framework) this.SwitchToFramework = framework; } } -} \ No newline at end of file +} diff --git a/Common/Helpers/GeneratorErrors.cs b/Common/Helpers/GeneratorErrors.cs new file mode 100644 index 00000000..e7b96bd3 --- /dev/null +++ b/Common/Helpers/GeneratorErrors.cs @@ -0,0 +1,17 @@ +using KY.Core; +using KY.Generator.Command; + +namespace KY.Generator; + +public static class GeneratorErrors +{ + public static void CommandDocumentationHint() + { + Logger.Error("See our Documentation: https://generator.ky-programming.de/"); + } + + public static void CommandNotFoundError(CliCommand command) + { + Logger.Error($"Command '{command.Name}' not found"); + } +} \ No newline at end of file diff --git a/Common/Helpers/GeneratorProcess.cs b/Common/Helpers/GeneratorProcess.cs new file mode 100644 index 00000000..7668a607 --- /dev/null +++ b/Common/Helpers/GeneratorProcess.cs @@ -0,0 +1,87 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.InteropServices; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Command; + +namespace KY.Generator +{ + public static class GeneratorProcess + { + public static Process Start(params IGeneratorCommand[] commands) + { + return Start(commands.ToList()); + } + + public static Process Start(IEnumerable commands, string arguments = null) + { + return Start(null, commands, arguments); + } + + public static Process Start(string location, IEnumerable commands, string arguments = null) + { + return Start(location, commands, arguments, false); + } + + public static Process StartHidden(params IGeneratorCommand[] commands) + { + return StartHidden(commands.ToList()); + } + + public static Process StartHidden(IEnumerable commands, string arguments = null) + { + return StartHidden(null, commands, arguments); + } + + public static Process StartHidden(string location, IEnumerable commands, string arguments = null) + { + return Start(location, commands, arguments, true); + } + + private static Process Start(string location, IEnumerable commands, string arguments, bool hidden) + { + string allArguments = string.Join(" ", commands); + if (arguments != null) + { + allArguments += arguments; + } + return Start(location, allArguments, hidden); + } + + private static Process Start(string location, string arguments, bool hidden) + { + location ??= Assembly.GetEntryAssembly()?.Location ?? throw new InvalidOperationException("No location found"); + string locationExe = location.Replace(".dll", ".exe"); + ProcessStartInfo startInfo = new(); + if (hidden) + { + startInfo.UseShellExecute = true; + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + } + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && FileSystem.FileExists(locationExe)) + { + // Always use the .exe on Windows to fix the dotnet.exe x86 problem + startInfo.FileName = locationExe; + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && location.EndsWith(".exe")) + { + startInfo.FileName = location; + } + else + { + startInfo.FileName = "dotnet"; + startInfo.Arguments = location + " "; + } + if (arguments != null) + { + startInfo.Arguments += arguments; + } + // Logger.Trace($"Start process: {startInfo.FileName} {startInfo.Arguments}"); + return Process.Start(startInfo); + } + } +} diff --git a/Common/Helpers/GeneratorTypeLoader.cs b/Common/Helpers/GeneratorTypeLoader.cs new file mode 100644 index 00000000..e5cf6224 --- /dev/null +++ b/Common/Helpers/GeneratorTypeLoader.cs @@ -0,0 +1,17 @@ +using KY.Core; +using KY.Core.Nuget; + +namespace KY.Generator; + +public static class GeneratorTypeLoader +{ + public static Type? Get(string assemblyName, string nameSpace, string typeName, params SearchLocation[] locations) + { + List list = locations.ToList(); + // TODO: Check if alternative is required + //list.Add(new SearchLocation(configuration.GeneratorEnvironment.ConfigurationFilePath)); + //list.Add(new SearchLocation(configuration.GeneratorEnvironment.OutputPath)); + Version defaultVersion = typeof(CoreModule).Assembly.GetName().Version; + return NugetPackageTypeLoader.Get(assemblyName, nameSpace, typeName, defaultVersion, list.ToArray()); + } +} diff --git a/Core/Helpers/LaunchSettingsReader.cs b/Common/Helpers/LaunchSettingsReader.cs similarity index 100% rename from Core/Helpers/LaunchSettingsReader.cs rename to Common/Helpers/LaunchSettingsReader.cs diff --git a/Core/Helpers/StructuralCode.cs b/Common/Helpers/StructuralCode.cs similarity index 100% rename from Core/Helpers/StructuralCode.cs rename to Common/Helpers/StructuralCode.cs diff --git a/Core/Helpers/TypeCode.cs b/Common/Helpers/TypeCode.cs similarity index 100% rename from Core/Helpers/TypeCode.cs rename to Common/Helpers/TypeCode.cs diff --git a/Core/Helpers/VisualStudioParser.cs b/Common/Helpers/VisualStudioParser.cs similarity index 88% rename from Core/Helpers/VisualStudioParser.cs rename to Common/Helpers/VisualStudioParser.cs index 29a4e848..0c27fad1 100644 --- a/Core/Helpers/VisualStudioParser.cs +++ b/Common/Helpers/VisualStudioParser.cs @@ -47,7 +47,7 @@ public VisualStudioSolutionProject ParseProject(string path) return null; } - VisualStudioSolutionProject project = new VisualStudioSolutionProject(); + VisualStudioSolutionProject project = new(); XElement element = FileSystem.ReadXml(path); foreach (XElement propertyGroup in element.GetElementsIgnoreNamespace("PropertyGroup")) @@ -58,7 +58,15 @@ public VisualStudioSolutionProject ParseProject(string path) if (projectGuid != null) { project.Id = new Guid(projectGuid.Value); - break; + } + XElement nullable = propertyGroup.GetElementIgnoreNamespace("Nullable"); + if (nullable?.Value == "enable") + { + project.Nullable = true; + } + else if (nullable?.Value == "disable") + { + project.Nullable = false; } } catch (Exception exception) @@ -66,7 +74,6 @@ public VisualStudioSolutionProject ParseProject(string path) Logger.Warning($"Can not read from .csproj. {exception.Message}{Environment.NewLine}{exception.StackTrace}"); } } - return project; } @@ -103,5 +110,6 @@ public class VisualStudioSolutionProject public string Name { get; set; } public string Path { get; set; } public Guid TypeId { get; set; } + public bool? Nullable { get; set; } } -} \ No newline at end of file +} diff --git a/Common/KY.Generator.Common.csproj b/Common/KY.Generator.Common.csproj new file mode 100644 index 00000000..a930c2af --- /dev/null +++ b/Common/KY.Generator.Common.csproj @@ -0,0 +1,49 @@ + + + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + KY.Generator + 10.0.0-preview.2 + Core elements for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator + KY.Generator + true + latest + + + + ..\bin\Debug + + + + ..\bin\Release + + + + + + + + + + + + + + + + + + diff --git a/Core/KY.Generator.Core.csproj.DotSettings b/Common/KY.Generator.Common.csproj.DotSettings similarity index 81% rename from Core/KY.Generator.Core.csproj.DotSettings rename to Common/KY.Generator.Common.csproj.DotSettings index dbfe298d..f6c55c62 100644 --- a/Core/KY.Generator.Core.csproj.DotSettings +++ b/Common/KY.Generator.Common.csproj.DotSettings @@ -1,6 +1,8 @@  + True True True + True True True True diff --git a/Common/Languages/BaseLanguage.cs b/Common/Languages/BaseLanguage.cs new file mode 100644 index 00000000..2b9f2bd5 --- /dev/null +++ b/Common/Languages/BaseLanguage.cs @@ -0,0 +1,204 @@ +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.Dependency; +using KY.Generator.Models; +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.Writers; +using FileWriter = KY.Generator.Writers.FileWriter; +using StringWriter = KY.Generator.Writers.StringWriter; + +namespace KY.Generator.Languages; + +public abstract class BaseLanguage : Codeable, ILanguage, ITemplateWriter +{ + private readonly IDependencyResolver resolver; + private Dictionary TemplateWriters { get; } = new(); + private Dictionary TemplateWritersSingletons { get; } = new(); + + public FormattingOptions Formatting { get; } = new(); + public abstract string Name { get; } + public abstract bool ImportFromSystem { get; } + public Dictionary ReservedKeywords { get; } = new(); + public abstract bool IsGenericTypeWithSameNameAllowed { get; } + public virtual string ClassScope => "public"; + public virtual string PartialKeyword => "partial"; + public bool HasAbstractClasses { get; set; } = true; + public bool HasStaticClasses { get; set; } = true; + + protected BaseLanguage(IDependencyResolver resolver) + { + this.resolver = resolver; + + this.Formatting.Add(new FileNameReplacer("interface-prefix", "^i-(.*)$", "$1")); + + this.ReservedKeywords.Add("as", "asValue"); + this.ReservedKeywords.Add("break", "breakValue"); + this.ReservedKeywords.Add("case", "caseValue"); + this.ReservedKeywords.Add("catch", "catchValue"); + this.ReservedKeywords.Add("class", "classValue"); + this.ReservedKeywords.Add("const", "constValue"); + this.ReservedKeywords.Add("continue", "continueValue"); + this.ReservedKeywords.Add("default", "defaultValue"); + this.ReservedKeywords.Add("do", "doValue"); + this.ReservedKeywords.Add("else", "elseValue"); + this.ReservedKeywords.Add("enum", "enumValue"); + this.ReservedKeywords.Add("false", "falseValue"); + this.ReservedKeywords.Add("finally", "finallyValue"); + this.ReservedKeywords.Add("for", "forValue"); + this.ReservedKeywords.Add("if", "ifValue"); + this.ReservedKeywords.Add("in", "inValue"); + this.ReservedKeywords.Add("interface", "interfaceValue"); + this.ReservedKeywords.Add("namespace", "namespaceValue"); + this.ReservedKeywords.Add("new", "newValue"); + this.ReservedKeywords.Add("null", "nullValue"); + this.ReservedKeywords.Add("private", "privateValue"); + this.ReservedKeywords.Add("protected", "protectedValue"); + this.ReservedKeywords.Add("public", "publicValue"); + this.ReservedKeywords.Add("return", "returnValue"); + this.ReservedKeywords.Add("static", "staticValue"); + this.ReservedKeywords.Add("switch", "switchValue"); + this.ReservedKeywords.Add("this", "thisValue"); + this.ReservedKeywords.Add("throw", "throwValue"); + this.ReservedKeywords.Add("true", "trueValue"); + this.ReservedKeywords.Add("try", "tryValue"); + this.ReservedKeywords.Add("typeof", "typeofValue"); + this.ReservedKeywords.Add("void", "voidValue"); + this.ReservedKeywords.Add("while", "whileValue"); + + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(true); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + } + + protected void AddWriter(bool singleton = false) + where TTemplate : ICodeFragment + where TWriter : ITemplateWriter + { + this.TemplateWriters[typeof(TTemplate)] = typeof(TWriter); + if (singleton) + { + this.TemplateWritersSingletons[typeof(TTemplate)] = null; + } + } + + protected ITemplateWriter GetWriter() + { + return this.GetWriter(typeof(TTemplate)); + } + + protected ITemplateWriter GetWriter(ICodeFragment fragment) + { + return this.GetWriter(fragment.GetType()); + } + + protected ITemplateWriter GetWriter(Type template) + { + if (template == null) + { + return null; + } + if (this.TemplateWritersSingletons.ContainsKey(template)) + { + if (this.TemplateWritersSingletons[template] == null) + { + this.TemplateWritersSingletons[template] = (ITemplateWriter)this.resolver.Create(this.TemplateWriters[template]); + } + return this.TemplateWritersSingletons[template]; + } + if (this.TemplateWriters.ContainsKey(template)) + { + return (ITemplateWriter)this.resolver.Create(this.TemplateWriters[template]); + } + return this.GetWriter(template.BaseType); + } + + public void Write(IEnumerable fragments, IOutputCache output) + { + fragments.ForEach(fragment => this.Write(fragment, output)); + } + + public virtual string FormatFile(string name, GeneratorOptions options, string type = null, bool force = false) + { + name.AssertIsNotNull(nameof(name)); + name = Formatter.Format(name, options.Formatting.FileCase, options, force); + foreach (FileNameReplacer replacer in options.Formatting.FileNameReplacer.Where(x => x.MatchingType == null || x.MatchingType == type)) + { + name = Regex.Replace(name, replacer.Pattern, replacer.Replacement); + } + return name; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + if (fragment == null) + { + return; + } + ChainedCodeFragmentWriter chainedCodeFragmentWriter = this.GetWriter().CastTo(); + if (fragment is ChainedCodeFragment chainedCodeFragment && !chainedCodeFragmentWriter.IsProcessed(chainedCodeFragment)) + { + chainedCodeFragmentWriter.Write(chainedCodeFragment, output); + return; + } + ITemplateWriter writer = this.GetWriter(fragment); + if (writer == null) + { + throw new NotImplementedException($"The method {nameof(Write)} for type {fragment.GetType().Name} is not implemented in {this.Name}."); + } + writer.Write(fragment, output); + } + + public override string ToString() + { + return this.Name; + } +} diff --git a/Common/Languages/EmptyLanguage.cs b/Common/Languages/EmptyLanguage.cs new file mode 100644 index 00000000..598ab306 --- /dev/null +++ b/Common/Languages/EmptyLanguage.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Languages; + +public class EmptyLanguage : ILanguage +{ + public virtual string Name => "Empty"; + public bool ImportFromSystem => true; + public Dictionary ReservedKeywords { get; } = new(); + public bool IsGenericTypeWithSameNameAllowed => true; + public FormattingOptions Formatting { get; } = new(); + + public virtual void Write(ICodeFragment code, IOutputCache output) + { + throw new NotImplementedException($"The method {nameof(Write)} for type {code.GetType().Name} is not implemented in {this.Name}."); + } + + public void Write(IEnumerable code, IOutputCache output) + { + throw new NotImplementedException($"The method {nameof(Write)} for type {code.FirstOrDefault()?.GetType().Name} is not implemented in {this.Name}."); + } + + public string FormatFile(string name, GeneratorOptions options, string type = null, bool force = false) + { + return Formatter.Format(name, options.Formatting.FileCase, options, force); + } +} \ No newline at end of file diff --git a/Common/Languages/ILanguage.cs b/Common/Languages/ILanguage.cs new file mode 100644 index 00000000..17d712a8 --- /dev/null +++ b/Common/Languages/ILanguage.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Languages; + +public interface ILanguage +{ + string Name { get; } + bool ImportFromSystem { get; } + Dictionary ReservedKeywords { get; } + bool IsGenericTypeWithSameNameAllowed { get; } + FormattingOptions Formatting { get; } + + void Write(ICodeFragment code, IOutputCache output); + void Write(IEnumerable code, IOutputCache output); + string FormatFile(string name, GeneratorOptions options, string type = null, bool force = false); +} \ No newline at end of file diff --git a/Common/Licensing/GlobalLicenseService.cs b/Common/Licensing/GlobalLicenseService.cs new file mode 100644 index 00000000..b0fd55dd --- /dev/null +++ b/Common/Licensing/GlobalLicenseService.cs @@ -0,0 +1,60 @@ +using System; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Models; +using Newtonsoft.Json; + +namespace KY.Generator.Licensing; + +internal class GlobalLicenseService +{ + private SignedLicense cache; + private readonly string fileName; + + public GlobalLicenseService(IEnvironment environment) + { + this.fileName = FileSystem.Combine(environment.ApplicationData, "global.license.json"); + } + + public SignedLicense Read() + { + lock (this) + { + if (this.cache == null) + { + if (FileSystem.FileExists(this.fileName)) + { + try + { + this.cache = JsonConvert.DeserializeObject(FileSystem.ReadAllText(this.fileName)); + } + catch (Exception exception) + { + Logger.Warning("Could not read global license." + Environment.NewLine + exception.Message + Environment.NewLine + exception.StackTrace); + this.cache = null; + } + } + this.cache ??= new SignedLicense(); + } + return this.cache; + } + } + + public void Write() + { + lock (this) + { + this.cache.AssertIsNotNull(null, "No data found. Use Read() method first"); + FileSystem.WriteAllText(this.fileName, JsonConvert.SerializeObject(this.cache)); + } + } + + public void Set(SignedLicense license) + { + lock (this) + { + this.cache = license; + this.Write(); + } + } +} diff --git a/Common/Licensing/License.cs b/Common/Licensing/License.cs new file mode 100644 index 00000000..5185da3b --- /dev/null +++ b/Common/Licensing/License.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; + +namespace KY.Generator.Licensing; + +public class License +{ + public Guid Id { get; set; } + public DateTime ValidUntil { get; set; } + public List Messages { get; set; } = new(); +} diff --git a/Common/Licensing/LicenseService.cs b/Common/Licensing/LicenseService.cs new file mode 100644 index 00000000..3116d83e --- /dev/null +++ b/Common/Licensing/LicenseService.cs @@ -0,0 +1,120 @@ +using System; +using System.IO; +using System.Net; +using System.Threading; +using System.Threading.Tasks; +using KY.Core; +using KY.Generator.Settings; +using Newtonsoft.Json; + +namespace KY.Generator.Licensing; + +internal class LicenseService +{ + private readonly GlobalSettingsService globalSettingsService; + private readonly GlobalLicenseService globalLicenseService; + private readonly ManualResetEvent waitForCheck = new(false); + public bool IsValid { get; private set; } + public DateTime ValidUntil { get; private set; } + + public LicenseService(GlobalSettingsService globalSettingsService, GlobalLicenseService globalLicenseService) + { + this.globalSettingsService = globalSettingsService; + this.globalLicenseService = globalLicenseService; + } + + public void Check() + { + Task.Factory.StartNew(async () => + { + try + { + Guid licenseId = this.globalSettingsService.Read().License ; + SignedLicense license = this.globalLicenseService.Read(); + if (license.License != null && license.License.Id == licenseId && (license.License.ValidUntil.Date - DateTime.Today).TotalDays >= 7 && license.Validate()) + { + this.globalLicenseService.Set(license); + } + else + { + license = await this.SendCommand($"{licenseId}/check"); + this.globalLicenseService.Set(license); + } + this.CheckLicense(license); + } + catch (Exception exception) + { + Logger.Warning(exception.Message + Environment.NewLine + exception.StackTrace); + this.CheckLicense(this.globalLicenseService.Read()); + } + this.waitForCheck.Set(); + }); + } + + /// Blocks the current thread until the license is checked or when a cached license is available kills the check. + public void WaitOrKill() + { + this.CheckLicense(this.globalLicenseService.Read()); + // If the cached license is valid, we can terminate faster + if (this.IsValid) + { + Logger.Trace($"License check skipped. Stored license is valid until {this.ValidUntil.ToShortDateString()}"); + this.waitForCheck.Set(); + } + else + { + this.waitForCheck.WaitOne(); + } + } + + private void CheckLicense(SignedLicense signedLicense) + { + this.IsValid = signedLicense.Validate(); + this.ValidUntil = signedLicense.License?.ValidUntil ?? DateTime.MinValue; + } + + private async Task SendCommand(string command, string query = "") + { +#if DEBUG + string baseUri = "http://localhost:8003/api/v3/license"; +#else + string baseUri = "https://generator.ky-programming.de/api/v3/license"; +#endif + HttpWebRequest request = WebRequest.CreateHttp($"{baseUri}/{command}?{query}"); + request.Method = WebRequestMethods.Http.Get; + request.Timeout = (int)TimeSpan.FromSeconds(5).TotalMilliseconds; + WebResponse response = request.GetResponse(); + using Stream responseStream = response.GetResponseStream(); + string responseString = await responseStream.ReadStringAsync(); + if (responseString.StartsWith("[") || responseString.StartsWith("{") || responseString.StartsWith("\"")) + { + return JsonConvert.DeserializeObject(responseString); + } + Logger.Warning(responseString); + throw new InvalidOperationException("Can not parse the response. No valid json"); + } + + public void ShowMessages() + { + SignedLicense signedLicense = this.globalLicenseService.Read(); + if (signedLicense.License?.Messages == null) + { + return; + } + foreach (Message message in signedLicense.License.Messages) + { + switch (message.Type) + { + case MessageType.Info: + Logger.Trace(message.Text); + break; + case MessageType.Warning: + Logger.Warning(message.Text); + break; + default: + Logger.Error(message.Text); + break; + } + } + } +} diff --git a/Common/Licensing/Message.cs b/Common/Licensing/Message.cs new file mode 100644 index 00000000..787601bb --- /dev/null +++ b/Common/Licensing/Message.cs @@ -0,0 +1,7 @@ +namespace KY.Generator.Licensing; + +public class Message +{ + public MessageType Type { get; set; } + public string Text { get; set; } +} \ No newline at end of file diff --git a/Common/Licensing/MessageType.cs b/Common/Licensing/MessageType.cs new file mode 100644 index 00000000..8e14ab0c --- /dev/null +++ b/Common/Licensing/MessageType.cs @@ -0,0 +1,8 @@ +namespace KY.Generator.Licensing; + +public enum MessageType +{ + Info, + Warning, + Error +} \ No newline at end of file diff --git a/Common/Licensing/SignedLicense.cs b/Common/Licensing/SignedLicense.cs new file mode 100644 index 00000000..75f7533f --- /dev/null +++ b/Common/Licensing/SignedLicense.cs @@ -0,0 +1,28 @@ +using System; +using System.Security.Cryptography; +using System.Text; +using Newtonsoft.Json; + +namespace KY.Generator.Licensing; + +internal class SignedLicense +{ + public License License { get; set; } + public string Signature { get; set; } + + public bool Validate() + { + if (this.License == null) + { + return false; + } + string json = JsonConvert.SerializeObject(this.License); + byte[] jsonBytes = Encoding.UTF8.GetBytes(json); + byte[] signatureBytes = Convert.FromBase64String(this.Signature); + using RSACryptoServiceProvider rsa = new(); + rsa.FromXmlString(key); + return rsa.VerifyData(jsonBytes, SHA256.Create(), signatureBytes) && DateTime.UtcNow < this.License.ValidUntil; + } + + private const string key = "tvvrK6PvkX16tJnks2ouA/SKZhAf/Kuu5rVpJFdCp/sCNmvYO+3/XJ75pRamMadGcRu0vV1QnDgnSKcZxeyeaXp3/i3cs2WWlh4yFZMpIL31XpVCjh1IDnH+XulK/kwyeratBGG+ck3ZzoojJaLvWsVDBE41pMjIm9ZjWsCgTsU=AQAB"; +} diff --git a/Common/Main.cs b/Common/Main.cs new file mode 100644 index 00000000..68858d67 --- /dev/null +++ b/Common/Main.cs @@ -0,0 +1,30 @@ +using System.Diagnostics; +using System.Reflection; +using KY.Core; +using KY.Core.DataAccess; +using KY.Core.Nuget; + +namespace KY.Generator; + +public static class Main +{ + private static string SharedPath { get; } = FileSystem.Combine(Assembly.GetEntryAssembly().Location, "..\\..\\netstandard2.0"); + + public static bool Run(string[] args) + { +#if DEBUG + if (args.Length > 0 && args[0] != "statistics") + { + Debugger.Launch(); + } +#endif + Generator.InitializeLogger(args); + NugetPackageDependencyLoader.Activate(); + NugetPackageDependencyLoader.Locations.Insert(0, new SearchLocation(SharedPath)); + return Generator.Create() + .SharedAssemblies(SharedPath) + .PreloadModules(SharedPath, "KY.Generator.*.dll") + .SetParameters(args) + .Run(); + } +} diff --git a/Core/Mappings/ClassMapping.cs b/Common/Mappings/ClassMapping.cs similarity index 100% rename from Core/Mappings/ClassMapping.cs rename to Common/Mappings/ClassMapping.cs diff --git a/Core/Mappings/ClassMappingReader.cs b/Common/Mappings/ClassMappingReader.cs similarity index 100% rename from Core/Mappings/ClassMappingReader.cs rename to Common/Mappings/ClassMappingReader.cs diff --git a/Core/Mappings/Extensions/ClassMappingListExtension.cs b/Common/Mappings/Extensions/ClassMappingListExtension.cs similarity index 100% rename from Core/Mappings/Extensions/ClassMappingListExtension.cs rename to Common/Mappings/Extensions/ClassMappingListExtension.cs diff --git a/Core/Mappings/Extensions/FieldMappingListExtension.cs b/Common/Mappings/Extensions/FieldMappingListExtension.cs similarity index 100% rename from Core/Mappings/Extensions/FieldMappingListExtension.cs rename to Common/Mappings/Extensions/FieldMappingListExtension.cs diff --git a/Core/Mappings/Extensions/PropertyMappingListExtension.cs b/Common/Mappings/Extensions/PropertyMappingListExtension.cs similarity index 100% rename from Core/Mappings/Extensions/PropertyMappingListExtension.cs rename to Common/Mappings/Extensions/PropertyMappingListExtension.cs diff --git a/Core/Mappings/FieldMapping.cs b/Common/Mappings/FieldMapping.cs similarity index 100% rename from Core/Mappings/FieldMapping.cs rename to Common/Mappings/FieldMapping.cs diff --git a/Core/Mappings/FieldMappingReader.cs b/Common/Mappings/FieldMappingReader.cs similarity index 100% rename from Core/Mappings/FieldMappingReader.cs rename to Common/Mappings/FieldMappingReader.cs diff --git a/Common/Mappings/ITypeMapping.cs b/Common/Mappings/ITypeMapping.cs new file mode 100644 index 00000000..e8280189 --- /dev/null +++ b/Common/Mappings/ITypeMapping.cs @@ -0,0 +1,16 @@ +using System; +using KY.Generator.Languages; +using KY.Generator.Transfer; + +namespace KY.Generator.Mappings +{ + public interface ITypeMapping + { + ITypeMappingMapSyntax Map() where T : ILanguage; + TypeMappingEntry Add(Type fromLanguage, string fromType, Type toLanguage, string toType, bool nullable = false, string nameSpace = null, bool fromSystem = false, string constructor = null); + TypeMappingEntry Get(ILanguage fromLanguage, string fromType, ILanguage toLanguage); + TypeMappingEntry TryGet(ILanguage fromLanguage, string fromType, ILanguage toLanguage); + TypeMappingEntry TryGet(ILanguage fromLanguage, Type fromType, ILanguage toLanguage); + void Get(ILanguage fromLanguage, ILanguage toLanguage, TypeTransferObject type); + } +} diff --git a/Core/Mappings/ITypeMappingFromSyntax.cs b/Common/Mappings/ITypeMappingFromSyntax.cs similarity index 100% rename from Core/Mappings/ITypeMappingFromSyntax.cs rename to Common/Mappings/ITypeMappingFromSyntax.cs diff --git a/Core/Mappings/ITypeMappingMapSyntax.cs b/Common/Mappings/ITypeMappingMapSyntax.cs similarity index 66% rename from Core/Mappings/ITypeMappingMapSyntax.cs rename to Common/Mappings/ITypeMappingMapSyntax.cs index b139d903..9cac581f 100644 --- a/Core/Mappings/ITypeMappingMapSyntax.cs +++ b/Common/Mappings/ITypeMappingMapSyntax.cs @@ -4,6 +4,6 @@ namespace KY.Generator.Mappings { public interface ITypeMappingMapSyntax { - ITypeMappingTypeSyntax To(IMappableLanguage language); + ITypeMappingTypeSyntax To() where T : ILanguage; } } diff --git a/Core/Mappings/ITypeMappingTypeOrToDetailsSyntax.cs b/Common/Mappings/ITypeMappingTypeOrToDetailsSyntax.cs similarity index 100% rename from Core/Mappings/ITypeMappingTypeOrToDetailsSyntax.cs rename to Common/Mappings/ITypeMappingTypeOrToDetailsSyntax.cs diff --git a/Core/Mappings/ITypeMappingTypeSyntax.cs b/Common/Mappings/ITypeMappingTypeSyntax.cs similarity index 100% rename from Core/Mappings/ITypeMappingTypeSyntax.cs rename to Common/Mappings/ITypeMappingTypeSyntax.cs diff --git a/Core/Mappings/PropertyMapping.cs b/Common/Mappings/PropertyMapping.cs similarity index 100% rename from Core/Mappings/PropertyMapping.cs rename to Common/Mappings/PropertyMapping.cs diff --git a/Core/Mappings/PropertyMappingReader.cs b/Common/Mappings/PropertyMappingReader.cs similarity index 100% rename from Core/Mappings/PropertyMappingReader.cs rename to Common/Mappings/PropertyMappingReader.cs diff --git a/Core/Mappings/TypeMapping.cs b/Common/Mappings/TypeMapping.cs similarity index 69% rename from Core/Mappings/TypeMapping.cs rename to Common/Mappings/TypeMapping.cs index bcfb659c..9cfaabeb 100644 --- a/Core/Mappings/TypeMapping.cs +++ b/Common/Mappings/TypeMapping.cs @@ -16,14 +16,14 @@ public TypeMapping() this.typeMapping = new List(); } - public TypeMappingEntry Add(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage, string toType, bool nullable = false, string nameSpace = null, bool fromSystem = false, string constructor = null) + public TypeMappingEntry Add(Type fromLanguage, string fromType, Type toLanguage, string toType, bool nullable = false, string nameSpace = null, bool fromSystem = false, string constructor = null) { TypeMappingEntry entry = new(fromLanguage, fromType, toLanguage, toType, nullable, nameSpace, fromSystem, constructor); this.typeMapping.Add(entry); return entry; } - public TypeMappingEntry Get(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage) + public TypeMappingEntry Get(ILanguage fromLanguage, string fromType, ILanguage toLanguage) { TypeMappingEntry mapping = this.TryGet(fromLanguage, fromType, toLanguage); if (mapping == null) @@ -33,15 +33,16 @@ public TypeMappingEntry Get(IMappableLanguage fromLanguage, string fromType, IMa return mapping; } - public TypeMappingEntry TryGet(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage) + public TypeMappingEntry TryGet(ILanguage fromLanguage, string fromType, ILanguage toLanguage) { fromLanguage.AssertIsNotNull(nameof(fromLanguage)); fromType.AssertIsNotNull(nameof(fromType)); toLanguage.AssertIsNotNull(nameof(toLanguage)); - return this.typeMapping.FirstOrDefault(x => x.FromLanguage.Key == fromLanguage.Key && x.FromType == fromType && x.ToLanguage.Key == toLanguage.Key); + return this.typeMapping.FirstOrDefault(x => (x.FromLanguage == fromLanguage.GetType() || x.FromLanguage == fromLanguage.GetType().BaseType) + && x.FromType == fromType && (x.ToLanguage == toLanguage.GetType() || x.ToLanguage == toLanguage.GetType().BaseType)); } - public TypeMappingEntry TryGet(IMappableLanguage fromLanguage, Type fromType, IMappableLanguage toLanguage) + public TypeMappingEntry TryGet(ILanguage fromLanguage, Type fromType, ILanguage toLanguage) { if (fromType.IsGenericType) { @@ -52,7 +53,7 @@ public TypeMappingEntry TryGet(IMappableLanguage fromLanguage, Type fromType, IM return this.TryGet(fromLanguage, fromType.FullName, toLanguage); } - public void Get(IMappableLanguage fromLanguage, IMappableLanguage toLanguage, TypeTransferObject type) + public void Get(ILanguage fromLanguage, ILanguage toLanguage, TypeTransferObject type) { if (type == null) { @@ -71,9 +72,10 @@ public void Get(IMappableLanguage fromLanguage, IMappableLanguage toLanguage, Ty } } - public ITypeMappingMapSyntax Map(IMappableLanguage language) + public ITypeMappingMapSyntax Map() + where T: ILanguage { - return new TypeMappingSyntax(this, language); + return new TypeMappingSyntax(this, typeof(T)); } } } diff --git a/Core/Mappings/TypeMappingEntry.cs b/Common/Mappings/TypeMappingEntry.cs similarity index 72% rename from Core/Mappings/TypeMappingEntry.cs rename to Common/Mappings/TypeMappingEntry.cs index bd3dddf1..f4116575 100644 --- a/Core/Mappings/TypeMappingEntry.cs +++ b/Common/Mappings/TypeMappingEntry.cs @@ -1,3 +1,4 @@ +using System; using KY.Generator.Languages; using KY.Generator.Templates; @@ -5,9 +6,9 @@ namespace KY.Generator.Mappings { public class TypeMappingEntry { - public IMappableLanguage FromLanguage { get; } + public Type FromLanguage { get; } public string FromType { get; } - public IMappableLanguage ToLanguage { get; } + public Type ToLanguage { get; } public string ToType { get; } public bool Nullable { get; set; } public string Namespace { get; set; } @@ -15,7 +16,7 @@ public class TypeMappingEntry public string Constructor { get; } public ICodeFragment Default { get; set; } - public TypeMappingEntry(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage, string toType, bool nullable, string nameSpace, bool fromSystem, string constructor = null) + public TypeMappingEntry(Type fromLanguage, string fromType, Type toLanguage, string toType, bool nullable, string nameSpace, bool fromSystem, string constructor = null) { this.FromLanguage = fromLanguage; this.FromType = fromType; @@ -27,4 +28,4 @@ public TypeMappingEntry(IMappableLanguage fromLanguage, string fromType, IMappab this.Constructor = constructor ?? this.ToType; } } -} \ No newline at end of file +} diff --git a/Core/Mappings/TypeMappingSyntax.cs b/Common/Mappings/TypeMappingSyntax.cs similarity index 82% rename from Core/Mappings/TypeMappingSyntax.cs rename to Common/Mappings/TypeMappingSyntax.cs index da11446f..5f699700 100644 --- a/Core/Mappings/TypeMappingSyntax.cs +++ b/Common/Mappings/TypeMappingSyntax.cs @@ -1,4 +1,4 @@ -using KY.Generator.Languages; +using System; using KY.Generator.Templates; namespace KY.Generator.Mappings @@ -6,20 +6,20 @@ namespace KY.Generator.Mappings internal class TypeMappingSyntax : ITypeMappingMapSyntax, ITypeMappingFromSyntax, ITypeMappingTypeOrToDetailsSyntax { private readonly TypeMapping mapping; - private readonly IMappableLanguage fromLanguage; - private IMappableLanguage toLanguage; + private readonly Type fromLanguage; + private Type toLanguage; private string fromType; private TypeMappingEntry entry; - public TypeMappingSyntax(TypeMapping mapping, IMappableLanguage fromLanguage) + public TypeMappingSyntax(TypeMapping mapping, Type fromLanguage) { this.mapping = mapping; this.fromLanguage = fromLanguage; } - ITypeMappingTypeSyntax ITypeMappingMapSyntax.To(IMappableLanguage language) + ITypeMappingTypeSyntax ITypeMappingMapSyntax.To() { - this.toLanguage = language; + this.toLanguage = typeof(T); return this; } diff --git a/Common/Models/CaseMode.cs b/Common/Models/CaseMode.cs new file mode 100644 index 00000000..094cab82 --- /dev/null +++ b/Common/Models/CaseMode.cs @@ -0,0 +1,8 @@ +namespace KY.Generator.Models +{ + public enum CaseMode + { + Fix, + AspDotNetCompatible + } +} diff --git a/Common/Models/FileNameReplacer.cs b/Common/Models/FileNameReplacer.cs new file mode 100644 index 00000000..4c298d97 --- /dev/null +++ b/Common/Models/FileNameReplacer.cs @@ -0,0 +1,35 @@ +using System.Text.RegularExpressions; + +namespace KY.Generator.Models +{ + public class FileNameReplacer + { + /// + /// Optional key for others to find a replacer and change its behaviour + /// + public string Key { get; } + + /// + /// A regex pattern like from + /// + public string Pattern { get; set; } + + /// + /// A regex replacement like from e.g. "$1..." + /// + public string Replacement { get; set; } + + /// + /// The required type of the file. Default is null. Null means all + /// + public string MatchingType { get; set; } + + public FileNameReplacer(string key, string pattern, string replacement, string matchingType = null) + { + this.Key = key; + this.Pattern = pattern; + this.Replacement = replacement; + this.MatchingType = matchingType; + } + } +} diff --git a/Core/Models/FrameworkNameAttribute.cs b/Common/Models/FrameworkNameAttribute.cs similarity index 100% rename from Core/Models/FrameworkNameAttribute.cs rename to Common/Models/FrameworkNameAttribute.cs diff --git a/Common/Models/GeneratorEnvironment.cs b/Common/Models/GeneratorEnvironment.cs new file mode 100644 index 00000000..104a0d9e --- /dev/null +++ b/Common/Models/GeneratorEnvironment.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; +using KY.Core.DataAccess; +using KY.Generator.Command; +using KY.Generator.Transfer; + +namespace KY.Generator.Models; + +public class GeneratorEnvironment : IEnvironment +{ + public Guid OutputId { get; set; } + public string Name { get; set; } + public string OutputPath { get; set; } + public List TransferObjects { get; } = []; + public string ApplicationData { get; } = FileSystem.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "KY-Programming", "KY-Generator"); + public string LocalApplicationData { get; } = FileSystem.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "KY-Programming", "KY-Generator"); + public List Parameters { get; } = []; +} \ No newline at end of file diff --git a/Common/Models/IEnvironment.cs b/Common/Models/IEnvironment.cs new file mode 100644 index 00000000..cc5738c7 --- /dev/null +++ b/Common/Models/IEnvironment.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using KY.Generator.Command; +using KY.Generator.Transfer; + +namespace KY.Generator.Models; + +public interface IEnvironment +{ + Guid OutputId { get; set; } + string Name { get; set; } + List TransferObjects { get; } + string OutputPath { get; set; } + string ApplicationData { get; } + string LocalApplicationData { get; } + List Parameters { get; } +} \ No newline at end of file diff --git a/Common/Models/Import.cs b/Common/Models/Import.cs new file mode 100644 index 00000000..c3c0eacc --- /dev/null +++ b/Common/Models/Import.cs @@ -0,0 +1,17 @@ +using System; + +namespace KY.Generator.Models; + +public class Import +{ + public Type Type { get; } + public string FileName { get; } + public string TypeName { get; } + + public Import(Type type, string fileName, string typeName) + { + this.Type = type; + this.FileName = fileName; + this.TypeName = typeName; + } +} diff --git a/Core/Models/SwitchableFramework.cs b/Common/Models/SwitchableFramework.cs similarity index 58% rename from Core/Models/SwitchableFramework.cs rename to Common/Models/SwitchableFramework.cs index ca2c4b5f..9f9f1349 100644 --- a/Core/Models/SwitchableFramework.cs +++ b/Common/Models/SwitchableFramework.cs @@ -14,6 +14,18 @@ public enum SwitchableFramework NetCore3, [FrameworkName("net5.0")] - Net5 + Net5, + + [FrameworkName("net6.0")] + Net6, + + [FrameworkName("net7.0")] + Net7, + + [FrameworkName("net8.0")] + Net8, + + [FrameworkName("net9.0")] + Net9 } -} \ No newline at end of file +} diff --git a/Core/Models/Visibility.cs b/Common/Models/Visibility.cs similarity index 100% rename from Core/Models/Visibility.cs rename to Common/Models/Visibility.cs diff --git a/Common/Options/FormattingOptions.cs b/Common/Options/FormattingOptions.cs new file mode 100644 index 00000000..005926c2 --- /dev/null +++ b/Common/Options/FormattingOptions.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using KY.Core; +using KY.Generator.Extensions; +using KY.Generator.Models; + +namespace KY.Generator +{ + public class FormattingOptions + { + private readonly List> others; + private string fileCase; + private string classCase; + private string fieldCase; + private string propertyCase; + private string methodCase; + private string parameterCase; + private string allowedSpecialCharacters; + private string indentChar; + private int? indentCount; + private string quote; + private string lineClosing; + private string startBlock; + private string endBlock; + private bool? startBlockInNewLine; + private bool? endFileWithNewLine; + private bool? collapseEmptyClasses; + private string collapsedClassesSpacer; + private string interfacePrefix; + private string classPrefix; + private readonly List fileNameReplacer = new(); + private CaseMode? caseMode; + + public string FileCase + { + get => this.Get(x => x?.fileCase) ?? Case.PascalCase; + set => this.fileCase = value; + } + + public string ClassCase + { + get => this.Get(x => x?.classCase) ?? Case.PascalCase; + set => this.classCase = value; + } + + public string FieldCase + { + get => this.Get(x => x?.fieldCase) ?? Case.CamelCase; + set => this.fieldCase = value; + } + + public string PropertyCase + { + get => this.Get(x => x?.propertyCase) ?? Case.PascalCase; + set => this.propertyCase = value; + } + + public string MethodCase + { + get => this.Get(x => x?.methodCase) ?? Case.PascalCase; + set => this.methodCase = value; + } + + public string ParameterCase + { + get => this.Get(x => x?.parameterCase) ?? Case.CamelCase; + set => this.parameterCase = value; + } + + public string AllowedSpecialCharacters + { + get => this.Get(x => x?.allowedSpecialCharacters); + set => this.allowedSpecialCharacters = value; + } + + public string IndentChar + { + get => this.Get(x => x?.indentChar) ?? " "; + set => this.indentChar = value; + } + + public int IndentCount + { + get => this.Get(x => x?.indentCount) ?? 4; + set => this.indentCount = value; + } + + public string Quote + { + get => this.Get(x => x?.quote) ?? "\""; + set => this.quote = value; + } + + public string LineClosing + { + get => this.Get(x => x?.lineClosing) ?? ";"; + set => this.lineClosing = value; + } + + public string StartBlock + { + get => this.Get(x => x?.startBlock) ?? "{"; + set => this.startBlock = value; + } + + public string EndBlock + { + get => this.Get(x => x?.endBlock) ?? "}"; + set => this.endBlock = value; + } + + public bool StartBlockInNewLine + { + get => this.Get(x => x?.startBlockInNewLine) ?? true; + set => this.startBlockInNewLine = value; + } + + public bool EndFileWithNewLine + { + get => this.Get(x => x?.endFileWithNewLine) ?? true; + set => this.endFileWithNewLine = value; + } + + public bool CollapseEmptyClasses + { + get => this.Get(x => x?.collapseEmptyClasses) ?? false; + set => this.collapseEmptyClasses = value; + } + + public string CollapsedClassesSpacer + { + get => this.Get(x => x?.collapsedClassesSpacer) ?? " "; + set => this.collapsedClassesSpacer = value; + } + + public string InterfacePrefix + { + get => this.Get(x => x?.interfacePrefix) ?? ""; + set => this.interfacePrefix = value; + } + + public string ClassPrefix + { + get => this.Get(x => x?.classPrefix) ?? ""; + set => this.classPrefix = value; + } + + public IReadOnlyList FileNameReplacer => this.GetMerged(x => x?.fileNameReplacer); + + public CaseMode CaseMode + { + get => this.Get(x => x?.caseMode) ?? CaseMode.Fix; + set => this.caseMode = value; + } + + public FormattingOptions(params Func[] others) + { + this.others = others.ToList(); + } + + public FormattingOptions Add(FileNameReplacer replacer) + { + this.fileNameReplacer.AddIfNotExists(replacer); + return this; + } + + private T Get(Func action) + where T : class + { + return action(this) ?? this.others.Select(x => x()?.Get(action)).FirstOrDefault(x => x != null); + } + + private T? Get(Func action) + where T : struct + { + return action(this) ?? this.others.Select(x => x()?.Get(action)).FirstOrDefault(x => x != null); + } + + protected List GetMerged(Func> getAction) + { + List merged = new(); + foreach (List list in this.Yield().Concat(this.others.Select(x => x())).Select(getAction).Where(x => x != null)) + { + list.Where(item => !merged.Contains(item)).ForEach(item => merged.Add(item)); + } + return merged; + } + + public void AddFileNameReplace(FileNameReplacer newFileNameReplacer) + { + this.fileNameReplacer.Add(newFileNameReplacer); + } + } +} diff --git a/Common/Options/GeneratorOptions.cs b/Common/Options/GeneratorOptions.cs new file mode 100644 index 00000000..0411109b --- /dev/null +++ b/Common/Options/GeneratorOptions.cs @@ -0,0 +1,171 @@ +using System.Diagnostics; +using KY.Generator.Languages; +using KY.Generator.Models; +using KY.Generator.Transfer; + +namespace KY.Generator; + +[DebuggerDisplay("GeneratorOptions for {Target}")] +public class GeneratorOptions(GeneratorOptions? parent, GeneratorOptions? global, object? target = null) + : OptionsBase(parent, global, target) +{ + private bool? propertiesToFields; + private bool? fieldsToProperties; + private bool? preferInterfaces; + private bool? optionalFields; + private bool? optionalProperties; + private bool? ignore; + private bool? formatNames; + private bool? withOptionalProperties; + private Dictionary? replaceName; + private FormattingOptions? formatting; + private ILanguage? language; + private bool? addHeader; + private bool? skipNamespace; + private bool? onlySubTypes; + private string? rename; + private TypeTransferObject? returnType; + private string? formatter; + private bool? forceOverwrite; + private List? imports; + private bool? noOptional; + private bool? nullable; + private string? modelOutput; + + public bool PropertiesToFields + { + get => this.GetValue(x => x.propertiesToFields); + set => this.propertiesToFields = value; + } + + public bool FieldsToProperties + { + get => this.GetValue(x => x.fieldsToProperties); + set => this.fieldsToProperties = value; + } + + public bool PreferInterfaces + { + get => this.GetValue(x => x.preferInterfaces); + set => this.preferInterfaces = value; + } + + public bool OptionalFields + { + get => this.GetValue(x => x.optionalFields); + set => this.optionalFields = value; + } + + public bool OptionalProperties + { + get => this.GetValue(x => x.optionalProperties); + set => this.optionalProperties = value; + } + + public bool Ignore + { + get => this.GetValue(x => x.ignore); + set => this.ignore = value; + } + + public bool FormatNames + { + get => this.GetValue(x => x.formatNames, true); + set => this.formatNames = value; + } + + public bool WithOptionalProperties + { + get => this.GetValue(x => x.withOptionalProperties); + set => this.withOptionalProperties = value; + } + + public IReadOnlyDictionary ReplaceName => this.GetDictionary(x => x.replaceName); + + public FormattingOptions? Formatting + { + // TODO: Include all parents formatting options + get => new(() => this.Language?.Formatting, () => this.formatting, () => this.Global?.formatting, () => this.Parents.FirstOrDefault()?.Formatting); + set => this.formatting = value; + } + + public ILanguage? Language + { + get => this.GetValue(x => x.language); + set => this.language = value; + } + + public bool AddHeader + { + get => this.GetValue(x => x.addHeader, true); + set => this.addHeader = value; + } + + public bool SkipNamespace + { + get => this.GetValue(x => x.skipNamespace); + set => this.skipNamespace = value; + } + + public bool OnlySubTypes + { + get => this.GetValue(x => x.onlySubTypes); + set => this.onlySubTypes = value; + } + + public string? Rename + { + get => this.GetValue(x => x.rename); + set => this.rename = value; + } + + public TypeTransferObject? ReturnType + { + get => this.GetValue(x => x.returnType); + set => this.returnType = value; + } + + public string? Formatter + { + get => this.GetValue(x => x.formatter); + set => this.formatter = value; + } + + public bool ForceOverwrite + { + get => this.GetValue(x => x.forceOverwrite); + set => this.forceOverwrite = value; + } + + public IReadOnlyList Imports => this.GetList(x => x.imports); + + public bool NoOptional + { + get => this.GetValue(x => x.noOptional); + set => this.noOptional = value; + } + + public bool Nullable + { + get => this.GetValue(x => x.nullable); + set => this.nullable = value; + } + + public string? ModelOutput + { + get => this.GetValue(x => x.modelOutput); + set => this.modelOutput = value; + } + + public void AddToReplaceName(string replace, string with) + { + this.replaceName ??= new Dictionary(); + this.replaceName[replace] = with; + } + + public void AddToImports(params IEnumerable values) + { + this.imports ??= []; + this.imports.AddRange(values); + } +} diff --git a/Common/Options/GeneratorOptionsFactory.cs b/Common/Options/GeneratorOptionsFactory.cs new file mode 100644 index 00000000..0ef96a3b --- /dev/null +++ b/Common/Options/GeneratorOptionsFactory.cs @@ -0,0 +1,98 @@ +using System.Reflection; +using KY.Generator.Models; +using KY.Generator.Transfer; + +namespace KY.Generator; + +public class GeneratorOptionsFactory : IOptionsFactory +{ + public bool CanCreate(Type optionsType) + { + return optionsType == typeof(GeneratorOptions); + } + + public object Create(Type optionsType, object key, object? parent, object global) + { + return new GeneratorOptions(parent as GeneratorOptions, global as GeneratorOptions, key); + } + + public object CreateGlobal(Type optionsType, object key, object? parent) + { + return key switch + { + Assembly assembly => this.CreateFromCustomAttributes(assembly.GetCustomAttributes(), key, parent as GeneratorOptions), + MemberInfo member => this.CreateFromCustomAttributes(member.GetCustomAttributes(), key, parent as GeneratorOptions), + ParameterInfo parameter => this.CreateFromCustomAttributes(parameter.GetCustomAttributes(), key, parent as GeneratorOptions), + Options.GlobalKey => new GeneratorOptions(parent as GeneratorOptions, null, "global"), + _ => new GeneratorOptions(parent as GeneratorOptions, null, key) + // _ => throw new InvalidOperationException($"Could not create {nameof(GeneratorOptions)} {key.GetType()}") + }; + } + + private GeneratorOptions CreateFromCustomAttributes(IEnumerable customAttributes, object key, GeneratorOptions? parent) + { + GeneratorOptions options = new(parent, null, key); + foreach (Attribute attribute in customAttributes) + { + switch (attribute) + { + case GenerateIgnoreAttribute: + options.Ignore = true; + break; + case GeneratePreferInterfacesAttribute: + options.PreferInterfaces = true; + break; + case GenerateRenameAttribute renameAttribute: + options.AddToReplaceName(renameAttribute.Replace, renameAttribute.With); + break; + case GeneratePropertiesAsFieldsAttribute: + options.FieldsToProperties = false; + options.PropertiesToFields = true; + break; + case GenerateFieldsAsPropertiesAttribute: + options.FieldsToProperties = true; + options.PropertiesToFields = false; + break; + case GenerateFormatNamesAttribute formatNamesAttribute: + options.FormatNames = formatNamesAttribute.FormatNames; + break; + case GenerateNoHeaderAttribute: + options.AddHeader = false; + break; + case GenerateOnlySubTypesAttribute: + options.OnlySubTypes = true; + break; + case GenerateReturnTypeAttribute returnTypeAttribute: + if (returnTypeAttribute.Type != null) + { + options.ReturnType = new TypeTransferObject + { + Name = returnTypeAttribute.Type.Name, + Namespace = returnTypeAttribute.Type.Namespace, + Type = returnTypeAttribute.Type + }; + } + else + { + options.ReturnType = new TypeTransferObject + { + Name = returnTypeAttribute.TypeName, + FileName = returnTypeAttribute.FileName, + OverrideType = returnTypeAttribute.OverrideName + }; + } + break; + case GenerateImportAttribute importAttribute: + options.AddToImports(new Import(importAttribute.Type, importAttribute.FileName, importAttribute.TypeName)); + break; + case GenerateNoOptionalAttribute: + options.NoOptional = true; + break; + case GenerateModelOutputAttribute modelOutputAttribute: + options.ModelOutput = modelOutputAttribute.RelativePath; + break; + } + } + return options; + } +} diff --git a/Common/Options/IOptionsFactory.cs b/Common/Options/IOptionsFactory.cs new file mode 100644 index 00000000..a3018d35 --- /dev/null +++ b/Common/Options/IOptionsFactory.cs @@ -0,0 +1,8 @@ +namespace KY.Generator; + +public interface IOptionsFactory +{ + bool CanCreate(Type optionsType); + object Create(Type optionsType, object key, object? parent, object global); + object CreateGlobal(Type optionsType, object key, object? parent); +} \ No newline at end of file diff --git a/Common/Options/Options.cs b/Common/Options/Options.cs new file mode 100644 index 00000000..9d6e6741 --- /dev/null +++ b/Common/Options/Options.cs @@ -0,0 +1,223 @@ +using System.Linq.Expressions; +using System.Reflection; +using KY.Core; +using KY.Generator.Transfer; + +namespace KY.Generator; + +public class Options +{ + public const string GlobalKey = ""; + private readonly Dictionary> cache = new(); + private static readonly Dictionary> globalCache = new(); + private static Func>? factoriesAction; + private static readonly Dictionary mappings = new(); + + internal static OptionsMapping? Resolve(object mappedEntry) + { + if (mappings.TryGetValue(mappedEntry, out OptionsMapping mapping)) + { + return mapping; + } + return null; + } + + internal OptionsBase Get(object entry, T? parent = null) where T : OptionsBase + { + return entry switch + { + Type type => this.Get(type, parent), + MemberInfo memberInfo => this.Get(memberInfo, parent), + ParameterInfo parameterInfo => this.Get(parameterInfo, parent), + Assembly assembly => this.Get(assembly, parent), + TypeTransferObject typeTransferObject => this.Get(typeTransferObject, parent), + MemberTransferObject memberTransferObject => this.Get(memberTransferObject, parent), + _ => throw new InvalidOperationException($"Entry of type {entry.GetType()} is not supported.") + }; + } + + public static T GetGlobal(MemberInfo member) where T : OptionsBase + { + return GetOrCreateGlobal(member, GetGlobal(member.DeclaringType ?? throw new InvalidOperationException())); + } + + public T Get(MemberInfo member, T? parent = null) where T : OptionsBase + { + return this.GetOrCreate(member, parent ?? this.Get(member.DeclaringType ?? throw new InvalidOperationException()), GetGlobal(member)); + } + + public static T GetGlobal(ParameterInfo parameter) where T : OptionsBase + { + return GetOrCreateGlobal(parameter, GetGlobal(parameter.Member)); + } + + public T Get(ParameterInfo parameter, T? parent = null) where T : OptionsBase + { + return this.GetOrCreate(parameter, parent ?? this.Get(parameter.Member), GetGlobal(parameter)); + } + + public static T GetGlobal(Type type) where T : OptionsBase + { + return GetOrCreateGlobal(type, GetGlobal(type.Assembly)); + } + + public T Get(Type type, T? parent = null) where T : OptionsBase + { + return this.GetOrCreate(type, parent ?? this.Get(type.Assembly), GetGlobal(type)); + } + + public static T GetGlobal(Assembly assembly) where T : OptionsBase + { + return GetOrCreateGlobal(assembly, GetGlobal()); + } + + public T Get(Assembly assembly, T? parent = null) where T : OptionsBase + { + return this.GetOrCreate(assembly, parent ?? this.Get(), GetGlobal(assembly)); + } + + public static T GetGlobal(TypeTransferObject type) where T : OptionsBase + { + return GetOrCreateGlobal(type, GetGlobal( /*type.Assembly*/)); + } + + public T Get(TypeTransferObject type, T? parent = null) where T : OptionsBase + { + if (mappings.TryGetValue(type, out OptionsMapping mapping)) + { + return mapping.Execute(this); + } + return this.GetOrCreate(type, parent ?? this.Get( /*type.Assembly*/), GetGlobal(type)); + } + + public static T GetGlobal(MemberTransferObject member) where T : OptionsBase + { + return GetOrCreateGlobal(member, GetGlobal(member.DeclaringType ?? throw new InvalidOperationException())); + } + + public T Get(MemberTransferObject member, T? parent = null) where T : OptionsBase + { + if (mappings.TryGetValue(member, out OptionsMapping mapping)) + { + return mapping.Execute(this); + } + return this.GetOrCreate(member, parent ?? this.Get(member.DeclaringType ?? throw new InvalidOperationException()), GetGlobal(member)); + } + + public static T GetGlobal() where T : OptionsBase + { + return GetOrCreateGlobal(GlobalKey, null); + } + + public T Get() where T : OptionsBase + { + return this.GetOrCreate(GlobalKey, null, GetGlobal()); + } + + private static T GetOrCreateGlobal(object key, T? parent) where T : OptionsBase + { + key.AssertIsNotNull(nameof(key)); + if (!globalCache.TryGetValue(key, out Dictionary set)) + { + set = new Dictionary(); + globalCache.Add(key, set); + } + if (set.TryGetValue(typeof(T), out object found)) + { + return (T)found; + } + T entry = CreateGlobal(key, parent); + set[typeof(T)] = entry; + return entry; + } + + protected T GetOrCreate(object key, T? parent, T global) where T : OptionsBase + { + key.AssertIsNotNull(nameof(key)); + if (!this.cache.TryGetValue(key, out Dictionary set)) + { + set = new Dictionary(); + this.cache.Add(key, set); + } + T entry; + if (set.TryGetValue(typeof(T), out object found)) + { + entry = (T)found; + if (parent != null) + { + entry.AddParent(parent); + } + } + else + { + entry = Create(key, parent, global); + set.Add(typeof(T), entry); + } + return entry; + } + + private static T Create(object key, T? parent, T global) where T : OptionsBase + { + IOptionsFactory? factory = factoriesAction?.Invoke().First(x => x.CanCreate(typeof(T))); + return (T)(factory?.Create(typeof(T), key, parent, global) ?? throw new InvalidOperationException($"Factory for {typeof(T).Name} not found")); + } + + private static T CreateGlobal(object key, T? parent) where T : OptionsBase + { + IOptionsFactory? factory = factoriesAction?.Invoke().First(x => x.CanCreate(typeof(T))); + return (T)(factory?.CreateGlobal(typeof(T), key, parent) ?? throw new InvalidOperationException($"Factory for {typeof(T).Name} not found")); + } + + public static void Register(Func> factoryListAction) + { + factoriesAction = factoryListAction; + } + + public void Map(object key, Expression> action) where T : OptionsBase + { + if (mappings.ContainsKey(key)) + { + return; + } + if (action.Body is MethodCallExpression methodCall) + { + MethodInfo methodInfo = methodCall.Method.GetGenericMethodDefinition(); + // object? instance = methodCall.Object == null ? null : Expression.Lambda(methodCall.Object).Compile().DynamicInvoke(); + object?[] arguments = methodCall.Arguments + .Select(arg => Expression.Lambda(arg).Compile().DynamicInvoke()) + .ToArray(); + + foreach (object? argument in arguments) + { + if (argument is not T options) + { + continue; + } + object? argumentKey = this.ReverseSearch(options); + if (argumentKey != null && mappings.Values.Any(x => x.Arguments.Contains(argumentKey))) + { + arguments.Replace(argument, argumentKey); + continue; + } + throw new InvalidOperationException($"Parameter of type {typeof(T)} are not allowed. Remove them or map it first!"); + } + mappings.Add(key, new OptionsMapping(methodInfo, arguments)); + } + else + { + throw new InvalidOperationException("The provided expression does not contain a method call."); + } + } + + private object? ReverseSearch(OptionsBase options) where T : OptionsBase + { + foreach ((object? key, Dictionary? cacheValue) in this.cache.Select(x => (x.Key, x.Value))) + { + if (cacheValue.ContainsValue(options)) + { + return key; + } + } + return null; + } +} diff --git a/Common/Options/OptionsBase.cs b/Common/Options/OptionsBase.cs new file mode 100644 index 00000000..ca1d29a8 --- /dev/null +++ b/Common/Options/OptionsBase.cs @@ -0,0 +1,157 @@ +using System.Diagnostics; +using KY.Core; + +namespace KY.Generator; + +[DebuggerDisplay("{Target}")] +public abstract class OptionsBase + where TSelf : OptionsBase +{ + // ReSharper disable once StaticMemberInGenericType + private static int index; + protected TSelf? Global { get; } + protected List Parents { get; } = []; + protected string Target { get; } + + protected OptionsBase(TSelf? parent, TSelf? global, object? target = null) + { + this.Global = global; + if (parent != null) + { + this.Parents.Add(parent); + } + this.Target = target == null ? index++.ToString() : target + " " + index++; + } + + public void AddParent(TSelf parent) + { + parent.AssertIsNotNull(nameof(parent)); + this.Parents.AddIfNotExists(parent); + } + + protected T GetOwnValue(Func getter, T defaultValue = default) where T : struct + { + return getter((TSelf)this) ?? (this.Global == null ? null : getter(this.Global)) ?? defaultValue; + } + + protected T? GetOwnValue(Func getter, T? defaultValue = null) where T : class + { + return getter((TSelf)this) ?? (this.Global == null ? null : getter(this.Global)) ?? defaultValue; + } + + protected T GetValue(Func getter, T defaultValue = default) where T : struct + { + Queue searchTargets = new(); + List searchedTargets = []; + searchTargets.Enqueue((TSelf)this); + while (searchTargets.Any()) + { + TSelf current = searchTargets.Dequeue(); + searchedTargets.Add(current); + T? result = getter(current) ?? (current.Global == null ? null : getter(current.Global)); + if (result != null) + { + return result.Value; + } + foreach (TSelf parent in current.Parents) + { + if (searchedTargets.Contains(parent)) + { + continue; + } + searchTargets.Enqueue(parent); + } + if (current.Global != null && !searchedTargets.Contains(current.Global)) + { + searchTargets.Enqueue(current.Global); + } + } + return defaultValue; + } + + protected T? GetValue(Func getter, T? defaultValue = null) where T : class + { + Queue searchTargets = new(); + List searchedTargets = []; + searchTargets.Enqueue((TSelf)this); + while (searchTargets.Any()) + { + TSelf current = searchTargets.Dequeue(); + searchedTargets.Add(current); + T? result = getter(current) ?? (current.Global == null ? null : getter(current.Global)); + if (result != null) + { + return result; + } + foreach (TSelf parent in current.Parents) + { + if (searchedTargets.Contains(parent)) + { + continue; + } + searchTargets.Enqueue(parent); + } + if (current.Global != null && !searchedTargets.Contains(current.Global)) + { + searchTargets.Enqueue(current.Global); + } + } + return defaultValue; + } + + protected IReadOnlyList GetList(Func?> getter) + { + List result = []; + List searchedTargets = []; + Queue searchTargets = new(); + searchTargets.Enqueue((TSelf)this); + while (searchTargets.Any()) + { + TSelf current = searchTargets.Dequeue(); + searchedTargets.Add(current); + IEnumerable? found = getter(current) ?? (current.Global == null ? null : getter(current.Global)); + found?.Where(x => !result.Contains(x)).ForEach(x => result.Add(x)); + foreach (TSelf parent in current.Parents) + { + if (searchedTargets.Contains(parent)) + { + continue; + } + searchTargets.Enqueue(parent); + } + if (current.Global != null && !searchedTargets.Contains(current.Global)) + { + searchTargets.Enqueue(current.Global); + } + } + return result; + } + + protected IReadOnlyDictionary GetDictionary(Func?> getter) + { + Dictionary result = new(); + List searchedTargets = []; + Queue searchTargets = new(); + searchTargets.Enqueue((TSelf)this); + while (searchTargets.Any()) + { + TSelf current = searchTargets.Dequeue(); + searchedTargets.Add(current); + Dictionary? found = getter(current) ?? (current.Global == null ? null : getter(current.Global)); + found?.Where(x => !result.ContainsKey(x.Key)).ForEach(x => result.Add(x.Key, x.Value)); + foreach (TSelf parent in current.Parents) + { + if (searchedTargets.Contains(parent)) + { + continue; + } + searchTargets.Enqueue(parent); + } + if (current.Global != null && !searchedTargets.Contains(current.Global)) + { + searchTargets.Enqueue(current.Global); + } + } + return result; + } +} diff --git a/Common/Options/OptionsMapping.cs b/Common/Options/OptionsMapping.cs new file mode 100644 index 00000000..2f95a7e9 --- /dev/null +++ b/Common/Options/OptionsMapping.cs @@ -0,0 +1,35 @@ +using System.Reflection; + +namespace KY.Generator; + +public class OptionsMapping(MethodInfo methodInfo, object?[] arguments) +{ + public MethodInfo MethodInfo { get; } = methodInfo; + public object?[] Arguments { get; } = arguments; + + public void Deconstruct(out MethodInfo methodInfo, out object?[] arguments) + { + methodInfo = this.MethodInfo; + arguments = this.Arguments; + } + + public T Execute(Options options) where T : OptionsBase + { + MethodInfo genericMethod = this.MethodInfo.MakeGenericMethod(typeof(T)); + object?[] arguments = this.Arguments.ToArray(); + object? secondArgument = this.Arguments[1]; + if (secondArgument != null) + { + OptionsMapping? mapping = Options.Resolve(secondArgument); + if (mapping != null) + { + arguments[1] = mapping.Execute(options); + } + else + { + arguments[1] = options.Get(secondArgument); + } + } + return (T)genericMethod.Invoke(options, arguments); + } +} \ No newline at end of file diff --git a/Common/Output/FileOutput.cs b/Common/Output/FileOutput.cs new file mode 100644 index 00000000..cdfddb28 --- /dev/null +++ b/Common/Output/FileOutput.cs @@ -0,0 +1,142 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Models; +using Environment = System.Environment; + +namespace KY.Generator.Output; + +public class FileOutput : IOutput +{ + private readonly IEnvironment environment; + private readonly List actions = new(); + public string BasePath { get; private set; } + + public long Lines + { + get + { + lock (this.actions) + { + return this.actions.OfType().Sum(x => Regex.Matches(x.Content, "\n").Count); + } + } + } + + public FileOutput(IEnvironment environment, string basePath) + { + this.environment = environment; + this.BasePath = basePath; + this.environment.OutputPath = basePath; + } + + public void Write(string fileName, string content, GeneratorOptions options, bool ignoreOutputId = false, bool forceOverwrite = false) + { + string filePath = this.ToFilePath(fileName); + this.RemovePreviousActions(filePath); + lock (this.actions) + { + Guid? outputId = ignoreOutputId ? null : this.environment.OutputId; + this.actions.Add(new OutputWriteAction(filePath, content, options, this.environment, outputId, forceOverwrite)); + } + } + + public void Delete(string fileName) + { + string filePath = this.ToFilePath(fileName); + this.RemovePreviousActions(filePath); + lock (this.actions) + { + this.actions.Add(new OutputDeleteAction(filePath)); + } + } + + public void RemoveOutputId(string filePath, string fileContent = null) + { + this.RemovePreviousActions(filePath); + lock (this.actions) + { + this.actions.Add(new OutputRemoveIdAction(filePath, this.environment.OutputId, fileContent)); + } + } + + public void Execute() + { + lock (this.actions) + { + this.actions.ForEach(action => action.Execute()); + } + } + + public void DeleteAllRelatedFiles(string relativePath = null) + { + if (this.environment.OutputId == Guid.Empty) + { + return; + } + try + { + string path = this.ToFilePath(relativePath); + if (!FileSystem.DirectoryExists(path)) + { + return; + } + List currentActions; + lock (this.actions) + { + currentActions = this.actions.ToList(); + } + IEnumerable filesToCheck = FileSystem.GetFiles(path, null, SearchOption.AllDirectories) + .Where(file => currentActions.All(action => !action.FilePath.Equals(file, StringComparison.CurrentCultureIgnoreCase))); + foreach (string file in filesToCheck) + { + string content = FileSystem.ReadAllText(file); + List outputIds = OutputFileHelper.GetOutputIds(content).ToList(); + if (!outputIds.Contains(this.environment.OutputId)) + { + continue; + } + if (outputIds.Count == 1) + { + this.Delete(file); + } + else + { + this.RemoveOutputId(file, content); + } + } + } + catch (Exception exception) + { + Logger.Warning($"Obsolete generated file check gots an {exception.GetType().Name}. {exception.Message}{Environment.NewLine}{exception.StackTrace}"); + } + } + + public void Move(string path) + { + this.BasePath = FileSystem.IsAbsolute(path) ? path : FileSystem.Combine(this.BasePath, path); + this.environment.OutputPath = path; + } + + private void RemovePreviousActions(string fileName) + { + lock (this.actions) + { + this.actions.RemoveAll(action => action.FilePath.Equals(fileName, StringComparison.InvariantCultureIgnoreCase)); + } + } + + private string ToFilePath(string fileName) + { + return fileName == null ? this.BasePath : FileSystem.IsAbsolute(fileName) ? fileName : FileSystem.Combine(this.BasePath, fileName); + } + + public override string ToString() + { + return this.BasePath; + } +} \ No newline at end of file diff --git a/Common/Output/FileWriter.cs b/Common/Output/FileWriter.cs new file mode 100644 index 00000000..911d443f --- /dev/null +++ b/Common/Output/FileWriter.cs @@ -0,0 +1,195 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using KY.Core; +using KY.Generator.Templates; + +namespace KY.Generator.Output; + +internal class FileWriter : IOutputCache +{ + private readonly GeneratorOptions options; + private readonly List lastFragments = new(); + private int indent; + private readonly StringBuilder cache = new(); + private bool isLineClosed = true; + + public IEnumerable LastFragments => this.lastFragments; + + public FileWriter(GeneratorOptions options) + { + this.options = options; + } + + public IOutputCache Add(string code, bool keepIndent = false) + { + if (keepIndent) + { + this.cache.Append(code); + } + else if (code.Contains(Environment.NewLine)) + { + if (this.isLineClosed) + { + this.WriteIndent(); + } + string[] lines = code.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); + foreach (string line in lines) + { + this.cache.AppendLine(line.Trim()); + this.WriteIndent(); + } + } + else + { + if (this.isLineClosed) + { + this.WriteIndent(); + } + this.cache.Append(code); + } + return this; + } + + private void WriteIndent() + { + this.isLineClosed = false; + this.cache.Append("".PadLeft(this.indent * this.options.Formatting.IndentCount, this.options.Formatting.IndentChar)); + } + + public IOutputCache ExtraIndent(int indents = 1) + { + if (this.isLineClosed) + { + this.WriteIndent(); + } + this.cache.Append("".PadLeft(indents * this.options.Formatting.IndentCount, this.options.Formatting.IndentChar)); + return this; + } + + public IOutputCache Add(params ICodeFragment[] fragments) + { + return this.Add(fragments.ToList()); + } + + public IOutputCache Add(IEnumerable fragments) + { + foreach (ICodeFragment fragment in fragments.Where(x => x != null)) + { + this.Add(fragment); + } + return this; + } + + public IOutputCache Add(IEnumerable fragments, string separator) + { + bool first = true; + foreach (ICodeFragment fragment in fragments.Where(x => x != null)) + { + if (!first) + { + this.Add(separator); + } + this.Add(fragment); + first = false; + } + return this; + } + + private void Add(ICodeFragment fragment) + { + this.lastFragments.Insert(0, fragment); + while (this.lastFragments.Count > 10) + { + this.lastFragments.RemoveAt(this.lastFragments.Count - 1); + } + this.options.Language.Write(fragment, this); + } + + public IOutputCache CloseLine() + { + this.cache.AppendLine(this.options.Formatting.LineClosing); + this.isLineClosed = true; + return this; + } + + public IOutputCache BreakLine() + { + this.cache.AppendLine(); + this.isLineClosed = true; + return this; + } + + public IOutputCache BreakLineIfNotEmpty() + { + if (!this.isLineClosed) + { + this.cache.AppendLine(); + this.isLineClosed = true; + } + return this; + } + + public IOutputCache UnBreakLine() + { + string value = this.cache.ToString().TrimEnd('\r', '\n'); + this.cache.Clear().Append(value); + return this; + } + + public IOutputCache Indent() + { + this.indent++; + this.BreakLineIfNotEmpty(); + return this; + } + + public IOutputCache UnIndent() + { + this.indent--; + this.BreakLineIfNotEmpty(); + return this; + } + + public IOutputCache StartBlock() + { + if (this.cache.Length > 0 && !this.isLineClosed) + { + if (this.options.Formatting.StartBlockInNewLine) + { + this.BreakLine(); + } + else + { + this.Add(" "); + } + } + return this.Add(this.options.Formatting.StartBlock).Indent(); + } + + public IOutputCache EndBlock(bool breakLine = true) + { + return this.UnIndent().Add(this.options.Formatting.EndBlock) + .If(breakLine).BreakLine().EndIf(); + } + + public IOutputCache If(bool condition) + { + return new FileWriterCondition(this, condition); + } + + public IOutputCache EndIf() + { + return this; + } + + public override string ToString() + { + if (this.options.Formatting.EndFileWithNewLine) + { + this.BreakLine(); + } + return this.cache.ToString().TrimEnd(' ', '\r', '\n'); + } +} diff --git a/Core/Output/FileWriterCondition.cs b/Common/Output/FileWriterCondition.cs similarity index 94% rename from Core/Output/FileWriterCondition.cs rename to Common/Output/FileWriterCondition.cs index 8b0963f5..6f3b5fdc 100644 --- a/Core/Output/FileWriterCondition.cs +++ b/Common/Output/FileWriterCondition.cs @@ -9,8 +9,6 @@ internal class FileWriterCondition : IOutputCache private readonly IOutputCache output; private readonly bool condition; - public IFormattableLanguage Language => this.output.Language; - public IEnumerable LastFragments => this.output.LastFragments; public FileWriterCondition(IOutputCache output, bool condition) @@ -82,6 +80,15 @@ public IOutputCache BreakLineIfNotEmpty() return this; } + public IOutputCache UnBreakLine() + { + if (this.condition) + { + this.output.UnBreakLine(); + } + return this; + } + public IOutputCache Indent() { if (this.condition) @@ -141,4 +148,4 @@ public IOutputCache ExtraIndent(int indents = 1) return this; } } -} \ No newline at end of file +} diff --git a/Common/Output/IOutput.cs b/Common/Output/IOutput.cs new file mode 100644 index 00000000..7581054e --- /dev/null +++ b/Common/Output/IOutput.cs @@ -0,0 +1,11 @@ +namespace KY.Generator.Output; + +public interface IOutput +{ + void Write(string fileName, string content, GeneratorOptions options, bool ignoreOutputId = false, bool forceOverwrite = false); + void Delete(string fileName); + void DeleteAllRelatedFiles(string relativePath = null); + void Execute(); + void Move(string relativePath); + long Lines { get; } +} \ No newline at end of file diff --git a/Core/Output/IOutputAction.cs b/Common/Output/IOutputAction.cs similarity index 100% rename from Core/Output/IOutputAction.cs rename to Common/Output/IOutputAction.cs diff --git a/Core/Output/IOutputCache.cs b/Common/Output/IOutputCache.cs similarity index 99% rename from Core/Output/IOutputCache.cs rename to Common/Output/IOutputCache.cs index 6cd9974c..cb85c16b 100644 --- a/Core/Output/IOutputCache.cs +++ b/Common/Output/IOutputCache.cs @@ -6,4 +6,4 @@ public interface IOutputCache : IOutputCacheBase IOutputCache EndIf(); IOutputCache ExtraIndent(int indents = 1); } -} \ No newline at end of file +} diff --git a/Core/Output/IOutputCacheBase.cs b/Common/Output/IOutputCacheBase.cs similarity index 90% rename from Core/Output/IOutputCacheBase.cs rename to Common/Output/IOutputCacheBase.cs index 3ef1cdd3..66851402 100644 --- a/Core/Output/IOutputCacheBase.cs +++ b/Common/Output/IOutputCacheBase.cs @@ -1,12 +1,10 @@ using System.Collections.Generic; -using KY.Generator.Languages; using KY.Generator.Templates; namespace KY.Generator.Output { public interface IOutputCacheBase { - IFormattableLanguage Language { get; } IEnumerable LastFragments { get; } IOutputCache Add(string code, bool keepIndent = false); @@ -16,9 +14,10 @@ public interface IOutputCacheBase IOutputCache CloseLine(); IOutputCache BreakLine(); IOutputCache BreakLineIfNotEmpty(); + IOutputCache UnBreakLine(); IOutputCache Indent(); IOutputCache UnIndent(); IOutputCache StartBlock(); IOutputCache EndBlock(bool breakLine = true); } -} \ No newline at end of file +} diff --git a/Common/Output/MemoryOutput.cs b/Common/Output/MemoryOutput.cs new file mode 100644 index 00000000..592d6d25 --- /dev/null +++ b/Common/Output/MemoryOutput.cs @@ -0,0 +1,50 @@ +using System.Collections.Generic; +using System.Linq; +using System.Text.RegularExpressions; + +namespace KY.Generator.Output; + +public class MemoryOutput : IOutput +{ + public Dictionary Files { get; } + + public long Lines + { + get + { + lock (this.Files) + { + return this.Files.Values.Sum(x => Regex.Matches(x, "\n").Count); + } + } + } + + public MemoryOutput() + { + this.Files = new Dictionary(); + } + + public void Write(string fileName, string content, GeneratorOptions options, bool ignoreOutputId = false, bool forceOverwrite = false) + { + this.Files.Add(fileName, content); + } + + public void Delete(string fileName) + { + this.Files.Remove(fileName); + } + + public void DeleteAllRelatedFiles(string relativePath = null) + { } + + public void Execute() + { } + + public void Move(string relativePath) + { } + + public override string ToString() + { + return "Memory"; + } +} \ No newline at end of file diff --git a/Common/Output/NoOperationFileWriter.cs b/Common/Output/NoOperationFileWriter.cs new file mode 100644 index 00000000..255c43d9 --- /dev/null +++ b/Common/Output/NoOperationFileWriter.cs @@ -0,0 +1,33 @@ +using System.Collections.Generic; +using KY.Generator.Languages; +using KY.Generator.Templates; + +namespace KY.Generator.Output +{ + class NoOperationFileWriter : IOutputCache + { + private readonly IOutputCache output; + + public NoOperationFileWriter(IOutputCache output) + { + this.output = output; + } + + public IEnumerable LastFragments => this.output.LastFragments; + public IOutputCache Add(string code, bool keepIndent = false) => this.output.Add(code, keepIndent); + public IOutputCache Add(params ICodeFragment[] fragments) => this.output.Add(fragments); + public IOutputCache Add(IEnumerable fragments) => this.output.Add(fragments); + public IOutputCache Add(IEnumerable fragments, string separator) => this.output.Add(fragments, separator); + public IOutputCache CloseLine() => this.output.CloseLine(); + public IOutputCache BreakLine() => this.output.BreakLine(); + public IOutputCache BreakLineIfNotEmpty() => this.output.BreakLineIfNotEmpty(); + public IOutputCache UnBreakLine() => this.output.UnBreakLine(); + public IOutputCache Indent() => this.output.Indent(); + public IOutputCache UnIndent() => this.output.UnIndent(); + public IOutputCache StartBlock() => this.output.StartBlock(); + public IOutputCache EndBlock(bool breakLine = true) => this.output.EndBlock(breakLine); + public IOutputCache If(bool condition) => this.output.If(condition); + public IOutputCache ExtraIndent(int indents = 1) => this.output.ExtraIndent(indents); + public IOutputCache EndIf() => this.output; + } +} diff --git a/Core/Output/OutputDeleteAction.cs b/Common/Output/OutputDeleteAction.cs similarity index 100% rename from Core/Output/OutputDeleteAction.cs rename to Common/Output/OutputDeleteAction.cs diff --git a/Common/Output/OutputFileHelper.cs b/Common/Output/OutputFileHelper.cs new file mode 100644 index 00000000..6b53368f --- /dev/null +++ b/Common/Output/OutputFileHelper.cs @@ -0,0 +1,64 @@ +using System.Text; +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.Crypt; + +namespace KY.Generator.Output; + +public static class OutputFileHelper +{ + private static readonly Regex outputIdRegex = new("outputid:(?[a-zA-Z0-9-]+)", RegexOptions.Compiled); + + public static List GetOutputIds(string content) + { + return content.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) + .Select(line => outputIdRegex.Match(line)) + .Where(result => result.Success) + .Select(result => Guid.TryParse(result.Groups["id"].Value, out Guid guid) ? guid : (Guid?)null) + .Where(x => x.HasValue) + .Select(x => x.Value) + .ToList(); + } + + public static bool IsGeneratedFile(string content) + { + return content.Contains(""); + } + + public static string? GetHash(string content) + { + List filteredContent = string.IsNullOrEmpty(content) + ? new List() + : content.Replace("\r", string.Empty) + .Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries) + .Where(line => !line.Contains("// outputid:")) + .ToList(); + // Strip header + while ((filteredContent.FirstOrDefault()?.StartsWith("//") ?? false) || (filteredContent.FirstOrDefault()?.StartsWith("/*") ?? false)) + { + filteredContent.RemoveAt(0); + } + if (filteredContent.Count == 0) + { + return null; + } + return Sha512.Create(string.Join(Environment.NewLine, filteredContent)).ToString(); + } + + public static string AppendOutputIds(string content, IEnumerable ids, Guid? additionalId = null) + { + if (additionalId != null) + { + ids = ids.Concat(additionalId.Value.Yield()); + } + StringBuilder builder = new(content); + builder.AppendLine().AppendLine(); + ids.Unique().OrderBy(x => x).ForEach(id => builder.AppendLine($"// outputid:{id}")); + return builder.ToString(); + } + + public static string RemoveOutputId(string content, Guid id) + { + return content.Replace($"// outputid:{id}", string.Empty); + } +} diff --git a/Core/Output/OutputRemoveIdAction.cs b/Common/Output/OutputRemoveIdAction.cs similarity index 100% rename from Core/Output/OutputRemoveIdAction.cs rename to Common/Output/OutputRemoveIdAction.cs diff --git a/Common/Output/OutputWriteAction.cs b/Common/Output/OutputWriteAction.cs new file mode 100644 index 00000000..e0eadedf --- /dev/null +++ b/Common/Output/OutputWriteAction.cs @@ -0,0 +1,121 @@ +using System.Diagnostics; +using System.Text; +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Models; + +namespace KY.Generator.Output; + +public class OutputWriteAction : IOutputAction +{ + private static Regex parseFormatter = new("^(\"(?[^\"]+)\"(\\s(?.*))?)|((?[^\\s]+)(\\s(?.*))?)$", RegexOptions.Compiled); + private readonly GeneratorOptions options; + private readonly IEnvironment environment; + private bool executed; + public string FilePath { get; } + public string Content { get; } + public Guid? OutputId { get; } + public bool ForceOverwrite { get; } + + public OutputWriteAction(string filePath, string content, GeneratorOptions options, IEnvironment environment, Guid? outputId = null, bool forceOverwrite = false) + { + this.options = options; + this.environment = environment; + this.FilePath = filePath; + this.Content = content; + this.OutputId = outputId; + this.ForceOverwrite = forceOverwrite; + } + + public void Execute() + { + if (this.executed) + { + return; + } + this.executed = true; + FileSystem.CreateDirectory(FileSystem.Parent(this.FilePath)); + string content = string.IsNullOrEmpty(this.options.Formatter) ? this.Content : this.Format(this.Content); + if (!FileSystem.FileExists(this.FilePath)) + { + Logger.Trace($"Write file {this.FilePath}"); + this.Write(content, new List()); + return; + } + string? contentToWriteHash = OutputFileHelper.GetHash(content); + string contentRead = FileSystem.ReadAllText(this.FilePath); + List readOutputIds = OutputFileHelper.GetOutputIds(contentRead); + string? contentReadHash = OutputFileHelper.GetHash(contentRead); + bool contentReadIsGenerated = readOutputIds.Any() || OutputFileHelper.IsGeneratedFile(contentRead); + if (contentToWriteHash == contentReadHash && contentToWriteHash != null) + { + if (this.OutputId != null && !readOutputIds.Contains(this.OutputId.Value)) + { + Logger.Trace($"File has no changes {this.FilePath}. Output id appended."); + this.Write(content, readOutputIds); + } + else if (contentRead.Contains("") && !contentRead.Contains(this.GetType().Assembly.GetName().Version.ToString())) + { + Logger.Trace($"File has no changes {this.FilePath}. Version updated."); + this.Write(content, readOutputIds); + } + else + { + Logger.Trace($"File has no changes {this.FilePath}"); + } + } + else if (contentRead.Length == 0 + || this.ForceOverwrite || this.options.ForceOverwrite + || (contentReadIsGenerated && (this.OutputId == null || readOutputIds.Count == 0 || readOutputIds.Contains(this.OutputId.Value))) + || (!contentReadIsGenerated && this.OutputId != null && readOutputIds.Contains(this.OutputId.Value)) + ) + { + Logger.Trace($"Overwrite file {this.FilePath}"); + this.Write(content, readOutputIds); + } + else if (!contentReadIsGenerated) + { + Logger.Error($"Can not overwrite file {this.FilePath}. File to overwrite is not generated. Please delete file manually!"); + } + else + { + Logger.Error($"Can not overwrite file {this.FilePath}. File to overwrite was generated by a different project and has some differences. Please delete file manually or generate the other project first!"); + } + } + + private void Write(string content, IEnumerable readOutputIds) + { + content = OutputFileHelper.AppendOutputIds(content, readOutputIds, this.OutputId); + FileSystem.WriteAllText(this.FilePath, content, Encoding.UTF8); + } + + private string Format(string content) + { + string extension = Path.GetExtension(this.FilePath); + string tempFile = this.FilePath.TrimEnd(extension) + ".temp" + extension; + FileSystem.WriteAllText(tempFile, content, Encoding.UTF8); + string command = this.options.Formatter.Replace("$file", tempFile) + .Replace("$project", Environment.CurrentDirectory) + .Replace("$output", this.environment.OutputPath); + Logger.Trace($"Format file {tempFile}"); + Process cmd = new(); + cmd.StartInfo.FileName = "cmd.exe"; + cmd.StartInfo.RedirectStandardInput = true; + cmd.StartInfo.RedirectStandardOutput = true; + cmd.StartInfo.CreateNoWindow = true; + cmd.StartInfo.UseShellExecute = false; + cmd.Start(); + cmd.StandardInput.WriteLine(command); + cmd.StandardInput.Flush(); + cmd.StandardInput.Close(); + cmd.WaitForExit(); + if (cmd.ExitCode != 0) + { + Logger.Error(cmd.StandardOutput.ReadToEnd()); + } + string formattedContent = FileSystem.ReadAllText(tempFile); + FileSystem.DeleteFile(tempFile); + return formattedContent; + } +} diff --git a/Core/Properties/Resources.Designer.cs b/Common/Properties/Resources.Designer.cs similarity index 100% rename from Core/Properties/Resources.Designer.cs rename to Common/Properties/Resources.Designer.cs diff --git a/Core/Properties/Resources.resx b/Common/Properties/Resources.resx similarity index 100% rename from Core/Properties/Resources.resx rename to Common/Properties/Resources.resx diff --git a/Common/README.md b/Common/README.md new file mode 100644 index 00000000..ec35887c --- /dev/null +++ b/Common/README.md @@ -0,0 +1,9 @@ +# KY.Generator ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) + +[Documentation](https://generator.ky-programming.de) | [Getting Started](https://generator.ky-programming.de/start) | [Supported Platforms](https://generator.ky-programming.de/start/platforms) | [Need Help?](https://generator.ky-programming.de/start/help) + +## This is a library package! +This package does not contains any directly executable assemblies. You need at least the [KY.Generator](https://www.nuget.org/packages/KY.Generator/) ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) package + +## Read More +For complete overview see our [documentation](https://generator.ky-programming.de) diff --git a/Common/Settings/GlobalSettings.cs b/Common/Settings/GlobalSettings.cs new file mode 100644 index 00000000..d593c872 --- /dev/null +++ b/Common/Settings/GlobalSettings.cs @@ -0,0 +1,10 @@ +using System; + +namespace KY.Generator.Settings +{ + public class GlobalSettings + { + public bool StatisticsEnabled { get; set; } = true; + public Guid License { get; set; } = Guid.NewGuid(); + } +} \ No newline at end of file diff --git a/Common/Settings/GlobalSettingsService.cs b/Common/Settings/GlobalSettingsService.cs new file mode 100644 index 00000000..872493f7 --- /dev/null +++ b/Common/Settings/GlobalSettingsService.cs @@ -0,0 +1,62 @@ +using System; +using System.Diagnostics; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Models; +using KY.Generator.Statistics; +using Newtonsoft.Json; + +namespace KY.Generator.Settings +{ + public class GlobalSettingsService + { + private GlobalSettings cache; + private readonly string fileName; + + public GlobalSettingsService(IEnvironment environment) + { + this.fileName = FileSystem.Combine(environment.ApplicationData, "global.settings.json"); + } + + public GlobalSettings Read() + { + if (this.cache == null) + { + Stopwatch stopwatch = new(); + stopwatch.Start(); + if (FileSystem.FileExists(this.fileName)) + { + try + { + this.cache = JsonConvert.DeserializeObject(FileSystem.ReadAllText(this.fileName)); + } + catch (Exception exception) + { + Logger.Warning("Could not read global settings." + Environment.NewLine + exception.Message + Environment.NewLine + exception.StackTrace); + this.cache = null; + } + } + if (this.cache == null) + { + this.cache = new GlobalSettings(); + this.Write(); + } + stopwatch.Stop(); + Logger.Trace($"Global settings read in {stopwatch.ElapsedMilliseconds} ms"); + } + return this.cache; + } + + public void Write() + { + this.cache.AssertIsNotNull(null, "No data found. Use Read() method first"); + FileSystem.WriteAllText(this.fileName, JsonConvert.SerializeObject(this.cache)); + } + + public void ReadAndWrite(Action action) + { + action(this.Read()); + this.Write(); + } + } +} diff --git a/Common/Statistics/CommandStatistic.cs b/Common/Statistics/CommandStatistic.cs new file mode 100644 index 00000000..d0253db4 --- /dev/null +++ b/Common/Statistics/CommandStatistic.cs @@ -0,0 +1,10 @@ +using System; + +namespace KY.Generator.Statistics +{ + public class CommandStatistic + { + public string Command { get; set; } + public TimeSpan Duration { get; set; } + } +} diff --git a/Common/Statistics/GlobalStatistic.cs b/Common/Statistics/GlobalStatistic.cs new file mode 100644 index 00000000..eb798848 --- /dev/null +++ b/Common/Statistics/GlobalStatistic.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; + +namespace KY.Generator.Statistics +{ + public class GlobalStatistic + { + public DateTime Today { get; set; } = DateTime.Today; + public long TodayLines { get; set; } + public long TodayFiles { get; set; } + public long Lines { get; set; } + public long Files { get; set; } + public List Ids { get; } = new(); + } +} diff --git a/Common/Statistics/GlobalStatisticsService.cs b/Common/Statistics/GlobalStatisticsService.cs new file mode 100644 index 00000000..71a47a52 --- /dev/null +++ b/Common/Statistics/GlobalStatisticsService.cs @@ -0,0 +1,75 @@ +using System; +using System.Collections.Generic; +using KY.Core; +using KY.Core.DataAccess; +using KY.Core.Dependency; +using KY.Generator.Commands; +using KY.Generator.Extensions; +using KY.Generator.Models; +using Newtonsoft.Json; + +namespace KY.Generator.Statistics +{ + public class GlobalStatisticsService + { + private readonly IDependencyResolver resolver; + private GlobalStatistic cache; + private readonly string fileName; + + public GlobalStatisticsService(IDependencyResolver resolver, IEnvironment environment) + { + this.resolver = resolver; + this.fileName = FileSystem.Combine(environment.ApplicationData, "global.statistics.json"); + } + + public GlobalStatistic Read() + { + if (this.cache == null) + { + if (FileSystem.FileExists(this.fileName)) + { + Logger.Trace("Read global statistics..."); + this.cache = JsonConvert.DeserializeObject(FileSystem.ReadAllText(this.fileName)); + } + this.cache ??= new GlobalStatistic(); + } + return this.cache; + } + + public void Append(Statistic statistic) + { + GlobalStatistic data = this.Read(); + data.AssertIsNotNull(null, "No data found. Use Read() method first"); + if (data.Today != DateTime.Today) + { + data.TodayFiles = 0; + data.TodayLines = 0; + } + data.Today = DateTime.Today; + data.Files += statistic.GeneratedFiles; + data.Lines += statistic.OutputLines; + data.TodayFiles += statistic.GeneratedFiles; + data.TodayLines += statistic.OutputLines; + data.Ids.AddIfNotExists(statistic.Id); + } + + public void Write() + { + this.cache.AssertIsNotNull(null, "No data found. Use Read() method first"); + FileSystem.WriteAllText(this.fileName, JsonConvert.SerializeObject(this.cache)); + } + + public void StartCalculation(string statisticsFileName) + { + StatisticsCommand command = this.resolver.Create(); + command.Parameters.File = statisticsFileName; + command.Parameters.Force = true; + GeneratorProcess.StartHidden(command); + } + + public List GetIds() + { + return this.Read()?.Ids ?? new List(); + } + } +} diff --git a/Common/Statistics/Measurement.cs b/Common/Statistics/Measurement.cs new file mode 100644 index 00000000..5a674bac --- /dev/null +++ b/Common/Statistics/Measurement.cs @@ -0,0 +1,23 @@ +using System; +using System.Diagnostics; + +namespace KY.Generator.Statistics +{ + public class Measurement + { + private Stopwatch StopWatch { get; } = new(); + public TimeSpan Elapsed => this.StopWatch.Elapsed; + + public Measurement() + { + this.StopWatch.Reset(); + this.StopWatch.Start(); + } + + public void Stop() + { + this.StopWatch.Stop(); + } + + } +} \ No newline at end of file diff --git a/Common/Statistics/Statistic.cs b/Common/Statistics/Statistic.cs new file mode 100644 index 00000000..a4025954 --- /dev/null +++ b/Common/Statistics/Statistic.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace KY.Generator.Statistics +{ + public class Statistic + { + public string Version { get; set; } + public Guid Id { get; set; } + public string Name { get; set; } + public Guid License { get; set; } + public bool IsMsBuild { get; set; } + public bool IsBeforeBuild { get; set; } + public DateTime Start { get; set; } + public int InitializedModules { get; set; } + public DateTime InitializationEnd { get; set; } + public TimeSpan InitializationDuration => this.Start == default || this.InitializationEnd == default ? TimeSpan.Zero : this.InitializationEnd - this.Start; + + public List RanCommands { get; } = new(); + public DateTime RunEnd { get; set; } + public TimeSpan RunDuration => this.InitializationEnd == default || this.RunEnd == default ? TimeSpan.Zero : this.RunEnd - this.InitializationEnd; + + public long OutputLines { get; set; } + public DateTime OutputEnd { get; set; } + public TimeSpan OutputDuration => this.RunEnd == default || this.OutputEnd == default ? TimeSpan.Zero : this.OutputEnd - this.RunEnd; + + public int GeneratedFiles { get; set; } + public DateTime End { get; set; } + public TimeSpan Duration => this.Start == default || this.End == default ? TimeSpan.Zero : this.End - this.Start; + + public Dictionary CountFilesByLanguage { get; } = new(); + public List Errors { get; } = new(); + } +} \ No newline at end of file diff --git a/Common/Statistics/StatisticsService.cs b/Common/Statistics/StatisticsService.cs new file mode 100644 index 00000000..1642cf2b --- /dev/null +++ b/Common/Statistics/StatisticsService.cs @@ -0,0 +1,183 @@ +using System.Net; +using System.Reflection; +using System.Text; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Command; +using KY.Generator.Extensions; +using KY.Generator.Models; +using KY.Generator.Settings; +using KY.Generator.Templates; +using Newtonsoft.Json; + +namespace KY.Generator.Statistics; + +public class StatisticsService +{ + private readonly IEnvironment environment; + private readonly GlobalSettingsService globalSettingsService; + public Statistic Data { get; } + + public StatisticsService(IEnvironment environment, GlobalSettingsService globalSettingsService) + { + this.environment = environment; + this.globalSettingsService = globalSettingsService; + Assembly callingAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly(); + this.Data = new Statistic { Version = callingAssembly.GetName().Version.ToString() }; + Logger.Added += this.OnLoggerAdded; + } + + private void OnLoggerAdded(object sender, EventArgs args) + { + if (args.Value.Type == LogType.Error) + { + this.Data.Errors.Add(args.Value.Message); + } + } + + public void ProgramStart(DateTime? start = null) + { + this.Data.Start = start ?? DateTime.Now; + } + + public void InitializationEnd() + { + this.Data.InitializationEnd = DateTime.Now; + Logger.Trace($"Initialized {this.Data.InitializedModules} modules in {this.Data.InitializationDuration.Format()}"); + } + + public void RunEnd(Guid outputId, string name) + { + this.Data.Id = outputId; + this.Data.Name = name; + this.Data.License = this.globalSettingsService.Read().License; + this.Data.RunEnd = DateTime.Now; + Logger.Trace($"Executed {this.Data.RanCommands.Count} commands in {this.Data.RunDuration.Format()}"); + CommandStatistic slowestCommand = this.Data.RanCommands.OrderByDescending(x => x.Duration).FirstOrDefault(); + if (slowestCommand != null) + { + Logger.Trace($"Slowest command \"{slowestCommand.Command}\" took {slowestCommand.Duration.Format()}"); + } + } + + public void RunFailed() + { + this.Data.License = this.globalSettingsService.Read().License; + } + + public void GenerateEnd(long lines) + { + this.Data.OutputLines = lines; + this.Data.OutputEnd = DateTime.Now; + Logger.Trace($"Generated {this.Data.OutputLines} lines of code in {this.Data.OutputDuration.Format()}"); + } + + public void ProgramEnd(int filesCount) + { + this.Data.GeneratedFiles = filesCount; + this.Data.End = DateTime.Now; + Logger.Trace($"Generated {this.Data.GeneratedFiles} files ({this.Data.OutputLines} lines) in {this.Data.Duration.Format()}"); + } + + public Measurement StartMeasurement() + { + return new Measurement(); + } + + public void Measure(Measurement measurement, IGeneratorCommand command) + { + measurement.Stop(); + this.Data.RanCommands.Add(new CommandStatistic { Command = command.GetType().Name, Duration = measurement.Elapsed }); + } + + public void Count(FileTemplate file) + { + this.Data.CountFilesByLanguage.AddIfNotExists(file.Options.Language.Name, 0); + this.Data.CountFilesByLanguage[file.Options.Language.Name]++; + } + + public Statistic Read(string fileName) + { + string filePath = FileSystem.Combine(this.environment.LocalApplicationData, fileName); + if (!FileSystem.FileExists(filePath)) + { + Logger.Trace($"File not found {fileName}..."); + return null; + } + Logger.Trace($"Read file {fileName}..."); + return JsonConvert.DeserializeObject(FileSystem.ReadAllText(filePath)); + } + + public void Delete(string fileName) + { + string filePath = FileSystem.Combine(this.environment.LocalApplicationData, fileName); + FileSystem.DeleteFile(filePath); + } + + public string Write() + { + string fileName = $"{this.Data.Start:yyyy-MM-dd-hh-mm-ss-fff}-{this.Data.Id}.statistics.json"; + FileSystem.WriteAllText(this.environment.LocalApplicationData, fileName, JsonConvert.SerializeObject(this.Data)); + return fileName; + } + + public void Anonymize(Statistic statistic) + { + List anonymousErrors = statistic.Errors.Select(Anonymizer.ReplaceAll).ToList(); + statistic.Errors.Clear(); + statistic.Errors.AddRange(anonymousErrors); + } + + public void Submit(Statistic statistic) + { + try + { + // statistic.RanCommands.Clear(); + this.SendCommand("", statistic); + } + catch (Exception exception) + { + Logger.Warning(exception.Message + Environment.NewLine + exception.StackTrace); + } + } + + public void Enable(List ids) + { + this.globalSettingsService.ReadAndWrite(settings => settings.StatisticsEnabled = true); + this.SendCommand("enable", ids); + } + + public void Disable(List ids) + { + this.globalSettingsService.ReadAndWrite(settings => settings.StatisticsEnabled = false); + this.SendCommand("disable", ids); + } + + private void SendCommand(string command, object data) + { + byte[] content = data == default ? Array.Empty() : Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(data)); +#if DEBUG + string baseUri = "http://localhost:8003/api/v1/statistics"; +#else + string baseUri = "https://generator.ky-programming.de/api/v1/statistics"; +#endif + HttpWebRequest request = WebRequest.CreateHttp($"{baseUri}/{command}"); + request.Method = WebRequestMethods.Http.Post; + request.ContentType = "application/json"; + request.ContentLength = content.Length; + using Stream stream = request.GetRequestStream(); + stream.Write(content); + request.GetResponse(); + } + + public void Cleanup() + { + string[] files = FileSystem.GetFiles(this.environment.LocalApplicationData, "*.statistics.json") + .Concat(FileSystem.GetFiles(this.environment.ApplicationData, "*.statistics.json")) + .ToArray(); + foreach (string file in files) + { + FileSystem.DeleteFile(file); + } + } +} diff --git a/Core/Syntax/IGeneratorRunSyntax.cs b/Common/Syntax/IGeneratorRunSyntax.cs similarity index 100% rename from Core/Syntax/IGeneratorRunSyntax.cs rename to Common/Syntax/IGeneratorRunSyntax.cs diff --git a/Core/Templates/Base/AttributeableTempalte.cs b/Common/Templates/Base/AttributeableTempalte.cs similarity index 100% rename from Core/Templates/Base/AttributeableTempalte.cs rename to Common/Templates/Base/AttributeableTempalte.cs diff --git a/Core/Templates/Base/ChainedCodeFragment.cs b/Common/Templates/Base/ChainedCodeFragment.cs similarity index 100% rename from Core/Templates/Base/ChainedCodeFragment.cs rename to Common/Templates/Base/ChainedCodeFragment.cs diff --git a/Core/Templates/Base/ICodeFragment.cs b/Common/Templates/Base/ICodeFragment.cs similarity index 100% rename from Core/Templates/Base/ICodeFragment.cs rename to Common/Templates/Base/ICodeFragment.cs diff --git a/Core/Templates/Base/MultilineCodeFragment.cs b/Common/Templates/Base/MultilineCodeFragment.cs similarity index 100% rename from Core/Templates/Base/MultilineCodeFragment.cs rename to Common/Templates/Base/MultilineCodeFragment.cs diff --git a/Core/Templates/Executing/AccessIndexTemplate.cs b/Common/Templates/Executing/AccessIndexTemplate.cs similarity index 100% rename from Core/Templates/Executing/AccessIndexTemplate.cs rename to Common/Templates/Executing/AccessIndexTemplate.cs diff --git a/Core/Templates/Executing/AppendAssignStringTemplate.cs b/Common/Templates/Executing/AppendAssignStringTemplate.cs similarity index 100% rename from Core/Templates/Executing/AppendAssignStringTemplate.cs rename to Common/Templates/Executing/AppendAssignStringTemplate.cs diff --git a/Core/Templates/Executing/AppendStringTemplate.cs b/Common/Templates/Executing/AppendStringTemplate.cs similarity index 100% rename from Core/Templates/Executing/AppendStringTemplate.cs rename to Common/Templates/Executing/AppendStringTemplate.cs diff --git a/Core/Templates/Executing/AsTemplate.cs b/Common/Templates/Executing/AsTemplate.cs similarity index 100% rename from Core/Templates/Executing/AsTemplate.cs rename to Common/Templates/Executing/AsTemplate.cs diff --git a/Core/Templates/Executing/AssignTemplate.cs b/Common/Templates/Executing/AssignTemplate.cs similarity index 100% rename from Core/Templates/Executing/AssignTemplate.cs rename to Common/Templates/Executing/AssignTemplate.cs diff --git a/Core/Templates/Executing/BaseTemplate.cs b/Common/Templates/Executing/BaseTemplate.cs similarity index 100% rename from Core/Templates/Executing/BaseTemplate.cs rename to Common/Templates/Executing/BaseTemplate.cs diff --git a/Core/Templates/Executing/BlankLineTemplate.cs b/Common/Templates/Executing/BlankLineTemplate.cs similarity index 100% rename from Core/Templates/Executing/BlankLineTemplate.cs rename to Common/Templates/Executing/BlankLineTemplate.cs diff --git a/Core/Templates/Executing/CaseTemplate.cs b/Common/Templates/Executing/CaseTemplate.cs similarity index 100% rename from Core/Templates/Executing/CaseTemplate.cs rename to Common/Templates/Executing/CaseTemplate.cs diff --git a/Core/Templates/Executing/CastTemplate.cs b/Common/Templates/Executing/CastTemplate.cs similarity index 100% rename from Core/Templates/Executing/CastTemplate.cs rename to Common/Templates/Executing/CastTemplate.cs diff --git a/Core/Templates/Executing/DeclareTemplate.cs b/Common/Templates/Executing/DeclareTemplate.cs similarity index 100% rename from Core/Templates/Executing/DeclareTemplate.cs rename to Common/Templates/Executing/DeclareTemplate.cs diff --git a/Core/Templates/Executing/ElseIfTemplate.cs b/Common/Templates/Executing/ElseIfTemplate.cs similarity index 100% rename from Core/Templates/Executing/ElseIfTemplate.cs rename to Common/Templates/Executing/ElseIfTemplate.cs diff --git a/Core/Templates/Executing/ElseTemplate.cs b/Common/Templates/Executing/ElseTemplate.cs similarity index 100% rename from Core/Templates/Executing/ElseTemplate.cs rename to Common/Templates/Executing/ElseTemplate.cs diff --git a/Core/Templates/Executing/ExecuteFieldTemplate.cs b/Common/Templates/Executing/ExecuteFieldTemplate.cs similarity index 100% rename from Core/Templates/Executing/ExecuteFieldTemplate.cs rename to Common/Templates/Executing/ExecuteFieldTemplate.cs diff --git a/Core/Templates/Executing/ExecuteGenericMethodTemplate.cs b/Common/Templates/Executing/ExecuteGenericMethodTemplate.cs similarity index 100% rename from Core/Templates/Executing/ExecuteGenericMethodTemplate.cs rename to Common/Templates/Executing/ExecuteGenericMethodTemplate.cs diff --git a/Core/Templates/Executing/ExecuteMethodTemplate.cs b/Common/Templates/Executing/ExecuteMethodTemplate.cs similarity index 100% rename from Core/Templates/Executing/ExecuteMethodTemplate.cs rename to Common/Templates/Executing/ExecuteMethodTemplate.cs diff --git a/Core/Templates/Executing/ExecutePropertyTemplate.cs b/Common/Templates/Executing/ExecutePropertyTemplate.cs similarity index 100% rename from Core/Templates/Executing/ExecutePropertyTemplate.cs rename to Common/Templates/Executing/ExecutePropertyTemplate.cs diff --git a/Core/Templates/Executing/IfTemplate.cs b/Common/Templates/Executing/IfTemplate.cs similarity index 100% rename from Core/Templates/Executing/IfTemplate.cs rename to Common/Templates/Executing/IfTemplate.cs diff --git a/Core/Templates/Executing/InlineIfTemplate.cs b/Common/Templates/Executing/InlineIfTemplate.cs similarity index 100% rename from Core/Templates/Executing/InlineIfTemplate.cs rename to Common/Templates/Executing/InlineIfTemplate.cs diff --git a/Core/Templates/Executing/LambdaTemplate.cs b/Common/Templates/Executing/LambdaTemplate.cs similarity index 100% rename from Core/Templates/Executing/LambdaTemplate.cs rename to Common/Templates/Executing/LambdaTemplate.cs diff --git a/Core/Templates/Executing/LocalVariableTemplate.cs b/Common/Templates/Executing/LocalVariableTemplate.cs similarity index 100% rename from Core/Templates/Executing/LocalVariableTemplate.cs rename to Common/Templates/Executing/LocalVariableTemplate.cs diff --git a/Core/Templates/Executing/MathematicalOperatorTemplate.cs b/Common/Templates/Executing/MathematicalOperatorTemplate.cs similarity index 100% rename from Core/Templates/Executing/MathematicalOperatorTemplate.cs rename to Common/Templates/Executing/MathematicalOperatorTemplate.cs diff --git a/Core/Templates/Executing/NewTemplate.cs b/Common/Templates/Executing/NewTemplate.cs similarity index 71% rename from Core/Templates/Executing/NewTemplate.cs rename to Common/Templates/Executing/NewTemplate.cs index dd846cb9..2f0f1b04 100644 --- a/Core/Templates/Executing/NewTemplate.cs +++ b/Common/Templates/Executing/NewTemplate.cs @@ -1,9 +1,11 @@ +using System; using System.Collections.Generic; using System.Linq; +using KY.Core; namespace KY.Generator.Templates { - public class NewTemplate : ChainedCodeFragment + public class NewTemplate : ChainedCodeFragment, ICloneable { public override string Separator => " "; public TypeTemplate Type { get; } @@ -18,5 +20,10 @@ public NewTemplate(TypeTemplate type, IEnumerable parameters) this.Type = type; this.Parameters = parameters.ToList(); } + + object ICloneable.Clone() + { + return new NewTemplate(this.Type, this.Parameters.Select(x => x.Clone())); + } } -} \ No newline at end of file +} diff --git a/Core/Templates/Executing/NotTemplate.cs b/Common/Templates/Executing/NotTemplate.cs similarity index 100% rename from Core/Templates/Executing/NotTemplate.cs rename to Common/Templates/Executing/NotTemplate.cs diff --git a/Core/Templates/Executing/NullCoalescingTemplate.cs b/Common/Templates/Executing/NullCoalescingTemplate.cs similarity index 100% rename from Core/Templates/Executing/NullCoalescingTemplate.cs rename to Common/Templates/Executing/NullCoalescingTemplate.cs diff --git a/Core/Templates/Executing/NullConditionalTemplate.cs b/Common/Templates/Executing/NullConditionalTemplate.cs similarity index 100% rename from Core/Templates/Executing/NullConditionalTemplate.cs rename to Common/Templates/Executing/NullConditionalTemplate.cs diff --git a/Core/Templates/Executing/NullValueTemplate.cs b/Common/Templates/Executing/NullValueTemplate.cs similarity index 100% rename from Core/Templates/Executing/NullValueTemplate.cs rename to Common/Templates/Executing/NullValueTemplate.cs diff --git a/Core/Templates/Executing/OperatorTemplate.cs b/Common/Templates/Executing/OperatorTemplate.cs similarity index 100% rename from Core/Templates/Executing/OperatorTemplate.cs rename to Common/Templates/Executing/OperatorTemplate.cs diff --git a/Common/Templates/Executing/ParenthesisTemplate.cs b/Common/Templates/Executing/ParenthesisTemplate.cs new file mode 100644 index 00000000..ce1c162d --- /dev/null +++ b/Common/Templates/Executing/ParenthesisTemplate.cs @@ -0,0 +1,12 @@ +namespace KY.Generator.Templates +{ + public class ParenthesisTemplate : ICodeFragment + { + public ICodeFragment Code { get; } + + public ParenthesisTemplate(ICodeFragment code) + { + this.Code = code; + } + } +} diff --git a/Core/Templates/Executing/ReturnTemplate.cs b/Common/Templates/Executing/ReturnTemplate.cs similarity index 100% rename from Core/Templates/Executing/ReturnTemplate.cs rename to Common/Templates/Executing/ReturnTemplate.cs diff --git a/Core/Templates/Executing/SwitchTemplate.cs b/Common/Templates/Executing/SwitchTemplate.cs similarity index 100% rename from Core/Templates/Executing/SwitchTemplate.cs rename to Common/Templates/Executing/SwitchTemplate.cs diff --git a/Core/Templates/Executing/ThisTemplate.cs b/Common/Templates/Executing/ThisTemplate.cs similarity index 100% rename from Core/Templates/Executing/ThisTemplate.cs rename to Common/Templates/Executing/ThisTemplate.cs diff --git a/Core/Templates/Executing/ThrowTemplate.cs b/Common/Templates/Executing/ThrowTemplate.cs similarity index 100% rename from Core/Templates/Executing/ThrowTemplate.cs rename to Common/Templates/Executing/ThrowTemplate.cs diff --git a/Core/Templates/Executing/TypeOfTemplate.cs b/Common/Templates/Executing/TypeOfTemplate.cs similarity index 100% rename from Core/Templates/Executing/TypeOfTemplate.cs rename to Common/Templates/Executing/TypeOfTemplate.cs diff --git a/Core/Templates/Executing/WhileTemplate.cs b/Common/Templates/Executing/WhileTemplate.cs similarity index 100% rename from Core/Templates/Executing/WhileTemplate.cs rename to Common/Templates/Executing/WhileTemplate.cs diff --git a/Core/Templates/Extensions/AnonymousObjectTemplateExtension.cs b/Common/Templates/Extensions/AnonymousObjectTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/AnonymousObjectTemplateExtension.cs rename to Common/Templates/Extensions/AnonymousObjectTemplateExtension.cs diff --git a/Core/Templates/Extensions/AttributableTemplateExtension.cs b/Common/Templates/Extensions/AttributableTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/AttributableTemplateExtension.cs rename to Common/Templates/Extensions/AttributableTemplateExtension.cs diff --git a/Core/Templates/Extensions/ChainedCodeFragmentExtension.cs b/Common/Templates/Extensions/ChainedCodeFragmentExtension.cs similarity index 100% rename from Core/Templates/Extensions/ChainedCodeFragmentExtension.cs rename to Common/Templates/Extensions/ChainedCodeFragmentExtension.cs diff --git a/Common/Templates/Extensions/ClassTemplateExtension.cs b/Common/Templates/Extensions/ClassTemplateExtension.cs new file mode 100644 index 00000000..d60a0f3d --- /dev/null +++ b/Common/Templates/Extensions/ClassTemplateExtension.cs @@ -0,0 +1,130 @@ +using System.Linq; +using KY.Generator.Extensions; +using KY.Generator.Transfer; + +namespace KY.Generator.Templates.Extensions; + +public static class ClassTemplateExtension +{ + public static UsingTemplate AddUsing(this ClassTemplate classTemplate, string nameSpace, string type, string path) + { + return classTemplate.AddUsing(new UsingTemplate(nameSpace, type, path)); + } + + public static UsingTemplate AddUsing(this ClassTemplate classTemplate, TypeTransferObject type, string path) + { + return classTemplate.AddUsing(new LinkedUsingTemplate(type, path)); + } + + public static UsingTemplate AddUsing(this ClassTemplate classTemplate, UsingTemplate usingTemplate) + { + classTemplate.Usings.Add(usingTemplate); + return usingTemplate; + } + + public static ClassTemplate WithUsing(this ClassTemplate classTemplate, UsingTemplate usingTemplate) + { + classTemplate.Usings.Add(usingTemplate); + return classTemplate; + } + + public static ClassTemplate WithUsing(this ClassTemplate classTemplate, string nameSpace, string type, string path) + { + classTemplate.AddUsing(nameSpace, type, path); + return classTemplate; + } + + public static ClassTemplate WithGenericParameter(this ClassTemplate classTemplate, string name, params TypeTemplate[] constraints) + { + ClassGenericTemplate genericTemplate = new(name); + genericTemplate.Constraints.AddRange(constraints); + classTemplate.Generics.Add(genericTemplate); + return classTemplate; + } + + public static ClassTemplate Static(this ClassTemplate classTemplate, bool value = true) + { + classTemplate.IsStatic = value; + return classTemplate; + } + + public static ClassTemplate Abstract(this ClassTemplate classTemplate, bool value = true) + { + classTemplate.IsAbstract = value; + return classTemplate; + } + + public static FieldTemplate AddField(this ClassTemplate classTemplate, string name, TypeTemplate type) + { + FieldTemplate field = new(classTemplate, name, type); + classTemplate.Fields.Add(field); + return field; + } + + public static PropertyTemplate AddProperty(this ClassTemplate classTemplate, string name, TypeTemplate type) + { + PropertyTemplate property = new(classTemplate, name, type); + classTemplate.Properties.Add(property); + return property; + } + + public static MethodTemplate AddMethod(this ClassTemplate classTemplate, string name, TypeTemplate type) + { + MethodTemplate methodTemplate = new(classTemplate, name, type); + classTemplate.Methods.Add(methodTemplate); + return methodTemplate; + } + + public static ExtensionMethodTemplate AddExtensionMethod(this ClassTemplate classTemplate, string name, TypeTemplate type) + { + ExtensionMethodTemplate methodTemplate = new(classTemplate, name, type); + classTemplate.Methods.Add(methodTemplate); + return methodTemplate; + } + + public static ClassTemplate AddClass(this ClassTemplate classTemplate, string name, params TypeTemplate[] basedOn) + { + ClassTemplate subClass = new(classTemplate, name, basedOn); + classTemplate.Classes.Add(subClass); + return subClass; + } + + public static TypeTemplate ToType(this ClassTemplate classTemplate) + { + return classTemplate.IsGeneric() ? Code.Instance.Generic(classTemplate.Name, classTemplate.Generics.Select(x => Code.Instance.Type(x.Name)).ToArray()) : Code.Instance.Type(classTemplate.Name); + } + + public static UsingTemplate ToUsing(this ClassTemplate classTemplate) + { + return new UsingTemplate(classTemplate.Namespace.Name, classTemplate.Name, classTemplate.Namespace.File.RelativePath); + } + + public static bool IsGeneric(this ClassTemplate classTemplate) + { + return classTemplate.Generics.Count > 0; + } + + public static ClassTemplate WithCode(this ClassTemplate classTemplate, ICodeFragment fragment) + { + classTemplate.Code = fragment; + return classTemplate; + } + + public static ClassTemplate WithComment(this ClassTemplate classTemplate, string description, CommentType type = CommentType.Block) + { + classTemplate.Comment = new CommentTemplate(description, type); + return classTemplate; + } + + public static ClassTemplate FormatName(this ClassTemplate classTemplate, GeneratorOptions options, bool force = false) + { + classTemplate.Name = Formatter.FormatClass(classTemplate.Name, options, force); + return classTemplate; + } + + public static ClassTemplate FormatPrefix(this ClassTemplate classTemplate, GeneratorOptions options, bool isInterface = false) + { + classTemplate.Name = classTemplate.Name.Prefix(isInterface ? options.Formatting.InterfacePrefix : options.Formatting.ClassPrefix); + return classTemplate; + } +} \ No newline at end of file diff --git a/Core/Templates/Extensions/CommentTemplateExtension.cs b/Common/Templates/Extensions/CommentTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/CommentTemplateExtension.cs rename to Common/Templates/Extensions/CommentTemplateExtension.cs diff --git a/Core/Templates/Extensions/DeclareTemplateExtension.cs b/Common/Templates/Extensions/DeclareTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/DeclareTemplateExtension.cs rename to Common/Templates/Extensions/DeclareTemplateExtension.cs diff --git a/Common/Templates/Extensions/EnumTemplateExtension.cs b/Common/Templates/Extensions/EnumTemplateExtension.cs new file mode 100644 index 00000000..4bcef7ae --- /dev/null +++ b/Common/Templates/Extensions/EnumTemplateExtension.cs @@ -0,0 +1,26 @@ +namespace KY.Generator.Templates.Extensions; + +public static class EnumTemplateExtension +{ + public static EnumTemplate FormatName(this EnumTemplate enumTemplate, GeneratorOptions options, bool force = false) + { + enumTemplate.Name = Formatter.FormatClass(enumTemplate.Name, options, force); + return enumTemplate; + } + + public static EnumTemplate AddValue(this EnumTemplate enumTemplate, string name, int? value = null) + { + enumTemplate.Values.Add(new EnumValueTemplate(name, Code.Instance.Number(value ?? enumTemplate.Values.Count))); + return enumTemplate; + } + + public static TypeTemplate ToType(this EnumTemplate enumTemplate) + { + return Code.Instance.Type(enumTemplate.Name); + } + + public static UsingTemplate ToUsing(this EnumTemplate enumTemplate) + { + return new UsingTemplate(enumTemplate.Namespace.Name, enumTemplate.Name, enumTemplate.Namespace.File.RelativePath); + } +} \ No newline at end of file diff --git a/Core/Templates/Extensions/ExecuteMethodTemplateExtension.cs b/Common/Templates/Extensions/ExecuteMethodTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/ExecuteMethodTemplateExtension.cs rename to Common/Templates/Extensions/ExecuteMethodTemplateExtension.cs diff --git a/Common/Templates/Extensions/FieldTemplateExtension.cs b/Common/Templates/Extensions/FieldTemplateExtension.cs new file mode 100644 index 00000000..695fd588 --- /dev/null +++ b/Common/Templates/Extensions/FieldTemplateExtension.cs @@ -0,0 +1,60 @@ +using KY.Generator.Models; + +namespace KY.Generator.Templates.Extensions; + +public static class FieldTemplateExtension +{ + public static FieldTemplate Public(this FieldTemplate field) + { + field.Visibility = Visibility.Public; + return field; + } + + public static FieldTemplate Protected(this FieldTemplate field) + { + field.Visibility = Visibility.Protected; + return field; + } + + public static FieldTemplate Static(this FieldTemplate field, bool value = true) + { + field.IsStatic = value; + return field; + } + + public static FieldTemplate Constant(this FieldTemplate field, bool value = true) + { + field.IsConstant = value; + return field; + } + + public static FieldTemplate Readonly(this FieldTemplate field, bool value = true) + { + field.IsReadonly = value; + return field; + } + + public static FieldTemplate Optional(this FieldTemplate field, bool value = true) + { + field.IsOptional = value; + return field; + } + + public static FieldTemplate Default(this FieldTemplate field, ICodeFragment code) + { + field.DefaultValue = code; + return field; + } + + public static FieldTemplate FormatName(this FieldTemplate field, GeneratorOptions options, bool force = false) + { + field.Name = Formatter.FormatField(field.Name, options, force); + return field; + } + + public static FieldTemplate WithComment(this FieldTemplate field, string description) + { + field.Comment = new CommentTemplate(description, CommentType.Summary); + return field; + } +} \ No newline at end of file diff --git a/Common/Templates/Extensions/FileTemplateExtension.cs b/Common/Templates/Extensions/FileTemplateExtension.cs new file mode 100644 index 00000000..78937d61 --- /dev/null +++ b/Common/Templates/Extensions/FileTemplateExtension.cs @@ -0,0 +1,78 @@ +using System.Collections.Generic; +using KY.Generator.Transfer; + +namespace KY.Generator.Templates.Extensions +{ + public static class FileTemplateExtension + { + public static FileTemplate WithName(this FileTemplate file, string name) + { + file.Name = name; + return file; + } + + public static FileTemplate WithHeader(this FileTemplate file, string header) + { + file.Header.Description = header; + return file; + } + + public static NamespaceTemplate AddNamespace(this FileTemplate file, string nameSpace) + { + NamespaceTemplate namespaceTemplate = new NamespaceTemplate(file, nameSpace); + file.Namespaces.Add(namespaceTemplate); + return namespaceTemplate; + } + + public static void AddTo(this FileTemplate file, IList list) + { + list.Add(file); + } + + public static UsingTemplate AddUsing(this FileTemplate fileTemplate, string nameSpace, string type, string path) + { + return fileTemplate.AddUsing(new UsingTemplate(nameSpace, type, path)); + } + + public static UsingTemplate AddUsing(this FileTemplate fileTemplate, TypeTransferObject type, string path) + { + return fileTemplate.AddUsing(new LinkedUsingTemplate(type, path)); + } + + public static UsingTemplate AddUsing(this FileTemplate fileTemplate, UsingTemplate usingTemplate) + { + fileTemplate.Usings.Add(usingTemplate); + return usingTemplate; + } + + public static FileTemplate WithUsing(this FileTemplate fileTemplate, UsingTemplate usingTemplate) + { + fileTemplate.Usings.Add(usingTemplate); + return fileTemplate; + } + + public static FileTemplate WithUsing(this FileTemplate fileTemplate, string nameSpace, string type, string path) + { + fileTemplate.AddUsing(nameSpace, type, path); + return fileTemplate; + } + + public static FileTemplate IgnoreOutputId(this FileTemplate fileTemplate) + { + fileTemplate.WriteOutputId = false; + return fileTemplate; + } + + public static FileTemplate ForceOverwrite(this FileTemplate fileTemplate) + { + fileTemplate.ForceOverwrite = true; + return fileTemplate; + } + + public static FileTemplate NoHeader(this FileTemplate fileTemplate) + { + fileTemplate.Header.Description = null; + return fileTemplate; + } + } +} diff --git a/Common/Templates/Extensions/FileTemplateListExtension.cs b/Common/Templates/Extensions/FileTemplateListExtension.cs new file mode 100644 index 00000000..6aa81d78 --- /dev/null +++ b/Common/Templates/Extensions/FileTemplateListExtension.cs @@ -0,0 +1,13 @@ +using System.Collections.Generic; + +namespace KY.Generator.Templates.Extensions; + +public static class FileTemplateListExtension +{ + public static FileTemplate AddFile(this IList files, string relativePath, GeneratorOptions options) + { + FileTemplate file = new(relativePath, options); + files.Add(file); + return file; + } +} \ No newline at end of file diff --git a/Core/Templates/Extensions/IfTemplateExtension.cs b/Common/Templates/Extensions/IfTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/IfTemplateExtension.cs rename to Common/Templates/Extensions/IfTemplateExtension.cs diff --git a/Common/Templates/Extensions/MethodTemplateExtension.cs b/Common/Templates/Extensions/MethodTemplateExtension.cs new file mode 100644 index 00000000..597e3809 --- /dev/null +++ b/Common/Templates/Extensions/MethodTemplateExtension.cs @@ -0,0 +1,85 @@ +using KY.Generator.Models; + +namespace KY.Generator.Templates.Extensions; + +public static class MethodTemplateExtension +{ + public static MethodTemplate Internal(this MethodTemplate methodTemplate) + { + methodTemplate.Visibility = Visibility.Internal; + return methodTemplate; + } + + public static MethodTemplate Protected(this MethodTemplate methodTemplate) + { + methodTemplate.Visibility = Visibility.Protected; + return methodTemplate; + } + + public static MethodTemplate Private(this MethodTemplate methodTemplate) + { + methodTemplate.Visibility = Visibility.Private; + return methodTemplate; + } + + public static MethodTemplate Static(this MethodTemplate methodTemplate, bool value = true) + { + methodTemplate.IsStatic = value; + return methodTemplate; + } + + public static MethodTemplate Override(this MethodTemplate methodTemplate, bool value = true) + { + methodTemplate.IsOverride = value; + return methodTemplate; + } + + public static MethodTemplate WithGeneric(this MethodTemplate methodTemplate, string alias, TypeTemplate? defaultType = null) + { + methodTemplate.Generics.Add(new MethodGenericTemplate(alias, defaultType)); + return methodTemplate; + } + + public static ParameterTemplate AddParameter(this MethodTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + ParameterTemplate parameter = new(type, name, defaultValue); + methodTemplate.Parameters.Add(parameter); + return parameter; + } + + public static MethodTemplate WithParameter(this MethodTemplate methodTemplate, ParameterTemplate parameter) + { + methodTemplate.Parameters.Add(parameter); + return methodTemplate; + } + + public static MethodTemplate WithParameter(this MethodTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + methodTemplate.AddParameter(type, name, defaultValue); + return methodTemplate; + } + + public static MethodTemplate WithParameters(this MethodTemplate methodTemplate, IEnumerable parameters) + { + methodTemplate.Parameters.AddRange(parameters); + return methodTemplate; + } + + public static MethodTemplate WithComment(this MethodTemplate methodTemplate, string description) + { + methodTemplate.Comment = new CommentTemplate(description, CommentType.Summary); + return methodTemplate; + } + + public static MethodTemplate WithCode(this MethodTemplate methodTemplate, ICodeFragment code) + { + methodTemplate.Code.Fragments.Add(code); + return methodTemplate; + } + + public static MethodTemplate FormatName(this MethodTemplate methodTemplate, GeneratorOptions options, bool force = false) + { + methodTemplate.Name = Formatter.FormatMethod(methodTemplate.Name, options, force); + return methodTemplate; + } +} diff --git a/Core/Templates/Extensions/NamespaceExtension.cs b/Common/Templates/Extensions/NamespaceExtension.cs similarity index 100% rename from Core/Templates/Extensions/NamespaceExtension.cs rename to Common/Templates/Extensions/NamespaceExtension.cs diff --git a/Common/Templates/Extensions/ParameterTemplateExtension.cs b/Common/Templates/Extensions/ParameterTemplateExtension.cs new file mode 100644 index 00000000..1eabefbd --- /dev/null +++ b/Common/Templates/Extensions/ParameterTemplateExtension.cs @@ -0,0 +1,10 @@ +namespace KY.Generator.Templates.Extensions; + +public static class ParameterTemplateExtension +{ + public static ParameterTemplate FormatName(this ParameterTemplate parameter, GeneratorOptions options, bool force = false) + { + parameter.Name = Formatter.FormatParameter(parameter.Name, options, force); + return parameter; + } +} \ No newline at end of file diff --git a/Common/Templates/Extensions/PropertyTemplateExtension.cs b/Common/Templates/Extensions/PropertyTemplateExtension.cs new file mode 100644 index 00000000..a8ce1cde --- /dev/null +++ b/Common/Templates/Extensions/PropertyTemplateExtension.cs @@ -0,0 +1,86 @@ +using KY.Generator.Models; + +namespace KY.Generator.Templates.Extensions; + +public static class PropertyTemplateExtension +{ + public static PropertyTemplate Internal(this PropertyTemplate property) + { + property.Visibility = Visibility.Internal; + return property; + } + + public static PropertyTemplate Protected(this PropertyTemplate property) + { + property.Visibility = Visibility.Protected; + return property; + } + + public static PropertyTemplate Private(this PropertyTemplate property) + { + property.Visibility = Visibility.Private; + return property; + } + + public static PropertyTemplate Virtual(this PropertyTemplate property, bool value = true) + { + property.IsVirtual = value; + return property; + } + + public static PropertyTemplate Static(this PropertyTemplate property, bool value = true) + { + property.IsStatic = value; + return property; + } + + public static PropertyTemplate Optional(this PropertyTemplate property, bool value = true) + { + property.IsOptional = value; + return property; + } + + public static PropertyTemplate ReadOnly(this PropertyTemplate property) + { + property.HasSetter = false; + return property; + } + + public static PropertyTemplate ReadOnlyWithCode(this PropertyTemplate property, ICodeFragment expression) + { + property.HasGetter = false; + property.HasSetter = false; + property.Expression = expression; + return property; + } + + public static PropertyTemplate WithDefaultValue(this PropertyTemplate property, ICodeFragment defaultValue) + { + property.DefaultValue = defaultValue; + return property; + } + + public static PropertyTemplate WithComment(this PropertyTemplate property, string description) + { + property.Comment = new CommentTemplate(description, CommentType.Summary); + return property; + } + + public static PropertyTemplate WithSetter(this PropertyTemplate property, ICodeFragment code) + { + property.Setter = code; + return property; + } + + public static PropertyTemplate WithGetter(this PropertyTemplate property, ICodeFragment code) + { + property.Getter = code; + return property; + } + + public static PropertyTemplate FormatName(this PropertyTemplate propertyTemplate, GeneratorOptions options, bool force = false) + { + propertyTemplate.Name = Formatter.FormatProperty(propertyTemplate.Name, options, force); + return propertyTemplate; + } +} \ No newline at end of file diff --git a/Common/Templates/Extensions/PropertyValueTemplateExtension.cs b/Common/Templates/Extensions/PropertyValueTemplateExtension.cs new file mode 100644 index 00000000..d0d02b25 --- /dev/null +++ b/Common/Templates/Extensions/PropertyValueTemplateExtension.cs @@ -0,0 +1,10 @@ +namespace KY.Generator.Templates.Extensions; + +public static class PropertyValueTemplateExtension +{ + public static PropertyValueTemplate FormatName(this PropertyValueTemplate propertyTemplate, GeneratorOptions options, bool force = false) + { + propertyTemplate.Name = Formatter.FormatProperty(propertyTemplate.Name, options, force); + return propertyTemplate; + } +} \ No newline at end of file diff --git a/Core/Templates/Extensions/WhileTemplateExtension.cs b/Common/Templates/Extensions/WhileTemplateExtension.cs similarity index 100% rename from Core/Templates/Extensions/WhileTemplateExtension.cs rename to Common/Templates/Extensions/WhileTemplateExtension.cs diff --git a/Core/Templates/Structural/AttributeTemplate.cs b/Common/Templates/Structural/AttributeTemplate.cs similarity index 77% rename from Core/Templates/Structural/AttributeTemplate.cs rename to Common/Templates/Structural/AttributeTemplate.cs index 912d54c6..e33e1beb 100644 --- a/Core/Templates/Structural/AttributeTemplate.cs +++ b/Common/Templates/Structural/AttributeTemplate.cs @@ -9,17 +9,16 @@ public class AttributeTemplate : ICodeFragment public string Name { get; } public ICodeFragment[] Code { get; private set; } public bool HasValue => this.Code != null && this.Code.Length > 0; - public Dictionary Properties { get; } + public Dictionary Properties { get; } = new(); public bool IsInline { get; set; } public AttributeTemplate(string name, params ICodeFragment[] code) { this.Name = name; this.Code = code; - this.Properties = new Dictionary(); } - public AttributeTemplate Property(string name, object value) + public AttributeTemplate Property(string name, ICodeFragment value) { this.Properties.Add(name, value); return this; diff --git a/Core/Templates/Structural/BaseTypeTemplate.cs b/Common/Templates/Structural/BaseTypeTemplate.cs similarity index 100% rename from Core/Templates/Structural/BaseTypeTemplate.cs rename to Common/Templates/Structural/BaseTypeTemplate.cs diff --git a/Core/Templates/Structural/ClassGenericTemplate.cs b/Common/Templates/Structural/ClassGenericTemplate.cs similarity index 100% rename from Core/Templates/Structural/ClassGenericTemplate.cs rename to Common/Templates/Structural/ClassGenericTemplate.cs diff --git a/Core/Templates/Structural/ClassTemplate.cs b/Common/Templates/Structural/ClassTemplate.cs similarity index 100% rename from Core/Templates/Structural/ClassTemplate.cs rename to Common/Templates/Structural/ClassTemplate.cs diff --git a/Core/Templates/Structural/CommentTemplate.cs b/Common/Templates/Structural/CommentTemplate.cs similarity index 100% rename from Core/Templates/Structural/CommentTemplate.cs rename to Common/Templates/Structural/CommentTemplate.cs diff --git a/Core/Templates/Structural/ConstraintTemplate.cs b/Common/Templates/Structural/ConstraintTemplate.cs similarity index 100% rename from Core/Templates/Structural/ConstraintTemplate.cs rename to Common/Templates/Structural/ConstraintTemplate.cs diff --git a/Core/Templates/Structural/EnumTemplate.cs b/Common/Templates/Structural/EnumTemplate.cs similarity index 100% rename from Core/Templates/Structural/EnumTemplate.cs rename to Common/Templates/Structural/EnumTemplate.cs diff --git a/Core/Templates/Structural/EnumValueTemplate.cs b/Common/Templates/Structural/EnumValueTemplate.cs similarity index 100% rename from Core/Templates/Structural/EnumValueTemplate.cs rename to Common/Templates/Structural/EnumValueTemplate.cs diff --git a/Common/Templates/Structural/ExportTemplate.cs b/Common/Templates/Structural/ExportTemplate.cs new file mode 100644 index 00000000..e14fb29a --- /dev/null +++ b/Common/Templates/Structural/ExportTemplate.cs @@ -0,0 +1,9 @@ +namespace KY.Generator.Templates +{ + public class ExportTemplate : UsingTemplate + { + public ExportTemplate(string nameSpace, string type, string path) + : base(nameSpace, type, path) + { } + } +} \ No newline at end of file diff --git a/Core/Templates/Structural/ExtensionMethodTemplate.cs b/Common/Templates/Structural/ExtensionMethodTemplate.cs similarity index 100% rename from Core/Templates/Structural/ExtensionMethodTemplate.cs rename to Common/Templates/Structural/ExtensionMethodTemplate.cs diff --git a/Common/Templates/Structural/FieldTemplate.cs b/Common/Templates/Structural/FieldTemplate.cs new file mode 100644 index 00000000..b92d856b --- /dev/null +++ b/Common/Templates/Structural/FieldTemplate.cs @@ -0,0 +1,43 @@ +using System.Diagnostics; +using KY.Generator.Models; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("Field {Name}: {Type}")] +public class FieldTemplate : AttributeableTempalte +{ + public string Name { get; set; } + public TypeTemplate Type { get; } + public bool IsStatic { get; set; } + public bool IsConstant { get; set; } + public Visibility Visibility { get; set; } + public ICodeFragment? DefaultValue { get; set; } + public ClassTemplate Class { get; } + public CommentTemplate Comment { get; set; } + public bool IsReadonly { get; set; } + public bool IsOptional { get; set; } + + public bool IsNullable { get; set; } + + // TODO: Remove temporary property Strict + public bool Strict { get; set; } + + public FieldTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) + { + this.Class = classTemplate; + this.Name = name; + this.Type = type; + this.Visibility = Visibility.Private; + } + + public override bool Equals(object obj) + { + FieldTemplate property = obj as FieldTemplate; + return property != null && this.Name.Equals(property.Name); + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } +} \ No newline at end of file diff --git a/Common/Templates/Structural/FileTemplate.cs b/Common/Templates/Structural/FileTemplate.cs new file mode 100644 index 00000000..e25907ed --- /dev/null +++ b/Common/Templates/Structural/FileTemplate.cs @@ -0,0 +1,111 @@ +using System.Diagnostics; +using KY.Generator.Properties; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("File {Name ?? \"No namespace\"}")] +public class FileTemplate : ICodeFragment +{ + public GeneratorOptions Options { get; } + private string? name; + + public string? Name + { + get => this.name ?? this.Namespaces.FirstOrDefault(x => x.Children.Any(y => y.IsPublic))?.Children.FirstOrDefault(x => x.IsPublic)?.Name; + set => this.name = value; + } + + public string? FullPath { get; set; } + public string? RelativePath { get; } + public List Namespaces { get; } = []; + public CommentTemplate Header { get; } + public List Usings { get; } = []; + public bool WriteOutputId { get; set; } = true; + public bool ForceOverwrite { get; set; } + public Dictionary Linters { get; set; } + + public FileTemplate(string? relativePath, GeneratorOptions options) + { + this.RelativePath = relativePath ?? string.Empty; + this.Options = options; + this.Header = new CommentTemplate(options.AddHeader ? Resources.Header : null); + } + + public IEnumerable GetUsingsByNamespace() + { + List usings = this.Usings.ToList(); + foreach (NamespaceTemplate namespaceTemplate in this.Namespaces) + { + foreach (INamespaceChildren namespaceChildren in namespaceTemplate.Children) + { + foreach (UsingTemplate usingTemplate in this.GetUsings(namespaceChildren)) + { + if (namespaceTemplate.Name != usingTemplate.Namespace && usings.All(x => x.Namespace != usingTemplate.Namespace)) + { + usings.Add(usingTemplate); + } + } + } + } + return usings.OrderBy(x => x.Namespace, new NamespaceComparer()); + } + + public IEnumerable GetUsingsByTypeAndPath() + { + List usings = this.Usings.ToList(); + foreach (NamespaceTemplate namespaceTemplate in this.Namespaces) + { + foreach (INamespaceChildren namespaceChildren in namespaceTemplate.Children) + { + foreach (UsingTemplate usingTemplate in this.GetUsings(namespaceChildren)) + { + if (namespaceTemplate.Children.Any(x => x.Name == usingTemplate.Type)) + { + continue; + } + if (usings.All(x => x.Path != usingTemplate.Path || x.Type != usingTemplate.Type)) + { + usings.Add(usingTemplate); + } + } + } + } + return usings.OrderBy(x => $"{x.Path}/{x.Type}"); + } + + private IEnumerable GetUsings(INamespaceChildren namespaceChildren) + { + foreach (UsingTemplate usingTemplate in this.Usings) + { + yield return usingTemplate; + } + foreach (UsingTemplate usingTemplate in namespaceChildren.Usings) + { + yield return usingTemplate; + } + if (namespaceChildren is ClassTemplate classTemplate) + { + foreach (ClassTemplate subclassTemplate in classTemplate.Classes) + { + foreach (UsingTemplate usingTemplate in this.GetUsings(subclassTemplate)) + { + yield return usingTemplate; + } + } + } + } + + private class NamespaceComparer : IComparer + { + public int Compare(string left, string right) + { + bool leftSystem = left != null && left.StartsWith("System"); + bool rightSystem = right != null && right.StartsWith("System"); + if (leftSystem == rightSystem) + { + return StringComparer.CurrentCulture.Compare(left, right); + } + return leftSystem ? -1 : 1; + } + } +} diff --git a/Common/Templates/Structural/GenericTypeTemplate.cs b/Common/Templates/Structural/GenericTypeTemplate.cs new file mode 100644 index 00000000..e1111736 --- /dev/null +++ b/Common/Templates/Structural/GenericTypeTemplate.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; + +namespace KY.Generator.Templates +{ + public class GenericTypeTemplate : TypeTemplate + { + public List Types { get; } = new(); + + public GenericTypeTemplate(string name, string nameSpace = null, bool isNullable = false, bool fromSystem = false, bool isInterface = false) + : base(name, nameSpace, isInterface, isNullable, fromSystem) + { } + + protected GenericTypeTemplate() + { } + } +} diff --git a/Common/Templates/Structural/LinkedGenericTypeTemplate.cs b/Common/Templates/Structural/LinkedGenericTypeTemplate.cs new file mode 100644 index 00000000..81b83ca5 --- /dev/null +++ b/Common/Templates/Structural/LinkedGenericTypeTemplate.cs @@ -0,0 +1,20 @@ +using KY.Generator.Transfer; + +namespace KY.Generator.Templates +{ + public class LinkedGenericTypeTemplate : GenericTypeTemplate + { + private readonly TypeTransferObject type; + + public override string Name => this.type.Name; + public override string Namespace => this.type.Namespace; + public override bool FromSystem => this.type.FromSystem; + public override bool IsInterface => this.type.IsInterface; + public override bool IsNullable => this.type.IsNullable; + + public LinkedGenericTypeTemplate(TypeTransferObject type) + { + this.type = type; + } + } +} \ No newline at end of file diff --git a/Common/Templates/Structural/LinkedTypeTemplate.cs b/Common/Templates/Structural/LinkedTypeTemplate.cs new file mode 100644 index 00000000..77834850 --- /dev/null +++ b/Common/Templates/Structural/LinkedTypeTemplate.cs @@ -0,0 +1,20 @@ +using KY.Generator.Transfer; + +namespace KY.Generator.Templates +{ + public class LinkedTypeTemplate : TypeTemplate + { + private readonly TypeTransferObject type; + + public override string Name => this.type.Name; + public override string Namespace => this.type.Namespace; + public override bool FromSystem => this.type.FromSystem; + public override bool IsInterface => this.type.IsInterface; + public override bool IsNullable => this.type.IsNullable; + + public LinkedTypeTemplate(TypeTransferObject type) + { + this.type = type; + } + } +} \ No newline at end of file diff --git a/Common/Templates/Structural/LinkedUsingTemplate.cs b/Common/Templates/Structural/LinkedUsingTemplate.cs new file mode 100644 index 00000000..1c351f49 --- /dev/null +++ b/Common/Templates/Structural/LinkedUsingTemplate.cs @@ -0,0 +1,22 @@ +using System.Diagnostics; +using KY.Generator.Transfer; + +namespace KY.Generator.Templates +{ + [DebuggerDisplay("Using {Type} (linked)")] + public class LinkedUsingTemplate : UsingTemplate + { + private readonly TypeTransferObject type; + private readonly string path; + + public override string Namespace => this.type.Namespace; + public override string Type => this.type.OverrideType ?? this.type.Name; + public override string Path => $"{this.path}/{this.type.FileName}"; + + public LinkedUsingTemplate(TypeTransferObject type, string path) + { + this.type = type; + this.path = path; + } + } +} diff --git a/Common/Templates/Structural/MethodGenericTemplate.cs b/Common/Templates/Structural/MethodGenericTemplate.cs new file mode 100644 index 00000000..c24007c2 --- /dev/null +++ b/Common/Templates/Structural/MethodGenericTemplate.cs @@ -0,0 +1,13 @@ +namespace KY.Generator.Templates; + +public class MethodGenericTemplate : ICodeFragment +{ + public string Alias { get; set; } + public TypeTemplate? DefaultType { get; set; } + + public MethodGenericTemplate(string alias, TypeTemplate? defaultType = null) + { + this.Alias = alias; + this.DefaultType = defaultType; + } +} \ No newline at end of file diff --git a/Common/Templates/Structural/MethodTemplate.cs b/Common/Templates/Structural/MethodTemplate.cs new file mode 100644 index 00000000..6389e5f2 --- /dev/null +++ b/Common/Templates/Structural/MethodTemplate.cs @@ -0,0 +1,38 @@ +using System.Diagnostics; +using KY.Generator.Models; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("Method {Name}")] +public class MethodTemplate : AttributeableTempalte +{ + public string Name { get; set; } + public TypeTemplate? Type { get; } + public Visibility Visibility { get; set; } = Visibility.Public; + public bool IsStatic { get; set; } + public bool IsOverride { get; set; } + public List Parameters { get; } = []; + public MultilineCodeFragment Code { get; } = new(); + public ClassTemplate Class { get; } + public CommentTemplate? Comment { get; set; } + public List Generics { get; set; } = []; + + public MethodTemplate(ClassTemplate classTemplate, string name, TypeTemplate? type) + { + this.Class = classTemplate; + this.Name = name; + this.Type = type; + } + + public MethodTemplate(MethodTemplate methodTemplate) + : this(methodTemplate.Class, methodTemplate.Name, methodTemplate.Type) + { + this.Visibility = methodTemplate.Visibility; + this.IsStatic = methodTemplate.IsStatic; + this.IsOverride = methodTemplate.IsOverride; + this.Parameters.AddRange(methodTemplate.Parameters); + this.Code = methodTemplate.Code; + this.Comment = methodTemplate.Comment; + this.Generics.AddRange(methodTemplate.Generics); + } +} diff --git a/Core/Templates/Structural/NamespaceTemplate.cs b/Common/Templates/Structural/NamespaceTemplate.cs similarity index 100% rename from Core/Templates/Structural/NamespaceTemplate.cs rename to Common/Templates/Structural/NamespaceTemplate.cs diff --git a/Common/Templates/Structural/ParameterTemplate.cs b/Common/Templates/Structural/ParameterTemplate.cs new file mode 100644 index 00000000..6702dd1f --- /dev/null +++ b/Common/Templates/Structural/ParameterTemplate.cs @@ -0,0 +1,21 @@ +namespace KY.Generator.Templates; + +public class ParameterTemplate : AttributeableTempalte +{ + public TypeTemplate Type { get; set; } + public string Name { get; set; } + public ICodeFragment? DefaultValue { get; set; } + public bool IsOptional { get; set; } + + public ParameterTemplate(TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + this.Type = type; + this.Name = name; + this.DefaultValue = defaultValue; + } + + public static ParameterTemplate Create(TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + return new ParameterTemplate(type, name, defaultValue); + } +} diff --git a/Common/Templates/Structural/PropertyTemplate.cs b/Common/Templates/Structural/PropertyTemplate.cs new file mode 100644 index 00000000..c4037a94 --- /dev/null +++ b/Common/Templates/Structural/PropertyTemplate.cs @@ -0,0 +1,46 @@ +using System.Diagnostics; +using KY.Generator.Models; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("Property {Name}: {Type}")] +public class PropertyTemplate : AttributeableTempalte +{ + public string Name { get; set; } + public TypeTemplate Type { get; } + public bool HasGetter { get; set; } + public bool HasSetter { get; set; } + public bool IsVirtual { get; set; } + public bool IsStatic { get; set; } + public bool IsOptional { get; set; } + public bool IsNullable { get; set; } + public Visibility Visibility { get; set; } + public ICodeFragment? DefaultValue { get; set; } + public ICodeFragment Expression { get; set; } + public ClassTemplate Class { get; } + public CommentTemplate Comment { get; set; } + public ICodeFragment? Setter { get; set; } + public ICodeFragment? Getter { get; set; } + public bool Strict { get; set; } + + public PropertyTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) + { + this.Class = classTemplate; + this.Name = name; + this.Type = type; + this.HasGetter = true; + this.HasSetter = true; + this.Visibility = Visibility.Public; + } + + public override bool Equals(object obj) + { + PropertyTemplate property = obj as PropertyTemplate; + return property != null && this.Name.Equals(property.Name); + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } +} \ No newline at end of file diff --git a/Common/Templates/Structural/StaticFileTemplate.cs b/Common/Templates/Structural/StaticFileTemplate.cs new file mode 100644 index 00000000..3d716896 --- /dev/null +++ b/Common/Templates/Structural/StaticFileTemplate.cs @@ -0,0 +1,21 @@ +using System.Diagnostics; +using System.Text; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("StaticFile {Name}")] +public class StaticFileTemplate : FileTemplate +{ + public string Content { get; } + + public StaticFileTemplate(string name, byte[] content, string relativePath, GeneratorOptions options) + : this(name, Encoding.UTF8.GetString(content), relativePath, options) + { } + + public StaticFileTemplate(string name, string content, string relativePath, GeneratorOptions options) + : base(relativePath, options) + { + this.Name = name; + this.Content = content; + } +} diff --git a/Common/Templates/Structural/TypeTemplate.cs b/Common/Templates/Structural/TypeTemplate.cs new file mode 100644 index 00000000..b59ca74d --- /dev/null +++ b/Common/Templates/Structural/TypeTemplate.cs @@ -0,0 +1,49 @@ +using System.Diagnostics; + +namespace KY.Generator.Templates; + +[DebuggerDisplay("TypeTemplate: {Name}")] +public class TypeTemplate : ICodeFragment +{ + public virtual string Name { get; } = string.Empty; + public virtual string? Namespace { get; } + + public virtual bool IsInterface { get; } + + // TODO: Check if required + public virtual bool IsNullable { get; } + public virtual bool FromSystem { get; } + + protected TypeTemplate() + { } + + public TypeTemplate(string name, string? nameSpace = null, bool isInterface = false, bool isNullable = false, bool fromSystem = false) + { + this.Name = name ?? throw new ArgumentNullException(nameof(name)); + this.Namespace = nameSpace; + this.IsInterface = isInterface; + this.IsNullable = isNullable; + this.FromSystem = fromSystem; + } + + public override bool Equals(object? obj) + { + TypeTemplate? type = obj as TypeTemplate; + return type != null && this.Name.Equals(type.Name); + } + + public static bool operator ==(TypeTemplate? left, TypeTemplate? right) + { + return Equals(left, right); + } + + public static bool operator !=(TypeTemplate? left, TypeTemplate? right) + { + return !(left == right); + } + + public override int GetHashCode() + { + return this.Name.GetHashCode(); + } +} diff --git a/Core/Templates/Structural/UsingTemplate.cs b/Common/Templates/Structural/UsingTemplate.cs similarity index 57% rename from Core/Templates/Structural/UsingTemplate.cs rename to Common/Templates/Structural/UsingTemplate.cs index 0bd6cf7e..8f7014e0 100644 --- a/Core/Templates/Structural/UsingTemplate.cs +++ b/Common/Templates/Structural/UsingTemplate.cs @@ -2,12 +2,12 @@ namespace KY.Generator.Templates { - [DebuggerDisplay("Using {Namespace}")] + [DebuggerDisplay("Using {Namespace} {Type}")] public class UsingTemplate : ICodeFragment { - public string Namespace { get; } - public string Type { get; } - public string Path { get; } + public virtual string Namespace { get; } + public virtual string Type { get; } + public virtual string Path { get; } public UsingTemplate(string nameSpace, string type, string path) { @@ -15,5 +15,8 @@ public UsingTemplate(string nameSpace, string type, string path) this.Type = type; this.Path = path; } + + protected UsingTemplate() + { } } -} \ No newline at end of file +} diff --git a/Core/Templates/Types/AnonymousObjectTemplate.cs b/Common/Templates/Types/AnonymousObjectTemplate.cs similarity index 100% rename from Core/Templates/Types/AnonymousObjectTemplate.cs rename to Common/Templates/Types/AnonymousObjectTemplate.cs diff --git a/Core/Templates/Types/BooleanTemplate.cs b/Common/Templates/Types/BooleanTemplate.cs similarity index 54% rename from Core/Templates/Types/BooleanTemplate.cs rename to Common/Templates/Types/BooleanTemplate.cs index 4eed6d9f..15bed484 100644 --- a/Core/Templates/Types/BooleanTemplate.cs +++ b/Common/Templates/Types/BooleanTemplate.cs @@ -1,6 +1,8 @@ +using System; + namespace KY.Generator.Templates { - public class BooleanTemplate : ChainedCodeFragment + public class BooleanTemplate : ChainedCodeFragment, ICloneable { public override string Separator => " "; public bool Value { get; } @@ -9,5 +11,10 @@ public BooleanTemplate(bool value) { this.Value = value; } + + public object Clone() + { + return new BooleanTemplate(this.Value); + } } -} \ No newline at end of file +} diff --git a/Core/Templates/Types/DateTimeTemplate.cs b/Common/Templates/Types/DateTimeTemplate.cs similarity index 100% rename from Core/Templates/Types/DateTimeTemplate.cs rename to Common/Templates/Types/DateTimeTemplate.cs diff --git a/Core/Templates/Types/NullTemplate.cs b/Common/Templates/Types/NullTemplate.cs similarity index 100% rename from Core/Templates/Types/NullTemplate.cs rename to Common/Templates/Types/NullTemplate.cs diff --git a/Common/Templates/Types/NumberTemplate.cs b/Common/Templates/Types/NumberTemplate.cs new file mode 100644 index 00000000..4ea84843 --- /dev/null +++ b/Common/Templates/Types/NumberTemplate.cs @@ -0,0 +1,44 @@ +using System; + +namespace KY.Generator.Templates +{ + public class NumberTemplate : ChainedCodeFragment, ICloneable + { + public override string Separator => " "; + public long? LongValue { get; } + public float? FloatValue { get; } + public double? DoubleValue { get; } + + public NumberTemplate(long value) + { + this.LongValue = value; + } + + public NumberTemplate(float value) + { + this.FloatValue = value; + } + + public NumberTemplate(double value) + { + this.DoubleValue = value; + } + + object ICloneable.Clone() + { + if (this.LongValue != null) + { + return new NumberTemplate(this.LongValue.Value); + } + if (this.FloatValue != null) + { + return new NumberTemplate(this.FloatValue.Value); + } + if (this.DoubleValue != null) + { + return new NumberTemplate(this.DoubleValue.Value); + } + throw new InvalidOperationException(); + } + } +} diff --git a/Core/Templates/Types/PropertyValueTemplate.cs b/Common/Templates/Types/PropertyValueTemplate.cs similarity index 100% rename from Core/Templates/Types/PropertyValueTemplate.cs rename to Common/Templates/Types/PropertyValueTemplate.cs diff --git a/Core/Templates/Types/StringTemplate.cs b/Common/Templates/Types/StringTemplate.cs similarity index 100% rename from Core/Templates/Types/StringTemplate.cs rename to Common/Templates/Types/StringTemplate.cs diff --git a/Core/Templates/Types/VoidTemplate.cs b/Common/Templates/Types/VoidTemplate.cs similarity index 100% rename from Core/Templates/Types/VoidTemplate.cs rename to Common/Templates/Types/VoidTemplate.cs diff --git a/Core/Transfer/AttributeTransferObject.cs b/Common/Transfer/AttributeTransferObject.cs similarity index 51% rename from Core/Transfer/AttributeTransferObject.cs rename to Common/Transfer/AttributeTransferObject.cs index d2c59db4..0c8ab028 100644 --- a/Core/Transfer/AttributeTransferObject.cs +++ b/Common/Transfer/AttributeTransferObject.cs @@ -14,18 +14,5 @@ public AttributeTransferObject() { this.Parameters = new Dictionary(); } - - public AttributeTransferObject(AttributeTransferObject attribute) - { - this.Name = attribute.Name; - this.Namespace = attribute.Namespace; - this.Value = attribute.Value; - this.Parameters = attribute.Parameters.ToDictionary(x => x.Key, x => x.Value); - } - - public AttributeTransferObject Clone() - { - return new AttributeTransferObject(this); - } } } diff --git a/Core/Transfer/ControllerTransferObject.cs b/Common/Transfer/ControllerTransferObject.cs similarity index 100% rename from Core/Transfer/ControllerTransferObject.cs rename to Common/Transfer/ControllerTransferObject.cs diff --git a/Core/Transfer/EntityActionParameterTransferObject.cs b/Common/Transfer/EntityActionParameterTransferObject.cs similarity index 100% rename from Core/Transfer/EntityActionParameterTransferObject.cs rename to Common/Transfer/EntityActionParameterTransferObject.cs diff --git a/Core/Transfer/EntityActionTransferObject.cs b/Common/Transfer/EntityActionTransferObject.cs similarity index 100% rename from Core/Transfer/EntityActionTransferObject.cs rename to Common/Transfer/EntityActionTransferObject.cs diff --git a/Core/Transfer/EntityKeyTransferObject.cs b/Common/Transfer/EntityKeyTransferObject.cs similarity index 100% rename from Core/Transfer/EntityKeyTransferObject.cs rename to Common/Transfer/EntityKeyTransferObject.cs diff --git a/Core/Transfer/EntitySetTransferObject.cs b/Common/Transfer/EntitySetTransferObject.cs similarity index 100% rename from Core/Transfer/EntitySetTransferObject.cs rename to Common/Transfer/EntitySetTransferObject.cs diff --git a/Common/Transfer/EntityTransferObject.cs b/Common/Transfer/EntityTransferObject.cs new file mode 100644 index 00000000..39835e16 --- /dev/null +++ b/Common/Transfer/EntityTransferObject.cs @@ -0,0 +1,18 @@ +using System.Collections.Generic; + +namespace KY.Generator.Transfer; + +public class EntityTransferObject : TypeTransferObject +{ + public string Table { get; set; } + public string Schema { get; set; } + public ModelTransferObject Model { get; set; } + public List Keys { get; set; } + public List Actions { get; set; } + + public EntityTransferObject() + { + this.Keys = new List(); + this.Actions = new List(); + } +} diff --git a/Core/Transfer/Extensions/TypeTransferObjectExtension.cs b/Common/Transfer/Extensions/TypeTransferObjectExtension.cs similarity index 53% rename from Core/Transfer/Extensions/TypeTransferObjectExtension.cs rename to Common/Transfer/Extensions/TypeTransferObjectExtension.cs index 78c4c6df..3e6ea34e 100644 --- a/Core/Transfer/Extensions/TypeTransferObjectExtension.cs +++ b/Common/Transfer/Extensions/TypeTransferObjectExtension.cs @@ -1,6 +1,5 @@ using System; using System.Linq; -using KY.Core; using KY.Generator.Templates; namespace KY.Generator.Transfer.Extensions @@ -15,10 +14,10 @@ public static TypeTemplate ToTemplate(this TypeTransferObject type) } if (type.Generics.Count == 0) { - return new TypeTemplate(type.Name, type.Namespace, fromSystem: type.FromSystem, isNullable: type.IsNullable); + return new LinkedTypeTemplate(type); } - GenericTypeTemplate genericTypeTemplate = new GenericTypeTemplate(type.Name, type.Namespace, fromSystem: type.FromSystem, isNullable: type.IsNullable); - type.Generics.Where(x => x.Type != null).ForEach(g => genericTypeTemplate.Types.Add(g.Type.ToTemplate())); + LinkedGenericTypeTemplate genericTypeTemplate = new(type); + type.Generics.ForEach(g => genericTypeTemplate.Types.Add((g.Type ?? g.Alias).ToTemplate())); return genericTypeTemplate; } } diff --git a/Common/Transfer/FieldTransferObject.cs b/Common/Transfer/FieldTransferObject.cs new file mode 100644 index 00000000..f477fc39 --- /dev/null +++ b/Common/Transfer/FieldTransferObject.cs @@ -0,0 +1,20 @@ +using KY.Core; + +namespace KY.Generator.Transfer; + +public class FieldTransferObject : MemberTransferObject +{ + public List Attributes { get; set; } = []; + + public FieldTransferObject() + { } + + public FieldTransferObject(FieldTransferObject field) + { + this.Name = field.Name; + this.Type = field.Type.Clone(); + this.DeclaringType = field.DeclaringType; + this.Default = field.Default; + this.Comment = field.Comment; + } +} diff --git a/Core/Transfer/GenericAliasTransferObject.cs b/Common/Transfer/GenericAliasTransferObject.cs similarity index 100% rename from Core/Transfer/GenericAliasTransferObject.cs rename to Common/Transfer/GenericAliasTransferObject.cs diff --git a/Common/Transfer/GenericModelTransferObject.cs b/Common/Transfer/GenericModelTransferObject.cs new file mode 100644 index 00000000..1df4e510 --- /dev/null +++ b/Common/Transfer/GenericModelTransferObject.cs @@ -0,0 +1,128 @@ +using KY.Core; +using KY.Generator.Languages; +using KY.Generator.Templates; + +namespace KY.Generator.Transfer; + +public class GenericModelTransferObject : ModelTransferObject, ICloneable +{ + public ModelTransferObject Template { get; } + + public override string Name + { + get => this.Template.Name; + set => this.Template.Name = value; + } + + public override string FileName + { + get => this.Template.FileName; + set => this.Template.FileName = value; + } + + public override string OriginalName + { + get => this.Template.OriginalName; + set => this.Template.OriginalName = value; + } + + public override string Namespace + { + get => this.Template.Namespace; + set => this.Template.Namespace = value; + } + + public override bool FromSystem + { + get => this.Template.FromSystem; + set => this.Template.FromSystem = value; + } + + public override bool IsNullable + { + get => this.Template.IsNullable; + set => this.Template.IsNullable = value; + } + + public override TypeTransferObject Original + { + get => this.Template.Original; + set => this.Template.Original = value; + } + + public override ICodeFragment Default + { + get => this.Template.Default; + set => this.Template.Default = value; + } + + public override bool IsEnum + { + get => this.Template.IsEnum; + set => this.Template.IsEnum = value; + } + + public override bool IsInterface + { + get => this.Template.IsInterface; + set => this.Template.IsInterface = value; + } + + public override bool IsAbstract + { + get => this.Template.IsAbstract; + set => this.Template.IsAbstract = value; + } + + public override bool IsGeneric + { + get => this.Template.IsGeneric; + set => this.Template.IsGeneric = value; + } + + public override bool IsGenericParameter + { + get => this.Template.IsGenericParameter; + set => this.Template.IsGenericParameter = value; + } + + public override Dictionary EnumValues + { + get => this.Template.EnumValues; + set => this.Template.EnumValues = value; + } + + public override ModelTransferObject BasedOn + { + get => this.Template.BasedOn; + set => this.Template.BasedOn = value; + } + + public override ILanguage Language + { + get => this.Template.Language; + set => this.Template.Language = value; + } + + public override List Interfaces => this.Template.Interfaces; + public override List Methods => this.Template.Methods; + public override List Usings => this.Template.Usings; + + public override string Comment + { + get => this.Template.Comment; + set => this.Template.Comment = value; + } + + public GenericModelTransferObject(ModelTransferObject template) + { + this.Template = template is GenericModelTransferObject genericTemplate ? genericTemplate.Template : template; + } + + object ICloneable.Clone() + { + GenericModelTransferObject clone = new(this.Template); + this.Generics.Select(x => new GenericAliasTransferObject { Alias = x.Alias.Clone(), Type = x.Type }).ForEach(clone.Generics.Add); + return clone; + } +} diff --git a/Core/Transfer/HttpServiceActionParameterTransferObject.cs b/Common/Transfer/HttpServiceActionParameterTransferObject.cs similarity index 100% rename from Core/Transfer/HttpServiceActionParameterTransferObject.cs rename to Common/Transfer/HttpServiceActionParameterTransferObject.cs diff --git a/Core/Transfer/HttpServiceActionTransferObject.cs b/Common/Transfer/HttpServiceActionTransferObject.cs similarity index 93% rename from Core/Transfer/HttpServiceActionTransferObject.cs rename to Common/Transfer/HttpServiceActionTransferObject.cs index c388cf87..2d9a9cfc 100644 --- a/Core/Transfer/HttpServiceActionTransferObject.cs +++ b/Common/Transfer/HttpServiceActionTransferObject.cs @@ -8,6 +8,7 @@ public class HttpServiceActionTransferObject public TypeTransferObject ReturnType { get; set; } public string Route { get; set; } public bool RequireBodyParameter { get; set; } + public bool CanHaveBodyParameter { get; set; } public List Parameters { get; } public HttpServiceActionTypeTransferObject Type { get; set; } public string Version { get; set; } diff --git a/Core/Transfer/HttpServiceActionTypeTransferObject.cs b/Common/Transfer/HttpServiceActionTypeTransferObject.cs similarity index 100% rename from Core/Transfer/HttpServiceActionTypeTransferObject.cs rename to Common/Transfer/HttpServiceActionTypeTransferObject.cs diff --git a/Core/Transfer/HttpServiceActionTypeTransferObjectExtension.cs b/Common/Transfer/HttpServiceActionTypeTransferObjectExtension.cs similarity index 58% rename from Core/Transfer/HttpServiceActionTypeTransferObjectExtension.cs rename to Common/Transfer/HttpServiceActionTypeTransferObjectExtension.cs index d7e6bc8e..1308e30d 100644 --- a/Core/Transfer/HttpServiceActionTypeTransferObjectExtension.cs +++ b/Common/Transfer/HttpServiceActionTypeTransferObjectExtension.cs @@ -6,5 +6,10 @@ public static bool IsBodyParameterRequired(this HttpServiceActionTypeTransferObj { return type == HttpServiceActionTypeTransferObject.Patch || type == HttpServiceActionTypeTransferObject.Put; } + + public static bool IsBodyParameterAllowed(this HttpServiceActionTypeTransferObject type) + { + return type != HttpServiceActionTypeTransferObject.Get && type != HttpServiceActionTypeTransferObject.Delete; + } } -} \ No newline at end of file +} diff --git a/Common/Transfer/HttpServiceTransferObject.cs b/Common/Transfer/HttpServiceTransferObject.cs new file mode 100644 index 00000000..c5078889 --- /dev/null +++ b/Common/Transfer/HttpServiceTransferObject.cs @@ -0,0 +1,11 @@ +using KY.Generator.Languages; + +namespace KY.Generator.Transfer; + +public class HttpServiceTransferObject : TypeTransferObject +{ + public string? Route { get; set; } + public string? Version { get; set; } + public ILanguage? Language { get; set; } + public List Actions { get; } = []; +} diff --git a/Core/Transfer/ITransferObject.cs b/Common/Transfer/ITransferObject.cs similarity index 100% rename from Core/Transfer/ITransferObject.cs rename to Common/Transfer/ITransferObject.cs diff --git a/Common/Transfer/MemberTransferObject.cs b/Common/Transfer/MemberTransferObject.cs new file mode 100644 index 00000000..3d33014e --- /dev/null +++ b/Common/Transfer/MemberTransferObject.cs @@ -0,0 +1,16 @@ +namespace KY.Generator.Transfer; + +public abstract class MemberTransferObject +{ + public string? Name { get; set; } + public TypeTransferObject? Type { get; set; } + public TypeTransferObject? DeclaringType { get; set; } + public string? Comment { get; set; } + public object? Default { get; set; } + public bool IsAbstract { get; set; } + public bool IsVirtual { get; set; } + public bool IsOverwrite { get; set; } + public bool IsOptional { get; set; } = true; + public bool IsRequired { get; set; } + public bool IsNullable { get; set; } +} diff --git a/Core/Transfer/MethodParameterTransferObject.cs b/Common/Transfer/MethodParameterTransferObject.cs similarity index 100% rename from Core/Transfer/MethodParameterTransferObject.cs rename to Common/Transfer/MethodParameterTransferObject.cs diff --git a/Core/Transfer/MethodTransferObject.cs b/Common/Transfer/MethodTransferObject.cs similarity index 100% rename from Core/Transfer/MethodTransferObject.cs rename to Common/Transfer/MethodTransferObject.cs diff --git a/Common/Transfer/ModelTransferObject.cs b/Common/Transfer/ModelTransferObject.cs new file mode 100644 index 00000000..690bf816 --- /dev/null +++ b/Common/Transfer/ModelTransferObject.cs @@ -0,0 +1,55 @@ +using System.Diagnostics; +using KY.Core; +using KY.Generator.Languages; + +namespace KY.Generator.Transfer; + +[DebuggerDisplay("ModelTransferObject {Namespace,nq}.{Name,nq}")] +public class ModelTransferObject : TypeTransferObject +{ + public virtual bool IsEnum { get; set; } + public virtual bool IsAbstract { get; set; } + public virtual Dictionary? EnumValues { get; set; } + public virtual ModelTransferObject? BasedOn { get; set; } + + // TODO: Transfer objects should be independent from language + [NotCloneable] + public virtual ILanguage? Language { get; set; } + + public virtual List Interfaces { get; } = []; + public virtual List Constants { get; } = []; + public virtual List Fields { get; } = []; + public virtual List Properties { get; } = []; + public virtual List Methods { get; } = []; + public virtual List Usings { get; } = []; + public virtual string? Comment { get; set; } + + [NotCloneable] + public virtual Type Type { get; set; } + + public ModelTransferObject() + { } + + public ModelTransferObject(TypeTransferObject type) + : base(type) + { } + + public ModelTransferObject(ModelTransferObject type) + : base(type) + { + this.IsEnum = type.IsEnum; + this.IsAbstract = type.IsAbstract; + this.EnumValues = type.EnumValues; + // this.BasedOn = type.BasedOn; + // this.Language = type.Language; + // this.Interfaces = type.Interfaces; + // this.Constants = type.Constants; + // this.Fields = type.Fields; + // this.Properties = type.Properties; + // this.Methods = type.Methods; + // this.Usings = type.Usings; + this.Comment = type.Comment; + this.Type = type.Type; + } + } +} diff --git a/Common/Transfer/PropertyTransferObject.cs b/Common/Transfer/PropertyTransferObject.cs new file mode 100644 index 00000000..d501c290 --- /dev/null +++ b/Common/Transfer/PropertyTransferObject.cs @@ -0,0 +1,24 @@ +using KY.Core; + +namespace KY.Generator.Transfer; + +public class PropertyTransferObject : MemberTransferObject +{ + public bool CanRead { get; set; } = true; + public bool CanWrite { get; set; } = true; + public List Attributes { get; set; } = []; + + public PropertyTransferObject() + { } + + public PropertyTransferObject(PropertyTransferObject property) + { + this.Name = property.Name; + this.Type = property.Type.Clone(); + this.DeclaringType = property.DeclaringType; + this.CanRead = property.CanRead; + this.CanRead = property.CanWrite; + this.Attributes = property.Attributes.Select(attribute => attribute.Clone()).ToList(); + this.Comment = property.Comment; + } +} diff --git a/Core/Transfer/Readers/CookieReader.cs b/Common/Transfer/Readers/CookieReader.cs similarity index 88% rename from Core/Transfer/Readers/CookieReader.cs rename to Common/Transfer/Readers/CookieReader.cs index ce22d837..3a790d05 100644 --- a/Core/Transfer/Readers/CookieReader.cs +++ b/Common/Transfer/Readers/CookieReader.cs @@ -7,9 +7,8 @@ namespace KY.Generator.Transfer.Readers { public class CookieReader : ITransferReader { - public virtual void Read(ConfigurationBase configurationBase, List transferObjects) + public virtual void Read(CookieConfiguration configuration, List transferObjects) { - CookieConfiguration configuration = (CookieConfiguration)configurationBase; if (!string.IsNullOrEmpty(configuration.Url)) { this.ReadFromUrl(configuration, transferObjects); @@ -39,4 +38,4 @@ private void ReadFromUrl(CookieConfiguration configuration, List Actions { get; } + public List Events { get; } + + public SignalRHubTransferObject() + { + this.Actions = new List(); + this.Events = new List(); + } +} diff --git a/Core/Transfer/TransferObject.cs b/Common/Transfer/TransferObject.cs similarity index 100% rename from Core/Transfer/TransferObject.cs rename to Common/Transfer/TransferObject.cs diff --git a/Common/Transfer/TypeTransferObject.cs b/Common/Transfer/TypeTransferObject.cs new file mode 100644 index 00000000..4cc9ed7d --- /dev/null +++ b/Common/Transfer/TypeTransferObject.cs @@ -0,0 +1,60 @@ +using System.Diagnostics; +using KY.Core; +using KY.Generator.Templates; + +namespace KY.Generator.Transfer; + +[DebuggerDisplay("TypeTransferObject {Namespace,nq}.{Name,nq}")] +public class TypeTransferObject : ITransferObject +{ + private string originalName; + + public virtual string Name { get; set; } + public virtual string FileName { get; set; } + public virtual string OverrideType { get; set; } + + public virtual string OriginalName + { + get => this.originalName ?? this.Name; + set => this.originalName = value; + } + + public virtual string? Namespace { get; set; } + public virtual bool FromSystem { get; set; } + public virtual bool IsNullable { get; set; } + public virtual bool IsGeneric { get; set; } + public virtual bool IsGenericParameter { get; set; } + public virtual bool IsInterface { get; set; } + public virtual List Generics { get; } = []; + public virtual TypeTransferObject Original { get; set; } + public virtual ICodeFragment Default { get; set; } + public string FullName => $"{this.Namespace}.{this.Name}"; + + [NotCloneable] + public virtual Type Type { get; set; } + + public TypeTransferObject() + { } + + public TypeTransferObject(TypeTransferObject type) + { + this.Name = type.Name; + this.FileName = type.FileName; + this.OverrideType = type.OverrideType; + this.OriginalName = type.OriginalName; + this.Namespace = type.Namespace; + this.FromSystem = type.FromSystem; + this.IsNullable = type.IsNullable; + this.IsGeneric = type.IsGeneric; + this.IsGenericParameter = type.IsGenericParameter; + this.IsInterface = type.IsInterface; + this.Generics = type.Generics.ToList(); + this.Original = type.Original; + this.Default = type.Default; + } + + public bool Equals(TypeTransferObject type) + { + return (this.Name == type.Name || this.OriginalName == type.Name || this.Name == type.OriginalName) && this.Namespace == type.Namespace && this.IsGeneric == type.IsGeneric; + } +} diff --git a/Common/Transfer/Writers/ITransferWriter.cs b/Common/Transfer/Writers/ITransferWriter.cs new file mode 100644 index 00000000..33cc65ba --- /dev/null +++ b/Common/Transfer/Writers/ITransferWriter.cs @@ -0,0 +1,5 @@ +namespace KY.Generator.Transfer.Writers +{ + public interface ITransferWriter + { } +} diff --git a/Common/Transfer/Writers/ModelWriter.cs b/Common/Transfer/Writers/ModelWriter.cs new file mode 100644 index 00000000..582fc4be --- /dev/null +++ b/Common/Transfer/Writers/ModelWriter.cs @@ -0,0 +1,179 @@ +using KY.Core; +using KY.Generator.Extensions; +using KY.Generator.Mappings; +using KY.Generator.Templates; +using KY.Generator.Templates.Extensions; +using KY.Generator.Transfer.Extensions; + +namespace KY.Generator.Transfer.Writers; + +public class ModelWriter : TransferWriter, ITransferWriter +{ + private readonly IEnumerable transferObjects; + private readonly IList files; + + public ModelWriter(Options options, ITypeMapping typeMapping, IEnumerable transferObjects, IList files) + : base(options, typeMapping) + { + this.transferObjects = transferObjects; + this.files = files; + } + + public ModelWriter FormatNames() + { + List models = this.transferObjects.OfType().ToList(); + foreach (ModelTransferObject model in models) + { + GeneratorOptions modelOptions = this.Options.Get(model); + model.Name = Formatter.FormatClass(model.OriginalName, modelOptions) + .Replace(modelOptions.ReplaceName) + .Prefix(model.IsInterface || modelOptions.PreferInterfaces ? modelOptions.Formatting.InterfacePrefix : modelOptions.Formatting.ClassPrefix); + if (!modelOptions.Language.IsGenericTypeWithSameNameAllowed) + { + ModelTransferObject otherModel = models.FirstOrDefault(m => m != model + && m.Name == model.Name + && m.Namespace == model.Namespace + && (m as GenericModelTransferObject)?.Template != (model as GenericModelTransferObject)?.Template + ); + if (otherModel != null && otherModel.IsGeneric && !otherModel.FromSystem) + { + GeneratorOptions otherModelOptions = this.Options.Get(otherModel); + otherModel.Name = Formatter.FormatClass(otherModel.Name + "Generic", otherModelOptions) + .Replace(modelOptions.ReplaceName); + otherModel.FileName = Formatter.FormatFile(otherModel.Name, otherModelOptions); + } + else if (otherModel != null && model.IsGeneric && !otherModel.FromSystem) + { + model.Name = Formatter.FormatClass(model.Name + "Generic", modelOptions) + .Replace(modelOptions.ReplaceName); + } + } + model.FileName = Formatter.FormatFile(model.Name, modelOptions); + } + return this; + } + + public virtual void Write(string relativePath) + { + foreach (ModelTransferObject model in this.transferObjects.OfType()) + { + this.WriteModel(model, relativePath); + } + } + + protected virtual void WriteModel(ModelTransferObject model, string? relativePath) + { + GeneratorOptions modelOptions = this.Options.Get(model); + relativePath ??= modelOptions.ModelOutput; + if (this.files.Any(file => file.Name == model.FileName && file.RelativePath == relativePath)) + { + return; + } + if (modelOptions.OnlySubTypes) + { + Logger.Trace($"{model.Name} ({model.Namespace}) skipped through configuration"); + return; + } + if (modelOptions.Language == null) + { + throw new InvalidOperationException("Can not write model without language"); + } + if (model.Language != null && modelOptions.Language != null) + { + this.MapType(model.Language, modelOptions.Language, model); + } + if (model.FromSystem) + { + return; + } + if (model.IsEnum) + { + this.WriteEnum(model, relativePath); + } + else + { + this.WriteClass(model, relativePath); + } + } + + protected virtual EnumTemplate WriteEnum(ModelTransferObject model, string relativePath) + { + if (model.EnumValues == null) + { + throw new InvalidOperationException("Can not write enum without values"); + } + GeneratorOptions modelOptions = this.Options.Get(model); + EnumTemplate enumTemplate = this.files.AddFile(relativePath, modelOptions) + .WithName(model.FileName) + .AddNamespace(modelOptions.SkipNamespace ? string.Empty : model.Namespace) + .AddEnum(model.Name); + + foreach (KeyValuePair pair in model.EnumValues) + { + string formattedName = Formatter.FormatProperty(pair.Key, modelOptions); + enumTemplate.Values.Add(new EnumValueTemplate(pair.Key, Code.Local(pair.Value.ToString()), formattedName)); + } + return enumTemplate; + } + + protected virtual ClassTemplate WriteClass(ModelTransferObject model, string relativePath) + { + GeneratorOptions modelOptions = this.Options.Get(model); + if (model.BasedOn != null && model.Language != null && modelOptions.Language != null) + { + this.MapType(model.Language, modelOptions.Language, model.BasedOn); + } + + bool isInterface = model.IsInterface || (modelOptions.PreferInterfaces && model.Constants.Count == 0); + string modelNamespace = modelOptions.SkipNamespace ? string.Empty : model.Namespace; + ClassTemplate otherClassTemplate = this.files.Where(file => file.RelativePath == relativePath + && file.Options.Language == modelOptions.Language) + .SelectMany(file => file.Namespaces) + .SelectMany(ns => ns.Children).OfType() + .FirstOrDefault(x => x.Namespace.Name == modelNamespace && x.Name == model.Name); + NamespaceTemplate namespaceTemplate = otherClassTemplate?.Namespace ?? this.files.AddFile(relativePath, modelOptions) + .WithName(model.FileName) + // .WithType(isInterface ? "interface" : null) + .AddNamespace(modelNamespace); + + ClassTemplate classTemplate = namespaceTemplate.AddClass(model.Name, model.BasedOn?.ToTemplate()) + .FormatName(modelOptions); + if (model.BasedOn != null) + { + this.AddUsing(model.BasedOn, classTemplate, modelOptions); + } + + classTemplate.IsInterface = isInterface; + classTemplate.IsAbstract = model.IsAbstract; + if (model is GenericModelTransferObject generic) + { + generic.Template.Generics.Select(x => new ClassGenericTemplate(x.Alias.Name)).ForEach(classTemplate.Generics.Add); + } + foreach (TypeTransferObject interFace in model.Interfaces) + { + if (model.Language != null && modelOptions.Language != null) + { + this.MapType(model.Language, modelOptions.Language, interFace); + } + if (interFace.Name == model.Name) + { + continue; + } + classTemplate.BasedOn.Add(new BaseTypeTemplate(classTemplate, interFace.ToTemplate())); + this.AddUsing(interFace, classTemplate, modelOptions); + } + if (model is GenericModelTransferObject genericModel) + { + this.AddConstants(genericModel.Template, classTemplate); + this.AddFields(genericModel.Template, classTemplate); + this.AddProperties(genericModel.Template, classTemplate); + } + else + { + this.AddConstants(model, classTemplate); + this.AddFields(model, classTemplate); + this.AddProperties(model, classTemplate); + } + return classTemplate; + } +} diff --git a/Common/Transfer/Writers/TransferWriter.cs b/Common/Transfer/Writers/TransferWriter.cs new file mode 100644 index 00000000..30b7b740 --- /dev/null +++ b/Common/Transfer/Writers/TransferWriter.cs @@ -0,0 +1,209 @@ +using KY.Core; +using KY.Generator.Languages; +using KY.Generator.Mappings; +using KY.Generator.Models; +using KY.Generator.Templates; +using KY.Generator.Templates.Extensions; +using KY.Generator.Transfer.Extensions; + +namespace KY.Generator.Transfer.Writers; + +public abstract class TransferWriter : Codeable +{ + protected ITypeMapping TypeMapping { get; } + protected Options Options { get; } + + protected TransferWriter(Options options, ITypeMapping typeMapping) + { + this.TypeMapping = typeMapping; + this.Options = options; + } + + protected virtual void AddConstants(ModelTransferObject model, ClassTemplate classTemplate) + { + foreach (FieldTransferObject constant in model.Constants) + { + GeneratorOptions fieldOptions = this.Options.Get(constant); + FieldTemplate fieldTemplate = this.AddField(model, constant, classTemplate).Constant(); + fieldTemplate.DefaultValue = this.ValueToTemplate(constant.Default, model, fieldOptions); + } + } + + protected virtual void AddFields(ModelTransferObject model, ClassTemplate classTemplate) + { + foreach (FieldTransferObject field in model.Fields) + { + GeneratorOptions fieldOptions = this.Options.Get(field); + if (fieldOptions.FieldsToProperties) + { + this.AddProperty(model, field, classTemplate); + } + else + { + this.AddField(model, field, classTemplate); + } + } + } + + protected virtual void AddProperties(ModelTransferObject model, ClassTemplate classTemplate) + { + foreach (PropertyTransferObject property in model.Properties) + { + GeneratorOptions propertyOptions = this.Options.Get(property); + if (propertyOptions.PropertiesToFields) + { + this.AddField(model, property, classTemplate); + } + else + { + this.AddProperty(model, property, classTemplate); + } + } + } + + protected virtual void MapType(ILanguage fromLanguage, ILanguage toLanguage, TypeTransferObject type) + { + if (type == null) + { + return; + } + this.TypeMapping.Get(fromLanguage, toLanguage, type); + type.Generics.ForEach(x => this.MapType(fromLanguage, toLanguage, x.Type)); + } + + protected virtual FieldTemplate AddField(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + GeneratorOptions fieldOptions = this.Options.Get(member); + if (model.Language != null && fieldOptions.Language != null) + { + this.MapType(model.Language, fieldOptions.Language, member.Type); + } + this.AddUsing(member.Type, classTemplate, fieldOptions); + FieldTemplate fieldTemplate = classTemplate.AddField(member.Name, member.Type.ToTemplate()).Public().FormatName(fieldOptions) + .WithComment(member.Comment); + fieldTemplate.IsOptional = member.IsOptional; + fieldTemplate.IsNullable = member.IsNullable; + fieldTemplate.DefaultValue = this.ValueToTemplate(member.Default, model, fieldOptions); + if (fieldOptions.WithOptionalProperties) + { + fieldTemplate.Optional(); + } + return fieldTemplate; + } + + protected virtual PropertyTemplate AddProperty(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + bool canRead = true; + bool canWrite = true; + if (member is PropertyTransferObject property) + { + canRead = property.CanRead; + canWrite = property.CanWrite; + } + GeneratorOptions propertyOptions = this.Options.Get(member); + if (model.Language != null && propertyOptions.Language != null) + { + this.MapType(model.Language, propertyOptions.Language, member.Type); + } + PropertyTemplate propertyTemplate = classTemplate.AddProperty(member.Name, member.Type.ToTemplate()).FormatName(propertyOptions); + propertyTemplate.HasGetter = canRead; + propertyTemplate.HasSetter = canWrite; + propertyTemplate.IsOptional = member.IsOptional; + propertyTemplate.IsNullable = member.IsNullable; + propertyTemplate.DefaultValue = this.ValueToTemplate(member.Default, model, propertyOptions); + if (propertyOptions.WithOptionalProperties) + { + propertyTemplate.Optional(); + } + if (member.Type != model) + { + this.AddUsing(member.Type, classTemplate, propertyOptions); + } + return propertyTemplate; + } + + protected virtual void AddUsing(TypeTransferObject type, ClassTemplate classTemplate, GeneratorOptions options, string relativeModelPath = "./") + { + Import import = options.Imports.FirstOrDefault(import => import.Type.Namespace == type.Namespace && import.Type.Name == type.Name); + if (import != null) + { + classTemplate.AddUsing(null, import.TypeName, import.FileName); + return; + } + if (type is ModelTransferObject model) + { + foreach (GenericAliasTransferObject generic in model.Generics.Where(x => x.Type != null)) + { + this.AddUsing(generic.Type, classTemplate, options, relativeModelPath); + } + } + string importPath = relativeModelPath.Replace("\\", "/").TrimEnd('/'); + if ((!type.FromSystem || (type.FromSystem && options.Language.ImportFromSystem)) + && !string.IsNullOrEmpty(type.Namespace) + && classTemplate.Namespace.Name != type.Namespace + && !type.IsGenericParameter) + { + classTemplate.AddUsing(type, importPath); + } + if ((!type.FromSystem || (type.FromSystem && options.Language.ImportFromSystem)) + && !string.IsNullOrEmpty(type.FileName) + && !type.IsGenericParameter) + { + classTemplate.AddUsing(type, importPath); + } + type.Generics.Where(x => x.Alias == null).ForEach(generic => this.AddUsing(generic.Type, classTemplate, options, relativeModelPath)); + } + + protected virtual ICodeFragment ValueToTemplate(T value, ModelTransferObject model, GeneratorOptions memberOptions) + { + if (value == null) + { + return null; + } + if (value is TypeTransferObject typeTransferObject) + { + this.MapType(model.Language, memberOptions.Language, typeTransferObject); + if (typeTransferObject.Name == "Array") + { + return Code.Local("[]"); + } + return Code.New(typeTransferObject.ToTemplate()); + } + Type valueType = value.GetType(); + if (valueType.IsEnum) + { + TypeTemplate type = Code.Type(Formatter.FormatClass(valueType.Name, memberOptions)); + string property = Formatter.FormatField(value.ToString(), memberOptions); + return Code.Static(type).Property(property); + } + switch (value) + { + case int intValue: + return Code.Number(intValue); + case long longValue: + return Code.Number(longValue); + case short shortValue: + return Code.Number(shortValue); + case uint uintValue: + return Code.Number(uintValue); + case ulong ulongValue: + return Code.Number(ulongValue); + case ushort ushortValue: + return Code.Number(ushortValue); + case float floatValue: + return Code.Number(floatValue); + case double doubleValue: + return Code.Number(doubleValue); + case DateTime dateTimeValue: + return Code.DateTime(dateTimeValue); + case bool boolValue: + return Code.Boolean(boolValue); + case byte byteValue: + return Code.Number(byteValue); + case sbyte sbyteValue: + return Code.Number(sbyteValue); + default: + return Code.String(value?.ToString()); + } + } +} diff --git a/Core/Writers/AccessIndexWriter.cs b/Common/Writers/AccessIndexWriter.cs similarity index 100% rename from Core/Writers/AccessIndexWriter.cs rename to Common/Writers/AccessIndexWriter.cs diff --git a/Core/Writers/AppendAssignStringWriter.cs b/Common/Writers/AppendAssignStringWriter.cs similarity index 100% rename from Core/Writers/AppendAssignStringWriter.cs rename to Common/Writers/AppendAssignStringWriter.cs diff --git a/Core/Writers/AppendStringWriter.cs b/Common/Writers/AppendStringWriter.cs similarity index 100% rename from Core/Writers/AppendStringWriter.cs rename to Common/Writers/AppendStringWriter.cs diff --git a/Core/Writers/AsWriter.cs b/Common/Writers/AsWriter.cs similarity index 100% rename from Core/Writers/AsWriter.cs rename to Common/Writers/AsWriter.cs diff --git a/Core/Writers/AssignWriter.cs b/Common/Writers/AssignWriter.cs similarity index 100% rename from Core/Writers/AssignWriter.cs rename to Common/Writers/AssignWriter.cs diff --git a/Core/Writers/BlankLineWriter.cs b/Common/Writers/BlankLineWriter.cs similarity index 100% rename from Core/Writers/BlankLineWriter.cs rename to Common/Writers/BlankLineWriter.cs diff --git a/Core/Writers/BooleanWriter.cs b/Common/Writers/BooleanWriter.cs similarity index 100% rename from Core/Writers/BooleanWriter.cs rename to Common/Writers/BooleanWriter.cs diff --git a/Core/Writers/CaseWriter.cs b/Common/Writers/CaseWriter.cs similarity index 100% rename from Core/Writers/CaseWriter.cs rename to Common/Writers/CaseWriter.cs diff --git a/Common/Writers/ChainedCodeFragmentWriter.cs b/Common/Writers/ChainedCodeFragmentWriter.cs new file mode 100644 index 00000000..2995c8f1 --- /dev/null +++ b/Common/Writers/ChainedCodeFragmentWriter.cs @@ -0,0 +1,44 @@ +using System.Collections.Generic; +using System.Linq; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers; + +public class ChainedCodeFragmentWriter : ITemplateWriter +{ + private readonly List progressedChainedCodeFragments = new(); + + public void Write(ICodeFragment fragment, IOutputCache output) + { + ChainedCodeFragment chainedCodeFragment = (ChainedCodeFragment)fragment; + this.progressedChainedCodeFragments.Add(chainedCodeFragment.First()); + bool isFirst = true; + foreach (ChainedCodeFragment codeFragment in chainedCodeFragment.First().Yield().Cast()) + { + if (!isFirst) + { + output.Add(codeFragment.Separator); + } + isFirst = false; + output.Add(codeFragment); + if (codeFragment.NewLineAfter) + { + output.BreakLine(); + } + if (codeFragment.CloseAfter) + { + output.CloseLine(); + } + if (codeFragment.BreakAfter) + { + output.BreakLine().ExtraIndent(); + } + } + } + + public bool IsProcessed(ChainedCodeFragment fragment) + { + return this.progressedChainedCodeFragments.Contains(fragment.First()); + } +} diff --git a/Core/Writers/ClassGenericWriter.cs b/Common/Writers/ClassGenericWriter.cs similarity index 100% rename from Core/Writers/ClassGenericWriter.cs rename to Common/Writers/ClassGenericWriter.cs diff --git a/Common/Writers/ClassWriter.cs b/Common/Writers/ClassWriter.cs new file mode 100644 index 00000000..2256c5db --- /dev/null +++ b/Common/Writers/ClassWriter.cs @@ -0,0 +1,104 @@ +using System.Linq; +using KY.Core; +using KY.Generator.Languages; +using KY.Generator.Models; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers; + +public class ClassWriter : ITemplateWriter +{ + private readonly Options options; + + public ClassWriter(Options options) + { + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + GeneratorOptions generatorOptions = this.options.Get(); + BaseLanguage language = generatorOptions.Language.CastTo(); + ClassTemplate template = (ClassTemplate)fragment; + output.Add(template.Comment); + output.Add(template.Attributes); + output.Add(language.ClassScope).Add(" "); + if (template.IsAbstract && language.HasAbstractClasses && !template.IsInterface) + { + output.Add("abstract "); + } + if (template.IsStatic && language.HasStaticClasses) + { + output.Add("static "); + } + else if (!string.IsNullOrEmpty(language.PartialKeyword)) + { + output.Add(language.PartialKeyword).Add(" "); + } + if (template.IsInterface) + { + output.Add("interface "); + } + else + { + output.Add("class "); + } + output.Add(template.Name); + if (template.Generics.Count > 0) + { + output.Add("<").Add(template.Generics.Select(x => Code.Instance.Type(x.Name)), ", ").Add(">"); + } + template.BasedOn.OrderBy(x => x.ToType().IsInterface).ForEach(x => output.Add(x)); + output.Add(template.Generics.Select(x => x.ToConstraints()).Where(x => x.Types.Count > 0)); + output.StartBlock(); + if (template.IsInterface) + { + template.Fields.ForEach(x => x.Visibility = Visibility.None); + template.Properties.ForEach(x => x.Visibility = Visibility.None); + } + bool isFirst = true; + if (template.Classes.Count > 0) + { + output.Add(template.Classes); + isFirst = false; + } + if (template.Fields.Count > 0) + { + output.If(!isFirst).BreakLine().EndIf(); + output.Add(template.Fields); + isFirst = false; + } + if (template.Properties.Count > 0) + { + output.If(!isFirst).BreakLine().EndIf(); + output.Add(template.Properties); + isFirst = false; + } + if (template.Code != null) + { + output.If(!isFirst).BreakLine().EndIf(); + output.Add(template.Code); + isFirst = false; + } + if (template.Methods.Count > 0) + { + output.If(!isFirst).BreakLine().EndIf(); + MethodTemplate last = template.Methods.Last(); + foreach (MethodTemplate method in template.Methods) + { + output.Add(method); + if (method != last) + { + output.BreakLine(); + } + } + } + if (generatorOptions.Formatting.CollapseEmptyClasses && output.LastFragments.First().Equals(template)) + { + output.UnBreakLine(); + output.Add(generatorOptions.Formatting.CollapsedClassesSpacer, true); + } + output.EndBlock(); + } +} diff --git a/Core/Writers/CommentWriter.cs b/Common/Writers/CommentWriter.cs similarity index 100% rename from Core/Writers/CommentWriter.cs rename to Common/Writers/CommentWriter.cs diff --git a/Core/Writers/DateTimeWriter.cs b/Common/Writers/DateTimeWriter.cs similarity index 100% rename from Core/Writers/DateTimeWriter.cs rename to Common/Writers/DateTimeWriter.cs diff --git a/Core/Writers/DefaultTypeWriter.cs b/Common/Writers/DefaultTypeWriter.cs similarity index 100% rename from Core/Writers/DefaultTypeWriter.cs rename to Common/Writers/DefaultTypeWriter.cs diff --git a/Core/Writers/ElseIfWriter.cs b/Common/Writers/ElseIfWriter.cs similarity index 100% rename from Core/Writers/ElseIfWriter.cs rename to Common/Writers/ElseIfWriter.cs diff --git a/Core/Writers/ElseWriter.cs b/Common/Writers/ElseWriter.cs similarity index 100% rename from Core/Writers/ElseWriter.cs rename to Common/Writers/ElseWriter.cs diff --git a/Common/Writers/EnumWriter.cs b/Common/Writers/EnumWriter.cs new file mode 100644 index 00000000..938a87ae --- /dev/null +++ b/Common/Writers/EnumWriter.cs @@ -0,0 +1,42 @@ +using System.Linq; +using KY.Core; +using KY.Generator.Languages; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers; + +public class EnumWriter : Codeable, ITemplateWriter +{ + private readonly Options options; + + public EnumWriter(Options options) + { + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + GeneratorOptions generatorOptions = this.options.Get(); + BaseLanguage language = generatorOptions.Language.CastTo(); + EnumTemplate template = (EnumTemplate)fragment; + output.Add(template.Attributes) + .Add(language.ClassScope) + .Add(" enum ") + .Add(template.Name); + if (template.BasedOn != null) + { + output.Add(" : ").Add(template.BasedOn); + } + output.StartBlock(); + EnumValueTemplate last = template.Values.LastOrDefault(); + foreach (EnumValueTemplate enumTemplateValue in template.Values) + { + output.Add($"{enumTemplateValue.FormattedName} = ") + .Add(enumTemplateValue.Value) + .Add(last == enumTemplateValue ? string.Empty : ",") + .BreakLine(); + } + output.EndBlock(); + } +} diff --git a/Core/Writers/ExecuteFieldWriter.cs b/Common/Writers/ExecuteFieldWriter.cs similarity index 100% rename from Core/Writers/ExecuteFieldWriter.cs rename to Common/Writers/ExecuteFieldWriter.cs diff --git a/Core/Writers/ExecuteGenericMethodWriter.cs b/Common/Writers/ExecuteGenericMethodWriter.cs similarity index 100% rename from Core/Writers/ExecuteGenericMethodWriter.cs rename to Common/Writers/ExecuteGenericMethodWriter.cs diff --git a/Core/Writers/ExecuteMethodWriter.cs b/Common/Writers/ExecuteMethodWriter.cs similarity index 100% rename from Core/Writers/ExecuteMethodWriter.cs rename to Common/Writers/ExecuteMethodWriter.cs diff --git a/Core/Writers/ExecutePropertyWriter.cs b/Common/Writers/ExecutePropertyWriter.cs similarity index 100% rename from Core/Writers/ExecutePropertyWriter.cs rename to Common/Writers/ExecutePropertyWriter.cs diff --git a/Core/Writers/FieldWriter.cs b/Common/Writers/FieldWriter.cs similarity index 88% rename from Core/Writers/FieldWriter.cs rename to Common/Writers/FieldWriter.cs index 7267d5a6..fc05a372 100644 --- a/Core/Writers/FieldWriter.cs +++ b/Common/Writers/FieldWriter.cs @@ -8,13 +8,6 @@ namespace KY.Generator.Writers { public class FieldWriter : ITemplateWriter { - protected BaseLanguage Language { get; } - - public FieldWriter(BaseLanguage language) - { - this.Language = language; - } - public virtual void Write(ICodeFragment fragment, IOutputCache output) { FieldTemplate template = (FieldTemplate)fragment; diff --git a/Common/Writers/FileWriter.cs b/Common/Writers/FileWriter.cs new file mode 100644 index 00000000..d736c8d9 --- /dev/null +++ b/Common/Writers/FileWriter.cs @@ -0,0 +1,64 @@ +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers +{ + public class FileWriter : ITemplateWriter + { + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + FileTemplate template = (FileTemplate)fragment; + if (string.IsNullOrEmpty(template.Name)) + { + Logger.Trace("Empty file skipped"); + return; + } + if (template.Header.Description != null) + { + AssemblyName assemblyName = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName(); + template.Header.Description = string.Format(template.Header.Description, $"{assemblyName.Name} {assemblyName.Version}"); + } + template.FullPath = FileSystem.Combine(template.RelativePath, template.Name); + this.WriteHeader(template, output); + if (template is StaticFileTemplate staticFile) + { + output.Add(staticFile.Content, true); + } + else + { + this.WriteUsings(template, output); + output.Add(template.Namespaces); + } + } + + protected virtual void WriteHeader(FileTemplate fileTemplate, IOutputCache output, bool appendBlankLine = true) + { + if (fileTemplate.Header?.Description != null) + { + output.Add(fileTemplate.Header) + .If(appendBlankLine).BreakLine().EndIf(); + } + } + + protected virtual void WriteUsings(FileTemplate fileTemplate, IOutputCache output) + { + List usings = this.GetUsings(fileTemplate).ToList(); + if (usings.Count <= 0) + { + return; + } + output.Add(usings) + .BreakLine(); + } + + protected virtual IEnumerable GetUsings(FileTemplate fileTemplate) + { + return fileTemplate.GetUsingsByNamespace(); + } + } +} diff --git a/Core/Writers/GenericTypeWriter.cs b/Common/Writers/GenericTypeWriter.cs similarity index 100% rename from Core/Writers/GenericTypeWriter.cs rename to Common/Writers/GenericTypeWriter.cs diff --git a/Core/Writers/IGenericTypeWriter.cs b/Common/Writers/IGenericTypeWriter.cs similarity index 100% rename from Core/Writers/IGenericTypeWriter.cs rename to Common/Writers/IGenericTypeWriter.cs diff --git a/Core/Writers/ITemplateWriter.cs b/Common/Writers/ITemplateWriter.cs similarity index 100% rename from Core/Writers/ITemplateWriter.cs rename to Common/Writers/ITemplateWriter.cs diff --git a/Core/Writers/ITypeWriter.cs b/Common/Writers/ITypeWriter.cs similarity index 100% rename from Core/Writers/ITypeWriter.cs rename to Common/Writers/ITypeWriter.cs diff --git a/Core/Writers/IfWriter.cs b/Common/Writers/IfWriter.cs similarity index 100% rename from Core/Writers/IfWriter.cs rename to Common/Writers/IfWriter.cs diff --git a/Core/Writers/InlineIfWriter.cs b/Common/Writers/InlineIfWriter.cs similarity index 100% rename from Core/Writers/InlineIfWriter.cs rename to Common/Writers/InlineIfWriter.cs diff --git a/Common/Writers/LambdaWriter.cs b/Common/Writers/LambdaWriter.cs new file mode 100644 index 00000000..967559e3 --- /dev/null +++ b/Common/Writers/LambdaWriter.cs @@ -0,0 +1,48 @@ +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers; + +public class LambdaWriter : ITemplateWriter +{ + private readonly Options options; + + public LambdaWriter(Options options) + { + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + GeneratorOptions generatorOptions = this.options.Get(); + LambdaTemplate template = (LambdaTemplate)fragment; + output.Add("("); + if (template.Parameters != null) + { + output.Add(template.Parameters, ", "); + } + else if (template.ParameterNames?.Count == 1) + { + output.Add(template.ParameterNames[0]); + } + else if (template.ParameterNames?.Count > 1) + { + output.Add(string.Join(", ", template.ParameterNames)); + } + output.Add(")") + .Add(" =>"); + if (template.Code is MultilineCodeFragment) + { + output.StartBlock(); + } + else + { + output.Add(" "); + } + output.Add(template.Code); + if (template.Code is MultilineCodeFragment) + { + output.EndBlock(generatorOptions.Formatting.StartBlockInNewLine); + } + } +} diff --git a/Core/Writers/LocalVariableWriter.cs b/Common/Writers/LocalVariableWriter.cs similarity index 100% rename from Core/Writers/LocalVariableWriter.cs rename to Common/Writers/LocalVariableWriter.cs diff --git a/Core/Writers/MathWriter.cs b/Common/Writers/MathWriter.cs similarity index 100% rename from Core/Writers/MathWriter.cs rename to Common/Writers/MathWriter.cs diff --git a/Core/Writers/MethodGenericWriter.cs b/Common/Writers/MethodGenericWriter.cs similarity index 100% rename from Core/Writers/MethodGenericWriter.cs rename to Common/Writers/MethodGenericWriter.cs diff --git a/Core/Writers/MethodWriter.cs b/Common/Writers/MethodWriter.cs similarity index 100% rename from Core/Writers/MethodWriter.cs rename to Common/Writers/MethodWriter.cs diff --git a/Common/Writers/MultilineCodeFragmentWriter.cs b/Common/Writers/MultilineCodeFragmentWriter.cs new file mode 100644 index 00000000..0f9f61c2 --- /dev/null +++ b/Common/Writers/MultilineCodeFragmentWriter.cs @@ -0,0 +1,19 @@ +using KY.Generator.Languages; +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.Templates.Extensions; + +namespace KY.Generator.Writers +{ + public class MultilineCodeFragmentWriter : ITemplateWriter + { + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + MultilineCodeFragment template = (MultilineCodeFragment)fragment; + foreach (ICodeFragment codeFragment in template.Fragments) + { + output.Add(codeFragment); + } + } + } +} diff --git a/Core/Writers/NamespaceWriter.cs b/Common/Writers/NamespaceWriter.cs similarity index 69% rename from Core/Writers/NamespaceWriter.cs rename to Common/Writers/NamespaceWriter.cs index eedc634e..16a42e7b 100644 --- a/Core/Writers/NamespaceWriter.cs +++ b/Common/Writers/NamespaceWriter.cs @@ -1,17 +1,11 @@ -using KY.Generator.Languages; -using KY.Generator.Output; +using KY.Generator.Output; using KY.Generator.Templates; namespace KY.Generator.Writers { public class NamespaceWriter : ITemplateWriter { - public BaseLanguage Language { get; } - - public NamespaceWriter(BaseLanguage language) - { - this.Language = language; - } + protected string NamespaceKeyword { get; set; } = "namespace"; public virtual void Write(ICodeFragment fragment, IOutputCache output) { @@ -24,7 +18,7 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) bool hasNamespace = !string.IsNullOrEmpty(template.Name); if (hasNamespace) { - output.Add($"{this.Language.NamespaceKeyword} {template.Name}") + output.Add($"{this.NamespaceKeyword} {template.Name}") .StartBlock(); } output.Add(template.Children); @@ -34,4 +28,4 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) } } } -} \ No newline at end of file +} diff --git a/Core/Writers/NewWriter.cs b/Common/Writers/NewWriter.cs similarity index 100% rename from Core/Writers/NewWriter.cs rename to Common/Writers/NewWriter.cs diff --git a/Core/Writers/NotWriter.cs b/Common/Writers/NotWriter.cs similarity index 100% rename from Core/Writers/NotWriter.cs rename to Common/Writers/NotWriter.cs diff --git a/Core/Writers/NullCoalescingWriter.cs b/Common/Writers/NullCoalescingWriter.cs similarity index 100% rename from Core/Writers/NullCoalescingWriter.cs rename to Common/Writers/NullCoalescingWriter.cs diff --git a/Core/Writers/NullConditionalWriter.cs b/Common/Writers/NullConditionalWriter.cs similarity index 100% rename from Core/Writers/NullConditionalWriter.cs rename to Common/Writers/NullConditionalWriter.cs diff --git a/Core/Writers/NullValueWriter.cs b/Common/Writers/NullValueWriter.cs similarity index 100% rename from Core/Writers/NullValueWriter.cs rename to Common/Writers/NullValueWriter.cs diff --git a/Core/Writers/NullWriter.cs b/Common/Writers/NullWriter.cs similarity index 100% rename from Core/Writers/NullWriter.cs rename to Common/Writers/NullWriter.cs diff --git a/Core/Writers/NumberWriter.cs b/Common/Writers/NumberWriter.cs similarity index 100% rename from Core/Writers/NumberWriter.cs rename to Common/Writers/NumberWriter.cs diff --git a/Core/Writers/OperatorWriter.cs b/Common/Writers/OperatorWriter.cs similarity index 100% rename from Core/Writers/OperatorWriter.cs rename to Common/Writers/OperatorWriter.cs diff --git a/Common/Writers/ParenthesisWriter.cs b/Common/Writers/ParenthesisWriter.cs new file mode 100644 index 00000000..8295c397 --- /dev/null +++ b/Common/Writers/ParenthesisWriter.cs @@ -0,0 +1,16 @@ +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers +{ + public class ParenthesisWriter : ITemplateWriter + { + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + ParenthesisTemplate template = (ParenthesisTemplate)fragment; + output.Add("(") + .Add(template.Code) + .Add(")"); + } + } +} \ No newline at end of file diff --git a/Core/Writers/PropertyWriter.cs b/Common/Writers/PropertyWriter.cs similarity index 100% rename from Core/Writers/PropertyWriter.cs rename to Common/Writers/PropertyWriter.cs diff --git a/Core/Writers/ReturnWriter.cs b/Common/Writers/ReturnWriter.cs similarity index 100% rename from Core/Writers/ReturnWriter.cs rename to Common/Writers/ReturnWriter.cs diff --git a/Common/Writers/StringWriter.cs b/Common/Writers/StringWriter.cs new file mode 100644 index 00000000..de56889d --- /dev/null +++ b/Common/Writers/StringWriter.cs @@ -0,0 +1,23 @@ +using KY.Generator.Output; +using KY.Generator.Templates; + +namespace KY.Generator.Writers; + +public class StringWriter : ITemplateWriter +{ + private readonly Options options; + + public StringWriter(Options options) + { + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + GeneratorOptions generatorOptions = this.options.Get(); + StringTemplate template = (StringTemplate)fragment; + output.Add(generatorOptions.Formatting.Quote) + .Add(template.Value) + .Add(generatorOptions.Formatting.Quote); + } +} diff --git a/Core/Writers/SwitchWriter.cs b/Common/Writers/SwitchWriter.cs similarity index 100% rename from Core/Writers/SwitchWriter.cs rename to Common/Writers/SwitchWriter.cs diff --git a/Core/Writers/ThisWriter.cs b/Common/Writers/ThisWriter.cs similarity index 100% rename from Core/Writers/ThisWriter.cs rename to Common/Writers/ThisWriter.cs diff --git a/Core/Writers/TypeOfWriter.cs b/Common/Writers/TypeOfWriter.cs similarity index 100% rename from Core/Writers/TypeOfWriter.cs rename to Common/Writers/TypeOfWriter.cs diff --git a/Core/Writers/TypeWriter.cs b/Common/Writers/TypeWriter.cs similarity index 100% rename from Core/Writers/TypeWriter.cs rename to Common/Writers/TypeWriter.cs diff --git a/Core/Writers/VoidWriter.cs b/Common/Writers/VoidWriter.cs similarity index 100% rename from Core/Writers/VoidWriter.cs rename to Common/Writers/VoidWriter.cs diff --git a/Core/Writers/WhileWriter.cs b/Common/Writers/WhileWriter.cs similarity index 100% rename from Core/Writers/WhileWriter.cs rename to Common/Writers/WhileWriter.cs diff --git a/Core.Tests/ModelWriterTests.cs b/Core.Tests/ModelWriterTests.cs deleted file mode 100644 index 5d79a36b..00000000 --- a/Core.Tests/ModelWriterTests.cs +++ /dev/null @@ -1,138 +0,0 @@ -using System.Collections.Generic; -using KY.Core.Dependency; -using KY.Generator.Core.Tests.Models; -using KY.Generator.Mappings; -using KY.Generator.Templates; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Writers; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace KY.Generator.Core.Tests -{ - [TestClass] - public class ModelWriterTests - { - private IDependencyResolver resolver; - private ModelWriter writer; - - [TestInitialize] - public void Initialize() - { - this.resolver = new DependencyResolver(); - this.resolver.Bind().ToSingleton(); - this.writer = this.resolver.Create(); - } - - [TestMethod] - public void File() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Name = "Test1", - Language = new TestLanguage() - }; - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - Assert.AreEqual(1, files.Count, "Unexpected number of files"); - Assert.AreEqual("Test1", files[0].Name, "Unexpected file name"); - } - - [TestMethod] - public void Namespace() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Namespace = "KY.Test", - Language = new TestLanguage() - }; - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - Assert.AreEqual(1, files[0].Namespaces.Count, "Unexpected number of namespace"); - Assert.AreEqual("KY.Test", files[0].Namespaces[0].Name, "Unexpected namespace"); - } - - [TestMethod] - public void ClassName() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Name = "Test1", - Language = new TestLanguage() - }; - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - Assert.AreEqual("Test1", files[0].Namespaces[0].Children[0].Name, "Unexpected class name"); - } - - [TestMethod] - public void OneField() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Name = "Test1", - Namespace = "KY.Test", - Language = new TestLanguage() - }; - model.Fields.Add(new FieldTransferObject { Name = "Field1", Type = new TypeTransferObject { Name = "string" } }); - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; - Assert.AreEqual(1, classTemplate.Fields.Count, "Unexpected number of fields"); - Assert.AreEqual("Field1", classTemplate.Fields[0].Name, "Unexpected field name"); - Assert.AreEqual("string", classTemplate.Fields[0].Type.Name, "Unexpected field type"); - Assert.AreEqual(0, classTemplate.Properties.Count, "Unexpected number of properties"); - } - - [TestMethod] - public void OneProperty() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Name = "Test1", - Namespace = "KY.Test", - Language = new TestLanguage() - }; - model.Properties.Add(new PropertyTransferObject { Name = "Prop1", Type = new TypeTransferObject { Name = "string" } }); - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; - Assert.AreEqual(1, classTemplate.Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("Prop1", classTemplate.Properties[0].Name, "Unexpected property name"); - Assert.AreEqual("string", classTemplate.Properties[0].Type.Name, "Unexpected property type"); - Assert.AreEqual(0, classTemplate.Fields.Count, "Unexpected number of fields"); - } - - [TestMethod] - public void OnePropertyWithDifferentNamespace() - { - TestConfiguration configuration = new TestConfiguration(); - List transferObjects = new List(); - ModelTransferObject model = new ModelTransferObject - { - Name = "Test1", - Namespace = "KY.Test", - Language = new TestLanguage() - }; - model.Properties.Add(new PropertyTransferObject { Name = "Prop1", Type = new TypeTransferObject { Name = "Test2", Namespace = "KY.Test.Different" } }); - transferObjects.Add(model); - List files = this.writer.Write(configuration, transferObjects); - ClassTemplate classTemplate = (ClassTemplate)files[0].Namespaces[0].Children[0]; - Assert.AreEqual(1, classTemplate.Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("Prop1", classTemplate.Properties[0].Name, "Unexpected property name"); - Assert.AreEqual("Test2", classTemplate.Properties[0].Type.Name, "Unexpected property type"); - Assert.AreEqual(1, classTemplate.Usings.Count, "Unexpected number of usings"); - Assert.AreEqual("KY.Test.Different", classTemplate.Usings[0].Namespace, "Unexpected property namespace"); - Assert.AreEqual(0, classTemplate.Fields.Count, "Unexpected number of fields"); - } - } -} \ No newline at end of file diff --git a/Core.Tests/Models/TestLanguage.cs b/Core.Tests/Models/TestLanguage.cs deleted file mode 100644 index 5cd9d408..00000000 --- a/Core.Tests/Models/TestLanguage.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Languages; -using KY.Generator.Templates; - -namespace KY.Generator.Core.Tests.Models -{ - public class TestLanguage : BaseLanguage - { - public override string Name => "Test"; - public override bool ImportFromSystem => true; - - protected override IEnumerable GetUsings(FileTemplate fileTemplate) - { - return fileTemplate.GetUsingsByNamespace(); - } - } -} \ No newline at end of file diff --git a/Core.Tests/RawCommandReaderTest.cs b/Core.Tests/RawCommandReaderTest.cs deleted file mode 100644 index 31e505a1..00000000 --- a/Core.Tests/RawCommandReaderTest.cs +++ /dev/null @@ -1,219 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Command; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace KY.Generator.Core.Tests -{ - [TestClass] - public class RawCommandReaderTest - { - [TestInitialize] - public void Initialize() - { } - - [TestMethod] - public void TestEmptyParameters() - { - List commands = RawCommandReader.Read(); - Assert.AreEqual(0, commands.Count); - } - - [TestMethod] - public void TestInvalidCommandOrder() - { - string[] parameters = { "-parameter", "command" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(0, commands.Count); - } - - [TestMethod] - public void TestGlobalParameterFirst() - { - string[] parameters = { "--global", "command" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(1, commands.Count); - Assert.AreEqual("command", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("global", commands[0].Parameters[0].Name); - } - - [TestMethod] - public void TestOneCommandWithOneSimpleParameter() - { - string[] parameters = { "command", "-parameter" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(1, commands.Count); - Assert.AreEqual("command", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("parameter", commands[0].Parameters[0].Name); - } - - [TestMethod] - public void TestOneCommandWithTwoSimpleParameters() - { - string[] parameters = { "command", "-parameter1", "-parameter2" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(1, commands.Count); - Assert.AreEqual("command", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); - } - - [TestMethod] - public void TestOneCommandWithOneValueParameter() - { - string[] parameters = { "command", "-parameter=test" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(1, commands.Count); - Assert.AreEqual("command", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("parameter", commands[0].Parameters[0].Name); - Assert.AreEqual("test", commands[0].Parameters[0].Value); - } - - [TestMethod] - public void TestOneCommandWithTwoValueParameters() - { - string[] parameters = { "command", "-parameter1=test1", "-parameter2=test2" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(1, commands.Count); - Assert.AreEqual("command", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("test1", commands[0].Parameters[0].Value); - Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); - Assert.AreEqual("test2", commands[0].Parameters[1].Value); - } - - [TestMethod] - public void TestTwoCommandsWithTheSameSimpleParameter() - { - string[] parameters = { "command1", "-parameter", "command2", "-parameter" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("parameter", commands[1].Parameters[0].Name); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(1, commands[1].Parameters.Count); - Assert.AreEqual("parameter", commands[1].Parameters[0].Name); - } - - [TestMethod] - public void TestTwoCommandsWithDifferentSimpleParameter() - { - string[] parameters = { "command1", "-parameter1", "command2", "-parameter2" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(1, commands[1].Parameters.Count); - Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); - } - - [TestMethod] - public void TestTwoCommandsWithTheSameTwoSimpleParameters() - { - string[] parameters = { "command1", "-parameter1", "-parameter2", "command2", "-parameter1", "-parameter2" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(2, commands[1].Parameters.Count); - Assert.AreEqual("parameter1", commands[1].Parameters[0].Name); - Assert.AreEqual("parameter2", commands[1].Parameters[1].Name); - } - - [TestMethod] - public void TestTwoCommandsWithDifferentTwoSimpleParameters() - { - string[] parameters = { "command1", "-parameter1", "-parameter2", "command2", "-parameter3", "-parameter4" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(2, commands[1].Parameters.Count); - Assert.AreEqual("parameter3", commands[1].Parameters[0].Name); - Assert.AreEqual("parameter4", commands[1].Parameters[1].Name); - } - - [TestMethod] - public void TestTwoCommandsWithOneValueParameter() - { - string[] parameters = { "command1", "-parameter=test1", "command2", "-parameter=test2" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(1, commands[0].Parameters.Count); - Assert.AreEqual("parameter", commands[0].Parameters[0].Name); - Assert.AreEqual("test1", commands[0].Parameters[0].Value); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(1, commands[1].Parameters.Count); - Assert.AreEqual("parameter", commands[1].Parameters[0].Name); - Assert.AreEqual("test2", commands[1].Parameters[0].Value); - } - - [TestMethod] - public void TestTwoCommandsWithTwoValueParameters() - { - string[] parameters = { "command1", "-parameter1=test1", "-parameter2=test2", "command2", "-parameter3=test3", "-parameter4=test4" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("test1", commands[0].Parameters[0].Value); - Assert.AreEqual("parameter2", commands[0].Parameters[1].Name); - Assert.AreEqual("test2", commands[0].Parameters[1].Value); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(2, commands[1].Parameters.Count); - Assert.AreEqual("parameter3", commands[1].Parameters[0].Name); - Assert.AreEqual("test3", commands[1].Parameters[0].Value); - Assert.AreEqual("parameter4", commands[1].Parameters[1].Name); - Assert.AreEqual("test4", commands[1].Parameters[1].Value); - } - - [TestMethod] - public void TestTwoCommandsWithOneSimpleAndOneGlobalSimpleParameter() - { - string[] parameters = { "command1", "-parameter1", "command2", "-parameter2", "--global" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("global", commands[0].Parameters[1].Name); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(2, commands[1].Parameters.Count); - Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); - Assert.AreEqual("global", commands[1].Parameters[1].Name); - } - - [TestMethod] - public void TestTwoCommandsWithOneSimpleAndOneGlobalValueParameter() - { - string[] parameters = { "command1", "-parameter1", "command2", "-parameter2", "--global=everywhere" }; - List commands = RawCommandReader.Read(parameters); - Assert.AreEqual(2, commands.Count); - Assert.AreEqual("command1", commands[0].Name); - Assert.AreEqual(2, commands[0].Parameters.Count); - Assert.AreEqual("parameter1", commands[0].Parameters[0].Name); - Assert.AreEqual("global", commands[0].Parameters[1].Name); - Assert.AreEqual("everywhere", commands[0].Parameters[1].Value); - Assert.AreEqual("command2", commands[1].Name); - Assert.AreEqual(2, commands[1].Parameters.Count); - Assert.AreEqual("parameter2", commands[1].Parameters[0].Name); - Assert.AreEqual("global", commands[1].Parameters[1].Name); - Assert.AreEqual("everywhere", commands[1].Parameters[1].Value); - } - } -} \ No newline at end of file diff --git a/Core.Tests/TemplateWriterTests.cs b/Core.Tests/TemplateWriterTests.cs deleted file mode 100644 index 50a920c0..00000000 --- a/Core.Tests/TemplateWriterTests.cs +++ /dev/null @@ -1,454 +0,0 @@ -using KY.Core; -using KY.Core.Dependency; -using KY.Generator.Core.Tests.Models; -using KY.Generator.Languages; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Templates.Extensions; -using KY.Generator.Writers; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace KY.Generator.Core.Tests -{ - [TestClass] - public class TemplateWriterTests : Codeable - { - private IDependencyResolver resolver; - private IOutputCache output; - - [TestInitialize] - public void Initialize() - { - this.resolver = new DependencyResolver(); - this.output = new FileWriter(new TestLanguage()); - } - - [TestMethod] - public void AccessIndexWriter() - { - AccessIndexWriter writer = new AccessIndexWriter(); - writer.Write(new AccessIndexTemplate(Code.Local("test")), this.output); - Assert.AreEqual("[test]", this.output.ToString()); - } - - [TestMethod] - public void AppendStringWriter() - { - AppendStringWriter writer = new AppendStringWriter(); - writer.Write(new AppendStringTemplate(Code.Local("test")), this.output); - Assert.AreEqual(" + test", this.output.ToString()); - } - - [TestMethod] - public void AssignWriter() - { - AssignWriter writer = new AssignWriter(); - writer.Write(new AssignTemplate(Code.Local("test")), this.output); - Assert.AreEqual("= test", this.output.ToString()); - } - - [TestMethod] - public void AsWriter() - { - AsWriter writer = new AsWriter(); - writer.Write(new AsTemplate(Code.Type("test")), this.output); - Assert.AreEqual("as test", this.output.ToString()); - } - - [TestMethod] - public void BlankLineWriter() - { - BlankLineWriter writer = new BlankLineWriter(); - writer.Write(new BlankLineTemplate(), this.output); - Assert.AreEqual("", this.output.ToString()); - } - - [TestMethod] - public void CaseWriter() - { - CaseWriter writer = new CaseWriter(); - CaseTemplate template = new CaseTemplate(Code.String("test")); - template.Code.AddLine(Code.Comment("code here")); - writer.Write(template, this.output); - Assert.AreEqual("case \"test\":\r\n // code here\r\n break;", this.output.ToString()); - } - - [TestMethod] - public void ClassGenericWriter() - { - Assert.Inconclusive("Not implemented yet"); - ClassGenericWriter writer = new ClassGenericWriter(); - writer.Write(new ClassGenericTemplate("test"), this.output); - Assert.AreEqual("test", this.output.ToString()); - } - - [TestMethod] - public void ClassWriter() - { - ClassWriter writer = new ClassWriter(); - writer.Write(new ClassTemplate((NamespaceTemplate)null, "test"), this.output); - Assert.AreEqual("public partial class test\r\n{\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassOneProperty() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddProperty("Prop1", Code.Type("string")); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassOnePropertyAndOneMethod() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddProperty("Prop1", Code.Type("string")); - template.AddMethod("Meth1", Code.Type("string")); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n public string Meth1()\r\n {\r\n }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassWithComment() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.Comment = Code.Comment("test comment"); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("// test comment\r\npublic partial class test\r\n{\r\n}", this.output.ToString()); - } - - [TestMethod] - public void CommentWriter() - { - CommentWriter writer = new CommentWriter(); - writer.Write(new CommentTemplate("first line"), this.output); - Assert.AreEqual("// first line", this.output.ToString()); - } - - [TestMethod] - public void MultilineComment() - { - CommentWriter writer = new CommentWriter(); - writer.Write(new CommentTemplate("first line\r\nsecond line\r\nthird line"), this.output); - Assert.AreEqual("// first line\r\n// second line\r\n// third line", this.output.ToString()); - } - - [TestMethod] - public void ElseIfWriter() - { - ElseIfTemplate template = new ElseIfTemplate(null, Code.Local("variable")); - template.Code.AddLine(Code.Comment("Some code here")); - ElseIfWriter writer = new ElseIfWriter(); - writer.Write(template, this.output); - Assert.AreEqual("else if (variable)\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ElseWriter() - { - ElseTemplate template = new ElseTemplate(null); - template.Code.AddLine(Code.Comment("Some code here")); - ElseWriter writer = new ElseWriter(); - writer.Write(template, this.output); - Assert.AreEqual("else\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void EnumWriter() - { - EnumTemplate template = new EnumTemplate((NamespaceTemplate)null, "test"); - template.Values.Add(new EnumValueTemplate("value", Code.Number(0))); - EnumWriter writer = new EnumWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public enum test\r\n{\r\n value = 0\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ExecuteFieldWriter() - { - ExecuteFieldWriter writer = new ExecuteFieldWriter(); - writer.Write(new ExecuteFieldTemplate("field"), this.output); - Assert.AreEqual("field", this.output.ToString()); - } - - [TestMethod] - public void ExecuteGenericMethodWriter() - { - ExecuteGenericMethodWriter writer = new ExecuteGenericMethodWriter(); - writer.Write(new ExecuteGenericMethodTemplate("test", Code.Type("type").Yield(), Code.Local("parameter")), this.output); - Assert.AreEqual("test(parameter)", this.output.ToString()); - } - - [TestMethod] - public void ExecuteMethodWriter() - { - ExecuteMethodWriter writer = new ExecuteMethodWriter(); - writer.Write(new ExecuteMethodTemplate("test", Code.Local("parameter1"), Code.Local("parameter2")), this.output); - Assert.AreEqual("test(parameter1, parameter2)", this.output.ToString()); - } - - [TestMethod] - public void ExecutePropertyWriter() - { - ExecutePropertyWriter writer = new ExecutePropertyWriter(); - writer.Write(new ExecutePropertyTemplate("test"), this.output); - Assert.AreEqual("test", this.output.ToString()); - } - - [TestMethod] - public void FieldWriter() - { - FieldWriter writer = new FieldWriter(this.output.Language.CastTo()); - writer.Write(new FieldTemplate(null, "test", Code.Type("type")), this.output); - Assert.AreEqual("private type test;", this.output.ToString()); - } - - [TestMethod] - public void FieldDefaultValue() - { - FieldTemplate template = new FieldTemplate(null, "test", Code.Type("type")); - template.DefaultValue = Code.String("default"); - FieldWriter writer = new FieldWriter(this.output.Language.CastTo()); - writer.Write(template, this.output); - Assert.AreEqual("private type test = \"default\";", this.output.ToString()); - } - - [TestMethod] - public void IfWriter() - { - Assert.Inconclusive("Not implemented yet"); - IfTemplate template = new IfTemplate(Code.Local("test").Equals().String("string")); - template.Code.AddLine(Code.Comment("Some code here")); - IfWriter writer = new IfWriter(); - writer.Write(template, this.output); - Assert.AreEqual("if (test == \"string\")\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void InlineIfWriter() - { - InlineIfTemplate template = new InlineIfTemplate(Code.Local("test"), Code.String("true"), Code.String("false")); - InlineIfWriter writer = new InlineIfWriter(); - writer.Write(template, this.output); - Assert.AreEqual("test ? \"true\" : \"false\"", this.output.ToString()); - } - - [TestMethod] - public void LambdaWriter() - { - LambdaTemplate template = new LambdaTemplate("parameter".Yield(), Code.Local("parameter").Method("test")); - LambdaWriter writer = new LambdaWriter(); - writer.Write(template, this.output); - Assert.AreEqual("parameter => parameter.test()", this.output.ToString()); - } - - [TestMethod] - public void LambdaMultiline() - { - LambdaTemplate template = new LambdaTemplate("parameter".Yield(), Code.Multiline().AddLine(Code.Local("parameter").Method("test").Close())); - LambdaWriter writer = new LambdaWriter(); - writer.Write(template, this.output); - Assert.AreEqual("parameter =>\r\n{\r\n parameter.test();\r\n}", this.output.ToString()); - } - - [TestMethod] - public void LocalVariableWriter() - { - LocalVariableWriter writer = new LocalVariableWriter(); - writer.Write(new LocalVariableTemplate("test"), this.output); - Assert.AreEqual("test", this.output.ToString()); - } - - [TestMethod] - public void MethodWriter() - { - MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")); - template.Code.AddLine(Code.Comment("Some code here")); - MethodWriter writer = new MethodWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void NullWriter() - { - NullWriter writer = new NullWriter(); - writer.Write(new NullTemplate(), this.output); - Assert.AreEqual("null", this.output.ToString()); - } - - [TestMethod] - public void StaticMethod() - { - MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")).Static(); - template.Code.AddLine(Code.Comment("Some code here")); - MethodWriter writer = new MethodWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public static type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void OverrideMethod() - { - MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")).Override(); - template.Code.AddLine(Code.Comment("Some code here")); - MethodWriter writer = new MethodWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public override type test()\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ParameterMethod() - { - Assert.Inconclusive("Not implemented yet"); - MethodTemplate template = new MethodTemplate(null, "test", Code.Type("type")); - template.Parameters.Add(new ParameterTemplate(Code.Type("other"), "param")); - template.Code.AddLine(Code.Comment("Some code here")); - MethodWriter writer = new MethodWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public type test(other param)\r\n{\r\n // Some code here\r\n}", this.output.ToString()); - } - - [TestMethod] - public void PropertyWithEmptyComment() - { - PropertyTemplate template = new PropertyTemplate(null, "Property", Code.Type("string")) - .WithComment(""); - this.output.Language.Write(template, this.output); - Assert.AreEqual("public string Property { get; set; }", this.output.ToString()); - } - - [TestMethod] - public void NamespaceWriter() - { - NamespaceTemplate template = new NamespaceTemplate(null, "test"); - template.AddClass("testClass"); - NamespaceWriter writer = new NamespaceWriter(this.output.Language.CastTo()); - writer.Write(template, this.output); - Assert.AreEqual("namespace test\r\n{\r\n public partial class testClass\r\n {\r\n }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void NewWriter() - { - NewWriter writer = new NewWriter(); - writer.Write(new NewTemplate(Code.Type("type")), this.output); - Assert.AreEqual("new type()", this.output.ToString()); - } - - [TestMethod] - public void NewWithParameter() - { - NewWriter writer = new NewWriter(); - writer.Write(new NewTemplate(Code.Type("type"), Code.Local("parameter")), this.output); - Assert.AreEqual("new type(parameter)", this.output.ToString()); - } - - [TestMethod] - public void NotWriter() - { - NotWriter writer = new NotWriter(); - writer.Write(new NotTemplate(), this.output); - Assert.AreEqual("!", this.output.ToString()); - } - - [TestMethod] - public void NullValueWriter() - { - NullValueWriter writer = new NullValueWriter(); - writer.Write(new NullValueTemplate(), this.output); - Assert.AreEqual("null", this.output.ToString()); - } - - [TestMethod] - public void NumberWriter() - { - NumberWriter writer = new NumberWriter(); - writer.Write(new NumberTemplate(1), this.output); - Assert.AreEqual("1", this.output.ToString()); - } - - [TestMethod] - public void OperatorWriter() - { - OperatorWriter writer = new OperatorWriter(); - writer.Write(new OperatorTemplate(Operator.And), this.output); - Assert.AreEqual("&&", this.output.ToString()); - } - - [TestMethod] - public void PropertyWriter() - { - PropertyWriter writer = new PropertyWriter(); - writer.Write(new PropertyTemplate(null, "test", Code.Type("type")), this.output); - Assert.AreEqual("public type test { get; set; }", this.output.ToString()); - } - - [TestMethod] - public void PropertyDefaultValue() - { - PropertyTemplate template = new PropertyTemplate(null, "test", Code.Type("type")); - template.DefaultValue = Code.String("value"); - PropertyWriter writer = new PropertyWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public type test { get; set; } = \"value\";", this.output.ToString()); - } - - [TestMethod] - public void ReturnWriter() - { - ReturnWriter writer = new ReturnWriter(); - writer.Write(new ReturnTemplate(Code.String("string")), this.output); - Assert.AreEqual("return \"string\";", this.output.ToString()); - } - - [TestMethod] - public void StringWriter() - { - StringWriter writer = new StringWriter(); - writer.Write(new StringTemplate("string"), this.output); - Assert.AreEqual("\"string\"", this.output.ToString()); - } - - [TestMethod] - public void SwitchWriter() - { - SwitchTemplate template = new SwitchTemplate(Code.Local("value")); - CaseTemplate caseTemplate = new CaseTemplate(Code.String("one")); - caseTemplate.Code.AddLine(Code.Comment("Some code here")); - template.Cases.Add(caseTemplate); - template.Default.AddLine(Code.Comment("Some code here")); - SwitchWriter writer = new SwitchWriter(); - writer.Write(template, this.output); - Assert.AreEqual("switch (value)\r\n{\r\n case \"one\":\r\n // Some code here\r\n break;\r\n default:\r\n // Some code here\r\n break;\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ThisWriter() - { - ThisWriter writer = new ThisWriter(); - writer.Write(new ThisTemplate(), this.output); - Assert.AreEqual("this", this.output.ToString()); - } - - [TestMethod] - public void TypeOfWriter() - { - TypeOfWriter writer = new TypeOfWriter(); - writer.Write(new TypeOfTemplate(Code.Type("test")), this.output); - Assert.AreEqual("typeof(test)", this.output.ToString()); - } - - [TestMethod] - public void VoidWriter() - { - VoidWriter writer = new VoidWriter(); - writer.Write(new VoidTemplate(), this.output); - Assert.AreEqual("void", this.output.ToString()); - } - } -} diff --git a/Core/Client/GeneratorConfiguration.cs b/Core/Client/GeneratorConfiguration.cs deleted file mode 100644 index 40dd4546..00000000 --- a/Core/Client/GeneratorConfiguration.cs +++ /dev/null @@ -1,9 +0,0 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Client -{ - internal class GeneratorConfiguration : ConfigurationBase - { - public GeneratorClientConfiguration Client { get; set; } - } -} \ No newline at end of file diff --git a/Core/Client/GeneratorGenerator.cs b/Core/Client/GeneratorGenerator.cs deleted file mode 100644 index fe438e58..00000000 --- a/Core/Client/GeneratorGenerator.cs +++ /dev/null @@ -1,19 +0,0 @@ -using System.Collections.Generic; -using KY.Core; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Output; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Writers; - -namespace KY.Generator.Client -{ - internal class GeneratorGenerator : Codeable, ITransferWriter - { - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - Logger.Trace("Generate generator..."); - GeneratorConfiguration configuration = (GeneratorConfiguration)configurationBase; - } - } -} \ No newline at end of file diff --git a/Core/Command/CommandRunner.cs b/Core/Command/CommandRunner.cs deleted file mode 100644 index d63681c6..00000000 --- a/Core/Command/CommandRunner.cs +++ /dev/null @@ -1,117 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; -using KY.Core.Dependency; -using KY.Generator.Extensions; -using KY.Generator.Output; -using KY.Generator.Transfer; - -namespace KY.Generator.Command -{ - public class CommandRunner - { - private readonly IDependencyResolver resolver; - - public CommandRunner(IDependencyResolver resolver) - { - this.resolver = resolver; - } - - public List Convert(IEnumerable commands, List transferObjects = null) - { - bool allCommandsFound = true; - List foundCommands = new List(); - foreach (RawCommand rawCommand in commands) - { - IGeneratorCommand command = this.FindCommand(rawCommand.Name); - if (command == null) - { - allCommandsFound = false; - GeneratorErrors.CommandNotFoundError(rawCommand); - } - else - { - command.Parse(rawCommand.Parameters); - command.TransferObjects = transferObjects; - foundCommands.Add(command); - } - } - if (!allCommandsFound) - { - GeneratorErrors.CommandDocumentationHint(); - } - return foundCommands; - } - - - public IGeneratorCommand FindCommand(string command) - { - return this.resolver.Get>().SingleOrDefault(x => x.Names.Any(name => name.Equals(command, StringComparison.InvariantCultureIgnoreCase))); - } - - public IGeneratorCommandResult Run(IEnumerable commands, IOutput output, List transferObjects) - { - return this.Run(this.Convert(commands, transferObjects), output); - } - - public IGeneratorCommandResult Run(RawCommand command, IOutput output, List transferObjects) - { - return this.Run(command.Yield(), output, transferObjects); - } - - public IGeneratorCommandResult Run(IEnumerable commands, IOutput output) - { - IGeneratorCommandResult result = null; - foreach (IGeneratorCommand command in commands) - { - result = command.Run(output); - if (!result.Success) - { - return result; - } - } - return result ?? new SuccessResult(); - } - - public IGeneratorCommandResult Run(IGeneratorCommand command, IOutput output) - { - if (!string.IsNullOrEmpty(command.Parameters.Output)) - { - output.Move(command.Parameters.Output); - } - if (!command.Parameters.SkipAsyncCheck) - { - if (!command.Parameters.IsOnlyAsync && command.Parameters.IsAsync) - { - return new SwitchAsyncResult(); - } - bool? isAssemblyAsync = command.Parameters.IsAsyncAssembly; - if (!command.Parameters.IsAsync) - { - if (!string.IsNullOrEmpty(command.Parameters.Assembly)) - { - LocateAssemblyResult locateAssemblyResult = GeneratorAssemblyLocator.Locate(command.Parameters.Assembly, command.Parameters.IsBeforeBuild); - if (locateAssemblyResult.SwitchContext) - { - return locateAssemblyResult; - } - isAssemblyAsync = locateAssemblyResult.Assembly?.IsAsync(); - } - } - if (isAssemblyAsync != null) - { - if (!command.Parameters.IsOnlyAsync && isAssemblyAsync.Value) - { - return new SwitchAsyncResult(); - } - if (command.Parameters.IsOnlyAsync && !command.Parameters.IsAsync && !isAssemblyAsync.Value) - { - return new SwitchAsyncResult(); - } - } - } - return command.Run(output); - } - } -} \ No newline at end of file diff --git a/Core/Command/GeneratorCommand.cs b/Core/Command/GeneratorCommand.cs deleted file mode 100644 index 3b77fce9..00000000 --- a/Core/Command/GeneratorCommand.cs +++ /dev/null @@ -1,198 +0,0 @@ -using System; -using System.Collections; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using KY.Core; -using KY.Generator.Models; -using KY.Generator.Output; -using KY.Generator.Transfer; - -namespace KY.Generator.Command -{ - public abstract class GeneratorCommand : IGeneratorCommand - where T : GeneratorCommandParameters, new() - { - public abstract string[] Names { get; } - public T Parameters { get; } = new T(); - GeneratorCommandParameters IGeneratorCommand.Parameters => this.Parameters; - public List OriginalParameters { get; private set; } - public List TransferObjects { get; set; } - - public bool Parse(params RawCommandParameter[] parameters) - { - return this.Parse(parameters.ToList()); - } - - public bool Parse(IEnumerable parameters) - { - this.OriginalParameters = parameters.ToList(); - Type type = typeof(T); - Dictionary mapping = new Dictionary(); - foreach (PropertyInfo property in type.GetProperties()) - { - bool isMapped = false; - foreach (GeneratorParameterAttribute attribute in property.GetCustomAttributes()) - { - isMapped = true; - mapping.AddIfNotExists(RawCommandParameter.FormatName(attribute.ParameterName), property); - } - foreach (GeneratorGlobalParameterAttribute attribute in property.GetCustomAttributes().Where(x => !string.IsNullOrEmpty(x.ParameterName))) - { - isMapped = true; - mapping.AddIfNotExists(RawCommandParameter.FormatName(attribute.ParameterName), property); - } - if (!isMapped) - { - mapping.AddIfNotExists(RawCommandParameter.FormatName(property.Name), property); - } - } - foreach (RawCommandParameter parameter in this.OriginalParameters) - { - string parameterName = parameter.Name.ToLowerInvariant(); - if (!mapping.ContainsKey(parameterName)) - { - Logger.Warning($"Unknown parameter '{parameter.Name}' on '{this.Names.First()}' command"); - continue; - } - PropertyInfo property = mapping[parameterName]; - bool isList = property.PropertyType.Name.StartsWith("List`"); - if (isList && this.OriginalParameters.Count(p => p.Name == parameter.Name) > 1) - { - IList list = property.GetMethod.Invoke(this.Parameters, null) as IList; - if (list == null) - { - Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.Names.First()}' command. Parameter is from type List and has to be always initialized"); - return false; - } - Type itemType = property.PropertyType.GetGenericArguments().First(); - if (!GeneratorCommand.ParameterParser.ContainsKey(itemType)) - { - Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.Names.First()}' command. No converter from List to List<{itemType.FullName}> found. Use {nameof(GeneratorCommand)}.{nameof(GeneratorCommand.ParameterParser)} to set a custom parser. Do not map List map T instead"); - return false; - } - list.Add(GeneratorCommand.ParameterParser[itemType].Invoke(parameter.Value)); - } - else - { - if (!property.CanWrite) - { - Logger.Warning($"Can not write parameter '{parameter.Name}' on '{this.Names.First()}' command. Ensure command property has a public setter."); - continue; - } - - if (!GeneratorCommand.ParameterParser.ContainsKey(property.PropertyType)) - { - Logger.Error($"Can not write parameter '{parameter.Name}' on '{this.Names.First()}' command. No converter from System.String to {property.PropertyType.FullName} found. Use {nameof(GeneratorCommand)}.{nameof(GeneratorCommand.ParameterParser)} to set a custom parser"); - return false; - } - try - { - property.SetMethod.Invoke(this.Parameters, new[] - { - GeneratorCommand.ParameterParser[property.PropertyType].Invoke(parameter.Value) - }); - } - catch (Exception exception) - { - Logger.Error($"Can not set parameter '{this.Names.First()}.{parameter.Name}'. {exception.Message}"); - return false; - } - } - } - return true; - } - - public abstract IGeneratorCommandResult Run(IOutput output); - - protected SuccessResult Success() - { - return new SuccessResult(); - } - - protected ErrorResult Error() - { - return new ErrorResult(); - } - - protected SwitchContextResult SwitchContext(SwitchableFramework switchToFramework) - { - return new SwitchContextResult(null, switchToFramework); - } - - protected SwitchContextResult SwitchContext(ProcessorArchitecture? switchToArchitecture, SwitchableFramework switchToFramework = SwitchableFramework.None) - { - return new SwitchContextResult(switchToArchitecture, switchToFramework); - } - - protected SwitchAsyncResult SwitchAsync() - { - return new SwitchAsyncResult(); - } - - public override string ToString() - { - return $" {this.Names.First()} {string.Join(" ", this.OriginalParameters)}"; - } - } - - public static class GeneratorCommand - { - internal static Dictionary> ParameterParser { get; } = new Dictionary>(); - - static GeneratorCommand() - { - AddParser(value => value); - AddParser(value => !value?.Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase) ?? true); - AddParser(value => !value?.Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase)); - AddParser(value => value?.Split(',').Select(x => !x.Trim().Equals(bool.FalseString, StringComparison.CurrentCultureIgnoreCase)).ToList()); - AddParser(byte.Parse); - AddParser(value => value == null ? (byte?)null : byte.Parse(value)); - AddParser(value => value?.Split(',').Select(byte.Parse).ToList()); - AddParser(char.Parse); - AddParser(value => value == null ? (char?)null : char.Parse(value)); - AddParser(value => value?.Split(',').Select(char.Parse).ToList()); - AddParser(DateTime.Parse); - AddParser(value => value == null ? (DateTime?)null : DateTime.Parse(value)); - AddParser(value => value?.Split(',').Select(DateTime.Parse).ToList()); - AddParser(decimal.Parse); - AddParser(value => value == null ? (decimal?)null : decimal.Parse(value)); - AddParser(value => value?.Split(',').Select(decimal.Parse).ToList()); - AddParser(short.Parse); - AddParser(value => value == null ? (short?)null : short.Parse(value)); - AddParser(value => value?.Split(',').Select(short.Parse).ToList()); - AddParser(int.Parse); - AddParser(value => value == null ? (int?)null : int.Parse(value)); - AddParser(value => value?.Split(',').Select(int.Parse).ToList()); - AddParser(long.Parse); - AddParser(value => value == null ? (long?)null : long.Parse(value)); - AddParser(value => value?.Split(',').Select(long.Parse).ToList()); - AddParser(ushort.Parse); - AddParser(value => value == null ? (ushort?)null : ushort.Parse(value)); - AddParser(value => value?.Split(',').Select(ushort.Parse).ToList()); - AddParser(uint.Parse); - AddParser(value => value == null ? (uint?)null : uint.Parse(value)); - AddParser(value => value?.Split(',').Select(uint.Parse).ToList()); - AddParser(ulong.Parse); - AddParser(value => value == null ? (ulong?)null : ulong.Parse(value)); - AddParser(value => value?.Split(',').Select(ulong.Parse).ToList()); - AddParser(float.Parse); - AddParser(value => value == null ? (float?)null : float.Parse(value)); - AddParser(value => value?.Split(',').Select(float.Parse).ToList()); - AddParser(double.Parse); - AddParser(value => value == null ? (double?)null : double.Parse(value)); - AddParser(value => value?.Split(',').Select(double.Parse).ToList()); - AddParser(Guid.Parse); - AddParser(value => value == null ? (Guid?)null : Guid.Parse(value)); - AddParser(value => value?.Split(',').Select(Guid.Parse).ToList()); - AddParser(TimeSpan.Parse); - AddParser(value => value == null ? (TimeSpan?)null : TimeSpan.Parse(value)); - AddParser(value => value?.Split(',').Select(TimeSpan.Parse).ToList()); - } - - public static void AddParser(Func parseAction) - { - ParameterParser.Add(typeof(T), value => parseAction(value)); - } - } -} diff --git a/Core/Command/IGeneratorCommand.cs b/Core/Command/IGeneratorCommand.cs deleted file mode 100644 index 028cd12a..00000000 --- a/Core/Command/IGeneratorCommand.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Output; -using KY.Generator.Transfer; - -namespace KY.Generator.Command -{ - public interface IGeneratorCommand - { - string[] Names { get; } - GeneratorCommandParameters Parameters { get; } - List TransferObjects { get; set; } - - bool Parse(IEnumerable parameters); - bool Parse(params RawCommandParameter[] parameters); - IGeneratorCommandResult Run(IOutput output); - } -} \ No newline at end of file diff --git a/Core/Command/RawCommand.cs b/Core/Command/RawCommand.cs deleted file mode 100644 index 8d30e141..00000000 --- a/Core/Command/RawCommand.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Command -{ - public class RawCommand - { - public string Name { get; } - public List Parameters { get; } = new List(); - - public RawCommand(string name) - { - this.Name = name; - } - } -} \ No newline at end of file diff --git a/Core/Command/RawCommandParameter.cs b/Core/Command/RawCommandParameter.cs deleted file mode 100644 index 5bf41d07..00000000 --- a/Core/Command/RawCommandParameter.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System; -using System.Diagnostics; -using System.Text.RegularExpressions; - -namespace KY.Generator.Command -{ - [DebuggerDisplay("{Name,nq}={Value}")] - public class RawCommandParameter - { - private static readonly Regex regex = new Regex(@"^-\*?(?[a-zA-Z0-9-]+)(=(?.*))?$"); - - public string Name { get; } - public string Value { get; set; } - - public RawCommandParameter(string name, string value) - { - this.Name = name; - this.Value = value; - } - - public static RawCommandParameter Parse(string text) - { - Match match = regex.Match(text); - if (!match.Success) - { - throw new InvalidOperationException($"Invalid parameter '{text}'"); - } - string name = FormatName(match.Groups["name"].Value); - string value = match.Groups["value"].Value; - return new RawCommandParameter(name, value); - } - - public static string FormatName(string name) - { - return name?.Replace("-", string.Empty)?.ToLowerInvariant(); - } - - public override string ToString() - { - string value = string.IsNullOrEmpty(this.Value) ? string.Empty : $"=\"{this.Value.TrimEnd('\\')}\""; - return $"-{this.Name}{value}"; - } - } -} diff --git a/Core/Command/RawCommandReader.cs b/Core/Command/RawCommandReader.cs deleted file mode 100644 index f20d52fa..00000000 --- a/Core/Command/RawCommandReader.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using KY.Core; - -namespace KY.Generator.Command -{ - public static class RawCommandReader - { - public static List Read(params string[] parameters) - { - List globalParameters = new List(); - List commands = new List(); - foreach (string parameter in parameters) - { - if (parameter.StartsWith("-*")) - { - globalParameters.Add(parameter); - } - else if (parameter.StartsWith("-")) - { - if (commands.Count == 0) - { - Logger.Error("The first parameter has to be a command (must not start with a dash '-')"); - break; - } - commands.Last().Parameters.Add(RawCommandParameter.Parse(parameter)); - } - else - { - commands.Add(new RawCommand(parameter)); - } - } - List parsedGlobalParameters = globalParameters.Select(RawCommandParameter.Parse).ToList(); - foreach (RawCommand command in commands) - { - command.Parameters.AddRange(parsedGlobalParameters); - } - return commands; - } - } -} diff --git a/Core/Commands/ReadIdCommand.cs b/Core/Commands/ReadIdCommand.cs deleted file mode 100644 index 20a84a91..00000000 --- a/Core/Commands/ReadIdCommand.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System; -using System.Linq; -using KY.Core; -using KY.Core.DataAccess; -using KY.Generator.Command; -using KY.Generator.Output; -using KY.Generator.Transfer; - -namespace KY.Generator.Commands -{ - internal class ReadIdCommand : GeneratorCommand - { - public override string[] Names { get; }= { "readid" }; - - public override IGeneratorCommandResult Run(IOutput output) - { - string projectFileName = FileSystem.GetFileName(this.Parameters.Project); - VisualStudioParser parser = new VisualStudioParser(); - VisualStudioSolutionProject project = parser.ParseProject(this.Parameters.Project); - if (project == null || project.Id == Guid.Empty) - { - VisualStudioSolution solution = parser.ParseSolution(this.Parameters.Solution); - project = solution?.Projects.FirstOrDefault(x => x.Path.EndsWith(projectFileName)) ?? project; - } - if (project != null && project.Id == Guid.Empty) - { - project.Id = Guid.NewGuid(); - parser.SetProjectGuid(this.Parameters.Project, project.Id); - } - - if (project == null || project.Id == Guid.Empty) - { - Logger.Warning($"Can not read project id. No solution for project '{this.Parameters.Project}' found. Automatic file cleanup deactivated!"); - return this.Success(); - } - this.TransferObjects.Add(new OutputIdTransferObject(project.Id)); - - return this.Success().ForceRerunOnAsync(); - } - } -} \ No newline at end of file diff --git a/Core/Commands/ReadIdCommandParameters.cs b/Core/Commands/ReadIdCommandParameters.cs deleted file mode 100644 index 2e7ea5ba..00000000 --- a/Core/Commands/ReadIdCommandParameters.cs +++ /dev/null @@ -1,10 +0,0 @@ -using KY.Generator.Command; - -namespace KY.Generator.Commands -{ - internal class ReadIdCommandParameters : GeneratorCommandParameters - { - public string Project { get; set; } - public string Solution { get; set; } - } -} \ No newline at end of file diff --git a/Core/Commands/VersionCommand.cs b/Core/Commands/VersionCommand.cs deleted file mode 100644 index 0cc4a07c..00000000 --- a/Core/Commands/VersionCommand.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Linq; -using KY.Core; -using KY.Generator.Command; -using KY.Generator.Output; - -namespace KY.Generator.Commands -{ - internal class VersionCommand : GeneratorCommand - { - public override string[] Names { get; } = { "version", "v" }; - - public override IGeneratorCommandResult Run(IOutput output) - { - Logger.Trace("Execute version command..."); - Logger.Trace("Loaded assemblies:"); - - AppDomain.CurrentDomain.GetAssemblies() - .Select(x => x.GetName()) - .OrderBy(x => x.Name) - .ForEach(x => Logger.Trace($"{x.Name} {x.Version} {(this.Parameters.ShowDetailed ? x.CodeBase.TrimStart("file:///") : "")}")); - return this.Success(); - } - } -} \ No newline at end of file diff --git a/Core/Configuration/ConfigurationFormatting.cs b/Core/Configuration/ConfigurationFormatting.cs deleted file mode 100644 index 5c1652f8..00000000 --- a/Core/Configuration/ConfigurationFormatting.cs +++ /dev/null @@ -1,27 +0,0 @@ -namespace KY.Generator.Configuration -{ - public class ConfigurationFormatting - { - public string FileCase { get; set; } - public string ClassCase { get; set; } - public string FieldCase { get; set; } - public string PropertyCase { get; set; } - public string MethodCase { get; set; } - public string ParameterCase { get; set; } - public bool FieldsToProperties { get; set; } - public bool PropertiesToFields { get; set; } - public bool PreferInterfaces { get; set; } - public bool WithOptionalProperties { get; set; } - public string AllowedSpecialCharacters { get; set; } - - public virtual void ApplyDefaults(ConfigurationFormatting defaults) - { - this.FileCase = this.FileCase ?? defaults.FileCase; - this.ClassCase = this.ClassCase ?? defaults.ClassCase; - this.FieldCase = this.FieldCase ?? defaults.FieldCase; - this.PropertyCase = this.PropertyCase ?? defaults.PropertyCase; - this.MethodCase = this.MethodCase ?? defaults.MethodCase; - this.ParameterCase = this.ParameterCase ?? defaults.ParameterCase; - } - } -} diff --git a/Core/Configuration/ConfigurationMapping.cs b/Core/Configuration/ConfigurationMapping.cs deleted file mode 100644 index 0fc4eb2f..00000000 --- a/Core/Configuration/ConfigurationMapping.cs +++ /dev/null @@ -1,87 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; -using KY.Core.Dependency; -using KY.Generator.Configurations; -using KY.Generator.Transfer.Readers; -using KY.Generator.Transfer.Writers; - -namespace KY.Generator.Configuration -{ - public class ConfigurationMapping - { - private readonly IDependencyResolver resolver; - private readonly List mapping; - - public ConfigurationMapping(IDependencyResolver resolver) - { - this.resolver = resolver; - this.mapping = new List(); - } - - public void Map(string name, string action) - where TConfiguration : IConfiguration - { - name.AssertIsNotNull(nameof(name)); - if (this.mapping.Any(entry => entry.Action.Equals(action, StringComparison.InvariantCultureIgnoreCase) && entry.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase))) - { - throw new InvalidOperationException($"{name} is already mapped. Please use a prefix like my-{name}"); - } - if (this.mapping.Any(entry => entry.Action.Equals(action, StringComparison.InvariantCultureIgnoreCase) && entry.Configuration == typeof(TConfiguration))) - { - throw new InvalidOperationException($"{typeof(TConfiguration)} is already mapped. Please create a derived class"); - } - this.mapping.Add(new ConfigurationMappingEntry(action, name.ToLowerInvariant(), typeof(TConfiguration), typeof(TActor))); - } - - public ConfigurationMapping Map(string name) - where TConfiguration : IConfiguration - { - bool isReader = typeof(ITransferReader).IsAssignableFrom(typeof(TActor)); - bool isWriter = typeof(ITransferWriter).IsAssignableFrom(typeof(TActor)); - if (!isReader && !isWriter) - { - throw new InvalidOperationException($"{name} has to be at least a {nameof(ITransferReader)} or {nameof(ITransferWriter)}"); - } - if (isReader) - { - this.Map(name, "read"); - } - if (isWriter) - { - this.Map(name, "write"); - } - return this; - } - - public Type ResolveConfiguration(string name, string action) - { - action.AssertIsNotNull(nameof(action)); - name.AssertIsNotNull(nameof(name)); - ConfigurationMappingEntry entry = this.mapping.FirstOrDefault(e => e.Action.Equals(action, StringComparison.InvariantCultureIgnoreCase) - && e.Name.Equals(name, StringComparison.InvariantCultureIgnoreCase)); - if (entry == null) - { - throw new InvalidOperationException($"{action.FirstCharToUpper()} {name} not found. Please check if the module was loaded"); - } - return entry.Configuration; - } - - public object Resolve(IConfiguration configuration) - { - configuration.AssertIsNotNull(nameof(configuration)); - ConfigurationMappingEntry entry = this.mapping.FirstOrDefault(e => e.Configuration == configuration.GetType()); - if (entry == null) - { - throw new InvalidOperationException($"Actor for {configuration.GetType().Name} not found. Please check if the module was loaded"); - } - return this.resolver.Create(entry.Actor); - } - - public List GetActions() - { - return this.mapping.Select(x => x.Action).Unique().ToList(); - } - } -} \ No newline at end of file diff --git a/Core/Configuration/ConfigurationMappingEntry.cs b/Core/Configuration/ConfigurationMappingEntry.cs deleted file mode 100644 index da2934c6..00000000 --- a/Core/Configuration/ConfigurationMappingEntry.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System; - -namespace KY.Generator.Configuration -{ - public class ConfigurationMappingEntry - { - public string Action { get; } - public string Name { get; } - public Type Configuration { get; } - public Type Actor { get; } - - public ConfigurationMappingEntry(string action, string name, Type configuration, Type actor) - { - this.Action = action; - this.Name = name; - this.Configuration = configuration; - this.Actor = actor; - } - } -} \ No newline at end of file diff --git a/Core/Configurations/ConfigurationBase.cs b/Core/Configurations/ConfigurationBase.cs deleted file mode 100644 index 994211a1..00000000 --- a/Core/Configurations/ConfigurationBase.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System; -using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Languages; -using KY.Generator.Mappings; -using Newtonsoft.Json; - -namespace KY.Generator.Configurations -{ - public abstract class ConfigurationBase : IConfiguration - { - public virtual bool VerifySsl { get; set; } = true; - - [JsonIgnore] - public virtual ILanguage Language { get; set; } - - [JsonProperty("Language")] - internal virtual string LanguageKey { get; set; } - - public virtual bool AddHeader { get; set; } = true; - public virtual bool RequireLanguage => true; - - public List ClassMapping { get; } - public List FieldMapping { get; } - public List PropertyMapping { get; } - public ConfigurationFormatting Formatting { get; set; } - public bool BeforeBuild { get; set; } - public Guid? OutputId { get; set; } - - protected ConfigurationBase() - { - this.ClassMapping = new List(); - this.FieldMapping = new List(); - this.PropertyMapping = new List(); - this.Formatting = new ConfigurationFormatting(); - } - - public virtual void CopyBaseFrom(ConfigurationBase source) - { - this.VerifySsl = source.VerifySsl; - this.Language = source.Language; - this.AddHeader = source.AddHeader; - this.ClassMapping.AddRange(source.ClassMapping); - this.FieldMapping.AddRange(source.FieldMapping); - this.PropertyMapping.AddRange(source.PropertyMapping); - this.Formatting = source.Formatting; - } - } -} \ No newline at end of file diff --git a/Core/Configurations/IConfiguration.cs b/Core/Configurations/IConfiguration.cs deleted file mode 100644 index e6eda44a..00000000 --- a/Core/Configurations/IConfiguration.cs +++ /dev/null @@ -1,11 +0,0 @@ -using KY.Generator.Configuration; -using KY.Generator.Languages; - -namespace KY.Generator.Configurations -{ - public interface IConfiguration - { - ILanguage Language { get; } - ConfigurationFormatting Formatting { get; } - } -} \ No newline at end of file diff --git a/Core/Configurations/IFormattableConfiguration.cs b/Core/Configurations/IFormattableConfiguration.cs deleted file mode 100644 index f362ba86..00000000 --- a/Core/Configurations/IFormattableConfiguration.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator.Configurations -{ - public interface IFormattableConfiguration : IConfiguration - { - bool FormatNames { get; } - } -} \ No newline at end of file diff --git a/Core/Configurations/IModelConfiguration.cs b/Core/Configurations/IModelConfiguration.cs deleted file mode 100644 index bab2e275..00000000 --- a/Core/Configurations/IModelConfiguration.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator.Configurations -{ - public interface IModelConfiguration : IFormattableConfiguration - { - string Name { get; set; } - string Namespace { get; } - string RelativePath { get; } - bool AddHeader { get; } - bool SkipNamespace { get; } - List Usings { get; } - Guid? OutputId { get; } - } -} \ No newline at end of file diff --git a/Core/Configurations/ModelWriteConfiguration.cs b/Core/Configurations/ModelWriteConfiguration.cs deleted file mode 100644 index a7e08996..00000000 --- a/Core/Configurations/ModelWriteConfiguration.cs +++ /dev/null @@ -1,44 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Configurations -{ - public class ModelWriteConfiguration : ConfigurationBase, IModelConfiguration - { - public string Name { get; set; } - public string Namespace { get; set; } - public string RelativePath { get; set; } - public bool SkipNamespace { get; set; } - public List Usings { get; set; } - - public bool FieldsToProperties - { - get => this.Formatting.FieldsToProperties; - set => this.Formatting.FieldsToProperties = value; - } - - public bool PropertiesToFields - { - get => this.Formatting.PropertiesToFields; - set => this.Formatting.PropertiesToFields = value; - } - - public bool PreferInterfaces - { - get => this.Formatting.PreferInterfaces; - set => this.Formatting.PreferInterfaces = value; - } - - public bool WithOptionalProperties - { - get => this.Formatting.WithOptionalProperties; - set => this.Formatting.WithOptionalProperties = value; - } - - public bool FormatNames { get; set; } - - public ModelWriteConfiguration() - { - this.Usings = new List(); - } - } -} diff --git a/Core/Configurations/ReadConfigurationBase.cs b/Core/Configurations/ReadConfigurationBase.cs deleted file mode 100644 index ea41a74d..00000000 --- a/Core/Configurations/ReadConfigurationBase.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator.Configurations -{ - public abstract class ReadConfigurationBase : ConfigurationBase - { - public override bool RequireLanguage => false; - } -} \ No newline at end of file diff --git a/Core/CoreModule.cs b/Core/CoreModule.cs deleted file mode 100644 index c2f3608d..00000000 --- a/Core/CoreModule.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Runtime.CompilerServices; -using KY.Core.Dependency; -using KY.Core.Module; -using KY.Generator.Client; -using KY.Generator.Command; -using KY.Generator.Commands; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Transfer.Readers; -using KY.Generator.Transfer.Writers; - -[assembly: InternalsVisibleTo("KY.Generator.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Core.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Reflection.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Csharp.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Json.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.TypeScript.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.AspDotNet.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.OData.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Tsql.Tests")] -[assembly: InternalsVisibleTo("KY.Generator.Angular.Tests")] - -namespace KY.Generator -{ - internal class CoreModule : ModuleBase - { - public CoreModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - //this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - } - - public override void Initialize() - { - this.DependencyResolver.Get() - .Map("cookie") - .Map("generator") - .Map("model"); - } - } -} \ No newline at end of file diff --git a/Core/Extensions/StringExtensions.cs b/Core/Extensions/StringExtensions.cs deleted file mode 100644 index e69d1315..00000000 --- a/Core/Extensions/StringExtensions.cs +++ /dev/null @@ -1,99 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using System.Text.RegularExpressions; -using KY.Core; - -namespace KY.Generator.Extensions -{ - public static class StringExtensions - { - public static string ToPascalCase(this string value, string allowedCharacters = "") - { - return string.Join("", Split(value, allowedCharacters).Select(x => x.FirstCharToUpper())); - } - - public static string ToCamelCase(this string value, string allowedCharacters = "") - { - return string.Join("", Split(value, allowedCharacters).Select(x => x.FirstCharToUpper())).FirstCharToLower(); - } - - public static string ToKebabCase(this string value, string allowedCharacters = "") - { - return string.Join("-", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant())); - } - - public static string ToSnakeCase(this string value, string allowedCharacters = "") - { - return string.Join("_", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant())); - } - - public static string ToDarwinCase(this string value, string allowedCharacters = "") - { - return string.Join("_", Split(value, allowedCharacters).Select(x => x.ToLowerInvariant().FirstCharToUpper())); - } - - private static IEnumerable Split(string value, string allowedCharacters) - { - if (value.ToUpperInvariant() == value) - { - value = value.ToLowerInvariant(); - } - List matches = Regex.Matches(value, @"([a-z]+|[A-Z]+|[0-9]+|[^a-zA-Z0-9]+)").Cast().Select(x => x.Value) - .Where(x => Regex.IsMatch(x, $"^[a-zA-Z0-9{Regex.Escape(allowedCharacters ?? string.Empty)}]+$")) - .ToList(); - string transfer = string.Empty; - for (int index = 0; index < matches.Count; index++) - { - string match = transfer + matches[index]; - transfer = string.Empty; - bool allUpper = match.ToUpperInvariant() == match; - bool nextAllLower = matches.Count > index + 1 && matches[index + 1].ToLowerInvariant() == matches[index + 1]; - if (allUpper && nextAllLower) - { - if (match.Length == 1) - { - match = match + matches[index + 1]; - index++; - } - else - { - transfer = match.Substring(match.Length - 1, 1); - match = match.Substring(0, match.Length - 1); - } - } - yield return match; - } - } - - public static int IndexOf(this string value, Regex regex) - { - return regex.Match(value).Index; - } - - private static CaseType GetCaseType(char value) - { - string input = value.ToString(); - if (Regex.IsMatch(input, "[a-z]")) - { - return CaseType.Lower; - } - if (Regex.IsMatch(input, "[A-Z]")) - { - return CaseType.Upper; - } - if (Regex.IsMatch(input, "[0-9]")) - { - return CaseType.Number; - } - return CaseType.Special; - } - - private enum CaseType - { - Lower, - Upper, - Number, - Special - } - } -} diff --git a/Core/Extensions/SwitchableFrameworkExtension.cs b/Core/Extensions/SwitchableFrameworkExtension.cs deleted file mode 100644 index eb6a341d..00000000 --- a/Core/Extensions/SwitchableFrameworkExtension.cs +++ /dev/null @@ -1,14 +0,0 @@ -using System.Reflection; -using KY.Generator.Models; - -namespace KY.Generator.Extensions -{ - public static class SwitchableFrameworkExtension - { - public static string FrameworkName(this SwitchableFramework framework) - { - FieldInfo memberInfos = framework.GetType().GetField(framework.ToString()); - return memberInfos?.GetCustomAttribute()?.Name; - } - } -} \ No newline at end of file diff --git a/Core/Generator.cs b/Core/Generator.cs deleted file mode 100644 index f99efc96..00000000 --- a/Core/Generator.cs +++ /dev/null @@ -1,324 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using System.Reflection; -using System.Runtime.InteropServices; -using System.Runtime.Versioning; -using System.Text.RegularExpressions; -using KY.Core; -using KY.Core.DataAccess; -using KY.Core.Dependency; -using KY.Core.Extension; -using KY.Core.Module; -using KY.Generator.Command; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Extensions; -using KY.Generator.Languages; -using KY.Generator.Mappings; -using KY.Generator.Models; -using KY.Generator.Output; -using KY.Generator.Syntax; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Readers; -using KY.Generator.Transfer.Writers; - -namespace KY.Generator -{ - public class Generator : IGeneratorRunSyntax - { - private IOutput output; - private readonly DependencyResolver resolver; - private readonly List commands = new List(); - private readonly List transferObjects = new List(); - - public Generator() - { - Logger.CatchAll(); - Assembly callingAssembly = Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly(); - FrameworkName framework = callingAssembly.GetTargetFramework(); - Logger.Trace($"KY-Generator v{callingAssembly.GetName().Version} ({framework.Identifier.Replace("App", string.Empty)} {framework.Version.Major}.{framework.Version.Minor})"); - Logger.Trace("Current Directory: " + Environment.CurrentDirectory); - Logger.Trace("Log Directory: " + Logger.File.Path); - - NugetPackageDependencyLoader.Activate(); - NugetPackageDependencyLoader.ResolveDependencies(this.GetType().Assembly); - - this.output = new FileOutput(Environment.CurrentDirectory); - this.resolver = new DependencyResolver(); - this.resolver.Bind().ToSingleton(); - this.resolver.Bind().ToSelf(); - this.resolver.Bind().ToSingleton(); - this.resolver.Bind().ToSingleton(); - this.resolver.Bind().ToSelf(); - - ModuleFinder moduleFinder = this.resolver.Get(); - this.InitializeModules(moduleFinder.Modules); - } - - public static Generator Initialize() - { - return new Generator(); - } - - public Generator PreloadModules(string path, string moduleFileNameSearchPattern = default) - { - ModuleFinder moduleFinder = this.resolver.Get(); - List loadedModules = moduleFinder.LoadFrom(path, moduleFileNameSearchPattern); - this.InitializeModules(loadedModules); - return this; - } - - public Generator PreloadModule() where T : ModuleBase - { - return this; - } - - public Generator SetOutput(IOutput newOutput) - { - this.output = newOutput; - return this; - } - - public Generator SetOutput(string path) - { - return this.SetOutput(new FileOutput(path)); - } - - public Generator RegisterCommand() where T : IGeneratorCommand - { - this.resolver.Bind().To(); - return this; - } - - public Generator RegisterCommand(IGeneratorCommand generator) - { - this.resolver.Bind().To(generator); - return this; - } - - public Generator RegisterReader(string name) - where TConfiguration : ConfigurationBase - where TReader : ITransferReader - { - this.resolver.Get().Map(name); - return this; - } - - public Generator RegisterWriter(string name) - where TConfiguration : ConfigurationBase - where TWriter : ITransferWriter - { - this.resolver.Get().Map(name); - return this; - } - - public IGeneratorRunSyntax ParseAttributes(string assemblyName) - { - Logger.Trace($"Read attributes from assembly {assemblyName}"); - IGeneratorCommand command = this.resolver.Get().FindCommand("RunByAttributes"); - command.Parse( - new RawCommandParameter("assembly", assemblyName), - new RawCommandParameter("SkipAsyncCheck", bool.TrueString) - ); - command.TransferObjects = this.transferObjects; - this.commands.Add(command); - return this; - } - - public IGeneratorRunSyntax SetParameters(params string[] parameters) - { - if (parameters.Length == 0) - { - Logger.Error("No parameters found. Provide at least a command or a path to a configuration file. Generation aborted!"); - GeneratorErrors.CommandDocumentationHint(); - return this; - } - Logger.Trace("Parameters: " + string.Join(" ", parameters)); - - List rawCommands = RawCommandReader.Read(parameters); - this.commands.AddRange(this.resolver.Get().Convert(rawCommands, this.transferObjects)); - return this; - } - - public bool Run() - { - bool success = true; - try - { - List languages = this.resolver.Get>(); - GeneratorCommand.AddParser(value => languages.FirstOrDefault(x => x.Name.Equals(value, StringComparison.CurrentCultureIgnoreCase))); - CommandRunner runner = this.resolver.Get(); - List asyncCommands = new List(); - IGeneratorCommandResult switchContext = null; - bool switchAsync = false; - foreach (IGeneratorCommand command in this.commands) - { - IGeneratorCommandResult result = runner.Run(command, this.output); - success &= result.Success; - if (result.SwitchContext) - { - switchContext = switchContext ?? result; - asyncCommands.Add(command); - } - if (result.SwitchToAsync) - { - switchAsync = true; - asyncCommands.Add(command); - } - if (result.RerunOnAsync) - { - asyncCommands.Add(command); - } - } - if (switchAsync) - { - return this.SwitchToAsync(asyncCommands); - } - if (switchContext != null) - { - return this.SwitchContext(switchContext, asyncCommands); - } - if (success) - { - this.output.Execute(); - } - } - catch (Exception exception) - { - Logger.Error(exception); - success = false; - } - finally - { - Logger.Trace("==============================="); - } - if (!success && Logger.ErrorTargets.Contains(Logger.MsBuildOutput)) - { - Logger.Error($"See the full log in: {Logger.File.Path}"); - } - return success; - } - - private bool SwitchContext(IGeneratorCommandResult result, IEnumerable commandsToRun) - { - if (result.SwitchToArchitecture != null && !RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - // TODO: Check other possibilities to run x86 in not Windows environments - Logger.Error($"Can not start {result.SwitchToArchitecture} process. Your system does not support this process type."); - return false; - } - if (result.SwitchToArchitecture != null) - { - Logger.Trace($"Different assembly architecture found. Switching to {result.SwitchToArchitecture}..."); - } - if (result.SwitchToFramework != SwitchableFramework.None) - { - Logger.Trace($"Different assembly framework found. Switching to {result.SwitchToFramework}..."); - } - string location = Assembly.GetEntryAssembly()?.Location ?? throw new InvalidOperationException("No location found"); - Regex regex = new Regex(@"(?[\\/])(?net[^\\/]+)[\\/]"); - Match match = regex.Match(location); - if (!match.Success) - { - throw new InvalidOperationException($"Invalid location {location}. Location has to include the framework to switch the context"); - } - string framework = match.Groups["framework"].Value; - string separator = match.Groups["separator"].Value; - string switchedFramework = (result.SwitchToFramework.FrameworkName() ?? framework) - + (result.SwitchToArchitecture != null ? $"-{result.SwitchToArchitecture.ToString().ToLower()}" : ""); - location = location.Replace(separator + framework + separator, separator + switchedFramework + separator); - string locationExe = location.Replace(".dll", ".exe"); - if (FileSystem.FileExists(location) || FileSystem.FileExists(locationExe)) - { - ProcessStartInfo startInfo = new ProcessStartInfo(); - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && FileSystem.FileExists(locationExe)) - { - // Always use the .exe on Windows to fix the dotnet.exe x86 problem - startInfo.FileName = locationExe; - } - else - { - startInfo.FileName = "dotnet"; - startInfo.Arguments = location; - } - startInfo.Arguments += string.Join(" ", commandsToRun); - if (result.SwitchToArchitecture != null) - { - startInfo.Arguments += $" --switchedFromArchitecture=\"{result.SwitchToArchitecture}\""; - } - if (result.SwitchToFramework != SwitchableFramework.None) - { - startInfo.Arguments += $" --switchedFromFramework=\"{result.SwitchToFramework}\""; - } - //startInfo.UseShellExecute = false; - //startInfo.RedirectStandardOutput = true; - //startInfo.RedirectStandardError = true; - Logger.Trace("==============================="); - Process process = Process.Start(startInfo); - process.OutputDataReceived += (sender, args) => Logger.Trace(">> " + args.Data); - process.ErrorDataReceived += (sender, args) => Logger.Error(">> " + args.Data); - process.WaitForExit(); - Logger.Trace($"{result.SwitchToArchitecture?.ToString() ?? result.SwitchToFramework.ToString()} process exited with code {process.ExitCode}"); - return process.ExitCode == 0; - } - Logger.Error($"Can not start {result.SwitchToArchitecture} process. File \"{location}\" not found. Try to update to .net Core Framework 3.0 or later."); - return false; - } - - private bool SwitchToAsync(IEnumerable commandsToRun) - { - Logger.Trace($"The generation is continued in a separate asynchronous process. You can find the output log here: {Logger.File.Path}"); - string location = Assembly.GetEntryAssembly()?.Location ?? throw new InvalidOperationException("No location found"); - ProcessStartInfo startInfo = new ProcessStartInfo(); - startInfo.UseShellExecute = true; - startInfo.WindowStyle = ProcessWindowStyle.Hidden; - if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) && location.EndsWith(".exe")) - { - startInfo.FileName = location; - } - else - { - startInfo.FileName = "dotnet"; - startInfo.Arguments = location; - } - startInfo.Arguments += " " + string.Join(" ", commandsToRun); - startInfo.Arguments += " -*only-async"; - Process.Start(startInfo); - return true; - } - - public static void InitializeLogger(string[] parameters) - { - Logger.Console.ShortenEntries = false; - Logger.AllTargets.Add(Logger.VisualStudioOutput); - if (parameters.Any(parameter => parameter.ToLowerInvariant().Contains("forwardlogging"))) - { - ForwardConsoleTarget target = new ForwardConsoleTarget(); - Logger.AllTargets.Clear(); - Logger.AllTargets.Add(target); - Logger.TraceTargets.Clear(); - Logger.TraceTargets.Add(target); - Logger.ErrorTargets.Clear(); - Logger.ErrorTargets.Add(target); - } - if (parameters.Any(parameter => parameter?.EndsWith("msbuild", StringComparison.CurrentCultureIgnoreCase) ?? false)) - { - Logger.Trace("MsBuild trace mode activated"); - Logger.WarningTargets.Add(Logger.MsBuildOutput); - Logger.ErrorTargets.Add(Logger.MsBuildOutput); - Logger.WarningTargets.Remove(Logger.VisualStudioOutput); - Logger.ErrorTargets.Remove(Logger.VisualStudioOutput); - } - } - - private void InitializeModules(IEnumerable modules) - { - List list = modules.ToList(); - list.ForEach(module => this.resolver.Bind().To(module)); - list.ForEach(module => module.Initialize()); - list.ForEach(module => Logger.Trace($"{module.GetType().Name.Replace("Module", "")}-{module.GetType().Assembly.GetName().Version} module loaded")); - } - } -} diff --git a/Core/Helpers/Formatter.cs b/Core/Helpers/Formatter.cs deleted file mode 100644 index 75fc3aa9..00000000 --- a/Core/Helpers/Formatter.cs +++ /dev/null @@ -1,133 +0,0 @@ -using System; -using KY.Core; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Extensions; -using KY.Generator.Languages; - -namespace KY.Generator -{ - public static class Formatter - { - public static string FormatFile(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return configuration.Language is BaseLanguage baseLanguage ? baseLanguage.FormatFileName(name) : Format(name, formatting.FileCase, formatting.AllowedSpecialCharacters); - } - - public static string FormatClass(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return Format(name, formatting.ClassCase, formatting.AllowedSpecialCharacters); - } - - public static string FormatField(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return Format(name, formatting.FieldCase, formatting.AllowedSpecialCharacters); - } - - public static string FormatField(string name, ILanguage language, bool formatNames, string allowedCharacters = "") - { - return formatNames && language is IFormattableLanguage formattableLanguage ? Format(name, formattableLanguage.Formatting.FieldCase, allowedCharacters) : name; - } - - public static string FormatProperty(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return Format(name, formatting.PropertyCase, formatting.AllowedSpecialCharacters); - } - - public static string FormatMethod(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return Format(name, formatting.MethodCase, formatting.AllowedSpecialCharacters); - } - - public static string FormatMethod(string name, ILanguage language, bool formatNames, string allowedCharacters = "") - { - return formatNames && language is IFormattableLanguage formattableLanguage ? Format(name, formattableLanguage.Formatting.MethodCase, allowedCharacters) : name; - } - - public static string FormatParameter(string name, IConfiguration configuration, bool force = false) - { - if (configuration is IFormattableConfiguration formattableConfiguration && !formattableConfiguration.FormatNames && !force) - { - return name; - } - ConfigurationFormatting formatting = GetFormatting(configuration); - return Format(name, formatting.ParameterCase, formatting.AllowedSpecialCharacters); - } - - public static string Format(string name, string casing, string allowChars) - { - casing.AssertIsNotNullOrEmpty(nameof(casing)); - if (casing.Equals(Case.CamelCase, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.ToCamelCase(allowChars); - } - if (casing.Equals(Case.PascalCase, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.ToPascalCase(allowChars); - } - if (casing.Equals(Case.KebabCase, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.ToKebabCase(allowChars); - } - if (casing.Equals(Case.SnakeCase, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.ToSnakeCase(allowChars); - } - if (casing.Equals(Case.DarwinCase, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.ToDarwinCase(allowChars); - } - if (casing.Equals(Case.FirstCharToLower, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.FirstCharToLower(); - } - if (casing.Equals(Case.FirstCharToUpper, StringComparison.CurrentCultureIgnoreCase)) - { - return name?.FirstCharToUpper(); - } - throw new ArgumentOutOfRangeException(nameof(casing)); - } - - private static ConfigurationFormatting GetFormatting(IConfiguration configuration) - { - ConfigurationFormatting formatting = configuration.Formatting; - if (configuration.Language is IFormattableLanguage formattableLanguage) - { - if (formatting == null) - { - formatting = formattableLanguage.Formatting; - } - else - { - formatting.ApplyDefaults(formattableLanguage.Formatting); - } - } - return formatting; - } - } -} \ No newline at end of file diff --git a/Core/Helpers/GeneratorErrors.cs b/Core/Helpers/GeneratorErrors.cs deleted file mode 100644 index 346f79d8..00000000 --- a/Core/Helpers/GeneratorErrors.cs +++ /dev/null @@ -1,18 +0,0 @@ -using KY.Core; -using KY.Generator.Command; - -namespace KY.Generator -{ - public static class GeneratorErrors - { - public static void CommandDocumentationHint() - { - Logger.Error("See our Documentation: https://generator.ky-programming.de/"); - } - - public static void CommandNotFoundError(RawCommand command) - { - Logger.Error($"Command '{command.Name}' not found"); - } - } -} \ No newline at end of file diff --git a/Core/Helpers/GeneratorTypeLoader.cs b/Core/Helpers/GeneratorTypeLoader.cs deleted file mode 100644 index 5df5c0a8..00000000 --- a/Core/Helpers/GeneratorTypeLoader.cs +++ /dev/null @@ -1,22 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; -using KY.Core.Nuget; -using KY.Generator.Configurations; - -namespace KY.Generator -{ - public static class GeneratorTypeLoader - { - public static Type Get(string assemblyName, string nameSpace, string typeName, params SearchLocation[] locations) - { - List list = locations.ToList(); - // TODO: Check if alternative is required - //list.Add(new SearchLocation(configuration.Environment.ConfigurationFilePath)); - //list.Add(new SearchLocation(configuration.Environment.OutputPath)); - Version defaultVersion = typeof(CoreModule).Assembly.GetName().Version; - return NugetPackageTypeLoader.Get(assemblyName, nameSpace, typeName, defaultVersion, list.ToArray()); - } - } -} diff --git a/Core/Helpers/IgnoreTypeHelper.cs b/Core/Helpers/IgnoreTypeHelper.cs deleted file mode 100644 index f72df08e..00000000 --- a/Core/Helpers/IgnoreTypeHelper.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator -{ - [Obsolete] - public static class IgnoreTypeHelper - { - public static List IgnoredTypes { get; } = new(); - } -} diff --git a/Core/KY.Generator.Core.csproj b/Core/KY.Generator.Core.csproj deleted file mode 100644 index 4c5435b1..00000000 --- a/Core/KY.Generator.Core.csproj +++ /dev/null @@ -1,36 +0,0 @@ - - - - netstandard2.0 - KY-Programming - KY-Programming - KY.Generator - 7.6.0 - Core elements for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator KY.Generator - KY.Generator - true - latest - - - - ..\bin\Debug - - - - ..\bin\Release - - - - - - - - - diff --git a/Core/Languages/BaseLanguage.cs b/Core/Languages/BaseLanguage.cs deleted file mode 100644 index ad085bf1..00000000 --- a/Core/Languages/BaseLanguage.cs +++ /dev/null @@ -1,239 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using KY.Core; -using KY.Core.DataAccess; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Templates.Extensions; -using KY.Generator.Writers; - -namespace KY.Generator.Languages -{ - public abstract class BaseLanguage : Codeable, IFormattableLanguage, IMappableLanguage, ITemplateWriter - { - private readonly List progressedChainedCodeFragments; - private readonly List lastFragments; - - protected Dictionary TemplateWriters { get; } - - public LanguageFormatting Formatting { get; } - public abstract string Name { get; } - public abstract bool ImportFromSystem { get; } - public Dictionary ReservedKeywords { get; } = new(); - public virtual string NamespaceKeyword => "namespace"; - public virtual string ClassScope => "public"; - public virtual string PartialKeyword => "partial"; - public bool HasAbstractClasses { get; set; } = true; - public bool HasStaticClasses { get; set; } = true; - public IEnumerable LastFragments => this.lastFragments; - public object Key { get; protected set; } = new object(); - - protected BaseLanguage() - { - this.Formatting = new LanguageFormatting(); - this.Formatting.LineClosing = ";"; - this.Formatting.IndentChar = ' '; - this.Formatting.IdentCount = 4; - this.Formatting.StartBlock = "{"; - this.Formatting.EndBlock = "}"; - this.Formatting.StartBlockInNewLine = true; - - this.ReservedKeywords.Add("new", "newValue"); - - this.progressedChainedCodeFragments = new List(); - this.lastFragments = new List(); - - this.TemplateWriters = new Dictionary(); - this.TemplateWriters.Add(typeof(AccessIndexTemplate), new AccessIndexWriter()); - this.TemplateWriters.Add(typeof(AsTemplate), new AsWriter()); - this.TemplateWriters.Add(typeof(AssignTemplate), new AssignWriter()); - this.TemplateWriters.Add(typeof(BlankLineTemplate), new BlankLineWriter()); - this.TemplateWriters.Add(typeof(CaseTemplate), new CaseWriter()); - this.TemplateWriters.Add(typeof(ChainedCodeFragment), this); - this.TemplateWriters.Add(typeof(ClassGenericTemplate), new ClassGenericWriter()); - this.TemplateWriters.Add(typeof(ClassTemplate), new ClassWriter()); - this.TemplateWriters.Add(typeof(CommentTemplate), new CommentWriter()); - this.TemplateWriters.Add(typeof(ElseTemplate), new ElseWriter()); - this.TemplateWriters.Add(typeof(ElseIfTemplate), new ElseIfWriter()); - this.TemplateWriters.Add(typeof(EnumTemplate), new EnumWriter()); - this.TemplateWriters.Add(typeof(ExecuteFieldTemplate), new ExecuteFieldWriter()); - this.TemplateWriters.Add(typeof(ExecuteGenericMethodTemplate), new ExecuteGenericMethodWriter()); - this.TemplateWriters.Add(typeof(ExecuteMethodTemplate), new ExecuteMethodWriter()); - this.TemplateWriters.Add(typeof(ExecutePropertyTemplate), new ExecutePropertyWriter()); - this.TemplateWriters.Add(typeof(FieldTemplate), new FieldWriter(this)); - this.TemplateWriters.Add(typeof(GenericTypeTemplate), new GenericTypeWriter()); - this.TemplateWriters.Add(typeof(IfTemplate), new IfWriter()); - this.TemplateWriters.Add(typeof(InlineIfTemplate), new InlineIfWriter()); - this.TemplateWriters.Add(typeof(LambdaTemplate), new LambdaWriter()); - this.TemplateWriters.Add(typeof(LocalVariableTemplate), new LocalVariableWriter()); - this.TemplateWriters.Add(typeof(MethodTemplate), new MethodWriter()); - this.TemplateWriters.Add(typeof(ExtensionMethodTemplate), new MethodWriter()); - this.TemplateWriters.Add(typeof(MethodGenericTemplate), new MethodGenericWriter()); - this.TemplateWriters.Add(typeof(MultilineCodeFragment), new MultilineCodeFragmentWriter(this)); - this.TemplateWriters.Add(typeof(NamespaceTemplate), new NamespaceWriter(this)); - this.TemplateWriters.Add(typeof(NewTemplate), new NewWriter()); - this.TemplateWriters.Add(typeof(NotTemplate), new NotWriter()); - this.TemplateWriters.Add(typeof(NullValueTemplate), new NullValueWriter()); - this.TemplateWriters.Add(typeof(NullTemplate), new NullWriter()); - this.TemplateWriters.Add(typeof(NullConditionalTemplate), new NullConditionalWriter()); - this.TemplateWriters.Add(typeof(NumberTemplate), new NumberWriter()); - this.TemplateWriters.Add(typeof(DateTimeTemplate), new DateTimeWriter()); - this.TemplateWriters.Add(typeof(BooleanTemplate), new BooleanWriter()); - this.TemplateWriters.Add(typeof(OperatorTemplate), new OperatorWriter()); - this.TemplateWriters.Add(typeof(PropertyTemplate), new PropertyWriter()); - this.TemplateWriters.Add(typeof(ReturnTemplate), new ReturnWriter()); - this.TemplateWriters.Add(typeof(StringTemplate), new StringWriter()); - this.TemplateWriters.Add(typeof(SwitchTemplate), new SwitchWriter()); - this.TemplateWriters.Add(typeof(ThisTemplate), new ThisWriter()); - this.TemplateWriters.Add(typeof(TypeOfTemplate), new TypeOfWriter()); - this.TemplateWriters.Add(typeof(TypeTemplate), new TypeWriter()); - this.TemplateWriters.Add(typeof(VoidTemplate), new VoidWriter()); - this.TemplateWriters.Add(typeof(AppendStringTemplate), new AppendStringWriter()); - this.TemplateWriters.Add(typeof(AppendAssignStringTemplate), new AppendAssignStringWriter()); - this.TemplateWriters.Add(typeof(MathematicalOperatorTemplate), new MathWriter()); - this.TemplateWriters.Add(typeof(WhileTemplate), new WhileWriter()); - this.TemplateWriters.Add(typeof(NullCoalescingTemplate), new NullCoalescingWriter()); - } - - public void Write(IEnumerable fragments, IOutputCache output) - where T : ICodeFragment - { - fragments.ForEach(fragment => this.Write(fragment, output)); - } - - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - if (fragment == null) - { - return; - } - this.lastFragments.Insert(0, fragment); - while (this.lastFragments.Count > 10) - { - this.lastFragments.RemoveAt(this.lastFragments.Count - 1); - } - if (fragment is ChainedCodeFragment chainedCodeFragment && !this.IsProcessed(chainedCodeFragment)) - { - this.WriteChained(chainedCodeFragment, output); - return; - } - Type key = fragment.GetType(); - if (this.TemplateWriters.ContainsKey(key)) - { - this.TemplateWriters[key].Write(fragment, output); - } - else - { - throw new NotImplementedException($"The method {nameof(Write)} for type {key.Name} is not implemented in {this.Name}."); - } - } - - private bool IsProcessed(ChainedCodeFragment fragment) - { - return this.progressedChainedCodeFragments.Contains(fragment.First()); - } - - private void WriteChained(ChainedCodeFragment fragment, IOutputCache output) - { - this.progressedChainedCodeFragments.Add(fragment.First()); - bool isFirst = true; - foreach (ChainedCodeFragment codeFragment in fragment.First().Yield().Cast()) - { - if (!isFirst) - { - output.Add(codeFragment.Separator); - } - isFirst = false; - this.Write(codeFragment, output); - //output.Add(codeFragment, this); - if (codeFragment.NewLineAfter) - { - output.BreakLine(); - } - if (codeFragment.CloseAfter) - { - output.CloseLine(); - } - if (codeFragment.BreakAfter) - { - output.BreakLine().ExtraIndent(); - } - } - } - - public virtual void Write(FileTemplate fileTemplate, IOutput output) - { - if (string.IsNullOrEmpty(fileTemplate.Name)) - { - Logger.Trace("Empty file skipped"); - return; - } - if (fileTemplate.Header.Description != null) - { - AssemblyName assemblyName = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName(); - fileTemplate.Header.Description = string.Format(fileTemplate.Header.Description, $"{assemblyName.Name} {assemblyName.Version}"); - } - FileWriter writer = new FileWriter(this); - this.WriteHeader(fileTemplate, writer); - StaticFileTemplate staticFile = fileTemplate as StaticFileTemplate; - if (staticFile == null) - { - this.WriteUsings(fileTemplate, writer); - this.Write(fileTemplate.Namespaces, writer); - } - else - { - writer.Add(staticFile.Content, true); - } - string fileName = FileSystem.Combine(fileTemplate.RelativePath, this.FormatFileName(fileTemplate.Name, fileTemplate.Type)); - output.Write(fileName, writer.ToString(), fileTemplate.OutputId); - } - - protected virtual void WriteHeader(FileTemplate fileTemplate, IOutputCache output) - { - if (fileTemplate.Header?.Description != null) - { - this.Write(fileTemplate.Header, output); - output.BreakLine(); - } - } - - protected virtual void WriteUsings(FileTemplate fileTemplate, IOutputCache output) - { - List usings = this.GetUsings(fileTemplate).ToList(); - if (usings.Count <= 0) - { - return; - } - this.Write(usings, output); - output.BreakLine(); - } - - public virtual string FormatFileName(string fileName, string fileType = null) - { - return fileName; - } - - protected abstract IEnumerable GetUsings(FileTemplate fileTemplate); - - public virtual string ConvertValue(object value) - { - if (value == null) - { - return "null"; - } - if (value is string) - { - return $"\"{value}\""; - } - return value.ToString(); - } - - public override string ToString() - { - return this.Name; - } - } -} diff --git a/Core/Languages/EmptyFormattableLanguage.cs b/Core/Languages/EmptyFormattableLanguage.cs deleted file mode 100644 index 629596c3..00000000 --- a/Core/Languages/EmptyFormattableLanguage.cs +++ /dev/null @@ -1,8 +0,0 @@ -namespace KY.Generator.Languages -{ - public class EmptyFormattableLanguage : EmptyLanguage, IFormattableLanguage - { - public override string Name => "EmptyFormattable"; - public LanguageFormatting Formatting { get; } = new LanguageFormatting(); - } -} diff --git a/Core/Languages/EmptyLanguage.cs b/Core/Languages/EmptyLanguage.cs deleted file mode 100644 index 2128e962..00000000 --- a/Core/Languages/EmptyLanguage.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Collections.Generic; -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Languages -{ - public class EmptyLanguage : IMappableLanguage - { - public virtual string Name => "Empty"; - public bool ImportFromSystem => true; - public Dictionary ReservedKeywords { get; } = new(); - public object Key { get; } = new object(); - - public virtual void Write(FileTemplate file, IOutput output) - { - throw new NotImplementedException($"The method {nameof(Write)} for type {file.GetType().Name} is not implemented in {this.Name}."); - } - - public virtual void Write(ICodeFragment code, IOutputCache output) - { - throw new NotImplementedException($"The method {nameof(Write)} for type {code.GetType().Name} is not implemented in {this.Name}."); - } - - public virtual void Write(IEnumerable code, IOutputCache output) where T : ICodeFragment - { - throw new NotImplementedException($"The method {nameof(Write)} for type {code.GetType().Name} is not implemented in {this.Name}."); - } - } -} diff --git a/Core/Languages/ForwardFileLanguage.cs b/Core/Languages/ForwardFileLanguage.cs deleted file mode 100644 index aedbe0b8..00000000 --- a/Core/Languages/ForwardFileLanguage.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Languages -{ - internal class ForwardFileLanguage : EmptyLanguage - { - public override string Name => nameof(ForwardFileLanguage); - - public override void Write(FileTemplate file, IOutput output) - { - if (file is ForwardFileTemplate forwardFile) - { - forwardFile.Language.Write(forwardFile.File, output); - } - else - { - throw new NotImplementedException($"The method {nameof(Write)} for type {file.GetType().Name} is not implemented in {this.Name}."); - } - } - } -} \ No newline at end of file diff --git a/Core/Languages/IFormattableLanguage.cs b/Core/Languages/IFormattableLanguage.cs deleted file mode 100644 index a88bade6..00000000 --- a/Core/Languages/IFormattableLanguage.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator.Languages -{ - public interface IFormattableLanguage : ILanguage - { - LanguageFormatting Formatting { get; } - } -} \ No newline at end of file diff --git a/Core/Languages/ILanguage.cs b/Core/Languages/ILanguage.cs deleted file mode 100644 index 76b93460..00000000 --- a/Core/Languages/ILanguage.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Languages -{ - public interface ILanguage - { - string Name { get; } - bool ImportFromSystem { get; } - Dictionary ReservedKeywords { get; } - - void Write(FileTemplate file, IOutput output); - void Write(ICodeFragment code, IOutputCache output); - void Write(IEnumerable code, IOutputCache output) where T : ICodeFragment; - } -} diff --git a/Core/Languages/IMappableLanguage.cs b/Core/Languages/IMappableLanguage.cs deleted file mode 100644 index 3761d855..00000000 --- a/Core/Languages/IMappableLanguage.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator.Languages -{ - public interface IMappableLanguage : ILanguage - { - object Key { get; } - } -} \ No newline at end of file diff --git a/Core/Languages/LanguageFormatting.cs b/Core/Languages/LanguageFormatting.cs deleted file mode 100644 index 330235a8..00000000 --- a/Core/Languages/LanguageFormatting.cs +++ /dev/null @@ -1,20 +0,0 @@ -using KY.Generator.Configuration; - -namespace KY.Generator.Languages -{ - public class LanguageFormatting : ConfigurationFormatting - { - public string LineClosing { get; set; } - public char IndentChar { get; set; } - public int IdentCount { get; set; } - public string StartBlock { get; set; } - public string EndBlock { get; set; } - public bool StartBlockInNewLine { get; set; } - public bool EndFileWithNewLine { get; set; } - - public string Indent(int level) - { - return string.Empty.PadLeft(level * this.IdentCount, this.IndentChar); - } - } -} \ No newline at end of file diff --git a/Core/Languages/StaticFileLanguage.cs b/Core/Languages/StaticFileLanguage.cs deleted file mode 100644 index 9f6e34be..00000000 --- a/Core/Languages/StaticFileLanguage.cs +++ /dev/null @@ -1,66 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Reflection; -using KY.Core; -using KY.Core.DataAccess; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Writers; - -namespace KY.Generator.Languages -{ - internal class StaticFileLanguage : EmptyFormattableLanguage, ITemplateWriter - { - public static StaticFileLanguage Instance { get; } = new StaticFileLanguage(); - - public override string Name => nameof(StaticFileLanguage); - - private StaticFileLanguage() - { - } - - public override void Write(FileTemplate fileTemplate, IOutput output) - { - if (string.IsNullOrEmpty(fileTemplate.Name)) - { - Logger.Trace("Empty file skipped"); - return; - } - if (fileTemplate.Header.Description != null) - { - AssemblyName assemblyName = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName(); - fileTemplate.Header.Description = string.Format(fileTemplate.Header.Description, $"{assemblyName.Name} {assemblyName.Version}"); - } - StaticFileTemplate staticFile = fileTemplate as StaticFileTemplate; - if (staticFile == null) - { - throw new NotImplementedException($"The method {nameof(Write)} for type {fileTemplate.GetType().Name} is not implemented in {this.Name}."); - } - - FileWriter fileWriter = new FileWriter(this); - fileWriter.Add(fileTemplate.Header) - .BreakLine() - .Add(staticFile.Content, true); - - string fileName = FileSystem.Combine(fileTemplate.RelativePath, fileTemplate.Name); - output.Write(fileName, fileWriter.ToString(), fileTemplate.OutputId); - } - - public override void Write(ICodeFragment fragment, IOutputCache output) - { - if (fragment is CommentTemplate) - { - new CommentWriter().Write(fragment, output); - } - else - { - throw new NotImplementedException($"The method {nameof(Write)} for type {fragment.GetType().Name} is not implemented in {this.Name}."); - } - } - - public override void Write(IEnumerable code, IOutputCache output) - { - code.ForEach(fragment => this.Write(fragment, output)); - } - } -} \ No newline at end of file diff --git a/Core/Main.cs b/Core/Main.cs deleted file mode 100644 index 44efd175..00000000 --- a/Core/Main.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Reflection; -using KY.Core; -using KY.Core.DataAccess; -using KY.Core.Nuget; - -namespace KY.Generator -{ - public static class Main - { - private static string SharedPath { get; } = FileSystem.Combine(Assembly.GetEntryAssembly().Location, "..\\..\\netstandard2.0"); - - public static bool Run(string[] args) - { -#if DEBUG - System.Diagnostics.Debugger.Launch(); -#endif - Generator.InitializeLogger(args); - NugetPackageDependencyLoader.Activate(); - NugetPackageDependencyLoader.Locations.Insert(0, new SearchLocation(SharedPath)); - return Generator.Initialize() - .PreloadModules(SharedPath, "KY.Generator.*.dll") - .SetParameters(args) - .Run(); - } - } -} \ No newline at end of file diff --git a/Core/Mappings/ITypeMapping.cs b/Core/Mappings/ITypeMapping.cs deleted file mode 100644 index afbd74df..00000000 --- a/Core/Mappings/ITypeMapping.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using KY.Generator.Languages; -using KY.Generator.Transfer; - -namespace KY.Generator.Mappings -{ - public interface ITypeMapping - { - ITypeMappingMapSyntax Map(IMappableLanguage language); - TypeMappingEntry Add(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage, string toType, bool nullable = false, string nameSpace = null, bool fromSystem = false, string constructor = null); - TypeMappingEntry Get(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage); - TypeMappingEntry TryGet(IMappableLanguage fromLanguage, string fromType, IMappableLanguage toLanguage); - TypeMappingEntry TryGet(IMappableLanguage fromLanguage, Type fromType, IMappableLanguage toLanguage); - void Get(IMappableLanguage fromLanguage, IMappableLanguage toLanguage, TypeTransferObject type); - } -} diff --git a/Core/Output/FileOutput.cs b/Core/Output/FileOutput.cs deleted file mode 100644 index f62b848c..00000000 --- a/Core/Output/FileOutput.cs +++ /dev/null @@ -1,105 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using KY.Core; -using KY.Core.DataAccess; - -namespace KY.Generator.Output -{ - public class FileOutput : IOutput - { - private readonly List actions; - public string BasePath { get; private set; } - - public FileOutput(string basePath) - { - this.actions = new List(); - this.BasePath = basePath; - } - - public void Write(string fileName, string content, Guid? outputId) - { - string filePath = this.ToFilePath(fileName); - this.RemovePreviousActions(filePath); - this.actions.Add(new OutputWriteAction(filePath, content, outputId)); - } - - public void Delete(string fileName) - { - string filePath = this.ToFilePath(fileName); - this.RemovePreviousActions(filePath); - this.actions.Add(new OutputDeleteAction(filePath)); - } - - public void RemoveOutputId(string filePath, Guid outputId, string fileContent = null) - { - this.RemovePreviousActions(filePath); - this.actions.Add(new OutputRemoveIdAction(filePath, outputId, fileContent)); - } - - public void Execute() - { - this.actions.ForEach(action => action.Execute()); - } - - public void DeleteAllRelatedFiles(Guid? outputId, string relativePath = null) - { - if (outputId == null) - { - return; - } - try - { - string path = this.ToFilePath(relativePath); - if (!FileSystem.DirectoryExists(path)) - { - return; - } - IEnumerable filesToCheck = FileSystem.GetFiles(path, null, SearchOption.AllDirectories) - .Where(file => this.actions.All(action => !action.FilePath.Equals(file, StringComparison.CurrentCultureIgnoreCase))); - foreach (string file in filesToCheck) - { - string content = FileSystem.ReadAllText(file); - List outputIds = OutputFileHelper.GetOutputIds(content).ToList(); - if (!outputIds.Contains(outputId.Value)) - { - continue; - } - if (outputIds.Count == 1) - { - this.Delete(file); - } - else - { - this.RemoveOutputId(file, outputId.Value, content); - } - } - } - catch (Exception exception) - { - Logger.Warning($"Obsolete generated file check gots an {exception.GetType().Name}. {exception.Message}{Environment.NewLine}{exception.StackTrace}"); - } - } - - public void Move(string path) - { - this.BasePath = FileSystem.IsAbsolute(path) ? path : FileSystem.Combine(this.BasePath, path); - } - - private void RemovePreviousActions(string fileName) - { - this.actions.RemoveAll(action => action.FilePath.Equals(fileName, StringComparison.InvariantCultureIgnoreCase)); - } - - private string ToFilePath(string fileName) - { - return fileName == null ? this.BasePath : FileSystem.IsAbsolute(fileName) ? fileName : FileSystem.Combine(this.BasePath, fileName); - } - - public override string ToString() - { - return this.BasePath; - } - } -} \ No newline at end of file diff --git a/Core/Output/FileWriter.cs b/Core/Output/FileWriter.cs deleted file mode 100644 index 2cc98876..00000000 --- a/Core/Output/FileWriter.cs +++ /dev/null @@ -1,188 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using KY.Core; -using KY.Generator.Languages; -using KY.Generator.Templates; - -namespace KY.Generator.Output -{ - internal class FileWriter : IOutputCache - { - private int indent; - private readonly StringBuilder cache; - private bool isLineClosed; - - public IFormattableLanguage Language { get; } - - public IEnumerable LastFragments => this.Language.CastSafeTo()?.LastFragments; - - private FileWriter() - { - this.cache = new StringBuilder(); - this.indent = 0; - this.isLineClosed = true; - } - - public FileWriter(IFormattableLanguage language) - : this() - { - this.Language = language; - } - - public IOutputCache Add(string code, bool keepIndent = false) - { - if (keepIndent) - { - this.cache.Append(code); - } - else if (code.Contains(Environment.NewLine)) - { - if (this.isLineClosed) - { - this.WriteIndent(); - } - string[] lines = code.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries); - foreach (string line in lines) - { - this.cache.AppendLine(line.Trim()); - this.WriteIndent(); - } - } - else - { - if (this.isLineClosed) - { - this.WriteIndent(); - } - this.cache.Append(code); - } - return this; - } - - private void WriteIndent() - { - this.isLineClosed = false; - this.cache.Append("".PadLeft(this.indent * this.Language.Formatting.IdentCount, this.Language.Formatting.IndentChar)); - } - - public IOutputCache ExtraIndent(int indents = 1) - { - if (this.isLineClosed) - { - this.WriteIndent(); - } - this.cache.Append("".PadLeft(indents * this.Language.Formatting.IdentCount, this.Language.Formatting.IndentChar)); - return this; - } - - public IOutputCache Add(params ICodeFragment[] fragments) - { - return this.Add(fragments.ToList()); - } - - public IOutputCache Add(IEnumerable fragments) - { - foreach (ICodeFragment fragment in fragments.Where(x => x != null)) - { - this.Language.Write(fragment, this); - } - return this; - } - - public IOutputCache Add(IEnumerable fragments, string separator) - { - bool first = true; - foreach (ICodeFragment fragment in fragments.Where(x => x != null)) - { - if (!first) - { - this.Add(separator); - } - this.Language.Write(fragment, this); - first = false; - } - return this; - } - - public IOutputCache CloseLine() - { - this.cache.AppendLine(this.Language.Formatting.LineClosing); - this.isLineClosed = true; - return this; - } - - public IOutputCache BreakLine() - { - this.cache.AppendLine(); - this.isLineClosed = true; - return this; - } - - public IOutputCache BreakLineIfNotEmpty() - { - if (!this.isLineClosed) - { - this.cache.AppendLine(); - this.isLineClosed = true; - } - return this; - } - - public IOutputCache Indent() - { - this.indent++; - this.BreakLineIfNotEmpty(); - return this; - } - - public IOutputCache UnIndent() - { - this.indent--; - this.BreakLineIfNotEmpty(); - return this; - } - - public IOutputCache StartBlock() - { - if (this.cache.Length > 0 && !this.isLineClosed) - { - if (this.Language.Formatting.StartBlockInNewLine) - { - this.BreakLine(); - } - else - { - this.Add(" "); - } - } - return this.Add(this.Language.Formatting.StartBlock).Indent(); - } - - public IOutputCache EndBlock(bool breakLine = true) - { - return this.UnIndent().Add(this.Language.Formatting.EndBlock) - .If(breakLine).BreakLine().EndIf(); - } - - public IOutputCache If(bool condition) - { - return new FileWriterCondition(this, condition); - } - - public IOutputCache EndIf() - { - return this; - } - - public override string ToString() - { - if (this.Language.Formatting.EndFileWithNewLine) - { - this.BreakLine(); - } - return this.cache.ToString().TrimEnd(' ', '\r', '\n'); - } - } -} diff --git a/Core/Output/IOutput.cs b/Core/Output/IOutput.cs deleted file mode 100644 index 6946073c..00000000 --- a/Core/Output/IOutput.cs +++ /dev/null @@ -1,13 +0,0 @@ -using System; - -namespace KY.Generator.Output -{ - public interface IOutput - { - void Write(string fileName, string content, Guid? outputId); - void Delete(string fileName); - void DeleteAllRelatedFiles(Guid? outputId, string relativePath = null); - void Execute(); - void Move(string relativePath); - } -} \ No newline at end of file diff --git a/Core/Output/MemoryOutput.cs b/Core/Output/MemoryOutput.cs deleted file mode 100644 index 70b8d3a2..00000000 --- a/Core/Output/MemoryOutput.cs +++ /dev/null @@ -1,39 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator.Output -{ - public class MemoryOutput : IOutput - { - public Dictionary Files { get; } - - public MemoryOutput() - { - this.Files = new Dictionary(); - } - - public void Write(string fileName, string content, Guid? outputId) - { - this.Files.Add(fileName, content); - } - - public void Delete(string fileName) - { - this.Files.Remove(fileName); - } - - public void DeleteAllRelatedFiles(Guid? outputId, string relativePath = null) - { } - - public void Execute() - { } - - public void Move(string relativePath) - { } - - public override string ToString() - { - return "Memory"; - } - } -} \ No newline at end of file diff --git a/Core/Output/NoOperationFileWriter.cs b/Core/Output/NoOperationFileWriter.cs deleted file mode 100644 index 8c6199b5..00000000 --- a/Core/Output/NoOperationFileWriter.cs +++ /dev/null @@ -1,90 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Languages; -using KY.Generator.Templates; - -namespace KY.Generator.Output -{ - class NoOperationFileWriter : IOutputCache - { - private readonly IOutputCache output; - - public NoOperationFileWriter(IOutputCache output) - { - this.output = output; - } - - public IFormattableLanguage Language => this.output.Language; - - public IEnumerable LastFragments => this.output.LastFragments; - - public IOutputCache Add(string code, bool keepIndent = false) - { - return this.output.Add(code, keepIndent); - } - - public IOutputCache Add(params ICodeFragment[] fragments) - { - return this.output.Add(fragments); - } - - public IOutputCache Add(IEnumerable fragments) - { - return this.output.Add(fragments); - } - - public IOutputCache Add(IEnumerable fragments, string separator) - { - return this.output.Add(fragments, separator); - } - - public IOutputCache CloseLine() - { - return this.output.CloseLine(); - } - - public IOutputCache BreakLine() - { - return this.output.BreakLine(); - } - - public IOutputCache BreakLineIfNotEmpty() - { - return this.output.BreakLineIfNotEmpty(); - } - - public IOutputCache Indent() - { - return this.output.Indent(); - } - - public IOutputCache UnIndent() - { - return this.output.UnIndent(); - } - - public IOutputCache StartBlock() - { - return this.output.StartBlock(); - } - - public IOutputCache EndBlock(bool breakLine = true) - { - return this.output.EndBlock(breakLine); - } - - public IOutputCache If(bool condition) - { - return this.output.If(condition); - } - - public IOutputCache EndIf() - { - return this.output; - } - - public IOutputCache ExtraIndent(int indents = 1) - { - return this.output.ExtraIndent(indents); - } - } -} \ No newline at end of file diff --git a/Core/Output/OutputFileHelper.cs b/Core/Output/OutputFileHelper.cs deleted file mode 100644 index 7c1f1914..00000000 --- a/Core/Output/OutputFileHelper.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; -using System.Text.RegularExpressions; -using KY.Core; -using KY.Core.Crypt; - -namespace KY.Generator.Output -{ - public static class OutputFileHelper - { - private static readonly Regex outputIdRegex = new Regex("outputid:(?[a-zA-Z0-9-]+)", RegexOptions.Compiled); - - public static List GetOutputIds(string content) - { - return content.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries) - .Select(line => outputIdRegex.Match(line)) - .Where(result => result.Success) - .Select(result => new Guid(result.Groups["id"].Value)) - .ToList(); - } - - public static bool IsGeneratedFile(string content) - { - return content.Contains(""); - } - - - public static string GetHash(string content) - { - List filteredContent = string.IsNullOrEmpty(content) - ? new List() - : content.Split(new[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries).Where(line => !line.Contains("// outputid:")).ToList(); - // Strip header - while ((filteredContent.FirstOrDefault()?.StartsWith("//") ?? false) || (filteredContent.FirstOrDefault()?.StartsWith("/*") ?? false)) - { - filteredContent.RemoveAt(0); - } - - return Sha512.Create(string.Join(Environment.NewLine,filteredContent)).ToString(); - } - - public static string AppendOutputIds(string content, IEnumerable ids, Guid? additionalId = null) - { - if (additionalId != null) - { - ids = ids.Concat(additionalId.Value.Yield()); - } - StringBuilder builder = new StringBuilder(content); - builder.AppendLine().AppendLine(); - ids.Unique().OrderBy(x => x).ForEach(id => builder.AppendLine($"// outputid:{id}")); - return builder.ToString(); - } - - public static string RemoveOutputId(string content, Guid id) - { - return content.Replace($"// outputid:{id}", string.Empty); - } - } -} \ No newline at end of file diff --git a/Core/Output/OutputWriteAction.cs b/Core/Output/OutputWriteAction.cs deleted file mode 100644 index bb4ab16e..00000000 --- a/Core/Output/OutputWriteAction.cs +++ /dev/null @@ -1,83 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Text; -using KY.Core; -using KY.Core.DataAccess; - -namespace KY.Generator.Output -{ - public class OutputWriteAction : IOutputAction - { - private bool executed; - public string FilePath { get; } - public string Content { get; } - public Guid? OutputId { get; } - - public OutputWriteAction(string filePath, string content, Guid? outputId) - { - this.FilePath = filePath; - this.Content = content; - this.OutputId = outputId; - } - - public void Execute() - { - if (this.executed) - { - return; - } - this.executed = true; - FileSystem.CreateDirectory(FileSystem.Parent(this.FilePath)); - if (!FileSystem.FileExists(this.FilePath)) - { - Logger.Trace($"Write file {this.FilePath}"); - this.Write(this.Content, new List()); - return; - } - string contentToWriteHash = OutputFileHelper.GetHash(this.Content); - string contentRead = FileSystem.ReadAllText(this.FilePath); - List readOutputIds = OutputFileHelper.GetOutputIds(contentRead); - string contentReadHash = OutputFileHelper.GetHash(contentRead); - bool contentReadIsGenerated = OutputFileHelper.IsGeneratedFile(contentRead); - if (contentToWriteHash == contentReadHash) - { - if (this.OutputId != null && !readOutputIds.Contains(this.OutputId.Value)) - { - Logger.Trace($"File has no changes {this.FilePath}. Output id appended."); - this.Write(this.Content, readOutputIds); - } - else if (!contentRead.Contains(this.GetType().Assembly.GetName().Version.ToString())) - { - Logger.Trace($"File has no changes {this.FilePath}. Version updated."); - this.Write(this.Content, readOutputIds); - } - else - { - Logger.Trace($"File has no changes {this.FilePath}"); - } - } - else if (contentRead.Length == 0 - || contentReadIsGenerated && (this.OutputId == null || readOutputIds.Count == 0 || readOutputIds.Contains(this.OutputId.Value)) - || !contentReadIsGenerated && this.OutputId != null && readOutputIds.Contains(this.OutputId.Value) - ) - { - Logger.Trace($"Overwrite file {this.FilePath}"); - this.Write(this.Content, readOutputIds); - } - else if (!contentReadIsGenerated) - { - Logger.Error($"Can not overwrite file {this.FilePath}. File to overwrite is not a generated. Please delete file manually!"); - } - else - { - Logger.Error($"Can not overwrite file {this.FilePath}. File to overwrite was generated by a different project. Please delete file manually!"); - } - } - - private void Write(string content, IEnumerable readOutputIds) - { - content = OutputFileHelper.AppendOutputIds(content, readOutputIds, this.OutputId); - FileSystem.WriteAllText(this.FilePath, content, Encoding.UTF8); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/ClassTemplateExtension.cs b/Core/Templates/Extensions/ClassTemplateExtension.cs deleted file mode 100644 index 612d3baf..00000000 --- a/Core/Templates/Extensions/ClassTemplateExtension.cs +++ /dev/null @@ -1,122 +0,0 @@ -using System.Collections.Generic; -using System.Linq; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Languages; - -namespace KY.Generator.Templates.Extensions -{ - public static class ClassTemplateExtension - { - public static UsingTemplate AddUsing(this ClassTemplate classTemplate, string nameSpace, string type, string path) - { - return classTemplate.AddUsing(new UsingTemplate(nameSpace, type, path)); - } - - public static UsingTemplate AddUsing(this ClassTemplate classTemplate, UsingTemplate usingTemplate) - { - classTemplate.Usings.Add(usingTemplate); - return usingTemplate; - } - - public static ClassTemplate WithUsing(this ClassTemplate classTemplate, UsingTemplate usingTemplate) - { - classTemplate.Usings.Add(usingTemplate); - return classTemplate; - } - - public static ClassTemplate WithUsing(this ClassTemplate classTemplate, string nameSpace, string type, string path) - { - classTemplate.AddUsing(nameSpace, type, path); - return classTemplate; - } - - public static ClassTemplate WithGenericParameter(this ClassTemplate classTemplate, string name, params TypeTemplate[] constraints) - { - ClassGenericTemplate genericTemplate = new ClassGenericTemplate(name); - genericTemplate.Constraints.AddRange(constraints); - classTemplate.Generics.Add(genericTemplate); - return classTemplate; - } - - public static ClassTemplate Static(this ClassTemplate classTemplate, bool value = true) - { - classTemplate.IsStatic = value; - return classTemplate; - } - - public static ClassTemplate Abstract(this ClassTemplate classTemplate, bool value = true) - { - classTemplate.IsAbstract = value; - return classTemplate; - } - - public static FieldTemplate AddField(this ClassTemplate classTemplate, string name, TypeTemplate type) - { - FieldTemplate field = new FieldTemplate(classTemplate, name, type); - classTemplate.Fields.Add(field); - return field; - } - - public static PropertyTemplate AddProperty(this ClassTemplate classTemplate, string name, TypeTemplate type) - { - PropertyTemplate property = new PropertyTemplate(classTemplate, name, type); - classTemplate.Properties.Add(property); - return property; - } - - public static MethodTemplate AddMethod(this ClassTemplate classTemplate, string name, TypeTemplate type) - { - MethodTemplate methodTemplate = new MethodTemplate(classTemplate, name, type); - classTemplate.Methods.Add(methodTemplate); - return methodTemplate; - } - - public static ExtensionMethodTemplate AddExtensionMethod(this ClassTemplate classTemplate, string name, TypeTemplate type) - { - ExtensionMethodTemplate methodTemplate = new ExtensionMethodTemplate(classTemplate, name, type); - classTemplate.Methods.Add(methodTemplate); - return methodTemplate; - } - - public static ClassTemplate AddClass(this ClassTemplate classTemplate, string name, params TypeTemplate[] basedOn) - { - ClassTemplate subClass = new ClassTemplate(classTemplate, name, basedOn); - classTemplate.Classes.Add(subClass); - return subClass; - } - - public static TypeTemplate ToType(this ClassTemplate classTemplate) - { - return classTemplate.IsGeneric() ? Code.Instance.Generic(classTemplate.Name, classTemplate.Generics.Select(x => Code.Instance.Type(x.Name)).ToArray()) : Code.Instance.Type(classTemplate.Name); - } - - public static UsingTemplate ToUsing(this ClassTemplate classTemplate) - { - return new UsingTemplate(classTemplate.Namespace.Name, classTemplate.Name, classTemplate.Namespace.File.RelativePath); - } - - public static bool IsGeneric(this ClassTemplate classTemplate) - { - return classTemplate.Generics.Count > 0; - } - - public static ClassTemplate WithCode(this ClassTemplate classTemplate, ICodeFragment fragment) - { - classTemplate.Code = fragment; - return classTemplate; - } - - public static ClassTemplate WithComment(this ClassTemplate classTemplate, string description, CommentType type = CommentType.Block) - { - classTemplate.Comment = new CommentTemplate(description, type); - return classTemplate; - } - - public static ClassTemplate FormatName(this ClassTemplate classTemplate, IConfiguration configuration, bool force = false) - { - classTemplate.Name = Formatter.FormatClass(classTemplate.Name, configuration, force); - return classTemplate; - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/EnumTemplateExtension.cs b/Core/Templates/Extensions/EnumTemplateExtension.cs deleted file mode 100644 index 1071995b..00000000 --- a/Core/Templates/Extensions/EnumTemplateExtension.cs +++ /dev/null @@ -1,29 +0,0 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Templates.Extensions -{ - public static class EnumTemplateExtension - { - public static EnumTemplate FormatName(this EnumTemplate enumTemplate, IConfiguration configuration, bool force = false) - { - enumTemplate.Name = Formatter.FormatClass(enumTemplate.Name, configuration, force); - return enumTemplate; - } - - public static EnumTemplate AddValue(this EnumTemplate enumTemplate, string name, int? value = null) - { - enumTemplate.Values.Add(new EnumValueTemplate(name, Code.Instance.Number(value ?? enumTemplate.Values.Count))); - return enumTemplate; - } - - public static TypeTemplate ToType(this EnumTemplate enumTemplate) - { - return Code.Instance.Type(enumTemplate.Name); - } - - public static UsingTemplate ToUsing(this EnumTemplate enumTemplate) - { - return new UsingTemplate(enumTemplate.Namespace.Name, enumTemplate.Name, enumTemplate.Namespace.File.RelativePath); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/FieldTemplateExtension.cs b/Core/Templates/Extensions/FieldTemplateExtension.cs deleted file mode 100644 index 7903c220..00000000 --- a/Core/Templates/Extensions/FieldTemplateExtension.cs +++ /dev/null @@ -1,64 +0,0 @@ -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Models; - -namespace KY.Generator.Templates.Extensions -{ - public static class FieldTemplateExtension - { - public static FieldTemplate Public(this FieldTemplate field) - { - field.Visibility = Visibility.Public; - return field; - } - - public static FieldTemplate Protected(this FieldTemplate field) - { - field.Visibility = Visibility.Protected; - return field; - } - - public static FieldTemplate Static(this FieldTemplate field, bool value = true) - { - field.IsStatic = value; - return field; - } - - public static FieldTemplate Constant(this FieldTemplate field, bool value = true) - { - field.IsConstant = value; - return field; - } - - public static FieldTemplate Readonly(this FieldTemplate field, bool value = true) - { - field.IsReadonly = value; - return field; - } - - public static FieldTemplate Optional(this FieldTemplate field, bool value = true) - { - field.IsOptional = value; - return field; - } - - public static FieldTemplate Default(this FieldTemplate field, ICodeFragment code) - { - field.DefaultValue = code; - return field; - } - - public static FieldTemplate FormatName(this FieldTemplate field, IConfiguration configuration, bool force = false) - { - field.Name = Formatter.FormatField(field.Name, configuration, force); - return field; - } - - public static FieldTemplate FormatName(this FieldTemplate field, ILanguage language, bool formatNames) - { - field.Name = Formatter.FormatField(field.Name, language, formatNames); - return field; - } - } -} diff --git a/Core/Templates/Extensions/FileTemplateExtension.cs b/Core/Templates/Extensions/FileTemplateExtension.cs deleted file mode 100644 index 2bc6c201..00000000 --- a/Core/Templates/Extensions/FileTemplateExtension.cs +++ /dev/null @@ -1,31 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Templates.Extensions -{ - public static class FileTemplateExtension - { - public static FileTemplate WithHeader(this FileTemplate file, string header) - { - file.Header.Description = header; - return file; - } - - public static FileTemplate WithType(this FileTemplate file, string type) - { - file.Type = type; - return file; - } - - public static NamespaceTemplate AddNamespace(this FileTemplate file, string nameSpace) - { - NamespaceTemplate namespaceTemplate = new NamespaceTemplate(file, nameSpace); - file.Namespaces.Add(namespaceTemplate); - return namespaceTemplate; - } - - public static void AddTo(this FileTemplate file, IList list) - { - list.Add(file); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/FileTemplateListExtension.cs b/Core/Templates/Extensions/FileTemplateListExtension.cs deleted file mode 100644 index 160f232b..00000000 --- a/Core/Templates/Extensions/FileTemplateListExtension.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Collections.Generic; - -namespace KY.Generator.Templates.Extensions -{ - public static class FileTemplateListExtension - { - public static FileTemplate AddFile(this IList files, string relativePath, bool addHeader, Guid? outputId) - { - FileTemplate file = new FileTemplate(relativePath, addHeader, outputId); - files.Add(file); - return file; - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/MethodTemplateExtension.cs b/Core/Templates/Extensions/MethodTemplateExtension.cs deleted file mode 100644 index 5627620c..00000000 --- a/Core/Templates/Extensions/MethodTemplateExtension.cs +++ /dev/null @@ -1,96 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Models; - -namespace KY.Generator.Templates.Extensions -{ - public static class MethodTemplateExtension - { - public static MethodTemplate Internal(this MethodTemplate methodTemplate) - { - methodTemplate.Visibility = Visibility.Internal; - return methodTemplate; - } - - public static MethodTemplate Protected(this MethodTemplate methodTemplate) - { - methodTemplate.Visibility = Visibility.Protected; - return methodTemplate; - } - - public static MethodTemplate Private(this MethodTemplate methodTemplate) - { - methodTemplate.Visibility = Visibility.Private; - return methodTemplate; - } - - public static MethodTemplate Static(this MethodTemplate methodTemplate, bool value = true) - { - methodTemplate.IsStatic = value; - return methodTemplate; - } - - public static MethodTemplate Override(this MethodTemplate methodTemplate, bool value = true) - { - methodTemplate.IsOverride = value; - return methodTemplate; - } - - public static MethodTemplate WithGeneric(this MethodTemplate methodTemplate, string alias, TypeTemplate defaultType = null) - { - methodTemplate.Generics.Add(new MethodGenericTemplate(alias, defaultType)); - return methodTemplate; - } - - public static ParameterTemplate AddParameter(this MethodTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment defaultValue = null) - { - var parameter = new ParameterTemplate(type, name, defaultValue); - methodTemplate.Parameters.Add(parameter); - return parameter; - } - - public static MethodTemplate WithParameter(this MethodTemplate methodTemplate, ParameterTemplate parameter) - { - methodTemplate.Parameters.Add(parameter); - return methodTemplate; - } - - public static MethodTemplate WithParameter(this MethodTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment defaultValue = null) - { - methodTemplate.AddParameter(type, name, defaultValue); - return methodTemplate; - } - - public static MethodTemplate WithParameters(this MethodTemplate methodTemplate, IEnumerable parameters) - { - methodTemplate.Parameters.AddRange(parameters); - return methodTemplate; - } - - public static MethodTemplate WithComment(this MethodTemplate methodTemplate, string description) - { - methodTemplate.Comment = new CommentTemplate(description, CommentType.Summary); - return methodTemplate; - } - - public static MethodTemplate WithCode(this MethodTemplate methodTemplate, ICodeFragment code) - { - methodTemplate.Code.Fragments.Add(code); - return methodTemplate; - } - - public static MethodTemplate FormatName(this MethodTemplate methodTemplate, IConfiguration configuration, bool force = false) - { - methodTemplate.Name = Formatter.FormatMethod(methodTemplate.Name, configuration, force); - return methodTemplate; - } - - public static MethodTemplate FormatName(this MethodTemplate methodTemplate, ILanguage language, bool formatNames) - { - methodTemplate.Name = Formatter.FormatMethod(methodTemplate.Name, language, formatNames); - return methodTemplate; - } - } -} diff --git a/Core/Templates/Extensions/ParameterTemplateExtension.cs b/Core/Templates/Extensions/ParameterTemplateExtension.cs deleted file mode 100644 index 98bf5a49..00000000 --- a/Core/Templates/Extensions/ParameterTemplateExtension.cs +++ /dev/null @@ -1,14 +0,0 @@ -using KY.Generator.Configuration; -using KY.Generator.Configurations; - -namespace KY.Generator.Templates.Extensions -{ - public static class ParameterTemplateExtension - { - public static ParameterTemplate FormatName(this ParameterTemplate parameter, IConfiguration configuration, bool force = false) - { - parameter.Name = Formatter.FormatParameter(parameter.Name, configuration, force); - return parameter; - } - } -} \ No newline at end of file diff --git a/Core/Templates/Extensions/PropertyTemplateExtension.cs b/Core/Templates/Extensions/PropertyTemplateExtension.cs deleted file mode 100644 index 0dc408af..00000000 --- a/Core/Templates/Extensions/PropertyTemplateExtension.cs +++ /dev/null @@ -1,90 +0,0 @@ -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Models; - -namespace KY.Generator.Templates.Extensions -{ - public static class PropertyTemplateExtension - { - public static PropertyTemplate Internal(this PropertyTemplate property) - { - property.Visibility = Visibility.Internal; - return property; - } - - public static PropertyTemplate Protected(this PropertyTemplate property) - { - property.Visibility = Visibility.Protected; - return property; - } - - public static PropertyTemplate Private(this PropertyTemplate property) - { - property.Visibility = Visibility.Private; - return property; - } - - public static PropertyTemplate Virtual(this PropertyTemplate property, bool value = true) - { - property.IsVirtual = value; - return property; - } - - public static PropertyTemplate Static(this PropertyTemplate property, bool value = true) - { - property.IsStatic = value; - return property; - } - - public static PropertyTemplate Optional(this PropertyTemplate property, bool value = true) - { - property.IsOptional = value; - return property; - } - - public static PropertyTemplate ReadOnly(this PropertyTemplate property) - { - property.HasSetter = false; - return property; - } - - public static PropertyTemplate ReadOnlyWithCode(this PropertyTemplate property, ICodeFragment expression) - { - property.HasGetter = false; - property.HasSetter = false; - property.Expression = expression; - return property; - } - - public static PropertyTemplate WithDefaultValue(this PropertyTemplate property, ICodeFragment defaultValue) - { - property.DefaultValue = defaultValue; - return property; - } - - public static PropertyTemplate WithComment(this PropertyTemplate property, string description) - { - property.Comment = new CommentTemplate(description, CommentType.Summary); - return property; - } - - public static PropertyTemplate WithSetter(this PropertyTemplate property, ICodeFragment code) - { - property.Setter = code; - return property; - } - - public static PropertyTemplate WithGetter(this PropertyTemplate property, ICodeFragment code) - { - property.Getter = code; - return property; - } - - public static PropertyTemplate FormatName(this PropertyTemplate propertyTemplate, IConfiguration configuration, bool force = false) - { - propertyTemplate.Name = Formatter.FormatProperty(propertyTemplate.Name, configuration, force); - return propertyTemplate; - } - } -} diff --git a/Core/Templates/Extensions/PropertyValueTemplateExtension.cs b/Core/Templates/Extensions/PropertyValueTemplateExtension.cs deleted file mode 100644 index 07a9c732..00000000 --- a/Core/Templates/Extensions/PropertyValueTemplateExtension.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Templates.Extensions -{ - public static class PropertyValueTemplateExtension - { - public static PropertyValueTemplate FormatName(this PropertyValueTemplate propertyTemplate, IConfiguration configuration, bool force = false) - { - propertyTemplate.Name = Formatter.FormatProperty(propertyTemplate.Name, configuration, force); - return propertyTemplate; - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/FieldTemplate.cs b/Core/Templates/Structural/FieldTemplate.cs deleted file mode 100644 index ecc4afc0..00000000 --- a/Core/Templates/Structural/FieldTemplate.cs +++ /dev/null @@ -1,41 +0,0 @@ -using System.Diagnostics; -using KY.Generator.Models; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("Field {Name}: {Type}")] - public class FieldTemplate : AttributeableTempalte - { - public string Name { get; set; } - public TypeTemplate Type { get; } - public bool IsStatic { get; set; } - public bool IsConstant { get; set; } - public Visibility Visibility { get; set; } - public ICodeFragment DefaultValue { get; set; } - public ClassTemplate Class { get; } - public CommentTemplate Comment { get; set; } - public bool IsReadonly { get; set; } - public bool IsOptional { get; set; } - // TODO: Remove temporary property Strict - public bool Strict { get; set; } - - public FieldTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) - { - this.Class = classTemplate; - this.Name = name; - this.Type = type; - this.Visibility = Visibility.Private; - } - - public override bool Equals(object obj) - { - FieldTemplate property = obj as FieldTemplate; - return property != null && this.Name.Equals(property.Name); - } - - public override int GetHashCode() - { - return this.Name.GetHashCode(); - } - } -} diff --git a/Core/Templates/Structural/FileTemplate.cs b/Core/Templates/Structural/FileTemplate.cs deleted file mode 100644 index 3d30cd89..00000000 --- a/Core/Templates/Structural/FileTemplate.cs +++ /dev/null @@ -1,104 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using KY.Generator.Properties; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("File {Name ?? \"No namespace\"}")] - public class FileTemplate : ICodeFragment - { - private string name; - - public string Name - { - get => this.name ?? this.Namespaces.FirstOrDefault(x => x.Children.Any(y => y.IsPublic))?.Children.FirstOrDefault(x => x.IsPublic)?.Name; - set => this.name = value; - } - - public string RelativePath { get; } - public string Type { get; set; } - public List Namespaces { get; } - public CommentTemplate Header { get; } - public Guid? OutputId { get; } - - public FileTemplate(string relativePath = null, bool addHeader = true, Guid? outputId = null) - { - this.RelativePath = relativePath ?? string.Empty; - this.OutputId = outputId; - this.Namespaces = new List(); - this.Header = new CommentTemplate(addHeader ? Resources.Header : null); - } - - public IEnumerable GetUsingsByNamespace() - { - List usings = new List(); - foreach (NamespaceTemplate namespaceTemplate in this.Namespaces) - { - foreach (INamespaceChildren namespaceChildren in namespaceTemplate.Children) - { - foreach (UsingTemplate usingTemplate in this.GetUsings(namespaceChildren)) - { - if (namespaceTemplate.Name != usingTemplate.Namespace && usings.All(x => x.Namespace != usingTemplate.Namespace)) - { - usings.Add(usingTemplate); - } - } - } - } - return usings.OrderBy(x => x.Namespace, new NamespaceComparer()); - } - - public IEnumerable GetUsingsByTypeAndPath() - { - List usings = new List(); - foreach (NamespaceTemplate namespaceTemplate in this.Namespaces) - { - foreach (INamespaceChildren namespaceChildren in namespaceTemplate.Children) - { - foreach (UsingTemplate usingTemplate in this.GetUsings(namespaceChildren)) - { - if (usings.All(x => x.Path != usingTemplate.Path || x.Type != usingTemplate.Type)) - { - usings.Add(usingTemplate); - } - } - } - } - return usings.OrderBy(x => $"{x.Path}/{x.Type}"); - } - - private IEnumerable GetUsings(INamespaceChildren namespaceChildren) - { - foreach (UsingTemplate usingTemplate in namespaceChildren.Usings) - { - yield return usingTemplate; - } - if (namespaceChildren is ClassTemplate classTemplate) - { - foreach (ClassTemplate subclassTemplate in classTemplate.Classes) - { - foreach (UsingTemplate usingTemplate in this.GetUsings(subclassTemplate)) - { - yield return usingTemplate; - } - } - } - } - - private class NamespaceComparer : IComparer - { - public int Compare(string left, string right) - { - bool leftSystem = left != null && left.StartsWith("System"); - bool rightSystem = right != null && right.StartsWith("System"); - if (leftSystem == rightSystem) - { - return StringComparer.CurrentCulture.Compare(left, right); - } - return leftSystem ? -1 : 1; - } - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/ForwardFileTemplate.cs b/Core/Templates/Structural/ForwardFileTemplate.cs deleted file mode 100644 index b373b031..00000000 --- a/Core/Templates/Structural/ForwardFileTemplate.cs +++ /dev/null @@ -1,16 +0,0 @@ -using KY.Generator.Languages; - -namespace KY.Generator.Templates -{ - public class ForwardFileTemplate : FileTemplate - { - public FileTemplate File { get; } - public ILanguage Language { get; } - - public ForwardFileTemplate(FileTemplate file, ILanguage language) - { - this.File = file; - this.Language = language; - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/GenericTypeTemplate.cs b/Core/Templates/Structural/GenericTypeTemplate.cs deleted file mode 100644 index f1e07176..00000000 --- a/Core/Templates/Structural/GenericTypeTemplate.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Templates -{ - public class GenericTypeTemplate : TypeTemplate - { - public List Types { get; } - - public GenericTypeTemplate(string name, string nameSpace = null, bool isNullable = false, bool fromSystem = false) - : base(name, nameSpace, false, isNullable, fromSystem) - { - this.Types = new List(); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/MethodGenericTemplate.cs b/Core/Templates/Structural/MethodGenericTemplate.cs deleted file mode 100644 index cfbcbaa2..00000000 --- a/Core/Templates/Structural/MethodGenericTemplate.cs +++ /dev/null @@ -1,14 +0,0 @@ -namespace KY.Generator.Templates -{ - public class MethodGenericTemplate : ICodeFragment - { - public string Alias { get; set; } - public TypeTemplate DefaultType { get; set; } - - public MethodGenericTemplate(string alias, TypeTemplate defaultType = null) - { - this.Alias = alias; - this.DefaultType = defaultType; - } - } -} diff --git a/Core/Templates/Structural/MethodTemplate.cs b/Core/Templates/Structural/MethodTemplate.cs deleted file mode 100644 index 24fbcc20..00000000 --- a/Core/Templates/Structural/MethodTemplate.cs +++ /dev/null @@ -1,32 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using KY.Generator.Models; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("Method {Name}")] - public class MethodTemplate : AttributeableTempalte - { - public string Name { get; set; } - public TypeTemplate Type { get; } - public Visibility Visibility { get; set; } - public bool IsStatic { get; set; } - public bool IsOverride { get; set; } - public List Parameters { get; } - public MultilineCodeFragment Code { get; } - public ClassTemplate Class { get; } - public CommentTemplate Comment { get; set; } - public List Generics { get; set; } - - public MethodTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) - { - this.Class = classTemplate; - this.Name = name; - this.Type = type; - this.Visibility = Visibility.Public; - this.Parameters = new List(); - this.Code = new MultilineCodeFragment(); - this.Generics = new List(); - } - } -} diff --git a/Core/Templates/Structural/ParameterTemplate.cs b/Core/Templates/Structural/ParameterTemplate.cs deleted file mode 100644 index 3a871882..00000000 --- a/Core/Templates/Structural/ParameterTemplate.cs +++ /dev/null @@ -1,22 +0,0 @@ -namespace KY.Generator.Templates -{ - public class ParameterTemplate : AttributeableTempalte - { - public TypeTemplate Type { get; } - public string Name { get; set; } - public ICodeFragment DefaultValue { get; } - public bool IsOptional { get; set; } - - public ParameterTemplate(TypeTemplate type, string name, ICodeFragment defaultValue = null) - { - this.Type = type; - this.Name = name; - this.DefaultValue = defaultValue; - } - - public static ParameterTemplate Create(TypeTemplate type, string name, ICodeFragment defaultValue = null) - { - return new ParameterTemplate(type, name, defaultValue); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/PropertyTemplate.cs b/Core/Templates/Structural/PropertyTemplate.cs deleted file mode 100644 index b558a648..00000000 --- a/Core/Templates/Structural/PropertyTemplate.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Diagnostics; -using KY.Generator.Models; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("Property {Name}: {Type}")] - public class PropertyTemplate : AttributeableTempalte - { - public string Name { get; set; } - public TypeTemplate Type { get; } - public bool HasGetter { get; set; } - public bool HasSetter { get; set; } - public bool IsVirtual { get; set; } - public bool IsStatic { get; set; } - public bool IsOptional { get; set; } - public Visibility Visibility { get; set; } - public ICodeFragment DefaultValue { get; set; } - public ICodeFragment Expression { get; set; } - public ClassTemplate Class { get; } - public CommentTemplate Comment { get; set; } - public ICodeFragment Setter { get; set; } - public ICodeFragment Getter { get; set; } - - public PropertyTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) - { - this.Class = classTemplate; - this.Name = name; - this.Type = type; - this.HasGetter = true; - this.HasSetter = true; - this.Visibility = Visibility.Public; - } - - public override bool Equals(object obj) - { - PropertyTemplate property = obj as PropertyTemplate; - return property != null && this.Name.Equals(property.Name); - } - - public override int GetHashCode() - { - return this.Name.GetHashCode(); - } - } -} diff --git a/Core/Templates/Structural/StaticFileTemplate.cs b/Core/Templates/Structural/StaticFileTemplate.cs deleted file mode 100644 index afe61858..00000000 --- a/Core/Templates/Structural/StaticFileTemplate.cs +++ /dev/null @@ -1,30 +0,0 @@ -using System; -using System.Diagnostics; -using System.Text; -using KY.Generator.Languages; -using KY.Generator.Output; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("StaticFile {Name}")] - public class StaticFileTemplate : FileTemplate - { - public string Content { get; } - - public StaticFileTemplate(string name, byte[] content, string relativePath = null, bool addHeader = true, Guid? outputId = null) - : this(name, Encoding.UTF8.GetString(content), relativePath, addHeader, outputId) - { } - - public StaticFileTemplate(string name, string content, string relativePath = null, bool addHeader = true, Guid? outputId = null) - : base(relativePath, addHeader, outputId) - { - this.Name = name; - this.Content = content; - } - - public void Write(IOutput output) - { - StaticFileLanguage.Instance.Write(this, output); - } - } -} \ No newline at end of file diff --git a/Core/Templates/Structural/TypeTemplate.cs b/Core/Templates/Structural/TypeTemplate.cs deleted file mode 100644 index 7d77f084..00000000 --- a/Core/Templates/Structural/TypeTemplate.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Diagnostics; - -namespace KY.Generator.Templates -{ - [DebuggerDisplay("TypeTemplate: {Name}")] - public class TypeTemplate : ICodeFragment - { - public string Name { get; set; } - public string Namespace { get; } - public bool IsInterface { get; } - public bool IsNullable { get; } - public bool FromSystem { get; } - - public TypeTemplate(string name, string nameSpace = null, bool isInterface = false, bool isNullable = false, bool fromSystem = false) - { - this.Name = name ?? throw new ArgumentNullException(nameof(name)); - this.Namespace = nameSpace; - this.IsInterface = isInterface; - this.IsNullable = isNullable; - this.FromSystem = fromSystem; - } - - public override bool Equals(object obj) - { - var type = obj as TypeTemplate; - return type != null && this.Name.Equals(type.Name); - } - - public static bool operator ==(TypeTemplate left, TypeTemplate right) - { - return Equals(left, right); - } - - public static bool operator !=(TypeTemplate left, TypeTemplate right) - { - return !(left == right); - } - - public override int GetHashCode() - { - return this.Name.GetHashCode(); - } - } -} diff --git a/Core/Templates/Types/NumberTemplate.cs b/Core/Templates/Types/NumberTemplate.cs deleted file mode 100644 index 8161ec78..00000000 --- a/Core/Templates/Types/NumberTemplate.cs +++ /dev/null @@ -1,25 +0,0 @@ -namespace KY.Generator.Templates -{ - public class NumberTemplate : ChainedCodeFragment - { - public override string Separator => " "; - public long? LongValue { get; } - public float? FloatValue { get; } - public double? DoubleValue { get; } - - public NumberTemplate(long value) - { - this.LongValue = value; - } - - public NumberTemplate(float value) - { - this.FloatValue = value; - } - - public NumberTemplate(double value) - { - this.DoubleValue = value; - } - } -} \ No newline at end of file diff --git a/Core/Transfer/EntityTransferObject.cs b/Core/Transfer/EntityTransferObject.cs deleted file mode 100644 index 74202bf8..00000000 --- a/Core/Transfer/EntityTransferObject.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Transfer -{ - public class EntityTransferObject : ITransferObject - { - public string Name { get; set; } - public string Table { get; set; } - public string Schema { get; set; } - public ModelTransferObject Model { get; set; } - public List Keys { get; set; } - public List Actions { get; set; } - - public EntityTransferObject() - { - this.Keys = new List(); - this.Actions = new List(); - } - } -} \ No newline at end of file diff --git a/Core/Transfer/Extensions/FromTypeOptions.cs b/Core/Transfer/Extensions/FromTypeOptions.cs deleted file mode 100644 index 874d4262..00000000 --- a/Core/Transfer/Extensions/FromTypeOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Transfer.Extensions -{ - public class FromTypeOptions : IFromTypeOptions - { - public List ReplaceName { get; set; } - public List ReplaceWithName { get; set; } - } -} diff --git a/Core/Transfer/Extensions/IFromTypeOptions.cs b/Core/Transfer/Extensions/IFromTypeOptions.cs deleted file mode 100644 index 22117c02..00000000 --- a/Core/Transfer/Extensions/IFromTypeOptions.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; - -namespace KY.Generator.Transfer.Extensions -{ - public interface IFromTypeOptions - { - List ReplaceName { get; set; } - List ReplaceWithName { get; set; } - } -} diff --git a/Core/Transfer/FieldTransferObject.cs b/Core/Transfer/FieldTransferObject.cs deleted file mode 100644 index f152a5fc..00000000 --- a/Core/Transfer/FieldTransferObject.cs +++ /dev/null @@ -1,18 +0,0 @@ -namespace KY.Generator.Transfer -{ - public class FieldTransferObject : MemberTransferObject - { - public object Default { get; set; } - - public FieldTransferObject() - { } - - public FieldTransferObject(FieldTransferObject field) - { - this.Name = field.Name; - this.Type = field.Type.Clone(); - this.Default = field.Default; - this.Comment = field.Comment; - } - } -} diff --git a/Core/Transfer/GenericModelTransferObject.cs b/Core/Transfer/GenericModelTransferObject.cs deleted file mode 100644 index aa6556fd..00000000 --- a/Core/Transfer/GenericModelTransferObject.cs +++ /dev/null @@ -1,123 +0,0 @@ -using System; -using System.Collections.Generic; -using KY.Generator.Languages; -using KY.Generator.Models; -using KY.Generator.Templates; - -namespace KY.Generator.Transfer -{ - public class GenericModelTransferObject : ModelTransferObject - { - private readonly ModelTransferObject target; - - public override string Name - { - get => this.target.Name; - set => throw new InvalidOperationException(); - } - - public override string OriginalName - { - get => this.target.OriginalName; - set => throw new InvalidOperationException(); - } - - public override string Namespace - { - get => this.target.Namespace; - set => throw new InvalidOperationException(); - } - - public override bool FromSystem - { - get => this.target.FromSystem; - set => throw new InvalidOperationException(); - } - - public override bool IsNullable - { - get => this.target.IsNullable; - set => throw new InvalidOperationException(); - } - - public override List Generics { get; } = new(); - - public override TypeTransferObject Original - { - get => this.target.Original; - set => throw new InvalidOperationException(); - } - - public override ICodeFragment Default - { - get => this.target.Default; - set => throw new InvalidOperationException(); - } - - public override bool HasUsing - { - get => this.target.HasUsing; - set => throw new InvalidOperationException(); - } - - public override bool IsEnum - { - get => this.target.IsEnum; - set => throw new InvalidOperationException(); - } - - public override bool IsInterface - { - get => this.target.IsInterface; - set => throw new InvalidOperationException(); - } - - public override bool IsAbstract - { - get => this.target.IsAbstract; - set => throw new InvalidOperationException(); - } - - public override bool IsGeneric - { - get => this.target.IsGeneric; - set => throw new InvalidOperationException(); - } - - public override Dictionary EnumValues - { - get => this.target.EnumValues; - set => throw new InvalidOperationException(); - } - - public override ModelTransferObject BasedOn - { - get => this.target.BasedOn; - set => throw new InvalidOperationException(); - } - - public override ILanguage Language - { - get => this.target.Language; - set => throw new InvalidOperationException(); - } - - public override List Interfaces => this.target.Interfaces; - public override List Constants => this.target.Constants; - public override List Fields => this.target.Fields; - public override List Properties => this.target.Properties; - public override List Methods => this.target.Methods; - public override List Usings => this.target.Usings; - - public override string Comment - { - get => this.target.Comment; - set => throw new InvalidOperationException(); - } - - public GenericModelTransferObject(ModelTransferObject target) - { - this.target = target; - } - } -} diff --git a/Core/Transfer/HttpServiceTransferObject.cs b/Core/Transfer/HttpServiceTransferObject.cs deleted file mode 100644 index 8c1b90ef..00000000 --- a/Core/Transfer/HttpServiceTransferObject.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Languages; - -namespace KY.Generator.Transfer -{ - public class HttpServiceTransferObject : ITransferObject - { - public string Name { get; set; } - public string Route { get; set; } - public string Version { get; set; } - public ILanguage Language { get; set; } - - public List Actions { get; } - - public HttpServiceTransferObject() - { - this.Actions = new List(); - } - } -} diff --git a/Core/Transfer/MemberTransferObject.cs b/Core/Transfer/MemberTransferObject.cs deleted file mode 100644 index 45b05fa7..00000000 --- a/Core/Transfer/MemberTransferObject.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace KY.Generator.Transfer -{ - public class MemberTransferObject - { - public string Name { get; set; } - public TypeTransferObject Type { get; set; } - public string Comment { get; set; } - } -} \ No newline at end of file diff --git a/Core/Transfer/ModelTransferObject.cs b/Core/Transfer/ModelTransferObject.cs deleted file mode 100644 index 5f65df98..00000000 --- a/Core/Transfer/ModelTransferObject.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using KY.Generator.Languages; - -namespace KY.Generator.Transfer -{ - [DebuggerDisplay("ModelTransferObject {Namespace,nq}.{Name,nq}")] - public class ModelTransferObject : TypeTransferObject - { - public virtual bool IsEnum { get; set; } - public virtual bool IsInterface { get; set; } - public virtual bool IsAbstract { get; set; } - public virtual Dictionary EnumValues { get; set; } - public virtual ModelTransferObject BasedOn { get; set; } - public virtual ILanguage Language { get; set; } - public virtual List Interfaces { get; } - public virtual List Constants { get; } - public virtual List Fields { get; } - public virtual List Properties { get; } - public virtual List Methods { get; } - public virtual List Usings { get; } - public virtual string Comment { get; set; } - - public ModelTransferObject() - { - this.Interfaces = new List(); - this.Constants = new List(); - this.Fields = new List(); - this.Properties = new List(); - this.Usings = new List(); - this.Methods = new List(); - } - } -} diff --git a/Core/Transfer/OutputIdTransferObject.cs b/Core/Transfer/OutputIdTransferObject.cs deleted file mode 100644 index 0558ce81..00000000 --- a/Core/Transfer/OutputIdTransferObject.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System; - -namespace KY.Generator.Transfer -{ - public class OutputIdTransferObject : TransferObject - { - public OutputIdTransferObject(Guid value) - : base(value) - { } - } -} \ No newline at end of file diff --git a/Core/Transfer/PropertyTransferObject.cs b/Core/Transfer/PropertyTransferObject.cs deleted file mode 100644 index 54cde72d..00000000 --- a/Core/Transfer/PropertyTransferObject.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System.Collections.Generic; -using System.Linq; - -namespace KY.Generator.Transfer -{ - public class PropertyTransferObject : MemberTransferObject - { - public bool CanRead { get; set; } = true; - public bool CanWrite { get; set; } = true; - public List Attributes { get; set; } = new(); - - public PropertyTransferObject() - { } - - public PropertyTransferObject(PropertyTransferObject property) - { - this.Name = property.Name; - this.Type = property.Type.Clone(); - this.CanRead = property.CanRead; - this.CanRead = property.CanWrite; - this.Attributes = property.Attributes.Select(attribute => attribute.Clone()).ToList(); - this.Comment = property.Comment; - } - } -} diff --git a/Core/Transfer/Readers/ITransferReader.cs b/Core/Transfer/Readers/ITransferReader.cs deleted file mode 100644 index a170939d..00000000 --- a/Core/Transfer/Readers/ITransferReader.cs +++ /dev/null @@ -1,10 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Configurations; - -namespace KY.Generator.Transfer.Readers -{ - public interface ITransferReader - { - void Read(ConfigurationBase configurationBase, List transferObjects); - } -} \ No newline at end of file diff --git a/Core/Transfer/SignalRHubTransferObject.cs b/Core/Transfer/SignalRHubTransferObject.cs deleted file mode 100644 index 78ded460..00000000 --- a/Core/Transfer/SignalRHubTransferObject.cs +++ /dev/null @@ -1,20 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Languages; - -namespace KY.Generator.Transfer -{ - public class SignalRHubTransferObject : ITransferObject - { - public string Name { get; set; } - public ILanguage Language { get; set; } - - public List Actions { get; } - public List Events { get; } - - public SignalRHubTransferObject() - { - this.Actions = new List(); - this.Events = new List(); - } - } -} \ No newline at end of file diff --git a/Core/Transfer/TypeTransferObject.cs b/Core/Transfer/TypeTransferObject.cs deleted file mode 100644 index 5cca2ad8..00000000 --- a/Core/Transfer/TypeTransferObject.cs +++ /dev/null @@ -1,49 +0,0 @@ -using System.Collections.Generic; -using System.Diagnostics; -using System.Linq; -using KY.Generator.Templates; - -namespace KY.Generator.Transfer -{ - [DebuggerDisplay("TypeTransferObject {Namespace,nq}.{Name,nq}")] - public class TypeTransferObject : ITransferObject - { - public virtual string Name { get; set; } - public virtual string OriginalName { get; set; } - public virtual string Namespace { get; set; } - public virtual bool FromSystem { get; set; } - public virtual bool IsNullable { get; set; } - public virtual bool IsGeneric { get; set; } - public virtual List Generics { get; } - public virtual TypeTransferObject Original { get; set; } - public virtual ICodeFragment Default { get; set; } - public string FullName => $"{this.Namespace}.{this.Name}"; - public virtual bool HasUsing { get; set; } = true; - - public TypeTransferObject() - { - this.Generics = new List(); - } - - public TypeTransferObject(TypeTransferObject type) - { - this.Name = type.Name; - this.Namespace = type.Namespace; - this.FromSystem = type.FromSystem; - this.IsNullable = type.IsNullable; - this.IsGeneric = type.IsGeneric; - this.Generics = type.Generics.ToList(); - this.HasUsing = type.HasUsing; - } - - public bool Equals(TypeTransferObject type) - { - return (this.Name == type.Name || this.OriginalName == type.Name || this.Name == type.OriginalName) && this.Namespace == type.Namespace && this.IsGeneric == type.IsGeneric; - } - - public TypeTransferObject Clone() - { - return (TypeTransferObject)this.MemberwiseClone(); - } - } -} diff --git a/Core/Transfer/Writers/ITransferWriter.cs b/Core/Transfer/Writers/ITransferWriter.cs deleted file mode 100644 index 91c7a114..00000000 --- a/Core/Transfer/Writers/ITransferWriter.cs +++ /dev/null @@ -1,11 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Configurations; -using KY.Generator.Output; - -namespace KY.Generator.Transfer.Writers -{ - public interface ITransferWriter - { - void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output); - } -} \ No newline at end of file diff --git a/Core/Transfer/Writers/ModelWriter.cs b/Core/Transfer/Writers/ModelWriter.cs deleted file mode 100644 index 23001e41..00000000 --- a/Core/Transfer/Writers/ModelWriter.cs +++ /dev/null @@ -1,135 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Mappings; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Templates.Extensions; -using KY.Generator.Transfer.Extensions; - -namespace KY.Generator.Transfer.Writers -{ - public class ModelWriter : TransferWriter, ITransferWriter - { - public ModelWriter(ITypeMapping typeMapping) - : base(typeMapping) - { } - - public virtual void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - IModelConfiguration configuration = (IModelConfiguration)configurationBase; - this.Write(configuration, transferObjects).ForEach(file => configuration.Language.Write(file, output)); - } - - public virtual List Write(IModelConfiguration configuration, IEnumerable transferObjects) - { - if (configuration.Language == null) - { - throw new InvalidOperationException("Can not write model without language"); - } - List files = new List(); - List models = transferObjects.OfType().ToList(); - if (!string.IsNullOrEmpty(configuration.Name)) - { - models.Where(x => x.Name == "Unknown").ForEach(x => x.Name = configuration.Name); - } - models.ForEach(model => model.Name = Formatter.FormatClass(model.Name, configuration)); - foreach (ModelTransferObject model in models) - { - string nameSpace = configuration.SkipNamespace ? string.Empty : configuration.Namespace ?? model.Namespace; - this.WriteModel(configuration, model, nameSpace, files); - } - return files; - } - - protected virtual void WriteModel(IModelConfiguration configuration, ModelTransferObject model, string nameSpace, List files) - { - if (model == null) - { - return; - } - if (model.Language is IMappableLanguage modelLanguage && configuration.Language is IMappableLanguage configurationLanguage) - { - this.MapType(modelLanguage, configurationLanguage, model); - } - if (model.FromSystem) - { - return; - } - if (model.IsEnum) - { - this.WriteEnum(configuration, model, nameSpace, files); - } - else - { - this.WriteClass(configuration, model, nameSpace, files); - } - } - - protected virtual EnumTemplate WriteEnum(IModelConfiguration configuration, ModelTransferObject model, string nameSpace, List files) - { - if (model.EnumValues == null) - { - throw new InvalidOperationException("Can not write enum without values"); - } - - EnumTemplate enumTemplate = files.AddFile(configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - .AddNamespace(nameSpace) - .AddEnum(model.Name); - - foreach (KeyValuePair pair in model.EnumValues) - { - string formattedName = Formatter.FormatProperty(pair.Key, configuration); - enumTemplate.Values.Add(new EnumValueTemplate(pair.Key, Code.Number(pair.Value), formattedName)); - } - return enumTemplate; - } - - protected virtual ClassTemplate WriteClass(IModelConfiguration configuration, ModelTransferObject model, string nameSpace, List files) - { - IMappableLanguage modelLanguage = model.Language as IMappableLanguage; - IMappableLanguage configurationLanguage = configuration.Language as IMappableLanguage; - - if (model.BasedOn != null && modelLanguage != null && configurationLanguage != null) - { - this.MapType(modelLanguage, configurationLanguage, model.BasedOn); - } - - bool isInterface = model.IsInterface || configuration.Formatting.PreferInterfaces; - ClassTemplate classTemplate = files.AddFile(configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - // .WithType(isInterface ? "interface" : null) - .AddNamespace(nameSpace) - .AddClass(model.Name, model.BasedOn?.ToTemplate()) - .FormatName(configuration); - - if (model.BasedOn != null) - { - this.AddUsing(model.BasedOn, classTemplate, configuration); - } - configuration.Usings?.ForEach(x => classTemplate.AddUsing(x, null, null)); - - classTemplate.IsInterface = isInterface; - classTemplate.IsAbstract = model.IsAbstract; - if (model.IsGeneric) - { - classTemplate.Generics.AddRange(model.Generics.Where(x => x.Alias != null).Select(x => new ClassGenericTemplate(x.Alias.Name))); - } - foreach (TypeTransferObject interFace in model.Interfaces) - { - if (modelLanguage != null && configurationLanguage != null) - { - this.MapType(modelLanguage, configurationLanguage, interFace); - } - classTemplate.BasedOn.Add(new BaseTypeTemplate(classTemplate, Code.Interface(interFace.Name, interFace.Namespace))); - this.AddUsing(interFace, classTemplate, configuration); - } - this.AddConstants(model, classTemplate, configuration); - this.AddFields(model, classTemplate, configuration); - this.AddProperties(model, classTemplate, configuration); - return classTemplate; - } - } -} diff --git a/Core/Transfer/Writers/TransferWriter.cs b/Core/Transfer/Writers/TransferWriter.cs deleted file mode 100644 index 9996a53b..00000000 --- a/Core/Transfer/Writers/TransferWriter.cs +++ /dev/null @@ -1,179 +0,0 @@ -using System; -using System.Linq; -using KY.Core; -using KY.Generator.Configurations; -using KY.Generator.Languages; -using KY.Generator.Mappings; -using KY.Generator.Templates; -using KY.Generator.Templates.Extensions; -using KY.Generator.Transfer.Extensions; - -namespace KY.Generator.Transfer.Writers -{ - public abstract class TransferWriter : Codeable - { - protected ITypeMapping TypeMapping { get; } - - public TransferWriter(ITypeMapping typeMapping) - { - this.TypeMapping = typeMapping; - } - - protected virtual void AddConstants(ModelTransferObject model, ClassTemplate classTemplate, IConfiguration configuration) - { - foreach (FieldTransferObject constant in model.Constants) - { - FieldTemplate fieldTemplate = this.AddField(model, constant.Name, constant.Type, classTemplate, configuration).Constant(); - if (constant.Default != null) - { - Type type = constant.Default.GetType(); - if (type == typeof(int)) - { - fieldTemplate.DefaultValue = Code.Number((int)constant.Default); - } - else if (type == typeof(long)) - { - fieldTemplate.DefaultValue = Code.Number((long)constant.Default); - } - else if (type == typeof(short)) - { - fieldTemplate.DefaultValue = Code.Number((short)constant.Default); - } - else if (type == typeof(uint)) - { - fieldTemplate.DefaultValue = Code.Number((uint)constant.Default); - } - else if (type == typeof(ulong)) - { - fieldTemplate.DefaultValue = Code.Number((ulong)constant.Default); - } - else if (type == typeof(ushort)) - { - fieldTemplate.DefaultValue = Code.Number((ushort)constant.Default); - } - else if (type == typeof(float)) - { - fieldTemplate.DefaultValue = Code.Number((float)constant.Default); - } - else if (type == typeof(double)) - { - fieldTemplate.DefaultValue = Code.Number((double)constant.Default); - } - else if (type == typeof(DateTime)) - { - fieldTemplate.DefaultValue = Code.DateTime((DateTime)constant.Default); - } - else if (type == typeof(bool)) - { - fieldTemplate.DefaultValue = Code.Boolean((bool)constant.Default); - } - else - { - fieldTemplate.DefaultValue = Code.String(constant.Default.ToString()); - } - } - } - } - - protected virtual void AddFields(ModelTransferObject model, ClassTemplate classTemplate, IConfiguration configuration) - { - foreach (FieldTransferObject field in model.Fields) - { - if (configuration.Formatting.FieldsToProperties) - { - this.AddProperty(model, field.Name, field.Type, classTemplate, configuration); - } - else - { - this.AddField(model, field.Name, field.Type, classTemplate, configuration); - } - } - } - - protected virtual void AddProperties(ModelTransferObject model, ClassTemplate classTemplate, IConfiguration configuration) - { - foreach (PropertyTransferObject property in model.Properties) - { - if (configuration.Formatting.PropertiesToFields) - { - this.AddField(model, property.Name, property.Type, classTemplate, configuration); - } - else - { - this.AddProperty(model, property.Name, property.Type, classTemplate, configuration, property.CanRead, property.CanWrite); - } - } - } - - protected void MapType(ILanguage fromLanguage, ILanguage toLanguage, TypeTransferObject type) - { - if (fromLanguage is IMappableLanguage mappableFromLanguage && toLanguage is IMappableLanguage mappableToLanguage) - { - this.MapType(mappableFromLanguage, mappableToLanguage, type); - } - } - - protected virtual void MapType(IMappableLanguage fromLanguage, IMappableLanguage toLanguage, TypeTransferObject type) - { - if (type == null) - { - return; - } - this.TypeMapping.Get(fromLanguage, toLanguage, type); - type.Generics.ForEach(x => this.MapType(fromLanguage, toLanguage, x.Type)); - } - - protected virtual FieldTemplate AddField(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration) - { - if (model.Language is IMappableLanguage modelLanguage && configuration.Language is IMappableLanguage configurationLanguage) - { - this.MapType(modelLanguage, configurationLanguage, type); - } - this.AddUsing(type, classTemplate, configuration); - FieldTemplate fieldTemplate = classTemplate.AddField(name, type.ToTemplate()).Public().FormatName(configuration); - if (configuration.Formatting.WithOptionalProperties) - { - fieldTemplate.Optional(); - } - return fieldTemplate; - } - - protected virtual PropertyTemplate AddProperty(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration, bool canRead = true, bool canWrite = true) - { - if (model.Language is IMappableLanguage modelLanguage && configuration.Language is IMappableLanguage configurationLanguage) - { - this.MapType(modelLanguage, configurationLanguage, type); - } - PropertyTemplate propertyTemplate = classTemplate.AddProperty(name, type.ToTemplate()).FormatName(configuration); - propertyTemplate.HasGetter = canRead; - propertyTemplate.HasSetter = canWrite; - if (configuration.Formatting.WithOptionalProperties) - { - propertyTemplate.Optional(); - } - this.AddUsing(type, classTemplate, configuration); - return propertyTemplate; - } - - protected virtual void AddUsing(TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration, string relativeModelPath = "./") - { - if (type.Name == classTemplate.Name) - { - return; - } - if (type is ModelTransferObject model) - { - foreach (GenericAliasTransferObject generic in model.Generics) - { - this.AddUsing(generic.Type, classTemplate, configuration, relativeModelPath); - } - } - if ((!type.FromSystem || type.FromSystem && configuration.Language.ImportFromSystem) && type.HasUsing && !string.IsNullOrEmpty(type.Namespace) && classTemplate.Namespace.Name != type.Namespace) - { - string fileName = Formatter.FormatFile(type.Name, configuration, true); - classTemplate.AddUsing(type.Namespace, type.Name, $"{relativeModelPath.Replace("\\", "/").TrimEnd('/')}/{fileName}"); - } - type.Generics.Where(x => x.Alias == null).ForEach(generic => this.AddUsing(generic.Type, classTemplate, configuration, relativeModelPath)); - } - } -} diff --git a/Core/Writers/ClassWriter.cs b/Core/Writers/ClassWriter.cs deleted file mode 100644 index 26b38014..00000000 --- a/Core/Writers/ClassWriter.cs +++ /dev/null @@ -1,92 +0,0 @@ -using System.Linq; -using KY.Core; -using KY.Generator.Languages; -using KY.Generator.Models; -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Writers -{ - public class ClassWriter : ITemplateWriter - { - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - BaseLanguage language = output.Language.CastTo(); - ClassTemplate template = (ClassTemplate)fragment; - output.Add(template.Comment); - output.Add(template.Attributes); - output.Add(language.ClassScope).Add(" "); - if (template.IsAbstract && language.HasAbstractClasses && !template.IsInterface) - { - output.Add("abstract "); - } - if (template.IsStatic && language.HasStaticClasses) - { - output.Add("static "); - } - else if (!string.IsNullOrEmpty(language.PartialKeyword)) - { - output.Add(language.PartialKeyword).Add(" "); - } - if (template.IsInterface) - { - output.Add("interface "); - } - else - { - output.Add("class "); - } - output.Add(template.Name); - if (template.Generics.Count > 0) - { - output.Add("<").Add(template.Generics.Select(x => Code.Instance.Type(x.Name)), ", ").Add(">"); - } - template.BasedOn.OrderBy(x => x.ToType().IsInterface).ForEach(x => output.Add(x)); - output.Add(template.Generics.Select(x => x.ToConstraints()).Where(x => x.Types.Count > 0)); - output.StartBlock(); - if (template.IsInterface) - { - template.Fields.ForEach(x => x.Visibility = Visibility.None); - template.Properties.ForEach(x => x.Visibility = Visibility.None); - } - bool isFirst = true; - if (template.Classes.Count > 0) - { - output.Add(template.Classes); - isFirst = false; - } - if (template.Fields.Count > 0) - { - output.If(!isFirst).BreakLine().EndIf(); - output.Add(template.Fields); - isFirst = false; - } - if (template.Properties.Count > 0) - { - output.If(!isFirst).BreakLine().EndIf(); - output.Add(template.Properties); - isFirst = false; - } - if (template.Code != null) - { - output.If(!isFirst).BreakLine().EndIf(); - output.Add(template.Code); - isFirst = false; - } - if (template.Methods.Count > 0) - { - output.If(!isFirst).BreakLine().EndIf(); - MethodTemplate last = template.Methods.Last(); - foreach (MethodTemplate method in template.Methods) - { - output.Add(method); - if (method != last) - { - output.BreakLine(); - } - } - } - output.EndBlock(); - } - } -} \ No newline at end of file diff --git a/Core/Writers/EnumWriter.cs b/Core/Writers/EnumWriter.cs deleted file mode 100644 index 8d0b40ad..00000000 --- a/Core/Writers/EnumWriter.cs +++ /dev/null @@ -1,35 +0,0 @@ -using System.Linq; -using KY.Core; -using KY.Generator.Languages; -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Writers -{ - public class EnumWriter : Codeable, ITemplateWriter - { - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - BaseLanguage language = output.Language.CastTo(); - EnumTemplate template = (EnumTemplate)fragment; - output.Add(template.Attributes) - .Add(language.ClassScope) - .Add(" enum ") - .Add(template.Name); - if (template.BasedOn != null) - { - output.Add(" : ").Add(template.BasedOn); - } - output.StartBlock(); - EnumValueTemplate last = template.Values.LastOrDefault(); - foreach (EnumValueTemplate enumTemplateValue in template.Values) - { - output.Add($"{enumTemplateValue.FormattedName} = ") - .Add(enumTemplateValue.Value) - .Add(last == enumTemplateValue ? string.Empty : ",") - .BreakLine(); - } - output.EndBlock(); - } - } -} \ No newline at end of file diff --git a/Core/Writers/LambdaWriter.cs b/Core/Writers/LambdaWriter.cs deleted file mode 100644 index cb98855d..00000000 --- a/Core/Writers/LambdaWriter.cs +++ /dev/null @@ -1,41 +0,0 @@ -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Writers -{ - public class LambdaWriter : ITemplateWriter - { - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - LambdaTemplate template = (LambdaTemplate)fragment; - output.Add("("); - if (template.Parameters != null) - { - output.Add(template.Parameters, ", "); - } - else if (template.ParameterNames?.Count == 1) - { - output.Add(template.ParameterNames[0]); - } - else if (template.ParameterNames?.Count > 1) - { - output.Add(string.Join(", ", template.ParameterNames)); - } - output.Add(")") - .Add(" =>"); - if (template.Code is MultilineCodeFragment) - { - output.StartBlock(); - } - else - { - output.Add(" "); - } - output.Add(template.Code); - if (template.Code is MultilineCodeFragment) - { - output.EndBlock(output.Language.Formatting.StartBlockInNewLine); - } - } - } -} diff --git a/Core/Writers/MultilineCodeFragmentWriter.cs b/Core/Writers/MultilineCodeFragmentWriter.cs deleted file mode 100644 index fc75aa04..00000000 --- a/Core/Writers/MultilineCodeFragmentWriter.cs +++ /dev/null @@ -1,45 +0,0 @@ -using KY.Generator.Languages; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Templates.Extensions; - -namespace KY.Generator.Writers -{ - public class MultilineCodeFragmentWriter : ITemplateWriter - { - public ILanguage Language { get; } - - public MultilineCodeFragmentWriter(ILanguage language) - { - this.Language = language; - } - - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - MultilineCodeFragment template = (MultilineCodeFragment)fragment; - foreach (ICodeFragment codeFragment in template.Fragments) - { - output.Add(codeFragment); - } - } - - //public virtual void Write(IMetaElementList elements, ICodeFragment codeFragment) - //{ - // MultilineCodeFragment fragment = (MultilineCodeFragment)codeFragment; - // foreach (ICodeFragment innerFragment in fragment.Fragments) - // { - // elements.Add(innerFragment, this.Language); - // } - //} - - //public virtual void Write(IMetaFragmentList fragments, ICodeFragment codeFragment) - //{ - // MultilineCodeFragment fragment = (MultilineCodeFragment)codeFragment; - // foreach (ICodeFragment innerFragment in fragment.Fragments) - // { - // fragments.Add(innerFragment, this.Language); - // fragments.AddNewLine(); - // } - //} - } -} \ No newline at end of file diff --git a/Core/Writers/StringWriter.cs b/Core/Writers/StringWriter.cs deleted file mode 100644 index 298bd935..00000000 --- a/Core/Writers/StringWriter.cs +++ /dev/null @@ -1,14 +0,0 @@ -using KY.Generator.Output; -using KY.Generator.Templates; - -namespace KY.Generator.Writers -{ - public class StringWriter : ITemplateWriter - { - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - StringTemplate template = (StringTemplate)fragment; - output.Add($"\"{template.Value}\""); - } - } -} \ No newline at end of file diff --git a/Core/packages.config b/Core/packages.config deleted file mode 100644 index 07e35931..00000000 --- a/Core/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/Csharp.Tests/KY.Generator.Csharp.Tests.csproj b/Csharp.Tests/KY.Generator.Csharp.Tests.csproj index 416159ff..9546c309 100644 --- a/Csharp.Tests/KY.Generator.Csharp.Tests.csproj +++ b/Csharp.Tests/KY.Generator.Csharp.Tests.csproj @@ -1,21 +1,23 @@  - netcoreapp2.1 + net6.0 false + + latest - + - - + + diff --git a/Csharp.Tests/TemplateWriterTests.cs b/Csharp.Tests/TemplateWriterTests.cs index 9d6543f7..1aac0d75 100644 --- a/Csharp.Tests/TemplateWriterTests.cs +++ b/Csharp.Tests/TemplateWriterTests.cs @@ -1,226 +1,228 @@ using System.Collections.Generic; -using KY.Core; using KY.Core.Dependency; using KY.Generator.Csharp.Extensions; using KY.Generator.Csharp.Languages; using KY.Generator.Csharp.Templates; using KY.Generator.Csharp.Writers; -using KY.Generator.Languages; using KY.Generator.Output; using KY.Generator.Templates; using KY.Generator.Templates.Extensions; using KY.Generator.Writers; using Microsoft.VisualStudio.TestTools.UnitTesting; using CommentWriter = KY.Generator.Csharp.Writers.CommentWriter; +using FileWriter = KY.Generator.Output.FileWriter; -namespace KY.Generator.Csharp.Tests +namespace KY.Generator.Csharp.Tests; + +[TestClass] +public class TemplateWriterTests : Codeable { - [TestClass] - public class TemplateWriterTests : Codeable - { - private IDependencyResolver resolver; - private IOutputCache output; - - [TestInitialize] - public void Initialize() - { - this.resolver = new DependencyResolver(); - this.output = new FileWriter(CsharpLanguage.Instance); - } - - [TestMethod] - public void AttributeWriter() - { - AttributeWriter writer = new AttributeWriter(this.output.Language.CastTo()); - writer.Write(new AttributeTemplate("test"), this.output); - Assert.AreEqual("[test]", this.output.ToString()); - } - - [TestMethod] - public void AttributeWithStringValue() - { - AttributeWriter writer = new AttributeWriter(this.output.Language.CastTo()); - writer.Write(new AttributeTemplate("test", Code.String("value")), this.output); - Assert.AreEqual("[test(\"value\")]", this.output.ToString()); - } - - [TestMethod] - public void AttributeWithProperty() - { - AttributeTemplate template = new AttributeTemplate("test"); - template.Properties.Add("key", "value"); - AttributeWriter writer = new AttributeWriter(this.output.Language.CastTo()); - writer.Write(template, this.output); - Assert.AreEqual("[test(key = \"value\")]", this.output.ToString()); - } - - [TestMethod] - public void AttributeOnProperty() - { - PropertyTemplate template = new PropertyTemplate(null, "Property", Code.Type("string")) + private IDependencyResolver resolver; + private IOutputCache output; + private Options options; + + [TestInitialize] + public void Initialize() + { + this.resolver = new DependencyResolver(); + this.options = new Options(); + GeneratorOptions generatorOptions = this.options.Get(); + generatorOptions.Language = new CsharpLanguage(this.resolver); + this.output = new FileWriter(generatorOptions); + } + + [TestMethod] + public void AttributeWriter() + { + AttributeWriter writer = new(); + writer.Write(new AttributeTemplate("test"), this.output); + Assert.AreEqual("[test]", this.output.ToString()); + } + + [TestMethod] + public void AttributeWithStringValue() + { + AttributeWriter writer = new(); + writer.Write(new AttributeTemplate("test", Code.String("value")), this.output); + Assert.AreEqual("[test(\"value\")]", this.output.ToString()); + } + + [TestMethod] + public void AttributeWithProperty() + { + AttributeTemplate template = new("test"); + template.Properties.Add("key", Code.String("value")); + AttributeWriter writer = new(); + writer.Write(template, this.output); + Assert.AreEqual("[test(key = \"value\")]", this.output.ToString()); + } + + [TestMethod] + public void AttributeOnProperty() + { + PropertyTemplate template = new PropertyTemplate(null, "Property", Code.Type("string")) + .WithAttribute("Attribute", Code.String("value")); + this.output.Add(template); + Assert.AreEqual("[Attribute(\"value\")]\r\npublic string Property { get; set; }", this.output.ToString()); + } + + [TestMethod] + public void AttributeOnMultiplePropertiesInClass() + { + ClassTemplate template = new((NamespaceTemplate)null, "MyClass"); + template.AddProperty("Property1", Code.Type("string")) .WithAttribute("Attribute", Code.String("value")); - this.output.Language.Write(template, this.output); - Assert.AreEqual("[Attribute(\"value\")]\r\npublic string Property { get; set; }", this.output.ToString()); - } - - [TestMethod] - public void AttributeOnMultiplePropertiesInClass() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "MyClass"); - template.AddProperty("Property1", Code.Type("string")) - .WithAttribute("Attribute", Code.String("value")); - template.AddProperty("Property2", Code.Type("string")) - .WithAttribute("Attribute", Code.String("value")); - this.output.Language.Write(template, this.output); - Assert.AreEqual("public partial class MyClass\r\n{\r\n [Attribute(\"value\")]\r\n public string Property1 { get; set; }\r\n\r\n [Attribute(\"value\")]\r\n public string Property2 { get; set; }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void BaseTypeWriter() - { - BaseTypeWriter writer = new BaseTypeWriter(); - writer.Write(new BaseTypeTemplate(new ClassTemplate((ClassTemplate)null, "test"), Code.Type("type")), this.output); - Assert.AreEqual(" : type", this.output.ToString()); - } - - [TestMethod] - public void CastWriter() - { - CastWriter writer = new CastWriter(); - writer.Write(new CastTemplate(Code.Type("type")).Local("variable"), this.output); - Assert.AreEqual("(type)variable", this.output.ToString()); - } - - [TestMethod] - public void CommentWriter() - { - CommentWriter writer = new CommentWriter(); - writer.Write(new CommentTemplate("Summary here", CommentType.Summary), this.output); - Assert.AreEqual("/// \r\n/// Summary here\r\n/// ", this.output.ToString()); - } - - [TestMethod] - public void ConstraintWriter() - { - ConstraintWriter writer = new ConstraintWriter(); - writer.Write(new ConstraintTemplate("T", new List { Code.Type("type") }), this.output); - Assert.AreEqual("\r\n where T : type", this.output.ToString()); - } - - [TestMethod] - public void ConstructorWriter() - { - ConstructorWriter writer = new ConstructorWriter(); - ClassTemplate classTemplate = new ClassTemplate((NamespaceTemplate)null, "Test"); - writer.Write(new ConstructorTemplate(classTemplate), this.output); - Assert.AreEqual("public Test()\r\n{\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ConstructorWithBaseCall() - { - ConstructorWriter writer = new ConstructorWriter(); - ClassTemplate classTemplate = new ClassTemplate((NamespaceTemplate)null, "Test"); - writer.Write(new ConstructorTemplate(classTemplate).WithBaseConstructor(), this.output); - Assert.AreEqual("public Test()\r\n : base()\r\n{\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ConstructorWithThisCall() - { - ConstructorWriter writer = new ConstructorWriter(); - ClassTemplate classTemplate = new ClassTemplate((NamespaceTemplate)null, "Test"); - writer.Write(new ConstructorTemplate(classTemplate).WithThisConstructor(), this.output); - Assert.AreEqual("public Test()\r\n : this()\r\n{\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassOnePropertyAndOneConstructor() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddProperty("Prop1", Code.Type("string")); - template.AddConstructor(); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n public test()\r\n {\r\n }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassOneNormalPropertyAndOnePropertyWithAttribute() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddProperty("Prop1", Code.Type("string")); - template.AddProperty("Prop2", Code.Type("string")).WithAttribute("attr"); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n [attr]\r\n public string Prop2 { get; set; }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void ClassOnePropertyWithAttributeAndOneNormalProperty() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddProperty("Prop1", Code.Type("string")).WithAttribute("attr"); - template.AddProperty("Prop2", Code.Type("string")); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("public partial class test\r\n{\r\n [attr]\r\n public string Prop1 { get; set; }\r\n\r\n public string Prop2 { get; set; }\r\n}", this.output.ToString()); - } - - [TestMethod] - public void DeclareWriter() - { - DeclareWriter writer = new DeclareWriter(); - writer.Write(new DeclareTemplate(Code.Type("type"), "variable", Code.String("string")), this.output); - Assert.AreEqual("type variable = \"string\";", this.output.ToString()); - } - - [TestMethod] - public void ParameterWriter() - { - ParameterWriter writer = new ParameterWriter(); - writer.Write(new ParameterTemplate(Code.Type("type"), "parameter"), this.output); - Assert.AreEqual("type parameter", this.output.ToString()); - } - - [TestMethod] - public void ParameterWithDefaultValue() - { - ParameterWriter writer = new ParameterWriter(); - writer.Write(new ParameterTemplate(Code.Type("type"), "parameter", Code.String("default")), this.output); - Assert.AreEqual("type parameter = \"default\"", this.output.ToString()); - } - - [TestMethod] - public void ParameterWithAttribute() - { - ParameterWriter writer = new ParameterWriter(); - writer.Write(new ParameterTemplate(Code.Type("Type"), "parameter").WithAttribute("Attr"), this.output); - Assert.AreEqual("[Attr] Type parameter", this.output.ToString()); - } - - [TestMethod] - public void ThrowWriter() - { - ThrowWriter writer = new ThrowWriter(); - writer.Write(new ThrowTemplate(Code.Type("type")), this.output); - Assert.AreEqual("throw new type();", this.output.ToString()); - } - - [TestMethod] - public void ThrowWithParameter() - { - ThrowWriter writer = new ThrowWriter(); - writer.Write(new ThrowTemplate(Code.Type("type"), Code.Local("parameter")), this.output); - Assert.AreEqual("throw new type(parameter);", this.output.ToString()); - } - - [TestMethod] - public void UsingWriter() - { - UsingWriter writer = new UsingWriter(); - writer.Write(new UsingTemplate("test", null, null), this.output); - Assert.AreEqual("using test;", this.output.ToString()); - } - } -} + template.AddProperty("Property2", Code.Type("string")) + .WithAttribute("Attribute", Code.String("value")); + this.output.Add(template); + Assert.AreEqual("public partial class MyClass\r\n{\r\n [Attribute(\"value\")]\r\n public string Property1 { get; set; }\r\n\r\n [Attribute(\"value\")]\r\n public string Property2 { get; set; }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void BaseTypeWriter() + { + BaseTypeWriter writer = new(); + writer.Write(new BaseTypeTemplate(new ClassTemplate((ClassTemplate)null, "test"), Code.Type("type")), this.output); + Assert.AreEqual(" : type", this.output.ToString()); + } + + [TestMethod] + public void CastWriter() + { + CastWriter writer = new(); + writer.Write(new CastTemplate(Code.Type("type")).Local("variable"), this.output); + Assert.AreEqual("(type)variable", this.output.ToString()); + } + + [TestMethod] + public void CommentWriter() + { + CommentWriter writer = new(); + writer.Write(new CommentTemplate("Summary here", CommentType.Summary), this.output); + Assert.AreEqual("/// \r\n/// Summary here\r\n/// ", this.output.ToString()); + } + + [TestMethod] + public void ConstraintWriter() + { + ConstraintWriter writer = new(); + writer.Write(new ConstraintTemplate("T", new List { Code.Type("type") }), this.output); + Assert.AreEqual("\r\n where T : type", this.output.ToString()); + } + + [TestMethod] + public void ConstructorWriter() + { + ConstructorWriter writer = new(); + ClassTemplate classTemplate = new((NamespaceTemplate)null, "Test"); + writer.Write(new ConstructorTemplate(classTemplate), this.output); + Assert.AreEqual("public Test()\r\n{\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ConstructorWithBaseCall() + { + ConstructorWriter writer = new(); + ClassTemplate classTemplate = new((NamespaceTemplate)null, "Test"); + writer.Write(new ConstructorTemplate(classTemplate).WithBaseConstructor(), this.output); + Assert.AreEqual("public Test()\r\n : base()\r\n{\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ConstructorWithThisCall() + { + ConstructorWriter writer = new(); + ClassTemplate classTemplate = new((NamespaceTemplate)null, "Test"); + writer.Write(new ConstructorTemplate(classTemplate).WithThisConstructor(), this.output); + Assert.AreEqual("public Test()\r\n : this()\r\n{\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassOnePropertyAndOneConstructor() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddProperty("Prop1", Code.Type("string")); + template.AddConstructor(); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n public test()\r\n {\r\n }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassOneNormalPropertyAndOnePropertyWithAttribute() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddProperty("Prop1", Code.Type("string")); + template.AddProperty("Prop2", Code.Type("string")).WithAttribute("attr"); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public partial class test\r\n{\r\n public string Prop1 { get; set; }\r\n\r\n [attr]\r\n public string Prop2 { get; set; }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void ClassOnePropertyWithAttributeAndOneNormalProperty() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddProperty("Prop1", Code.Type("string")).WithAttribute("attr"); + template.AddProperty("Prop2", Code.Type("string")); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("public partial class test\r\n{\r\n [attr]\r\n public string Prop1 { get; set; }\r\n\r\n public string Prop2 { get; set; }\r\n}", this.output.ToString()); + } + + [TestMethod] + public void DeclareWriter() + { + DeclareWriter writer = new(); + writer.Write(new DeclareTemplate(Code.Type("type"), "variable", Code.String("string")), this.output); + Assert.AreEqual("type variable = \"string\";", this.output.ToString()); + } + + [TestMethod] + public void ParameterWriter() + { + ParameterWriter writer = new(); + writer.Write(new ParameterTemplate(Code.Type("type"), "parameter"), this.output); + Assert.AreEqual("type parameter", this.output.ToString()); + } + + [TestMethod] + public void ParameterWithDefaultValue() + { + ParameterWriter writer = new(); + writer.Write(new ParameterTemplate(Code.Type("type"), "parameter", Code.String("default")), this.output); + Assert.AreEqual("type parameter = \"default\"", this.output.ToString()); + } + + [TestMethod] + public void ParameterWithAttribute() + { + ParameterWriter writer = new(); + writer.Write(new ParameterTemplate(Code.Type("Type"), "parameter").WithAttribute("Attr"), this.output); + Assert.AreEqual("[Attr] Type parameter", this.output.ToString()); + } + + [TestMethod] + public void ThrowWriter() + { + ThrowWriter writer = new(); + writer.Write(new ThrowTemplate(Code.Type("type")), this.output); + Assert.AreEqual("throw new type();", this.output.ToString()); + } + + [TestMethod] + public void ThrowWithParameter() + { + ThrowWriter writer = new(); + writer.Write(new ThrowTemplate(Code.Type("type"), Code.Local("parameter")), this.output); + Assert.AreEqual("throw new type(parameter);", this.output.ToString()); + } + + [TestMethod] + public void UsingWriter() + { + UsingWriter writer = new(); + writer.Write(new UsingTemplate("test", null, null), this.output); + Assert.AreEqual("using test;", this.output.ToString()); + } +} \ No newline at end of file diff --git a/Csharp/CsharpModule.cs b/Csharp/CsharpModule.cs index 24e93f49..50c37de8 100644 --- a/Csharp/CsharpModule.cs +++ b/Csharp/CsharpModule.cs @@ -10,7 +10,7 @@ public class CsharpModule : ModuleBase public CsharpModule(IDependencyResolver dependencyResolver) : base(dependencyResolver) { - this.DependencyResolver.Bind().To(CsharpLanguage.Instance); + this.DependencyResolver.Bind().To(); } } -} \ No newline at end of file +} diff --git a/Csharp/KY.Generator.CSharp.csproj b/Csharp/KY.Generator.CSharp.csproj index b1fe741f..314d14be 100644 --- a/Csharp/KY.Generator.CSharp.csproj +++ b/Csharp/KY.Generator.CSharp.csproj @@ -1,35 +1,42 @@  - - netstandard2.0 - KY-Programming - KY-Programming - KY.Generator - 7.6.0 - C# Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator C# - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + KY.Generator + 10.0.0-preview.2 + C# Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - + + + - - - + + + + diff --git a/Csharp/Languages/CsharpLanguage.cs b/Csharp/Languages/CsharpLanguage.cs index a2df4b9d..62dd7e7c 100644 --- a/Csharp/Languages/CsharpLanguage.cs +++ b/Csharp/Languages/CsharpLanguage.cs @@ -1,73 +1,89 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using KY.Core.Dependency; using KY.Generator.Csharp.Templates; using KY.Generator.Csharp.Writers; -using KY.Generator.Extensions; using KY.Generator.Languages; -using KY.Generator.Output; using KY.Generator.Templates; -namespace KY.Generator.Csharp.Languages -{ - public class CsharpLanguage : BaseLanguage - { - public static CsharpLanguage Instance { get; } = new CsharpLanguage(); - - public override string Name => "Csharp"; - public override bool ImportFromSystem => true; - - protected CsharpLanguage() - { - this.Formatting.FileCase = Case.PascalCase; - this.Formatting.ClassCase = Case.PascalCase; - this.Formatting.FieldCase = Case.CamelCase; - this.Formatting.PropertyCase = Case.PascalCase; - this.Formatting.MethodCase = Case.PascalCase; - this.Formatting.ParameterCase = Case.CamelCase; +namespace KY.Generator.Csharp.Languages; - this.TemplateWriters[typeof(AttributeTemplate)] = new AttributeWriter(this); - this.TemplateWriters[typeof(BaseTypeTemplate)] = new BaseTypeWriter(); - this.TemplateWriters[typeof(BaseTemplate)] = new BaseWriter(); - this.TemplateWriters[typeof(CastTemplate)] = new CastWriter(); - this.TemplateWriters[typeof(CommentTemplate)] = new CommentWriter(); - this.TemplateWriters[typeof(ConstructorTemplate)] = new ConstructorWriter(); - this.TemplateWriters[typeof(ConstraintTemplate)] = new ConstraintWriter(); - this.TemplateWriters[typeof(CsharpTemplate)] = new CsharpWriter(); - this.TemplateWriters[typeof(DeclareTemplate)] = new DeclareWriter(); - this.TemplateWriters[typeof(GenericTypeTemplate)] = new CsharpGenericTypeWriter(); - this.TemplateWriters[typeof(ParameterTemplate)] = new ParameterWriter(); - this.TemplateWriters[typeof(ThrowTemplate)] = new ThrowWriter(); - this.TemplateWriters[typeof(UsingTemplate)] = new UsingWriter(); - this.TemplateWriters[typeof(UsingDeclarationTemplate)] = new UsingDeclarationWriter(); - this.TemplateWriters[typeof(VerbatimStringTemplate)] = new VerbatimStringWriter(); - this.TemplateWriters[typeof(ClassTemplate)] = new CsharpClassWriter(); - this.TemplateWriters[typeof(YieldReturnTemplate)] = new YieldReturnWriter(); - } +public class CsharpLanguage : BaseLanguage +{ + public override string Name => "Csharp"; + public override bool ImportFromSystem => true; + public override bool IsGenericTypeWithSameNameAllowed => true; - protected override void WriteHeader(FileTemplate fileTemplate, IOutputCache output) - { - fileTemplate.Header.Description += Environment.NewLine + "ReSharper disable All"; - base.WriteHeader(fileTemplate, output); - } + public CsharpLanguage(IDependencyResolver resolver) + : base(resolver) + { + this.Formatting.InterfacePrefix = "I"; - public override void Write(FileTemplate fileTemplate, IOutput output) - { - INamespaceChildren children = fileTemplate.Namespaces.FirstOrDefault()?.Children.FirstOrDefault(); - UsingTemplate usingTemplate = new UsingTemplate("System.CodeDom.Compiler", null, null); - children?.Usings.Add(usingTemplate); - base.Write(fileTemplate, output); - children?.Usings.Remove(usingTemplate); - } + this.ReservedKeywords.Add("abstract", "abstractValue"); + this.ReservedKeywords.Add("base", "baseValue"); + this.ReservedKeywords.Add("bool", "boolValue"); + this.ReservedKeywords.Add("byte", "byteValue"); + this.ReservedKeywords.Add("char", "charValue"); + this.ReservedKeywords.Add("checked", "checkedValue"); + this.ReservedKeywords.Add("decimal", "decimalValue"); + this.ReservedKeywords.Add("delegate", "delegateValue"); + this.ReservedKeywords.Add("double", "doubleValue"); + this.ReservedKeywords.Add("event", "eventValue"); + this.ReservedKeywords.Add("explicit", "explicitValue"); + this.ReservedKeywords.Add("extern", "externValue"); + this.ReservedKeywords.Add("fixed", "fixedValue"); + this.ReservedKeywords.Add("float", "floatValue"); + this.ReservedKeywords.Add("foreach", "foreachValue"); + this.ReservedKeywords.Add("goto", "gotoValue"); + this.ReservedKeywords.Add("implicit", "implicitValue"); + this.ReservedKeywords.Add("int", "intValue"); + this.ReservedKeywords.Add("internal", "internalValue"); + this.ReservedKeywords.Add("is", "isValue"); + this.ReservedKeywords.Add("lock", "lockValue"); + this.ReservedKeywords.Add("long", "longValue"); + this.ReservedKeywords.Add("object", "objectValue"); + this.ReservedKeywords.Add("operator", "operatorValue"); + this.ReservedKeywords.Add("out", "outValue"); + this.ReservedKeywords.Add("override", "overrideValue"); + this.ReservedKeywords.Add("params", "paramsValue"); + this.ReservedKeywords.Add("readonly", "readonlyValue"); + this.ReservedKeywords.Add("ref", "refValue"); + this.ReservedKeywords.Add("sbyte", "sbyteValue"); + this.ReservedKeywords.Add("sealed", "sealedValue"); + this.ReservedKeywords.Add("short", "shortValue"); + this.ReservedKeywords.Add("sizeof", "sizeofValue"); + this.ReservedKeywords.Add("stackalloc", "stackallocValue"); + this.ReservedKeywords.Add("string", "stringValue"); + this.ReservedKeywords.Add("struct", "structValue"); + this.ReservedKeywords.Add("uint", "uintValue"); + this.ReservedKeywords.Add("ulong", "ulongValue"); + this.ReservedKeywords.Add("unchecked", "uncheckedValue"); + this.ReservedKeywords.Add("unsafe", "unsafeValue"); + this.ReservedKeywords.Add("ushort", "ushortValue"); + this.ReservedKeywords.Add("using", "usingValue"); + this.ReservedKeywords.Add("virtual", "virtualValue"); + this.ReservedKeywords.Add("volatile", "volatileValue"); - public override string FormatFileName(string fileName, string fileType = null) - { - return fileName.ToPascalCase() + ".cs"; - } + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + } - protected override IEnumerable GetUsings(FileTemplate fileTemplate) - { - return fileTemplate.GetUsingsByNamespace(); - } + public override string FormatFile(string name, GeneratorOptions options, string type = null, bool force = false) + { + return base.FormatFile(name, options, type, force) + ".cs"; } } diff --git a/Csharp/Writers/AttributeWriter.cs b/Csharp/Writers/AttributeWriter.cs index b94b6ccf..6c9fdca8 100644 --- a/Csharp/Writers/AttributeWriter.cs +++ b/Csharp/Writers/AttributeWriter.cs @@ -8,13 +8,6 @@ namespace KY.Generator.Csharp.Writers { public class AttributeWriter : ITemplateWriter { - protected BaseLanguage Language { get; } - - public AttributeWriter(BaseLanguage language) - { - this.Language = language; - } - public virtual void Write(ICodeFragment fragment, IOutputCache output) { AttributeTemplate template = (AttributeTemplate)fragment; @@ -29,9 +22,9 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) } if (template.Properties.Count > 0) { - foreach (KeyValuePair pair in template.Properties) + foreach (KeyValuePair pair in template.Properties) { - output.Add($"{pair.Key} = {this.Language.ConvertValue(pair.Value)}"); + output.Add($"{pair.Key} = ").Add(pair.Value); } } output.Add(")"); diff --git a/Csharp/Writers/CsharpClassWriter.cs b/Csharp/Writers/CsharpClassWriter.cs index ccdf53a9..d6cb2803 100644 --- a/Csharp/Writers/CsharpClassWriter.cs +++ b/Csharp/Writers/CsharpClassWriter.cs @@ -8,6 +8,10 @@ namespace KY.Generator.Csharp.Writers { public class CsharpClassWriter : ClassWriter { + public CsharpClassWriter(Options options) + : base(options) + { } + public override void Write(ICodeFragment fragment, IOutputCache output) { AssemblyName assemblyName = (Assembly.GetEntryAssembly() ?? Assembly.GetCallingAssembly()).GetName(); diff --git a/Csharp/Writers/CsharpFileWriter.cs b/Csharp/Writers/CsharpFileWriter.cs new file mode 100644 index 00000000..5ab6d64e --- /dev/null +++ b/Csharp/Writers/CsharpFileWriter.cs @@ -0,0 +1,27 @@ +using System; +using System.Linq; +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.Writers; + +namespace KY.Generator.Csharp.Writers +{ + public class CsharpFileWriter : FileWriter + { + public override void Write(ICodeFragment fragment, IOutputCache output) + { + FileTemplate template = (FileTemplate)fragment; + INamespaceChildren children = template.Namespaces.FirstOrDefault()?.Children.FirstOrDefault(); + UsingTemplate usingTemplate = new("System.CodeDom.Compiler", null, null); + children?.Usings.Add(usingTemplate); + base.Write(template, output); + children?.Usings.Remove(usingTemplate); + } + + protected override void WriteHeader(FileTemplate fileTemplate, IOutputCache output, bool appendBlankLine = true) + { + fileTemplate.Header.Description += Environment.NewLine + "ReSharper disable All"; + base.WriteHeader(fileTemplate, output, appendBlankLine); + } + } +} diff --git a/Csharp/Writers/VerbatimStringWriter.cs b/Csharp/Writers/VerbatimStringWriter.cs index 4bb3f5aa..a43f35db 100644 --- a/Csharp/Writers/VerbatimStringWriter.cs +++ b/Csharp/Writers/VerbatimStringWriter.cs @@ -1,17 +1,27 @@ using KY.Generator.Csharp.Templates; using KY.Generator.Output; using KY.Generator.Templates; -using KY.Generator.Writers; +using StringWriter = KY.Generator.Writers.StringWriter; -namespace KY.Generator.Csharp.Writers +namespace KY.Generator.Csharp.Writers; + +public class VerbatimStringWriter : StringWriter { - public class VerbatimStringWriter : StringWriter + private readonly Options options; + + public VerbatimStringWriter(Options options) + : base(options) + { + this.options = options; + } + + public override void Write(ICodeFragment fragment, IOutputCache output) { - public override void Write(ICodeFragment fragment, IOutputCache output) - { - VerbatimStringTemplate template = (VerbatimStringTemplate)fragment; - output.Add($"@\"{template.Value}\"", true); - // base.Write(fragment, output); - } + GeneratorOptions generatorOptions = this.options.Get(); + VerbatimStringTemplate template = (VerbatimStringTemplate)fragment; + output.Add("@") + .Add(generatorOptions.Formatting.Quote) + .Add(template.Value, true) + .Add(generatorOptions.Formatting.Quote); } } diff --git a/EntityFramework/Configurations/EntityFrameworkWriteConfiguration.cs b/EntityFramework/Configurations/EntityFrameworkWriteConfiguration.cs index 82c2d9f8..ef2a3e75 100644 --- a/EntityFramework/Configurations/EntityFrameworkWriteConfiguration.cs +++ b/EntityFramework/Configurations/EntityFrameworkWriteConfiguration.cs @@ -1,14 +1,11 @@ using System.Collections.Generic; -using KY.Generator.Configurations; -using KY.Generator.Csharp.Languages; namespace KY.Generator.EntityFramework.Configurations { - public class EntityFrameworkWriteConfiguration : ConfigurationBase, IFormattableConfiguration + public class EntityFrameworkWriteConfiguration { public string Namespace { get; set; } public string RelativePath { get; set; } - public bool FormatNames { get; set; } public List Repositories { get; set; } public virtual bool IsCore => false; public List Usings { get; set; } @@ -18,11 +15,11 @@ public class EntityFrameworkWriteConfiguration : ConfigurationBase, IFormattable public EntityFrameworkWriteConfiguration() { - this.Language = CsharpLanguage.Instance; + // this.Language = CsharpLanguage.Instance; this.Repositories = new List(); this.Usings = new List(); //this.Fluent = new List(); this.DataContext = new EntityFrameworkDataContextConfiguration(); } } -} \ No newline at end of file +} diff --git a/EntityFramework/EntityFrameworkModule.cs b/EntityFramework/EntityFrameworkModule.cs index 038ef2e7..fc81bbba 100644 --- a/EntityFramework/EntityFrameworkModule.cs +++ b/EntityFramework/EntityFrameworkModule.cs @@ -1,8 +1,5 @@ using KY.Core.Dependency; using KY.Core.Module; -using KY.Generator.Configuration; -using KY.Generator.EntityFramework.Configurations; -using KY.Generator.EntityFramework.Writers; namespace KY.Generator.EntityFramework { @@ -10,10 +7,6 @@ public class EntityFrameworkModule : ModuleBase { public EntityFrameworkModule(IDependencyResolver dependencyResolver) : base(dependencyResolver) - { - this.DependencyResolver.Get() - .Map("ef") - .Map("ef-core"); - } + { } } -} \ No newline at end of file +} diff --git a/EntityFramework/KY.Generator.EntityFramework.csproj b/EntityFramework/KY.Generator.EntityFramework.csproj index 770d5a28..1bfa8094 100644 --- a/EntityFramework/KY.Generator.EntityFramework.csproj +++ b/EntityFramework/KY.Generator.EntityFramework.csproj @@ -1,37 +1,43 @@  - - netstandard2.0 - KY-Programming - KY-Programming - KY.Generator - 7.6.0 - 2021 - KY-Programming - EntityFramework Module for KY-Generator -Download KY.Generator to use this module - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator EntityFramework EF - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + KY.Generator + 7.6.0 + 2025 - KY-Programming + EntityFramework Module for KY-Generator + Download KY.Generator to use this module + + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator EntityFramework EF + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - + + + + + - - - - - + + + + diff --git a/EntityFramework/Writers/EntityFrameworkDataContextWriter.cs b/EntityFramework/Writers/EntityFrameworkDataContextWriter.cs index b3bb0267..b8da9235 100644 --- a/EntityFramework/Writers/EntityFrameworkDataContextWriter.cs +++ b/EntityFramework/Writers/EntityFrameworkDataContextWriter.cs @@ -10,76 +10,88 @@ using KY.Generator.Transfer.Extensions; using KY.Generator.Tsql.Transfers; -namespace KY.Generator.EntityFramework.Writers +namespace KY.Generator.EntityFramework.Writers; + +public class EntityFrameworkDataContextWriter : Codeable { - public class EntityFrameworkDataContextWriter : Codeable + private readonly Options options; + private readonly List transferObjects; + private readonly List files; + + public EntityFrameworkDataContextWriter(Options options, List transferObjects, List files) + { + this.options = options; + this.transferObjects = transferObjects; + this.files = files; + } + + public virtual void Write(EntityFrameworkWriteConfiguration configuration) + { + this.WriteClass(configuration); + } + + protected virtual ClassTemplate WriteClass(EntityFrameworkWriteConfiguration configuration) { - public virtual void Write(EntityFrameworkWriteConfiguration configuration, List transferObjects, List files) + string className = "DataContext"; + ClassTemplate dataContext = this.files.AddFile(configuration.RelativePath, this.options.Get()) + .WithName(Formatter.FormatFile(className, this.options.Get())) + .AddNamespace(configuration.Namespace) + .AddClass(className, Code.Type("DbContext")); + + if (configuration.IsCore) { - this.WriteClass(configuration, transferObjects, files); + dataContext.WithUsing("Microsoft.EntityFrameworkCore"); } - - protected virtual ClassTemplate WriteClass(EntityFrameworkWriteConfiguration configuration, List transferObjects, List files) + else { - ClassTemplate dataContext = files.AddFile(configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - .AddNamespace(configuration.Namespace) - .AddClass("DataContext", Code.Type("DbContext")); - - if (configuration.IsCore) - { - dataContext.WithUsing("Microsoft.EntityFrameworkCore"); - } - else - { - dataContext.WithUsing("System.Data.Entity"); - } + dataContext.WithUsing("System.Data.Entity"); + } - configuration.Usings.ForEach(x => dataContext.AddUsing(x)); + configuration.Usings.ForEach(x => dataContext.AddUsing(x)); - PropertyTemplate defaultConnectionProperty = dataContext.AddProperty("DefaultConnection", Code.Type("string")).Static().WithDefaultValue(Code.String("name=DataContext")); + PropertyTemplate defaultConnectionProperty = dataContext.AddProperty("DefaultConnection", Code.Type("string")).Static().WithDefaultValue(Code.String("name=DataContext")); - foreach (EntityTransferObject entity in transferObjects.OfType()) - { - dataContext.AddProperty(entity.Name, Code.Generic("DbSet", entity.Model.ToTemplate())) - .FormatName(configuration) - .Virtual(); - } + foreach (EntityTransferObject entity in this.transferObjects.OfType()) + { + dataContext.AddProperty(entity.Name, Code.Generic("DbSet", entity.Model.ToTemplate())) + .FormatName(this.options.Get()) + .Virtual(); + } - dataContext.AddConstructor() - .WithThisConstructor(Code.Null()); + dataContext.AddConstructor() + .WithThisConstructor(Code.Null()); - ConstructorTemplate constructor = dataContext.AddConstructor(); - ParameterTemplate connectionString = constructor.AddParameter(Code.Type("string"), "connectionString"); - if (configuration.IsCore) - { - constructor.WithBaseConstructor(Code.Static(Code.Type("SqlServerDbContextOptionsExtensions")).Method("UseSqlServer", Code.New(Code.Type("DbContextOptionsBuilder")), Code.Local(connectionString).NullCoalescing().Local(defaultConnectionProperty)).Property("Options")) - .Code.AddLine(Code.This().Property("Database").Method("SetCommandTimeout", Code.Number(configuration.DataContext.CommandTimeout)).Close()); - } - else - { - constructor.WithBaseConstructor(Code.Local("connectionString").NullCoalescing().Local(defaultConnectionProperty)) - .Code.AddLine(Code.This().Property("Database").Property("CommandTimeout").Assign(Code.Number(configuration.DataContext.CommandTimeout)).Close()); - } + ConstructorTemplate constructor = dataContext.AddConstructor(); + ParameterTemplate connectionString = constructor.AddParameter(Code.Type("string"), "connectionString"); + if (configuration.IsCore) + { + constructor.WithBaseConstructor(Code.Static(Code.Type("SqlServerDbContextOptionsExtensions")).Method("UseSqlServer", Code.New(Code.Type("DbContextOptionsBuilder")), Code.Local(connectionString).NullCoalescing().Local(defaultConnectionProperty)).Property("Options")) + .Code.AddLine(Code.This().Property("Database").Method("SetCommandTimeout", Code.Number(configuration.DataContext.CommandTimeout)).Close()); + } + else + { + constructor.WithBaseConstructor(Code.Local("connectionString").NullCoalescing().Local(defaultConnectionProperty)) + .Code.AddLine(Code.This().Property("Database").Property("CommandTimeout").Assign(Code.Number(configuration.DataContext.CommandTimeout)).Close()); + } - MethodTemplate createMethod = dataContext.AddMethod("OnModelCreating", Code.Void()).Protected().Override(); - ParameterTemplate modelBuilder = createMethod.AddParameter(Code.Type(configuration.IsCore ? "ModelBuilder" : "DbModelBuilder"), "modelBuilder"); - if (!configuration.IsCore) - { - createMethod.Code.AddLine(Code.Local(modelBuilder).Property("Configurations").Method("AddFromAssembly", Code.This().Method("GetType").Property("Assembly")).Close()); - } + MethodTemplate createMethod = dataContext.AddMethod("OnModelCreating", Code.Void()).Protected().Override(); + ParameterTemplate modelBuilder = createMethod.AddParameter(Code.Type(configuration.IsCore ? "ModelBuilder" : "DbModelBuilder"), "modelBuilder"); + if (!configuration.IsCore) + { + createMethod.Code.AddLine(Code.Local(modelBuilder).Property("Configurations").Method("AddFromAssembly", Code.This().Method("GetType").Property("Assembly")).Close()); + } - foreach (EntityTransferObject entity in transferObjects.OfType()) - { - createMethod.Code.AddLine(Code.Local(modelBuilder).GenericMethod("Entity", entity.Model.ToTemplate()).BreakLine() - .Method("ToTable", Code.String(entity.Table), Code.String(entity.Schema)).BreakLine() - .Method("HasKey", Code.Lambda("x", Code.Csharp("new { " + string.Join(", ", entity.Keys.Select(key => $"x.{key.Name}")) + " }" ))).Close()); - } - foreach (StoredProcedureTransferObject storedProcedure in transferObjects.OfType()) - { - dataContext.AddMethod(storedProcedure.Name, storedProcedure.ReturnType.ToTemplate()) - .Code.AddLine(Code.This().Property("Database").Method("ExecuteSqlCommand", Code.String($"exec {storedProcedure.Schema}.{storedProcedure.Name}")).Close()); - } - return dataContext; + foreach (EntityTransferObject entity in this.transferObjects.OfType()) + { + createMethod.Code.AddLine(Code.Local(modelBuilder).GenericMethod("Entity", entity.Model.ToTemplate()).BreakLine() + .Method("ToTable", Code.String(entity.Table), Code.String(entity.Schema)).BreakLine() + .Method("HasKey", Code.Lambda("x", Code.Csharp("new { " + string.Join(", ", entity.Keys.Select(key => $"x.{key.Name}")) + " }"))).Close()); + } + foreach (StoredProcedureTransferObject storedProcedure in this.transferObjects.OfType()) + { + dataContext.AddMethod(storedProcedure.Name, storedProcedure.ReturnType.ToTemplate()) + .Code.AddLine(Code.This().Property("Database").Method("ExecuteSqlCommand", Code.String($"exec {storedProcedure.Schema}.{storedProcedure.Name}")).Close()); } + return dataContext; } -} +} \ No newline at end of file diff --git a/EntityFramework/Writers/EntityFrameworkRepositoryWriter.cs b/EntityFramework/Writers/EntityFrameworkRepositoryWriter.cs index 32d2a7dd..c5ab1877 100644 --- a/EntityFramework/Writers/EntityFrameworkRepositoryWriter.cs +++ b/EntityFramework/Writers/EntityFrameworkRepositoryWriter.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using System.Linq; using KY.Core; -using KY.Generator.Csharp; using KY.Generator.Csharp.Extensions; using KY.Generator.Csharp.Templates; using KY.Generator.EntityFramework.Configurations; @@ -10,154 +9,166 @@ using KY.Generator.Transfer; using KY.Generator.Transfer.Extensions; -namespace KY.Generator.EntityFramework.Writers +namespace KY.Generator.EntityFramework.Writers; + +public class EntityFrameworkRepositoryWriter : Codeable { - public class EntityFrameworkRepositoryWriter : Codeable + private readonly Options options; + private readonly List transferObjects; + private readonly List files; + + public EntityFrameworkRepositoryWriter(Options options, List transferObjects, List files) + { + this.options = options; + this.transferObjects = transferObjects; + this.files = files; + } + + public virtual void Write(EntityFrameworkWriteConfiguration configuration) { - public virtual void Write(EntityFrameworkWriteConfiguration configuration, List transferObjects, List files) + foreach (EntityFrameworkWriteRepositoryConfiguration repositoryConfiguration in configuration.Repositories) { - foreach (EntityFrameworkWriteRepositoryConfiguration repositoryConfiguration in configuration.Repositories) + EntityTransferObject entity = this.transferObjects.OfType().FirstOrDefault(x => x.Name == repositoryConfiguration.Entity) + .AssertIsNotNull(nameof(repositoryConfiguration.Entity), $"Entity {repositoryConfiguration.Entity} not found. Ensure it is read before."); + GeneratorOptions generatorOptions = this.options.Get(); + string className = repositoryConfiguration.Name ?? entity.Name + "Repository"; + ClassTemplate repository = this.files.AddFile(configuration.RelativePath, generatorOptions) + .WithName(Formatter.FormatFile(className, generatorOptions)) + .AddNamespace(repositoryConfiguration.Namespace ?? configuration.Namespace) + .AddClass(className) + .FormatName(generatorOptions) + .WithUsing("System.Collections.Generic") + .WithUsing("System.Linq"); + if (configuration.IsCore) { - EntityTransferObject entity = transferObjects.OfType().FirstOrDefault(x => x.Name == repositoryConfiguration.Entity) - .AssertIsNotNull(nameof(repositoryConfiguration.Entity), $"Entity {repositoryConfiguration.Entity} not found. Ensure it is read before."); - - ClassTemplate repository = files.AddFile(configuration.RelativePath, configuration.AddHeader, configuration.OutputId) - .AddNamespace(repositoryConfiguration.Namespace ?? configuration.Namespace) - .AddClass(repositoryConfiguration.Name ?? entity.Name + "Repository") - .FormatName(configuration) - .WithUsing("System.Collections.Generic") - .WithUsing("System.Linq"); - if (configuration.IsCore) - { - repository.WithUsing("Microsoft.EntityFrameworkCore"); - } - else - { - repository.WithUsing("System.Data.Entity"); - } - if (!string.IsNullOrEmpty(configuration.Namespace) && !string.IsNullOrEmpty(repositoryConfiguration.Namespace) && configuration.Namespace != repositoryConfiguration.Namespace) - { - repository.AddUsing(configuration.Namespace); - } - - configuration.Usings.ForEach(x => repository.AddUsing(x)); - repositoryConfiguration.Usings.ForEach(x => repository.AddUsing(x)); - - TypeTemplate modelType = entity.Model.ToTemplate(); - - FieldTemplate dataSetField = repository.AddField("dataSet", Code.Generic("DbSet", modelType)).Readonly(); - FieldTemplate dataContextField = repository.AddField("dataContext", Code.Type("DataContext")).Readonly(); - - TypeTemplate dataContextType = Code.Type("DataContext"); - ConstructorTemplate constructor = repository.AddConstructor(); - ParameterTemplate dataContextParameter = constructor.AddParameter(dataContextType, "dataContext", Code.Null()); - constructor.Code.AddLine(Code.This().Field(dataContextField).Assign(Code.Local(dataContextParameter).NullCoalescing(Code.New(dataContextType))).Close()) - .AddLine(Code.This().Field(dataSetField).Assign(Code.This().Field(dataContextField).GenericMethod("Set", modelType)).Close()); - - repository.AddMethod("Get", Code.Generic("IQueryable", modelType)) - .Code.AddLine(Code.Return(Code.This().Field(dataSetField))); - - repository.AddMethod("Get", modelType) - .WithParameter(Code.Type("params object[]"), "keys") - .Code.AddLine(Code.Return(Code.This().Field(dataSetField).Method("Find", Code.Local("keys")))); - - if (configuration.IsCore) - { - repository.AddMethod("Add", modelType) - .WithParameter(modelType, "entity") - .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Add", Code.Local("entity")).Property("Entity"))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - - repository.AddMethod("Add", Code.Generic("IEnumerable", modelType)) - .WithParameter(Code.Generic("IEnumerable", modelType), "entities") - .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Add", Code.Local("x")).Property("Entity"))).Method("ToList"))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - - repository.AddMethod("Update", modelType) - .WithParameter(modelType, "entity") - .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Update", Code.Local("entity")).Property("Entity"))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - - repository.AddMethod("Update", Code.Generic("IEnumerable", modelType)) - .WithParameter(Code.Generic("IEnumerable", modelType), "entities") - .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Update", Code.Local("x")).Property("Entity"))).Method("ToList"))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - } - else - { - repository.AddMethod("Add", modelType) - .WithParameter(modelType, "entity") - .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Add", Code.Local("entity")))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - - repository.AddMethod("Add", Code.Generic("IEnumerable", modelType)) - .WithParameter(Code.Generic("IEnumerable", modelType), "entities") - .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Add", Code.Local("x")))).Method("ToList"))) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - - repository.WithUsing("System.Data.Entity.Migrations") - .AddMethod("Update", modelType) - .WithParameter(modelType, "entity") - .Code.AddLine(Code.This().Field(dataSetField).Method("AddOrUpdate", Code.Local("entity")).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("entity"))); - - repository.WithUsing("System.Data.Entity.Migrations") - .AddMethod("Update", Code.Generic("IEnumerable", modelType)) - .WithParameter(Code.Generic("IEnumerable", modelType), "entities") - .Code.AddLine(Code.Declare(Code.Generic("List", modelType), "result", Code.Local("entities").Method("ToList"))) - .AddLine(Code.Local("result").Method("ForEach", Code.Lambda("x", Code.This().Field(dataSetField).Method("AddOrUpdate", Code.Local("x")))).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) - .AddLine(Code.Return(Code.Local("result"))); - } - - //repository.AddMethod("Update", Code.Void()) - // .WithParameter(Code.Generic("Delta", modelType), "delta") - // .WithParameter(Code.Type("object[]"), "keys") - // .Code.AddLine(Code.Declare(modelType, "entity", Code.This().Field(dataSetField).Method("Find", Code.Local("keys")))) - // .AddLine(Code.If(Code.Local("entity").Equals().Null(), x => x.Code.AddLine(Code.Throw(Code.Type("InvalidOperationException"), Code.String("Can not find any element with this keys, Use Add(...) method instead"))))) - // .AddLine(Code.Local("delta").Method("Patch", Code.Local("entity")).Close()) - // .AddLine(Code.This().Method("Update", Code.Local("entity")).Close()) - // .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + repository.WithUsing("Microsoft.EntityFrameworkCore"); + } + else + { + repository.WithUsing("System.Data.Entity"); + } + if (!string.IsNullOrEmpty(configuration.Namespace) && !string.IsNullOrEmpty(repositoryConfiguration.Namespace) && configuration.Namespace != repositoryConfiguration.Namespace) + { + repository.AddUsing(configuration.Namespace); + } - repository.AddMethod("Delete", Code.Void()) + configuration.Usings.ForEach(x => repository.AddUsing(x)); + repositoryConfiguration.Usings.ForEach(x => repository.AddUsing(x)); + + TypeTemplate modelType = entity.Model.ToTemplate(); + + FieldTemplate dataSetField = repository.AddField("dataSet", Code.Generic("DbSet", modelType)).Readonly(); + FieldTemplate dataContextField = repository.AddField("dataContext", Code.Type("DataContext")).Readonly(); + + TypeTemplate dataContextType = Code.Type("DataContext"); + ConstructorTemplate constructor = repository.AddConstructor(); + ParameterTemplate dataContextParameter = constructor.AddParameter(dataContextType, "dataContext", Code.Null()); + constructor.Code.AddLine(Code.This().Field(dataContextField).Assign(Code.Local(dataContextParameter).NullCoalescing(Code.New(dataContextType))).Close()) + .AddLine(Code.This().Field(dataSetField).Assign(Code.This().Field(dataContextField).GenericMethod("Set", modelType)).Close()); + + repository.AddMethod("Get", Code.Generic("IQueryable", modelType)) + .Code.AddLine(Code.Return(Code.This().Field(dataSetField))); + + repository.AddMethod("Get", modelType) + .WithParameter(Code.Type("params object[]"), "keys") + .Code.AddLine(Code.Return(Code.This().Field(dataSetField).Method("Find", Code.Local("keys")))); + + if (configuration.IsCore) + { + repository.AddMethod("Add", modelType) .WithParameter(modelType, "entity") - .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.Local("entity")).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Add", Code.Local("entity")).Property("Entity"))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); - repository.AddMethod("Delete", Code.Void()) + repository.AddMethod("Add", Code.Generic("IEnumerable", modelType)) .WithParameter(Code.Generic("IEnumerable", modelType), "entities") - .Code.AddLine(Code.This().Field(dataSetField).Method("RemoveRange", Code.Local("entities")).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Add", Code.Local("x")).Property("Entity"))).Method("ToList"))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); + + repository.AddMethod("Update", modelType) + .WithParameter(modelType, "entity") + .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Update", Code.Local("entity")).Property("Entity"))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); + + repository.AddMethod("Update", Code.Generic("IEnumerable", modelType)) + .WithParameter(Code.Generic("IEnumerable", modelType), "entities") + .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Update", Code.Local("x")).Property("Entity"))).Method("ToList"))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); + } + else + { + repository.AddMethod("Add", modelType) + .WithParameter(modelType, "entity") + .Code.AddLine(Code.Declare(modelType, "result", Code.This().Field(dataSetField).Method("Add", Code.Local("entity")))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); - if (configuration.IsCore) - { - repository.AddMethod("Delete", Code.Void()) - .WithParameter(Code.Type("params object[]"), "keys") - .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.This().Field(dataSetField).Method("Find", Code.Local("keys"))).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); - } - else - { - repository.AddMethod("Delete", Code.Void()) - .WithParameter(Code.Type("params object[]"), "keys") - .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.This().Field(dataSetField).Method("Find", Code.Local("keys"))).Close()) - .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); - } - - //foreach (string key in entity.Keys) - //{ - // PropertyTransferObject property = entity.Model.Properties.First(x => x.Name.Equals(key, StringComparison.InvariantCultureIgnoreCase)); - // delete.AddParameter(property.Type.ToTemplate(), property.Name) - // .FormatName(configuration.Language, configuration.FormatNames); - //} + repository.AddMethod("Add", Code.Generic("IEnumerable", modelType)) + .WithParameter(Code.Generic("IEnumerable", modelType), "entities") + .Code.AddLine(Code.Declare(Code.Generic("IEnumerable", modelType), "result", Code.Local("entities").Method("Select", Code.Lambda("x", Code.This().Field(dataSetField).Method("Add", Code.Local("x")))).Method("ToList"))) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); + + repository.WithUsing("System.Data.Entity.Migrations") + .AddMethod("Update", modelType) + .WithParameter(modelType, "entity") + .Code.AddLine(Code.This().Field(dataSetField).Method("AddOrUpdate", Code.Local("entity")).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("entity"))); + + repository.WithUsing("System.Data.Entity.Migrations") + .AddMethod("Update", Code.Generic("IEnumerable", modelType)) + .WithParameter(Code.Generic("IEnumerable", modelType), "entities") + .Code.AddLine(Code.Declare(Code.Generic("List", modelType), "result", Code.Local("entities").Method("ToList"))) + .AddLine(Code.Local("result").Method("ForEach", Code.Lambda("x", Code.This().Field(dataSetField).Method("AddOrUpdate", Code.Local("x")))).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()) + .AddLine(Code.Return(Code.Local("result"))); } + + //repository.AddMethod("Update", Code.Void()) + // .WithParameter(Code.Generic("Delta", modelType), "delta") + // .WithParameter(Code.Type("object[]"), "keys") + // .Code.AddLine(Code.Declare(modelType, "entity", Code.This().Field(dataSetField).Method("Find", Code.Local("keys")))) + // .AddLine(Code.If(Code.Local("entity").Equals().Null(), x => x.Code.AddLine(Code.Throw(Code.Type("InvalidOperationException"), Code.String("Can not find any element with this keys, Use Add(...) method instead"))))) + // .AddLine(Code.Local("delta").Method("Patch", Code.Local("entity")).Close()) + // .AddLine(Code.This().Method("Update", Code.Local("entity")).Close()) + // .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + + repository.AddMethod("Delete", Code.Void()) + .WithParameter(modelType, "entity") + .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.Local("entity")).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + + repository.AddMethod("Delete", Code.Void()) + .WithParameter(Code.Generic("IEnumerable", modelType), "entities") + .Code.AddLine(Code.This().Field(dataSetField).Method("RemoveRange", Code.Local("entities")).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + + if (configuration.IsCore) + { + repository.AddMethod("Delete", Code.Void()) + .WithParameter(Code.Type("params object[]"), "keys") + .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.This().Field(dataSetField).Method("Find", Code.Local("keys"))).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + } + else + { + repository.AddMethod("Delete", Code.Void()) + .WithParameter(Code.Type("params object[]"), "keys") + .Code.AddLine(Code.This().Field(dataSetField).Method("Remove", Code.This().Field(dataSetField).Method("Find", Code.Local("keys"))).Close()) + .AddLine(Code.This().Field(dataContextField).Method("SaveChanges").Close()); + } + + //foreach (string key in entity.Keys) + //{ + // PropertyTransferObject property = entity.Model.Properties.First(x => x.Name.Equals(key, StringComparison.InvariantCultureIgnoreCase)); + // delete.AddParameter(property.Type.ToTemplate(), property.Name) + // .FormatName(configuration.Language, configuration.FormatNames); + //} } } -} +} \ No newline at end of file diff --git a/EntityFramework/Writers/EntityFrameworkWriter.cs b/EntityFramework/Writers/EntityFrameworkWriter.cs index a6cd0f51..826d19fe 100644 --- a/EntityFramework/Writers/EntityFrameworkWriter.cs +++ b/EntityFramework/Writers/EntityFrameworkWriter.cs @@ -2,41 +2,37 @@ using System.Collections.Generic; using KY.Core; using KY.Core.Dependency; -using KY.Generator.Configurations; using KY.Generator.Csharp.Languages; using KY.Generator.EntityFramework.Configurations; -using KY.Generator.Output; using KY.Generator.Templates; -using KY.Generator.Transfer; using KY.Generator.Transfer.Writers; -namespace KY.Generator.EntityFramework.Writers +namespace KY.Generator.EntityFramework.Writers; + +public class EntityFrameworkWriter : ITransferWriter { - public class EntityFrameworkWriter : ITransferWriter + private readonly IDependencyResolver resolver; + private readonly Options options; + + public EntityFrameworkWriter(IDependencyResolver resolver, Options options) { - private readonly IDependencyResolver resolver; + this.resolver = resolver; + this.options = options; + } - public EntityFrameworkWriter(IDependencyResolver resolver) + public virtual void Write(EntityFrameworkWriteConfiguration configuration) + { + if (!this.options.Get().Language.IsCsharp()) { - this.resolver = resolver; + throw new InvalidOperationException("EntityFramework support only Csharp"); } + configuration.Namespace.AssertIsNotNull(nameof(configuration.Namespace), "ef and ef-core writer requires a namespace"); - public virtual void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) + List files = new(); + if (configuration.Repositories.Count > 0) { - EntityFrameworkWriteConfiguration configuration = (EntityFrameworkWriteConfiguration)configurationBase; - if (!configuration.Language.IsCsharp()) - { - throw new InvalidOperationException("EntityFramework support only Csharp"); - } - configuration.Namespace.AssertIsNotNull(nameof(configuration.Namespace), "ef and ef-core writer requires a namespace"); - - List files = new List(); - if (configuration.Repositories.Count > 0) - { - this.resolver.Create().Write(configuration, transferObjects, files); - } - this.resolver.Create().Write(configuration, transferObjects, files); - files.ForEach(file => configuration.Language.Write(file, output)); + this.resolver.Create().Write(configuration); } + this.resolver.Create().Write(configuration); } } \ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType.sln b/Examples/Angular/Annotation/ChangeReturnType.sln new file mode 100644 index 00000000..73dfb6ff --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChangeReturnType", "ChangeReturnType\ChangeReturnType.csproj", "{AF7B280C-481A-4361-BBF4-4FC70F10DE28}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AF7B280C-481A-4361-BBF4-4FC70F10DE28}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AF7B280C-481A-4361-BBF4-4FC70F10DE28}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AF7B280C-481A-4361-BBF4-4FC70F10DE28}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AF7B280C-481A-4361-BBF4-4FC70F10DE28}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Annotation/ChangeReturnType/.gitignore b/Examples/Angular/Annotation/ChangeReturnType/.gitignore new file mode 100644 index 00000000..41ffa34d --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/.gitignore @@ -0,0 +1,231 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/Examples/Angular/Annotation/ChangeReturnType/ChangeReturnType.csproj b/Examples/Angular/Annotation/ChangeReturnType/ChangeReturnType.csproj new file mode 100644 index 00000000..98f561b5 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ChangeReturnType.csproj @@ -0,0 +1,52 @@ + + + + net6.0 + enable + false + ClientApp\ + https://localhost:44442 + npm start + enable + {fc26dcad-6b61-49d1-a5a1-1915cdb8dd48} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wwwroot\%(RecursiveDir)%(FileName)%(Extension) + PreserveNewest + true + + + + diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.browserslistrc b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.browserslistrc new file mode 100644 index 00000000..427441dc --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.editorconfig b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.editorconfig new file mode 100644 index 00000000..5fc7188f --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.editorconfig @@ -0,0 +1,19 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.{razor,cshtml}] +charset = utf-8-bom diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.gitignore b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.gitignore new file mode 100644 index 00000000..e1f679be --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/.gitignore @@ -0,0 +1,40 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/dist-server +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/README.md b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/README.md new file mode 100644 index 00000000..f9cba43e --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/README.md @@ -0,0 +1,27 @@ +# ChangeReturnType + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.0.2. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/angular.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/angular.json new file mode 100644 index 00000000..637a1858 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/angular.json @@ -0,0 +1,133 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ChangeReturnType": { + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "progress": false, + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/assets" + ], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "ChangeReturnType:build:production" + }, + "development": { + "browserTarget": "ChangeReturnType:build:development", + "proxyConfig": "proxy.conf.js" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ChangeReturnType:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/assets" + ], + "styles": [ + "src/styles.css" + ], + "scripts": [] + } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist-server", + "main": "src/main.ts", + "tsConfig": "tsconfig.server.json" + }, + "configurations": { + "dev": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": true + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + } + } + } + }, + "defaultProject": "ChangeReturnType" +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/aspnetcore-https.js b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/aspnetcore-https.js new file mode 100644 index 00000000..2bde9286 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/aspnetcore-https.js @@ -0,0 +1,33 @@ +// This script sets up HTTPS for the application using the ASP.NET Core HTTPS certificate +const fs = require('fs'); +const spawn = require('child_process').spawn; +const path = require('path'); + +const baseFolder = + process.env.APPDATA !== undefined && process.env.APPDATA !== '' + ? `${process.env.APPDATA}/ASP.NET/https` + : `${process.env.HOME}/.aspnet/https`; + +const certificateArg = process.argv.map(arg => arg.match(/--name=(?.+)/i)).filter(Boolean)[0]; +const certificateName = certificateArg ? certificateArg.groups.value : process.env.npm_package_name; + +if (!certificateName) { + console.error('Invalid certificate name. Run this script in the context of an npm/yarn script or pass --name=<> explicitly.') + process.exit(-1); +} + +const certFilePath = path.join(baseFolder, `${certificateName}.pem`); +const keyFilePath = path.join(baseFolder, `${certificateName}.key`); + +if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) { + spawn('dotnet', [ + 'dev-certs', + 'https', + '--export-path', + certFilePath, + '--format', + 'Pem', + '--no-password', + ], { stdio: 'inherit', }) + .on('exit', (code) => process.exit(code)); +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/karma.conf.js b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/karma.conf.js new file mode 100644 index 00000000..95d59d9c --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/angularapp'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package-lock.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package-lock.json new file mode 100644 index 00000000..20fabb3e --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package-lock.json @@ -0,0 +1,9190 @@ +{ + "name": "changereturntype", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@ampproject/remapping": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.0.2.tgz", + "integrity": "sha512-SncaVxs+E3EdoA9xJgHfWPxZfowAgeIsd71VpqCKP6KNKm6s7zSqqvUc70UpKUFsrV3dAmy6qxHoIj5NG+3DiA==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "1.0.0", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1301.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1301.2.tgz", + "integrity": "sha512-v8e6OF80Ezo5MTHtFcq1AZJH+Wq+hN9pMZ1iLGkODIfKIW9zx6aPhx0JY0b7sZkfNVL8ay8JA8f339eBMnOE9A==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.1.2", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/build-angular": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.1.2.tgz", + "integrity": "sha512-0FeDqfjWJjgIU42T3136RNYb7Yv2as6Z8rAnfUlX6RjRGZf98+6ZQZ80yREgrLkm7L8G1qWJc1sn3NyVMDwf9A==", + "dev": true, + "requires": { + "@ampproject/remapping": "1.0.2", + "@angular-devkit/architect": "0.1301.2", + "@angular-devkit/build-webpack": "0.1301.2", + "@angular-devkit/core": "13.1.2", + "@babel/core": "7.16.0", + "@babel/generator": "7.16.0", + "@babel/helper-annotate-as-pure": "7.16.0", + "@babel/plugin-proposal-async-generator-functions": "7.16.4", + "@babel/plugin-transform-async-to-generator": "7.16.0", + "@babel/plugin-transform-runtime": "7.16.4", + "@babel/preset-env": "7.16.4", + "@babel/runtime": "7.16.3", + "@babel/template": "7.16.0", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.1.2", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.0.0", + "core-js": "3.19.3", + "critters": "0.0.15", + "css-loader": "6.5.1", + "esbuild": "0.14.2", + "esbuild-wasm": "0.14.2", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.0", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.4.5", + "minimatch": "3.0.4", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.1.0", + "postcss": "8.4.4", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "6.7.0", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "4.0.0", + "rxjs": "6.6.7", + "sass": "1.44.0", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.0", + "source-map-support": "0.5.21", + "stylus": "0.55.0", + "stylus-loader": "6.2.0", + "terser": "5.10.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.65.0", + "webpack-dev-middleware": "5.2.2", + "webpack-dev-server": "4.6.0", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.0.0" + }, + "dependencies": { + "@ngtools/webpack": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.1.2.tgz", + "integrity": "sha512-F/KraxCCUjSn5nWVEQSuyVfnoE9j/bTcpIb+6e38/Hq/saPfsUoNiRjWlTAxCD44vHbMuVkJ/ZRZT6hdICAslw==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1301.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1301.2.tgz", + "integrity": "sha512-Xk0k0tMcLOy2HI1/YrfWeLUrtKvk7/E7fhG3XoozT/pXBQgiZGoPuCt34HNPDkx3WNSedzvh5DNv8kPlILfjIw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1301.2", + "rxjs": "6.6.7" + } + }, + "@angular-devkit/core": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.1.2.tgz", + "integrity": "sha512-uXVesIRiCL/Nv+RSV8JM4j8IoZiGCGnqV2FOJ1hvH7DPxIjhjPMdG/B54xMydZpeASW3ofuxeORyAXxFIBm8Zg==", + "dev": true, + "requires": { + "ajv": "8.8.2", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + } + }, + "@angular-devkit/schematics": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.1.2.tgz", + "integrity": "sha512-ayYbHGU8QpMGx8ZyhKOBupz+Zfv/2H1pNQErahYV3qg7hA9hfjTGmNmDQ4iw0fiT04NajjUxuomlKsCsg7oXDw==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.1.2", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + } + }, + "@angular/animations": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.1.1.tgz", + "integrity": "sha512-6ECC9Dn5gmV4U1cz1pRJ2p5lo0BET2CjG1RbhTaZR8lOsoMsmlV/JdBAp8eyYTiGii3MLS6Q2P/hN/YG2SRGQQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.1.2.tgz", + "integrity": "sha512-jEsQWzHgODFpppWGb49jfqlN8YYhphsKY3MPHlrjmd05qWgKItUGSgA46hSoDqjaJKVUN9koUnJBFCc9utERYA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1301.2", + "@angular-devkit/core": "13.1.2", + "@angular-devkit/schematics": "13.1.2", + "@schematics/angular": "13.1.2", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.2", + "resolve": "1.20.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + } + }, + "@angular/common": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.1.1.tgz", + "integrity": "sha512-FQwRZ1XgTH2PbPjBmq2jAZzETVNX9yWQt21MuNGtokC7V4eS0NYlFIDbhy3UPWCzRgd3+P7P4+HdX15VxCjf9g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.1.1.tgz", + "integrity": "sha512-WS+BB4h2LOBAGQ+P+RcKDw43Z7yAB5m1RY2/MAI+qI339V97WlWEQXxSMvBhCuzJnww1SSZfHMADaB54Jdjx2g==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.1.1.tgz", + "integrity": "sha512-ycdXN2urBZepbXn2xx1oxF1i6g0Dq/Rb8ySQeELdL9qr6hiZF9fkvIwd91d8uhFG2PvoM4O8/U/3x4yA2bXzew==", + "dev": true, + "requires": { + "@babel/core": "^7.8.6", + "canonical-path": "1.0.0", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.25.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + } + }, + "@angular/core": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.1.1.tgz", + "integrity": "sha512-oLGKgzUbHqte/q7EokOJWUiXAtBjwuZM6c9Or2a7WDJNeImQilxk5qy91RPSbP8FhOBysebqAayrfiCYexlShg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.1.1.tgz", + "integrity": "sha512-wtYzRHPv4mf1Vsi4GEal5qcI2wjqUW+lu8Fsd2Aoe8NqkwtY3fq+iWEP/4pnvmH0RlC+3QbNNV/01D5UKolvgg==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.1.1.tgz", + "integrity": "sha512-jk9MGwnaVc98wmw5dRBicduI/a8dHtUzaAi1dV003fUWldS9a5FBuj/ym7DJubaD5Njl8l79SFbjrP9aAsqM5A==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.1.1.tgz", + "integrity": "sha512-ujHJMhJk93hjLx/SQ67y7xiGh2UDL+toVi3OlorWvnYGgPR26ufyL+J73BA+RAKHSP2WPiXU+/87vSz8r+BEgA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-server": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.1.1.tgz", + "integrity": "sha512-vzGHv2k9Fv9BKRQOdl6RPqj149KZgQ2IFFnSvjbCCLoZ47WV6fw155t+OTWuMLIPySNrsjzRJSRj04hbK9+8yQ==", + "requires": { + "domino": "^2.1.2", + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + } + }, + "@angular/router": { + "version": "13.1.1", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.1.1.tgz", + "integrity": "sha512-rlz5BBgNX+G2vVu2Gb5avx3LL08i7R/xZO7zPwh0HhXz/Vp8XFlWwaqAGb6Hgat772K2uCxF1/JBLQCUBY2MNQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.16.8.tgz", + "integrity": "sha512-m7OkX0IdKLKPpBlJtF561YJal5y/jyI5fNfWbPxh2D/nbzzGI4qRyrD8xO2jB24u7l+5I2a43scCG2IrfjC50Q==", + "dev": true + }, + "@babel/core": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.0.tgz", + "integrity": "sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/generator": "^7.16.0", + "@babel/helper-compilation-targets": "^7.16.0", + "@babel/helper-module-transforms": "^7.16.0", + "@babel/helpers": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/template": "^7.16.0", + "@babel/traverse": "^7.16.0", + "@babel/types": "^7.16.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.0.tgz", + "integrity": "sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz", + "integrity": "sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.16.7.tgz", + "integrity": "sha512-mGojBwIWcwGD6rfqgRXVlVYmPAv7eOpIemUG3dGnDdCY4Pae70ROij3XmfrH6Fa1h1aiDylpglbZyktfzyo/hA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.7.tgz", + "integrity": "sha512-kIFozAvVfK05DM4EVQYKK+zteWvY85BFdGBRQBytRyY3y+6PX0DkDOn/CZ3lEuczCfrCxEzwt0YtP/87YPTWSw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.16.7.tgz", + "integrity": "sha512-fk5A6ymfp+O5+p2yCkXAu5Kyj6v0xh0RBeNcAkYUMDvvAAoxvSKXn+Jb37t/yWFiQVDFK1ELpUTD8/aLhCPu+g==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^4.7.1" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.0.tgz", + "integrity": "sha512-7hfT8lUljl/tM3h+izTX/pO3W3frz2ok6Pk+gzys8iJqDfZrZy2pXjRTZAvG2YmfHun1X4q8/UZRLatMfqc5Tg==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.16.7.tgz", + "integrity": "sha512-QfDfEnIUyyBSR3HtrtGECuZ6DAyCkYFp7GHl75vFtTnn6pjKeK0T1DB5lLkFvBea8MdaiUABx3osbgLyInoejA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-get-function-arity": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.16.7.tgz", + "integrity": "sha512-flc+RLSOBXzNzVhcLu6ujeHUrD6tANAOU5ojrRx/as+tbzf8+stUCj7+IfRRoAbEZqj/ahXEMsjhOhgeZsrnTw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.7.tgz", + "integrity": "sha512-VtJ/65tYiU/6AbMTDwyoXGPKHgTsfRarivm+YbB5uAzKUyuPjgZSgAFeG87FCigc7KNHu2Pegh1XIT3lXjvz3Q==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.16.7.tgz", + "integrity": "sha512-gaqtLDxJEFCeQbYp9aLAefjhkKdjKcdh6DB7jniIGU3Pz52WAmP268zK0VgPz9hUNkMSYeH976K2/Y6yPadpng==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.16.7.tgz", + "integrity": "sha512-ZIzHVyoeLMvXMN/vok/a4LWRy8G2v205mNP0XOuf9XRLyX5/u9CnVulUtDgUTama3lT+bf/UqucuZjqiGuTS1g==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/helpers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.16.7.tgz", + "integrity": "sha512-9ZDoqtfY7AuEOt3cxchfii6C7GDyyMBffktR5B2jvWv8u2+efwvpnVKXMWzNehqy68tKgAfSwfdw/lWpthS2bw==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.16.8.tgz", + "integrity": "sha512-i7jDUfrVBWc+7OKcBzEe5n7fbv3i2fWtxKzzCvOjnzSxMfWMigAhtfJ7qzZNGFNMsCCd67+uz553dYKWXPvCKw==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.4.tgz", + "integrity": "sha512-/CUekqaAaZCQHleSK/9HajvcD/zdnJiKRiuUFq8ITE+0HsPzquf53cpFiqAwl/UfmJbR6n5uGPQSPdrmKOvHHg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.4", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.16.7.tgz", + "integrity": "sha512-dgqJJrcZoG/4CkMopzhPJjGxsIe9A8RlkQLnL/Vhhx8AA9ZuaRwGSlscSh42hazc7WSrya/IK7mTeoF0DP9tEw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.16.7.tgz", + "integrity": "sha512-3O0Y4+dw94HA86qSg9IHfyPktgR7q3gpNVAeiKQd+8jBKFaU5NQS1Yatgo4wY+UFNuLjvxcSmzcsHqrhgTyBUA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.7.tgz", + "integrity": "sha512-7twV3pzhrRxSwHeIvFE6coPgvo+exNDOiGUMg39o2LiLo1Y+4aKpfkcLGcg1UHonzorCt7SNXnoMyCnnIOA8Sw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.0.tgz", + "integrity": "sha512-PbIr7G9kR8tdH6g8Wouir5uVjklETk91GMVSUq+VaOgiinbCkBP6Q7NN/suM/QutZkMJMvcyAriogcYAdhg8Gw==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-remap-async-to-generator": "^7.16.0" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + } + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.16.7.tgz", + "integrity": "sha512-VqAwhTHBnu5xBVDCvrvqJbtLUa++qZaWC0Fgr2mqokBlulZARGyIvZDoqbPlPaKImQ9dKAcCzbv+ul//uqu70A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.16.8.tgz", + "integrity": "sha512-oflKPvsLT2+uKQopesJt3ApiaIS2HW+hzHFcwRNtyDGieAeC/dIHZX8buJQ2J2X1rxGPy4eRcUijm3qcSPjYcA==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.16.7.tgz", + "integrity": "sha512-DuK5E3k+QQmnOqBR9UkusByy5WZWGRxfzV529s9nPra1GE7olmxfqO2FHobEOYSPIjPBTr4p66YDcjQnt8cBmw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.16.7.tgz", + "integrity": "sha512-mF7jOgGYCkSJagJ6XCujSQg+6xC1M77/03K2oBmVJWoFGNUtnVJO4WHKJk3dnPC8HCcj4xBQP1Egm8DWh3Pb3Q==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.4.tgz", + "integrity": "sha512-pru6+yHANMTukMtEZGC4fs7XPwg35v8sj5CIEmE+gEkFljFiVJxEWxx/7ZDkTK+iZRYo1bFXBtfIN95+K3cJ5A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.0", + "@babel/helper-plugin-utils": "^7.14.5", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.16.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.4.tgz", + "integrity": "sha512-v0QtNd81v/xKj4gNKeuAerQ/azeNn/G1B1qMLeXOcV8+4TWlD2j3NV1u8q29SDFBXx/NBq5kyEAO+0mpRgacjA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.4", + "@babel/helper-compilation-targets": "^7.16.3", + "@babel/helper-plugin-utils": "^7.14.5", + "@babel/helper-validator-option": "^7.14.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.2", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-async-generator-functions": "^7.16.4", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-class-static-block": "^7.16.0", + "@babel/plugin-proposal-dynamic-import": "^7.16.0", + "@babel/plugin-proposal-export-namespace-from": "^7.16.0", + "@babel/plugin-proposal-json-strings": "^7.16.0", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.0", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.0", + "@babel/plugin-proposal-numeric-separator": "^7.16.0", + "@babel/plugin-proposal-object-rest-spread": "^7.16.0", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.0", + "@babel/plugin-proposal-private-methods": "^7.16.0", + "@babel/plugin-proposal-private-property-in-object": "^7.16.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.0", + "@babel/plugin-transform-async-to-generator": "^7.16.0", + "@babel/plugin-transform-block-scoped-functions": "^7.16.0", + "@babel/plugin-transform-block-scoping": "^7.16.0", + "@babel/plugin-transform-classes": "^7.16.0", + "@babel/plugin-transform-computed-properties": "^7.16.0", + "@babel/plugin-transform-destructuring": "^7.16.0", + "@babel/plugin-transform-dotall-regex": "^7.16.0", + "@babel/plugin-transform-duplicate-keys": "^7.16.0", + "@babel/plugin-transform-exponentiation-operator": "^7.16.0", + "@babel/plugin-transform-for-of": "^7.16.0", + "@babel/plugin-transform-function-name": "^7.16.0", + "@babel/plugin-transform-literals": "^7.16.0", + "@babel/plugin-transform-member-expression-literals": "^7.16.0", + "@babel/plugin-transform-modules-amd": "^7.16.0", + "@babel/plugin-transform-modules-commonjs": "^7.16.0", + "@babel/plugin-transform-modules-systemjs": "^7.16.0", + "@babel/plugin-transform-modules-umd": "^7.16.0", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.0", + "@babel/plugin-transform-new-target": "^7.16.0", + "@babel/plugin-transform-object-super": "^7.16.0", + "@babel/plugin-transform-parameters": "^7.16.3", + "@babel/plugin-transform-property-literals": "^7.16.0", + "@babel/plugin-transform-regenerator": "^7.16.0", + "@babel/plugin-transform-reserved-words": "^7.16.0", + "@babel/plugin-transform-shorthand-properties": "^7.16.0", + "@babel/plugin-transform-spread": "^7.16.0", + "@babel/plugin-transform-sticky-regex": "^7.16.0", + "@babel/plugin-transform-template-literals": "^7.16.0", + "@babel/plugin-transform-typeof-symbol": "^7.16.0", + "@babel/plugin-transform-unicode-escapes": "^7.16.0", + "@babel/plugin-transform-unicode-regex": "^7.16.0", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.0", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.4.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.19.1", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.3.tgz", + "integrity": "sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.0.tgz", + "integrity": "sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.0", + "@babel/parser": "^7.16.0", + "@babel/types": "^7.16.0" + } + }, + "@babel/traverse": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.16.8.tgz", + "integrity": "sha512-xe+H7JlvKsDQwXRsBhSnq1/+9c+LlQcCK3Tn/l5sbx02HYns/cn7ibp9+RV1sIUqu7hKg91NWsgHurO9dowITQ==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.16.8", + "@babel/types": "^7.16.8", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.16.8.tgz", + "integrity": "sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@csstools/convert-colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", + "integrity": "sha512-5a6wqoJV/xEdbRNKVo6I4hO3VjyDq//8q2f9I6PBAvMesJHFauXDorcNCsr9RzvsZnaWi5NYCcfyqP1QeFHFbw==", + "dev": true + }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.2.tgz", + "integrity": "sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/resolve-uri": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-1.0.0.tgz", + "integrity": "sha512-9oLAnygRMi8Q5QkYEU4XWK04B+nuoXoxjRvRxgjuChkLZFBja0YPSgdZ7dZtwhncLBcQe/I/E+fLuk5qxcYVJA==", + "dev": true + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@schematics/angular": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.1.2.tgz", + "integrity": "sha512-OMbuOsnzUFjIGeo99NYwIPwjX6udJAiT5Sj5K7QZZYj66HuAqNBMV57J8GPA56edx5mOHZZApWMjXLlOxRXbJA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.1.2", + "@angular-devkit/schematics": "13.1.2", + "jsonc-parser": "3.0.0" + } + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "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/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.6.11", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.6.11.tgz", + "integrity": "sha512-S6pvzQDvMZHrkBz2Mcn/8Du7cpr76PlRJBAoHnSDNbulULsH5dp0Gns+WRyNX5LHejz/ljxK4/vIHK/caHt6SQ==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@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": "12.20.41", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.20.41.tgz", + "integrity": "sha512-f6xOqucbDirG7LOzedpvzjP3UTmHttRou3Mosx3vL9wr9AIQGhcPgVnqa8ihpZYnxyM1rxeNCvTyukPKZtq10Q==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/retry": { + "version": "0.12.1", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.1.tgz", + "integrity": "sha512-xoDlM2S4ortawSWORYqsdU+2rxdh4LRW9ytc3zmT37RIKQh6IHyKwwtKhKis9ah8ol07DCkZxPt8BBvPjC6v4g==", + "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" + } + }, + "@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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "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 + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.0.tgz", + "integrity": "sha512-0PhAp58jZNw13UJv7NVdTGb0ZcghHUb3DrZ046JiiJY/BOaTTpbwdHq2VObPCBV8M2GPh7sgrJ3AQ8Ey468LJw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.8.2.tgz", + "integrity": "sha512-x9VuX+R/jcFj1DHo/fCp99esgGDWiHENrKxaCENuCxpoMCmAt/COCGVDwA7kleEpEzJjDnvh3yGoOuLu0Dtllw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", + "integrity": "sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.8.8", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.8.8.tgz", + "integrity": "sha512-eM9d/swFopRt5gdJ7jrpCwgvEMIayITpojhkkSMRsFHYuH5bkSQ4p/9qTEHtmNudUZh22Tehu7I6CxAW0IXTKA==", + "dev": true, + "requires": { + "browserslist": "^4.12.0", + "caniuse-lite": "^1.0.30001109", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "picocolors": "^0.2.1", + "postcss": "^7.0.32", + "postcss-value-parser": "^4.1.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.0.tgz", + "integrity": "sha512-wMDoBJ6uG4u4PNFh72Ty6t3EgfA91puCuAwKIazbQlci+ENb/UU9A3xG5lutjUIiXCIn1CY5L15r9LimiJyrSA==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.0", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.4.0.tgz", + "integrity": "sha512-YxFreYwUfglYKdLUGvIF2nJEsGwj+RhWSX/ije3D2vQPOXuyMLMtg/cCGMDpOA7Nd+MwlNdnGODbd2EwUZPlsw==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0", + "core-js-compat": "^3.18.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.0.tgz", + "integrity": "sha512-dhAPTDLGoMW5/84wkgwiLRwMnio2i1fUe53EuvtKMv0pn2p3S8OCoV1xAzfJPl0KOX7IB89s2ib85vbYiea3jg==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.0" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.1.tgz", + "integrity": "sha512-vFIUq7FdLtjZMhATwDul5RZWv2jpXQ09Pd6jcVEOvIsqCWTRFD/ONHNfyOS8dA/Ippi5dsIgpyKWKZaAKZltbA==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.1.tgz", + "integrity": "sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.9.6", + "raw-body": "2.4.2", + "type-is": "~1.6.18" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.19.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.19.1.tgz", + "integrity": "sha512-u2tbbG5PdKRTUoctO3NBD8FQ5HdPh1ZXPHzp1rwaa5jTc+RV9/+RlWiAIKmjRPQF+xbGM9Kklj5bZQFa2s/38A==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001286", + "electron-to-chromium": "^1.4.17", + "escalade": "^3.1.1", + "node-releases": "^2.0.1", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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 + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001298", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001298.tgz", + "integrity": "sha512-AcKqikjMLlvghZL/vfTHorlQsLDhGRalYf1+GmWCf5SCMziSGjRYQW/JEksj14NaYHIR6KIhrFAy0HV5C25UzQ==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "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 + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "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 + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "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 + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "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 + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-webpack-plugin": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.0.0.tgz", + "integrity": "sha512-tuCVuFMBbRsb7IH0q1CUb50/Skv+7a6c7DJ+xi4fAbOzNLTYVMUTPnf8uGvKPtmqTvzYBrfEFo7YgP4TsUWmtg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "core-js": { + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.19.3.tgz", + "integrity": "sha512-LeLBMgEGSsG7giquSzvgBrTS7V5UL6ks3eQlUSbN8dJStlLFiRzUm5iqsRyzUB8carhfKjkJ2vzKqE6z1Vga9g==" + }, + "core-js-compat": { + "version": "3.20.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.20.2.tgz", + "integrity": "sha512-qZEzVQ+5Qh6cROaTPFLNS4lkvQ6mBzE3R6A6EEpssj7Zr2egMHgsy4XapdifqJDGC9CBiNv7s+ejI96rLNQFdg==", + "dev": true, + "requires": { + "browserslist": "^4.19.1", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "critters": { + "version": "0.0.15", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.15.tgz", + "integrity": "sha512-AE7hkXb3eZUbEvS1SKZa+OU4o2kUOXtzVeE/2E/mjU/0mV1wpBT1HfUCWVRS4zwvkBNJ0AQYsVjAoFm+kIhfdw==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.1.3", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-blank-pseudo": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-0.1.4.tgz", + "integrity": "sha512-LHz35Hr83dnFeipc7oqFDmsjHdljj3TQtxGGiNWSOsTLIAubSm4TEz8qCaKFpk7idaQ1GfWscF4E6mgpBysA1w==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "css-has-pseudo": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-0.10.0.tgz", + "integrity": "sha512-Z8hnfsZu4o/kt+AuFzeGpLVhFOGO9mluyHBaA2bA8aCGTwah5sT3WV/fTHH8UNZUytOIImuGPrl/prlb4oX4qQ==", + "dev": true, + "requires": { + "postcss": "^7.0.6", + "postcss-selector-parser": "^5.0.0-rc.4" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "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 + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + } + } + }, + "css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + } + }, + "css-prefers-color-scheme": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-3.1.1.tgz", + "integrity": "sha512-MTu6+tMs9S3EUqzmqLXEcgNRbNkkD/TGFvowpeoWJn5Vfq7FMgsmRQs9X5NXAURiOBmOxm/lLjsDNXDE6k9bhg==", + "dev": true, + "requires": { + "postcss": "^7.0.5" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "css-select": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", + "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^5.1.0", + "domhandler": "^4.3.0", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", + "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "dev": true + }, + "cssdb": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-4.4.0.tgz", + "integrity": "sha512-LsTAR1JPEM9TpGhl/0p3nQecC2LJ0kD8X5YARu1hk/9I1gril5vDtMZyNxcEpxxDj34YNck/ucjuoUd66K03oQ==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==", + "dev": true + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.40", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.40.tgz", + "integrity": "sha512-j+eVIyQGt2EU5xPWUblhpp5P5z5xyAdRgzogBgfe2F5JGV17gr9pfzWBua6DlPL00LavbOjxubWkWkbVQe9Wlw==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "engine.io": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.0.tgz", + "integrity": "sha512-ErhZOVu2xweCjEfYcTdkCnEYUiZgkAcBBAhW4jbIvNG8SLU3orAqoJCiytZjYF7eTpVmmCrLDjLIEaPlUAs1uw==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.0", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.2.tgz", + "integrity": "sha512-wuiO7qO/OEkPJSFueuATIXtrxF7/6GTbAO9QLv7nnbjwZ5tYhLm9zxvLwxstRs0dcT0KUlWTjtIOs1T86jt12g==", + "dev": true, + "requires": { + "base64-arraybuffer": "~1.0.1" + } + }, + "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" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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 + }, + "esbuild": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.2.tgz", + "integrity": "sha512-l076A6o/PIgcyM24s0dWmDI/b8RQf41uWoJu9I0M71CtW/YSw5T5NUeXxs5lo2tFQD+O4CW4nBHJXx3OY5NpXg==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.14.2", + "esbuild-darwin-64": "0.14.2", + "esbuild-darwin-arm64": "0.14.2", + "esbuild-freebsd-64": "0.14.2", + "esbuild-freebsd-arm64": "0.14.2", + "esbuild-linux-32": "0.14.2", + "esbuild-linux-64": "0.14.2", + "esbuild-linux-arm": "0.14.2", + "esbuild-linux-arm64": "0.14.2", + "esbuild-linux-mips64le": "0.14.2", + "esbuild-linux-ppc64le": "0.14.2", + "esbuild-netbsd-64": "0.14.2", + "esbuild-openbsd-64": "0.14.2", + "esbuild-sunos-64": "0.14.2", + "esbuild-windows-32": "0.14.2", + "esbuild-windows-64": "0.14.2", + "esbuild-windows-arm64": "0.14.2" + } + }, + "esbuild-android-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.2.tgz", + "integrity": "sha512-hEixaKMN3XXCkoe+0WcexO4CcBVU5DCSUT+7P8JZiWZCbAjSkc9b6Yz2X5DSfQmRCtI/cQRU6TfMYrMQ5NBfdw==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.2.tgz", + "integrity": "sha512-Uq8t0cbJQkxkQdbUfOl2wZqZ/AtLZjvJulR1HHnc96UgyzG9YlCLSDMiqjM+NANEy7/zzvwKJsy3iNC9wwqLJA==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.2.tgz", + "integrity": "sha512-619MSa17sr7YCIrUj88KzQu2ESA4jKYtIYfLU/smX6qNgxQt3Y/gzM4s6sgJ4fPQzirvmXgcHv1ZNQAs/Xh48A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.2.tgz", + "integrity": "sha512-aP6FE/ZsChZpUV6F3HE3x1Pz0paoYXycJ7oLt06g0G9dhJKknPawXCqQg/WMyD+ldCEZfo7F1kavenPdIT/SGQ==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.2.tgz", + "integrity": "sha512-LSm98WTb1QIhyS83+Po0KTpZNdd2XpVpI9ua5rLWqKWbKeNRFwOsjeiuwBaRNc+O32s9oC2ZMefETxHBV6VNkQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.2.tgz", + "integrity": "sha512-8VxnNEyeUbiGflTKcuVc5JEPTqXfsx2O6ABwUbfS1Hp26lYPRPC7pKQK5Dxa0MBejGc50jy7YZae3EGQUQ8EkQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.2.tgz", + "integrity": "sha512-4bzMS2dNxOJoFIiHId4w+tqQzdnsch71JJV1qZnbnErSFWcR9lRgpSqWnTTFtv6XM+MvltRzSXC5wQ7AEBY6Hg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.2.tgz", + "integrity": "sha512-PaylahvMHhH8YMfJPMKEqi64qA0Su+d4FNfHKvlKes/2dUe4QxgbwXT9oLVgy8iJdcFMrO7By4R8fS8S0p8aVQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.2.tgz", + "integrity": "sha512-RlIVp0RwJrdtasDF1vTFueLYZ8WuFzxoQ1OoRFZOTyJHCGCNgh7xJIC34gd7B7+RT0CzLBB4LcM5n0LS+hIoww==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.2.tgz", + "integrity": "sha512-Fdwrq2roFnO5oetIiUQQueZ3+5soCxBSJswg3MvYaXDomj47BN6oAWMZgLrFh1oVrtWrxSDLCJBenYdbm2s+qQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.2.tgz", + "integrity": "sha512-vxptskw8JfCDD9QqpRO0XnsM1osuWeRjPaXX1TwdveLogYsbdFtcuiuK/4FxGiNMUr1ojtnCS2rMPbY8puc5NA==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.2.tgz", + "integrity": "sha512-I8+LzYK5iSNpspS9eCV9sW67Rj8FgMHimGri4mKiGAmN0pNfx+hFX146rYtzGtewuxKtTsPywWteHx+hPRLDsw==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.2.tgz", + "integrity": "sha512-120HgMe9elidWUvM2E6mMf0csrGwx8sYDqUIJugyMy1oHm+/nT08bTAVXuwYG/rkMIqsEO9AlMxuYnwR6En/3Q==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.2.tgz", + "integrity": "sha512-Q3xcf9Uyfra9UuCFxoLixVvdigo0daZaKJ97TL2KNA4bxRUPK18wwGUk3AxvgDQZpRmg82w9PnkaNYo7a+24ow==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.2.tgz", + "integrity": "sha512-Rs8NjWoo1UdsVjhxT2o6kLCX9Sh65pyd3/h4XeJ3jjQNM6NgL+/CSowuJgvOIjDAXMLXpc6fdGnyZQDil9IUJA==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.2.tgz", + "integrity": "sha512-TW7O49tPsrq+N1sW8mb3m24j/iDGa4xzAZH4wHWwoIzgtZAYPKC0hpIhufRRG/LA30bdMChO9pjJZ5mtcybtBQ==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.2.tgz", + "integrity": "sha512-Rym6ViMNmi1E2QuQMWy0AFAfdY0wGwZD73BnzlsQBX5hZBuy/L+Speh7ucUZ16gwsrMM9v86icZUDrSN/lNBKg==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.2", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.2.tgz", + "integrity": "sha512-ZrLbhr0vX5Em/P1faMnHucjVVWPS+m3tktAtz93WkMZLmbRJevhiW1y4CbulBd2z0MEdXZ6emDa1zFHq5O5bSA==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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 + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "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" + } + }, + "express": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.2.tgz", + "integrity": "sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.1", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.4.1", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.9.6", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.17.2", + "serve-static": "1.14.2", + "setprototypeof": "1.2.0", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "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 + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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 + }, + "fast-glob": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/flatten/-/flatten-1.0.3.tgz", + "integrity": "sha512-dVsPA/UwQ8+2uoFe5GHtiBMu48dWLTdsuEd7CKGlZlD78r1TTWBvDuFaFGKCo/ZfEr95Uk56vZoX86OsHkUeIg==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.7", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": 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 + }, + "gauge": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.0.tgz", + "integrity": "sha512-F8sU45yQpjQjxKkm1UOAhf0U/O0aFt//Fl7hsrNVto+patMHjs7dPI9mFOGUKbhrgKm0S3EjW3scMFuQmWSROw==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1", + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.2", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.2" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "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.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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 + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.0.2.tgz", + "integrity": "sha512-lAsmb/5Lww4r7MM9nCCliDZVIKbZTavrsunAsHLr9oHthrZP1qi7/gAnHOsUs9bLvEt2vKVJhHmxuL7QbDuPdQ==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.8", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.2.tgz", + "integrity": "sha512-c3Ab/url5ksaT0WyleslpBEthOzWhrjQbg75y7XUsfSzi3Dgzt0l8w5e7DylRn15MTlMMD58dTfzddNS2kcAjQ==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + } + }, + "http-parser-js": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.5.tgz", + "integrity": "sha512-x+JVEkO2PoM8qqpbPbOL3cqHPwerep7OwzK7Ay+sMQjKzaKCqWvjoXm5tqMP9tXWWTnTzAjIhXg+J99XYuPhPA==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.1.tgz", + "integrity": "sha512-cfaXRVoZxSed/BmkA7SwBVNI9Kj7HFltaE5rqYOub5kWzWZ+gofV2koVN1j2rMW7pEfSSlCHGJ31xmuyFyfLOg==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.5", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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 + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "indexes-of": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz", + "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "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 + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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 + }, + "rxjs": { + "version": "7.5.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.2.tgz", + "integrity": "sha512-PwDt186XaL3QN5qXj/H9DGyHhP3/RYYgZZwqBv9Tv8rsAaiwFH1IsJJlcgD37J7UW5a6O67qX0KWKS3/pu0m4w==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "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-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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 + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "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 + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine-core": { + "version": "3.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.8.0.tgz", + "integrity": "sha512-zl0nZWDrmbCiKns0NcjkFGYkVTGCPUgoHypTaj+G2AzaWus7QGoXARSlYsSle2VRpSdfJmM+hzmFKzQNhF2kHg==", + "dev": true + }, + "jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "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" + } + } + } + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz", + "integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "karma": { + "version": "6.3.10", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.10.tgz", + "integrity": "sha512-Ofv+sgrkT8Czo6bzzQCvrwVyRSG8/3e7RbawEuxjfsINony+IR/S2csNRUFgPNfmWvju+dqi/MzQGOJ2LnlmfQ==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.3.0", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.2.0", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.0.3.tgz", + "integrity": "sha512-atDvLQqvPcLxhED0cmXYdsPMCQuh6Asa9FMZW1bhNqlVEhJoB9qyZ2BY1gu7D/rr5GLGb5QzYO4siQskxaWP/g==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "istanbul-lib-instrument": "^4.0.1", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.0", + "istanbul-reports": "^3.0.0", + "minimatch": "^3.0.4" + }, + "dependencies": { + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "karma-jasmine": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-4.0.1.tgz", + "integrity": "sha512-h8XDAhTiZjJKzfkoO1laMH+zfNlra+dEQHUAjpn5JV1zCPtOIVWGQjLBrqhnzQa/hrU2XrZwSyBa6XjEBzfXzw==", + "dev": true, + "requires": { + "jasmine-core": "^3.6.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "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 + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "license-webpack-plugin": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.0.tgz", + "integrity": "sha512-b9iMrROrw2fTOJBZ57h0xJfT5/1Cxg4ucYbtpWoukv4Awb2TFPfDDFVHNM8w6SYQpVfB13a5tQJxgGamqwrsyw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true + }, + "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 + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.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": "2.4.5", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.4.5.tgz", + "integrity": "sha512-oEIhRucyn1JbT/1tU2BhnwO6ft1jjH1iCX9Gc59WFMg0n5773rQU0oyQ0zzeYFFuBfONaRbQJyGoPtuNseMxjA==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "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 + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.1.31", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz", + "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "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 + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-forge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.0.tgz", + "integrity": "sha512-M4AsdaP0bGNaSPtatd/+f76asocI0cFaURRdeQVZvrJBrYp2Qohv5hDbGHykuNqCb1BYjWHjdS6HlN50qbztwA==", + "dev": true + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "node-gyp-build": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", + "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.1.tgz", + "integrity": "sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-registry-fetch": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-11.0.0.tgz", + "integrity": "sha512-jmlgSxoDNuhAtxUIG6pVwwtz840i994dL14FoNVZisrmZW5kWd63IUTNv1m/hyRSGSqWjCUp/YZlS1BJyNp9XA==", + "dev": true, + "requires": { + "make-fetch-happen": "^9.0.1", + "minipass": "^3.1.3", + "minipass-fetch": "^1.3.0", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.0.0", + "npm-package-arg": "^8.0.0" + } + }, + "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" + } + }, + "npmlog": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.0.tgz", + "integrity": "sha512-03ppFRGlsyUaQFbGC2C8QWJN/C/K7PsfyD9aQdhVKAQIH4sQBc8WASqFBP7O+Ut4d2oo5LoeoboB3cGdBZSp6Q==", + "dev": true, + "requires": { + "are-we-there-yet": "^2.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.0", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-client": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.5.tgz", + "integrity": "sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==", + "requires": { + "acorn": "^7.4.1", + "base64-js": "^1.5.1", + "core-js": "^3.8.3", + "crypto-js": "^4.0.0", + "serialize-javascript": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "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" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "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-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" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.1.tgz", + "integrity": "sha512-e2xXGNhZOZ0lfgR9kL34iGlU8N/KO0xZnQxVEwdeOvpqNDQfdnxIYizvWtK8RglUa3bGqI8g0R/BdfzLMxRkiA==", + "dev": true, + "requires": { + "@types/retry": "^0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "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 + }, + "pacote": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.2.tgz", + "integrity": "sha512-Ar3mhjcxhMzk+OVZ8pbnXdb0l8+pimvlsqBGRNkble2NVgyqOGE3yrCGi/lAYq7E7NRDMz89R1Wx5HIMCGgeYg==", + "dev": true, + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^11.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "piscina": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.1.0.tgz", + "integrity": "sha512-KTW4sjsCD34MHrUbx9eAAbuUSpVj407hQSgk/6Epkg0pbRBmv4a3UX7Sr8wxm9xYqQLnsN4mFOjqGDzHAdgKQg==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "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" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + } + } + }, + "postcss": { + "version": "8.4.4", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.4.tgz", + "integrity": "sha512-joU6fBsN6EIer28Lj6GDFoC/5yOZzLCfn0zHAn/MYXI7aPt4m4hK5KC5ovEZXy+lnCjmYIbQWngvju2ddyEr8Q==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "postcss-attribute-case-insensitive": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-4.0.2.tgz", + "integrity": "sha512-clkFxk/9pcdb4Vkn0hAHq3YnxBQ2p0CGD1dy24jN+reBck+EWxMbxSUqN4Yj7t0w8csl87K6p0gxBe1utkJsYA==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^6.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-color-functional-notation": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-2.0.1.tgz", + "integrity": "sha512-ZBARCypjEDofW4P6IdPVTLhDNXPRn8T2s1zHbZidW6rPaaZvcnCS2soYFIQJrMZSxiePJ2XIYTlcb2ztr/eT2g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-color-gray": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-color-gray/-/postcss-color-gray-5.0.0.tgz", + "integrity": "sha512-q6BuRnAGKM/ZRpfDascZlIZPjvwsRye7UDNalqVz3s7GDxMtqPY6+Q871liNxsonUw8oC61OG+PSaysYpl1bnw==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-color-hex-alpha": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-5.0.3.tgz", + "integrity": "sha512-PF4GDel8q3kkreVXKLAGNpHKilXsZ6xuu+mOQMHWHLPNyjiUBOr75sp5ZKJfmv1MCus5/DWUGcK9hm6qHEnXYw==", + "dev": true, + "requires": { + "postcss": "^7.0.14", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-color-mod-function": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-mod-function/-/postcss-color-mod-function-3.0.3.tgz", + "integrity": "sha512-YP4VG+xufxaVtzV6ZmhEtc+/aTXH3d0JLpnYfxqTvwZPbJhWqp8bSY3nfNzNRFLgB4XSaBA82OE4VjOOKpCdVQ==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-color-rebeccapurple": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-4.0.1.tgz", + "integrity": "sha512-aAe3OhkS6qJXBbqzvZth2Au4V3KieR5sRQ4ptb2b2O8wgvB3SJBsdG+jsn2BZbbwekDG8nTfcCNKcSfe/lEy8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-custom-media": { + "version": "7.0.8", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-7.0.8.tgz", + "integrity": "sha512-c9s5iX0Ge15o00HKbuRuTqNndsJUbaXdiNsksnVH8H4gdc+zbLzr/UasOwNG6CTDpLFekVY4672eWdiiWu2GUg==", + "dev": true, + "requires": { + "postcss": "^7.0.14" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-custom-properties": { + "version": "8.0.11", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-8.0.11.tgz", + "integrity": "sha512-nm+o0eLdYqdnJ5abAJeXp4CEU1c1k+eB2yMCvhgzsds/e0umabFrN6HoTy/8Q4K5ilxERdl/JD1LO5ANoYBeMA==", + "dev": true, + "requires": { + "postcss": "^7.0.17", + "postcss-values-parser": "^2.0.1" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-custom-selectors": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-5.1.2.tgz", + "integrity": "sha512-DSGDhqinCqXqlS4R7KGxL1OSycd1lydugJ1ky4iRXPHdBRiozyMHrdu0H3o7qNOCiZwySZTUI5MV0T8QhCLu+w==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "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 + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + } + } + }, + "postcss-dir-pseudo-class": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-5.0.0.tgz", + "integrity": "sha512-3pm4oq8HYWMZePJY+5ANriPs3P07q+LW6FAdTlkFH2XqDdP4HeeJYMOzn0HYLhRSjBO3fhiqSwwU9xEULSrPgw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "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 + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + } + } + }, + "postcss-double-position-gradients": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-1.0.0.tgz", + "integrity": "sha512-G+nV8EnQq25fOI8CH/B6krEohGWnF5+3A6H/+JEpOncu5dCnkS1QQ6+ct3Jkaepw1NGVqqOZH6lqrm244mCftA==", + "dev": true, + "requires": { + "postcss": "^7.0.5", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-env-function": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-2.0.2.tgz", + "integrity": "sha512-rwac4BuZlITeUbiBq60h/xbLzXY43qOsIErngWa4l7Mt+RaSkT7QBjXVGTcBHupykkblHMDrBFh30zchYPaOUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-focus-visible": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-4.0.0.tgz", + "integrity": "sha512-Z5CkWBw0+idJHSV6+Bgf2peDOFf/x4o+vX/pwcNYrWpXFrSfTkQ3JQ1ojrq9yS+upnAlNRHeg8uEwFTgorjI8g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-focus-within": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-3.0.0.tgz", + "integrity": "sha512-W0APui8jQeBKbCGZudW37EeMCjDeVxKgiYfIIEo8Bdh5SpB9sxds/Iq8SEuzS0Q4YFOlG7EPFulbbxujpkrV2w==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-font-variant": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-4.0.1.tgz", + "integrity": "sha512-I3ADQSTNtLTTd8uxZhtSOrTCQ9G4qUVKPjHiDk0bV75QSxXjVWiJVJ2VLdspGUi9fbW9BcjKJoRvxAH1pckqmA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-gap-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-2.0.0.tgz", + "integrity": "sha512-QZSqDaMgXCHuHTEzMsS2KfVDOq7ZFiknSpkrPJY6jmxbugUPTuSzs/vuE5I3zv0WAS+3vhrlqhijiprnuQfzmg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-image-set-function": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-3.0.1.tgz", + "integrity": "sha512-oPTcFFip5LZy8Y/whto91L9xdRHCWEMs3e1MdJxhgt4jy2WYXfhkng59fH5qLXSCPN8k4n94p1Czrfe5IOkKUw==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-3.0.4.tgz", + "integrity": "sha512-3RLn6DIpMsK1l5UUy9jxQvoDeUN4gP939tDcKUHD/kM8SGSKbFAnvkpFpj3Bhtz3HGk1jWY5ZNWX6mPta5M9fg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-lab-function": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-2.0.1.tgz", + "integrity": "sha512-whLy1IeZKY+3fYdqQFuDBf8Auw+qFuVnChWjmxm/UhHWqNHZx+B99EwxTvGYmUBqe3Fjxs4L1BoZTJmPu6usVg==", + "dev": true, + "requires": { + "@csstools/convert-colors": "^1.4.0", + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-3.0.0.tgz", + "integrity": "sha512-1SUKdJc2vuMOmeItqGuNaC+N8MzBWFWEkAnRnLpFYj1tGGa7NqyVBujfRtgNa2gXR+6RkGUiB2O5Vmh7E2RmiA==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-media-minmax": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-4.0.0.tgz", + "integrity": "sha512-fo9moya6qyxsjbFAYl97qKO9gyre3qvbMnkOZeZwlsW6XYFsvs2DMGDlchVLfAd8LHPZDxivu/+qW2SMQeTHBw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-7.0.1.tgz", + "integrity": "sha512-FrorPb0H3nuVq0Sff7W2rnc3SmIcruVC6YwpcS+k687VxyxO33iE1amna7wHuRVzM8vfiYofXSBHNAZ3QhLvYg==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-overflow-shorthand": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-2.0.0.tgz", + "integrity": "sha512-aK0fHc9CBNx8jbzMYhshZcEv8LtYnBIRYQD5i7w/K/wS9c2+0NSR6B3OVMu5y0hBHYLcMGjfU+dmWYNKH0I85g==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-page-break": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-2.0.0.tgz", + "integrity": "sha512-tkpTSrLpfLfD9HvgOlJuigLuk39wVTbbd8RKcy8/ugV2bNBUW3xU+AIqyxhDrQr1VUj1RmyJrBn1YWrqUm9zAQ==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-place": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-4.0.1.tgz", + "integrity": "sha512-Zb6byCSLkgRKLODj/5mQugyuj9bvAAw9LqJJjgwz5cYryGeXfFZfSXoP1UfveccFmeq0b/2xxwcTEVScnqGxBg==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-values-parser": "^2.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-preset-env": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-6.7.0.tgz", + "integrity": "sha512-eU4/K5xzSFwUFJ8hTdTQzo2RBLbDVt83QZrAvI07TULOkmyQlnYlpwep+2yIK+K+0KlZO4BvFcleOCCcUtwchg==", + "dev": true, + "requires": { + "autoprefixer": "^9.6.1", + "browserslist": "^4.6.4", + "caniuse-lite": "^1.0.30000981", + "css-blank-pseudo": "^0.1.4", + "css-has-pseudo": "^0.10.0", + "css-prefers-color-scheme": "^3.1.1", + "cssdb": "^4.4.0", + "postcss": "^7.0.17", + "postcss-attribute-case-insensitive": "^4.0.1", + "postcss-color-functional-notation": "^2.0.1", + "postcss-color-gray": "^5.0.0", + "postcss-color-hex-alpha": "^5.0.3", + "postcss-color-mod-function": "^3.0.3", + "postcss-color-rebeccapurple": "^4.0.1", + "postcss-custom-media": "^7.0.8", + "postcss-custom-properties": "^8.0.11", + "postcss-custom-selectors": "^5.1.2", + "postcss-dir-pseudo-class": "^5.0.0", + "postcss-double-position-gradients": "^1.0.0", + "postcss-env-function": "^2.0.2", + "postcss-focus-visible": "^4.0.0", + "postcss-focus-within": "^3.0.0", + "postcss-font-variant": "^4.0.0", + "postcss-gap-properties": "^2.0.0", + "postcss-image-set-function": "^3.0.1", + "postcss-initial": "^3.0.0", + "postcss-lab-function": "^2.0.1", + "postcss-logical": "^3.0.0", + "postcss-media-minmax": "^4.0.0", + "postcss-nesting": "^7.0.0", + "postcss-overflow-shorthand": "^2.0.0", + "postcss-page-break": "^2.0.0", + "postcss-place": "^4.0.1", + "postcss-pseudo-class-any-link": "^6.0.0", + "postcss-replace-overflow-wrap": "^3.0.0", + "postcss-selector-matches": "^4.0.0", + "postcss-selector-not": "^4.0.0" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-pseudo-class-any-link": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-6.0.0.tgz", + "integrity": "sha512-lgXW9sYJdLqtmw23otOzrtbDXofUdfYzNm4PIpNE322/swES3VU9XlXHeJS46zT2onFO7V1QFdD4Q9LiZj8mew==", + "dev": true, + "requires": { + "postcss": "^7.0.2", + "postcss-selector-parser": "^5.0.0-rc.3" + }, + "dependencies": { + "cssesc": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-2.0.0.tgz", + "integrity": "sha512-MsCAG1z9lPdoO/IUMLSBWBSVxVtJ1395VGIQ+Fc2gNdkQ1hNDnQdw3YhA71WJCBW1vdwA0cAnk/DnW6bqoEUYg==", + "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 + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "postcss-selector-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-5.0.0.tgz", + "integrity": "sha512-w+zLE5Jhg6Liz8+rQOWEAwtwkyqpfnmsinXjXg6cY7YIONZZtgvE0v2O0uhQBs0peNomOJwWRKt6JBfTdTd3OQ==", + "dev": true, + "requires": { + "cssesc": "^2.0.0", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "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 + } + } + }, + "postcss-replace-overflow-wrap": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-3.0.0.tgz", + "integrity": "sha512-2T5hcEHArDT6X9+9dVSPQdo7QHzG4XKclFT8rU5TzJPDN7RIRTbO9c4drUISOVemLj03aezStHCR2AIcr8XLpw==", + "dev": true, + "requires": { + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-selector-matches": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-matches/-/postcss-selector-matches-4.0.0.tgz", + "integrity": "sha512-LgsHwQR/EsRYSqlwdGzeaPKVT0Ml7LAT6E75T8W8xLJY62CE4S/l03BWIt3jT8Taq22kXP08s2SfTSzaraoPww==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-selector-not": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-4.0.1.tgz", + "integrity": "sha512-YolvBgInEK5/79C+bdFMyzqTg6pkYqDbzZIST/PDMqa/o3qtXenD05apBG2jLgT0/BQ77d4U2UK12jWpilqMAQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "postcss": "^7.0.2" + }, + "dependencies": { + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "postcss-selector-parser": { + "version": "6.0.8", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.8.tgz", + "integrity": "sha512-D5PG53d209Z1Uhcc0qAZ5U3t5HagH3cxu+WLZ22jt3gLUpXM4eXXfiO14jiDWST3NNooX/E8wISfOhZ9eIjGTQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "postcss-values-parser": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/postcss-values-parser/-/postcss-values-parser-2.0.1.tgz", + "integrity": "sha512-2tLuBsA6P4rYTNKCXYG/71C7j1pU6pK503suYOmn4xYrQIzW+opD+7FAFNuGSdZC/3Qfy334QbeMu7MEb8gOxg==", + "dev": true, + "requires": { + "flatten": "^1.0.2", + "indexes-of": "^1.0.1", + "uniq": "^1.0.1" + } + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": 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 + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.9.6", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.9.6.tgz", + "integrity": "sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ==", + "dev": true + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dev": true, + "requires": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-9.0.0.tgz", + "integrity": "sha512-3E12UeNSPfjrgwjkR81m5J7Aw/T55Tu7nUyZVQYCKEOs+2dkxEY+DpPtZzO4YruuiPb7NkYLVcyJC4+zCbk5pA==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.1.tgz", + "integrity": "sha512-JiBdRBq91WlY7uRJ0ds7R+dU02i6LKi8r3BuQhNXn+kmeLN+EfHhfjqMRis1zJxnlu88hq/4dx0P2OP3APRTOA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "regexpu-core": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.8.0.tgz", + "integrity": "sha512-1F6bYsoYiz6is+oz70NWur2Vlh9KWtswuRuzJOfeYUrfPX2o8n74AnUVaOGDbUqVGO9fNHu48/pjJO4sNVwsOg==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^9.0.0", + "regjsgen": "^0.5.2", + "regjsparser": "^0.7.0", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.7.0.tgz", + "integrity": "sha512-A4pcaORqmNMDVwUjWoTzuhwMGpP+NykpfqAsEgI1FSH/EzC7lrN5TMd+kN8YCovX+jMpu8eaqXgXPCa0g8FQNQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "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-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + }, + "resolve-url-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-4.0.0.tgz", + "integrity": "sha512-05VEMczVREcbtT7Bz+C+96eUO5HDNvdthIiMB34t7FcF8ehcu4wC0sSgPUubs3XW2Q3CNLJk/BJrCU9wVRymiA==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^7.0.35", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "picocolors": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-0.2.1.tgz", + "integrity": "sha512-cMlDqaLEqfSaW8Z7N5Jw+lyIW869EzT73/F5lhtY9cLGoVxSXznfgfXMO0Z5K0o0Q2TkTXq+0KFsdnSe3jDViA==", + "dev": true + }, + "postcss": { + "version": "7.0.39", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.39.tgz", + "integrity": "sha512-yioayjNbHn6z1/Bywyb2Y4s3yvDAeXGOyxqD+LnVOinq6Mdmd++SW2wUNVzavyyHxd6+DxzWGIuosg6P1Rj8uA==", + "dev": true, + "requires": { + "picocolors": "^0.2.1", + "source-map": "^0.6.1" + } + }, + "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 + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-script-os": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", + "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==" + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + } + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.44.0.tgz", + "integrity": "sha512-0hLREbHFXGQqls/K8X+koeP+ogFRPF4ZqetVB19b7Cst9Er8cOR0rc6RU7MaI4W1JmUShd1BPgPoeqmmgMMYFw==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0" + } + }, + "sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "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 + }, + "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 + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "1.10.13", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.13.tgz", + "integrity": "sha512-UmLwTKZwNmXYDAlRFhaEdgEg0dp9k5gfJXuO7uKvSqioN1M0+Mgf4V39IlVZMSuqGoCi6h5legkhNXvWy0rFSg==", + "dev": true, + "requires": { + "node-forge": "^1.2.0" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "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" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "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.6", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.6.tgz", + "integrity": "sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.1.tgz", + "integrity": "sha512-kLQ9N5ucj8uIcxrDwjm0Jsqk06xdpBjGNQtpXy4Q8/QY2k+fY7nZH8CARy+hkbG+SGAovmzzuauCpBlb8FrnBA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.1.1.tgz", + "integrity": "sha512-t8J0kG3csjA4g6FTbsMOWws+7R7vuRC8aQ/wy3/1OWmsgwA68zs/+cExQ0koSitUDXqhufF/YJr9wtNMZHw5Ew==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.1", + "socks": "^2.6.1" + } + }, + "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 + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.0.tgz", + "integrity": "sha512-GKGWqWvYr04M7tn8dryIWvb0s8YM41z82iQv01yBtIylgxax0CwvSy6gc2Y02iuXwEfGWRlMicH0nvms9UZphw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.2", + "source-map-js": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + }, + "source-map-js": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-0.6.2.tgz", + "integrity": "sha512-/3GptzWzu0+0MBQFrDKzw/DvvMTUORvgY6k6jd/VS6iCR4RDTKWH6v6WPwQoUO8667uQEf9Oe38DxAYWY5F/Ug==", + "dev": true + } + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "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 + } + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "stylus": { + "version": "0.55.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.55.0.tgz", + "integrity": "sha512-MuzIIVRSbc8XxHH7FjkvWqkIcr1BvoMZoR/oFuAJDlh7VSaNJzrB4uJ38GRQa+mWjLXODAMzeDe0xi9GYbGwnw==", + "dev": true, + "requires": { + "css": "^3.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.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" + } + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", + "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "requires": { + "jest-worker": "^27.4.1", + "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 + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-assert": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.8.tgz", + "integrity": "sha512-5NkbXZUlmCE73Fs7gvkp1XXJWHYetPkg60QnQ2NXQmBYNFxbBr2zA8GCtaH4K2s2WhOmSlgiSTmrjrcm5tnM5g==", + "dev": true + }, + "typescript": { + "version": "4.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.4.4.tgz", + "integrity": "sha512-DqGhF5IKoBl8WNf8C1gu8q0xZSInh9j1kJJMqT3a94w1JzVaBU4EXOSMrz9yDqMT0xt3selp83fuFMQ0uzv6qA==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "uniq": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz", + "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "5.65.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.65.0.tgz", + "integrity": "sha512-Q5or2o6EKs7+oKmJo7LaqZaMOlDWQse9Tm5l1WAfU/ujLGN5Pb0SqGeVkN/4bpPmEqEP5RnVhiqsOtWtUVwGRw==", + "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.3.1", + "webpack-sources": "^3.2.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 + }, + "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 + }, + "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-dev-middleware": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.2.2.tgz", + "integrity": "sha512-DjZyYrsHhkikAFNvSNKrpnziXukU1EChFAh9j4LAm6ndPLPW8cN0KhM7T+RAiOqsQ6ABfQ8hoKIs9IWMTjov+w==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.6.0.tgz", + "integrity": "sha512-oojcBIKvx3Ya7qs1/AVWHDgmP1Xml8rGsEBnSobxU/UJSX1xP1GPM3MwsAnDzvqcVmVki8tV7lbcsjEjk0PtYg==", + "dev": true, + "requires": { + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^1.10.11", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^5.2.1", + "ws": "^8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "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": "3.2.2", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.2.tgz", + "integrity": "sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw==", + "dev": true + }, + "webpack-subresource-integrity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.0.0.tgz", + "integrity": "sha512-x9514FpLRydO+UAQ8DY4aLtCjxmdLkuQVcDFN1kGzuusREYJ1B0rzk/iIlWiL6dnvrhEGFj2+UsdxDkP8Z4UKg==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true + }, + "xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.3.1.tgz", + "integrity": "sha512-WUANQeVgjLbNsEmGk20f+nlHgOqzRFpiGWVaBrYGYIGANIIu3lWjoyi0fNlFmJkvfhCZ6BXINe7/W2O2bV4iaA==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.0.tgz", + "integrity": "sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==", + "dev": true + }, + "zone.js": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", + "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "requires": { + "tslib": "^2.0.0" + } + } + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package.json new file mode 100644 index 00000000..3bfc257c --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/package.json @@ -0,0 +1,51 @@ +{ + "name": "changereturntype", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "prestart": "node aspnetcore-https", + "start": "run-script-os", + "start:windows": "ng serve --port 44442 --ssl --ssl-cert %APPDATA%\\ASP.NET\\https\\%npm_package_name%.pem --ssl-key %APPDATA%\\ASP.NET\\https\\%npm_package_name%.key", + "start:default": "ng serve --port 44442 --ssl --ssl-cert $HOME/.aspnet/https/${npm_package_name}.pem --ssl-key $HOME/.aspnet/https/${npm_package_name}.key", + "build": "ng build", + "build:ssr": "ng run ChangeReturnType:server:dev", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "~13.1.1", + "@angular/common": "~13.1.1", + "@angular/compiler": "~13.1.1", + "@angular/core": "~13.1.1", + "@angular/forms": "~13.1.1", + "@angular/platform-browser": "~13.1.1", + "@angular/platform-browser-dynamic": "~13.1.1", + "@angular/platform-server": "~13.1.1", + "@angular/router": "~13.1.1", + "bootstrap": "^5.1.3", + "jquery": "^3.6.0", + "oidc-client": "^1.11.5", + "popper.js": "^1.16.0", + "run-script-os": "^1.1.6", + "rxjs": "~6.6.0", + "tslib": "^2.1.0", + "zone.js": "~0.11.4" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~13.1.2", + "@angular/cli": "~13.1.2", + "@angular/compiler-cli": "~13.1.1", + "@types/jasmine": "~3.6.0", + "@types/jasminewd2": "~2.0.8", + "@types/node": "^12.11.1", + "jasmine-core": "~3.8.0", + "karma": "~6.3.0", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage": "~2.0.3", + "karma-jasmine": "~4.0.0", + "karma-jasmine-html-reporter": "^1.5.0", + "typescript": "~4.4.4" + }, + "optionalDependencies": {} +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/proxy.conf.js b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/proxy.conf.js new file mode 100644 index 00000000..bfac7a30 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/proxy.conf.js @@ -0,0 +1,19 @@ +const { env } = require('process'); + +const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` : + env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'http://localhost:28996'; + +const PROXY_CONFIG = [ + { + context: [ + "/weatherforecast", + ], + target: target, + secure: false, + headers: { + Connection: 'Keep-Alive' + } + } +] + +module.exports = PROXY_CONFIG; diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.html new file mode 100644 index 00000000..7173845e --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.html @@ -0,0 +1,6 @@ + + +
+ +
+ diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.ts new file mode 100644 index 00000000..0a40b8c1 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent { + title = 'app'; +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.module.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.module.ts new file mode 100644 index 00000000..cecddedb --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.module.ts @@ -0,0 +1,34 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { NavMenuComponent } from './nav-menu/nav-menu.component'; +import { HomeComponent } from './home/home.component'; +import { CounterComponent } from './counter/counter.component'; +import { FetchDataComponent } from './fetch-data/fetch-data.component'; + +@NgModule({ + declarations: [ + AppComponent, + NavMenuComponent, + HomeComponent, + CounterComponent, + FetchDataComponent + ], + imports: [ + BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), + HttpClientModule, + FormsModule, + RouterModule.forRoot([ + { path: '', component: HomeComponent, pathMatch: 'full' }, + { path: 'counter', component: CounterComponent }, + { path: 'fetch-data', component: FetchDataComponent }, + ]) + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.server.module.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.server.module.ts new file mode 100644 index 00000000..cfb0e021 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/app.server.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; +import { AppComponent } from './app.component'; +import { AppModule } from './app.module'; + +@NgModule({ + imports: [AppModule, ServerModule, ModuleMapLoaderModule], + bootstrap: [AppComponent] +}) +export class AppServerModule { } diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.html new file mode 100644 index 00000000..89b9c80f --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.html @@ -0,0 +1,7 @@ +

Counter

+ +

This is a simple example of an Angular component.

+ +

Current count: {{ currentCount }}

+ + diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.spec.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.spec.ts new file mode 100644 index 00000000..37b350cc --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CounterComponent } from './counter.component'; + +describe('CounterComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CounterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CounterComponent); + fixture.detectChanges(); + }); + + it('should display a title', async(() => { + const titleText = fixture.nativeElement.querySelector('h1').textContent; + expect(titleText).toEqual('Counter'); + })); + + it('should start with count 0, then increments by 1 when clicked', async(() => { + const countElement = fixture.nativeElement.querySelector('strong'); + expect(countElement.textContent).toEqual('0'); + + const incrementButton = fixture.nativeElement.querySelector('button'); + incrementButton.click(); + fixture.detectChanges(); + expect(countElement.textContent).toEqual('1'); + })); +}); diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.ts new file mode 100644 index 00000000..1f336aa9 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/counter/counter.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-counter-component', + templateUrl: './counter.component.html' +}) +export class CounterComponent { + public currentCount = 0; + + public incrementCounter() { + this.currentCount++; + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.html new file mode 100644 index 00000000..19b3835d --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.html @@ -0,0 +1,24 @@ +

Weather forecast

+ +

This component demonstrates fetching data from the server.

+ +

Loading...

+ + + + + + + + + + + + + + + + + + +
DateTemp. (C)Temp. (F)Summary
{{ forecast.date }}{{ forecast.temperatureC }}{{ forecast.temperatureF }}{{ forecast.summary }}
diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.ts new file mode 100644 index 00000000..a5b14777 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/fetch-data/fetch-data.component.ts @@ -0,0 +1,23 @@ +import { Component, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-fetch-data', + templateUrl: './fetch-data.component.html' +}) +export class FetchDataComponent { + public forecasts: WeatherForecast[] = []; + + constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) { + http.get(baseUrl + 'weatherforecast').subscribe(result => { + this.forecasts = result; + }, error => console.error(error)); + } +} + +interface WeatherForecast { + date: string; + temperatureC: number; + temperatureF: number; + summary: string; +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.html new file mode 100644 index 00000000..f74c2e78 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.html @@ -0,0 +1,14 @@ +

Hello, world!

+

Welcome to your new single-page application, built with:

+ +

To help you get started, we've also set up:

+
    +
  • Client-side navigation. For example, click Counter then Back to return here.
  • +
  • Angular CLI integration. In development mode, there's no need to run ng serve. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.
  • +
  • Efficient production builds. In production mode, development-time features are disabled, and your dotnet publish configuration automatically invokes ng build to produce minified, ahead-of-time compiled JavaScript files.
  • +
+

The ClientApp subdirectory is a standard Angular CLI application. If you open a command prompt in that directory, you can run any ng command (e.g., ng test), or use npm to install extra packages into it.

diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.ts new file mode 100644 index 00000000..2747b302 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/home/home.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/custom-weather-forecast.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/custom-weather-forecast.ts new file mode 100644 index 00000000..13b42748 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/custom-weather-forecast.ts @@ -0,0 +1,5 @@ +import { WeatherForecast } from './weather-forecast'; + +export class CustomWeatherForecast extends WeatherForecast { + public additionalProperty: string = ''; +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/weather-forecast.ts new file mode 100644 index 00000000..e8ec0a38 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/models/weather-forecast.ts @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class WeatherForecast { + public date?: Date = new Date(0); + public temperatureC?: number = 0; + public temperatureF?: number = 0; + public summary?: string | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:fc26dcad-6b61-49d1-a5a1-1915cdb8dd48 diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.css b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.css new file mode 100644 index 00000000..10389ef9 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.css @@ -0,0 +1,18 @@ +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.html new file mode 100644 index 00000000..37a13a22 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.html @@ -0,0 +1,44 @@ +
+ +
diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.ts new file mode 100644 index 00000000..327a3743 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/nav-menu/nav-menu.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-nav-menu', + templateUrl: './nav-menu.component.html', + styleUrls: ['./nav-menu.component.css'] +}) +export class NavMenuComponent { + isExpanded = false; + + collapse() { + this.isExpanded = false; + } + + toggle() { + this.isExpanded = !this.isExpanded; + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/services/weather-forecast-api.service.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/services/weather-forecast-api.service.ts new file mode 100644 index 00000000..9b46b50e --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/app/services/weather-forecast-api.service.ts @@ -0,0 +1,72 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +import { CustomWeatherForecast } from "../models/custom-weather-forecast"; +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { SpecialWeatherForecast } from "@my-lib/models"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WeatherForecastApiService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public get(httpOptions?: {}): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public specialGet(httpOptions?: {}): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:fc26dcad-6b61-49d1-a5a1-1915cdb8dd48 diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/assets/.gitkeep b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.prod.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.ts new file mode 100644 index 00000000..f56ff470 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/index.html b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/index.html new file mode 100644 index 00000000..585e3558 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/index.html @@ -0,0 +1,14 @@ + + + + + Codestin Search App + + + + + + + Loading... + + diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/main.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/main.ts new file mode 100644 index 00000000..a2f708cb --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +export function getBaseUrl() { + return document.getElementsByTagName('base')[0].href; +} + +const providers = [ + { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] } +]; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic(providers).bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/polyfills.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/polyfills.ts new file mode 100644 index 00000000..373f538a --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/polyfills.ts @@ -0,0 +1,65 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * IE11 requires the following for NgClass support on SVG elements + */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/styles.css b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/styles.css new file mode 100644 index 00000000..3ef6a649 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/styles.css @@ -0,0 +1,16 @@ +/* You can add global styles to this file, and also import other style files */ + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +code { + color: #e01a76; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/test.ts b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/test.ts new file mode 100644 index 00000000..20423564 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/src/test.ts @@ -0,0 +1,25 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.app.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.app.json new file mode 100644 index 00000000..82d91dc4 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.json new file mode 100644 index 00000000..03a93188 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.spec.json b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.spec.json new file mode 100644 index 00000000..1762d063 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/ClientApp/tsconfig.spec.json @@ -0,0 +1,19 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/Controllers/WeatherForecastController.cs b/Examples/Angular/Annotation/ChangeReturnType/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..237ecf14 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/Controllers/WeatherForecastController.cs @@ -0,0 +1,42 @@ +using KY.Generator; +using Microsoft.AspNetCore.Mvc; + +namespace ChangeReturnType.Controllers; + +[ApiController] +[Route("[controller]")] +[GenerateAngularService("/ClientApp/src/app/services", "/ClientApp/src/app/models", "{0}ApiService")] +[GenerateImport(typeof(SpecialWeatherForecast), "@my-lib/models", "SpecialWeatherForecast")] +public class WeatherForecastController : ControllerBase +{ + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + [GenerateReturnType("CustomWeatherForecast[]", "custom-weather-forecast", "CustomWeatherForecast")] + public IEnumerable Get() + { + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = Random.Shared.Next(-20, 55), + Summary = Summaries[Random.Shared.Next(Summaries.Length)] + }) + .ToArray(); + } + + [HttpGet] + public IEnumerable SpecialGet() + { + return Enumerable.Empty(); + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml b/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml new file mode 100644 index 00000000..b5105b6d --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

\ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml.cs b/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml.cs new file mode 100644 index 00000000..cba981c2 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/Pages/Error.cshtml.cs @@ -0,0 +1,25 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace ChangeReturnType.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +public class ErrorModel : PageModel +{ + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} \ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType/Pages/_ViewImports.cshtml b/Examples/Angular/Annotation/ChangeReturnType/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..1f6776d2 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using ChangeReturnType +@namespace ChangeReturnType.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType/Program.cs b/Examples/Angular/Annotation/ChangeReturnType/Program.cs new file mode 100644 index 00000000..01873979 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/Program.cs @@ -0,0 +1,27 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllersWithViews(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapControllerRoute( + name: "default", + pattern: "{controller}/{action=Index}/{id?}"); + +app.MapFallbackToFile("index.html"); +; + +app.Run(); \ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType/SpecialWeatherForecast.cs b/Examples/Angular/Annotation/ChangeReturnType/SpecialWeatherForecast.cs new file mode 100644 index 00000000..06efdd44 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/SpecialWeatherForecast.cs @@ -0,0 +1,6 @@ +namespace ChangeReturnType; + +public class SpecialWeatherForecast : WeatherForecast +{ + +} \ No newline at end of file diff --git a/Examples/Angular/Annotation/ChangeReturnType/WeatherForecast.cs b/Examples/Angular/Annotation/ChangeReturnType/WeatherForecast.cs new file mode 100644 index 00000000..aacf0996 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/WeatherForecast.cs @@ -0,0 +1,15 @@ +using KY.Generator; + +namespace ChangeReturnType; + +[GenerateAngularModel("/ClientApp/src/app/models")] +public class WeatherForecast +{ + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/appsettings.Development.json b/Examples/Angular/Annotation/ChangeReturnType/appsettings.Development.json new file mode 100644 index 00000000..84308c97 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.AspNetCore.SpaProxy": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/appsettings.json b/Examples/Angular/Annotation/ChangeReturnType/appsettings.json new file mode 100644 index 00000000..ad75fee4 --- /dev/null +++ b/Examples/Angular/Annotation/ChangeReturnType/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, +"AllowedHosts": "*" +} diff --git a/Examples/Angular/Annotation/ChangeReturnType/wwwroot/favicon.ico b/Examples/Angular/Annotation/ChangeReturnType/wwwroot/favicon.ico new file mode 100644 index 00000000..63e859b4 Binary files /dev/null and b/Examples/Angular/Annotation/ChangeReturnType/wwwroot/favicon.ico differ diff --git a/Examples/Angular/Annotation/FromModel.sln b/Examples/Angular/Annotation/FromModel.sln new file mode 100644 index 00000000..ba9fd8cc --- /dev/null +++ b/Examples/Angular/Annotation/FromModel.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FromModel", "FromModel\FromModel.csproj", "{D8163BA2-D463-4B54-8FE2-7E46ED7900B3}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D8163BA2-D463-4B54-8FE2-7E46ED7900B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D8163BA2-D463-4B54-8FE2-7E46ED7900B3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D8163BA2-D463-4B54-8FE2-7E46ED7900B3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D8163BA2-D463-4B54-8FE2-7E46ED7900B3}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Annotation/FromModel/FromModel.csproj b/Examples/Angular/Annotation/FromModel/FromModel.csproj new file mode 100644 index 00000000..60002f77 --- /dev/null +++ b/Examples/Angular/Annotation/FromModel/FromModel.csproj @@ -0,0 +1,12 @@ + + + + net5.0 + + + + + + + + diff --git a/Examples/Angular/Annotation/FromModel/Output/Models/type-to-read.ts b/Examples/Angular/Annotation/FromModel/Output/Models/type-to-read.ts new file mode 100644 index 00000000..c6ce964d --- /dev/null +++ b/Examples/Angular/Annotation/FromModel/Output/Models/type-to-read.ts @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 8.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class TypeToRead { + public stringProperty: string; + public numberProperty: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:d8163ba2-d463-4b54-8fe2-7e46ed7900b3 diff --git a/Examples/Angular/Annotation/FromModel/TypeToRead.cs b/Examples/Angular/Annotation/FromModel/TypeToRead.cs new file mode 100644 index 00000000..d5f57bd4 --- /dev/null +++ b/Examples/Angular/Annotation/FromModel/TypeToRead.cs @@ -0,0 +1,11 @@ +using KY.Generator; + +namespace FromModel +{ + [GenerateAngularModel("Output/Models")] + internal class TypeToRead + { + public string StringProperty { get; set; } + public int NumberProperty { get; set; } + } +} diff --git a/Examples/Angular/Annotation/ModelFromAssembly/Index.cs b/Examples/Angular/Annotation/ModelFromAssembly/Index.cs index 3dd14c09..20676ef5 100644 --- a/Examples/Angular/Annotation/ModelFromAssembly/Index.cs +++ b/Examples/Angular/Annotation/ModelFromAssembly/Index.cs @@ -2,11 +2,11 @@ namespace ModelFromAssembly { - [GenerateAngularIndex("Output")] + [GenerateAngularModel("Output"), GenerateOnlySubTypes] internal class Index { public TypeToRead type1; public AnotherType type2; public IgnoredType type3; } -} \ No newline at end of file +} diff --git a/Examples/Angular/Annotation/ModelFromAssembly/ModelFromAssembly.csproj b/Examples/Angular/Annotation/ModelFromAssembly/ModelFromAssembly.csproj index 4171a615..90273c03 100644 --- a/Examples/Angular/Annotation/ModelFromAssembly/ModelFromAssembly.csproj +++ b/Examples/Angular/Annotation/ModelFromAssembly/ModelFromAssembly.csproj @@ -6,8 +6,8 @@ - - + +
diff --git a/Examples/Angular/Annotation/ModelFromAssembly/Output/another-type.ts b/Examples/Angular/Annotation/ModelFromAssembly/Output/another-type.ts index 9ed87e1b..42489fd8 100644 --- a/Examples/Angular/Annotation/ModelFromAssembly/Output/another-type.ts +++ b/Examples/Angular/Annotation/ModelFromAssembly/Output/another-type.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class AnotherType { - public stringField: string; - public numberField: number; + public stringField?: string; + public numberField?: number; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Annotation/ModelFromAssembly/Output/index.ts b/Examples/Angular/Annotation/ModelFromAssembly/Output/index.ts new file mode 100644 index 00000000..08d359db --- /dev/null +++ b/Examples/Angular/Annotation/ModelFromAssembly/Output/index.ts @@ -0,0 +1,4 @@ + +export * from "./another-type"; +export * from "./type-to-read"; + diff --git a/Examples/Angular/Annotation/ModelFromAssembly/Output/type-to-read.ts b/Examples/Angular/Annotation/ModelFromAssembly/Output/type-to-read.ts index af99ce70..dcc4aed9 100644 --- a/Examples/Angular/Annotation/ModelFromAssembly/Output/type-to-read.ts +++ b/Examples/Angular/Annotation/ModelFromAssembly/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/models/weather-forecast.ts index 45ce1e3a..e7db724b 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,10 +10,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/services/weather-forecast.service.ts b/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/services/weather-forecast.service.ts index 050b986c..8fba329b 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/services/weather-forecast.service.ts +++ b/Examples/Angular/Annotation/ServiceFromAspNetCore/ClientApp/src/app/services/weather-forecast.service.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -31,24 +31,39 @@ export class WeatherForecastService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/weatherforecast", httpOptions).subscribe((result) => { + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { if (result) { result.forEach((entry) => { entry.date = this.convertToDate(entry.date); }); } - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + public convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCore/ServiceFromAspNetCore.csproj b/Examples/Angular/Annotation/ServiceFromAspNetCore/ServiceFromAspNetCore.csproj index ae303dc3..61c00e8d 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCore/ServiceFromAspNetCore.csproj +++ b/Examples/Angular/Annotation/ServiceFromAspNetCore/ServiceFromAspNetCore.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/connection-status.ts b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/connection-status.ts index 43ab7444..dbf96c50 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/connection-status.ts +++ b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/connection-status.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/weather-forecast.ts index d528df93..5d4ccc9c 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,10 +10,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/services/weather-hub.service.ts b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/services/weather-hub.service.ts index d5e4f97b..734b8d20 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/services/weather-hub.service.ts +++ b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ClientApp/src/app/services/weather-hub.service.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -28,11 +28,12 @@ import { Subject } from "rxjs"; providedIn: "root" }) export class WeatherHubService { - private isClosed: boolean; + private isClosed: boolean = true; public serviceUrl: string = ""; - public options: IHttpConnectionOptions; + public options: IHttpConnectionOptions = { + }; public logLevel: LogLevel = LogLevel.Error; - private connection: ReplaySubject; + private connection?: ReplaySubject; private readonly timeouts: number[] = [0, 0, 1000, 2000, 5000]; private readonly statusSubject: ReplaySubject = new ReplaySubject(1); public readonly status$: Observable = this.statusSubject.asObservable(); @@ -60,7 +61,7 @@ export class WeatherHubService { subject.next(); subject.complete(); this.statusSubject.next(ConnectionStatus.connected); - }).catch((error) => { + }).catch(() => { if (this.isClosed) { return; } diff --git a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ServiceFromAspNetCoreSignalRHub.csproj b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ServiceFromAspNetCoreSignalRHub.csproj index ec70bac1..3508bc24 100644 --- a/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ServiceFromAspNetCoreSignalRHub.csproj +++ b/Examples/Angular/Annotation/ServiceFromAspNetCoreSignalRHub/ServiceFromAspNetCoreSignalRHub.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/index.ts b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/index.ts new file mode 100644 index 00000000..2fb0ae2a --- /dev/null +++ b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./sub-type"; +export * from "./weather-forecast"; + diff --git a/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/sub-type.ts b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/sub-type.ts index 2cb4065a..44b9f3d1 100644 --- a/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/sub-type.ts +++ b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/sub-type.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. diff --git a/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/weather-forecast.ts index e9dc7d08..d15d7d3f 100644 --- a/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Annotation/Strict/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -12,16 +12,20 @@ import { SubType } from "./sub-type"; export class WeatherForecast { - public date: Date = new Date(0); - public temperatureC: number = 0; - public temperatureF: number = 0; - public summary: string | undefined; - public stringList: string[] | undefined; - public stringArray: string[] | undefined; - public stringDictionary: { [key: string]: string; } | undefined; - public object: unknown | undefined; - public subType: SubType | undefined; - public nullableDate: Date | undefined; + public date?: Date = new Date(0); + public temperatureC?: number = 0; + public temperatureF?: number = 0; + public summary?: string | undefined; + public stringList?: string[] | undefined; + public stringArray?: string[] | undefined; + public stringDictionary?: { [key: string]: string; } | undefined; + public object?: unknown | undefined; + public subType?: SubType | undefined; + public nullableDate?: Date | undefined; + public requiredString: string | undefined; + public requiredNotNullableString: string = ""; + public requiredInt: number = 0; + public requiredNotNullableList: string[] = []; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Annotation/Strict/ClientApp/src/app/services/weather-forecast-api.service.ts b/Examples/Angular/Annotation/Strict/ClientApp/src/app/services/weather-forecast-api.service.ts index afb38df2..157a36ad 100644 --- a/Examples/Angular/Annotation/Strict/ClientApp/src/app/services/weather-forecast-api.service.ts +++ b/Examples/Angular/Annotation/Strict/ClientApp/src/app/services/weather-forecast-api.service.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -31,24 +31,39 @@ export class WeatherForecastApiService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/weatherforecast", httpOptions).subscribe((result) => { + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { if (result) { result.forEach((entry) => { entry.date = this.convertToDate(entry.date); }); } - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + public convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Examples/Angular/Annotation/Strict/Strict.csproj b/Examples/Angular/Annotation/Strict/Strict.csproj index 4ddc3cc3..6280c58f 100644 --- a/Examples/Angular/Annotation/Strict/Strict.csproj +++ b/Examples/Angular/Annotation/Strict/Strict.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/Examples/Angular/Annotation/Strict/WeatherForecast.cs b/Examples/Angular/Annotation/Strict/WeatherForecast.cs index 08d772da..d856259f 100644 --- a/Examples/Angular/Annotation/Strict/WeatherForecast.cs +++ b/Examples/Angular/Annotation/Strict/WeatherForecast.cs @@ -1,5 +1,8 @@ using System; using System.Collections.Generic; +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; namespace Strict { @@ -19,6 +22,18 @@ public class WeatherForecast public object Object { get; set; } public SubType SubType { get; set; } public DateTime? NullableDate { get; set; } + + [Required] + public string RequiredString { get; set; } + + [Required, DefaultValue("")] + public string RequiredNotNullableString { get; set; } + + [Required] + public int RequiredInt { get; set; } + + [Required, DefaultValue(typeof(List))] + public List RequiredNotNullableList { get; set; } } public class SubType diff --git a/Examples/Angular/Annotation/build.cmd b/Examples/Angular/Annotation/build.cmd index 1a711c8b..e514df79 100644 --- a/Examples/Angular/Annotation/build.cmd +++ b/Examples/Angular/Annotation/build.cmd @@ -1,3 +1,17 @@ +REM +REM ========================================== +REM || ChangeReturnType || +REM ========================================== +REM +cd ChangeReturnType +rmdir /S/Q bin +rmdir /S/Q ClientApp\src\app\models +rmdir /S/Q ClientApp\src\app\services +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + REM REM ========================================== REM || ModelFromAssembly || @@ -11,6 +25,7 @@ dotnet add package KY.Generator.Annotations --prerelease dotnet build --no-incremental cd .. +REM REM ========================================== REM || ServiceFromAspNetCore || REM ========================================== diff --git a/Examples/Angular/Fluent/ChangeReturnType.sln b/Examples/Angular/Fluent/ChangeReturnType.sln new file mode 100644 index 00000000..4f4a6706 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ChangeReturnType", "ChangeReturnType\Assembly\ChangeReturnType.csproj", "{915C7DBD-A42A-4CB5-A4F6-E6123686D79C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generator", "ChangeReturnType\Generator\Generator.csproj", "{9660B137-C505-4541-84F8-D95684D17506}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {915C7DBD-A42A-4CB5-A4F6-E6123686D79C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {915C7DBD-A42A-4CB5-A4F6-E6123686D79C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {915C7DBD-A42A-4CB5-A4F6-E6123686D79C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {915C7DBD-A42A-4CB5-A4F6-E6123686D79C}.Release|Any CPU.Build.0 = Release|Any CPU + {9660B137-C505-4541-84F8-D95684D17506}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9660B137-C505-4541-84F8-D95684D17506}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9660B137-C505-4541-84F8-D95684D17506}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9660B137-C505-4541-84F8-D95684D17506}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/.gitignore b/Examples/Angular/Fluent/ChangeReturnType/Assembly/.gitignore new file mode 100644 index 00000000..41ffa34d --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/.gitignore @@ -0,0 +1,231 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ChangeReturnType.csproj b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ChangeReturnType.csproj new file mode 100644 index 00000000..034defcc --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ChangeReturnType.csproj @@ -0,0 +1,54 @@ + + + + net5.0 + true + Latest + false + ClientApp\ + $(DefaultItemExcludes);$(SpaRoot)node_modules\** + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(DistFiles.Identity) + PreserveNewest + true + + + + + diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.editorconfig b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.editorconfig new file mode 100644 index 00000000..934f2fe8 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.{razor,cshtml}] +charset = utf-8-bom diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.gitignore b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.gitignore new file mode 100644 index 00000000..e1f679be --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/.gitignore @@ -0,0 +1,40 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/dist-server +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/README.md b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/README.md new file mode 100644 index 00000000..39380f4c --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/README.md @@ -0,0 +1,27 @@ +# ChangeReturnType + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.0. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/angular.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/angular.json new file mode 100644 index 00000000..28fd580e --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/angular.json @@ -0,0 +1,136 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "ChangeReturnType": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "progress": false, + "extractCss": true, + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": ["src/assets"], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "ChangeReturnType:build" + }, + "configurations": { + "production": { + "browserTarget": "ChangeReturnType:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "ChangeReturnType:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": ["src/styles.css"], + "scripts": [], + "assets": ["src/assets"] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["src/tsconfig.app.json", "src/tsconfig.spec.json"], + "exclude": ["**/node_modules/**"] + } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist-server", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.server.json" + }, + "configurations": { + "dev": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": true + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + } + } + }, + "ChangeReturnType-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "ChangeReturnType:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": ["**/node_modules/**"] + } + } + } + } + }, + "defaultProject": "ChangeReturnType" +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/browserslist b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/browserslist new file mode 100644 index 00000000..8e09ab49 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/browserslist @@ -0,0 +1,9 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# For IE 9-11 support, please uncomment the last line of the file and adjust as needed +> 0.5% +last 2 versions +Firefox ESR +not dead +# IE 9-11 \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/protractor.conf.js b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/protractor.conf.js new file mode 100644 index 00000000..d60eff06 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require("jasmine-spec-reporter"); + +exports.config = { + allScriptsTimeout: 11000, + specs: ["./src/**/*.e2e-spec.ts"], + capabilities: { + browserName: "chrome" + }, + directConnect: true, + baseUrl: "http://localhost:4200/", + framework: "jasmine", + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require("ts-node").register({ + project: require("path").join(__dirname, "./tsconfig.e2e.json") + }); + jasmine + .getEnv() + .addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.e2e-spec.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..5b3b4b27 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getMainHeading()).toEqual('Hello, world!'); + }); +}); diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.po.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.po.ts new file mode 100644 index 00000000..24bc8b3c --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getMainHeading() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/tsconfig.e2e.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/tsconfig.e2e.json new file mode 100644 index 00000000..a6dd6220 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package-lock.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package-lock.json new file mode 100644 index 00000000..9b0cb381 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package-lock.json @@ -0,0 +1,12834 @@ +{ + "name": "changereturntype", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", + "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.29.tgz", + "integrity": "sha512-XAgfP1gi0rEJ3oVt+8ipvS5RfPNbeK5r2n8Ll2H3xkKjU0p1PN8+S6/0XVBtmMfeQ06SJWEAKFcAYqrxXhVTzw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/build-optimizer": "0.803.29", + "@angular-devkit/build-webpack": "0.803.29", + "@angular-devkit/core": "8.3.29", + "@babel/core": "7.8.7", + "@babel/preset-env": "7.8.7", + "@ngtools/webpack": "8.3.29", + "ajv": "6.12.3", + "autoprefixer": "9.6.1", + "browserslist": "4.10.0", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30001035", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "6.0.3", + "core-js": "3.6.4", + "coverage-istanbul-loader": "2.0.3", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.6.3", + "terser-webpack-plugin": "3.0.3", + "tree-kill": "1.2.2", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "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" + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "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" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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 + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.29.tgz", + "integrity": "sha512-E/MXtKc3oaP7UvQm0g4ayfH8ImEoQnRWseKD4jjYG6TbTIqfIyHCZRcKIr3svY28hzASbro5IZI6SugG+llvFw==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + }, + "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 + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.29.tgz", + "integrity": "sha512-3dJ3iEGU6AFT8VFTe72T9uNLobfd18Sq5Hz22UCCYji9K3ZyVc/bn5uXVVX+/Yj91MFtXuhOjLj7Z+XDeNy+OQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "dev": true, + "requires": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "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" + } + }, + "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 + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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 + } + } + }, + "@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.12.tgz", + "integrity": "sha512-QVtZUw5J9c0RcDaJntIoeWVk/q9dhjDFxh+yw/uPl9Z4upWASdsOpZU2lfjqyU0myfg8dnQyZa1+Ce7n/DaClQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cli": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", + "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@schematics/angular": "8.3.29", + "@schematics/update": "0.803.29", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.12.tgz", + "integrity": "sha512-BNz1lo+PP+lwIX3sErRGBRnkMzT5yT8CJ5o/M29AanCdcx9dpoJG2WKgpIgw8UBcj9QlP0CkSmzPtUNtcNMthA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.12.tgz", + "integrity": "sha512-V5mDWioGmSZ4cJJ2THo8qHYKwj3sUI7dpJ0oab2Al0FQAN8JCimWO6AQKRtjmnr78ZkMy9Xe/KK6ebl40ewL5Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", + "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.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" + } + } + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + } + } + }, + "@angular/core": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.12.tgz", + "integrity": "sha512-wEFwhHCuuXynXAMeA1G+0KIYY0jqXYs7I8p+GO+ufKoUmzWHFTvtMJ6nvKgy+LmZTByO2gf9oVAAlRodNb8ttQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.12.tgz", + "integrity": "sha512-y1UObndCGbTYwLSzUWzCiX7th+mb4n712asApooGmfmIQmgTyHbKxYUJ9Ep1pgd0pqLBBnK249MQLH15NDpbyQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", + "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "dev": true + }, + "@angular/platform-browser": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.12.tgz", + "integrity": "sha512-VBvMjmFJapZ2pFlmxZiHtfPwbHp79RRi5mrdMhETjKMaLaC2tAR/99ijCpx2urDMqb/VDm7YHOtoLEpBFVDulg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.12.tgz", + "integrity": "sha512-O4krb+9tj028JOQHPgLk/87lyUlHt8dpNxzuYCT0G6kEmknjpyZBaxhvDPygGjGHXV3LDqlYVH+bh8ygJUhwmw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-server": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.12.tgz", + "integrity": "sha512-NQvfW3YnM2FBdNpfIAKBnGjit/ZimtWEt60xskoQ+GcusJIbsB6m78XTYZru1S7CBHW3TeUztKMNZmI2MjU6Cw==", + "requires": { + "domino": "^2.1.2", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" + } + }, + "@angular/router": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.12.tgz", + "integrity": "sha512-mq1FethFpYosSVzChstMpxZlL+oUFeaA+FrzZQL7zJP/mm61yFkkhoYGVG6pG0NWSzpJE4NY6YvGCvHgN4ZECw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "@babel/core": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", + "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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==", + "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==", + "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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.7.tgz", + "integrity": "sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.6", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.6", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.7", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@ngtools/webpack": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.29.tgz", + "integrity": "sha512-7uB7dlAHR7RmxcQCYidnWRR1tFRJq7CzI+MM3725ibAvi4HnM5viC/HnKRTK7V+3iS1C0l0u0Gyo/769NsUDTQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.2", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@nguniversal/module-map-ngfactory-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-8.1.1.tgz", + "integrity": "sha512-vXFydMTPFRfGjmtdwtbNhl4Pmfg580Yit0vzlTeb3ZC1v+TJKR2GzaWYUileWxS60FrgNF4/tkOEL5ouDDx6Bw==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", + "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29" + } + }, + "@schematics/update": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", + "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.6.tgz", + "integrity": "sha512-hpQHs+lmZ0uuCrGyqypdI1Ho7jRFolOBT6OkNdZPFziLSSEKvWu+VxWU6bGdNEA/hoV4jV8pdDeNx8EWlmfNAw==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", + "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "optional": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "optional": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "optional": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-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.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "optional": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "optional": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "optional": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "optional": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.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" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "optional": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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 + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "optional": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "optional": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "optional": 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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "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" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.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==", + "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=" + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", + "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.1", + "schema-utils": "^2.7.0", + "serialize-javascript": "^4.0.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "core-js": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", + "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" + }, + "core-js-compat": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz", + "integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "coverage-istanbul-loader": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", + "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.0", + "loader-utils": "^1.2.3", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "optional": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "optional": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.636", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz", + "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "optional": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "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 + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "optional": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "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==" + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", + "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "optional": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "optional": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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 + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "optional": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.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" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "optional": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "optional": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "optional": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "optional": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", + "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.5", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "optional": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "optional": true + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "optional": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "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" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "optional": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "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" + } + }, + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "optional": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "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" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.69", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", + "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", + "dev": true + }, + "node-sass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz", + "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==", + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-client": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.3.tgz", + "integrity": "sha512-kMA5KRP++88nn3nxogwDA4p8jH+YwyoA1JxxVHA9YZFgYqcnK8qjc6WLEoOBheKbxQSl89r0gDh8+zscZHmGlw==", + "requires": { + "acorn": "^7.4.1", + "base64-js": "^1.5.1", + "core-js": "^3.8.3", + "crypto-js": "^4.0.0", + "serialize-javascript": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.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==" + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "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" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "optional": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "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 + } + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "optional": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "optional": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "optional": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "optional": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "optional": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "optional": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "optional": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "optional": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "optional": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "optional": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz", + "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", + "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "optional": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "optional": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "optional": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "optional": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "optional": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "optional": 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==", + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", + "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "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.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "optional": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "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" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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 + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "optional": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "optional": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "optional": true, + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", + "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", + "optional": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.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==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "optional": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "request": "^2.88.2", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "optional": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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" + } + }, + "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 + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "optional": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "optional": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": 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 + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package.json new file mode 100644 index 00000000..4a795962 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/package.json @@ -0,0 +1,62 @@ +{ + "name": "changereturntype", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "build:ssr": "ng run ChangeReturnType:server:dev", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "8.2.12", + "@angular/common": "8.2.12", + "@angular/compiler": "8.2.12", + "@angular/core": "8.2.12", + "@angular/forms": "8.2.12", + "@angular/platform-browser": "8.2.12", + "@angular/platform-browser-dynamic": "8.2.12", + "@angular/platform-server": "8.2.12", + "@angular/router": "8.2.12", + "@nguniversal/module-map-ngfactory-loader": "8.1.1", + "bootstrap": "^4.6.0", + "core-js": "^3.8.3", + "jquery": "^3.5.1", + "node-sass": "^5.0.0", + "oidc-client": "^1.11.3", + "popper.js": "^1.16.0", + "protractor": "~5.4.2", + "rxjs": "^6.6.3", + "ts-node": "~8.4.1", + "tslint": "~5.20.0", + "zone.js": "0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^0.803.29", + "@angular/cli": "^8.3.29", + "@angular/compiler-cli": "^8.2.14", + "@angular/language-service": "^8.2.14", + "@types/jasmine": "~3.4.4", + "@types/jasminewd2": "~2.0.8", + "@types/node": "~12.11.6", + "codelyzer": "^5.2.2", + "ini": "^1.3.7", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "^5.2.3", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~2.1.0", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.5.4", + "typescript": "3.5.3" + }, + "optionalDependencies": { + "node-sass": "^5.0.0", + "protractor": "~5.4.2", + "ts-node": "~8.4.1", + "tslint": "~5.20.0" + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.html new file mode 100644 index 00000000..7173845e --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.html @@ -0,0 +1,6 @@ + + +
+ +
+ diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.ts new file mode 100644 index 00000000..0a40b8c1 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent { + title = 'app'; +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.module.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.module.ts new file mode 100644 index 00000000..cecddedb --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.module.ts @@ -0,0 +1,34 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { NavMenuComponent } from './nav-menu/nav-menu.component'; +import { HomeComponent } from './home/home.component'; +import { CounterComponent } from './counter/counter.component'; +import { FetchDataComponent } from './fetch-data/fetch-data.component'; + +@NgModule({ + declarations: [ + AppComponent, + NavMenuComponent, + HomeComponent, + CounterComponent, + FetchDataComponent + ], + imports: [ + BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), + HttpClientModule, + FormsModule, + RouterModule.forRoot([ + { path: '', component: HomeComponent, pathMatch: 'full' }, + { path: 'counter', component: CounterComponent }, + { path: 'fetch-data', component: FetchDataComponent }, + ]) + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.server.module.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.server.module.ts new file mode 100644 index 00000000..cfb0e021 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/app.server.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; +import { AppComponent } from './app.component'; +import { AppModule } from './app.module'; + +@NgModule({ + imports: [AppModule, ServerModule, ModuleMapLoaderModule], + bootstrap: [AppComponent] +}) +export class AppServerModule { } diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.html new file mode 100644 index 00000000..89b9c80f --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.html @@ -0,0 +1,7 @@ +

Counter

+ +

This is a simple example of an Angular component.

+ +

Current count: {{ currentCount }}

+ + diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.spec.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.spec.ts new file mode 100644 index 00000000..37b350cc --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CounterComponent } from './counter.component'; + +describe('CounterComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CounterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CounterComponent); + fixture.detectChanges(); + }); + + it('should display a title', async(() => { + const titleText = fixture.nativeElement.querySelector('h1').textContent; + expect(titleText).toEqual('Counter'); + })); + + it('should start with count 0, then increments by 1 when clicked', async(() => { + const countElement = fixture.nativeElement.querySelector('strong'); + expect(countElement.textContent).toEqual('0'); + + const incrementButton = fixture.nativeElement.querySelector('button'); + incrementButton.click(); + fixture.detectChanges(); + expect(countElement.textContent).toEqual('1'); + })); +}); diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.ts new file mode 100644 index 00000000..1f336aa9 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/counter/counter.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-counter-component', + templateUrl: './counter.component.html' +}) +export class CounterComponent { + public currentCount = 0; + + public incrementCounter() { + this.currentCount++; + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.html new file mode 100644 index 00000000..19b3835d --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.html @@ -0,0 +1,24 @@ +

Weather forecast

+ +

This component demonstrates fetching data from the server.

+ +

Loading...

+ + + + + + + + + + + + + + + + + + +
DateTemp. (C)Temp. (F)Summary
{{ forecast.date }}{{ forecast.temperatureC }}{{ forecast.temperatureF }}{{ forecast.summary }}
diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.ts new file mode 100644 index 00000000..9b81e1be --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/fetch-data/fetch-data.component.ts @@ -0,0 +1,23 @@ +import { Component, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-fetch-data', + templateUrl: './fetch-data.component.html' +}) +export class FetchDataComponent { + public forecasts: WeatherForecast[]; + + constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) { + http.get(baseUrl + 'weatherforecast').subscribe(result => { + this.forecasts = result; + }, error => console.error(error)); + } +} + +interface WeatherForecast { + date: string; + temperatureC: number; + temperatureF: number; + summary: string; +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.html new file mode 100644 index 00000000..f74c2e78 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.html @@ -0,0 +1,14 @@ +

Hello, world!

+

Welcome to your new single-page application, built with:

+ +

To help you get started, we've also set up:

+
    +
  • Client-side navigation. For example, click Counter then Back to return here.
  • +
  • Angular CLI integration. In development mode, there's no need to run ng serve. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.
  • +
  • Efficient production builds. In production mode, development-time features are disabled, and your dotnet publish configuration automatically invokes ng build to produce minified, ahead-of-time compiled JavaScript files.
  • +
+

The ClientApp subdirectory is a standard Angular CLI application. If you open a command prompt in that directory, you can run any ng command (e.g., ng test), or use npm to install extra packages into it.

diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.ts new file mode 100644 index 00000000..2747b302 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/home/home.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/custom-weather-forecast.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/custom-weather-forecast.ts new file mode 100644 index 00000000..ef7b570f --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/custom-weather-forecast.ts @@ -0,0 +1,5 @@ +import { WeatherForecast } from './weather-forecast'; + +export class CustomWeatherForecast extends WeatherForecast { + public additionalProperty: string; +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/weather-forecast.ts new file mode 100644 index 00000000..2c26af06 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/models/weather-forecast.ts @@ -0,0 +1,23 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class WeatherForecast { + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:9660b137-c505-4541-84f8-d95684d17506 diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.css b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.css new file mode 100644 index 00000000..10389ef9 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.css @@ -0,0 +1,18 @@ +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.html new file mode 100644 index 00000000..37a13a22 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.html @@ -0,0 +1,44 @@ +
+ +
diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.ts new file mode 100644 index 00000000..327a3743 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/nav-menu/nav-menu.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-nav-menu', + templateUrl: './nav-menu.component.html', + styleUrls: ['./nav-menu.component.css'] +}) +export class NavMenuComponent { + isExpanded = false; + + collapse() { + this.isExpanded = false; + } + + toggle() { + this.isExpanded = !this.isExpanded; + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/services/weather-forecast.service.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/services/weather-forecast.service.ts new file mode 100644 index 00000000..88b55437 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/app/services/weather-forecast.service.ts @@ -0,0 +1,70 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +import { WeatherForecast } from "../models/weather-forecast"; +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WeatherForecastService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public get(httpOptions?: {}): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { + if (result) { + result.forEach((entry) => { + entry.date = this.convertToDate(entry.date); + }); + } + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:9660b137-c505-4541-84f8-d95684d17506 diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/assets/.gitkeep b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.prod.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.ts new file mode 100644 index 00000000..012182ef --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/environments/environment.ts @@ -0,0 +1,15 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * In development mode, to ignore zone related error stack frames such as + * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can + * import the following file, but please comment it out in production mode + * because it will have performance impact when throw error + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/index.html b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/index.html new file mode 100644 index 00000000..585e3558 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/index.html @@ -0,0 +1,14 @@ + + + + + Codestin Search App + + + + + + + Loading... + + diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/karma.conf.js b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/karma.conf.js new file mode 100644 index 00000000..4a9730b9 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/main.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/main.ts new file mode 100644 index 00000000..a2f708cb --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +export function getBaseUrl() { + return document.getElementsByTagName('base')[0].href; +} + +const providers = [ + { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] } +]; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic(providers).bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/polyfills.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/polyfills.ts new file mode 100644 index 00000000..aa665d6b --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/styles.css b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/styles.css new file mode 100644 index 00000000..3ef6a649 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/styles.css @@ -0,0 +1,16 @@ +/* You can add global styles to this file, and also import other style files */ + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +code { + color: #e01a76; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/test.ts b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/test.ts new file mode 100644 index 00000000..88492582 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.app.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.app.json new file mode 100644 index 00000000..8ea061ea --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.server.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.server.json new file mode 100644 index 00000000..3f183ef3 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.server.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "commonjs" + }, + "angularCompilerOptions": { + "entryModule": "app/app.server.module#AppServerModule" + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.spec.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.spec.json new file mode 100644 index 00000000..de773363 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tslint.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tslint.json new file mode 100644 index 00000000..52e2c1a5 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tsconfig.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tsconfig.json new file mode 100644 index 00000000..b93cbfce --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "module": "esnext", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ] + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tslint.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tslint.json new file mode 100644 index 00000000..f5f06e9e --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/ClientApp/tslint.json @@ -0,0 +1,130 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "no-output-on-prefix": true, + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Controllers/WeatherForecastController.cs b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..8ae416d5 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Controllers/WeatherForecastController.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace ChangeReturnType.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IEnumerable Get() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml new file mode 100644 index 00000000..2ad9ed71 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

\ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml.cs b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml.cs new file mode 100644 index 00000000..5e62519f --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/Error.cshtml.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; + +namespace ChangeReturnType.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public class ErrorModel : PageModel + { + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/_ViewImports.cshtml b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..1f6776d2 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using ChangeReturnType +@namespace ChangeReturnType.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Program.cs b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Program.cs new file mode 100644 index 00000000..085d9325 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace ChangeReturnType +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/Startup.cs b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Startup.cs new file mode 100644 index 00000000..6dfcf950 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/Startup.cs @@ -0,0 +1,72 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.SpaServices.AngularCli; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace ChangeReturnType +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddControllersWithViews(); + // In production, the Angular files will be served from this directory + services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + if (!env.IsDevelopment()) + { + app.UseSpaStaticFiles(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller}/{action=Index}/{id?}"); + }); + + app.UseSpa(spa => + { + // To learn more about options for serving an Angular SPA from ASP.NET Core, + // see https://go.microsoft.com/fwlink/?linkid=864501 + + spa.Options.SourcePath = "ClientApp"; + + if (env.IsDevelopment()) + { + spa.UseAngularCliServer(npmScript: "start"); + } + }); + } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/WeatherForecast.cs b/Examples/Angular/Fluent/ChangeReturnType/Assembly/WeatherForecast.cs new file mode 100644 index 00000000..d8d9d2c3 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/WeatherForecast.cs @@ -0,0 +1,15 @@ +using System; + +namespace ChangeReturnType +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string Summary { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.Development.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.json b/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.json new file mode 100644 index 00000000..ad75fee4 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Assembly/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, +"AllowedHosts": "*" +} diff --git a/Examples/Angular/Fluent/ChangeReturnType/Assembly/wwwroot/favicon.ico b/Examples/Angular/Fluent/ChangeReturnType/Assembly/wwwroot/favicon.ico new file mode 100644 index 00000000..63e859b4 Binary files /dev/null and b/Examples/Angular/Fluent/ChangeReturnType/Assembly/wwwroot/favicon.ico differ diff --git a/Examples/Angular/Fluent/ChangeReturnType/Generator/Generator.csproj b/Examples/Angular/Fluent/ChangeReturnType/Generator/Generator.csproj new file mode 100644 index 00000000..225c7981 --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Generator/Generator.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + + + + + + diff --git a/Examples/Angular/Fluent/ChangeReturnType/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/ChangeReturnType/Generator/GeneratorMain.cs new file mode 100644 index 00000000..aaea741c --- /dev/null +++ b/Examples/Angular/Fluent/ChangeReturnType/Generator/GeneratorMain.cs @@ -0,0 +1,21 @@ +using ChangeReturnType; +using ChangeReturnType.Controllers; +using KY.Generator; + +namespace Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read.AspDotNet(asp => asp.FromController()) + .Reflection(reflection => reflection.FromType()) + ) + .SetMember(x => x.Get(), + config => config.ReturnType("CustomWeatherForecast[]").ImportFile("custom-weather-forecast", "CustomWeatherForecast") + ) + .Write(write => write.Angular(angular => angular.Services(config => config.OutputPath("../Assembly/ClientApp/src/app/services")) + .Models(config => config.OutputPath("../Assembly/ClientApp/src/app/models")))); + } + } +} diff --git a/Examples/Angular/Fluent/FromModel.sln b/Examples/Angular/Fluent/FromModel.sln new file mode 100644 index 00000000..a1a05c29 --- /dev/null +++ b/Examples/Angular/Fluent/FromModel.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generator", "FromModel\Generator\Generator.csproj", "{E4FE5F61-B1CB-43D7-B336-071BE6EBF065}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FromModel", "FromModel\Assembly\FromModel.csproj", "{092DF40C-B956-4683-9D41-C0A947CBED88}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E4FE5F61-B1CB-43D7-B336-071BE6EBF065}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4FE5F61-B1CB-43D7-B336-071BE6EBF065}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4FE5F61-B1CB-43D7-B336-071BE6EBF065}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4FE5F61-B1CB-43D7-B336-071BE6EBF065}.Release|Any CPU.Build.0 = Release|Any CPU + {092DF40C-B956-4683-9D41-C0A947CBED88}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {092DF40C-B956-4683-9D41-C0A947CBED88}.Debug|Any CPU.Build.0 = Debug|Any CPU + {092DF40C-B956-4683-9D41-C0A947CBED88}.Release|Any CPU.ActiveCfg = Release|Any CPU + {092DF40C-B956-4683-9D41-C0A947CBED88}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Fluent/FromModel/Assembly/FromModel.csproj b/Examples/Angular/Fluent/FromModel/Assembly/FromModel.csproj new file mode 100644 index 00000000..cbfa5815 --- /dev/null +++ b/Examples/Angular/Fluent/FromModel/Assembly/FromModel.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/Examples/Angular/Fluent/FromModel/Assembly/TypeToRead.cs b/Examples/Angular/Fluent/FromModel/Assembly/TypeToRead.cs new file mode 100644 index 00000000..d42854a3 --- /dev/null +++ b/Examples/Angular/Fluent/FromModel/Assembly/TypeToRead.cs @@ -0,0 +1,8 @@ +namespace FromModel +{ + public class TypeToRead + { + public string StringProperty { get; set; } + public int NumberProperty { get; set; } + } +} diff --git a/Examples/Angular/Fluent/FromModel/Generator/Generator.csproj b/Examples/Angular/Fluent/FromModel/Generator/Generator.csproj new file mode 100644 index 00000000..0f0b1d96 --- /dev/null +++ b/Examples/Angular/Fluent/FromModel/Generator/Generator.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + + + + + + diff --git a/Examples/Angular/Fluent/FromModel/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/FromModel/Generator/GeneratorMain.cs new file mode 100644 index 00000000..221c635d --- /dev/null +++ b/Examples/Angular/Fluent/FromModel/Generator/GeneratorMain.cs @@ -0,0 +1,18 @@ +using FromModel; +using KY.Generator; + +namespace Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read + .Reflection(reflection => reflection.FromType()) + ) + .Write(write => write + .Angular(angular => angular.Models(config => config.OutputPath("Output/Models"))) + ); + } + } +} diff --git a/Examples/Angular/Fluent/FromModel/Generator/Output/Models/type-to-read.ts b/Examples/Angular/Fluent/FromModel/Generator/Output/Models/type-to-read.ts new file mode 100644 index 00000000..b1b73d08 --- /dev/null +++ b/Examples/Angular/Fluent/FromModel/Generator/Output/Models/type-to-read.ts @@ -0,0 +1,21 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class TypeToRead { + public stringProperty?: string; + public numberProperty?: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:e4fe5f61-b1cb-43d7-b336-071be6ebf065 diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses.sln b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses.sln new file mode 100644 index 00000000..53616077 --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "GenerateInterfacesInsteadClasses", "GenerateInterfacesInsteadClasses\Assembly\GenerateInterfacesInsteadClasses.csproj", "{6F2BA950-BCF2-41FC-8AE1-39811A012E43}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generator", "GenerateInterfacesInsteadClasses\Generator\Generator.csproj", "{068986B5-C7FE-4280-9442-8601B87F9114}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6F2BA950-BCF2-41FC-8AE1-39811A012E43}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6F2BA950-BCF2-41FC-8AE1-39811A012E43}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6F2BA950-BCF2-41FC-8AE1-39811A012E43}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6F2BA950-BCF2-41FC-8AE1-39811A012E43}.Release|Any CPU.Build.0 = Release|Any CPU + {068986B5-C7FE-4280-9442-8601B87F9114}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {068986B5-C7FE-4280-9442-8601B87F9114}.Debug|Any CPU.Build.0 = Debug|Any CPU + {068986B5-C7FE-4280-9442-8601B87F9114}.Release|Any CPU.ActiveCfg = Release|Any CPU + {068986B5-C7FE-4280-9442-8601B87F9114}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/GenerateInterfacesInsteadClasses.csproj b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/GenerateInterfacesInsteadClasses.csproj new file mode 100644 index 00000000..cbfa5815 --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/GenerateInterfacesInsteadClasses.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/TestModel.cs b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/TestModel.cs new file mode 100644 index 00000000..c865661c --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Assembly/TestModel.cs @@ -0,0 +1,7 @@ +namespace GenerateInterfacesInsteadClasses +{ + public class TestModel + { + public string Property { get; set; } + } +} diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Generator.csproj b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Generator.csproj new file mode 100644 index 00000000..e6f30f6b --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Generator.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + + + + + + diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/GeneratorMain.cs new file mode 100644 index 00000000..51fdc211 --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/GeneratorMain.cs @@ -0,0 +1,17 @@ +using GenerateInterfacesInsteadClasses; +using KY.Generator; + +namespace Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read + .Reflection(reflection => reflection.FromType())) + .Write(write => write + .NoHeader() + .Angular(angular => angular.Models(config => config.OutputPath("Output").PreferInterfaces()))); + } + } +} diff --git a/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Output/test-model.ts b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Output/test-model.ts new file mode 100644 index 00000000..310744aa --- /dev/null +++ b/Examples/Angular/Fluent/GenerateInterfacesInsteadClasses/Generator/Output/test-model.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export interface TestModel { + property?: string; +} + +// outputid:068986b5-c7fe-4280-9442-8601b87f9114 diff --git a/Examples/Angular/Fluent/NpmPackage.Generator/GeneratorMain.cs b/Examples/Angular/Fluent/NpmPackage.Generator/GeneratorMain.cs new file mode 100644 index 00000000..03f07ae6 --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage.Generator/GeneratorMain.cs @@ -0,0 +1,25 @@ +using KY.Generator; +using NpmPackage.Controllers; + +namespace NpmPackage.Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read.AspDotNet(asp => asp.FromController())) + .Write(write => write.Angular(angular => angular.Package(package => + package.Name("@ky/test") + .Version("11.0.0-preview.0") + .IncrementPatchVersion() + .VersionFromNpm() + .DependsOn("rxjs", "^6.6.0") + .OutputPath("../NpmPackage") + .Models(model => model.OutputPath("./models")) + .Services(service => service.OutputPath("./services")) + .Build() + .PublishLocal() + ))); + } + } +} diff --git a/Examples/Angular/Fluent/NpmPackage.Generator/NpmPackage.Generator.csproj b/Examples/Angular/Fluent/NpmPackage.Generator/NpmPackage.Generator.csproj new file mode 100644 index 00000000..bca1e2d3 --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage.Generator/NpmPackage.Generator.csproj @@ -0,0 +1,17 @@ + + + + net5.0 + + + + + + + + + + + + + diff --git a/Examples/Angular/Fluent/NpmPackage.sln b/Examples/Angular/Fluent/NpmPackage.sln new file mode 100644 index 00000000..11369bcc --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NpmPackage.Generator", "NpmPackage.Generator\NpmPackage.Generator.csproj", "{C641EAED-E8B2-49B6-B0D9-8BA916D91825}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NpmPackage", "NpmPackage\NpmPackage.csproj", "{6D2E73FF-83B5-4E83-AF3E-2A2D48602A86}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C641EAED-E8B2-49B6-B0D9-8BA916D91825}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C641EAED-E8B2-49B6-B0D9-8BA916D91825}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C641EAED-E8B2-49B6-B0D9-8BA916D91825}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C641EAED-E8B2-49B6-B0D9-8BA916D91825}.Release|Any CPU.Build.0 = Release|Any CPU + {6D2E73FF-83B5-4E83-AF3E-2A2D48602A86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6D2E73FF-83B5-4E83-AF3E-2A2D48602A86}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6D2E73FF-83B5-4E83-AF3E-2A2D48602A86}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6D2E73FF-83B5-4E83-AF3E-2A2D48602A86}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Angular/Fluent/NpmPackage/Controllers/WeatherForecastController.cs b/Examples/Angular/Fluent/NpmPackage/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..008cff0e --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/Controllers/WeatherForecastController.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace NpmPackage.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IEnumerable Get() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/NpmPackage/NpmPackage.csproj b/Examples/Angular/Fluent/NpmPackage/NpmPackage.csproj new file mode 100644 index 00000000..11984f2d --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/NpmPackage.csproj @@ -0,0 +1,11 @@ + + + + net5.0 + + + + + + + diff --git a/Examples/Angular/Fluent/NpmPackage/Program.cs b/Examples/Angular/Fluent/NpmPackage/Program.cs new file mode 100644 index 00000000..42228ccd --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace NpmPackage +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/NpmPackage/Startup.cs b/Examples/Angular/Fluent/NpmPackage/Startup.cs new file mode 100644 index 00000000..9b818059 --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/Startup.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; +using Microsoft.OpenApi.Models; + +namespace NpmPackage +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddControllers(); + services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "NpmPackage", Version = "v1" }); }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + app.UseSwagger(); + app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "NpmPackage v1")); + } + + app.UseHttpsRedirection(); + + app.UseRouting(); + + app.UseAuthorization(); + + app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); + } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/NpmPackage/WeatherForecast.cs b/Examples/Angular/Fluent/NpmPackage/WeatherForecast.cs new file mode 100644 index 00000000..8dbe0844 --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/WeatherForecast.cs @@ -0,0 +1,15 @@ +using System; + +namespace NpmPackage +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string Summary { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Angular/Fluent/NpmPackage/appsettings.Development.json b/Examples/Angular/Fluent/NpmPackage/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Examples/Angular/Fluent/NpmPackage/appsettings.json b/Examples/Angular/Fluent/NpmPackage/appsettings.json new file mode 100644 index 00000000..d9d9a9bf --- /dev/null +++ b/Examples/Angular/Fluent/NpmPackage/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/Generator.csproj b/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/Generator.csproj index 54907cd4..a0a93fa9 100644 --- a/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/Generator.csproj +++ b/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/Generator.csproj @@ -2,6 +2,7 @@ net5.0 + latest @@ -9,9 +10,9 @@ - - - + + + diff --git a/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/GeneratorMain.cs index 18d0fedc..23dc99ce 100644 --- a/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/GeneratorMain.cs +++ b/Examples/Angular/Fluent/ServiceFromAspNetCore/Generator/GeneratorMain.cs @@ -7,12 +7,15 @@ public class GeneratorMain : GeneratorFluentMain { public override void Execute() { - this.Read() - .AspDotNet(x => x.FromController()) - .Write() - .Angular(x => x.Services(config => config.OutputPath("../Service/ClientApp/src/app/services")) - .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) - ); + this.Read(read => read + .AspDotNet(asp => asp.FromController()) + ) + .Write(write => write + .Angular(angular => angular + .Services(config => config.OutputPath("../Service/ClientApp/src/app/services")) + .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) + ) + ); } } -} \ No newline at end of file +} diff --git a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/models/weather-forecast.ts index 1ff734e9..70e3910c 100644 --- a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,10 +10,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/services/weather-forecast.service.ts b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/services/weather-forecast.service.ts index fafad6ef..05fa6c28 100644 --- a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/services/weather-forecast.service.ts +++ b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ClientApp/src/app/services/weather-forecast.service.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -31,24 +31,39 @@ export class WeatherForecastService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/weatherforecast", httpOptions).subscribe((result) => { + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { if (result) { result.forEach((entry) => { entry.date = this.convertToDate(entry.date); }); } - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + public convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ServiceFromAspNetCore.csproj b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ServiceFromAspNetCore.csproj index 62db29d1..1e4bb467 100644 --- a/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ServiceFromAspNetCore.csproj +++ b/Examples/Angular/Fluent/ServiceFromAspNetCore/Service/ServiceFromAspNetCore.csproj @@ -10,6 +10,7 @@ false + latest diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Generator/Generator.csproj b/Examples/Angular/Fluent/ServiceFromSignalR/Generator/Generator.csproj index 19f97efb..9b9a0372 100644 --- a/Examples/Angular/Fluent/ServiceFromSignalR/Generator/Generator.csproj +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Generator/Generator.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/ServiceFromSignalR/Generator/GeneratorMain.cs index 3c972568..b4f9e345 100644 --- a/Examples/Angular/Fluent/ServiceFromSignalR/Generator/GeneratorMain.cs +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Generator/GeneratorMain.cs @@ -7,12 +7,12 @@ public class GeneratorMain : GeneratorFluentMain { public override void Execute() { - this.Read() - .AspDotNet(x => x.FromHub()) - .Write() - .Angular(x => x.Services(config => config.OutputPath("../Service/ClientApp/src/app/services")) - .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) - ); + this.Read(read => read + .AspDotNet(x => x.FromHub())) + .Write(write => write + .Angular(x => x.Services(config => config.OutputPath("../Service/ClientApp/src/app/services")) + .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) + )); } } -} \ No newline at end of file +} diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/connection-status.ts b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/connection-status.ts index 7caf1fec..44a41ffc 100644 --- a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/connection-status.ts +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/connection-status.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/index.ts b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/index.ts new file mode 100644 index 00000000..df3358f5 --- /dev/null +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./connection-status"; +export * from "./weather-forecast"; + diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/weather-forecast.ts index 79e55476..0f30428c 100644 --- a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,10 +10,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/services/weather-forecast-hub.service.ts b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/services/weather-forecast-hub.service.ts index bd991e1f..25dea629 100644 --- a/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/services/weather-forecast-hub.service.ts +++ b/Examples/Angular/Fluent/ServiceFromSignalR/Service/ClientApp/src/app/services/weather-forecast-hub.service.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -28,11 +28,12 @@ import { Subject } from "rxjs"; providedIn: "root" }) export class WeatherForecastHubService { - private isClosed: boolean; + private isClosed: boolean = true; public serviceUrl: string = ""; - public options: IHttpConnectionOptions; + public options: IHttpConnectionOptions = { + }; public logLevel: LogLevel = LogLevel.Error; - private connection: ReplaySubject; + private connection?: ReplaySubject; private readonly statusSubject: ReplaySubject = new ReplaySubject(1); public readonly status$: Observable = this.statusSubject.asObservable(); private readonly refreshedSubject: Subject = new Subject(); @@ -59,7 +60,7 @@ export class WeatherForecastHubService { subject.next(); subject.complete(); this.statusSubject.next(ConnectionStatus.connected); - }).catch((error) => { + }).catch(() => { this.statusSubject.next(ConnectionStatus.disconnected); subject.error(error); }); diff --git a/Examples/Angular/Fluent/WithCustomHttpClient/Generator/Generator.csproj b/Examples/Angular/Fluent/WithCustomHttpClient/Generator/Generator.csproj index 039474f4..333f1ad9 100644 --- a/Examples/Angular/Fluent/WithCustomHttpClient/Generator/Generator.csproj +++ b/Examples/Angular/Fluent/WithCustomHttpClient/Generator/Generator.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/Examples/Angular/Fluent/WithCustomHttpClient/Generator/GeneratorMain.cs b/Examples/Angular/Fluent/WithCustomHttpClient/Generator/GeneratorMain.cs index 701e0779..73c4e2bc 100644 --- a/Examples/Angular/Fluent/WithCustomHttpClient/Generator/GeneratorMain.cs +++ b/Examples/Angular/Fluent/WithCustomHttpClient/Generator/GeneratorMain.cs @@ -7,17 +7,17 @@ public class GeneratorMain : GeneratorFluentMain { public override void Execute() { - this.Read() - .AspDotNet(asp => asp.FromController()) - .Write() - .Angular(angular => angular.Services(config => config.OutputPath("../Service/ClientApp/src/app/services") - .HttpClient("CustomHttpClient", "../base/custom-http-client") - .GetMethod("MyGet", options => options.NoHttpOptions()) - .PostMethod("myPost") - .PutMethod("myPut", options => options.ParameterGeneric()) - .DeleteMethod("myDelete", options => options.NoHttpOptions().UseParameters().NotGeneric())) - .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) - ); + this.Read(read => read + .AspDotNet(asp => asp.FromController())) + .Write(write => write + .Angular(angular => angular.Services(config => config.OutputPath("../Service/ClientApp/src/app/services") + .HttpClient("CustomHttpClient", "../base/custom-http-client") + .GetMethod("MyGet", options => options.NoHttpOptions()) + .PostMethod("myPost") + .PutMethod("myPut", options => options.ParameterGeneric()) + .DeleteMethod("myDelete", options => options.NoHttpOptions().NotGeneric())) + .Models(config => config.OutputPath("../Service/ClientApp/src/app/models")) + )); } } } diff --git a/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/models/weather-forecast.ts b/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/models/weather-forecast.ts index 643bde41..50b5600e 100644 --- a/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/models/weather-forecast.ts +++ b/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/models/weather-forecast.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.5.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,10 +10,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/services/weather-forecast.service.ts b/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/services/weather-forecast.service.ts index 5f282702..1c6cdf82 100644 --- a/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/services/weather-forecast.service.ts +++ b/Examples/Angular/Fluent/WithCustomHttpClient/Service/ClientApp/src/app/services/weather-forecast.service.ts @@ -1 +1,111 @@ - \ No newline at end of file +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +import { CustomHttpClient } from "../base/custom-http-client"; +import { WeatherForecast } from "../models/weather-forecast"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WeatherForecastService { + private readonly http: CustomHttpClient; + private serviceUrlValue: string = ""; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: CustomHttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public get(): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.MyGet(url).subscribe((result) => { + if (result) { + result.forEach((entry) => { + entry.date = this.convertToDate(entry.date); + }); + } + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public post(entry: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.myPost(url, entry, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public put(entry: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.myPut(url, entry, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public delete(id?: string): Observable { + let subject = new Subject(); + let url: string = this.serviceUrl + "/weatherforecast"; + url = this.append(url, id, undefined, "/"); + this.http.myDelete(url).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + public convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:01ab73c6-34dd-450e-b170-78cfd1e01dfd diff --git a/Examples/Angular/Fluent/build.cmd b/Examples/Angular/Fluent/build.cmd index b7466353..09d28b11 100644 --- a/Examples/Angular/Fluent/build.cmd +++ b/Examples/Angular/Fluent/build.cmd @@ -1,3 +1,48 @@ +REM +REM ========================================== +REM || ChangeReturnType || +REM ========================================== +REM +cd ChangeReturnType +rmdir /S/Q bin +rmdir /S/Q \Generator\Output +cd Generator +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.AspDotNet --prerelease +cd ..\.. +dotnet build ChangeReturnType.sln --no-incremental + +REM +REM ========================================== +REM || FromModel || +REM ========================================== +REM +cd FromModel +rmdir /S/Q bin +rmdir /S/Q \Generator\Output +cd Generator +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.Reflection --prerelease +cd ..\.. +dotnet build FromModel.sln --no-incremental + +REM +REM ========================================== +REM || GenerateInterfacesInsteadClasses || +REM ========================================== +REM +cd GenerateInterfacesInsteadClasses +rmdir /S/Q bin +rmdir /S/Q \Generator\Output +cd Generator +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.Reflection --prerelease +cd ..\.. +dotnet build GenerateInterfacesInsteadClasses.sln --no-incremental + REM REM ========================================== REM || ServiceFromAspNetCore || @@ -29,3 +74,19 @@ dotnet add package KY.Generator.Angular --prerelease dotnet add package KY.Generator.AspDotNet --prerelease cd ..\.. dotnet build ServiceFromSignalR.sln --no-incremental + +REM +REM ========================================== +REM || WithCustomHttpClient || +REM ========================================== +REM +cd WithCustomHttpClient +rmdir /S/Q bin +rmdir /S/Q Service\ClientApp\src\app\models +rmdir /S/Q Service\ClientApp\src\app\services +cd Generator +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.AspDotNet --prerelease +cd ..\.. +dotnet build WithCustomHttpClient.sln --no-incremental diff --git a/Examples/Json/JsonWithReader/Generator.cs b/Examples/Json/JsonWithReader/Generator.cs index 60387ece..61a81959 100644 --- a/Examples/Json/JsonWithReader/Generator.cs +++ b/Examples/Json/JsonWithReader/Generator.cs @@ -6,22 +6,22 @@ internal class Generator : GeneratorFluentMain { public override void Execute() { - this.Read() - .Json(json => json.FromFile("Source/complex.json")) - .Write() - .Json(json => json.Model("Output", "Complex", "KY.Generator.Examples.Json")); + this.Read(read => read + .Json(json => json.FromFile("Source/complex.json"))) + .Write(write => write + .Json(json => json.Model("Output", "Complex", "KY.Generator.Examples.Json"))); - this.Read() - .Json(json => json.FromFile("Source/simple.json")) - .Write() - .Json(json => json.Model("Output", "Simple", "KY.Generator.Examples.Json") - .WithoutReader() - ); + this.Read(read => read + .Json(json => json.FromFile("Source/simple.json"))) + .Write(write => write + .Json(json => json.Model("Output", "Simple", "KY.Generator.Examples.Json") + .WithoutReader() + )); - this.Read() - .Json(json => json.FromFile("Source/simple.json")) - .Write() - .Angular(angular => angular.Models(config => config.OutputPath("Output"))); + this.Read(read => read + .Json(json => json.FromFile("Source/simple.json"))) + .Write(write => write + .Angular(angular => angular.Models(config => config.OutputPath("Output")))); } } -} \ No newline at end of file +} diff --git a/Examples/Json/JsonWithReader/JsonWithReader.csproj b/Examples/Json/JsonWithReader/JsonWithReader.csproj index 05fdfb76..c91931e2 100644 --- a/Examples/Json/JsonWithReader/JsonWithReader.csproj +++ b/Examples/Json/JsonWithReader/JsonWithReader.csproj @@ -7,14 +7,10 @@ - - - - - - - - + + + + diff --git a/Examples/Json/JsonWithReader/Output/Complex.cs b/Examples/Json/JsonWithReader/Output/Complex.cs index b0c2a287..81f7996e 100644 --- a/Examples/Json/JsonWithReader/Output/Complex.cs +++ b/Examples/Json/JsonWithReader/Output/Complex.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -13,7 +13,7 @@ using System.IO; using Newtonsoft.Json; -[GeneratedCode("KY.Generator", "7.6.0.0")] +[GeneratedCode("KY.Generator", "9.0.0.0")] public partial class Complex { public List StringArrayProperty { get; set; } @@ -33,3 +33,4 @@ public static Complex Parse(string json) } } +// outputid:b7fab864-b0a6-4be6-bc07-794f04ca61cd diff --git a/Examples/Json/JsonWithReader/Output/ObjectArrayProperty.cs b/Examples/Json/JsonWithReader/Output/ObjectArrayProperty.cs index 66782d29..925bb25e 100644 --- a/Examples/Json/JsonWithReader/Output/ObjectArrayProperty.cs +++ b/Examples/Json/JsonWithReader/Output/ObjectArrayProperty.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -12,7 +12,7 @@ using System.IO; using Newtonsoft.Json; -[GeneratedCode("KY.Generator", "7.6.0.0")] +[GeneratedCode("KY.Generator", "9.0.0.0")] public partial class ObjectArrayProperty { public string Text { get; set; } @@ -28,3 +28,4 @@ public static ObjectArrayProperty Parse(string json) } } +// outputid:b7fab864-b0a6-4be6-bc07-794f04ca61cd diff --git a/Examples/Json/JsonWithReader/Output/ObjectProperty.cs b/Examples/Json/JsonWithReader/Output/ObjectProperty.cs index decc8990..4f31814d 100644 --- a/Examples/Json/JsonWithReader/Output/ObjectProperty.cs +++ b/Examples/Json/JsonWithReader/Output/ObjectProperty.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -12,7 +12,7 @@ using System.IO; using Newtonsoft.Json; -[GeneratedCode("KY.Generator", "7.6.0.0")] +[GeneratedCode("KY.Generator", "9.0.0.0")] public partial class ObjectProperty { public string Property { get; set; } @@ -28,3 +28,4 @@ public static ObjectProperty Parse(string json) } } +// outputid:b7fab864-b0a6-4be6-bc07-794f04ca61cd diff --git a/Examples/Json/JsonWithReader/Output/Simple.cs b/Examples/Json/JsonWithReader/Output/Simple.cs index 3dda39f2..f4b81324 100644 --- a/Examples/Json/JsonWithReader/Output/Simple.cs +++ b/Examples/Json/JsonWithReader/Output/Simple.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,7 +10,7 @@ using System.CodeDom.Compiler; -[GeneratedCode("KY.Generator", "7.6.0.0")] +[GeneratedCode("KY.Generator", "9.0.0.0")] public partial class Simple { public string StringProperty { get; set; } @@ -18,3 +18,4 @@ public partial class Simple public bool BooleanProperty { get; set; } } +// outputid:b7fab864-b0a6-4be6-bc07-794f04ca61cd diff --git a/Examples/Json/JsonWithReader/Output/simple.ts b/Examples/Json/JsonWithReader/Output/simple.ts index 9e8d3c1f..a1a21fd0 100644 --- a/Examples/Json/JsonWithReader/Output/simple.ts +++ b/Examples/Json/JsonWithReader/Output/simple.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,9 +10,9 @@ // tslint:disable export class Simple { - public stringProperty: string; - public numberProperty: number; - public booleanProperty: boolean; + public stringProperty?: string; + public numberProperty?: number; + public booleanProperty?: boolean; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Reflection/ReflectionFromAttributes/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromAttributes/Output/type-to-read.ts index bea65ca0..eb6da2d6 100644 --- a/Examples/Reflection/ReflectionFromAttributes/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromAttributes/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; } // outputid:7ea5334c-5e4f-406b-8224-3e8ee565e7f3 diff --git a/Examples/Reflection/ReflectionFromAttributes/ReflectionFromAttributes.csproj b/Examples/Reflection/ReflectionFromAttributes/ReflectionFromAttributes.csproj index 090c018f..51d850cc 100644 --- a/Examples/Reflection/ReflectionFromAttributes/ReflectionFromAttributes.csproj +++ b/Examples/Reflection/ReflectionFromAttributes/ReflectionFromAttributes.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromConstant/Class1.cs b/Examples/Reflection/ReflectionFromConstant/Class1.cs index 4dce55b0..c236b600 100644 --- a/Examples/Reflection/ReflectionFromConstant/Class1.cs +++ b/Examples/Reflection/ReflectionFromConstant/Class1.cs @@ -7,5 +7,7 @@ public class Class1 { public const string StringProperty = "Value-One"; public const int NumberProperty = 7; + public static string StaticStringProperty = "Static-Value"; + public static int StaticNumberProperty = 9; } -} \ No newline at end of file +} diff --git a/Examples/Reflection/ReflectionFromConstant/Output/class-1.ts b/Examples/Reflection/ReflectionFromConstant/Output/class-1.ts index 351ac900..373fb9a2 100644 --- a/Examples/Reflection/ReflectionFromConstant/Output/class-1.ts +++ b/Examples/Reflection/ReflectionFromConstant/Output/class-1.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,6 +10,8 @@ // tslint:disable export class Class1 { + public static readonly staticStringProperty: string = "Static-Value"; + public static readonly staticNumberProperty: number = 9; public static readonly stringProperty: string = "Value-One"; public static readonly numberProperty: number = 7; diff --git a/Examples/Reflection/ReflectionFromConstant/ReflectionFromConstant.csproj b/Examples/Reflection/ReflectionFromConstant/ReflectionFromConstant.csproj index 971422a9..9b3838a6 100644 --- a/Examples/Reflection/ReflectionFromConstant/ReflectionFromConstant.csproj +++ b/Examples/Reflection/ReflectionFromConstant/ReflectionFromConstant.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromCore/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromCore/Output/type-to-read.ts index 5d57d7b3..7000b07b 100644 --- a/Examples/Reflection/ReflectionFromCore/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromCore/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Reflection/ReflectionFromCore/ReflectionFromCore.csproj b/Examples/Reflection/ReflectionFromCore/ReflectionFromCore.csproj index 0f935f01..83adf9e3 100644 --- a/Examples/Reflection/ReflectionFromCore/ReflectionFromCore.csproj +++ b/Examples/Reflection/ReflectionFromCore/ReflectionFromCore.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromExecutable.sln b/Examples/Reflection/ReflectionFromExecutable.sln index 5073634d..c0c0dc81 100644 --- a/Examples/Reflection/ReflectionFromExecutable.sln +++ b/Examples/Reflection/ReflectionFromExecutable.sln @@ -3,7 +3,7 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 16 VisualStudioVersion = 16.0.28803.452 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectionFromExecutable", "ReflectionFromExecutable\ReflectionFromExecutable.csproj", "{0D8967C5-740D-4461-9CCE-F3FB51191F3D}" +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectionFromExecutable", "ReflectionFromExecutable\ReflectionFromExecutable.csproj", "{FE448E28-7D8A-422B-9B2E-17CE462E3E81}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -11,10 +11,10 @@ Global Release|Any CPU = Release|Any CPU EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution - {0D8967C5-740D-4461-9CCE-F3FB51191F3D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {0D8967C5-740D-4461-9CCE-F3FB51191F3D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {0D8967C5-740D-4461-9CCE-F3FB51191F3D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {0D8967C5-740D-4461-9CCE-F3FB51191F3D}.Release|Any CPU.Build.0 = Release|Any CPU + {FE448E28-7D8A-422B-9B2E-17CE462E3E81}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FE448E28-7D8A-422B-9B2E-17CE462E3E81}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FE448E28-7D8A-422B-9B2E-17CE462E3E81}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FE448E28-7D8A-422B-9B2E-17CE462E3E81}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Examples/Reflection/ReflectionFromExecutable/App.config b/Examples/Reflection/ReflectionFromExecutable/App.config deleted file mode 100644 index 731f6de6..00000000 --- a/Examples/Reflection/ReflectionFromExecutable/App.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/Examples/Reflection/ReflectionFromExecutable/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromExecutable/Output/type-to-read.ts index 40a07546..c29441bc 100644 --- a/Examples/Reflection/ReflectionFromExecutable/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromExecutable/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.5.0.0 +// This code was generated with KY.Generator 8.8.8.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -18,4 +18,4 @@ export class TypeToRead { } } -// outputid:0d8967c5-740d-4461-9cce-f3fb51191f3d +// outputid:fe448e28-7d8a-422b-9b2e-17ce462e3e81 diff --git a/Examples/Reflection/ReflectionFromExecutable/Program.cs b/Examples/Reflection/ReflectionFromExecutable/Program.cs index f1d2ab7d..e5dff12b 100644 --- a/Examples/Reflection/ReflectionFromExecutable/Program.cs +++ b/Examples/Reflection/ReflectionFromExecutable/Program.cs @@ -1,8 +1,3 @@ -namespace ReflectionFromExecutable -{ - internal class Program - { - private static void Main(string[] args) - { } - } -} \ No newline at end of file +// See https://aka.ms/new-console-template for more information + +Console.WriteLine("Hello, World!"); \ No newline at end of file diff --git a/Examples/Reflection/ReflectionFromExecutable/Properties/AssemblyInfo.cs b/Examples/Reflection/ReflectionFromExecutable/Properties/AssemblyInfo.cs deleted file mode 100644 index f38cd475..00000000 --- a/Examples/Reflection/ReflectionFromExecutable/Properties/AssemblyInfo.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Reflection; -using System.Runtime.CompilerServices; -using System.Runtime.InteropServices; - -// General Information about an assembly is controlled through the following -// set of attributes. Change these attribute values to modify the information -// associated with an assembly. -[assembly: AssemblyTitle("ReflectionFromExecutable")] -[assembly: AssemblyDescription("")] -[assembly: AssemblyConfiguration("")] -[assembly: AssemblyCompany("")] -[assembly: AssemblyProduct("ReflectionFromExecutable")] -[assembly: AssemblyCopyright("Copyright © 2019")] -[assembly: AssemblyTrademark("")] -[assembly: AssemblyCulture("")] - -// Setting ComVisible to false makes the types in this assembly not visible -// to COM components. If you need to access a type in this assembly from -// COM, set the ComVisible attribute to true on that type. -[assembly: ComVisible(false)] - -// The following GUID is for the ID of the typelib if this project is exposed to COM -[assembly: Guid("0d8967c5-740d-4461-9cce-f3fb51191f3d")] - -// Version information for an assembly consists of the following four values: -// -// Major Version -// Minor Version -// Build Number -// Revision -// -// You can specify all the values or you can default the Build and Revision Numbers -// by using the '*' as shown below: -// [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("1.0.0.0")] -[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Examples/Reflection/ReflectionFromExecutable/ReflectionFromExecutable.csproj b/Examples/Reflection/ReflectionFromExecutable/ReflectionFromExecutable.csproj index d7f3ff6e..2d8996ba 100644 --- a/Examples/Reflection/ReflectionFromExecutable/ReflectionFromExecutable.csproj +++ b/Examples/Reflection/ReflectionFromExecutable/ReflectionFromExecutable.csproj @@ -1,79 +1,15 @@ - - - - - Debug - AnyCPU - {0D8967C5-740D-4461-9CCE-F3FB51191F3D} - Exe - ReflectionFromExecutable - ReflectionFromExecutable - v4.6.1 - 512 - true - true - - - - - AnyCPU - true - full - false - bin\Debug\ - DEBUG;TRACE - prompt - 4 - - - AnyCPU - pdbonly - true - bin\Release\ - TRACE - prompt - 4 - - - - ..\packages\KY.Generator.Annotations.7.5.0\lib\netstandard2.0\KY.Generator.Annotations.dll - True - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + - This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them. For more information, see http://go.microsoft.com/fwlink/?LinkID=322105.The missing file is {0}. + Exe + net8.0 + enable + enable - - - \ No newline at end of file + + + + + + + diff --git a/Examples/Reflection/ReflectionFromExecutable/packages.config b/Examples/Reflection/ReflectionFromExecutable/packages.config deleted file mode 100644 index 69b8e0d1..00000000 --- a/Examples/Reflection/ReflectionFromExecutable/packages.config +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Examples/Reflection/ReflectionFromIndex/Output/another-type.ts b/Examples/Reflection/ReflectionFromIndex/Output/another-type.ts index 3036f153..e6f54c09 100644 --- a/Examples/Reflection/ReflectionFromIndex/Output/another-type.ts +++ b/Examples/Reflection/ReflectionFromIndex/Output/another-type.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class AnotherType { - public stringField: string; - public numberField: number; + public stringField?: string; + public numberField?: number; } // outputid:1387495c-f857-4889-b5dd-ddb10505f499 diff --git a/Examples/Reflection/ReflectionFromIndex/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromIndex/Output/type-to-read.ts index 8871e492..c61bd748 100644 --- a/Examples/Reflection/ReflectionFromIndex/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromIndex/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; } // outputid:1387495c-f857-4889-b5dd-ddb10505f499 diff --git a/Examples/Reflection/ReflectionFromIndex/ReflectionFromIndex.csproj b/Examples/Reflection/ReflectionFromIndex/ReflectionFromIndex.csproj index dd034e6c..e033905a 100644 --- a/Examples/Reflection/ReflectionFromIndex/ReflectionFromIndex.csproj +++ b/Examples/Reflection/ReflectionFromIndex/ReflectionFromIndex.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/MainAssembly.csproj b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/MainAssembly.csproj index a114ce90..94f4c84a 100644 --- a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/MainAssembly.csproj +++ b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/MainAssembly.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/second-type.ts b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/second-type.ts index ed958d3e..dc712626 100644 --- a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/second-type.ts +++ b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/second-type.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,7 +10,7 @@ // tslint:disable export class SecondType { - public stringProperty: string; + public stringProperty?: string; } // outputid:8d8831d6-36e5-44aa-9876-6158694d0cc1 diff --git a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/type-to-read.ts index d3e518a5..41b7ee5d 100644 --- a/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromMultipleAssemblies/MainAssembly/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -12,9 +12,9 @@ import { SecondType } from "./second-type"; export class TypeToRead { - public stringProperty: string; - public numberProperty: number; - public secondTypeProperty: SecondType; + public stringProperty?: string; + public numberProperty?: number; + public secondTypeProperty?: SecondType; } // outputid:8d8831d6-36e5-44aa-9876-6158694d0cc1 diff --git a/Examples/Reflection/ReflectionFromNet5/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromNet5/Output/type-to-read.ts index 013875a6..59ee4ff0 100644 --- a/Examples/Reflection/ReflectionFromNet5/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromNet5/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; } // outputid:3d295b41-82c1-4a99-b229-0e8b2cc2d0fd diff --git a/Examples/Reflection/ReflectionFromNet5/ReflectionFromNet5.csproj b/Examples/Reflection/ReflectionFromNet5/ReflectionFromNet5.csproj index 271dde14..c332d527 100644 --- a/Examples/Reflection/ReflectionFromNet5/ReflectionFromNet5.csproj +++ b/Examples/Reflection/ReflectionFromNet5/ReflectionFromNet5.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionFromStandard/Output/type-to-read.ts b/Examples/Reflection/ReflectionFromStandard/Output/type-to-read.ts index 9b603eb9..99980d7f 100644 --- a/Examples/Reflection/ReflectionFromStandard/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionFromStandard/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Examples/Reflection/ReflectionFromStandard/ReflectionFromStandard.csproj b/Examples/Reflection/ReflectionFromStandard/ReflectionFromStandard.csproj index 413ecab7..654a3cca 100644 --- a/Examples/Reflection/ReflectionFromStandard/ReflectionFromStandard.csproj +++ b/Examples/Reflection/ReflectionFromStandard/ReflectionFromStandard.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/EnumToIgnore.cs b/Examples/Reflection/ReflectionIgnoreAttribute/EnumToIgnore.cs new file mode 100644 index 00000000..2ac7297a --- /dev/null +++ b/Examples/Reflection/ReflectionIgnoreAttribute/EnumToIgnore.cs @@ -0,0 +1,11 @@ +using KY.Generator; + +namespace ReflectionIgnoreAttribute +{ + [GenerateIgnore] + public enum EnumToIgnore + { + None, + Any + } +} \ No newline at end of file diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/GenerateOnlySubTypes.cs b/Examples/Reflection/ReflectionIgnoreAttribute/GenerateOnlySubTypes.cs new file mode 100644 index 00000000..5c899b6f --- /dev/null +++ b/Examples/Reflection/ReflectionIgnoreAttribute/GenerateOnlySubTypes.cs @@ -0,0 +1,16 @@ +using KY.Generator; + +namespace ReflectionIgnoreAttribute +{ + [GenerateOnlySubTypes] + public class GenerateOnlySubTypes + { + public GenerateOnlySubTypesSubType Property1 { get; } + public TypeToIgnore Property2 { get; } + } + + public class GenerateOnlySubTypesSubType + { + public string Property { get; } + } +} diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/Output/generate-only-sub-types-sub-type.ts b/Examples/Reflection/ReflectionIgnoreAttribute/Output/generate-only-sub-types-sub-type.ts new file mode 100644 index 00000000..5ad6c1aa --- /dev/null +++ b/Examples/Reflection/ReflectionIgnoreAttribute/Output/generate-only-sub-types-sub-type.ts @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 9.0.0.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class GenerateOnlySubTypesSubType { + public property?: string; +} + +// outputid:0069e9c6-1a9c-4b27-ac11-56d1413e4d18 diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/Output/type-to-read.ts b/Examples/Reflection/ReflectionIgnoreAttribute/Output/type-to-read.ts index 6d44ed2f..dd9ee74e 100644 --- a/Examples/Reflection/ReflectionIgnoreAttribute/Output/type-to-read.ts +++ b/Examples/Reflection/ReflectionIgnoreAttribute/Output/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -9,15 +9,17 @@ /* eslint-disable */ // tslint:disable -import { EnumToIgnore } from "./enum-to-ignore"; -import { TypeToIgnore } from "./type-to-ignore"; +import { EnumToIgnore } from "./"; +import { TypeToIgnore } from "./"; +import { GenerateOnlySubTypes } from "./generate-only-sub-types"; export class TypeToRead { - public typeToIgnoreField: TypeToIgnore; - public stringProperty: string; - public numberProperty: number; - public typeToIgnoreProperty: TypeToIgnore; - public enumToIgnoreProperty: EnumToIgnore; + public typeToIgnoreField?: TypeToIgnore; + public stringProperty?: string; + public numberProperty?: number; + public typeToIgnoreProperty?: TypeToIgnore; + public enumToIgnoreProperty?: EnumToIgnore; + public generateOnlySubTypes?: GenerateOnlySubTypes; } // outputid:0069e9c6-1a9c-4b27-ac11-56d1413e4d18 diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/ReflectionIgnoreAttribute.csproj b/Examples/Reflection/ReflectionIgnoreAttribute/ReflectionIgnoreAttribute.csproj index d7157a38..ad108957 100644 --- a/Examples/Reflection/ReflectionIgnoreAttribute/ReflectionIgnoreAttribute.csproj +++ b/Examples/Reflection/ReflectionIgnoreAttribute/ReflectionIgnoreAttribute.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/TypeToIgnore.cs b/Examples/Reflection/ReflectionIgnoreAttribute/TypeToIgnore.cs new file mode 100644 index 00000000..687c0389 --- /dev/null +++ b/Examples/Reflection/ReflectionIgnoreAttribute/TypeToIgnore.cs @@ -0,0 +1,10 @@ +using KY.Generator; + +namespace ReflectionIgnoreAttribute +{ + [GenerateIgnore] + public class TypeToIgnore + { + public string StringProperty { get; set; } + } +} \ No newline at end of file diff --git a/Examples/Reflection/ReflectionIgnoreAttribute/TypeToRead.cs b/Examples/Reflection/ReflectionIgnoreAttribute/TypeToRead.cs index 9ddcfe4c..db50efb5 100644 --- a/Examples/Reflection/ReflectionIgnoreAttribute/TypeToRead.cs +++ b/Examples/Reflection/ReflectionIgnoreAttribute/TypeToRead.cs @@ -10,13 +10,13 @@ public class TypeToRead /// [GenerateIgnore] public string StringFieldToIgnore; - + /// /// This field will be ignored /// [GenerateIgnore] public FieldTypeToIgnore FieldTypeFieldToIgnore; - + /// /// This field is written to output but the class not /// @@ -24,7 +24,7 @@ public class TypeToRead public string StringProperty { get; set; } public int NumberProperty { get; set; } - + /// /// This property will be ignored /// @@ -46,19 +46,11 @@ public class TypeToRead /// This property is written to output but the class not /// public EnumToIgnore EnumToIgnoreProperty { get; set; } - } - [GenerateIgnore] - public class TypeToIgnore - { - public string StringProperty { get; set; } - } - - [GenerateIgnore] - public enum EnumToIgnore - { - None, - Any + /// + /// This property is generated, but the type itself will not be generated (e.g. to keep modifications). All used types will be generated + /// + public GenerateOnlySubTypes GenerateOnlySubTypes { get; set; } } public class FieldTypeToIgnore @@ -70,4 +62,4 @@ public class PropertyTypeToIgnore { public string StringProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute.sln b/Examples/Reflection/ReflectionReturnTypeAttribute.sln new file mode 100644 index 00000000..52579126 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "ReflectionReturnTypeAttribute", "ReflectionReturnTypeAttribute\ReflectionReturnTypeAttribute.csproj", "{75E282F9-66B1-495F-BE67-DCF13EC90073}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {75E282F9-66B1-495F-BE67-DCF13EC90073}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {75E282F9-66B1-495F-BE67-DCF13EC90073}.Debug|Any CPU.Build.0 = Debug|Any CPU + {75E282F9-66B1-495F-BE67-DCF13EC90073}.Release|Any CPU.ActiveCfg = Release|Any CPU + {75E282F9-66B1-495F-BE67-DCF13EC90073}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/OtherSubType.cs b/Examples/Reflection/ReflectionReturnTypeAttribute/OtherSubType.cs new file mode 100644 index 00000000..5b6af2dd --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/OtherSubType.cs @@ -0,0 +1,6 @@ +namespace ReflectionReturnTypeAttribute; + +public class OtherSubType +{ + public string OtherStringProperty { get; set; } +} \ No newline at end of file diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/Output/other-sub-type.ts b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/other-sub-type.ts new file mode 100644 index 00000000..d415fc37 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/other-sub-type.ts @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 8.8.8.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class OtherSubType { + public otherStringProperty: string; +} + +// outputid:75e282f9-66b1-495f-be67-dcf13ec90073 diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/Output/sub-type.ts b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/sub-type.ts new file mode 100644 index 00000000..fc30c828 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/sub-type.ts @@ -0,0 +1,16 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 8.8.8.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +export class SubType { + public stringProperty: string; +} + +// outputid:75e282f9-66b1-495f-be67-dcf13ec90073 diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/Output/types.ts b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/types.ts new file mode 100644 index 00000000..62df84e2 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/Output/types.ts @@ -0,0 +1,20 @@ +// ------------------------------------------------------------------------------ +// +// This code was generated with KY.Generator 8.8.8.0 +// +// Manual changes to this file may cause unexpected behavior in your application. +// Manual changes to this file will be overwritten if the code is regenerated. +// +// ------------------------------------------------------------------------------ +/* eslint-disable */ +// tslint:disable + +import { OtherSubType } from "./other-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public defaultSubTypeProperty: SubType; + public changedSubTypeProperty: OtherSubType; +} + +// outputid:75e282f9-66b1-495f-be67-dcf13ec90073 diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/ReflectionReturnTypeAttribute.csproj b/Examples/Reflection/ReflectionReturnTypeAttribute/ReflectionReturnTypeAttribute.csproj new file mode 100644 index 00000000..43b57936 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/ReflectionReturnTypeAttribute.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/SubType.cs b/Examples/Reflection/ReflectionReturnTypeAttribute/SubType.cs new file mode 100644 index 00000000..30eb6ba5 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/SubType.cs @@ -0,0 +1,6 @@ +namespace ReflectionReturnTypeAttribute; + +public class SubType +{ + public string StringProperty { get; set; } +} \ No newline at end of file diff --git a/Examples/Reflection/ReflectionReturnTypeAttribute/Types.cs b/Examples/Reflection/ReflectionReturnTypeAttribute/Types.cs new file mode 100644 index 00000000..953fcba9 --- /dev/null +++ b/Examples/Reflection/ReflectionReturnTypeAttribute/Types.cs @@ -0,0 +1,12 @@ +using KY.Generator; + +namespace ReflectionReturnTypeAttribute; + +[Generate(OutputLanguage.TypeScript, "Output")] +public class Types +{ + public SubType DefaultSubTypeProperty { get; set; } + + [GenerateReturnType(typeof(OtherSubType))] + public SubType ChangedSubTypeProperty { get; set; } +} diff --git a/Examples/Reflection/ReflectionX86/ReflectionX86.csproj b/Examples/Reflection/ReflectionX86/ReflectionX86.csproj index 9fa919c4..36712a07 100644 --- a/Examples/Reflection/ReflectionX86/ReflectionX86.csproj +++ b/Examples/Reflection/ReflectionX86/ReflectionX86.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Examples/Reflection/ReflectionX86/type-to-read.ts b/Examples/Reflection/ReflectionX86/type-to-read.ts index a9650629..287a6223 100644 --- a/Examples/Reflection/ReflectionX86/type-to-read.ts +++ b/Examples/Reflection/ReflectionX86/type-to-read.ts @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,8 +10,8 @@ // tslint:disable export class TypeToRead { - public stringProperty: string; - public numberProperty: number; + public stringProperty?: string; + public numberProperty?: number; } // outputid:8c8a1d3a-034b-4633-bf8c-aa6ac39af861 diff --git a/Examples/Reflection/build.cmd b/Examples/Reflection/build.cmd index 78ec604e..eb5ba539 100644 --- a/Examples/Reflection/build.cmd +++ b/Examples/Reflection/build.cmd @@ -118,4 +118,16 @@ rmdir /S/Q Output dotnet add package KY.Generator --prerelease dotnet add package KY.Generator.Annotations --prerelease dotnet build --no-incremental +cd .. +REM +REM ==================================== +REM || ReflectionReturnTypeAttribute || +REM ==================================== +REM +cd ReflectionReturnTypeAttribute +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental cd .. \ No newline at end of file diff --git a/Examples/Sqlite/FromDatabase/FromDatabase.csproj b/Examples/Sqlite/FromDatabase/FromDatabase.csproj index 48e0237f..8dd0b89f 100644 --- a/Examples/Sqlite/FromDatabase/FromDatabase.csproj +++ b/Examples/Sqlite/FromDatabase/FromDatabase.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Examples/Sqlite/FromDatabase/Generator.cs b/Examples/Sqlite/FromDatabase/Generator.cs index f9105cc6..13e364e0 100644 --- a/Examples/Sqlite/FromDatabase/Generator.cs +++ b/Examples/Sqlite/FromDatabase/Generator.cs @@ -6,13 +6,14 @@ public class Generator : GeneratorFluentMain { public override void Execute() { - this.Read() - .Sqlite(sqlite => sqlite.UseConnectionString("Data Source=test.db") - .UseAll()) - .Write() - .ReflectionModels("Output") - .FieldsToProperties() - ; + this.Read(read => read + .Sqlite(sqlite => sqlite.UseConnectionString("Data Source=test.db") + .UseAll())) + .Write(write => write + .Reflection(reflection => reflection + .Models("Output") + .FieldsToProperties()) + ); } } -} \ No newline at end of file +} diff --git a/Examples/Sqlite/FromDatabase/Output/Person.cs b/Examples/Sqlite/FromDatabase/Output/Person.cs index 15fe54cd..67d0beb6 100644 --- a/Examples/Sqlite/FromDatabase/Output/Person.cs +++ b/Examples/Sqlite/FromDatabase/Output/Person.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -10,7 +10,7 @@ using System.CodeDom.Compiler; -[GeneratedCode("KY.Generator", "7.6.0.0")] +[GeneratedCode("KY.Generator", "9.0.0.0")] public partial class Person { public int Id { get; set; } diff --git a/Examples/Sqlite/ToDatabase/PersonRepository.cs b/Examples/Sqlite/ToDatabase/PersonRepository.cs index 6dbb3695..dfd6920f 100644 --- a/Examples/Sqlite/ToDatabase/PersonRepository.cs +++ b/Examples/Sqlite/ToDatabase/PersonRepository.cs @@ -1,6 +1,6 @@ // ------------------------------------------------------------------------------ // -// This code was generated with KY.Generator 7.6.0.0 +// This code was generated with KY.Generator 9.0.0.0 // // Manual changes to this file may cause unexpected behavior in your application. // Manual changes to this file will be overwritten if the code is regenerated. @@ -15,7 +15,7 @@ namespace ToDatabase { - [GeneratedCode("KY.Generator", "7.6.0.0")] + [GeneratedCode("KY.Generator", "9.0.0.0")] public partial class PersonRepository { private SqliteConnection connection; diff --git a/Examples/Sqlite/ToDatabase/ToDatabase.csproj b/Examples/Sqlite/ToDatabase/ToDatabase.csproj index e61fa0d9..3f2491ab 100644 --- a/Examples/Sqlite/ToDatabase/ToDatabase.csproj +++ b/Examples/Sqlite/ToDatabase/ToDatabase.csproj @@ -8,8 +8,8 @@ - - + + diff --git a/Examples/Tsql/Tsql.sln b/Examples/Tsql/Tsql.sln index cc580df0..0acd6601 100644 --- a/Examples/Tsql/Tsql.sln +++ b/Examples/Tsql/Tsql.sln @@ -5,14 +5,6 @@ VisualStudioVersion = 16.0.30709.132 MinimumVisualStudioVersion = 10.0.40219.1 Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Tsql", "Tsql\Tsql.csproj", "{BF3819C5-3F43-46D9-93C6-2A7E1C041D64}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Fluent", "..\..\Fluent\KY.Generator.Fluent.csproj", "{EBDC1656-DF18-45A7-AE67-E15BB57FCA46}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Tsql", "..\..\Tsql\KY.Generator.Tsql.csproj", "{6DDD8529-091A-4B91-A146-10F7D7F1FB1D}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Core", "..\..\Core\KY.Generator.Core.csproj", "{42E3DB6D-C17F-4152-BC43-6037CD296A89}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Reflection", "..\..\Reflection\KY.Generator.Reflection.csproj", "{1CA55F54-C260-4F65-8898-336738E2E0E4}" -EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -23,22 +15,6 @@ Global {BF3819C5-3F43-46D9-93C6-2A7E1C041D64}.Debug|Any CPU.Build.0 = Debug|Any CPU {BF3819C5-3F43-46D9-93C6-2A7E1C041D64}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF3819C5-3F43-46D9-93C6-2A7E1C041D64}.Release|Any CPU.Build.0 = Release|Any CPU - {EBDC1656-DF18-45A7-AE67-E15BB57FCA46}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {EBDC1656-DF18-45A7-AE67-E15BB57FCA46}.Debug|Any CPU.Build.0 = Debug|Any CPU - {EBDC1656-DF18-45A7-AE67-E15BB57FCA46}.Release|Any CPU.ActiveCfg = Release|Any CPU - {EBDC1656-DF18-45A7-AE67-E15BB57FCA46}.Release|Any CPU.Build.0 = Release|Any CPU - {6DDD8529-091A-4B91-A146-10F7D7F1FB1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6DDD8529-091A-4B91-A146-10F7D7F1FB1D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6DDD8529-091A-4B91-A146-10F7D7F1FB1D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6DDD8529-091A-4B91-A146-10F7D7F1FB1D}.Release|Any CPU.Build.0 = Release|Any CPU - {42E3DB6D-C17F-4152-BC43-6037CD296A89}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {42E3DB6D-C17F-4152-BC43-6037CD296A89}.Debug|Any CPU.Build.0 = Debug|Any CPU - {42E3DB6D-C17F-4152-BC43-6037CD296A89}.Release|Any CPU.ActiveCfg = Release|Any CPU - {42E3DB6D-C17F-4152-BC43-6037CD296A89}.Release|Any CPU.Build.0 = Release|Any CPU - {1CA55F54-C260-4F65-8898-336738E2E0E4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {1CA55F54-C260-4F65-8898-336738E2E0E4}.Debug|Any CPU.Build.0 = Debug|Any CPU - {1CA55F54-C260-4F65-8898-336738E2E0E4}.Release|Any CPU.ActiveCfg = Release|Any CPU - {1CA55F54-C260-4F65-8898-336738E2E0E4}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Examples/Tsql/Tsql/Generator.cs b/Examples/Tsql/Tsql/Generator.cs index f4ae196f..95548b01 100644 --- a/Examples/Tsql/Tsql/Generator.cs +++ b/Examples/Tsql/Tsql/Generator.cs @@ -1,19 +1,16 @@ -using System; -using System.Collections.Generic; -using System.Text; -using KY.Generator; +using KY.Generator; namespace Tsql { - class Generator : GeneratorFluentMain + internal class Generator : GeneratorFluentMain { public override void Execute() { - this.Read() - .Tsql("Server=ky-database;Database=test;User Id=fi49sd;Password=fi49sd") - .FromTable("test", "User") - .Write() - .ReflectionModels("Output"); + this.Read(read => read + .Tsql("Server=ky-database;Database=test;User Id=fi49sd;Password=fi49sd", tsql => tsql + .FromTable("test", "User"))) + .Write(write => write + .Reflection(reflection => reflection.Models("Output"))); } } } diff --git a/Examples/Tsql/Tsql/Tsql.csproj b/Examples/Tsql/Tsql/Tsql.csproj index 73bd3453..93bff6b1 100644 --- a/Examples/Tsql/Tsql/Tsql.csproj +++ b/Examples/Tsql/Tsql/Tsql.csproj @@ -6,9 +6,9 @@ - - - + + + diff --git a/Fluent/Commands/FluentCommand.cs b/Fluent/Commands/FluentCommand.cs index 3c6c0240..0b2b0a7a 100644 --- a/Fluent/Commands/FluentCommand.cs +++ b/Fluent/Commands/FluentCommand.cs @@ -1,70 +1,78 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using KY.Core; +using KY.Core; using KY.Core.Dependency; using KY.Generator.Command; using KY.Generator.Extensions; using KY.Generator.Helpers; -using KY.Generator.Output; +using KY.Generator.Models; +using KY.Generator.Syntax; using KY.Generator.Transfer; -namespace KY.Generator.Fluent +namespace KY.Generator.Commands; + +internal class FluentCommand : GeneratorCommand { - internal class FluentCommand : GeneratorCommand + private readonly IDependencyResolver resolver; + private readonly List mains = new(); + + public static string[] Names { get; } = [ToCommand(nameof(FluentCommand)), "fluent"]; + + public FluentCommand(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; - public override string[] Names { get; }= { "fluent" }; + this.resolver = resolver; + } - public FluentCommand(IDependencyResolver resolver) + public override IGeneratorCommandResult Run() + { + if (string.IsNullOrEmpty(this.Parameters.Assembly)) { - this.resolver = resolver; + Logger.Error("Run from attributes can not be run without assembly parameter"); + return this.Error(); } - - public override IGeneratorCommandResult Run(IOutput output) + LocateAssemblyResult result = GeneratorAssemblyLocator.Locate(this.Parameters.Assembly, this.Parameters.IsBeforeBuild); + if (result.SwitchContext) { - if (string.IsNullOrEmpty(this.Parameters.Assembly)) - { - Logger.Error("Run from attributes can not be run without assembly parameter"); - return this.Error(); - } - LocateAssemblyResult result = GeneratorAssemblyLocator.Locate(this.Parameters.Assembly, this.Parameters.IsBeforeBuild); - if (result.SwitchContext) - { - return result; - } - if (this.Parameters.IsBeforeBuild && !result.Success) + return result; + } + if (this.Parameters.IsBeforeBuild && !result.Success) + { + return this.Success(); + } + bool isAssemblyAsync = result.Assembly.IsAsync(); + if (!this.Parameters.IsOnlyAsync && isAssemblyAsync) + { + return this.SwitchAsync(); + } + IEnumerable types = TypeHelper.GetTypes(result.Assembly).Where(type => typeof(GeneratorFluentMain).IsAssignableFrom(type)); + foreach (Type objectType in types) + { + GeneratorFluentMain main = (GeneratorFluentMain)this.resolver.Create(objectType); + this.mains.Add(main); + main.Resolver = this.resolver; + if (this.Parameters.IsBeforeBuild) { - return this.Success(); + main.ExecuteBeforeBuild(); } - bool isAssemblyAsync = result.Assembly.IsAsync(); - if (!this.Parameters.IsOnlyAsync && isAssemblyAsync) + else { - return this.SwitchAsync(); + main.Execute(); } - CommandRunner commandRunner = this.resolver.Get(); - IEnumerable types = TypeHelper.GetTypes(result.Assembly).Where(type => typeof(GeneratorFluentMain).IsAssignableFrom(type)); - foreach (Type objectType in types) + IEnvironment environment = this.resolver.Get(); + foreach (IFluentInternalSyntax syntax in main.Syntaxes) { - GeneratorFluentMain main = (GeneratorFluentMain)Activator.CreateInstance(objectType); - main.ResolverReference.Resolver = this.resolver; - if (this.Parameters.IsBeforeBuild) - { - main.ExecuteBeforeBuild(); - } - else + IGeneratorCommandResult commandResult = syntax.Run(); + if (!commandResult.Success) { - main.Execute(); - } - foreach (List commands in main.Syntaxes.Select(x => x.Commands).Where(x => x.Count > 0)) - { - List transferObjects = this.TransferObjects.ToList(); - commands.ForEach(x => x.TransferObjects = transferObjects); - commandRunner.Run(commands, output); + return commandResult; } + environment.TransferObjects.AddIfNotExists(syntax.Resolver.Get>()); } - return this.Success(); } + return this.Success(); + } + + public override void FollowUp() + { + base.FollowUp(); + this.mains.ForEach(main => main.Syntaxes.ForEach(syntax => syntax.FollowUp())); } } diff --git a/Fluent/Commands/FluentCommandParameters.cs b/Fluent/Commands/FluentCommandParameters.cs index 67f63a76..e8326f2c 100644 --- a/Fluent/Commands/FluentCommandParameters.cs +++ b/Fluent/Commands/FluentCommandParameters.cs @@ -1,7 +1,7 @@ using KY.Generator.Command; -namespace KY.Generator.Fluent +namespace KY.Generator.Commands { internal class FluentCommandParameters : GeneratorCommandParameters { } -} \ No newline at end of file +} diff --git a/Fluent/FluentModule.cs b/Fluent/FluentModule.cs index 2b12301c..f69d75ef 100644 --- a/Fluent/FluentModule.cs +++ b/Fluent/FluentModule.cs @@ -1,16 +1,15 @@ using KY.Core.Dependency; using KY.Core.Module; using KY.Generator.Command; -using KY.Generator.Fluent; +using KY.Generator.Commands; -namespace KY.Generator +namespace KY.Generator; + +public class FluentModule : ModuleBase { - public class FluentModule : ModuleBase + public FluentModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public FluentModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - } + this.DependencyResolver.Get().Register(FluentCommand.Names); } } \ No newline at end of file diff --git a/Fluent/GeneratorFluentMain.cs b/Fluent/GeneratorFluentMain.cs index 9c8f9420..c70f2b79 100644 --- a/Fluent/GeneratorFluentMain.cs +++ b/Fluent/GeneratorFluentMain.cs @@ -1,63 +1,90 @@ -using System.Collections.Generic; -using KY.Generator.Helpers; +using System.Linq.Expressions; +using System.Reflection; +using KY.Core; +using KY.Core.Dependency; using KY.Generator.Syntax; -namespace KY.Generator +namespace KY.Generator; + +/// +/// Entry point for fluent language generation. +/// Override the method to add some generation actions +/// +public abstract class GeneratorFluentMain : ISwitchToReadFluentSyntax { + public IDependencyResolver Resolver { get; set; } + public List Syntaxes { get; } = new(); + + /// + public ISwitchToWriteFluentSyntax Read(Action action) + { + return this.Create().Read(action); + } + + /// + /// Use the method to add generation actions like this: + /// this.Read().FromType<Types>().Write().AngularModels().OutputPath("Output/Models").AngularServices().OutputPath("Output/Services"); + /// + /// + /// this.Read() + /// .FromType<Types>() + /// .Write() + /// .AngularModels().OutputPath("Output/Models") + /// .AngularServices().OutputPath("Output/Services"); + /// + /// + public abstract void Execute(); + /// - /// Entry point for fluent language generation. - /// Override the method to add some generation actions + /// Runs before the assembly is build. Use the method to add generation actions like this: + /// this.Read().FromType<Types>().Write().AngularModels().OutputPath("Output/Models").AngularServices().OutputPath("Output/Services"); /// - public abstract class GeneratorFluentMain + /// + /// this.Read() + /// .FromType<Types>() + /// .Write() + /// .AngularModels().OutputPath("Output/Models") + /// .AngularServices().OutputPath("Output/Services"); + /// + /// + public virtual void ExecuteBeforeBuild() + { } + + /// + public ISwitchToReadFluentSyntax SetGlobal(Assembly assembly, Action action) + { + return this.Create().CastTo().SetGlobal(assembly, action); + } + + /// + public ISwitchToReadFluentSyntax SetType(Action action) + { + return this.Create().CastTo().SetType(action); + } + + /// + public ISwitchToReadFluentSyntax SetMember(Expression> memberExpression, Action action) + { + return this.Create().CastTo().SetMember(memberExpression, action); + } + + /// + public ISwitchToReadFluentSyntax SetMember(Expression> memberExpression, Action action) + { + return this.Create().CastTo().SetMember(memberExpression, action); + } + + /// + public ISwitchToReadFluentSyntax SetMember(string name, Action action) + { + return this.Create().CastTo().SetMember(name, action); + } + + private FluentSyntax Create() { - public DependencyResolverReference ResolverReference { get; } = new DependencyResolverReference(); - public List Syntaxes { get; } = new List(); - - /// - /// This method does not do anything. Use at least one extension method from one of the other generator packages e.g. KY.Generator.Angular or KY.Generator.Reflection - /// - protected IReadFluentSyntax Read() - { - FluentSyntax syntax = new FluentSyntax(this.ResolverReference); - this.Syntaxes.Add(syntax); - return syntax; - } - - /// - /// This method does not do anything. Use at least one extension method from one of the other generator packages e.g. KY.Generator.Angular or KY.Generator.Reflection - /// - protected IWriteFluentSyntax Write() - { - FluentSyntax syntax = new FluentSyntax(this.ResolverReference); - this.Syntaxes.Add(syntax); - return syntax; - } - - /// - /// Use the method to add generation actions like this: - /// this.Read().FromType<Types>().Write().AngularModels().OutputPath("Output/Models").AngularServices().OutputPath("Output/Services"); - /// - /// - /// this.Read() - /// .FromType<Types>() - /// .Write() - /// .AngularModels().OutputPath("Output/Models") - /// .AngularServices().OutputPath("Output/Services"); - /// - public abstract void Execute(); - - /// - /// Runs before the assembly is build. Use the method to add generation actions like this: - /// this.Read().FromType<Types>().Write().AngularModels().OutputPath("Output/Models").AngularServices().OutputPath("Output/Services"); - /// - /// - /// this.Read() - /// .FromType<Types>() - /// .Write() - /// .AngularModels().OutputPath("Output/Models") - /// .AngularServices().OutputPath("Output/Services"); - /// - public virtual void ExecuteBeforeBuild() - { } + IDependencyResolver resolver = this.Resolver.CloneForCommand(); + FluentSyntax syntax = resolver.Create(); + this.Syntaxes.Add(syntax); + return syntax; } } diff --git a/Fluent/KY.Generator.Fluent.csproj b/Fluent/KY.Generator.Fluent.csproj index b833ba5d..75a3f505 100644 --- a/Fluent/KY.Generator.Fluent.csproj +++ b/Fluent/KY.Generator.Fluent.csproj @@ -1,33 +1,48 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - Fluent language for KY-Generator - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator Fluent Language - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + Fluent language for KY-Generator + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator Fluent Language + latest + KY.Generator + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - ..\bin\Release\KY.Generator.Fluent.xml - 1701;1702;1591 - + + ..\bin\Release + ..\bin\Release\KY.Generator.Fluent.xml + 1701;1702;1591 + - - - + + + + + + + + + + + + + diff --git a/Fluent/KY.Generator.Fluent.csproj.DotSettings b/Fluent/KY.Generator.Fluent.csproj.DotSettings new file mode 100644 index 00000000..e46c24fe --- /dev/null +++ b/Fluent/KY.Generator.Fluent.csproj.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/Fluent/README.md b/Fluent/README.md new file mode 100644 index 00000000..946002ce --- /dev/null +++ b/Fluent/README.md @@ -0,0 +1,30 @@ +# KY.Generator.Annotations ![](https://img.shields.io/nuget/v/KY.Generator.svg?style=flat) + +[Documentation](https://generator.ky-programming.de) | [Getting Started](https://generator.ky-programming.de/start) | [Supported Platforms](https://generator.ky-programming.de/start/platforms) | [Need Help?](https://generator.ky-programming.de/start/help) + +## Generate via Chained Methods + +The Fluent API is a chained method based pattern, to provide an easy and powerful way to specify your generator actions. + +The methods are found in the KY.Generator.Fluent package + +You have to create a class that inherits from GeneratorFluentMain (e.g. in a own generator project) + +``` +public class GeneratorMain : GeneratorFluentMain +{ + public override void Execute() + { + this.Read() + .AspDotNet(x => x.FromController()) + .Write() + .Angular(x => x + .Services(config => config.OutputPath("/ClientApp/src/app/services")) + .Models(config => config.OutputPath("/ClientApp/src/app/models")) + ); + } +} +``` + +## Read More +Continue reading with [Fluent API Overview](https://generator.ky-programming.de/start/code/fluent-api) diff --git a/Fluent/Syntax/FileNameFluentSyntax.cs b/Fluent/Syntax/FileNameFluentSyntax.cs new file mode 100644 index 00000000..0945cbf2 --- /dev/null +++ b/Fluent/Syntax/FileNameFluentSyntax.cs @@ -0,0 +1,19 @@ +using KY.Generator.Models; + +namespace KY.Generator.Syntax; + +public class FileNameFluentSyntax : IFileNameFluentSyntax +{ + private readonly GeneratorOptions options; + + public FileNameFluentSyntax(GeneratorOptions options) + { + this.options = options; + } + + public IFileNameFluentSyntax Replace(string pattern, string replacement, string matchingType = null) + { + this.options.Formatting.Add(new FileNameReplacer(null, pattern, replacement, matchingType)); + return this; + } +} diff --git a/Fluent/Syntax/FluentSyntax.cs b/Fluent/Syntax/FluentSyntax.cs index 9bb2e8ad..6106e947 100644 --- a/Fluent/Syntax/FluentSyntax.cs +++ b/Fluent/Syntax/FluentSyntax.cs @@ -1,30 +1,175 @@ -using System; -using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; +using KY.Core; using KY.Core.Dependency; using KY.Generator.Command; -namespace KY.Generator.Syntax +namespace KY.Generator.Syntax; + +public class FluentSyntax : IReadFluentSyntaxInternal, IWriteFluentSyntaxInternal, ISwitchToReadFluentSyntax { - public class FluentSyntax : IReadFluentSyntaxInternal, IWriteFluentSyntaxInternal + private readonly Options options; + public IDependencyResolver Resolver { get; } + + public List Syntaxes { get; } = []; + + public FluentSyntax(IDependencyResolver resolver, Options options) { - public IDependencyResolver Resolver { get; } + this.options = options; + this.Resolver = resolver; + } - public List Commands { get; set; } = new List(); + public ISwitchToWriteFluentSyntax Read(Action action) + { + action(this); + return this; + } - public FluentSyntax(IDependencyResolver resolver) - { - this.Resolver = resolver; - } + public void Write(Action action) + { + action(this); + } - public IWriteFluentSyntax Write() + public IGeneratorCommandResult Run() + { + GeneratorCommandRunner runner = this.Resolver.Create(); + foreach (IExecutableSyntax syntax in this.Syntaxes) { - return this; + IGeneratorCommandResult commandResult = runner.Run(syntax.Commands); + if (!commandResult.Success) + { + return commandResult; + } } + return new SuccessResult(); + } + + public void FollowUp() + { + this.Syntaxes.ForEach(syntax => syntax.Commands.ForEach(command => command.FollowUp())); + } + + ISwitchToReadFluentSyntax IFluentSyntax.SetGlobal(Assembly assembly, Action action) + { + return this.SetGlobal(assembly, action); + } + + ISwitchToReadFluentSyntax IFluentSyntax.SetType(Action action) + { + return this.SetType(action); + } + + ISwitchToReadFluentSyntax IFluentSyntax.SetMember(Expression> memberExpression, Action action) + { + return this.SetMember(memberExpression, action); + } + + ISwitchToReadFluentSyntax IFluentSyntax.SetMember(Expression> memberExpression, Action action) + { + return this.SetMember(memberExpression, action); + } + + ISwitchToReadFluentSyntax IFluentSyntax.SetMember(string name, Action action) + { + return this.SetMember(name, action); + } + + ISwitchToWriteFluentSyntax IFluentSyntax.SetGlobal(Assembly assembly, Action action) + { + return this.SetGlobal(assembly, action); + } + + ISwitchToWriteFluentSyntax IFluentSyntax.SetType(Action action) + { + return this.SetType(action); + } + + ISwitchToWriteFluentSyntax IFluentSyntax.SetMember(Expression> memberExpression, Action action) + { + return this.SetMember(memberExpression, action); + } + + ISwitchToWriteFluentSyntax IFluentSyntax.SetMember(Expression> memberExpression, Action action) + { + return this.SetMember(memberExpression, action); + } + + ISwitchToWriteFluentSyntax IFluentSyntax.SetMember(string name, Action action) + { + return this.SetMember(name, action); + } + + private FluentSyntax SetGlobal(Assembly assembly, Action action) + { + action(new SetFluentSyntax(assembly, this.options)); + return this; + } + + private FluentSyntax SetType(Action action) + { + action(new SetFluentSyntax(typeof(T), this.options)); + return this; + } + + private FluentSyntax SetMember(Expression> memberAction, Action action) + { + action(new SetFluentMemberSyntax(this.ExtractMemberInfo(memberAction), this.options)); + return this; + } + + private FluentSyntax SetMember(Expression> memberAction, Action action) + { + action(new SetFluentMemberSyntax(this.ExtractMemberInfo(memberAction), this.options)); + return this; + } - public IReadFluentSyntax SetType(Action action) + private FluentSyntax SetMember(string name, Action action) + { + Type type = typeof(T); + type.GetMembers().Where(x => x.Name == name).ForEach(member => action(new SetFluentMemberSyntax(member, this.options))); + return this; + } + + public IWriteFluentSyntax Formatting(Action action) + { + action(new FormattingFluentSyntax(this.options.Get().Formatting)); + return this; + } + + public IWriteFluentSyntax NoHeader() + { + this.options.Get().AddHeader = false; + return this; + } + + public IWriteFluentSyntax ForceOverwrite() + { + this.options.Get().ForceOverwrite = true; + return this; + } + + public IWriteFluentSyntax FileName(Action action) + { + action(new FileNameFluentSyntax(this.options.Get())); + return this; + } + + public IWriteFluentSyntax Formatter(string command) + { + this.options.Get().Formatter = command; + return this; + } + + private MemberInfo ExtractMemberInfo(Expression expression) + { + switch (expression.Body) { - action(new SetFluentSyntax(typeof(T))); - return this; + case MethodCallExpression methodCallExpression: + return methodCallExpression.Method; + case MemberExpression memberExpression: + return memberExpression.Member; + default: + throw new InvalidOperationException($"Expression '{expression}' is invalid. Use only methods (x => x.Get()) or Properties (x => x.Property)"); } } -} +} \ No newline at end of file diff --git a/Fluent/Syntax/FormattingFluentSyntax.cs b/Fluent/Syntax/FormattingFluentSyntax.cs new file mode 100644 index 00000000..834dd761 --- /dev/null +++ b/Fluent/Syntax/FormattingFluentSyntax.cs @@ -0,0 +1,151 @@ +using System; +using System.Linq; +using KY.Generator.Extensions; +using KY.Generator.Models; + +namespace KY.Generator.Syntax +{ + public class FormattingFluentSyntax : IFormattingFluentSyntax + { + private readonly FormattingOptions options; + + public FormattingFluentSyntax(FormattingOptions options) + { + this.options = options; + } + + public IFormattingFluentSyntax FileCase(string casing) + { + this.options.FileCase = casing; + return this; + } + + public IFormattingFluentSyntax ClassCase(string casing) + { + this.options.ClassCase = casing; + return this; + } + + public IFormattingFluentSyntax FieldCase(string casing) + { + this.options.FieldCase = casing; + return this; + } + + public IFormattingFluentSyntax PropertyCase(string casing) + { + this.options.PropertyCase = casing; + return this; + } + + public IFormattingFluentSyntax MethodCase(string casing) + { + this.options.MethodCase = casing; + return this; + } + + public IFormattingFluentSyntax ParameterCase(string casing) + { + this.options.ParameterCase = casing; + return this; + } + + public IFormattingFluentSyntax CaseMode(CaseMode mode) + { + this.options.CaseMode = mode; + return this; + } + + public IFormattingFluentSyntax AllowedSpecialCharacters(string specialCharacters) + { + this.options.AllowedSpecialCharacters = specialCharacters; + return this; + } + + public IFormattingFluentSyntax UseWhitespaces(int spaces = 4) + { + this.options.IndentChar = " "; + this.options.IndentCount = spaces; + return this; + } + + public IFormattingFluentSyntax UseTab(int tabs = 1) + { + this.options.IndentChar = "\t"; + this.options.IndentCount = tabs; + return this; + } + + public IFormattingFluentSyntax Quotes(string quote) + { + this.options.Quote = quote; + return this; + } + + public IFormattingFluentSyntax NoStartBlockInNewLine() + { + this.options.StartBlockInNewLine = false; + return this; + } + + public IFormattingFluentSyntax NoEndFileWithNewLine() + { + this.options.EndFileWithNewLine = false; + return this; + } + + public IFormattingFluentSyntax CollapseEmptyClasses(string spacer = " ") + { + this.options.CollapseEmptyClasses = true; + this.options.CollapsedClassesSpacer = spacer; + return this; + } + + public IFormattingFluentSyntax ClassPrefix(string prefix) + { + this.options.ClassPrefix = prefix; + return this; + } + + public IFormattingFluentSyntax InterfacePrefix(string prefix) + { + this.options.InterfacePrefix = prefix; + return this; + } + + public IFormattingFluentSyntax AddFileNameReplacer(string key, string pattern, string replacement, string matchingType = null) + { + if (this.options.FileNameReplacer.Any(x => x.Key == key)) + { + throw new InvalidOperationException($"FileNameReplace {key} already exists. Use {nameof(this.SetFileNameReplacer)} instead"); + } + this.options.AddFileNameReplace(new FileNameReplacer(key, pattern, replacement, matchingType)); + return this; + } + + public IFormattingFluentSyntax SetFileNameReplacer(string key, string replacement) + { + FileNameReplacer found = this.options.FileNameReplacer.FirstOrDefault(x => x.Key == key); + if (found == null) + { + throw new InvalidOperationException($"FileNameReplace {key} does not exists. Use {nameof(this.AddFileNameReplacer)} first"); + } + found.SetReplacement(replacement); + return this; + } + + public IFormattingFluentSyntax AddOrSetFileNameReplacer(string key, string pattern, string replacement, string matchingType = null) + { + FileNameReplacer found = this.options.FileNameReplacer.FirstOrDefault(x => x.Key == key); + if (found == null) + { + this.options.AddFileNameReplace(new FileNameReplacer(key, pattern, replacement, matchingType)); + } + else + { + found.SetPattern(pattern).SetReplacement(replacement).SetMatchingType(matchingType); + } + return this; + } + } +} diff --git a/Fluent/Syntax/IExecutableSyntax.cs b/Fluent/Syntax/IExecutableSyntax.cs new file mode 100644 index 00000000..e82492bf --- /dev/null +++ b/Fluent/Syntax/IExecutableSyntax.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; +using KY.Generator.Command; + +namespace KY.Generator.Syntax +{ + public interface IExecutableSyntax + { + List Commands { get; } + } +} diff --git a/Fluent/Syntax/IFileNameFluentSyntax.cs b/Fluent/Syntax/IFileNameFluentSyntax.cs new file mode 100644 index 00000000..0e6433ad --- /dev/null +++ b/Fluent/Syntax/IFileNameFluentSyntax.cs @@ -0,0 +1,13 @@ +namespace KY.Generator.Syntax +{ + public interface IFileNameFluentSyntax + { + /// + /// A regex replace like + /// + /// A regex pattern e.g. "^my-(.*)$" + /// A regex replacement e.g. "$1..." + /// The required type of the file. Default is null. Null means all + IFileNameFluentSyntax Replace(string pattern, string replacement, string matchingType = null); + } +} \ No newline at end of file diff --git a/Fluent/Syntax/IFluentInternalSyntax.cs b/Fluent/Syntax/IFluentInternalSyntax.cs new file mode 100644 index 00000000..3b75b08e --- /dev/null +++ b/Fluent/Syntax/IFluentInternalSyntax.cs @@ -0,0 +1,14 @@ +using System.Collections.Generic; +using KY.Core.Dependency; +using KY.Generator.Command; + +namespace KY.Generator.Syntax +{ + public interface IFluentInternalSyntax + { + IDependencyResolver Resolver { get; } + IGeneratorCommandResult Run(); + void FollowUp(); + List Syntaxes { get; } + } +} diff --git a/Fluent/Syntax/IFluentSyntax.cs b/Fluent/Syntax/IFluentSyntax.cs index c34ea01a..5d0d5b5c 100644 --- a/Fluent/Syntax/IFluentSyntax.cs +++ b/Fluent/Syntax/IFluentSyntax.cs @@ -1,12 +1,15 @@ -using System.Collections.Generic; -using KY.Core.Dependency; -using KY.Generator.Command; +using System; +using System.Linq.Expressions; +using System.Reflection; namespace KY.Generator.Syntax { - public interface IFluentSyntax + public interface IFluentSyntax { - IDependencyResolver Resolver { get; } - List Commands { get; } + TSyntax SetGlobal(Assembly assembly, Action action); + TSyntax SetType(Action action); + TSyntax SetMember(Expression> memberExpression, Action action); + TSyntax SetMember(Expression> memberExpression, Action action); + TSyntax SetMember(string name, Action action); } -} \ No newline at end of file +} diff --git a/Fluent/Syntax/IFormattingFluentSyntax.cs b/Fluent/Syntax/IFormattingFluentSyntax.cs new file mode 100644 index 00000000..938120dd --- /dev/null +++ b/Fluent/Syntax/IFormattingFluentSyntax.cs @@ -0,0 +1,92 @@ +using KY.Generator.Models; + +namespace KY.Generator.Syntax +{ + public interface IFormattingFluentSyntax + { + /// + /// Case of a file. + /// + IFormattingFluentSyntax FileCase(string casing); + + /// + /// Case of a class. + /// + IFormattingFluentSyntax ClassCase(string casing); + + /// + /// Case of a field. + /// + IFormattingFluentSyntax FieldCase(string casing); + + /// + /// Case of a property. + /// + IFormattingFluentSyntax PropertyCase(string casing); + + /// + /// Case of a method. + /// + IFormattingFluentSyntax MethodCase(string casing); + + /// + /// Case of a parameter. + /// + IFormattingFluentSyntax ParameterCase(string casing); + + /// + /// Compatibility mode for casing e.g. ASP.NET serializer converts MY_TEST to mY_TEST instead of expected myTest + /// + IFormattingFluentSyntax CaseMode(CaseMode mode); + + /// + /// Define with characters are allowed in class, property, field or parameter names. Default is none + /// + IFormattingFluentSyntax AllowedSpecialCharacters(string specialCharacters); + + /// + /// Forces the generator to use spaces for indenting + /// + IFormattingFluentSyntax UseWhitespaces(int spaces = 4); + + /// + /// Forces the generator to use tabs for indenting + /// + IFormattingFluentSyntax UseTab(int tabs = 1); + + /// + /// Defines a char for quotes. E.g single ' or double " + /// + IFormattingFluentSyntax Quotes(string quote); + + /// + /// Forces the brace of a block to stay in same line. E.g. if (...) {... or class Dummy {... + /// + IFormattingFluentSyntax NoStartBlockInNewLine(); + + /// + /// Per default all files ends with a empty line + /// + IFormattingFluentSyntax NoEndFileWithNewLine(); + + /// + /// Collapses a class if no properties or values exists. E.g. class Dummy { } + /// + /// The string between the braces of a empty class. E.g. space, empty string or tab + IFormattingFluentSyntax CollapseEmptyClasses(string spacer = " "); + + /// + /// Prefix to add to class name. E.g if you set "C" as prefix MyClass => CMyClass + /// + IFormattingFluentSyntax ClassPrefix(string prefix); + + /// + /// Prefix to add to interface name. E.g if you set "I" as prefix MyInterface => IMyInterface + /// + IFormattingFluentSyntax InterfacePrefix(string prefix); + + IFormattingFluentSyntax AddFileNameReplacer(string key, string pattern, string replacement, string matchingType = null); + IFormattingFluentSyntax SetFileNameReplacer(string key, string replacement); + IFormattingFluentSyntax AddOrSetFileNameReplacer(string key, string pattern, string replacement, string matchingType = null); + } +} diff --git a/Fluent/Syntax/IReadFluentOrSwitchToWriteSyntax.cs b/Fluent/Syntax/IReadFluentOrSwitchToWriteSyntax.cs deleted file mode 100644 index 64f85498..00000000 --- a/Fluent/Syntax/IReadFluentOrSwitchToWriteSyntax.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace KY.Generator.Syntax -{ - public interface IReadFluentOrSwitchToWriteSyntax : IReadFluentSyntax, ISwitchToWriteSyntax - { - - } -} \ No newline at end of file diff --git a/Fluent/Syntax/IReadFluentSyntax.cs b/Fluent/Syntax/IReadFluentSyntax.cs index 00b9b95d..39ee7a5b 100644 --- a/Fluent/Syntax/IReadFluentSyntax.cs +++ b/Fluent/Syntax/IReadFluentSyntax.cs @@ -1,9 +1,5 @@ -using System; - -namespace KY.Generator.Syntax +namespace KY.Generator.Syntax { public interface IReadFluentSyntax - { - IReadFluentSyntax SetType(Action action); - } + { } } diff --git a/Fluent/Syntax/IReadFluentSyntaxInternal.cs b/Fluent/Syntax/IReadFluentSyntaxInternal.cs index a5c0bc91..43b997d9 100644 --- a/Fluent/Syntax/IReadFluentSyntaxInternal.cs +++ b/Fluent/Syntax/IReadFluentSyntaxInternal.cs @@ -1,6 +1,6 @@ namespace KY.Generator.Syntax { - public interface IReadFluentSyntaxInternal : IReadFluentSyntax, IFluentSyntax, ISwitchToWriteSyntax, IReadFluentOrSwitchToWriteSyntax + public interface IReadFluentSyntaxInternal : IReadFluentSyntax, IFluentInternalSyntax, ISwitchToWriteFluentSyntax { } -} \ No newline at end of file +} diff --git a/Fluent/Syntax/ISetFluentSyntax.cs b/Fluent/Syntax/ISetFluentSyntax.cs index 51c6139a..9c48e250 100644 --- a/Fluent/Syntax/ISetFluentSyntax.cs +++ b/Fluent/Syntax/ISetFluentSyntax.cs @@ -1,7 +1,18 @@ -namespace KY.Generator.Syntax +namespace KY.Generator.Syntax; + +public interface ISetFluentSyntax : ISetFluentSyntax +{ } + +public interface ISetFluentSyntax { - public interface ISetFluentSyntax - { - ISetFluentSyntax Ignore(); - } + // TODO: Document + T PropertiesToFields(); + T FieldsToProperties(); + T PreferInterfaces(); + T OptionalFields(); + T OptionalProperties(); + T Ignore(); + T ReplaceName(string replace, string with); + T OnlySubTypes(); + T FormatNames(bool value = true); } diff --git a/Fluent/Syntax/ISetMemberFluentSyntax.cs b/Fluent/Syntax/ISetMemberFluentSyntax.cs new file mode 100644 index 00000000..041e3271 --- /dev/null +++ b/Fluent/Syntax/ISetMemberFluentSyntax.cs @@ -0,0 +1,21 @@ +using System; + +namespace KY.Generator.Syntax; + +public interface ISetMemberFluentSyntax : ISetFluentSyntax +{ + /// + /// Renames a method or property + /// + ISetMemberFluentSyntax Rename(string name); + + /// + /// Changes the return type + /// + ISetMemberReturnTypeFluentSyntax ReturnType(Type type); + + /// + /// Changes the return type. Maybe you have to specify also an import e.g. .ReturnType(...).ImportFile(...) + /// + ISetMemberReturnTypeFluentSyntax ReturnType(string typeName); +} diff --git a/Fluent/Syntax/ISetMemberReturnTypeFluentSyntax.cs b/Fluent/Syntax/ISetMemberReturnTypeFluentSyntax.cs new file mode 100644 index 00000000..dd287426 --- /dev/null +++ b/Fluent/Syntax/ISetMemberReturnTypeFluentSyntax.cs @@ -0,0 +1,14 @@ +namespace KY.Generator.Syntax; + +public interface ISetMemberReturnTypeFluentSyntax : ISetMemberFluentSyntax +{ + /// + /// Import a namespace + /// + ISetMemberFluentSyntax ImportNamespace(string nameSpace); + + /// + /// Import a file by its name. Specify optionally a different import type name + /// + ISetMemberFluentSyntax ImportFile(string fileName, string type = null); +} diff --git a/Fluent/Syntax/ISwitchToReadFluentSyntax.cs b/Fluent/Syntax/ISwitchToReadFluentSyntax.cs new file mode 100644 index 00000000..57894711 --- /dev/null +++ b/Fluent/Syntax/ISwitchToReadFluentSyntax.cs @@ -0,0 +1,14 @@ +using System; + +namespace KY.Generator.Syntax +{ + public interface ISwitchToReadFluentSyntax : IFluentSyntax + { + /// + /// Executes the read actions. Use at least one action method from one of the other generator packages + /// e.g. KY.Generator.AspDotNet or KY.Generator.Reflection + /// + /// + ISwitchToWriteFluentSyntax Read(Action action); + } +} diff --git a/Fluent/Syntax/ISwitchToWriteFluentSyntax.cs b/Fluent/Syntax/ISwitchToWriteFluentSyntax.cs new file mode 100644 index 00000000..da86004b --- /dev/null +++ b/Fluent/Syntax/ISwitchToWriteFluentSyntax.cs @@ -0,0 +1,14 @@ +using System; + +namespace KY.Generator.Syntax +{ + public interface ISwitchToWriteFluentSyntax : IFluentSyntax + { + /// + /// Executes the write actions. Use at least one action method from one of the other generator packages + /// e.g. KY.Generator.Angular or KY.Generator.Reflection + /// + /// + void Write(Action action); + } +} diff --git a/Fluent/Syntax/ISwitchToWriteSyntax.cs b/Fluent/Syntax/ISwitchToWriteSyntax.cs deleted file mode 100644 index 9da269f0..00000000 --- a/Fluent/Syntax/ISwitchToWriteSyntax.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace KY.Generator.Syntax -{ - public interface ISwitchToWriteSyntax - { - /// - /// This method does not do anything. Use at least one extension method from one of the other generator packages e.g. KY.Generator.Angular or KY.Generator.Reflection - /// - IWriteFluentSyntax Write(); - } -} \ No newline at end of file diff --git a/Fluent/Syntax/IWriteFluentSyntax.cs b/Fluent/Syntax/IWriteFluentSyntax.cs index 99c4bd35..6f51c71b 100644 --- a/Fluent/Syntax/IWriteFluentSyntax.cs +++ b/Fluent/Syntax/IWriteFluentSyntax.cs @@ -1,5 +1,49 @@ -namespace KY.Generator.Syntax +using System; + +namespace KY.Generator.Syntax { public interface IWriteFluentSyntax - { } + { + /// + /// Code formatting guidelines + /// + IWriteFluentSyntax Formatting(Action action); + + /// + /// Forces the generator to skip the default header (NOT RECOMMENDED) + /// + IWriteFluentSyntax NoHeader(); + + /// + /// Forces the generator to not check if file has changes and always overwrites a file (NOT RECOMMENDED) + /// + IWriteFluentSyntax ForceOverwrite(); + + /// + /// Modify the file name + /// + IWriteFluentSyntax FileName(Action action); + + /// + /// Executes a formatter after a file is generated and written to disk. + /// Available variables: + /// + /// + /// $file + /// The absolute path to the changed file + /// + /// + /// $project + /// The absolute path to the project folder (path to the project file, without the file name) + /// + /// + /// $output + /// The absolute path to the output folder + /// + /// + /// + /// + /// + IWriteFluentSyntax Formatter(string command); + } } diff --git a/Fluent/Syntax/IWriteFluentSyntaxInternal.cs b/Fluent/Syntax/IWriteFluentSyntaxInternal.cs index ac388143..f7729304 100644 --- a/Fluent/Syntax/IWriteFluentSyntaxInternal.cs +++ b/Fluent/Syntax/IWriteFluentSyntaxInternal.cs @@ -1,5 +1,5 @@ namespace KY.Generator.Syntax { - public interface IWriteFluentSyntaxInternal : IWriteFluentSyntax, IFluentSyntax + public interface IWriteFluentSyntaxInternal : IWriteFluentSyntax, IFluentInternalSyntax { } } \ No newline at end of file diff --git a/Fluent/Syntax/SetFluentMemberSyntax.cs b/Fluent/Syntax/SetFluentMemberSyntax.cs new file mode 100644 index 00000000..2ccfa806 --- /dev/null +++ b/Fluent/Syntax/SetFluentMemberSyntax.cs @@ -0,0 +1,56 @@ +using System; +using System.Reflection; +using KY.Generator.Transfer; + +namespace KY.Generator.Syntax; + +public class SetFluentMemberSyntax : SetFluentSyntax, ISetMemberFluentSyntax, ISetMemberReturnTypeFluentSyntax +{ + public SetFluentMemberSyntax(Assembly assembly, Options options) + : base(assembly, options) + { } + + public SetFluentMemberSyntax(Type type, Options options) + : base(type, options) + { } + + public SetFluentMemberSyntax(MemberInfo member, Options options) + : base(member, options) + { } + + protected override ISetMemberFluentSyntax GetReturn() + { + return this; + } + + public ISetMemberFluentSyntax Rename(string name) + { + this.GeneratorOptions.Rename = name; + return this; + } + + public ISetMemberReturnTypeFluentSyntax ReturnType(Type type) + { + this.GeneratorOptions.ReturnType = new TypeTransferObject { Name = type.Name, Namespace = type.Namespace, Type = type }; + return this; + } + + public ISetMemberReturnTypeFluentSyntax ReturnType(string typeName) + { + this.GeneratorOptions.ReturnType = new TypeTransferObject { Name = typeName }; + return this; + } + + public ISetMemberFluentSyntax ImportNamespace(string nameSpace) + { + this.GeneratorOptions.ReturnType.Namespace = nameSpace; + return this; + } + + public ISetMemberFluentSyntax ImportFile(string fileName, string type = null) + { + this.GeneratorOptions.ReturnType.FileName = fileName; + this.GeneratorOptions.ReturnType.OverrideType = type; + return this; + } +} \ No newline at end of file diff --git a/Fluent/Syntax/SetFluentSyntax.cs b/Fluent/Syntax/SetFluentSyntax.cs index 71956814..7e48879a 100644 --- a/Fluent/Syntax/SetFluentSyntax.cs +++ b/Fluent/Syntax/SetFluentSyntax.cs @@ -1,23 +1,109 @@ -using System; -using System.Reflection; -using KY.Generator.Helpers; -using KY.Generator.Models; +using System.Reflection; -namespace KY.Generator.Syntax +namespace KY.Generator.Syntax; + +public class SetFluentSyntax : SetFluentSyntax, ISetFluentSyntax +{ + public SetFluentSyntax(Assembly assembly, Options options) + : base(assembly, options) + { } + + public SetFluentSyntax(Type type, Options options) + : base(type, options) + { } + + public SetFluentSyntax(MemberInfo member, Options options) + : base(member, options) + { } + + protected override ISetFluentSyntax GetReturn() + { + return this; + } +} + +public abstract class SetFluentSyntax : ISetFluentSyntax + where T : ISetFluentSyntax { - public class SetFluentSyntax : ISetFluentSyntax + protected Options Options { get; } + protected GeneratorOptions GeneratorOptions { get; } + + private SetFluentSyntax(Options options) { - private readonly Type type; + this.Options = options; + } - public SetFluentSyntax(Type type) - { - this.type = type; - } + protected SetFluentSyntax(Assembly assembly, Options options) + : this(options) + { + this.GeneratorOptions = this.Options.Get(assembly); + } + + protected SetFluentSyntax(Type type, Options options) + : this(options) + { + this.GeneratorOptions = this.Options.Get(type); + } + + protected SetFluentSyntax(MemberInfo member, Options options) + : this(options) + { + this.GeneratorOptions = this.Options.Get(member); + } + + protected abstract T GetReturn(); + + public T PropertiesToFields() + { + this.GeneratorOptions.PropertiesToFields = true; + return this.GetReturn(); + } - public ISetFluentSyntax Ignore() - { - IgnoreTypeHelper.IgnoredTypes.Add(this.type); - return this; - } + public T FieldsToProperties() + { + this.GeneratorOptions.FieldsToProperties = true; + return this.GetReturn(); + } + + public T PreferInterfaces() + { + this.GeneratorOptions.PreferInterfaces = true; + return this.GetReturn(); + } + + public T OptionalFields() + { + this.GeneratorOptions.OptionalFields = true; + return this.GetReturn(); + } + + public T OptionalProperties() + { + this.GeneratorOptions.OptionalProperties = true; + return this.GetReturn(); + } + + public T Ignore() + { + this.GeneratorOptions.Ignore = true; + return this.GetReturn(); + } + + public T ReplaceName(string replace, string with) + { + this.GeneratorOptions.AddToReplaceName(replace, with); + return this.GetReturn(); + } + + public T OnlySubTypes() + { + this.GeneratorOptions.OnlySubTypes = true; + return this.GetReturn(); + } + + public T FormatNames(bool value = true) + { + this.GeneratorOptions.FormatNames = value; + return this.GetReturn(); } } diff --git a/Fluent/nuget.nuspec b/Fluent/nuget.nuspec index 25698731..02cb4aa0 100644 --- a/Fluent/nuget.nuspec +++ b/Fluent/nuget.nuspec @@ -1,28 +1,30 @@ - - KY.Generator.Fluent - 7.6.0 - Codestin Search App - KY-Programming - KY-Programming - https://github.com/KY-Programming/generator/blob/master/LICENSE - https://generator.ky-programming.de - - https://ky-programming.de/images/logos/128.png - false - Fluent language for KY-Generator - - Copyright 2021 - KY-Generator KY Generator Fluent Language - - - - - - - - - + + KY.Generator.Fluent + 10.0.0-preview.2 + Codestin Search App + KY-Programming + KY-Programming + MIT + https://generator.ky-programming.de + + assets\icon.png + false + Fluent language for KY-Generator + + 2025 - KY-Programming + KY-Generator KY.Generator Fluent Language + + + + + + + + + + + diff --git a/Json.Tests/ConfigurationTests.cs b/Json.Tests/ConfigurationTests.cs index cee8d570..3ffe761b 100644 --- a/Json.Tests/ConfigurationTests.cs +++ b/Json.Tests/ConfigurationTests.cs @@ -1,7 +1,6 @@ using System.Collections.Generic; using KY.Core; using KY.Core.Dependency; -using KY.Generator.Configuration; using KY.Generator.Configurations; using KY.Generator.Csharp; using KY.Generator.Csharp.Languages; @@ -92,4 +91,4 @@ public void Initialize() // Assert.AreEqual(true, writeConfiguration.FormatNames); //} } -} \ No newline at end of file +} diff --git a/Json.Tests/FullStageTests.cs b/Json.Tests/FullStageTests.cs index e9e0984b..0ee775c6 100644 --- a/Json.Tests/FullStageTests.cs +++ b/Json.Tests/FullStageTests.cs @@ -1,6 +1,5 @@ using System.Collections.Generic; using KY.Core.Dependency; -using KY.Generator.Configuration; using KY.Generator.Csharp; using KY.Generator.Json.Tests.Properties; using KY.Generator.Mappings; diff --git a/Json.Tests/KY.Generator.Json.Tests.csproj b/Json.Tests/KY.Generator.Json.Tests.csproj index a54b39c0..5438ad11 100644 --- a/Json.Tests/KY.Generator.Json.Tests.csproj +++ b/Json.Tests/KY.Generator.Json.Tests.csproj @@ -1,9 +1,11 @@  - netcoreapp2.1 + net6.0 false + + latest @@ -29,14 +31,14 @@ - + - + diff --git a/Json/Commands/JsonReadCommand.cs b/Json/Commands/JsonReadCommand.cs index b939218e..d981f6a0 100644 --- a/Json/Commands/JsonReadCommand.cs +++ b/Json/Commands/JsonReadCommand.cs @@ -4,28 +4,27 @@ using KY.Generator.Json.Readers; using KY.Generator.Output; -namespace KY.Generator.Json.Commands +namespace KY.Generator.Json.Commands; + +public class JsonReadCommand : GeneratorCommand { - public class JsonReadCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; + private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "json-read" }; + public static string[] Names { get; } = [ToCommand(nameof(JsonReadCommand)), "json-read"]; - public JsonReadCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public JsonReadCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) - { - JsonReadConfiguration configuration = new JsonReadConfiguration(); - configuration.Source = this.Parameters.RelativePath; - configuration.BasePath = (output as FileOutput)?.BasePath; + public override IGeneratorCommandResult Run() + { + JsonReadConfiguration configuration = new(); + configuration.Source = this.Parameters.RelativePath; + configuration.BasePath = (this.resolver.Get() as FileOutput)?.BasePath; - this.resolver.Create().Read(configuration, this.TransferObjects); + this.resolver.Create().Read(configuration); - return this.Success(); - } + return this.Success(); } -} \ No newline at end of file +} diff --git a/Json/Commands/JsonWriteCommand.cs b/Json/Commands/JsonWriteCommand.cs index cfab5543..88db3785 100644 --- a/Json/Commands/JsonWriteCommand.cs +++ b/Json/Commands/JsonWriteCommand.cs @@ -1,40 +1,30 @@ using KY.Core.Dependency; using KY.Generator.Command; +using KY.Generator.Command.Extensions; using KY.Generator.Csharp.Languages; -using KY.Generator.Json.Configurations; using KY.Generator.Json.Writers; -using KY.Generator.Output; +using KY.Generator.TypeScript; -namespace KY.Generator.Json.Commands -{ - public class JsonWriteCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; +namespace KY.Generator.Json.Commands; - public override string[] Names { get; } = { "json-write" }; - - public JsonWriteCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } +public class JsonWriteCommand(IDependencyResolver resolver) : GeneratorCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(JsonWriteCommand)), "json-write"]; - public override IGeneratorCommandResult Run(IOutput output) - { - JsonWriteConfiguration configuration = new JsonWriteConfiguration(); - configuration.Language = CsharpLanguage.Instance; - configuration.FormatNames = this.Parameters.FormatNames; - configuration.RelativePath = this.Parameters.ModelPath; - configuration.FormatNames = this.Parameters.FormatNames; - configuration.FieldsToProperties = this.Parameters.FieldsToProperties; - configuration.Name = this.Parameters.ModelName; - configuration.Namespace = this.Parameters.ModelNamespace; - configuration.PropertiesToFields = this.Parameters.PropertiesToFields; - configuration.SkipNamespace = this.Parameters.SkipNamespace; - configuration.WithReader = this.Parameters.WithReader; + public override void Prepare() + { + Options options = resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = resolver.Get(); + TypeScriptOptions typeScriptOptions = options.Get(); + typeScriptOptions.SetStrict(this.Parameters.RelativePath, resolver); + } - this.resolver.Create().Write(configuration, this.TransferObjects, output); + public override IGeneratorCommandResult Run() + { + resolver.Create().FormatNames().Write(this.Parameters.RelativePath, this.Parameters.WithReader); - return this.Success(); - } + return this.Success(); } -} \ No newline at end of file +} diff --git a/Json/Commands/JsonWriteCommandParameters.cs b/Json/Commands/JsonWriteCommandParameters.cs index d6208ef7..50f9374a 100644 --- a/Json/Commands/JsonWriteCommandParameters.cs +++ b/Json/Commands/JsonWriteCommandParameters.cs @@ -4,7 +4,6 @@ namespace KY.Generator.Json.Commands { public class JsonWriteCommandParameters : GeneratorCommandParameters { - public string ModelPath { get; set; } public string ModelName { get; set; } public string ModelNamespace { get; set; } public bool WithReader { get; set; } @@ -16,4 +15,4 @@ public JsonWriteCommandParameters() this.WithReader = true; } } -} \ No newline at end of file +} diff --git a/Json/Configurations/JsonReadConfiguration.cs b/Json/Configurations/JsonReadConfiguration.cs index 8a13a065..06356241 100644 --- a/Json/Configurations/JsonReadConfiguration.cs +++ b/Json/Configurations/JsonReadConfiguration.cs @@ -1,10 +1,8 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Json.Configurations +namespace KY.Generator.Json.Configurations { - internal class JsonReadConfiguration : ReadConfigurationBase + internal class JsonReadConfiguration { public string Source { get; set; } public string BasePath { get; set; } } -} \ No newline at end of file +} diff --git a/Json/Configurations/JsonWriteConfiguration.cs b/Json/Configurations/JsonWriteConfiguration.cs index 9080b82f..517930c7 100644 --- a/Json/Configurations/JsonWriteConfiguration.cs +++ b/Json/Configurations/JsonWriteConfiguration.cs @@ -1,21 +1,15 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Json.Configurations +namespace KY.Generator.Json.Configurations { - public class JsonWriteConfiguration : ConfigurationBase, IFormattableConfiguration + public class JsonWriteConfiguration { public string Name { get; set; } public string Namespace { get; set; } public string RelativePath { get; set; } - public bool SkipNamespace { get; set; } - public bool FieldsToProperties { get; set; } - public bool PropertiesToFields { get; set; } - public bool FormatNames { get; set; } public bool WithReader { get; set; } public JsonWriteConfiguration() { - this.FormatNames = true; + // this.FormatNames = true; } } -} \ No newline at end of file +} diff --git a/Json/Extensions/TypeMappingExtension.cs b/Json/Extensions/TypeMappingExtension.cs index eeed8130..b8d318de 100644 --- a/Json/Extensions/TypeMappingExtension.cs +++ b/Json/Extensions/TypeMappingExtension.cs @@ -11,7 +11,7 @@ public static class TypeMappingExtension { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Map(JsonLanguage.Instance).To(CsharpLanguage.Instance) + typeMapping.Map().To() .From(JTokenType.Array.ToString()).To("List").Nullable().Namespace("System.Collections.Generic").FromSystem() .From(JTokenType.Boolean.ToString()).To("bool").FromSystem() .From(JTokenType.Bytes.ToString()).To("byte").FromSystem() @@ -24,7 +24,7 @@ public static ITypeMapping Initialize(this ITypeMapping typeMapping) .From(JTokenType.TimeSpan.ToString()).To("TimeSpan").Namespace("System").FromSystem() .From(JTokenType.Object.ToString()).To("object").Nullable().FromSystem(); - typeMapping.Map(JsonLanguage.Instance).To(TypeScriptLanguage.Instance) + typeMapping.Map().To() .From(JTokenType.Array.ToString()).To("Array").Nullable().Namespace("System.Collections.Generic").FromSystem() .From(JTokenType.Boolean.ToString()).To("boolean").Nullable().FromSystem() .From(JTokenType.Bytes.ToString()).To("number").Nullable().FromSystem() @@ -40,7 +40,7 @@ public static ITypeMapping Initialize(this ITypeMapping typeMapping) return typeMapping; } - public static TypeMappingEntry Get(this ITypeMapping typeMapping, JTokenType type, IMappableLanguage to) + public static TypeMappingEntry Get(this ITypeMapping typeMapping, JTokenType type, ILanguage to) { return typeMapping.Get(JsonLanguage.Instance, type.ToString(), to); } diff --git a/Json/Fluent/Extensions/ReadFluentSyntaxExtension.cs b/Json/Fluent/Extensions/ReadFluentSyntaxExtension.cs new file mode 100644 index 00000000..0cfb1c42 --- /dev/null +++ b/Json/Fluent/Extensions/ReadFluentSyntaxExtension.cs @@ -0,0 +1,23 @@ +using System; +using KY.Core; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace +namespace KY.Generator +{ + public static class ReadFluentSyntaxExtension + { + /// + /// Executes the JSON read commands. Use at least one command! + /// + public static IReadFluentSyntax Json(this IReadFluentSyntax syntax, Action action) + { + IReadFluentSyntaxInternal internalSyntax = (IReadFluentSyntaxInternal)syntax; + JsonReadSyntax readSyntax = new(internalSyntax); + internalSyntax.Syntaxes.Add(readSyntax); + action(readSyntax); + readSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Json)} action requires at least one command. E.g. '.{nameof(Json)}(read => read.{nameof(IJsonReadSyntax.FromFile)}(\"my\\path\"))'"); + return internalSyntax; + } + } +} diff --git a/Json/Fluent/Extensions/WriteFluentSyntaxExtension.cs b/Json/Fluent/Extensions/WriteFluentSyntaxExtension.cs new file mode 100644 index 00000000..da95cd27 --- /dev/null +++ b/Json/Fluent/Extensions/WriteFluentSyntaxExtension.cs @@ -0,0 +1,23 @@ +using System; +using KY.Core; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace +namespace KY.Generator +{ + public static class WriteFluentSyntaxExtension + { + /// + /// Executes the JSON write commands. Use at least one command! + /// + public static IWriteFluentSyntax Json(this IWriteFluentSyntax syntax, Action action) + { + IWriteFluentSyntaxInternal internalSyntax = (IWriteFluentSyntaxInternal)syntax; + JsonWriteSyntax writeSyntax = new(internalSyntax); + internalSyntax.Syntaxes.Add(writeSyntax); + action(writeSyntax); + writeSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Json)} action requires at least one command. E.g. '.{nameof(Json)}(write => write.{nameof(IJsonWriteSyntax.Model)}(...))'"); + return internalSyntax; + } + } +} diff --git a/Json/Fluent/IJsonReadSyntax.cs b/Json/Fluent/IJsonReadSyntax.cs index 30607d47..971a997a 100644 --- a/Json/Fluent/IJsonReadSyntax.cs +++ b/Json/Fluent/IJsonReadSyntax.cs @@ -1,9 +1,7 @@ -using KY.Generator.Syntax; - -namespace KY.Generator +namespace KY.Generator { public interface IJsonReadSyntax { - ISwitchToWriteSyntax FromFile(string relativePath); + IJsonReadSyntax FromFile(string relativePath); } -} \ No newline at end of file +} diff --git a/Json/Fluent/JsonReadSyntax.cs b/Json/Fluent/JsonReadSyntax.cs index 1545c9cc..e641ca84 100644 --- a/Json/Fluent/JsonReadSyntax.cs +++ b/Json/Fluent/JsonReadSyntax.cs @@ -1,28 +1,27 @@ -using KY.Generator.Json.Commands; +using System.Collections.Generic; +using KY.Generator.Command; +using KY.Generator.Json.Commands; using KY.Generator.Syntax; namespace KY.Generator { - public class JsonReadSyntax : IJsonReadSyntax, ISwitchToWriteSyntax + public class JsonReadSyntax : IJsonReadSyntax, IExecutableSyntax { private readonly IReadFluentSyntaxInternal syntax; + public List Commands { get; } = new(); + public JsonReadSyntax(IReadFluentSyntaxInternal syntax) { this.syntax = syntax; } - public ISwitchToWriteSyntax FromFile(string relativePath) + public IJsonReadSyntax FromFile(string relativePath) { - JsonReadCommand command = new JsonReadCommand(this.syntax.Resolver); + JsonReadCommand command = this.syntax.Resolver.Create(); command.Parameters.RelativePath = relativePath; - this.syntax.Commands.Add(command); + this.Commands.Add(command); return this; } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); - } } -} \ No newline at end of file +} diff --git a/Json/Fluent/JsonWriteSyntax.cs b/Json/Fluent/JsonWriteSyntax.cs index d861fa52..9a04af20 100644 --- a/Json/Fluent/JsonWriteSyntax.cs +++ b/Json/Fluent/JsonWriteSyntax.cs @@ -1,13 +1,17 @@ -using KY.Generator.Json.Commands; +using System.Collections.Generic; +using KY.Generator.Command; +using KY.Generator.Json.Commands; using KY.Generator.Syntax; namespace KY.Generator { - public class JsonWriteSyntax : IJsonWriteSyntax, IJsonWriteModelSyntax, IJsonWriteModelOrReaderSyntax + public class JsonWriteSyntax : IJsonWriteSyntax, IJsonWriteModelSyntax, IJsonWriteModelOrReaderSyntax, IExecutableSyntax { private JsonWriteCommand command; private readonly IWriteFluentSyntaxInternal syntax; + public List Commands { get; } = new(); + public JsonWriteSyntax(IWriteFluentSyntaxInternal syntax) { this.syntax = syntax; @@ -15,11 +19,11 @@ public JsonWriteSyntax(IWriteFluentSyntaxInternal syntax) public IJsonWriteModelOrReaderSyntax Model(string relativePath, string name, string nameSpace) { - this.command = new JsonWriteCommand(this.syntax.Resolver); - this.command.Parameters.ModelPath = relativePath; + this.command = this.syntax.Resolver.Create(); + this.command.Parameters.RelativePath = relativePath; this.command.Parameters.ModelName = name; this.command.Parameters.ModelNamespace = nameSpace; - this.syntax.Commands.Add(this.command); + this.Commands.Add(this.command); return this; } diff --git a/Json/Fluent/ReadFluentSyntaxExtension.cs b/Json/Fluent/ReadFluentSyntaxExtension.cs deleted file mode 100644 index b044f393..00000000 --- a/Json/Fluent/ReadFluentSyntaxExtension.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace -namespace KY.Generator -{ - public static class ReadFluentSyntaxExtension - { - public static IReadFluentOrSwitchToWriteSyntax Json(this IReadFluentSyntax syntax, Action action) - { - action(new JsonReadSyntax((IReadFluentSyntaxInternal)syntax)); - return (IReadFluentSyntaxInternal)syntax; - } - } -} \ No newline at end of file diff --git a/Json/Fluent/WriteFluentSyntaxExtension.cs b/Json/Fluent/WriteFluentSyntaxExtension.cs deleted file mode 100644 index 16aaf08d..00000000 --- a/Json/Fluent/WriteFluentSyntaxExtension.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace -namespace KY.Generator -{ - public static class WriteFluentSyntaxExtension - { - public static IWriteFluentSyntax Json(this IWriteFluentSyntax syntax, Action action) - { - action(new JsonWriteSyntax((IWriteFluentSyntaxInternal)syntax)); - return syntax; - } - } -} \ No newline at end of file diff --git a/Json/JsonModule.cs b/Json/JsonModule.cs index 26374459..27162431 100644 --- a/Json/JsonModule.cs +++ b/Json/JsonModule.cs @@ -2,33 +2,25 @@ using KY.Core.Dependency; using KY.Core.Module; using KY.Generator.Command; -using KY.Generator.Configuration; using KY.Generator.Json.Commands; -using KY.Generator.Json.Configurations; using KY.Generator.Json.Extensions; -using KY.Generator.Json.Readers; -using KY.Generator.Json.Writers; using KY.Generator.Mappings; [assembly: InternalsVisibleTo("KY.Generator.Json.Tests")] -namespace KY.Generator.Json +namespace KY.Generator.Json; + +public class JsonModule : ModuleBase { - public class JsonModule : ModuleBase + public JsonModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public JsonModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - } + this.DependencyResolver.Get().Register(JsonReadCommand.Names); + this.DependencyResolver.Get().Register(JsonWriteCommand.Names); + } - public override void Initialize() - { - this.DependencyResolver.Get().Initialize(); - this.DependencyResolver.Get() - .Map("json") - .Map("json"); - } + public override void Initialize() + { + this.DependencyResolver.Get().Initialize(); } -} \ No newline at end of file +} diff --git a/Json/KY.Generator.Json.csproj b/Json/KY.Generator.Json.csproj index a2d749e7..d790ebb4 100644 --- a/Json/KY.Generator.Json.csproj +++ b/Json/KY.Generator.Json.csproj @@ -1,40 +1,49 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - JSON Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator JSON - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + JSON Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator JSON + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - - + + + - - - - - - + + + + + + + + + + + diff --git a/Json/Readers/JsonReader.cs b/Json/Readers/JsonReader.cs index 437cdaed..ab213942 100644 --- a/Json/Readers/JsonReader.cs +++ b/Json/Readers/JsonReader.cs @@ -1,10 +1,5 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using KY.Core.DataAccess; -using KY.Generator.Configurations; using KY.Generator.Json.Configurations; using KY.Generator.Json.Language; using KY.Generator.Json.Transfers; @@ -13,56 +8,76 @@ using Newtonsoft.Json; using Newtonsoft.Json.Linq; -namespace KY.Generator.Json.Readers +namespace KY.Generator.Json.Readers; + +internal class JsonReader : ITransferReader { - internal class JsonReader : ITransferReader + private readonly List transferObjects; + + public JsonReader(List transferObjects) { - public void Read(ConfigurationBase configurationBase, List transferObjects) - { - JsonReadConfiguration configuration = (JsonReadConfiguration)configurationBase; - JObject source = JsonConvert.DeserializeObject(FileSystem.ReadAllText(FileSystem.Combine(configuration.BasePath, configuration.Source))); - string name = Regex.Replace(FileSystem.GetFileName(configuration.Source), @"\.json$", string.Empty, RegexOptions.CultureInvariant); - this.ReadModel(name, source, transferObjects); - } + this.transferObjects = transferObjects; + } - private ModelTransferObject ReadModel(string name, JObject source, List list) - { - ModelTransferObject model = new JsonModelTransferObject { Name = name, Language = JsonLanguage.Instance }; - list.Add(model); + public void Read(JsonReadConfiguration configuration) + { + JObject source = JsonConvert.DeserializeObject(FileSystem.ReadAllText(FileSystem.Combine(configuration.BasePath, configuration.Source))); + string name = Regex.Replace(FileSystem.GetFileName(configuration.Source), @"\.json$", string.Empty, RegexOptions.CultureInvariant); + this.ReadModel(name, source); + } - foreach (JProperty property in source.Properties()) + private ModelTransferObject ReadModel(string name, JObject source) + { + ModelTransferObject model = new JsonModelTransferObject { Name = name, Language = JsonLanguage.Instance }; + this.transferObjects.Add(model); + + foreach (JProperty property in source.Properties()) + { + if (property.Value.Type == JTokenType.Object) + { + ModelTransferObject propertyModel = this.ReadModel(property.Name, (JObject)property.Value); + model.Properties.Add(new PropertyTransferObject + { + Name = propertyModel.Name, + Type = propertyModel, + DeclaringType = model + }); + } + else if (property.Value.Type == JTokenType.Array) { - if (property.Value.Type == JTokenType.Object) + TypeTransferObject listType = new() { Name = JTokenType.Array.ToString() }; + model.Properties.Add(new PropertyTransferObject + { + Name = property.Name, + Type = listType, + DeclaringType = model + }); + + List children = property.Value.Children().ToList(); + if (children.Count == 0 || children.Any(x => x.Type != children.First().Type)) { - ModelTransferObject propertyModel = this.ReadModel(property.Name, (JObject)property.Value, list); - model.Properties.Add(new PropertyTransferObject { Name = propertyModel.Name, Type = propertyModel }); + listType.Generics.Add(new GenericAliasTransferObject { Type = new TypeTransferObject { Name = JTokenType.Object.ToString() } }); } - else if (property.Value.Type == JTokenType.Array) + else if (children.First().Type == JTokenType.Object) { - TypeTransferObject listType = new TypeTransferObject { Name = JTokenType.Array.ToString() }; - model.Properties.Add(new PropertyTransferObject { Name = property.Name, Type = listType }); - - List children = property.Value.Children().ToList(); - if (children.Count == 0 || children.Any(x => x.Type != children.First().Type)) - { - listType.Generics.Add(new GenericAliasTransferObject { Type = new TypeTransferObject { Name = JTokenType.Object.ToString() } }); - } - else if (children.First().Type == JTokenType.Object) - { - ModelTransferObject entryModel = this.ReadModel(property.Name, (JObject)children.First(), list); - listType.Generics.Add(new GenericAliasTransferObject { Type = entryModel }); - } - else - { - listType.Generics.Add(new GenericAliasTransferObject { Type = new TypeTransferObject { Name = children.First().Type.ToString() } }); - } + ModelTransferObject entryModel = this.ReadModel(property.Name, (JObject)children.First()); + listType.Generics.Add(new GenericAliasTransferObject { Type = entryModel }); } else { - model.Properties.Add(new PropertyTransferObject { Name = property.Name, Type = new TypeTransferObject { Name = property.Value.Type.ToString() } }); + listType.Generics.Add(new GenericAliasTransferObject { Type = new TypeTransferObject { Name = children.First().Type.ToString() } }); } } - return model; + else + { + model.Properties.Add(new PropertyTransferObject + { + Name = property.Name, + Type = new TypeTransferObject { Name = property.Value.Type.ToString() }, + DeclaringType = model + }); + } } + return model; } -} \ No newline at end of file +} diff --git a/Json/Writers/JsonWriter.cs b/Json/Writers/JsonWriter.cs index f3b15e48..11143027 100644 --- a/Json/Writers/JsonWriter.cs +++ b/Json/Writers/JsonWriter.cs @@ -1,30 +1,25 @@ -using System.Collections.Generic; -using KY.Core; -using KY.Core.Dependency; -using KY.Generator.Configurations; -using KY.Generator.Json.Configurations; -using KY.Generator.Output; -using KY.Generator.Templates; -using KY.Generator.Transfer; +using KY.Core.Dependency; using KY.Generator.Transfer.Writers; -namespace KY.Generator.Json.Writers +namespace KY.Generator.Json.Writers; + +internal class JsonWriter : ITransferWriter { - internal class JsonWriter : ITransferWriter + private readonly IDependencyResolver resolver; + + public JsonWriter(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; + this.resolver = resolver; + } - public JsonWriter(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public JsonWriter FormatNames() + { + this.resolver.Create().FormatNames(); + return this; + } - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - JsonWriteConfiguration configuration = (JsonWriteConfiguration)configurationBase; - List files = new List(); - this.resolver.Create().Write(configuration, transferObjects).ForEach(files.Add); - files.ForEach(file => configuration.Language.Write(file, output)); - } + public void Write(string relativePath, bool withReader) + { + this.resolver.Create().Write(relativePath, withReader); } -} \ No newline at end of file +} diff --git a/Json/Writers/ObjectWriter.cs b/Json/Writers/ObjectWriter.cs index aba1ba7a..4928e4df 100644 --- a/Json/Writers/ObjectWriter.cs +++ b/Json/Writers/ObjectWriter.cs @@ -1,8 +1,6 @@ using System; using System.Collections.Generic; -using KY.Generator.Configurations; using KY.Generator.Csharp.Extensions; -using KY.Generator.Json.Configurations; using KY.Generator.Json.Transfers; using KY.Generator.Mappings; using KY.Generator.Templates; @@ -10,85 +8,76 @@ using KY.Generator.Transfer; using KY.Generator.Transfer.Writers; -namespace KY.Generator.Json.Writers +namespace KY.Generator.Json.Writers; + +internal class ObjectWriter : ModelWriter { - internal class ObjectWriter : ModelWriter - { - private JsonWriteConfiguration jsonConfiguration; + private bool WithReader { get; set; } - public ObjectWriter(ITypeMapping typeMapping) - : base(typeMapping) - { } + public ObjectWriter(Options options, ITypeMapping typeMapping, IEnumerable transferObjects, IList files) + : base(options, typeMapping, transferObjects, files) + { } - protected override ClassTemplate WriteClass(IModelConfiguration configuration, ModelTransferObject model, string nameSpace, List files) - { - ClassTemplate classTemplate = base.WriteClass(configuration, model, nameSpace, files); - if (model is JsonModelTransferObject && this.jsonConfiguration.WithReader) - { - this.WriteReader(classTemplate, model, configuration.FormatNames); - } - return classTemplate; - } + public void Write(string relativePath, bool withReader) + { + this.WithReader = withReader; + base.Write(relativePath); + } - public IEnumerable Write(JsonWriteConfiguration configuration, List transferObjects) + private void WriteReader(ClassTemplate classTemplate, ModelTransferObject model) + { + GeneratorOptions modelOptions = this.Options.Get(model); + TypeTemplate objectType = Code.Type(model.Name, model.Namespace); + if (model.Namespace != classTemplate.Namespace.Name && model.Namespace != null) { - this.jsonConfiguration = configuration; - ModelWriteConfiguration modelWriteConfiguration = new ModelWriteConfiguration(); - modelWriteConfiguration.CopyBaseFrom(configuration); - modelWriteConfiguration.Name = configuration.Name; - modelWriteConfiguration.Namespace = configuration.Namespace; - modelWriteConfiguration.SkipNamespace = configuration.SkipNamespace; - modelWriteConfiguration.RelativePath = configuration.RelativePath; - modelWriteConfiguration.FieldsToProperties = configuration.FieldsToProperties; - modelWriteConfiguration.PropertiesToFields = configuration.PropertiesToFields; - modelWriteConfiguration.FormatNames = configuration.FormatNames; - return this.Write(modelWriteConfiguration, transferObjects); + classTemplate.AddUsing(model.Namespace); } + classTemplate.WithUsing("Newtonsoft.Json") + //.WithUsing("Newtonsoft.Json.Linq") + .WithUsing("System.IO"); - private void WriteReader(ClassTemplate classTemplate, ModelTransferObject model, bool formatNames) - { - TypeTemplate objectType = Code.Type(model.Name, model.Namespace); - if (model.Namespace != classTemplate.Namespace.Name && model.Namespace != null) - { - classTemplate.AddUsing(model.Namespace); - } - classTemplate.WithUsing("Newtonsoft.Json") - //.WithUsing("Newtonsoft.Json.Linq") - .WithUsing("System.IO"); + classTemplate.AddMethod("Load", objectType) + .FormatName(modelOptions) + .WithParameter(Code.Type("string"), "fileName") + .Static() + .Code.AddLine(Code.Return(Code.Method("Parse", Code.Local("File").Method("ReadAllText", Code.Local("fileName"))))); - classTemplate.AddMethod("Load", objectType) - .FormatName(model.Language, formatNames) - .WithParameter(Code.Type("string"), "fileName") - .Static() - .Code.AddLine(Code.Return(Code.Method("Parse", Code.Local("File").Method("ReadAllText", Code.Local("fileName"))))); + classTemplate.AddMethod("Parse", objectType) + .FormatName(modelOptions) + .WithParameter(Code.Type("string"), "json") + .Static() + .Code.AddLine(Code.Return(Code.Local("JsonConvert").GenericMethod("DeserializeObject", objectType, Code.Local("json")))); + } - classTemplate.AddMethod("Parse", objectType) - .FormatName(model.Language, formatNames) - .WithParameter(Code.Type("string"), "json") - .Static() - .Code.AddLine(Code.Return(Code.Local("JsonConvert").GenericMethod("DeserializeObject", objectType, Code.Local("json")))); + protected override ClassTemplate WriteClass(ModelTransferObject model, string relativePath) + { + ClassTemplate classTemplate = base.WriteClass(model, relativePath); + if (model is JsonModelTransferObject && this.WithReader) + { + this.WriteReader(classTemplate, model); } + return classTemplate; + } - protected override FieldTemplate AddField(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration) + protected override FieldTemplate AddField(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + FieldTemplate fieldTemplate = base.AddField(model, member, classTemplate); + if (!fieldTemplate.Name.Equals(member.Name, StringComparison.CurrentCultureIgnoreCase)) { - FieldTemplate fieldTemplate = base.AddField(model, name, type, classTemplate, configuration); - if (!fieldTemplate.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase)) - { - fieldTemplate.WithAttribute("JsonProperty", Code.String(name)); - classTemplate.AddUsing("Newtonsoft.Json"); - } - return fieldTemplate; + fieldTemplate.WithAttribute("JsonProperty", Code.String(member.Name)); + classTemplate.AddUsing("Newtonsoft.Json"); } + return fieldTemplate; + } - protected override PropertyTemplate AddProperty(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration, bool canRead = true, bool canWrite = true) + protected override PropertyTemplate AddProperty(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + PropertyTemplate propertyTemplate = base.AddProperty(model, member, classTemplate); + if (!propertyTemplate.Name.Equals(member.Name, StringComparison.CurrentCultureIgnoreCase)) { - PropertyTemplate propertyTemplate = base.AddProperty(model, name, type, classTemplate, configuration, canRead, canWrite); - if (!propertyTemplate.Name.Equals(name, StringComparison.CurrentCultureIgnoreCase)) - { - propertyTemplate.WithAttribute("JsonProperty", Code.String(name)); - classTemplate.AddUsing("Newtonsoft.Json"); - } - return propertyTemplate; + propertyTemplate.WithAttribute("JsonProperty", Code.String(member.Name)); + classTemplate.AddUsing("Newtonsoft.Json"); } + return propertyTemplate; } -} \ No newline at end of file +} diff --git a/Json/packages.config b/Json/packages.config deleted file mode 100644 index 07e35931..00000000 --- a/Json/packages.config +++ /dev/null @@ -1,4 +0,0 @@ - - - - \ No newline at end of file diff --git a/KY.Generator.sln b/KY.Generator.sln index 380c36da..ceb14882 100644 --- a/KY.Generator.sln +++ b/KY.Generator.sln @@ -25,7 +25,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Angular", "Ang EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.AspDotNet", "AspDotNet\KY.Generator.AspDotNet.csproj", "{5915BD99-7A27-4A49-B31D-0CB8A3E07795}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Core", "Core\KY.Generator.Core.csproj", "{8C35562D-FBCE-4588-AB3B-FCC6DEADEBAE}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Common", "Common\KY.Generator.Common.csproj", "{8C35562D-FBCE-4588-AB3B-FCC6DEADEBAE}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Watchdog", "Watchdog\KY.Generator.Watchdog.csproj", "{3DE08FD4-D3C7-496F-A013-E543ACC67429}" EndProject @@ -33,7 +33,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Reflection.Tes EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.OpenApi", "OpenApi\KY.Generator.OpenApi.csproj", "{F05EFD34-C3B0-4334-9739-925F67DAEB99}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Core.Tests", "Core.Tests\KY.Generator.Core.Tests.csproj", "{1CFB1E50-F250-448C-8ED5-144544D72638}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Common.Tests", "Common.Tests\KY.Generator.Common.Tests.csproj", "{1CFB1E50-F250-448C-8ED5-144544D72638}" EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KY.Generator.Json.Tests", "Json.Tests\KY.Generator.Json.Tests.csproj", "{FE25DBA7-CF52-437D-A3D3-1A1F4E42FB5B}" EndProject diff --git a/LICENSE b/LICENSE index 94a9ed02..e3a08127 100644 --- a/LICENSE +++ b/LICENSE @@ -1,674 +1,21 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. +MIT License + +Copyright (c) 2022 KY-Programming + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/Main.Legacy/KY.Generator.Main.Legacy.csproj b/Main.Legacy/KY.Generator.Main.Legacy.csproj index 9726e0cc..da8e4bf6 100644 --- a/Main.Legacy/KY.Generator.Main.Legacy.csproj +++ b/Main.Legacy/KY.Generator.Main.Legacy.csproj @@ -12,6 +12,7 @@ 512 true true + Default AnyCPU @@ -44,4 +45,4 @@ - \ No newline at end of file + diff --git a/Main.Legacy/Program.cs b/Main.Legacy/Program.cs index 69db998b..0c7169fd 100644 --- a/Main.Legacy/Program.cs +++ b/Main.Legacy/Program.cs @@ -12,7 +12,7 @@ internal class Program private static void Main(string[] args) { bool success = LoadShared("KY.Core.Common") - && LoadShared("KY.Generator.Core") + && LoadShared("KY.Generator.Common") && Run(args); if (!success) { @@ -34,7 +34,7 @@ private static bool LoadShared(string assemblyName) private static bool Run(string[] args) { - Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.FullName.StartsWith("KY.Generator.Core,")); + Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.FullName.StartsWith("KY.Generator.Common,")); Type type = core.GetType("KY.Generator.Main"); if (type == null) { @@ -52,4 +52,4 @@ private static bool Run(string[] args) return (bool)runMethod.Invoke(null, parameter); } } -} \ No newline at end of file +} diff --git a/Main.Legacy/Properties/AssemblyInfo.cs b/Main.Legacy/Properties/AssemblyInfo.cs index e63f1f15..3abd9611 100644 --- a/Main.Legacy/Properties/AssemblyInfo.cs +++ b/Main.Legacy/Properties/AssemblyInfo.cs @@ -1,5 +1,4 @@ using System.Reflection; -using System.Runtime.CompilerServices; using System.Runtime.InteropServices; // General Information about an assembly is controlled through the following @@ -10,7 +9,7 @@ [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("KY-Programming")] [assembly: AssemblyProduct("KY.Generator")] -[assembly: AssemblyCopyright("Copyright © KY-Programming 2006-2021")] +[assembly: AssemblyCopyright("2023 - KY-Programming")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] @@ -32,5 +31,5 @@ // You can specify all the values or you can default the Build and Revision Numbers // by using the '*' as shown below: // [assembly: AssemblyVersion("1.0.*")] -[assembly: AssemblyVersion("7.6.0")] -[assembly: AssemblyFileVersion("7.6.0")] +[assembly: AssemblyVersion("10.0.0.0")] +[assembly: AssemblyFileVersion("10.0.0.0")] \ No newline at end of file diff --git a/Main/KY.Generator.csproj b/Main/KY.Generator.csproj index e230adfc..97a9fcf2 100644 --- a/Main/KY.Generator.csproj +++ b/Main/KY.Generator.csproj @@ -1,30 +1,37 @@  - - Exe - net5.0 - netcoreapp2.0;netcoreapp3.0;net5.0 - 7.6.0 - KY-Programming - KY.Generator - 2021 - KY-Programming - KY.Generator - KY.Generator - AnyCPU;x86 - false - latest - + + Exe + net9.0 + enable + enable + netcoreapp2.0;netcoreapp3.0;net5.0;net6.0;net7.0;net8.0;net9.0 + 10.0.0-preview.2 + KY-Programming + KY.Generator + 2025 - KY-Programming + KY.Generator + KY.Generator + AnyCPU;x86 + false + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\x86\Debug - + + ..\bin\x86\Debug + - - ..\bin\Release - + + ..\bin\Release + + + + + + diff --git a/Main/Program.cs b/Main/Program.cs index 4d7d954d..a9a9e983 100644 --- a/Main/Program.cs +++ b/Main/Program.cs @@ -4,60 +4,52 @@ using System.Reflection; using System.Runtime.Loader; -namespace KY.Generator +namespace KY.Generator; + +internal class Program { - internal class Program - { - private static string SharedPath { get; } = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)), "netstandard2.0"); + private static string SharedPath { get; } = Path.Combine(Path.GetDirectoryName(Path.GetDirectoryName(Assembly.GetEntryAssembly().Location)), "netstandard2.0"); - private static void Main(string[] args) + private static void Main(string[] args) + { + bool success = LoadShared("KY.Core.Common") + && LoadShared("KY.Generator.Common") + && Run(args); + if (!success) { - bool success = LoadShared("KY.Core.Common") - && LoadShared("KY.Generator.Core") - && Run(args); - if (!success) - { - Environment.ExitCode = 1; - } + Environment.ExitCode = 1; } + } - private static bool LoadShared(string assemblyName) + private static bool LoadShared(string assemblyName) + { + string coreFileName = Path.Combine(SharedPath, assemblyName + ".dll"); + if (!File.Exists(coreFileName)) { - string coreFileName = Path.Combine(SharedPath, assemblyName + ".dll"); - if (!File.Exists(coreFileName)) - { -#if DEBUG - if (assemblyName == "KY.Core.Common") - { - AssemblyLoadContext.Default.LoadFromAssemblyPath(Environment.ExpandEnvironmentVariables(@"%USERPROFILE%\.nuget\packages\ky.core.common\4.13.0\lib\netstandard2.0\KY.Core.Common.dll")); - return true; - } -#endif - Console.WriteLine($"Error: {assemblyName} not found in {SharedPath}"); - return false; - } - AssemblyLoadContext.Default.LoadFromAssemblyPath(coreFileName); - return true; + Console.WriteLine($"Error: {assemblyName} not found in {SharedPath}"); + return false; } + AssemblyLoadContext.Default.LoadFromAssemblyPath(coreFileName); + return true; + } - private static bool Run(string[] args) + private static bool Run(string[] args) + { + Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.FullName.StartsWith("KY.Generator.Common,")); + Type type = core.GetType("KY.Generator.Main"); + if (type == null) + { + Console.WriteLine("Error: KY.Generator.Main not found"); + return false; + } + MethodInfo runMethod = type.GetMethod("Run", BindingFlags.Public | BindingFlags.Static); + if (runMethod == null) { - Assembly core = AppDomain.CurrentDomain.GetAssemblies().Single(x => x.FullName.StartsWith("KY.Generator.Core,")); - Type type = core.GetType("KY.Generator.Main"); - if (type == null) - { - Console.WriteLine("Error: KY.Generator.Main not found"); - return false; - } - MethodInfo runMethod = type.GetMethod("Run", BindingFlags.Public | BindingFlags.Static); - if (runMethod == null) - { - Console.WriteLine("Error: KY.Generator.Main.Run not found"); - return false; - } - object[] parameter = new object[1]; - parameter[0] = args; - return (bool)runMethod.Invoke(null, parameter); + Console.WriteLine("Error: KY.Generator.Main.Run not found"); + return false; } + object[] parameter = new object[1]; + parameter[0] = args; + return (bool)runMethod.Invoke(null, parameter); } -} \ No newline at end of file +} diff --git a/Main/nuget.nuspec b/Main/nuget.nuspec index aa6f83e0..2799b941 100644 --- a/Main/nuget.nuspec +++ b/Main/nuget.nuspec @@ -1,28 +1,37 @@ - - - KY.Generator - 7.6.0 - Codestin Search App - KY-Programming - KY-Programming - https://github.com/KY-Programming/generator/blob/master/LICENSE - https://generator.ky-programming.de - - https://ky-programming.de/images/logos/128.png - false - Generate C# or TypeScript classes from .NET assemblies, JSON, TSQL or oData. -Support for Angular, ASP.NET, ASP.NET Core, C# POCOs, TypeScript POCOs, Entity Framework and more. - - Copyright 2021 - KY-Generator KY Generator - - - - - - + + + KY.Generator + 10.0.0-preview.2 + Codestin Search App + KY-Programming + KY-Programming + MIT + https://generator.ky-programming.de + + assets\icon.png + false + Generate C# or TypeScript classes from .NET assemblies, JSON, TSQL or oData. + Support for Angular, ASP.NET, ASP.NET Core, C# POCOs, TypeScript POCOs, Entity Framework and more. + + + 2025 - KY-Programming + KY-Generator KY.Generator + README.md + + + + + + + + + + + + + @@ -35,13 +44,32 @@ Support for Angular, ASP.NET, ASP.NET Core, C# POCOs, TypeScript POCOs, Entity F - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + - + + + diff --git a/Main/nuget.targets b/Main/nuget.targets index 4b9f8202..4c5cb963 100644 --- a/Main/nuget.targets +++ b/Main/nuget.targets @@ -19,6 +19,10 @@ netcoreapp2.0 netcoreapp3.0 net5.0 + net6.0 + net7.0 + net8.0 + net9.0 netcoreapp2.0
netcoreapp3.0 net5.0 + net6.0 + net7.0 + net8.0 + net9.0 netcoreapp2.0
netcoreapp3.0 net5.0 + net6.0 + net7.0 + net8.0 + net9.0 - netcoreapp2.1 + net6.0 false + + latest - + @@ -15,7 +17,7 @@ - + diff --git a/OData/Configurations/ODataReadConfiguration.cs b/OData/Configurations/ODataReadConfiguration.cs index 70b3da7d..079d2b61 100644 --- a/OData/Configurations/ODataReadConfiguration.cs +++ b/OData/Configurations/ODataReadConfiguration.cs @@ -1,16 +1,13 @@ -using KY.Generator.Configurations; - namespace KY.Generator.OData.Configurations { - public class ODataReadConfiguration : ReadConfigurationBase + public class ODataReadConfiguration { public string File { get; set; } public string Connection { get; set; } - public bool FormatNames { get; set; } public ODataReadConfiguration() { - this.FormatNames = true; + // this.FormatNames = true; } } -} \ No newline at end of file +} diff --git a/OData/Extensions/TypeMappingExtension.cs b/OData/Extensions/TypeMappingExtension.cs index 5ac59aa3..d219d6c0 100644 --- a/OData/Extensions/TypeMappingExtension.cs +++ b/OData/Extensions/TypeMappingExtension.cs @@ -8,7 +8,7 @@ public static class TypeMappingExtension { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Map(ODataLanguage.Instance).To(TypeScriptLanguage.Instance) + typeMapping.Map().To() .From("Edm.Binary").To("string", "String") .From("Edm.Boolean").To("boolean", "Boolean") .From("Edm.Byte").To("number", "Number") diff --git a/OData/KY.Generator.OData.csproj b/OData/KY.Generator.OData.csproj index fb1f8536..f84a91c9 100644 --- a/OData/KY.Generator.OData.csproj +++ b/OData/KY.Generator.OData.csproj @@ -1,37 +1,46 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - oData Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator oData - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 7.6.0 + KY.Generator + oData Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator oData + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - - + + + - - - - + + + + + + + + + diff --git a/OData/ODataModule.cs b/OData/ODataModule.cs index 29dea03c..0c25507e 100644 --- a/OData/ODataModule.cs +++ b/OData/ODataModule.cs @@ -1,10 +1,7 @@ using KY.Core.Dependency; using KY.Core.Module; -using KY.Generator.Configuration; using KY.Generator.Mappings; -using KY.Generator.OData.Configurations; using KY.Generator.OData.Extensions; -using KY.Generator.OData.Readers; namespace KY.Generator.OData { @@ -17,7 +14,6 @@ public ODataModule(IDependencyResolver dependencyResolver) public override void Initialize() { this.DependencyResolver.Get().Initialize(); - this.DependencyResolver.Get().Map("odata-v4"); } } -} \ No newline at end of file +} diff --git a/OData/Readers/ODataReader.cs b/OData/Readers/ODataReader.cs index e0618bce..a038129c 100644 --- a/OData/Readers/ODataReader.cs +++ b/OData/Readers/ODataReader.cs @@ -1,11 +1,7 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Net; +using System.Net; using System.Xml; using KY.Core; using KY.Core.DataAccess; -using KY.Generator.Configurations; using KY.Generator.OData.Configurations; using KY.Generator.OData.Language; using KY.Generator.OData.Transfers; @@ -14,230 +10,234 @@ using Microsoft.OData.Edm; using Microsoft.OData.Edm.Csdl; -namespace KY.Generator.OData.Readers +namespace KY.Generator.OData.Readers; + +internal class ODataReader : ITransferReader { - internal class ODataReader : ITransferReader + private readonly List transferObjects; + private const string BindingParameterName = "bindingParameter"; + + public ODataReader(List transferObjects) { - private const string BindingParameterName = "bindingParameter"; + this.transferObjects = transferObjects; + } - public void Read(ConfigurationBase configurationBase, List transferObjects) + public void Read(ODataReadConfiguration configuration) + { + if (!string.IsNullOrEmpty(configuration.File)) { - ODataReadConfiguration configuration = (ODataReadConfiguration)configurationBase; + this.Parse(FileSystem.ReadAllText(configuration.File)); + } + if (!string.IsNullOrEmpty(configuration.Connection)) + { + Logger.Trace($"Connect to {configuration.Connection}..."); + HttpWebRequest request = WebRequest.CreateHttp(configuration.Connection); + request.CookieContainer = new CookieContainer(); + this.transferObjects.OfType>().ForEach(x => request.CookieContainer.Add(x.Value)); + WebResponse response = request.GetResponse(); - if (!string.IsNullOrEmpty(configuration.File)) + using (Stream responseStream = response.GetResponseStream()) + using (StreamReader reader = new(responseStream)) { - this.Parse(FileSystem.ReadAllText(configuration.File), transferObjects); - } - if (!string.IsNullOrEmpty(configuration.Connection)) - { - Logger.Trace($"Connect to {configuration.Connection}..."); - HttpWebRequest request = WebRequest.CreateHttp(configuration.Connection); - request.CookieContainer = new CookieContainer(); - transferObjects.OfType>().ForEach(x => request.CookieContainer.Add(x.Value)); - WebResponse response = request.GetResponse(); - - using (Stream responseStream = response.GetResponseStream()) - using (StreamReader reader = new StreamReader(responseStream)) - { - string responseString = reader.ReadToEnd(); - this.Parse(responseString, transferObjects); - } + string responseString = reader.ReadToEnd(); + this.Parse(responseString); } } + } - private void Parse(string xml, List list) + private void Parse(string xml) + { + try { - try + this.transferObjects.Add(new ODataResultTransferObject(xml)); + using (StringReader stringReader = new(xml)) + using (XmlReader xmlReader = XmlReader.Create(stringReader)) { - list.Add(new ODataResultTransferObject(xml)); - using (StringReader stringReader = new StringReader(xml)) - using (XmlReader xmlReader = XmlReader.Create(stringReader)) - { - this.Parse(xmlReader, list); - } - } - catch - { - Logger.Trace($"oData response: {xml}"); - throw; + this.Parse(xmlReader); } } - - private void Parse(XmlReader xmlReader, List list) + catch { - IEdmModel model = CsdlReader.Parse(xmlReader); - Dictionary mapping = this.ReadModels(model, list); - this.ReadServices(model, mapping, list); + Logger.Trace($"oData response: {xml}"); + throw; } + } + + private void Parse(XmlReader xmlReader) + { + IEdmModel model = CsdlReader.Parse(xmlReader); + Dictionary mapping = this.ReadModels(model); + this.ReadServices(model, mapping); + } - private Dictionary ReadModels(IEdmModel edmModel, List list) + private Dictionary ReadModels(IEdmModel edmModel) + { + Dictionary modelMapping = new(); + Dictionary entityMapping = new(); + foreach (IEdmSchemaType schemaType in edmModel.SchemaElements.Select(element => edmModel.FindDeclaredType(element.FullName())).Where(x => x != null)) { - Dictionary modelMapping = new Dictionary(); - Dictionary entityMapping = new Dictionary(); - foreach (IEdmSchemaType schemaType in edmModel.SchemaElements.Select(element => edmModel.FindDeclaredType(element.FullName())).Where(x => x != null)) + if (schemaType.TypeKind == EdmTypeKind.Entity && schemaType is IEdmEntityType entityType) { - if (schemaType.TypeKind == EdmTypeKind.Entity && schemaType is IEdmEntityType entityType) + ModelTransferObject model = new() + { + Name = schemaType.Name, + Namespace = schemaType.Namespace, + Language = ODataLanguage.Instance + }; + modelMapping[entityType.AsActualType()] = model; + EntityTransferObject entity = new() + { + Name = schemaType.Name, + Model = model + }; + entityMapping[entityType.AsActualType()] = entity; + foreach (IEdmProperty edmProperty in entityType.DeclaredProperties) { - ModelTransferObject model = new ModelTransferObject - { - Name = schemaType.Name, - Namespace = schemaType.Namespace, - Language = ODataLanguage.Instance - }; - modelMapping[entityType.AsActualType()] = model; - EntityTransferObject entity = new EntityTransferObject - { - Name = schemaType.Name, - Model = model - }; - entityMapping[entityType.AsActualType()] = entity; - foreach (IEdmProperty edmProperty in entityType.DeclaredProperties) - { - model.Properties.Add(new PropertyTransferObject - { - Name = edmProperty.Name, - Type = this.ToTransferObject(edmProperty.Type.Definition, modelMapping) - }); - } - if (entityType.DeclaredKey != null) + model.Properties.Add(new PropertyTransferObject + { + Name = edmProperty.Name, + Type = this.ToTransferObject(edmProperty.Type.Definition, modelMapping), + DeclaringType = model + }); + } + if (entityType.DeclaredKey != null) + { + foreach (IEdmStructuralProperty key in entityType.DeclaredKey) { - foreach (IEdmStructuralProperty key in entityType.DeclaredKey) - { - PropertyTransferObject property = model.Properties.FirstOrDefault(x => x.Name == key.Name); - entity.Keys.Add(new EntityKeyTransferObject - { - Name = key.Name, - Type = this.ToTransferObject(key.Type.Definition, modelMapping).Clone(), - Property = property - }); - } + PropertyTransferObject property = model.Properties.FirstOrDefault(x => x.Name == key.Name); + entity.Keys.Add(new EntityKeyTransferObject + { + Name = key.Name, + Type = this.ToTransferObject(key.Type.Definition, modelMapping).Clone(), + Property = property + }); } - // TODO: Add Navigation Properties - list.Add(model); - list.Add(entity); } + // TODO: Add Navigation Properties + this.transferObjects.Add(model); + this.transferObjects.Add(entity); } - foreach (IEdmAction action in edmModel.SchemaElements.OfType()) + } + foreach (IEdmAction action in edmModel.SchemaElements.OfType()) + { + IEdmType boundTo = action.FindParameter(BindingParameterName)?.Type.Definition; + if (boundTo != null && modelMapping.ContainsKey(boundTo)) { - IEdmType boundTo = action.FindParameter(BindingParameterName)?.Type.Definition; - if (boundTo != null && modelMapping.ContainsKey(boundTo)) + EntityTransferObject entity = entityMapping[boundTo]; + EntityActionTransferObject entityAction = new() { Name = action.Name, Namespace = action.Namespace }; + if (action.ReturnType != null) { - EntityTransferObject entity = entityMapping[boundTo]; - EntityActionTransferObject entityAction = new EntityActionTransferObject { Name = action.Name, Namespace = action.Namespace }; - if (action.ReturnType != null) - { - entityAction.ReturnType = modelMapping[action.ReturnType.Definition]; - } - entity.Actions.Add(entityAction); - foreach (IEdmOperationParameter actionParameter in action.Parameters.Where(parameter => parameter.Name != BindingParameterName)) - { - entityAction.Parameters.Add(new EntityActionParameterTransferObject { Name = actionParameter.Name, Type = modelMapping[actionParameter.Type.Definition] }); - } + entityAction.ReturnType = modelMapping[action.ReturnType.Definition]; } - else + entity.Actions.Add(entityAction); + foreach (IEdmOperationParameter actionParameter in action.Parameters.Where(parameter => parameter.Name != BindingParameterName)) { - // TODO: Unbound actions + entityAction.Parameters.Add(new EntityActionParameterTransferObject { Name = actionParameter.Name, Type = modelMapping[actionParameter.Type.Definition] }); } } - return modelMapping; + else + { + // TODO: Unbound actions + } } + return modelMapping; + } - private void ReadServices(IEdmModel model, Dictionary mapping, List list) + private void ReadServices(IEdmModel model, Dictionary mapping) + { + foreach (IEdmEntitySet entitySet in model.EntityContainer.Elements.OfType()) { - foreach (IEdmEntitySet entitySet in model.EntityContainer.Elements.OfType()) + EntitySetTransferObject service = new() + { + Name = entitySet.Name, + Route = entitySet.Name, + Language = ODataLanguage.Instance + }; + if (entitySet is IEdmNavigationSource navigationSource) { - EntitySetTransferObject service = new EntitySetTransferObject - { - Name = entitySet.Name, - Route = entitySet.Name, - Language = ODataLanguage.Instance - }; - if (entitySet is IEdmNavigationSource navigationSource) - { - service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Get, mapping, navigationSource)); - service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Post, mapping, navigationSource)); - service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Put, mapping, navigationSource)); - service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Patch, mapping, navigationSource)); - service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Delete, mapping, navigationSource)); - } - service.Entity = list.OfType().First(x => x.Name == mapping[entitySet.Type.AsElementType()].Name); - list.Add(service); + service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Get, mapping, navigationSource)); + service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Post, mapping, navigationSource)); + service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Put, mapping, navigationSource)); + service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Patch, mapping, navigationSource)); + service.Actions.Add(this.ReadAction(HttpServiceActionTypeTransferObject.Delete, mapping, navigationSource)); } + service.Entity = this.transferObjects.OfType().First(x => x.Name == mapping[entitySet.Type.AsElementType()].Name); + this.transferObjects.Add(service); } + } - private HttpServiceActionTransferObject ReadAction(HttpServiceActionTypeTransferObject actionType, Dictionary mapping, IEdmNavigationSource navigationSource) + private HttpServiceActionTransferObject ReadAction(HttpServiceActionTypeTransferObject actionType, Dictionary mapping, IEdmNavigationSource navigationSource) + { + HttpServiceActionTransferObject action = new() + { + Name = actionType.ToString(), + Type = actionType, + Route = "", + RequireBodyParameter = false + }; + switch (actionType) { - HttpServiceActionTransferObject action = new HttpServiceActionTransferObject - { - Name = actionType.ToString(), - Type = actionType, - Route = "", - RequireBodyParameter = false - }; - switch (actionType) - { - case HttpServiceActionTypeTransferObject.Get: - action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "query", Type = new TypeTransferObject { Name = "Edm.String" }, AppendName = false }); - action.ReturnType = this.ToTransferObject(navigationSource.Type, mapping); - break; - case HttpServiceActionTypeTransferObject.Post: - case HttpServiceActionTypeTransferObject.Put: - action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "model", FromBody = true, Type = this.ToTransferObject(navigationSource.Type, mapping, false) }); - action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; - action.RequireBodyParameter = true; - break; - case HttpServiceActionTypeTransferObject.Patch: - this.AddKeysToParameters(mapping, navigationSource, action); - action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "model", FromBody = true, Type = this.ToTransferObject(navigationSource.Type, mapping, false) }); - action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; - action.RequireBodyParameter = true; - break; - case HttpServiceActionTypeTransferObject.Delete: - this.AddKeysToParameters(mapping, navigationSource, action); - action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; - break; - } - return action; + case HttpServiceActionTypeTransferObject.Get: + action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "query", Type = new TypeTransferObject { Name = "Edm.String" }, AppendName = false }); + action.ReturnType = this.ToTransferObject(navigationSource.Type, mapping); + break; + case HttpServiceActionTypeTransferObject.Post: + case HttpServiceActionTypeTransferObject.Put: + action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "model", FromBody = true, Type = this.ToTransferObject(navigationSource.Type, mapping, false) }); + action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; + action.RequireBodyParameter = true; + break; + case HttpServiceActionTypeTransferObject.Patch: + this.AddKeysToParameters(mapping, navigationSource, action); + action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = "model", FromBody = true, Type = this.ToTransferObject(navigationSource.Type, mapping, false) }); + action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; + action.RequireBodyParameter = true; + break; + case HttpServiceActionTypeTransferObject.Delete: + this.AddKeysToParameters(mapping, navigationSource, action); + action.ReturnType = new TypeTransferObject { Name = "Edm.Void" }; + break; } + return action; + } - private void AddKeysToParameters(Dictionary mapping, IEdmNavigationSource navigationSource, HttpServiceActionTransferObject action) + private void AddKeysToParameters(Dictionary mapping, IEdmNavigationSource navigationSource, HttpServiceActionTransferObject action) + { + IEdmEntityType entity = this.ToEntity(navigationSource.Type); + if (entity.DeclaredKey != null) { - IEdmEntityType entity = this.ToEntity(navigationSource.Type); - if (entity.DeclaredKey != null) + foreach (IEdmStructuralProperty property in entity.DeclaredKey) { - foreach (IEdmStructuralProperty property in entity.DeclaredKey) - { - action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = property.Name, Type = this.ToTransferObject(property.Type.Definition, mapping) }); - } + action.Parameters.Add(new HttpServiceActionParameterTransferObject { Name = property.Name, Type = this.ToTransferObject(property.Type.Definition, mapping) }); } } + } - private TypeTransferObject ToTransferObject(IEdmType type, Dictionary mapping, bool allowCollection = true) + private TypeTransferObject ToTransferObject(IEdmType type, Dictionary mapping, bool allowCollection = true) + { + if (type.TypeKind == EdmTypeKind.Collection && type is IEdmCollectionType collectionType) { - if (type.TypeKind == EdmTypeKind.Collection && type is IEdmCollectionType collectionType) + if (allowCollection) { - if (allowCollection) - { - return new TypeTransferObject + return new TypeTransferObject + { + Name = "Array", + Generics = { - Name = "Array", - Generics = - { - new GenericAliasTransferObject { Type = this.ToTransferObject(collectionType.ElementType.Definition, mapping) } - } - }; - } - return this.ToTransferObject(collectionType.ElementType.Definition, mapping); + new GenericAliasTransferObject { Type = this.ToTransferObject(collectionType.ElementType.Definition, mapping) } + } + }; } - return mapping.ContainsKey(type) ? mapping[type] : - type is IEdmSchemaElement schemaElement ? new TypeTransferObject { Name = schemaElement.Name, Namespace = schemaElement.Namespace } : - type is IEdmNamedElement namedElement ? new TypeTransferObject { Name = namedElement.Name } : - new TypeTransferObject { Name = type.FullTypeName() }; + return this.ToTransferObject(collectionType.ElementType.Definition, mapping); } + return mapping.ContainsKey(type) ? mapping[type] : + type is IEdmSchemaElement schemaElement ? new TypeTransferObject { Name = schemaElement.Name, Namespace = schemaElement.Namespace } : + type is IEdmNamedElement namedElement ? new TypeTransferObject { Name = namedElement.Name } : + new TypeTransferObject { Name = type.FullTypeName() }; + } - private IEdmEntityType ToEntity(IEdmType type) - { - return type.TypeKind == EdmTypeKind.Collection && type is IEdmCollectionType collectionType ? (IEdmEntityType)collectionType.ElementType.Definition : (IEdmEntityType)type; - } + private IEdmEntityType ToEntity(IEdmType type) + { + return type.TypeKind == EdmTypeKind.Collection && type is IEdmCollectionType collectionType ? (IEdmEntityType)collectionType.ElementType.Definition : (IEdmEntityType)type; } -} \ No newline at end of file +} diff --git a/OpenApi/Configurations/OpenApiReadConfiguration.cs b/OpenApi/Configurations/OpenApiReadConfiguration.cs index 47744fb1..bd8527e2 100644 --- a/OpenApi/Configurations/OpenApiReadConfiguration.cs +++ b/OpenApi/Configurations/OpenApiReadConfiguration.cs @@ -1,8 +1,6 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.OpenApi.Configurations +namespace KY.Generator.OpenApi.Configurations { - public class OpenApiReadConfiguration : ReadConfigurationBase + public class OpenApiReadConfiguration { public string File { get; set; } public string Url { get; set; } @@ -10,4 +8,4 @@ public class OpenApiReadConfiguration : ReadConfigurationBase public string Namespace { get; set; } public bool DataAnnotations { get; set; } } -} \ No newline at end of file +} diff --git a/OpenApi/DataAccess/OpenApiFileReader.cs b/OpenApi/DataAccess/OpenApiFileReader.cs index eefe7b0e..6f81f878 100644 --- a/OpenApi/DataAccess/OpenApiFileReader.cs +++ b/OpenApi/DataAccess/OpenApiFileReader.cs @@ -9,7 +9,14 @@ namespace KY.Generator.OpenApi.DataAccess { public class OpenApiFileReader { - public void Read(string filename, List transferObjects) + private readonly List transferObjects; + + public OpenApiFileReader(List transferObjects) + { + this.transferObjects = transferObjects; + } + + public void Read(string filename) { if (!FileSystem.FileExists(filename)) { @@ -19,7 +26,7 @@ public void Read(string filename, List transferObjects) OpenApiStringReader reader = new OpenApiStringReader(); OpenApiDocument document = reader.Read(json, out OpenApiDiagnostic diagnostic); diagnostic.Errors?.ForEach(error => Logger.Error(error.Message)); - transferObjects.Add(TransferObject.Create(document)); + this.transferObjects.Add(TransferObject.Create(document)); } } -} \ No newline at end of file +} diff --git a/OpenApi/DataAccess/OpenApiUrlReader.cs b/OpenApi/DataAccess/OpenApiUrlReader.cs index ebbb94e4..31764672 100644 --- a/OpenApi/DataAccess/OpenApiUrlReader.cs +++ b/OpenApi/DataAccess/OpenApiUrlReader.cs @@ -12,7 +12,14 @@ namespace KY.Generator.OpenApi.DataAccess { public class OpenApiUrlReader { - public void Read(string url, List transferObjects) + private readonly List transferObjects; + + public OpenApiUrlReader(List transferObjects) + { + this.transferObjects = transferObjects; + } + + public void Read(string url) { HttpWebRequest request = WebRequest.CreateHttp(url); request.CookieContainer = new CookieContainer(); @@ -28,8 +35,8 @@ public void Read(string url, List transferObjects) OpenApiStringReader reader = new OpenApiStringReader(); OpenApiDocument document = reader.Read(json, out OpenApiDiagnostic diagnostic); diagnostic.Errors?.ForEach(error => Logger.Error(error.Message)); - + transferObjects.Add(TransferObject.Create(document)); } } -} \ No newline at end of file +} diff --git a/OpenApi/KY.Generator.OpenApi.csproj b/OpenApi/KY.Generator.OpenApi.csproj index 47f3f72e..ab8f80f2 100644 --- a/OpenApi/KY.Generator.OpenApi.csproj +++ b/OpenApi/KY.Generator.OpenApi.csproj @@ -1,39 +1,48 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - OpenApi Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - - https://github.com/KY-Programming/generator - KY-Generator KY Generator OpenApi - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 7.6.0 + KY.Generator + OpenApi Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + git + https://github.com/KY-Programming/generator + KY-Generator KY.Generator OpenApi + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - - + + + - - - - - + + + + + + + + + + diff --git a/OpenApi/Languages/TypeMapping.cs b/OpenApi/Languages/TypeMapping.cs index 83cf9065..c8fcc2b6 100644 --- a/OpenApi/Languages/TypeMapping.cs +++ b/OpenApi/Languages/TypeMapping.cs @@ -8,19 +8,21 @@ public static class TypeMapping { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Add(OpenApiLanguage.Instance, "array", CsharpLanguage.Instance, "List", nameSpace: "System.Collections.Generic", fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "string", CsharpLanguage.Instance, "string", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "boolean", CsharpLanguage.Instance, "bool", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "integer", CsharpLanguage.Instance, "int", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "number", CsharpLanguage.Instance, "double", true, fromSystem: true); - - typeMapping.Add(OpenApiLanguage.Instance, "array", TypeScriptLanguage.Instance, "Array", fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "string", TypeScriptLanguage.Instance, "string", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "boolean", TypeScriptLanguage.Instance, "boolean", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "integer", TypeScriptLanguage.Instance, "number", true, fromSystem: true); - typeMapping.Add(OpenApiLanguage.Instance, "number", TypeScriptLanguage.Instance, "number", true, fromSystem: true); + typeMapping.Map().To() + .From("array").To("List").Namespace("System.Collections.Generic").FromSystem() + .From("string").To("string").Nullable().FromSystem() + .From("boolean").To("bool").Nullable().FromSystem() + .From("integer").To("int").Nullable().FromSystem() + .From("number").To("double").Nullable().FromSystem(); + + typeMapping.Map().To() + .From("array").To("Array").FromSystem() + .From("string").To("string").Nullable().FromSystem() + .From("boolean").To("boolean").Nullable().FromSystem() + .From("integer").To("number").Nullable().FromSystem() + .From("number").To("number").Nullable().FromSystem(); return typeMapping; } } -} \ No newline at end of file +} diff --git a/OpenApi/OpenApiModule.cs b/OpenApi/OpenApiModule.cs index f726f651..9a550f5b 100644 --- a/OpenApi/OpenApiModule.cs +++ b/OpenApi/OpenApiModule.cs @@ -1,8 +1,6 @@ using KY.Core.Dependency; using KY.Core.Module; -using KY.Generator.Configuration; using KY.Generator.Mappings; -using KY.Generator.OpenApi.Configurations; using KY.Generator.OpenApi.DataAccess; using KY.Generator.OpenApi.Languages; using KY.Generator.OpenApi.Readers; @@ -21,8 +19,7 @@ public OpenApiModule(IDependencyResolver dependencyResolver) public override void Initialize() { - this.DependencyResolver.Get().Map("openApi"); this.DependencyResolver.Get().Initialize(); } } -} \ No newline at end of file +} diff --git a/OpenApi/Readers/OpenApiDocumentReader.cs b/OpenApi/Readers/OpenApiDocumentReader.cs index 3003599a..928167c3 100644 --- a/OpenApi/Readers/OpenApiDocumentReader.cs +++ b/OpenApi/Readers/OpenApiDocumentReader.cs @@ -1,148 +1,152 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Generator.OpenApi.Configurations; +using KY.Generator.OpenApi.Configurations; using KY.Generator.OpenApi.Extensions; using KY.Generator.OpenApi.Languages; using KY.Generator.Transfer; using Microsoft.OpenApi.Models; -namespace KY.Generator.OpenApi.Readers +namespace KY.Generator.OpenApi.Readers; + +public class OpenApiDocumentReader { - public class OpenApiDocumentReader + private readonly List transferObjects; + + public OpenApiDocumentReader(List transferObjects) { - public void Read(OpenApiReadConfiguration configuration, List transferObjects) + this.transferObjects = transferObjects; + } + + public void Read(OpenApiReadConfiguration configuration) + { + foreach (OpenApiDocument document in this.transferObjects.OfType>().Select(x => x.Value).Where(x => x.Components != null).ToList()) { - foreach (OpenApiDocument document in transferObjects.OfType>().Select(x => x.Value).Where(x => x.Components != null).ToList()) + foreach (OpenApiSchema type in document.Components.Schemas.Values) { - foreach (OpenApiSchema type in document.Components.Schemas.Values) - { - this.Read(configuration, type, transferObjects); - } - this.Read(configuration, document, transferObjects); + this.Read(configuration, type); } + this.Read(configuration, document); } + } - private void Read(OpenApiReadConfiguration configuration, OpenApiDocument document, List transferObjects) + private void Read(OpenApiReadConfiguration configuration, OpenApiDocument document) + { + HttpServiceTransferObject service = new() + { + Name = configuration.Name ?? document.Info.Description.Replace("Class ", "").Trim() + }; + foreach (KeyValuePair pathPair in document.Paths) { - HttpServiceTransferObject service = new HttpServiceTransferObject - { - Name = configuration.Name ?? document.Info.Description.Replace("Class ", "").Trim() - }; - foreach (KeyValuePair pathPair in document.Paths) + foreach (KeyValuePair operationPair in pathPair.Value.Operations) { - foreach (KeyValuePair operationPair in pathPair.Value.Operations) + HttpServiceActionTypeTransferObject type = operationPair.Key.ToActionType(); + HttpServiceActionTransferObject action = new() + { + Name = pathPair.Key.Split('/').Last(), + Route = pathPair.Key, + Type = type, + RequireBodyParameter = type.IsBodyParameterRequired() + }; + foreach (OpenApiParameter parameter in operationPair.Value.Parameters) { - HttpServiceActionTypeTransferObject type = operationPair.Key.ToActionType(); - HttpServiceActionTransferObject action = new HttpServiceActionTransferObject - { - Name = pathPair.Key.Split('/').Last(), - Route = pathPair.Key, - Type = type, - RequireBodyParameter = type.IsBodyParameterRequired() - }; - foreach (OpenApiParameter parameter in operationPair.Value.Parameters) - { - action.Parameters.Add(new HttpServiceActionParameterTransferObject - { - Name = parameter.Name, - Type = this.Read(configuration, parameter.Schema, transferObjects) - }); - } - OpenApiMediaType content = operationPair.Value.RequestBody.Content.Single().Value; - if (action.RequireBodyParameter) + action.Parameters.Add(new HttpServiceActionParameterTransferObject + { + Name = parameter.Name, + Type = this.Read(configuration, parameter.Schema) + }); + } + OpenApiMediaType content = operationPair.Value.RequestBody.Content.Single().Value; + if (action.RequireBodyParameter) + { + action.Parameters.Add(new HttpServiceActionParameterTransferObject + { + Name = "request", + Type = this.Read(configuration, content.Schema), + FromBody = true + }); + } + else + { + foreach (KeyValuePair propertyPair in content.Schema.Properties) { action.Parameters.Add(new HttpServiceActionParameterTransferObject { - Name = "request", - Type = this.Read(configuration, content.Schema, transferObjects), - FromBody = true + Name = propertyPair.Key, + Type = this.Read(configuration, propertyPair.Value) }); } - else - { - foreach (KeyValuePair propertyPair in content.Schema.Properties) - { - action.Parameters.Add(new HttpServiceActionParameterTransferObject - { - Name = propertyPair.Key, - Type = this.Read(configuration, propertyPair.Value, transferObjects) - }); - } - } - OpenApiResponse response = operationPair.Value.Responses.SingleOrDefault(x => x.Key == "200").Value; - if (response == null) - { - action.ReturnType = new TypeTransferObject { Name = "void" }; - } - else - { - action.ReturnType = this.Read(configuration, response.Content.Single().Value.Schema, transferObjects); - } - service.Actions.Add(action); } + OpenApiResponse response = operationPair.Value.Responses.SingleOrDefault(x => x.Key == "200").Value; + if (response == null) + { + action.ReturnType = new TypeTransferObject { Name = "void" }; + } + else + { + action.ReturnType = this.Read(configuration, response.Content.Single().Value.Schema); + } + service.Actions.Add(action); } } + } - private TypeTransferObject Read(OpenApiReadConfiguration configuration, OpenApiSchema schema, List transferObjects) + private TypeTransferObject Read(OpenApiReadConfiguration configuration, OpenApiSchema schema) + { + if (schema.Reference == null) { - if (schema.Reference == null) - { - return new TypeTransferObject - { - Name = schema.Type - }; - } + return new TypeTransferObject + { + Name = schema.Type + }; + } - ModelTransferObject model = transferObjects.OfType().FirstOrDefault(x => x.Name == schema.Reference.Id); - if (model != null) - { - return model; - } + ModelTransferObject model = this.transferObjects.OfType().FirstOrDefault(x => x.Name == schema.Reference.Id); + if (model != null) + { + return model; + } - if (schema.Type == "array") - { - return new TypeTransferObject + if (schema.Type == "array") + { + return new TypeTransferObject + { + Name = schema.Type, + Generics = { - Name = schema.Type, - Generics = - { - new GenericAliasTransferObject { Type = this.Read(configuration, schema.Items, transferObjects) } - } - }; - } - if (schema.Type == "object") + new GenericAliasTransferObject { Type = this.Read(configuration, schema.Items) } + } + }; + } + if (schema.Type == "object") + { + model = new ModelTransferObject + { + Name = schema.Reference.Id, + Namespace = configuration.Namespace, + Language = OpenApiLanguage.Instance + }; + foreach (KeyValuePair propertyPair in schema.Properties) { - model = new ModelTransferObject - { - Name = schema.Reference.Id, - Namespace = configuration.Namespace, - Language = OpenApiLanguage.Instance - }; - foreach (KeyValuePair propertyPair in schema.Properties) - { - PropertyTransferObject property = new PropertyTransferObject - { - Name = propertyPair.Key, - Type = this.Read(configuration, propertyPair.Value, transferObjects) - }; + PropertyTransferObject property = new() + { + Name = propertyPair.Key, + Type = this.Read(configuration, propertyPair.Value), + DeclaringType = model + }; - if (configuration.DataAnnotations && propertyPair.Value.MaxLength.HasValue) - { - property.Attributes.Add(new AttributeTransferObject - { - Name = "MaxLength", - Namespace = "System.ComponentModel.DataAnnotations", - Value = propertyPair.Value.MaxLength.Value - }); - } - model.Properties.Add(property); + if (configuration.DataAnnotations && propertyPair.Value.MaxLength.HasValue) + { + property.Attributes.Add(new AttributeTransferObject + { + Name = "MaxLength", + Namespace = "System.ComponentModel.DataAnnotations", + Value = propertyPair.Value.MaxLength.Value + }); } - - transferObjects.Add(model); - return model; + model.Properties.Add(property); } - throw new InvalidOperationException($"Unknown schema type {schema.Type}"); + + this.transferObjects.Add(model); + return model; } + throw new InvalidOperationException($"Unknown schema type {schema.Type}"); } -} \ No newline at end of file +} diff --git a/OpenApi/Readers/OpenApiReader.cs b/OpenApi/Readers/OpenApiReader.cs index 0fc0f605..d18d2a67 100644 --- a/OpenApi/Readers/OpenApiReader.cs +++ b/OpenApi/Readers/OpenApiReader.cs @@ -1,7 +1,5 @@ using System.Collections.Generic; using KY.Core; -using KY.Generator.Configuration; -using KY.Generator.Configurations; using KY.Generator.OpenApi.Configurations; using KY.Generator.OpenApi.DataAccess; using KY.Generator.Transfer; @@ -22,19 +20,18 @@ public OpenApiReader(OpenApiFileReader fileReader, OpenApiUrlReader urlReader, O this.documentReader = documentReader; } - public void Read(ConfigurationBase configurationBase, List transferObjects) + public void Read(OpenApiReadConfiguration configuration) { Logger.Trace("Read OpenApi..."); - OpenApiReadConfiguration configuration = (OpenApiReadConfiguration)configurationBase; if (configuration.File != null) { - this.fileReader.Read(configuration.File, transferObjects); + this.fileReader.Read(configuration.File); } if (configuration.Url != null) { - this.urlReader.Read(configuration.File, transferObjects); + this.urlReader.Read(configuration.File); } - this.documentReader.Read(configuration, transferObjects); + this.documentReader.Read(configuration); } } -} \ No newline at end of file +} diff --git a/README.md b/README.md index 6ea2ab53..191b2e43 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ Create a new class library project Install nuget package [KY.Generator.Fluent](https://www.nuget.org/packages/KY.Generator.Fluent/) ![](https://img.shields.io/nuget/v/KY.Generator.Fluent.svg?style=flat) -Derrive a class from GeneratorFluentMain, override the execute method and use the Read method +Derive a class from GeneratorFluentMain, override the execute method and use the Read method ``` public class GeneratorMain : GeneratorFluentMain { @@ -61,5 +61,5 @@ KY.Generator.exe reflection -assembly=KY.Generator.Examples.Reflection.dll -name ``` See [documentation](https://generator.ky-programming.de/start/commands/overview) for more details -## More Informations +## Read More For complete overview see our [documentation](https://generator.ky-programming.de) diff --git a/Reflection.Tests/InterfaceTest.cs b/Reflection.Tests/InterfaceTest.cs index f57e8202..add3d928 100644 --- a/Reflection.Tests/InterfaceTest.cs +++ b/Reflection.Tests/InterfaceTest.cs @@ -16,11 +16,12 @@ public class InterfaceTest public void Initialize() { this.output = new MemoryOutput(); - this.generator = Generator.Initialize() + this.generator = Generator.Create() .PreloadModule() .PreloadModule() .PreloadModule() - .SetOutput(this.output); + // .SetOutput(this.output) + ; } [TestMethod] @@ -125,4 +126,4 @@ private bool RunByTypeName(string typeName) ).Run(); } } -} \ No newline at end of file +} diff --git a/Reflection.Tests/KY.Generator.Reflection.Tests.csproj b/Reflection.Tests/KY.Generator.Reflection.Tests.csproj index f3f420fd..a39814ab 100644 --- a/Reflection.Tests/KY.Generator.Reflection.Tests.csproj +++ b/Reflection.Tests/KY.Generator.Reflection.Tests.csproj @@ -1,20 +1,22 @@  - netcoreapp2.1 + net6.0 false + + latest - + - + diff --git a/Reflection.Tests/ReflectionModelReaderTests.cs b/Reflection.Tests/ReflectionModelReaderTests.cs deleted file mode 100644 index ba302ce5..00000000 --- a/Reflection.Tests/ReflectionModelReaderTests.cs +++ /dev/null @@ -1,161 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Generator.Reflection.Readers; -using KY.Generator.Transfer; -using Microsoft.VisualStudio.TestTools.UnitTesting; - -namespace KY.Generator.Reflection.Tests -{ - [TestClass] - public class ReflectionModelReaderTests - { - private ReflectionModelReader reader; - - [TestInitialize] - public void Initialize() - { - this.reader = new ReflectionModelReader(); - } - - [TestMethod] - public void OneField() - { - List objects = this.Read(typeof(OneField)); - Assert.AreEqual(1, objects.Count, "Unexpected number of models"); - Assert.AreEqual(1, objects[0].Fields.Count, "Unexpected number of fields"); - Assert.AreEqual(0, objects[0].Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("Field1", objects[0].Fields[0].Name, "Unexpected field name"); - Assert.AreEqual("String", objects[0].Fields[0].Type.Name, "Unexpected field type"); - } - - [TestMethod] - public void OneProperty() - { - List objects = this.Read(typeof(OneProperty)); - Assert.AreEqual(1, objects.Count, "Unexpected number of models"); - Assert.AreEqual(0, objects[0].Fields.Count, "Unexpected number of fields"); - Assert.AreEqual(1, objects[0].Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("Prop1", objects[0].Properties[0].Name, "Unexpected property name"); - Assert.AreEqual("String", objects[0].Properties[0].Type.Name, "Unexpected property type"); - } - - [TestMethod] - public void OnePropertyWithCustomType() - { - List objects = this.Read(typeof(OnePropertyWithCustomType)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual(0, objects[0].Fields.Count, "Unexpected number of fields"); - Assert.AreEqual(1, objects[0].Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("Prop2", objects[0].Properties[0].Name, "Unexpected property name"); - Assert.AreEqual("OneProperty", objects[0].Properties[0].Type.Name, "Unexpected property type"); - Assert.AreEqual("Prop1", objects[1].Properties[0].Name, "Unexpected property name"); - Assert.AreEqual("String", objects[1].Properties[0].Type.Name, "Unexpected property type"); - } - - [TestMethod] - public void Recursive() - { - List objects = this.Read(typeof(RecursiveType)); - Assert.AreEqual(1, objects.Count, "Unexpected number of models"); - Assert.AreEqual(0, objects[0].Fields.Count, "Unexpected number of fields"); - Assert.AreEqual(1, objects[0].Properties.Count, "Unexpected number of properties"); - } - - [TestMethod] - public void CustomTypeInArray() - { - List objects = this.Read(typeof(CustomTypeInArray)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual("CustomTypeInArray", objects[0].Name); - Assert.AreEqual("SubType", objects[1].Name); - } - - [TestMethod] - public void CustomTypeInList() - { - List objects = this.Read(typeof(CustomTypeInList)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual("CustomTypeInList", objects[0].Name); - Assert.AreEqual("SubType", objects[1].Name); - } - - [TestMethod] - public void BasedOnStringList() - { - List objects = this.Read(typeof(BasedOnStringList)); - Assert.AreEqual(1, objects.Count, "Unexpected number of models"); - Assert.AreEqual("BasedOnStringList", objects[0].Name); - Assert.AreEqual("List", objects[0].BasedOn.Name); - Assert.AreEqual(1, objects[0].BasedOn.Generics.Count, "Unexpected number of generics"); - Assert.AreEqual("String", objects[0].BasedOn.Generics[0].Type.Name); - } - - [TestMethod] - public void BasedOnSubtypeList() - { - List objects = this.Read(typeof(BasedOnSubtypeList)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual("BasedOnSubtypeList", objects[0].Name); - Assert.AreEqual("List", objects[0].BasedOn.Name); - Assert.AreEqual(1, objects[0].BasedOn.Generics.Count, "Unexpected number of generics"); - Assert.AreEqual("SubType", objects[0].BasedOn.Generics[0].Type.Name); - Assert.AreEqual("SubType", objects[1].Name); - } - - [TestMethod] - public void BasedOnCustomGenericString() - { - List objects = this.Read(typeof(BasedOnCustomGenericString)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual("BasedOnCustomGenericString", objects[0].Name); - Assert.AreEqual("CustomGeneric", objects[0].BasedOn.Name); - Assert.AreEqual("CustomGeneric", objects[1].Name); - Assert.AreEqual(1, objects[0].BasedOn.Generics.Count, "Unexpected number of generics"); - } - - [TestMethod] - public void BasedOnCustomGenericSubtype() - { - List objects = this.Read(typeof(BasedOnCustomGenericSubtype)); - Assert.AreEqual(3, objects.Count, "Unexpected number of models"); - Assert.AreEqual("BasedOnCustomGenericSubtype", objects[0].Name); - Assert.AreEqual("CustomGeneric", objects[0].BasedOn.Name); - Assert.AreEqual(1, objects[0].BasedOn.Generics.Count, "Unexpected number of generics"); - Assert.AreEqual("CustomGeneric", objects[1].Name); - Assert.AreEqual("SubType", objects[2].Name); - } - - [TestMethod] - public void CustomGenericStringProperty() - { - List objects = this.Read(typeof(CustomGenericStringProperty)); - Assert.AreEqual(2, objects.Count, "Unexpected number of models"); - Assert.AreEqual("CustomGenericStringProperty", objects[0].Name); - Assert.AreEqual(1, objects[0].Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("CustomGeneric", objects[0].Properties[0].Type.Name); - Assert.AreEqual(1, objects[0].Properties[0].Type.Generics.Count, "Unexpected number of generics"); - Assert.AreEqual("CustomGeneric", objects[1].Name); - } - - [TestMethod] - public void CustomGenericSubtypeProperty() - { - List objects = this.Read(typeof(CustomGenericSubtypeProperty)); - Assert.AreEqual(3, objects.Count, "Unexpected number of models"); - Assert.AreEqual("CustomGenericSubtypeProperty", objects[0].Name); - Assert.AreEqual(1, objects[0].Properties.Count, "Unexpected number of properties"); - Assert.AreEqual("CustomGeneric", objects[0].Properties[0].Type.Name); - Assert.AreEqual(1, objects[0].Properties[0].Type.Generics.Count, "Unexpected number of generics"); - Assert.AreEqual("CustomGeneric", objects[1].Name); - Assert.AreEqual("SubType", objects[2].Name); - } - - private List Read(Type type) - { - List transferObjects = new List(); - this.reader.Read(type, transferObjects); - return transferObjects.OfType().ToList(); - } - } -} \ No newline at end of file diff --git a/Reflection/Commands/AnnotationCommand.cs b/Reflection/Commands/AnnotationCommand.cs index d7e777ab..ee51bdea 100644 --- a/Reflection/Commands/AnnotationCommand.cs +++ b/Reflection/Commands/AnnotationCommand.cs @@ -1,84 +1,98 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; +using System.Reflection; using KY.Core; using KY.Core.Dependency; using KY.Generator.Command; using KY.Generator.Extensions; -using KY.Generator.Output; +using KY.Generator.Models; +using KY.Generator.Transfer; -namespace KY.Generator.Reflection.Commands +namespace KY.Generator.Reflection.Commands; + +public class AnnotationCommand : GeneratorCommand { - public class AnnotationCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; + private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "annotation", "attributes" }; + public static string[] Names { get; } = [ToCommand(nameof(AnnotationCommand)), "annotation", "attributes"]; - public AnnotationCommand(IDependencyResolver resolver) + public AnnotationCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } + + public override IGeneratorCommandResult Run() + { + if (string.IsNullOrEmpty(this.Parameters.Assembly)) { - this.resolver = resolver; + Logger.Error("Run from attributes can not be run without assembly parameter"); + return this.Error(); } - - public override IGeneratorCommandResult Run(IOutput output) + LocateAssemblyResult result = GeneratorAssemblyLocator.Locate(this.Parameters.Assembly, this.Parameters.IsBeforeBuild); + if (result.SwitchContext) { - if (string.IsNullOrEmpty(this.Parameters.Assembly)) - { - Logger.Error("Run from attributes can not be run without assembly parameter"); - return this.Error(); - } - LocateAssemblyResult result = GeneratorAssemblyLocator.Locate(this.Parameters.Assembly, this.Parameters.IsBeforeBuild); - if (result.SwitchContext) - { - return result; - } - if (this.Parameters.IsBeforeBuild && !result.Success) + return result; + } + if (this.Parameters.IsBeforeBuild && !result.Success) + { + return this.Success(); + } + bool isAssemblyAsync = result.Assembly.IsAsync(); + if (!this.Parameters.IsOnlyAsync && isAssemblyAsync) + { + return this.SwitchAsync(); + } + List globalParameters = this.Parameters.GetType().GetProperties() + .Where(x => x.GetCustomAttribute() != null) + .Select(x => + new CliCommandParameter(x.Name, x.GetMethod.Invoke(this.Parameters, null)?.ToString()) + ) + .Where(x => !string.IsNullOrEmpty(x.Value)) + .ToList(); + foreach (Type objectType in TypeHelper.GetTypes(result.Assembly)) + { + IDependencyResolver commandResolver = this.resolver.CloneForCommand(); + GeneratorCommandRunner generatorCommandRunner = commandResolver.Get(); + List attributes = objectType.GetCustomAttributes().ToList(); + List rawCommands = []; + foreach (IGeneratorCommandAttribute attribute in attributes.OfType()) { - return this.Success(); + rawCommands.AddRange(attribute.Commands.Select(x => + { + CliCommand command = new(x.Command); + command.Parameters.AddRange(x.Parameters.Select(CliCommandParameter.Parse)); + command.Parameters.Add(new CliCommandParameter(nameof(GeneratorCommandParameters.IsAsyncAssembly), isAssemblyAsync.ToString())); + command.Parameters.AddRange(globalParameters); + foreach (CliCommandParameter parameter in command.Parameters) + { + parameter.Value = parameter.Value.Replace("$ASSEMBLY$", this.Parameters.Assembly) + .Replace("$NAMESPACE$", objectType.Namespace) + .Replace("$NAME$", objectType.FullName.TrimStart(objectType.Namespace + ".")); + } + return command; + })); } - bool isAssemblyAsync = result.Assembly.IsAsync(); - if (!this.Parameters.IsOnlyAsync && isAssemblyAsync) + if (rawCommands.Count == 0) { - return this.SwitchAsync(); + continue; } - CommandRunner commandRunner = this.resolver.Get(); - foreach (Type objectType in TypeHelper.GetTypes(result.Assembly)) + foreach (IGeneratorCommandAdditionalParameterAttribute additionalParameterAttribute in attributes.OfType()) { - List attributes = objectType.GetCustomAttributes().ToList(); - List commands = new List(); - foreach (IGeneratorCommandAttribute attribute in attributes.OfType()) + foreach (AttributeCommandConfiguration additionalParameters in additionalParameterAttribute.Commands) { - commands.AddRange(attribute.Commands.Select(x => + foreach (CliCommand command in rawCommands.Where(x => x.Name == additionalParameters.Command || additionalParameters.Command == "*")) { - RawCommand command = new RawCommand(x.Command); - command.Parameters.AddRange(x.Parameters.Select(RawCommandParameter.Parse)); - command.Parameters.Add(new RawCommandParameter("IsAsyncAssembly", isAssemblyAsync.ToString())); - foreach (RawCommandParameter parameter in command.Parameters) - { - parameter.Value = parameter.Value.Replace("$ASSEMBLY$", this.Parameters.Assembly) - .Replace("$NAMESPACE$", objectType.Namespace) - .Replace("$NAME$", objectType.FullName.TrimStart(objectType.Namespace + ".")); - } - return command; - })); - foreach (IGeneratorCommandAdditionalParameterAttribute additionalParameterAttribute in attributes.OfType()) - { - foreach (AttributeCommandConfiguration additionalParameters in additionalParameterAttribute.Commands) - { - foreach (RawCommand command in commands.Where(x => x.Name == additionalParameters.Command || additionalParameters.Command == "*")) - { - command.Parameters.AddRange(additionalParameters.Parameters.Select(RawCommandParameter.Parse)); - } - } - } - if (commands.Count > 0) - { - commandRunner.Run(commands, output, this.TransferObjects.ToList()); + command.Parameters.AddRange(additionalParameters.Parameters.Select(CliCommandParameter.Parse)); } } } - return this.Success(); + List commands = commandResolver.Get().Create(rawCommands, commandResolver); + commands.ForEach(x => x.Parse()); + IGeneratorCommandResult commandResult = generatorCommandRunner.Run(commands); + if (!commandResult.Success) + { + return commandResult; + } + this.resolver.Get().TransferObjects.AddIfNotExists(commandResolver.Get>()); } + return this.Success(); } } diff --git a/Reflection/Commands/RunByAttributeCommandParameters.cs b/Reflection/Commands/AnnotationCommandParameters.cs similarity index 53% rename from Reflection/Commands/RunByAttributeCommandParameters.cs rename to Reflection/Commands/AnnotationCommandParameters.cs index 3e3c1546..7658aa73 100644 --- a/Reflection/Commands/RunByAttributeCommandParameters.cs +++ b/Reflection/Commands/AnnotationCommandParameters.cs @@ -2,8 +2,8 @@ namespace KY.Generator.Reflection.Commands { - public class RunByAttributeCommandParameters : GeneratorCommandParameters + public class AnnotationCommandParameters : GeneratorCommandParameters { } -} \ No newline at end of file +} diff --git a/Reflection/Commands/ReflectionCommand.cs b/Reflection/Commands/ReflectionCommand.cs index e8ed6809..e95a72f7 100644 --- a/Reflection/Commands/ReflectionCommand.cs +++ b/Reflection/Commands/ReflectionCommand.cs @@ -1,111 +1,50 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using System.Reflection; -using KY.Core; +using KY.Core; +using KY.Core.Dependency; using KY.Generator.Command; +using KY.Generator.Command.Extensions; using KY.Generator.Csharp.Languages; -using KY.Generator.Extensions; -using KY.Generator.Languages; +using KY.Generator.Models; using KY.Generator.Output; using KY.Generator.Reflection.Configurations; -using KY.Generator.Reflection.Extensions; using KY.Generator.Reflection.Readers; using KY.Generator.Reflection.Writers; using KY.Generator.Transfer; using KY.Generator.TypeScript.Languages; -namespace KY.Generator.Reflection.Commands -{ - internal class ReflectionCommand : GeneratorCommand - { - private readonly ReflectionReader reader; - private readonly ReflectionWriter writer; +namespace KY.Generator.Reflection.Commands; - public override string[] Names { get; } = { "reflection" }; +internal class ReflectionCommand(IDependencyResolver resolver) : GeneratorCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(ReflectionCommand)), "reflection"]; - public ReflectionCommand(ReflectionReader reader, ReflectionWriter writer) + public override IGeneratorCommandResult Run() + { + Options options = resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.Language = this.Parameters.Language?.Name?.Equals(nameof(OutputLanguage.Csharp), StringComparison.CurrentCultureIgnoreCase) ?? false + ? resolver.Get() + : resolver.Get(); + if (generatorOptions.Language.IsTypeScript()) { - this.reader = reader; - this.writer = writer; + generatorOptions.SkipNamespace = true; + generatorOptions.PropertiesToFields = true; } + generatorOptions.SetFromParameter(this.Parameters); - public override IGeneratorCommandResult Run(IOutput output) - { - if (this.Parameters.FromAttributes) - { - foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies()) - { - if (assembly.IsAsync() && !this.Parameters.IsAsync) - { - return this.SwitchAsync(); - } - foreach (Type objectType in TypeHelper.GetTypes(assembly)) - { - foreach (GenerateAttribute attribute in objectType.GetCustomAttributes()) - { - ILanguage language = attribute.Language == OutputLanguage.Inherit ? this.Parameters.Language : attribute.Language == OutputLanguage.Csharp ? (ILanguage)CsharpLanguage.Instance : TypeScriptLanguage.Instance; - if (!language.IsCsharp() && !language.IsTypeScript()) - { - Logger.Error($"No language for type {objectType.Name} set. Set a language via attribute or use parameter (-language=Csharp)"); - return this.Error(); - } - - ReflectionReadConfiguration readConfiguration = new ReflectionReadConfiguration(); - readConfiguration.Language = language; - readConfiguration.Name = objectType.Name; - readConfiguration.Namespace = objectType.Namespace; - readConfiguration.Assembly = objectType.Assembly.Location; - readConfiguration.SkipSelf = attribute is GenerateIndexAttribute; - List transferObjects = new List(); - this.reader.Read(readConfiguration, transferObjects); + ReflectionReadConfiguration readConfiguration = new(); + readConfiguration.Name = this.Parameters.Name; + readConfiguration.Namespace = this.Parameters.Namespace; + readConfiguration.Assembly = this.Parameters.Assembly; + readConfiguration.OnlySubTypes = this.Parameters.OnlySubTypes; - ReflectionWriteConfiguration writeConfiguration = new ReflectionWriteConfiguration(); - writeConfiguration.AddHeader = !this.Parameters.SkipHeader; - writeConfiguration.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - writeConfiguration.Language = language; - writeConfiguration.Namespace = objectType.Namespace; - writeConfiguration.RelativePath = attribute.RelativePath ?? this.Parameters.RelativePath; - writeConfiguration.SkipNamespace = attribute.SkipNamespace.ToBool(this.Parameters.SkipNamespace); - writeConfiguration.PropertiesToFields = attribute.PropertiesToFields.ToBool(this.Parameters.PropertiesToFields); - writeConfiguration.FieldsToProperties = attribute.FieldsToProperties.ToBool(this.Parameters.FieldsToProperties); - writeConfiguration.FormatNames = attribute.FormatNames.ToBool(this.Parameters.FormatNames); + resolver.Create().Read(readConfiguration, generatorOptions); + resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); + ReflectionWriter writer = resolver.Create(); + writer.FormatNames(); + writer.Write(this.Parameters.RelativePath); - output.DeleteAllRelatedFiles(writeConfiguration.OutputId, this.Parameters.RelativePath); + resolver.Get().TransferObjects.AddIfNotExists(resolver.Get>()); - this.writer.Write(writeConfiguration, transferObjects, output); - } - } - } - } - else - { - ReflectionReadConfiguration readConfiguration = new ReflectionReadConfiguration(); - readConfiguration.Name = this.Parameters.Name; - readConfiguration.Namespace = this.Parameters.Namespace; - readConfiguration.Assembly = this.Parameters.Assembly; - readConfiguration.SkipSelf = this.Parameters.SkipSelf; - List transferObjects = new List(); - this.reader.Read(readConfiguration, transferObjects); - - ReflectionWriteConfiguration writeConfiguration = new ReflectionWriteConfiguration(); - writeConfiguration.AddHeader = !this.Parameters.SkipHeader; - writeConfiguration.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - writeConfiguration.Language = this.Parameters.Language?.Name?.Equals(nameof(OutputLanguage.Csharp), StringComparison.CurrentCultureIgnoreCase) ?? false ? (ILanguage)CsharpLanguage.Instance : TypeScriptLanguage.Instance; - writeConfiguration.Namespace = this.Parameters.Namespace; - writeConfiguration.RelativePath = this.Parameters.RelativePath; - writeConfiguration.Using = this.Parameters.Using; - writeConfiguration.SkipNamespace = this.Parameters.SkipNamespace; - writeConfiguration.PropertiesToFields = this.Parameters.PropertiesToFields; - writeConfiguration.FieldsToProperties = this.Parameters.FieldsToProperties; - writeConfiguration.FormatNames = this.Parameters.FormatNames; - - output.DeleteAllRelatedFiles(writeConfiguration.OutputId, this.Parameters.RelativePath); - - this.writer.Write(writeConfiguration, transferObjects, output); - } - - return this.Success(); - } + return this.Success(); } -} \ No newline at end of file +} diff --git a/Reflection/Commands/ReflectionCommandParameters.cs b/Reflection/Commands/ReflectionCommandParameters.cs index 14ca4c85..6c2244bf 100644 --- a/Reflection/Commands/ReflectionCommandParameters.cs +++ b/Reflection/Commands/ReflectionCommandParameters.cs @@ -1,19 +1,13 @@ using KY.Generator.Command; using KY.Generator.Languages; -using KY.Generator.TypeScript.Languages; namespace KY.Generator.Reflection.Commands { public class ReflectionCommandParameters : GeneratorCommandParameters { - [GeneratorParameter("fromAttribute")] - [GeneratorParameter("fromAttributes")] - public bool FromAttributes { get; set; } - public string Name { get; set; } public string Namespace { get; set; } - public bool SkipSelf { get; set; } - public ILanguage Language { get; set; } = TypeScriptLanguage.Instance; - public string Using { get; set; } + public bool OnlySubTypes { get; set; } + public ILanguage Language { get; set; } } -} \ No newline at end of file +} diff --git a/Reflection/Commands/ReflectionReadCommand.cs b/Reflection/Commands/ReflectionReadCommand.cs index 102a4e35..0b386a07 100644 --- a/Reflection/Commands/ReflectionReadCommand.cs +++ b/Reflection/Commands/ReflectionReadCommand.cs @@ -1,31 +1,29 @@ using KY.Core.Dependency; using KY.Generator.Command; -using KY.Generator.Output; using KY.Generator.Reflection.Configurations; using KY.Generator.Reflection.Readers; -namespace KY.Generator.Reflection.Commands +namespace KY.Generator.Reflection.Commands; + +public class ReflectionReadCommand : GeneratorCommand { - public class ReflectionReadCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "reflection-read" }; + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(ReflectionReadCommand)), "reflection-read"]; - public ReflectionReadCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public ReflectionReadCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) - { - ReflectionReadConfiguration readConfiguration = new ReflectionReadConfiguration(); - readConfiguration.Assembly = this.Parameters.Assembly; - readConfiguration.Namespace = this.Parameters.Namespace; - readConfiguration.Name = this.Parameters.Name; - readConfiguration.SkipSelf = this.Parameters.SkipSelf; + public override IGeneratorCommandResult Run() + { + ReflectionReadConfiguration readConfiguration = new(); + readConfiguration.Assembly = this.Parameters.Assembly; + readConfiguration.Namespace = this.Parameters.Namespace; + readConfiguration.Name = this.Parameters.Name; + readConfiguration.OnlySubTypes = this.Parameters.OnlySubTypes; - this.resolver.Create().Read(readConfiguration, this.TransferObjects); - return this.Success(); - } + this.resolver.Create().Read(readConfiguration); + return this.Success(); } -} \ No newline at end of file +} diff --git a/Reflection/Commands/ReflectionReadCommandParameters.cs b/Reflection/Commands/ReflectionReadCommandParameters.cs index c441cb0b..ed30725e 100644 --- a/Reflection/Commands/ReflectionReadCommandParameters.cs +++ b/Reflection/Commands/ReflectionReadCommandParameters.cs @@ -6,6 +6,6 @@ public class ReflectionReadCommandParameters : GeneratorCommandParameters { public string Namespace { get; set; } public string Name { get; set; } - public bool SkipSelf { get; set; } + public bool OnlySubTypes { get; set; } } -} \ No newline at end of file +} diff --git a/Reflection/Commands/ReflectionWriteCommand.cs b/Reflection/Commands/ReflectionWriteCommand.cs index 5915e67c..9d003260 100644 --- a/Reflection/Commands/ReflectionWriteCommand.cs +++ b/Reflection/Commands/ReflectionWriteCommand.cs @@ -1,42 +1,34 @@ -using System.Linq; -using KY.Core.Dependency; +using KY.Core.Dependency; using KY.Generator.Command; -using KY.Generator.Configurations; +using KY.Generator.Command.Extensions; using KY.Generator.Csharp.Languages; using KY.Generator.Output; -using KY.Generator.Reflection.Configurations; using KY.Generator.Reflection.Writers; -using KY.Generator.Transfer; -namespace KY.Generator.Reflection.Commands -{ - internal class ReflectionWriteCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; +namespace KY.Generator.Reflection.Commands; - public override string[] Names { get; } = { "reflection-write" }; +internal class ReflectionWriteCommand : GeneratorCommand +{ + private readonly IDependencyResolver resolver; - public ReflectionWriteCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public static string[] Names { get; } = [ToCommand(nameof(ReflectionWriteCommand)), "reflection-write"]; - public override IGeneratorCommandResult Run(IOutput output) - { - ReflectionWriteConfiguration configuration = new ReflectionWriteConfiguration(); - configuration.FormatNames = this.Parameters.FormatNames; - configuration.FieldsToProperties = this.Parameters.FieldsToProperties; - configuration.PropertiesToFields = this.Parameters.PropertiesToFields; - configuration.Namespace = this.Parameters.Namespace; - configuration.Name = this.Parameters.Name; - configuration.RelativePath = this.Parameters.RelativePath; - configuration.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - configuration.SkipNamespace = this.Parameters.SkipNamespace; - configuration.Language = CsharpLanguage.Instance; + public ReflectionWriteCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - this.resolver.Create().Write(configuration, this.TransferObjects, output); + public override IGeneratorCommandResult Run() + { + Options options = this.resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = this.resolver.Get(); + ReflectionWriter writer = this.resolver.Create(); + writer.FormatNames(); + this.resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); + writer.Write(this.Parameters.RelativePath); - return this.Success(); - } + return this.Success(); } } diff --git a/Reflection/Configurations/ReflectionReadConfiguration.cs b/Reflection/Configurations/ReflectionReadConfiguration.cs index 51dec8e6..8b45dbca 100644 --- a/Reflection/Configurations/ReflectionReadConfiguration.cs +++ b/Reflection/Configurations/ReflectionReadConfiguration.cs @@ -1,12 +1,10 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Reflection.Configurations +namespace KY.Generator.Reflection.Configurations { - public class ReflectionReadConfiguration : ReadConfigurationBase + public class ReflectionReadConfiguration { public string Assembly { get; set; } public string Name { get; set; } public string Namespace { get; set; } - public bool SkipSelf { get; set; } + public bool OnlySubTypes { get; set; } } -} \ No newline at end of file +} diff --git a/Reflection/Configurations/ReflectionWriteConfiguration.cs b/Reflection/Configurations/ReflectionWriteConfiguration.cs deleted file mode 100644 index 8799d199..00000000 --- a/Reflection/Configurations/ReflectionWriteConfiguration.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System.Collections.Generic; -using KY.Generator.Configurations; - -namespace KY.Generator.Reflection.Configurations -{ - internal class ReflectionWriteConfiguration : ConfigurationBase, IModelConfiguration - { - public string Name { get; set; } - public string Namespace { get; set; } - public string RelativePath { get; set; } - public string Using { get; set; } - - public bool FieldsToProperties - { - get => this.Formatting.FieldsToProperties; - set => this.Formatting.FieldsToProperties = value; - } - - public bool PropertiesToFields - { - get => this.Formatting.PropertiesToFields; - set => this.Formatting.PropertiesToFields = value; - } - - public bool SkipNamespace { get; set; } - public List Usings { get; } - public bool FormatNames { get; set; } - public string ReplaceName { get; set; } - public string WithName { get; set; } - - public ReflectionWriteConfiguration() - { - this.Usings = new List(); - } - } -} diff --git a/Reflection/Extensions/OptionExtension.cs b/Reflection/Extensions/OptionExtension.cs deleted file mode 100644 index bb3b73a1..00000000 --- a/Reflection/Extensions/OptionExtension.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace KY.Generator.Reflection.Extensions -{ - public static class OptionExtension - { - public static bool ToBool(this Option option, bool defaultValue) - { - return option == Option.Inherit ? defaultValue : option == Option.Yes; - } - } -} \ No newline at end of file diff --git a/Reflection/Extensions/TypeMappingExtension.cs b/Reflection/Extensions/TypeMappingExtension.cs index ebcd80d2..5012669d 100644 --- a/Reflection/Extensions/TypeMappingExtension.cs +++ b/Reflection/Extensions/TypeMappingExtension.cs @@ -10,10 +10,11 @@ public static class TypeMappingExtension { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Map(ReflectionLanguage.Instance).To(CsharpLanguage.Instance) + typeMapping.Map().To() .From("System.Array").To("Array").Namespace("System").FromSystem() .From("System.Boolean").To("bool").FromSystem() .From("System.Byte").To("byte").FromSystem() + .From("System.SByte").To("sbyte").FromSystem() .From("System.Char").To("char").FromSystem() .From("System.DateTime").To("DateTime").Namespace("System").FromSystem() .From("System.Decimal").To("decimal").FromSystem() @@ -31,17 +32,21 @@ public static ITypeMapping Initialize(this ITypeMapping typeMapping) .From("System.UInt64").To("ulong").FromSystem() .From("System.Void").To("void").FromSystem() .From("System.Collections.Generic.ICollection").To("ICollection").Namespace("System.Collections.Generic").FromSystem() + .From("System.Collections.Generic.IReadOnlyCollection").To("IReadOnlyCollection").Namespace("System.Collections.Generic").FromSystem() .From("System.Collections.Generic.IList").To("IList").Namespace("System.Collections.Generic").FromSystem() + .From("System.Collections.Generic.IReadOnlyList").To("IReadOnlyList").Namespace("System.Collections.Generic").FromSystem() .From("System.Collections.Generic.List").To("List").Namespace("System.Collections.Generic").FromSystem() .From("System.Collections.Generic.IEnumerable").To("IEnumerable").Namespace("System.Collections.Generic").FromSystem() .From("System.Collections.Generic.Dictionary").To("Dictionary").Namespace("System.Collections.Generic").FromSystem() .From("System.Collections.Generic.IDictionary").To("IDictionary").Namespace("System.Collections.Generic").FromSystem() + .From("System.Collections.Generic.IReadOnlyDictionary").To("IReadOnlyDictionary").Namespace("System.Collections.Generic").FromSystem() .From("System.Nullable").To("Nullable").Nullable().FromSystem(); - typeMapping.Map(ReflectionLanguage.Instance).To(TypeScriptLanguage.Instance) + typeMapping.Map().To() .From("System.Array").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) .From("System.Boolean").To("boolean").Nullable().FromSystem().Default(Code.Instance.Boolean(false)) .From("System.Byte").To("number").Nullable().FromSystem().Default(Code.Instance.Number(0)) + .From("System.SByte").To("number").Nullable().FromSystem().Default(Code.Instance.Number(0)) .From("System.Char").To("number").Nullable().FromSystem().Default(Code.Instance.Number(0)) .From("System.DateTime").To("Date").Nullable().FromSystem().Default(Code.Instance.New(Code.Instance.Type("Date"), Code.Instance.Number(0))) .From("System.Decimal").To("number").Nullable().FromSystem().Default(Code.Instance.Number(0)) @@ -59,11 +64,14 @@ public static ITypeMapping Initialize(this ITypeMapping typeMapping) .From("System.UInt64").To("number").Nullable().FromSystem().Default(Code.Instance.Number(0)) .From("System.Void").To("void").Nullable().FromSystem() .From("System.Collections.Generic.ICollection").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) + .From("System.Collections.Generic.IReadOnlyCollection").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) .From("System.Collections.Generic.IList").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) + .From("System.Collections.Generic.IReadOnlyList").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) .From("System.Collections.Generic.List").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) .From("System.Collections.Generic.IEnumerable").To("Array").Nullable().FromSystem().Default(Code.Instance.TypeScript("[]")) .From("System.Collections.Generic.Dictionary").To("Dictionary").Nullable().FromSystem().Default(Code.Instance.TypeScript("{}")) .From("System.Collections.Generic.IDictionary").To("Dictionary").Nullable().FromSystem().Default(Code.Instance.TypeScript("{}")) + .From("System.Collections.Generic.IReadOnlyDictionary").To("Dictionary").Nullable().FromSystem().Default(Code.Instance.TypeScript("{}")) .From("System.Nullable").To("Nullable").Nullable().FromSystem(); return typeMapping; diff --git a/Reflection/Fluent/Extensions/ReadFluentSyntaxExtension.cs b/Reflection/Fluent/Extensions/ReadFluentSyntaxExtension.cs new file mode 100644 index 00000000..060c9139 --- /dev/null +++ b/Reflection/Fluent/Extensions/ReadFluentSyntaxExtension.cs @@ -0,0 +1,24 @@ +using System; +using KY.Core; +using KY.Generator.Reflection.Fluent; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace : Easier usage on lower namespace +namespace KY.Generator +{ + public static class ReadFluentSyntaxExtension + { + /// + /// Executes the Reflection read commands. Use at least one command! + /// + public static IReadFluentSyntax Reflection(this IReadFluentSyntax syntax, Action action) + { + IReadFluentSyntaxInternal internalSyntax = (IReadFluentSyntaxInternal)syntax; + ReflectionReadSyntax readSyntax = new(internalSyntax); + internalSyntax.Syntaxes.Add(readSyntax); + action(readSyntax); + readSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Reflection)} action requires at least one command. E.g. '.{nameof(Reflection)}(read => read.{nameof(IReflectionReadSyntax.FromType)}())'"); + return internalSyntax; + } + } +} diff --git a/Reflection/Fluent/Extensions/WriteFluentSyntaxExtension.cs b/Reflection/Fluent/Extensions/WriteFluentSyntaxExtension.cs new file mode 100644 index 00000000..4479d95c --- /dev/null +++ b/Reflection/Fluent/Extensions/WriteFluentSyntaxExtension.cs @@ -0,0 +1,24 @@ +using System; +using KY.Core; +using KY.Generator.Reflection.Fluent; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace : Easier usage on lower namespace +namespace KY.Generator +{ + public static class WriteFluentSyntaxExtension + { + /// + /// Executes the Reflection write commands. Use at least one command! + /// + public static IWriteFluentSyntax Reflection(this IWriteFluentSyntax syntax, Action action) + { + IWriteFluentSyntaxInternal internalSyntax = (IWriteFluentSyntaxInternal)syntax; + ReflectionWriteSyntax writeSyntax = new(internalSyntax); + internalSyntax.Syntaxes.Add(writeSyntax); + action(writeSyntax); + writeSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Reflection)} action requires at least one command. E.g. '.{nameof(Reflection)}(write => write.{nameof(IReflectionWriteSyntax.Models)}(...))'"); + return internalSyntax; + } + } +} diff --git a/Reflection/Fluent/IReflectionFromTypeOrReflectionReadSyntax.cs b/Reflection/Fluent/IReflectionFromTypeOrReflectionReadSyntax.cs deleted file mode 100644 index 2f984064..00000000 --- a/Reflection/Fluent/IReflectionFromTypeOrReflectionReadSyntax.cs +++ /dev/null @@ -1,5 +0,0 @@ -namespace KY.Generator.Reflection.Fluent -{ - public interface IReflectionFromTypeOrReflectionReadSyntax : IReflectionReadSyntax, IReflectionFromTypeSyntax - { } -} \ No newline at end of file diff --git a/Reflection/Fluent/IReflectionFromTypeSyntax.cs b/Reflection/Fluent/IReflectionFromTypeSyntax.cs index a242eb1e..2066942f 100644 --- a/Reflection/Fluent/IReflectionFromTypeSyntax.cs +++ b/Reflection/Fluent/IReflectionFromTypeSyntax.cs @@ -6,6 +6,6 @@ public interface IReflectionFromTypeSyntax /// Reads only the metadata from used/referenced types. /// Use this method to create a index type, which will not be generated, but adds all used types to generation process /// - IReflectionReadSyntax SkipSelf(); + IReflectionFromTypeSyntax OnlySubTypes(); } -} \ No newline at end of file +} diff --git a/Reflection/Fluent/IReflectionReadSyntax.cs b/Reflection/Fluent/IReflectionReadSyntax.cs index 0d2e6bf7..365dfc70 100644 --- a/Reflection/Fluent/IReflectionReadSyntax.cs +++ b/Reflection/Fluent/IReflectionReadSyntax.cs @@ -1,23 +1,22 @@ -using KY.Generator.Syntax; +using System; -namespace KY.Generator.Reflection.Fluent +namespace KY.Generator.Reflection.Fluent; + +public interface IReflectionReadSyntax { - public interface IReflectionReadSyntax : ISwitchToWriteSyntax - { - /// - /// Read all metadata from this type and provide it to the following write actions. - /// This method does not generate anything. You need at least on write action. Use .Write() method. - /// - /// - /// - /// this.Read() - /// .FromType<MyClass>() - /// .Write() - /// .AngularModels().OutputPath("Output/Models").SkipHeader() - /// .AngularServices().OutputPath("Output/Services").SkipHeader(); - /// - /// - /// Type which should be generated - IReflectionFromTypeOrReflectionReadSyntax FromType(); - } + /// + /// Read all metadata from this type and provide it to the following write actions. + /// This method does not generate anything. You need at least on write action. Use .Write() method. + /// + /// + /// + /// this.Read() + /// .FromType<MyClass>() + /// .Write() + /// .AngularModels().OutputPath("RelativePath/Models").NoHeader() + /// .AngularServices().OutputPath("RelativePath/Services").NoHeader(); + /// + /// + /// Type which should be generated + IReflectionReadSyntax FromType(Action options = null); } \ No newline at end of file diff --git a/Reflection/Fluent/IReflectionWriteSyntax.cs b/Reflection/Fluent/IReflectionWriteSyntax.cs index d38fa57c..874dfc81 100644 --- a/Reflection/Fluent/IReflectionWriteSyntax.cs +++ b/Reflection/Fluent/IReflectionWriteSyntax.cs @@ -4,5 +4,6 @@ public interface IReflectionWriteSyntax { IReflectionWriteSyntax PropertiesToFields(); IReflectionWriteSyntax FieldsToProperties(); + IReflectionWriteSyntax Models(string relativePath); } -} \ No newline at end of file +} diff --git a/Reflection/Fluent/ReadFluentSyntaxExtension.cs b/Reflection/Fluent/ReadFluentSyntaxExtension.cs deleted file mode 100644 index 83be0e7a..00000000 --- a/Reflection/Fluent/ReadFluentSyntaxExtension.cs +++ /dev/null @@ -1,15 +0,0 @@ -using KY.Generator.Reflection.Fluent; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace : Easier usage on lower namespace -namespace KY.Generator -{ - public static class ReadFluentSyntaxExtension - { - /// - public static IReflectionFromTypeOrReflectionReadSyntax FromType(this IReadFluentSyntax syntax) - { - return new ReflectionReadSyntax((IReadFluentSyntaxInternal)syntax).FromType(); - } - } -} \ No newline at end of file diff --git a/Reflection/Fluent/ReflectionFromTypeSyntax.cs b/Reflection/Fluent/ReflectionFromTypeSyntax.cs index a80fbc90..fc730701 100644 --- a/Reflection/Fluent/ReflectionFromTypeSyntax.cs +++ b/Reflection/Fluent/ReflectionFromTypeSyntax.cs @@ -1,33 +1,20 @@ using KY.Generator.Reflection.Commands; -using KY.Generator.Syntax; namespace KY.Generator.Reflection.Fluent { - internal class ReflectionFromTypeSyntax : IReflectionFromTypeOrReflectionReadSyntax + internal class ReflectionFromTypeSyntax : IReflectionFromTypeSyntax { - private readonly ReflectionReadSyntax syntax; private readonly ReflectionReadCommand command; - public ReflectionFromTypeSyntax(ReflectionReadSyntax syntax, ReflectionReadCommand command) + public ReflectionFromTypeSyntax(ReflectionReadCommand command) { - this.syntax = syntax; this.command = command; } - public IReflectionReadSyntax SkipSelf() + public IReflectionFromTypeSyntax OnlySubTypes() { - this.command.Parameters.SkipSelf = true; - return this.syntax; - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); - } - - public IReflectionFromTypeOrReflectionReadSyntax FromType() - { - return this.syntax.FromType(); + this.command.Parameters.OnlySubTypes = true; + return this; } } -} \ No newline at end of file +} diff --git a/Reflection/Fluent/ReflectionReadSyntax.cs b/Reflection/Fluent/ReflectionReadSyntax.cs index 8fccc685..d1acdcdb 100644 --- a/Reflection/Fluent/ReflectionReadSyntax.cs +++ b/Reflection/Fluent/ReflectionReadSyntax.cs @@ -1,32 +1,32 @@ using System; +using System.Collections.Generic; +using KY.Generator.Command; using KY.Generator.Reflection.Commands; using KY.Generator.Syntax; namespace KY.Generator.Reflection.Fluent { - internal class ReflectionReadSyntax : IReflectionReadSyntax + internal class ReflectionReadSyntax : IReflectionReadSyntax, IExecutableSyntax { private readonly IReadFluentSyntaxInternal syntax; + public List Commands { get; } = new(); + public ReflectionReadSyntax(IReadFluentSyntaxInternal syntax) { this.syntax = syntax; } - public IReflectionFromTypeOrReflectionReadSyntax FromType() + public IReflectionReadSyntax FromType(Action action = null) { Type type = typeof(T); - ReflectionReadCommand command = new ReflectionReadCommand(this.syntax.Resolver); + ReflectionReadCommand command = this.syntax.Resolver.Create(); command.Parameters.Assembly = type.Assembly.Location; command.Parameters.Namespace = type.Namespace; command.Parameters.Name = type.Name; - this.syntax.Commands.Add(command); - return new ReflectionFromTypeSyntax(this, command); - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); + this.Commands.Add(command); + action?.Invoke(new ReflectionFromTypeSyntax(command)); + return this; } } -} \ No newline at end of file +} diff --git a/Reflection/Fluent/ReflectionWriteSyntax.cs b/Reflection/Fluent/ReflectionWriteSyntax.cs index 1855314a..a6654da5 100644 --- a/Reflection/Fluent/ReflectionWriteSyntax.cs +++ b/Reflection/Fluent/ReflectionWriteSyntax.cs @@ -1,13 +1,17 @@ -using KY.Generator.Reflection.Commands; +using System.Collections.Generic; +using KY.Generator.Command; +using KY.Generator.Reflection.Commands; using KY.Generator.Syntax; namespace KY.Generator.Reflection.Fluent { - internal class ReflectionWriteSyntax : IReflectionWriteSyntax + internal class ReflectionWriteSyntax : IReflectionWriteSyntax, IExecutableSyntax { private readonly IWriteFluentSyntaxInternal syntax; private ReflectionWriteCommand command; + public List Commands { get; } = new(); + public ReflectionWriteSyntax(IWriteFluentSyntaxInternal syntax) { this.syntax = syntax; @@ -15,9 +19,9 @@ public ReflectionWriteSyntax(IWriteFluentSyntaxInternal syntax) public IReflectionWriteSyntax Models(string relativePath) { - this.command = new ReflectionWriteCommand(this.syntax.Resolver); + this.command = this.syntax.Resolver.Create(); this.command.Parameters.RelativePath = relativePath; - this.syntax.Commands.Add(this.command); + this.Commands.Add(this.command); return this; } @@ -33,4 +37,4 @@ public IReflectionWriteSyntax FieldsToProperties() return this; } } -} \ No newline at end of file +} diff --git a/Reflection/Fluent/WriteFluentSyntaxExtension.cs b/Reflection/Fluent/WriteFluentSyntaxExtension.cs deleted file mode 100644 index 56bb89e7..00000000 --- a/Reflection/Fluent/WriteFluentSyntaxExtension.cs +++ /dev/null @@ -1,13 +0,0 @@ -using KY.Generator.Reflection.Fluent; -using KY.Generator.Syntax; - -namespace KY.Generator -{ - public static class WriteFluentSyntaxExtension - { - public static IReflectionWriteSyntax ReflectionModels(this IWriteFluentSyntax syntax, string relativePath) - { - return new ReflectionWriteSyntax((IWriteFluentSyntaxInternal)syntax).Models(relativePath); - } - } -} \ No newline at end of file diff --git a/Reflection/KY.Generator.Reflection.csproj b/Reflection/KY.Generator.Reflection.csproj index e1dd50ac..ce89a10d 100644 --- a/Reflection/KY.Generator.Reflection.csproj +++ b/Reflection/KY.Generator.Reflection.csproj @@ -1,41 +1,47 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - Reflection Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator Reflection - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + Reflection Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator Reflection + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - 1701;1702;1591 - ..\bin\Release\KY.Generator.Reflection.xml - + + ..\bin\Release + 1701;1702;1591 + ..\bin\Release\KY.Generator.Reflection.xml + - - - + + + + + + - - - - - - + + + + diff --git a/Reflection/KY.Generator.Reflection.csproj.DotSettings b/Reflection/KY.Generator.Reflection.csproj.DotSettings index 8b01856a..3dde2437 100644 --- a/Reflection/KY.Generator.Reflection.csproj.DotSettings +++ b/Reflection/KY.Generator.Reflection.csproj.DotSettings @@ -1,2 +1,3 @@  - True \ No newline at end of file + True + True \ No newline at end of file diff --git a/Reflection/Readers/ReflectionModelReader.cs b/Reflection/Readers/ReflectionModelReader.cs index 1770a7af..a14cb6f8 100644 --- a/Reflection/Readers/ReflectionModelReader.cs +++ b/Reflection/Readers/ReflectionModelReader.cs @@ -1,228 +1,429 @@ -using System; -using System.Collections.Generic; -using System.Linq; +using System.ComponentModel; using System.Reflection; using KY.Core; +using KY.Generator.Extensions; +using KY.Generator.Models; using KY.Generator.Reflection.Extensions; using KY.Generator.Reflection.Language; using KY.Generator.Transfer; -using KY.Generator.Transfer.Extensions; -namespace KY.Generator.Reflection.Readers +namespace KY.Generator.Reflection.Readers; + +public class ReflectionModelReader { - public class ReflectionModelReader + private readonly Options options; + private readonly List transferObjects; + + public ReflectionModelReader(Options options, List transferObjects) + { + this.options = options; + this.transferObjects = transferObjects; + } + + public ModelTransferObject Read(TypeTransferObject type, GeneratorOptions? caller = null) + { + if (type == null) + { + return null; + } + if (type.Type != null) + { + return this.Read(type.Type); + } + return new ModelTransferObject(type); + } + + public ModelTransferObject Read(Type type, GeneratorOptions? caller = null) { - public ModelTransferObject Read(Type type, List transferObjects, IFromTypeOptions options = null) + if (type == null) + { + return null; + } + ModelTransferObject model = new(); + model.Name = model.OriginalName = type.Name; + model.Namespace = type.Namespace; + model.Language = ReflectionLanguage.Instance; + model.IsNullable = !type.IsValueType; + model.IsGeneric = type.IsGenericType; + model.IsGenericParameter = type.IsGenericParameter; + model.FromSystem = type.Namespace != null && type.Namespace.StartsWith("System"); + if (model.IsGeneric) { - ModelTransferObject model = new ModelTransferObject { Language = ReflectionLanguage.Instance }; - model.Name = model.OriginalName = type.Name; - model.Namespace = type.Namespace; - model.IsNullable = !type.IsValueType; - model.IsGeneric = type.IsGenericType; - model.FromSystem = type.Namespace != null && type.Namespace.StartsWith("System"); + model.Name = model.OriginalName = type.Name.Split('`').First(); + model = new GenericModelTransferObject(model); + } + ModelTransferObject? existingModel = this.transferObjects.OfType().FirstOrDefault(entry => entry.Equals(model)); + if (existingModel != null) + { + // TODO: Replace complete if with cached model reading after cloning of TransferModels is fixed if (model.IsGeneric) { - model.Name = type.Name.Split('`').First(); - } - ModelTransferObject existingModel = transferObjects.OfType().FirstOrDefault(entry => entry.Equals(model)); - if (existingModel != null) - { - if (model.IsGeneric) - { - existingModel = new GenericModelTransferObject(existingModel); - this.ReadGenericArguments(type, existingModel, transferObjects); - } - return existingModel; + GenericModelTransferObject genericModel = new(existingModel); + ModelTransferObject modelToMap = existingModel; + this.options.Map(genericModel, () => this.options.Get(modelToMap, null)); + existingModel = genericModel; + this.ApplyGenericTemplate(type, genericModel); + this.transferObjects.Add(existingModel); } - if (type.GetCustomAttributes().Any() || IgnoreTypeHelper.IgnoredTypes.Contains(type)) - { - Logger.Trace($"{type.Name} ({type.Namespace}) ignored (decorated with {nameof(GenerateIgnoreAttribute)})"); - return model; - } - if (type.IsArray) - { - this.ReadArray(type, model, transferObjects); - } - else if (type.IsGenericType && model.FromSystem) - { - this.ReadGenericFromSystem(type, model, transferObjects); - } - else if (type.IsEnum) + return existingModel; + } + // TODO: Uncomment cached model reading after cloning of TransferModels is fixed + // existingModel = this.environment.TransferObjects.OfType().FirstOrDefault(entry => entry.Equals(model)); + // if (existingModel != null) + // { + // return this.ReadExisting(existingModel, caller); + // } + this.options.Map(model, () => this.options.Get(type, caller)); + GeneratorOptions typeOptions = this.options.Get(type, caller); + Import? import = typeOptions.Imports.FirstOrDefault(import => import.Type == type); + if (import != null) + { + Logger.Trace($"{type.Name} ({type.Namespace}) imported from {import.FileName}"); + return model; + } + if (typeOptions.Ignore) + { + Logger.Trace($"{type.Name} ({type.Namespace}) ignored (decorated with {nameof(GenerateIgnoreAttribute)})"); + return model; + } + if (type.IsGenericParameter) + { + return model; + } + if (type.IsArray) + { + this.ReadArray(type, model); + } + else if (model.IsGeneric && model.FromSystem) + { + this.ReadGenericFromSystem(type, model); + } + else if (type.IsEnum) + { + this.transferObjects.Add(model); + this.ReadEnum(type, model); + } + else if (!model.FromSystem) + { + this.transferObjects.Add(model); + this.ReadClass(type, model, caller); + } + if (model.Name == nameof(Nullable)) + { + model.IsNullable = true; + } + return model; + } + + private ModelTransferObject ReadExisting(ModelTransferObject model, GeneratorOptions caller) + { + GeneratorOptions typeOptions = this.options.Get(model, caller); + if (model.IsGeneric) + { + GenericModelTransferObject genericModel = new(model); + model = genericModel; + // TODO: Reimplement or delete + // if (model.Type != null) + // { + // this.ApplyGenericTemplate(model.Type, genericModel); + // } + } + else + { + model = model.Clone(); + } + this.transferObjects.Add(model); + this.ReadExistingMembers(model, typeOptions); + return model; + } + + private void ReadExistingMembers(ModelTransferObject model, GeneratorOptions caller) + { + model.Interfaces.OfType() + .Concat(model.Generics.Select(x => x.Type)) + .Concat(model.Constants.Select(x => x.Type)) + .Concat(model.Fields.Select(x => x.Type)) + .Concat(model.Properties.Select(x => x.Type)) + .OfType().ForEach(x => this.ReadExisting(x, caller)); + } + + private void ReadArray(Type type, ModelTransferObject model) + { + // Logger.Trace($"Reflection read array {type.Name} ({type.Namespace})"); + GeneratorOptions modelOptions = this.options.Get(model); + model.Name = "Array"; + model.IsGeneric = true; + model.FromSystem = true; + model.Generics.Add(new GenericAliasTransferObject { Type = this.Read(type.GetElementType(), modelOptions) }); + } + + private void ReadGenericFromSystem(Type type, ModelTransferObject model) + { + // Logger.Trace($"Reflection read generic system type {type.Name}<{string.Join(",", type.GetGenericArguments().Select(x => x.Name))}> ({type.Namespace})"); + this.ReadGenericArguments(type, model); + this.ApplyGenericTemplate(type, (GenericModelTransferObject)model); + } + + private void ReadEnum(Type type, ModelTransferObject model) + { + // Logger.Trace($"Reflection read enum {type.Name} ({type.Namespace})"); + model.IsEnum = true; + model.EnumValues = new Dictionary(); + FieldInfo[] fields = type.GetFields(); + foreach (FieldInfo field in fields) + { + if (field.Name.Equals("value__")) { - transferObjects.Add(model); - this.ReadEnum(type, model); + continue; } - else if (type.ContainsGenericParameters) + model.EnumValues.Add(field.Name, field.GetRawConstantValue()); + } + } + + private void ReadClass(Type type, ModelTransferObject model, GeneratorOptions? caller) + { + // Logger.Trace($"Reflection read type {type.Name} ({type.Namespace})"); + if (type.BaseType != typeof(object) && type.BaseType != typeof(ValueType) && type.BaseType != null) + { + GeneratorOptions baseOptions = this.options.Get(type.BaseType); + if (!baseOptions.Ignore) { - model.HasUsing = false; - model.Namespace = null; + model.BasedOn = this.Read(type.BaseType, caller); } - else if (!model.FromSystem) + } + if (model.IsGeneric) + { + this.ReadGenericArguments(type, model); + } + + model.IsInterface = type.IsInterface; + model.IsAbstract = type.IsAbstract; + foreach (Type interFace in type.GetInterfaces(false)) + { + GeneratorOptions interfaceOptions = this.options.Get(interFace); + if (interfaceOptions.Ignore) { - transferObjects.Add(model); - this.ReadClass(type, model, transferObjects); + continue; } - if (model.Name == nameof(Nullable)) + ModelTransferObject interfaceTransferObject = this.Read(interFace, caller); + if (this.transferObjects.Contains(interfaceTransferObject)) { - model.IsNullable = true; + model.Interfaces.Add(interfaceTransferObject); } - if (!model.FromSystem && options?.ReplaceName != null) + } + if (model is GenericModelTransferObject genericModel) + { + Type genericType = type.GetGenericTypeDefinition(); + this.ReadConstants(genericType, genericModel.Template); + this.ReadFields(genericType, genericModel.Template); + this.ReadProperties(genericType, genericModel.Template); + this.ApplyGenericTemplate(type, genericModel); + } + else + { + this.ReadConstants(type, model); + this.ReadFields(type, model); + this.ReadProperties(type, model); + } + } + + private void ApplyGenericTemplate(Type type, GenericModelTransferObject model) + { + GeneratorOptions modelOptions = this.options.Get(model); + for (int index = 0; index < model.Template.Generics.Count; index++) + { + if (type.GenericTypeArguments.Length <= index) { - for (int index = 0; index < options.ReplaceName.Count; index++) - { - string replaceName = options.ReplaceName[index]; - string replaceWith = options.ReplaceWithName?.Skip(index).FirstOrDefault() ?? string.Empty; - model.Name = model.Name.Replace(replaceName, replaceWith); - } + break; } - return model; + string alias = model.Template.Generics[index].Alias.Name; + ModelTransferObject argument = this.Read(type.GenericTypeArguments[index], modelOptions); + this.ApplyGenericTemplate(model, alias, argument); } + } - private void ReadArray(Type type, ModelTransferObject model, List transferObjects) + private void ApplyGenericTemplate(TypeTransferObject target, string alias, TypeTransferObject type) + { + if (target is not GenericModelTransferObject) + { + return; + } + if (target is GenericModelTransferObject genericModel && genericModel.Generics.Count == 0) + { + genericModel.Template.Generics.Clone().ForEach(genericModel.Generics.Add); + genericModel.Template.Constants.Clone().ForEach(genericModel.Constants.Add); + genericModel.Template.Fields.Clone().ForEach(genericModel.Fields.Add); + genericModel.Template.Properties.Clone().ForEach(genericModel.Properties.Add); + } + GenericAliasTransferObject? aliasedGeneric = target.Generics.SingleOrDefault(x => x.Alias?.Name == alias); + if (aliasedGeneric?.Type != null) + { + return; + } + if (aliasedGeneric != null) + { + aliasedGeneric.Type = type; + } + if (target is ModelTransferObject model) { - Logger.Trace($"Reflection read array {type.Name} ({type.Namespace})"); - model.Name = "Array"; - model.IsGeneric = true; - model.HasUsing = false; - model.Generics.Add(new GenericAliasTransferObject { Type = this.Read(type.GetElementType(), transferObjects) }); + model.Constants.ForEach(x => this.ApplyGenericTemplate(x, alias, type)); + model.Fields.ForEach(x => this.ApplyGenericTemplate(x, alias, type)); + model.Properties.ForEach(x => this.ApplyGenericTemplate(x, alias, type)); } + } - private void ReadGenericFromSystem(Type type, ModelTransferObject model, List transferObjects) + private void ApplyGenericTemplate(MemberTransferObject field, string alias, TypeTransferObject type) + { + if (field.Type.Name == alias) { - Logger.Trace($"Reflection read generic system type {type.Name}<{string.Join(",", type.GetGenericArguments().Select(x => x.Name))}> ({type.Namespace})"); - foreach (Type argument in type.GenericTypeArguments) - { - model.Generics.Add(new GenericAliasTransferObject{ Type = this.Read(argument, transferObjects)}); - } + field.Type = type; } + else + { + this.ApplyGenericTemplate(field.Type, alias, type); + } + } - private void ReadEnum(Type type, ModelTransferObject model) + private void ReadProperties(Type type, ModelTransferObject model) + { + PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (PropertyInfo property in properties) { - Logger.Trace($"Reflection read enum {type.Name} ({type.Namespace})"); - model.IsEnum = true; - model.EnumValues = new Dictionary(); - Array values = Enum.GetValues(type); - foreach (object value in values) + if (this.ParentHasMember(property, model.BasedOn)) { - if (!(value is int)) - { - //throw new InvalidOperationException($"Can not convert {value.GetType().Name} enums. Only int enums are currently implemented"); - } + Logger.Warning($"Property '{property.Name}' skipped. It is already defined on parent '{model.BasedOn.Name}' or its parent"); + continue; } - foreach (int value in values.Cast()) + GeneratorOptions propertyOptions = this.options.Get(property); + if (propertyOptions.Ignore) { - string name = Enum.GetName(type, value); - if (name != null) - { - model.EnumValues.Add(name, value); - } + continue; } + bool isRequired = property.CustomAttributes.Any(x => x.AttributeType.FullName == "System.ComponentModel.DataAnnotations.RequiredAttribute"); + bool isNullable = (!property.PropertyType.IsValueType && propertyOptions.Nullable + && property.CustomAttributes.All(x => x.AttributeType.FullName != "System.Runtime.CompilerServices.NullableAttribute")) + || (!propertyOptions.Nullable && !property.PropertyType.IsValueType) + || (property.PropertyType.IsGenericType && property.PropertyType.GetGenericTypeDefinition() == typeof(Nullable<>)); + PropertyTransferObject propertyTransferObject = new() + { + Name = property.Name, + Type = this.Read(propertyOptions.ReturnType, propertyOptions) ?? this.Read(property.PropertyType, propertyOptions), + DeclaringType = model, + Attributes = property.GetCustomAttributes().ToTransferObjects().ToList(), + IsAbstract = property.GetMethod?.IsAbstract ?? property.SetMethod?.IsAbstract ?? false, + IsVirtual = property.GetMethod?.IsVirtual ?? property.SetMethod?.IsVirtual ?? false, + IsOverwrite = property.GetMethod?.GetBaseDefinition() != property.GetMethod || property.SetMethod?.GetBaseDefinition() != property.SetMethod, + IsRequired = isRequired, + IsNullable = isNullable, + IsOptional = /*propertyOptions.NoOptional*/ !isRequired && isNullable, + Default = this.ReadDefaultValue(property, propertyOptions) + }; + this.options.Map(propertyTransferObject, () => this.options.Get(property, null)); + propertyTransferObject.Type = this.Read(property.PropertyType.IgnoreGeneric(typeof(Nullable<>)), propertyOptions); + model.Properties.Add(propertyTransferObject); } + } - private void ReadClass(Type type, ModelTransferObject model, List transferObjects) + private void ReadFields(Type type, ModelTransferObject model) + { + FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); + foreach (FieldInfo field in fields) { - Logger.Trace($"Reflection read type {type.Name} ({type.Namespace})"); - if (type.BaseType != typeof(object) && type.BaseType != typeof(ValueType) && type.BaseType != null) + if (this.ParentHasMember(field, model.BasedOn)) { - GenerateIgnoreAttribute baseTypeAttribute = type.BaseType.GetCustomAttribute(); - if (baseTypeAttribute == null && !IgnoreTypeHelper.IgnoredTypes.Contains(type.BaseType)) - { - model.BasedOn = this.Read(type.BaseType, transferObjects); - } + Logger.Warning($"Field '{field.Name}' skipped. It is already defined on parent '{model.BasedOn.Name}' or its parent"); + continue; } - if (type.IsGenericType) + GeneratorOptions fieldOptions = this.options.Get(field); + if (fieldOptions.Ignore) { - type = this.ReadGenericArguments(type, model, transferObjects); + continue; } + FieldTransferObject fieldTransferObject = new() + { + Name = field.Name, + Type = this.Read(field.FieldType, fieldOptions), + DeclaringType = model, + Attributes = field.GetCustomAttributes().ToTransferObjects().ToList(), + IsOptional = !fieldOptions.NoOptional && !field.GetCustomAttributes().Any(attribute => attribute.GetType().Name.Equals("RequiredAttribute")), + Default = this.ReadDefaultValue(field, fieldOptions) + }; + this.options.Map(fieldTransferObject, () => this.options.Get(field, null)); + model.Fields.Add(fieldTransferObject); + } + } - model.IsInterface = type.IsInterface; - model.IsAbstract = type.IsAbstract; - foreach (Type interFace in type.GetInterfaces(false)) - { - GenerateIgnoreAttribute ignoreAttribute = interFace.GetCustomAttribute(); - if (ignoreAttribute != null || IgnoreTypeHelper.IgnoredTypes.Contains(interFace)) - { - continue; - } - ModelTransferObject interfaceTransferObject = this.Read(interFace, transferObjects); - if (transferObjects.Contains(interfaceTransferObject)) - { - model.Interfaces.Add(interfaceTransferObject); - } - } - FieldInfo[] constants = type.GetFields(BindingFlags.Public | BindingFlags.Static); - foreach (FieldInfo field in constants) - { - GenerateIgnoreAttribute ignoreAttribute = field.GetCustomAttribute(); - if (ignoreAttribute != null) - { - continue; - } - FieldTransferObject fieldTransferObject = new FieldTransferObject - { - Name = field.Name, - Type = this.Read(field.FieldType, transferObjects), - Default = field.GetValue(null) - }; - model.Constants.Add(fieldTransferObject); - } + private bool ParentHasMember(MemberInfo member, ModelTransferObject? parent) + { + if (parent == null) + { + return false; + } + if (parent.Fields.Any(field => field.Name.Equals(member.Name, StringComparison.CurrentCultureIgnoreCase)) + || parent.Properties.Any(property => property.Name.Equals(member.Name, StringComparison.CurrentCultureIgnoreCase))) + { + return true; + } + return this.ParentHasMember(member, parent.BasedOn); + } - FieldInfo[] fields = type.GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - foreach (FieldInfo field in fields) - { - GenerateIgnoreAttribute ignoreAttribute = field.GetCustomAttribute(); - if (ignoreAttribute != null) - { - continue; - } - FieldTransferObject fieldTransferObject = new FieldTransferObject - { - Name = field.Name, - Type = this.Read(field.FieldType, transferObjects) - }; - model.Fields.Add(fieldTransferObject); - } - PropertyInfo[] properties = type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.DeclaredOnly); - foreach (PropertyInfo property in properties) + private void ReadConstants(Type type, ModelTransferObject model) + { + FieldInfo[] constants = type.GetFields(BindingFlags.Public | BindingFlags.Static); + foreach (FieldInfo field in constants) + { + GeneratorOptions fieldOptions = this.options.Get(field); + if (fieldOptions.Ignore) { - GenerateIgnoreAttribute ignoreAttribute = property.GetCustomAttribute(); - if (ignoreAttribute != null) - { - continue; - } - PropertyTransferObject propertyTransferObject = new PropertyTransferObject - { - Name = property.Name, - Type = this.Read(property.PropertyType, transferObjects), - Attributes = property.GetCustomAttributes().ToTransferObjects().ToList() - }; - model.Properties.Add(propertyTransferObject); + continue; } + object? defaultValue = this.ReadDefaultValue(field, fieldOptions); + FieldTransferObject fieldTransferObject = new() + { + Name = field.Name, + Type = this.Read(field.FieldType, fieldOptions), + DeclaringType = model, + Default = defaultValue, + IsOptional = defaultValue == null + }; + this.options.Map(fieldTransferObject, () => this.options.Get(field, null)); + model.Constants.Add(fieldTransferObject); } + } - private Type ReadGenericArguments(Type type, ModelTransferObject model, List transferObjects) + private void ReadGenericArguments(Type type, TypeTransferObject model) + { + model = model is GenericModelTransferObject genericModel ? genericModel.Template : model; + Type genericType = type.GetGenericTypeDefinition(); + model.Generics.Clear(); + if (genericType is TypeInfo typeInfo) { - Type genericType = type.GetGenericTypeDefinition(); - model.Generics.Clear(); - if (genericType is TypeInfo typeInfo) + foreach (Type alias in typeInfo.GenericTypeParameters) { - for (int index = 0; index < typeInfo.GenericTypeParameters.Length; index++) - { - Type alias = typeInfo.GenericTypeParameters[index]; - Type argument = type.GenericTypeArguments[index]; - model.Generics.Add(new GenericAliasTransferObject - { - Alias = this.Read(alias, transferObjects), - Type = this.Read(argument, transferObjects) - }); - } - type = genericType; + model.Generics.Add(new GenericAliasTransferObject { Alias = this.Read(alias) }); } - else - { - throw new InvalidOperationException("Internal Error l2sl3: Type is not a TypeInfo"); - } - return type; } + else + { + throw new InvalidOperationException("Internal Error l2sl3: Type is not a TypeInfo"); + } + } + + private object? ReadDefaultValue(MemberInfo memberInfo, GeneratorOptions memberOptions) + { + object? defaultValue = memberInfo.GetCustomAttribute()?.Value; + if (defaultValue is Type defaultType) + { + return this.Read(defaultType, memberOptions); + } + if (defaultValue != null) + { + return defaultValue; + } + if (memberInfo is FieldInfo fieldInfo && (fieldInfo.IsLiteral || fieldInfo.IsStatic)) + { + return memberInfo.DeclaringType?.GetField(memberInfo.Name)?.GetValue(null); + } + return null; } } diff --git a/Reflection/Readers/ReflectionReader.cs b/Reflection/Readers/ReflectionReader.cs index cac24015..93119b24 100644 --- a/Reflection/Readers/ReflectionReader.cs +++ b/Reflection/Readers/ReflectionReader.cs @@ -1,37 +1,42 @@ -using System; -using System.Collections.Generic; -using KY.Core; -using KY.Generator.Configurations; +using KY.Core; using KY.Generator.Reflection.Configurations; using KY.Generator.Transfer; using KY.Generator.Transfer.Readers; -namespace KY.Generator.Reflection.Readers +namespace KY.Generator.Reflection.Readers; + +internal class ReflectionReader : ITransferReader { - internal class ReflectionReader : ITransferReader + private readonly ReflectionModelReader modelReader; + private readonly Options options; + + public ReflectionReader(ReflectionModelReader modelReader, Options options) { - private readonly ReflectionModelReader modelReader; + this.modelReader = modelReader; + this.options = options; + } - public ReflectionReader(ReflectionModelReader modelReader) + public void Read(ReflectionReadConfiguration configuration, GeneratorOptions? caller = null) + { + Type type = GeneratorTypeLoader.Get(configuration.Assembly, configuration.Namespace, configuration.Name); + if (type == null) { - this.modelReader = modelReader; + Logger.Trace($"Class {configuration.Namespace}.{configuration.Name} not found"); + return; } - - public void Read(ConfigurationBase configurationBase, List transferObjects) + try { - ReflectionReadConfiguration configuration = (ReflectionReadConfiguration)configurationBase; - Type type = GeneratorTypeLoader.Get(configuration.Assembly, configuration.Namespace, configuration.Name); - if (type == null) + ModelTransferObject selfModel = this.modelReader.Read(type, caller); + GeneratorOptions modelOptions = this.options.Get(selfModel); + if (configuration.OnlySubTypes || modelOptions.OnlySubTypes) { - Logger.Trace($"Class {configuration.Namespace}.{configuration.Name} not found"); - return; - } - ModelTransferObject selfModel = this.modelReader.Read(type, transferObjects); - if (configuration.SkipSelf) - { - transferObjects.Remove(selfModel); - Logger.Trace($"{selfModel.Name} ({selfModel.Namespace}) skipped through configuration"); + modelOptions.OnlySubTypes = true; } } + catch + { + Logger.Warning("Reflection reader could not read " + type.FullName); + throw; + } } } diff --git a/Reflection/ReflectionModule.cs b/Reflection/ReflectionModule.cs index ce7faafc..6a5947b7 100644 --- a/Reflection/ReflectionModule.cs +++ b/Reflection/ReflectionModule.cs @@ -1,37 +1,32 @@ using KY.Core.Dependency; using KY.Core.Module; using KY.Generator.Command; -using KY.Generator.Configuration; using KY.Generator.Mappings; using KY.Generator.Reflection.Commands; -using KY.Generator.Reflection.Configurations; using KY.Generator.Reflection.Extensions; using KY.Generator.Reflection.Readers; using KY.Generator.Reflection.Writers; -namespace KY.Generator.Reflection +namespace KY.Generator.Reflection; + +public class ReflectionModule : ModuleBase { - public class ReflectionModule : ModuleBase + public ReflectionModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public ReflectionModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().ToSelf(); - this.DependencyResolver.Bind().ToSelf(); - this.DependencyResolver.Bind().ToSelf(); - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - } + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Get().Register(ReflectionCommand.Names); + this.DependencyResolver.Get().Register(AnnotationCommand.Names); + this.DependencyResolver.Get().Register(ReflectionReadCommand.Names); + this.DependencyResolver.Get().Register(ReflectionWriteCommand.Names); + } - public override void Initialize() - { - //this.DependencyResolver.Bind().ToSingleton(); - this.DependencyResolver.Get().Initialize(); - //StaticResolver.GeneratorConfiguration = this.DependencyResolver.Get(); - this.DependencyResolver.Get() - .Map("reflection") - .Map("reflection"); - } + public override void Initialize() + { + //this.DependencyResolver.Bind().ToSingleton(); + this.DependencyResolver.Get().Initialize(); + //StaticResolver.GeneratorConfiguration = this.DependencyResolver.Get(); } } diff --git a/Reflection/Writers/ReflectionWriter.cs b/Reflection/Writers/ReflectionWriter.cs index 5b6718ab..6fe0a8e1 100644 --- a/Reflection/Writers/ReflectionWriter.cs +++ b/Reflection/Writers/ReflectionWriter.cs @@ -1,11 +1,4 @@ -using System; -using System.Collections.Generic; -using KY.Generator.Configurations; -using KY.Generator.Output; -using KY.Generator.Reflection.Configurations; -using KY.Generator.Templates; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Writers; +using KY.Generator.Transfer.Writers; namespace KY.Generator.Reflection.Writers { @@ -18,15 +11,14 @@ public ReflectionWriter(ModelWriter modelWriter) this.modelWriter = modelWriter; } - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) + public void FormatNames() { - ReflectionWriteConfiguration configuration = (ReflectionWriteConfiguration)configurationBase; - if (configuration.Language == null) - { - throw new InvalidOperationException($"Can not generate Reflection.Type for language {configuration.Language?.Name ?? "Empty"}"); - } - List files = this.modelWriter.Write(configuration, transferObjects); - files.ForEach(file => configuration.Language.Write(file, output)); + this.modelWriter.FormatNames(); + } + + public void Write(string relativePath) + { + this.modelWriter.Write(relativePath); } } -} \ No newline at end of file +} diff --git a/Sqlite.Tests/KY.Generator.Sqlite.Tests.csproj b/Sqlite.Tests/KY.Generator.Sqlite.Tests.csproj index 12fbe1b3..fe1c5518 100644 --- a/Sqlite.Tests/KY.Generator.Sqlite.Tests.csproj +++ b/Sqlite.Tests/KY.Generator.Sqlite.Tests.csproj @@ -4,6 +4,8 @@ net5.0 false + + latest diff --git a/Sqlite/Commands/SqliteReadDatabaseCommand.cs b/Sqlite/Commands/SqliteReadDatabaseCommand.cs index 480d7aa6..56d742a2 100644 --- a/Sqlite/Commands/SqliteReadDatabaseCommand.cs +++ b/Sqlite/Commands/SqliteReadDatabaseCommand.cs @@ -1,26 +1,24 @@ -using KY.Core; -using KY.Core.Dependency; +using KY.Core.Dependency; using KY.Generator.Command; using KY.Generator.Output; using KY.Generator.Sqlite.Readers; -namespace KY.Generator.Sqlite.Commands +namespace KY.Generator.Sqlite.Commands; + +public class SqliteReadDatabaseCommand : GeneratorCommand { - public class SqliteReadDatabaseCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "sqlite-read" }; + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(SqliteReadDatabaseCommand)), "sqlite-read"]; - public SqliteReadDatabaseCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public SqliteReadDatabaseCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) - { - string outputPath = output is FileOutput fileOutput ? fileOutput.BasePath : string.Empty; - this.resolver.Create().Read(this.Parameters, this.TransferObjects, outputPath); - return this.Success(); - } + public override IGeneratorCommandResult Run() + { + string outputPath = this.resolver.Get() is FileOutput fileOutput ? fileOutput.BasePath : string.Empty; + this.resolver.Create().Read(this.Parameters, outputPath); + return this.Success(); } } diff --git a/Sqlite/Commands/SqliteWriteRepositoryCommand.cs b/Sqlite/Commands/SqliteWriteRepositoryCommand.cs index d66fe648..2c179ec6 100644 --- a/Sqlite/Commands/SqliteWriteRepositoryCommand.cs +++ b/Sqlite/Commands/SqliteWriteRepositoryCommand.cs @@ -1,7 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; +using KY.Core; using KY.Core.Dependency; using KY.Generator.Command; using KY.Generator.Csharp.Languages; @@ -9,37 +6,33 @@ using KY.Generator.Sqlite.Transfer; using KY.Generator.Sqlite.Transfer.Readers; using KY.Generator.Sqlite.Writers; -using KY.Generator.Templates; -using KY.Generator.Transfer; -namespace KY.Generator.Sqlite.Commands +namespace KY.Generator.Sqlite.Commands; + +public class SqliteWriteRepositoryCommand : GeneratorCommand { - public class SqliteWriteRepositoryCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - private readonly SqliteModelReader modelReader; + private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "sqlite-repository" }; + public static string[] Names { get; } = [ToCommand(nameof(SqliteWriteRepositoryCommand)), "sqlite-repository"]; - public SqliteWriteRepositoryCommand(IDependencyResolver resolver, SqliteModelReader modelReader) - { - this.resolver = resolver; - this.modelReader = modelReader; - } + public SqliteWriteRepositoryCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) + public override IGeneratorCommandResult Run() + { + Type type = GeneratorTypeLoader.Get(this.Parameters.Assembly, this.Parameters.Namespace, this.Parameters.Name); + if (type == null) { - Type type = GeneratorTypeLoader.Get(this.Parameters.Assembly, this.Parameters.Namespace, this.Parameters.Name); - if (type == null) - { - Logger.Trace($"Class {this.Parameters.Namespace}.{this.Parameters.Name} not found"); - return this.Error(); - } - this.Parameters.OutputId = this.TransferObjects.OfType().FirstOrDefault()?.Value; - SqliteModelTransferObject model = this.modelReader.Read(type, this.TransferObjects); - List files = this.resolver.Create().Write(model, this.Parameters); - files.ForEach(file => CsharpLanguage.Instance.Write(file, output)); - return this.Success(); + Logger.Trace($"Class {this.Parameters.Namespace}.{this.Parameters.Name} not found"); + return this.Error(); } + GeneratorOptions options = this.resolver.Get().Get(); + options.Language = this.resolver.Get(); + SqliteModelTransferObject model = this.resolver.Create().Read(type); + this.resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); + this.resolver.Create().Write(model, this.Parameters); + return this.Success(); } } diff --git a/Sqlite/Commands/SqliteWriteRepositoryCommandParameters.cs b/Sqlite/Commands/SqliteWriteRepositoryCommandParameters.cs index 6b56a9be..c92c7033 100644 --- a/Sqlite/Commands/SqliteWriteRepositoryCommandParameters.cs +++ b/Sqlite/Commands/SqliteWriteRepositoryCommandParameters.cs @@ -9,6 +9,5 @@ public class SqliteWriteRepositoryCommandParameters : GeneratorCommandParameters public string Name { get; set; } public string Table { get; set; } public string ClassName { get; set; } - public Guid? OutputId { get; set; } } -} \ No newline at end of file +} diff --git a/Sqlite/Extensions/TypeMappingExtension.cs b/Sqlite/Extensions/TypeMappingExtension.cs index 00a4d694..d4d290d5 100644 --- a/Sqlite/Extensions/TypeMappingExtension.cs +++ b/Sqlite/Extensions/TypeMappingExtension.cs @@ -10,16 +10,17 @@ public static class TypeMappingExtension { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Map(SqliteLanguage.Instance).To(CsharpLanguage.Instance) + typeMapping.Map().To() .From(SqliteType.Real).To("double").FromSystem() .From(SqliteType.Numeric).To("double").FromSystem() .From(SqliteType.Integer).To("int").FromSystem() .From(SqliteType.Text).To("string").Nullable().FromSystem() .From(SqliteType.Blob).To("byte[]").Nullable().FromSystem(); - typeMapping.Map(ReflectionLanguage.Instance).To(SqliteLanguage.Instance) + typeMapping.Map().To() .From("System.Boolean").To(SqliteType.Integer) .From("System.Byte").To(SqliteType.Integer) + .From("System.SByte").To(SqliteType.Integer) .From("System.Char").To(SqliteType.Integer) .From("System.DateTime").To(SqliteType.Text) .From("System.Decimal").To(SqliteType.Integer) diff --git a/Sqlite/Fluent/Extensions/ReadFluentSyntaxExtension.cs b/Sqlite/Fluent/Extensions/ReadFluentSyntaxExtension.cs new file mode 100644 index 00000000..deb8a707 --- /dev/null +++ b/Sqlite/Fluent/Extensions/ReadFluentSyntaxExtension.cs @@ -0,0 +1,24 @@ +using System; +using KY.Core; +using KY.Generator.Sqlite.Fluent; +using KY.Generator.Syntax; + +// ReSharper disable once CheckNamespace : Easier usage on lower namespace +namespace KY.Generator +{ + public static class ReadFluentSyntaxExtension + { + /// + /// Executes the Sqlite read commands. Use at least one command! + /// + public static IReadFluentSyntax Sqlite(this IReadFluentSyntax syntax, Action action) + { + IReadFluentSyntaxInternal internalSyntax = (IReadFluentSyntaxInternal)syntax; + SqliteReadSyntax readSyntax = new(internalSyntax); + internalSyntax.Syntaxes.Add(readSyntax); + action(readSyntax); + readSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Sqlite)} action requires at least one command. E.g. '.{nameof(Sqlite)}(read => read.{nameof(ISqliteReadSyntax.UseConnectionString)}(...))'"); + return internalSyntax; + } + } +} diff --git a/Sqlite/Fluent/ReadFluentSyntaxExtension.cs b/Sqlite/Fluent/ReadFluentSyntaxExtension.cs deleted file mode 100644 index 7b0e1043..00000000 --- a/Sqlite/Fluent/ReadFluentSyntaxExtension.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System; -using KY.Generator.Sqlite.Fluent; -using KY.Generator.Syntax; - -// ReSharper disable once CheckNamespace : Easier usage on lower namespace -namespace KY.Generator -{ - public static class ReadFluentSyntaxExtension - { - public static IReadFluentOrSwitchToWriteSyntax Sqlite(this IReadFluentSyntax syntax, Action action) - { - action(new SqliteReadSyntax((IReadFluentSyntaxInternal)syntax)); - return (IReadFluentSyntaxInternal)syntax; - } - } -} diff --git a/Sqlite/Fluent/SqliteFromDatabaseSyntax.cs b/Sqlite/Fluent/SqliteFromDatabaseSyntax.cs index a7a7f713..400d188f 100644 --- a/Sqlite/Fluent/SqliteFromDatabaseSyntax.cs +++ b/Sqlite/Fluent/SqliteFromDatabaseSyntax.cs @@ -11,7 +11,7 @@ public class SqliteFromDatabaseSyntax : ISqliteFromDatabaseOrReadSyntax public SqliteFromDatabaseSyntax(SqliteReadSyntax syntax, string connectionString) { this.syntax = syntax; - this.command = new(this.syntax.Resolver); + this.command = this.syntax.Resolver.Create(); this.command.Parameters.ConnectionString = connectionString; this.syntax.Commands.Add(command); } diff --git a/Sqlite/Fluent/SqliteReadSyntax.cs b/Sqlite/Fluent/SqliteReadSyntax.cs index cddb3364..7db3c7da 100644 --- a/Sqlite/Fluent/SqliteReadSyntax.cs +++ b/Sqlite/Fluent/SqliteReadSyntax.cs @@ -1,17 +1,17 @@ -using System.Collections; -using System.Collections.Generic; +using System.Collections.Generic; using KY.Core.Dependency; using KY.Generator.Command; using KY.Generator.Syntax; namespace KY.Generator.Sqlite.Fluent { - public class SqliteReadSyntax : ISqliteReadSyntax + public class SqliteReadSyntax : ISqliteReadSyntax, IExecutableSyntax { private readonly IReadFluentSyntaxInternal syntax; public IDependencyResolver Resolver => this.syntax.Resolver; - public IList Commands => this.syntax.Commands; + + public List Commands { get; } = new(); public SqliteReadSyntax(IReadFluentSyntaxInternal syntax) { diff --git a/Sqlite/KY.Generator.Sqlite.csproj b/Sqlite/KY.Generator.Sqlite.csproj index 2b002aec..613d644e 100644 --- a/Sqlite/KY.Generator.Sqlite.csproj +++ b/Sqlite/KY.Generator.Sqlite.csproj @@ -1,40 +1,48 @@  netstandard2.0 + enable + enable KY-Programming KY-Programming - 7.6.0 + 10.0.0-preview.2 KY.Generator Sqlite Module for KY-Generator - Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png + assets\icon.png https://github.com/KY-Programming/generator - KY-Generator KY Generator Sqlite - 9 + KY-Generator KY.Generator Sqlite + latest true - {87b62d3e-939c-499a-ab71-5a7401da324f} - + {87b62d3e-939c-499a-ab71-5a7401da324f} + - ..\bin\Debug\ + ..\bin\Debug\ - ..\bin\Release\ + ..\bin\Release\ - - + + + + + + + - - - + + diff --git a/Sqlite/Readers/SqliteTableReader.cs b/Sqlite/Readers/SqliteTableReader.cs index 2ec6093a..e86a9845 100644 --- a/Sqlite/Readers/SqliteTableReader.cs +++ b/Sqlite/Readers/SqliteTableReader.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Text.RegularExpressions; +using System.Text.RegularExpressions; using KY.Core; using KY.Core.DataAccess; using KY.Generator.Sqlite.Commands; @@ -10,93 +7,101 @@ using KY.Generator.Transfer; using Microsoft.Data.Sqlite; -namespace KY.Generator.Sqlite.Readers +namespace KY.Generator.Sqlite.Readers; + +public class SqliteTableReader { - public class SqliteTableReader + private readonly List transferObjects; + private static readonly Regex connectionStringRegex = new(@".*Data\sSource=(?[^;]*).*"); + + public SqliteTableReader(List transferObjects) { - private static readonly Regex connectionStringRegex = new Regex(@".*Data\sSource=(?[^;]*).*"); + this.transferObjects = transferObjects; + } - public void Read(SqliteReadDatabaseCommandParameters parameters, List transferObjects, string outputPath) + public void Read(SqliteReadDatabaseCommandParameters parameters, string outputPath) + { + Match match = connectionStringRegex.Match(parameters.ConnectionString); + match.Success.AssertIs(true, "ConnectionString", "is not in valid format. Has to be like 'Data Source=my.db'"); + string originalFile = match.Groups["file"].Value; + string file = originalFile; + Logger.Trace($"Try to find sqlite database '{originalFile}'"); + if (!FileSystem.FileExists(file)) { - Match match = connectionStringRegex.Match(parameters.ConnectionString); - match.Success.AssertIs(true, "ConnectionString", "is not in valid format. Has to be like 'Data Source=my.db'"); - string originalFile = match.Groups["file"].Value; - string file = originalFile; - Logger.Trace($"Try to find sqlite database '{originalFile}'"); - if (!FileSystem.FileExists(file)) - { - file = FileSystem.Combine(outputPath, originalFile); - Logger.Trace($"Try to find sqlite database '{file}'"); - } - if (!FileSystem.FileExists(file)) - { - string fileName = FileSystem.GetFileName(file); - Logger.Trace($"Start wildcard search for {fileName}"); - string[] files = FileSystem.GetFiles(outputPath, fileName, SearchOption.AllDirectories); - if (files.Length > 0) - { - file = files.First(); - Logger.Trace($"Found in {file}"); - } - } - if (!FileSystem.FileExists(file)) + file = FileSystem.Combine(outputPath, originalFile); + Logger.Trace($"Try to find sqlite database '{file}'"); + } + if (!FileSystem.FileExists(file)) + { + string fileName = FileSystem.GetFileName(file); + Logger.Trace($"Start wildcard search for {fileName}"); + string[] files = FileSystem.GetFiles(outputPath, fileName, SearchOption.AllDirectories); + if (files.Length > 0) { - throw new FileNotFoundException("File not found. File has to be in source or output directory", originalFile); + file = files.First(); + Logger.Trace($"Found in {file}"); } - string connectionString = parameters.ConnectionString.Replace(originalFile, file); - using SqliteConnection connection = new(connectionString); - connection.Open(); - List tableNames = parameters.ReadAll ? this.ReadTables(connection).ToList() : parameters.Tables; - List statements = tableNames.SelectMany(tableName => - { - string sql = this.ReadTableSql(connection, tableName); - return SqliteParser.Parse(sql).OfType(); - }).ToList(); - foreach (SqliteCreateTable statement in statements) + } + if (!FileSystem.FileExists(file)) + { + throw new FileNotFoundException("File not found. File has to be in source or output directory", originalFile); + } + string connectionString = parameters.ConnectionString.Replace(originalFile, file); + using SqliteConnection connection = new(connectionString); + connection.Open(); + List tableNames = parameters.ReadAll ? this.ReadTables(connection).ToList() : parameters.Tables; + List statements = tableNames.SelectMany(tableName => + { + string sql = this.ReadTableSql(connection, tableName); + return SqliteParser.Parse(sql).OfType(); + }).ToList(); + foreach (SqliteCreateTable statement in statements) + { + ModelTransferObject model = new() + { + Name = statement.TableName, + Language = SqliteLanguage.Instance + }; + foreach (SqliteCreateTableColumn column in statement.Columns) { - ModelTransferObject model = new() - { - Name = statement.TableName, - Language = SqliteLanguage.Instance - }; - foreach (SqliteCreateTableColumn column in statement.Columns) - { - model.Fields.Add(new FieldTransferObject - { - Name = column.Name, - Type = new () - { - Name = column.Type, - IsNullable = column.Nullable - } - }); - } - transferObjects.Add(model); + TypeTransferObject fieldType = new() + { + Name = column.Type, + IsNullable = column.Nullable + }; + FieldTransferObject fieldTransferObject = new() + { + Name = column.Name, + Type = fieldType, + DeclaringType = model + }; + model.Fields.Add(fieldTransferObject); } + this.transferObjects.Add(model); } + } - private IEnumerable ReadTables(SqliteConnection connection) + private IEnumerable ReadTables(SqliteConnection connection) + { + using SqliteCommand command = connection.CreateCommand(); + command.CommandText = "SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%';"; + using SqliteDataReader reader = command.ExecuteReader(); + while (reader.Read()) { - using SqliteCommand command = connection.CreateCommand(); - command.CommandText = "SELECT name FROM sqlite_master WHERE type ='table' AND name NOT LIKE 'sqlite_%';"; - using SqliteDataReader reader = command.ExecuteReader(); - while (reader.Read()) - { - yield return reader.GetString(0); - } + yield return reader.GetString(0); } + } - private string ReadTableSql(SqliteConnection connection, string tableName) + private string ReadTableSql(SqliteConnection connection, string tableName) + { + using SqliteCommand command = connection.CreateCommand(); + command.CommandText = "SELECT sql FROM sqlite_master WHERE type ='table' AND name = @name;"; + command.Parameters.Add(new SqliteParameter("@name", tableName)); + using SqliteDataReader reader = command.ExecuteReader(); + while (reader.Read()) { - using SqliteCommand command = connection.CreateCommand(); - command.CommandText = "SELECT sql FROM sqlite_master WHERE type ='table' AND name = @name;"; - command.Parameters.Add(new SqliteParameter("@name", tableName)); - using SqliteDataReader reader = command.ExecuteReader(); - while (reader.Read()) - { - return reader.GetString(0); - } - return null; + return reader.GetString(0); } + return null; } } diff --git a/Sqlite/SqliteModule.cs b/Sqlite/SqliteModule.cs index 2753d414..e0602bea 100644 --- a/Sqlite/SqliteModule.cs +++ b/Sqlite/SqliteModule.cs @@ -4,24 +4,22 @@ using KY.Generator.Mappings; using KY.Generator.Sqlite.Commands; using KY.Generator.Sqlite.Extensions; -using KY.Generator.Sqlite.Readers; using KY.Generator.Sqlite.Transfer.Readers; -namespace KY.Generator.Sqlite +namespace KY.Generator.Sqlite; + +public class SqliteModule : ModuleBase { - public class SqliteModule : ModuleBase + public SqliteModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public SqliteModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().To(); - this.DependencyResolver.Bind().ToSelf(); - } + this.DependencyResolver.Get().Register(SqliteReadDatabaseCommand.Names); + this.DependencyResolver.Get().Register(SqliteWriteRepositoryCommand.Names); + this.DependencyResolver.Bind().ToSelf(); + } - public override void Initialize() - { - this.DependencyResolver.Get().Initialize(); - } + public override void Initialize() + { + this.DependencyResolver.Get().Initialize(); } } diff --git a/Sqlite/Transfer/Readers/SqliteModelReader.cs b/Sqlite/Transfer/Readers/SqliteModelReader.cs index 57eb166b..c5db9e35 100644 --- a/Sqlite/Transfer/Readers/SqliteModelReader.cs +++ b/Sqlite/Transfer/Readers/SqliteModelReader.cs @@ -1,23 +1,22 @@ using System; -using System.Collections.Generic; using KY.Generator.Reflection.Readers; using KY.Generator.Transfer; -namespace KY.Generator.Sqlite.Transfer.Readers +namespace KY.Generator.Sqlite.Transfer.Readers; + +public class SqliteModelReader { - public class SqliteModelReader - { - private readonly ReflectionModelReader modelReader; + private readonly ReflectionModelReader modelReader; - public SqliteModelReader(ReflectionModelReader modelReader) - { - this.modelReader = modelReader; - } + public SqliteModelReader(ReflectionModelReader modelReader) + { + this.modelReader = modelReader; + } - public SqliteModelTransferObject Read(Type type, List transferObjects) - { - ModelTransferObject model = this.modelReader.Read(type, transferObjects); - return new(model); - } + public SqliteModelTransferObject Read(Type type) + { + ModelTransferObject model = this.modelReader.Read(type); + SqliteModelTransferObject sqliteModel = new(model); + return sqliteModel; } } diff --git a/Sqlite/Transfer/SqlitePropertyTransferObject.cs b/Sqlite/Transfer/SqlitePropertyTransferObject.cs index 8ba69348..46f3a996 100644 --- a/Sqlite/Transfer/SqlitePropertyTransferObject.cs +++ b/Sqlite/Transfer/SqlitePropertyTransferObject.cs @@ -16,10 +16,5 @@ public SqlitePropertyTransferObject(PropertyTransferObject property) this.IsPrimaryKey = this.Attributes.IsPrimaryKey(); this.IsAutoIncrement = this.Attributes.IsAutoIncrement(); } - - public SqlitePropertyTransferObject Clone() - { - return new(this); - } } } diff --git a/Sqlite/Writers/SqliteRepositoryWriter.cs b/Sqlite/Writers/SqliteRepositoryWriter.cs index d3096f93..8ae8a1ae 100644 --- a/Sqlite/Writers/SqliteRepositoryWriter.cs +++ b/Sqlite/Writers/SqliteRepositoryWriter.cs @@ -14,250 +14,323 @@ using KY.Generator.Transfer.Extensions; using KY.Generator.Transfer.Writers; -namespace KY.Generator.Sqlite.Writers +namespace KY.Generator.Sqlite.Writers; + +public class SqliteRepositoryWriter : TransferWriter { - public class SqliteRepositoryWriter : TransferWriter + private readonly List files; + + private readonly Dictionary getMethodMapping = new() + { + { "System.Boolean", "GetBoolean" }, + { "System.Byte", "GetByte" }, + { "System.Char", "GetChar" }, + { "System.DateTime", "GetDateTime" }, + { "System.Decimal", "GetDecimal" }, + { "System.Double", "GetDouble" }, + { "System.Guid", "GetGuid" }, + { "System.Int16", "GetInt16" }, + { "System.Int32", "GetInt32" }, + { "System.Int64", "GetInt64" }, + { "System.Single", "GetFloat" }, + { "System.String", "GetString" }, + { "System.TimeSpan", "GetTimeSpan" } + }; + + public SqliteRepositoryWriter(Options options, ITypeMapping typeMapping, List files) + : base(options, typeMapping) { - private readonly Dictionary getMethodMapping = new() - { - { "System.Boolean", "GetBoolean" }, - { "System.Byte", "GetByte" }, - { "System.Char", "GetChar" }, - { "System.DateTime", "GetDateTime" }, - { "System.Decimal", "GetDecimal" }, - { "System.Double", "GetDouble" }, - { "System.Guid", "GetGuid" }, - { "System.Int16", "GetInt16" }, - { "System.Int32", "GetInt32" }, - { "System.Int64", "GetInt64" }, - { "System.Single", "GetFloat" }, - { "System.String", "GetString" }, - { "System.TimeSpan", "GetTimeSpan" } - }; + this.files = files; + } - public SqliteRepositoryWriter(ITypeMapping typeMapping) - : base(typeMapping) - { } + public void Write(SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + string repositoryName = parameters.ClassName ?? $"{model.Name}Repository"; + GeneratorOptions modelOptions = this.Options.Get(model); + ClassTemplate classTemplate = this.files.AddFile(parameters.RelativePath, modelOptions) + .WithName(Formatter.FormatFile(repositoryName, modelOptions)) + .AddNamespace(parameters.Namespace) + .AddClass(repositoryName) + .FormatName(modelOptions) + .FormatPrefix(modelOptions) + .WithUsing("Microsoft.Data.Sqlite"); - public List Write(SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) - { - List files = new(); - string repositoryName = parameters.ClassName ?? $"{model.Name}Repository"; - ClassTemplate classTemplate = files.AddFile(parameters.RelativePath, !parameters.SkipHeader, parameters.OutputId) - .AddNamespace(parameters.Namespace) - .AddClass(repositoryName) - .WithUsing("Microsoft.Data.Sqlite"); + FieldTemplate connectionField = classTemplate.AddField("connection", Code.Type("SqliteConnection")); + classTemplate.AddConstructor() + .WithParameter(connectionField.Type, connectionField.Name) + .WithCode(Code.This().Field(connectionField).Assign(Code.Local(connectionField.Name)).Close()); - FieldTemplate connectionField = classTemplate.AddField("connection", Code.Type("SqliteConnection")); - classTemplate.AddConstructor() - .WithParameter(connectionField.Type, connectionField.Name) - .WithCode(Code.This().Field(connectionField).Assign(Code.Local(connectionField.Name)).Close()); + model.Properties.ForEach(property => this.MapType(model.Language, SqliteLanguage.Instance, property.Type)); - model.Properties.ForEach(property => this.MapType(model.Language, SqliteLanguage.Instance, property.Type)); + this.WriteCreateTable(classTemplate, connectionField, model, parameters); + this.WriteDropTable(classTemplate, connectionField, model, parameters); + this.WriteGet(classTemplate, connectionField, model, parameters); + this.WriteInsert(classTemplate, connectionField, model, parameters); + this.WriteUpdate(classTemplate, connectionField, model, parameters); + this.WriteDelete(classTemplate, connectionField, model, parameters); + } - this.WriteCreateTable(classTemplate, connectionField, model, parameters); - this.WriteDropTable(classTemplate, connectionField, model, parameters); - this.WriteGet(classTemplate, connectionField, model, parameters); - this.WriteInsert(classTemplate, connectionField, model, parameters); - this.WriteUpdate(classTemplate, connectionField, model, parameters); - this.WriteDelete(classTemplate, connectionField, model, parameters); - return files; + private void WriteCreateTable(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); + if (columns.Count == 0) + { + return; } - - private void WriteCreateTable(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + StringBuilder sqlBuilder = new(); + sqlBuilder.AppendLine() + .AppendLine($"CREATE TABLE IF NOT EXISTS {parameters.Table ?? model.Name}") + .AppendLine("("); + SqlitePropertyTransferObject last = columns.Last(); + foreach (SqlitePropertyTransferObject property in columns) { - List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); - if (columns.Count == 0) + sqlBuilder.Append($" {property.Name} {property.Type.Name}"); + if (property.IsNotNull) { - return; + sqlBuilder.Append(" not null"); } - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - StringBuilder sqlBuilder = new(); - sqlBuilder.AppendLine() - .AppendLine($"CREATE TABLE IF NOT EXISTS {parameters.Table ?? model.Name}") - .AppendLine("("); - SqlitePropertyTransferObject last = columns.Last(); - foreach (SqlitePropertyTransferObject property in columns) + if (property.IsPrimaryKey) { - sqlBuilder.Append($" {property.Name} {property.Type.Name}"); - if (property.IsNotNull) - { - sqlBuilder.Append(" not null"); - } - if (property.IsPrimaryKey) - { - sqlBuilder.Append(" primary key"); - } - if (property.IsAutoIncrement) - { - sqlBuilder.Append(" autoincrement"); - } - if (property != last) - { - sqlBuilder.Append(","); - } - sqlBuilder.AppendLine(); + sqlBuilder.Append(" primary key"); } - - sqlBuilder.Append(");"); - classTemplate.AddMethod("CreateTable", Code.Void()) - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()) - .WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + if (property.IsAutoIncrement) + { + sqlBuilder.Append(" autoincrement"); + } + if (property != last) + { + sqlBuilder.Append(","); + } + sqlBuilder.AppendLine(); } - private void WriteDropTable(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + sqlBuilder.Append(");"); + classTemplate.AddMethod("CreateTable", Code.Void()) + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()) + .WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + } + + private void WriteDropTable(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + string sql = $"DROP TABLE IF EXISTS {parameters.Table ?? model.Name};"; + classTemplate.AddMethod("DropTable", Code.Void()) + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sql)).Close()) + .WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + } + + private void WriteGet(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + List columns = model.Properties.Where(x => x.Type.Original != null).ToList(); + if (columns.Count == 0) { - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - string sql = $"DROP TABLE IF EXISTS {parameters.Table ?? model.Name};"; - classTemplate.AddMethod("DropTable", Code.Void()) - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sql)).Close()) - .WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + return; } - - private void WriteGet(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + classTemplate.AddUsing("System.Collections.Generic"); + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + StringBuilder sqlBuilder = new(); + sqlBuilder.AppendLine(); + sqlBuilder.Append("SELECT "); + sqlBuilder.Append(string.Join(", ", columns.Select(column => column.Name))); + sqlBuilder.AppendLine(); + sqlBuilder.Append($"FROM {parameters.Table ?? model.Name}"); + GenericTypeTemplate returnType = Code.Generic("List", model.ToTemplate()); + MethodTemplate method = classTemplate.AddMethod("Get", returnType) + .WithParameter(Code.Type("string"), "filter", Code.Null()) + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); + method.WithCode(Code.Declare(returnType, "result", Code.New(returnType))); + method.WithCode(Code.If(Code.Not().Local("string").Method("IsNullOrEmpty", Code.Local("filter"))).WithCode( + Code.Local(command).Field("CommandText").AppendAssign(Code.String("\\nWHERE ").Append(Code.Local("filter"))).Close() + )); + method.WithCode(Code.Using(Code.Declare(Code.Type("SqliteDataReader"), "reader", Code.Local(command).Method("ExecuteReader")))); + MultilineCodeFragment whileCode = new(); + whileCode.AddLine(Code.Declare(model.ToTemplate(), "entry", Code.New(model.ToTemplate()))); + for (int index = 0; index < columns.Count; index++) { - List columns = model.Properties.Where(x => x.Type.Original != null).ToList(); - if (columns.Count == 0) + SqlitePropertyTransferObject column = columns[index]; + if (!this.getMethodMapping.ContainsKey(column.Type.Original.FullName)) { - return; + throw new InvalidOperationException($"Can not write reader method for column '{column.Name}'. No get method for type '{column.Type.Original.FullName}' found. Please contact the support team"); } - classTemplate.AddUsing("System.Collections.Generic"); - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - StringBuilder sqlBuilder = new(); - sqlBuilder.AppendLine(); - sqlBuilder.Append("SELECT "); - sqlBuilder.Append(string.Join(", ", columns.Select(column => column.Name))); - sqlBuilder.AppendLine(); - sqlBuilder.Append($"FROM {parameters.Table ?? model.Name}"); - GenericTypeTemplate returnType = Code.Generic("List", model.ToTemplate()); - MethodTemplate method = classTemplate.AddMethod("Get", returnType) - .WithParameter(Code.Type("string"), "filter", Code.Null()) - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); - method.WithCode(Code.Declare(returnType, "result", Code.New(returnType))); - method.WithCode(Code.If(Code.Not().Local("string").Method("IsNullOrEmpty", Code.Local("filter"))).WithCode( - Code.Local(command).Field("CommandText").AppendAssign(Code.String("\\nWHERE ").Append(Code.Local("filter"))).Close() - )); - method.WithCode(Code.Using(Code.Declare(Code.Type("SqliteDataReader"), "reader", Code.Local(command).Method("ExecuteReader")))); - MultilineCodeFragment whileCode = new(); - whileCode.AddLine(Code.Declare(model.ToTemplate(), "entry", Code.New(model.ToTemplate()))); - for (int index = 0; index < columns.Count; index++) + string getMethod = this.getMethodMapping[column.Type.Original.FullName]; + ICodeFragment getCode; + if (column.IsNotNull) { - SqlitePropertyTransferObject column = columns[index]; - if (!this.getMethodMapping.ContainsKey(column.Type.Original.FullName)) - { - throw new InvalidOperationException($"Can not write reader method for column '{column.Name}'. No get method for type '{column.Type.Original.FullName}' found. Please contact the support team"); - } - string getMethod = this.getMethodMapping[column.Type.Original.FullName]; - ICodeFragment getCode; - if (column.IsNotNull) - { - getCode = Code.Local("reader").Method(getMethod, Code.Number(index)); - } - else - { - getCode = Code.InlineIf( - Code.Local("reader").Method("IsDBNull", Code.Number(index)), - Code.Null(), - Code.Local("reader").Method(getMethod, Code.Number(index)) - ); - } - whileCode.AddLine(Code.Local("entry").Field(column.Name).Assign(getCode).Close()); + getCode = Code.Local("reader").Method(getMethod, Code.Number(index)); } - whileCode.AddLine(Code.Local("result").Method("Add", Code.Local("entry")).Close()); - - method.WithCode(Code.While(Code.Local("reader").Method("Read"), whileCode)); - method.WithCode(Code.Return(Code.Local("result"))); + else + { + getCode = Code.InlineIf( + Code.Local("reader").Method("IsDBNull", Code.Number(index)), + Code.Null(), + Code.Local("reader").Method(getMethod, Code.Number(index)) + ); + } + whileCode.AddLine(Code.Local("entry").Field(column.Name).Assign(getCode).Close()); } + whileCode.AddLine(Code.Local("result").Method("Add", Code.Local("entry")).Close()); + + method.WithCode(Code.While(Code.Local("reader").Method("Read"), whileCode)); + method.WithCode(Code.Return(Code.Local("result"))); + } - private void WriteInsert(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + private void WriteInsert(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + List columns = model.Properties.Where(p => !p.IsAutoIncrement && p.Type.Original != null).ToList(); + if (columns.Count == 0) + { + return; + } + SqlitePropertyTransferObject idColumn = model.Properties.FirstOrDefault(p => p.IsAutoIncrement && p.IsPrimaryKey && p.Type.Original != null); + bool isAutoIncrement = idColumn != null; + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + StringBuilder sqlBuilder = new(); + sqlBuilder.Append($"INSERT INTO {parameters.Table ?? model.Name} ("); + sqlBuilder.Append(string.Join(", ", columns.Select(column => column.Name))); + sqlBuilder.Append(") VALUES ("); + sqlBuilder.Append(string.Join(", ", columns.Select(column => $"@{column.Name.FirstCharToLower()}"))); + sqlBuilder.Append(");"); + if (isAutoIncrement) { - List columns = model.Properties.Where(p => !p.IsAutoIncrement && p.Type.Original != null).ToList(); - if (columns.Count == 0) + sqlBuilder.Append("\nSELECT last_insert_rowid();"); + } + MethodTemplate method = classTemplate.AddMethod("Insert", idColumn?.Type.Original.ToTemplate() ?? Code.Void()) + .WithParameter(model.ToTemplate(), "entry") + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); + foreach (SqlitePropertyTransferObject column in columns) + { + ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); + if (column.Type.Original.Name == nameof(Guid)) { - return; + classTemplate.AddUsing("System"); + valueCode = valueCode.CastTo().Method("ToString"); } - SqlitePropertyTransferObject idColumn = model.Properties.FirstOrDefault(p => p.IsAutoIncrement && p.IsPrimaryKey && p.Type.Original != null); - bool isAutoIncrement = idColumn != null; - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - StringBuilder sqlBuilder = new(); - sqlBuilder.Append($"INSERT INTO {parameters.Table ?? model.Name} ("); - sqlBuilder.Append(string.Join(", ", columns.Select(column => column.Name))); - sqlBuilder.Append(") VALUES ("); - sqlBuilder.Append(string.Join(", ", columns.Select(column => $"@{column.Name.FirstCharToLower()}"))); - sqlBuilder.Append(");"); - if (isAutoIncrement) + else if (!column.IsNotNull && (column.Type.Original?.IsNullable ?? column.Type.IsNullable)) { - sqlBuilder.Append("\nSELECT last_insert_rowid();"); + classTemplate.AddUsing("System"); + valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); } - MethodTemplate method = classTemplate.AddMethod("Insert", idColumn?.Type.Original.ToTemplate() ?? Code.Void()) - .WithParameter(model.ToTemplate(), "entry") - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); - foreach (SqlitePropertyTransferObject column in columns) + method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), + Code.String($"@{column.Name.FirstCharToLower()}"), + valueCode + )).Close()); + } + if (isAutoIncrement) + { + method.WithCode(Code.Return(Code.Cast(method.Type).Cast(Code.Type("long")).Local(command).Method("ExecuteScalar"))); + } + else + { + method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + } + } + + private void WriteUpdate(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); + if (columns.Count == 0 || columns.All(property => !property.IsPrimaryKey)) + { + return; + } + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + StringBuilder sqlBuilder = new(); + sqlBuilder.AppendLine() + .AppendLine($"UPDATE {parameters.Table ?? model.Name}"); + bool isFirst = true; + foreach (SqlitePropertyTransferObject column in columns.Where(p => !p.IsPrimaryKey)) + { + if (isFirst) { - ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); - if (column.Type.Original.Name == nameof(Guid)) - { - classTemplate.AddUsing("System"); - valueCode = valueCode.CastTo().Method("ToString"); - } - else if (!column.IsNotNull && (column.Type.Original?.IsNullable ?? column.Type.IsNullable)) - { - classTemplate.AddUsing("System"); - valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); - } - method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), - Code.String($"@{column.Name.FirstCharToLower()}"), - valueCode - )).Close()); + isFirst = false; + sqlBuilder.Append("SET "); } - if (isAutoIncrement) + else { - method.WithCode(Code.Return(Code.Cast(method.Type).Cast(Code.Type("long")).Local(command).Method("ExecuteScalar"))); + sqlBuilder.AppendLine(",") + .Append(" "); + } + sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); + } + isFirst = true; + foreach (SqlitePropertyTransferObject column in columns.Where(p => p.IsPrimaryKey)) + { + if (isFirst) + { + isFirst = false; + sqlBuilder.AppendLine() + .Append("WHERE "); } else { - method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + sqlBuilder.AppendLine(" AND") + .Append(" "); } + sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); } - - private void WriteUpdate(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + MethodTemplate method = classTemplate.AddMethod("Update", Code.Void()) + .WithParameter(model.ToTemplate(), "entry") + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); + foreach (SqlitePropertyTransferObject column in columns) { - List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); - if (columns.Count == 0 || columns.All(property => !property.IsPrimaryKey)) + ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); + if (!column.IsNotNull && column.Type.Original.IsNullable) { - return; + classTemplate.AddUsing("System"); + valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); } - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - StringBuilder sqlBuilder = new(); - sqlBuilder.AppendLine() - .AppendLine($"UPDATE {parameters.Table ?? model.Name}"); + method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), + Code.String($"@{column.Name.FirstCharToLower()}"), + valueCode + )).Close()); + } + method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + } + + private void WriteDelete(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + { + List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); + if (columns.Count == 0) + { + return; + } + bool hasPrimaryKey = columns.Any(property => property.IsPrimaryKey); + DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); + StringBuilder sqlBuilder = new(); + sqlBuilder.AppendLine() + .AppendLine($"DELETE FROM {parameters.Table ?? model.Name}"); + if (hasPrimaryKey) + { bool isFirst = true; - foreach (SqlitePropertyTransferObject column in columns.Where(p => !p.IsPrimaryKey)) + foreach (SqlitePropertyTransferObject column in columns.Where(p => p.IsPrimaryKey)) { if (isFirst) { isFirst = false; - sqlBuilder.Append("SET "); + sqlBuilder.Append("WHERE "); } else { - sqlBuilder.AppendLine(",") + sqlBuilder.AppendLine(" AND") .Append(" "); } sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); } - isFirst = true; - foreach (SqlitePropertyTransferObject column in columns.Where(p => p.IsPrimaryKey)) + } + else + { + bool isFirst = true; + foreach (SqlitePropertyTransferObject column in columns) { if (isFirst) { isFirst = false; - sqlBuilder.AppendLine() - .Append("WHERE "); + sqlBuilder.Append("WHERE "); } else { @@ -266,92 +339,24 @@ private void WriteUpdate(ClassTemplate classTemplate, FieldTemplate connectionFi } sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); } - MethodTemplate method = classTemplate.AddMethod("Update", Code.Void()) - .WithParameter(model.ToTemplate(), "entry") - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); - foreach (SqlitePropertyTransferObject column in columns) - { - ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); - if (!column.IsNotNull && column.Type.Original.IsNullable) - { - classTemplate.AddUsing("System"); - valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); - } - method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), - Code.String($"@{column.Name.FirstCharToLower()}"), - valueCode - )).Close()); - } - method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); } - - private void WriteDelete(ClassTemplate classTemplate, FieldTemplate connectionField, SqliteModelTransferObject model, SqliteWriteRepositoryCommandParameters parameters) + MethodTemplate method = classTemplate.AddMethod("Delete", Code.Void()) + .WithParameter(model.ToTemplate(), "entry") + .WithCode(Code.Using(command)) + .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); + foreach (SqlitePropertyTransferObject column in columns.Where(property => (hasPrimaryKey && property.IsPrimaryKey) || !hasPrimaryKey)) { - List columns = model.Properties.Where(p => p.Type.Original != null).ToList(); - if (columns.Count == 0) + ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); + if (!column.IsNotNull && (column.Type.Original?.IsNullable ?? column.Type.IsNullable)) { - return; + classTemplate.AddUsing("System"); + valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); } - bool hasPrimaryKey = columns.Any(property => property.IsPrimaryKey); - DeclareTemplate command = Code.Declare(Code.Type("SqliteCommand"), "command", Code.This().Field(connectionField).Method("CreateCommand")); - StringBuilder sqlBuilder = new(); - sqlBuilder.AppendLine() - .AppendLine($"DELETE FROM {parameters.Table ?? model.Name}"); - if (hasPrimaryKey) - { - bool isFirst = true; - foreach (SqlitePropertyTransferObject column in columns.Where(p => p.IsPrimaryKey)) - { - if (isFirst) - { - isFirst = false; - sqlBuilder.Append("WHERE "); - } - else - { - sqlBuilder.AppendLine(" AND") - .Append(" "); - } - sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); - } - } - else - { - bool isFirst = true; - foreach (SqlitePropertyTransferObject column in columns) - { - if (isFirst) - { - isFirst = false; - sqlBuilder.Append("WHERE "); - } - else - { - sqlBuilder.AppendLine(" AND") - .Append(" "); - } - sqlBuilder.Append($"{column.Name} = @{column.Name.FirstCharToLower()}"); - } - } - MethodTemplate method = classTemplate.AddMethod("Delete", Code.Void()) - .WithParameter(model.ToTemplate(), "entry") - .WithCode(Code.Using(command)) - .WithCode(Code.Local(command).Field("CommandText").Assign(Code.VerbatimString(sqlBuilder)).Close()); - foreach (SqlitePropertyTransferObject column in columns.Where(property => hasPrimaryKey && property.IsPrimaryKey || !hasPrimaryKey)) - { - ChainedCodeFragment valueCode = Code.Local("entry").Field(column.Name); - if (!column.IsNotNull && (column.Type.Original?.IsNullable ?? column.Type.IsNullable)) - { - classTemplate.AddUsing("System"); - valueCode = valueCode.NullCoalescing().Cast(Code.Type("object")).Local(nameof(DBNull)).Field("Value"); - } - method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), - Code.String($"@{column.Name.FirstCharToLower()}"), - valueCode - )).Close()); - } - method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); + method.WithCode(Code.Local(command).Field("Parameters").Method("Add", Code.New(Code.Type("SqliteParameter"), + Code.String($"@{column.Name.FirstCharToLower()}"), + valueCode + )).Close()); } + method.WithCode(Code.Local(command).Method("ExecuteNonQuery").Close()); } } diff --git a/Tests/AnnotationAsync/AngularAsync.cs b/Tests/AnnotationAsync/AngularAsync.cs index 62528efd..0b53884b 100644 --- a/Tests/AnnotationAsync/AngularAsync.cs +++ b/Tests/AnnotationAsync/AngularAsync.cs @@ -3,10 +3,9 @@ namespace AnnotationAsync { [GenerateAngularModel("Output")] - [GenerateOption(GenerateOption.SkipHeader)] [GenerateAsync] public class AngularAsync { public string Property { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationAsync/AnnotationAsync.csproj b/Tests/AnnotationAsync/AnnotationAsync.csproj index 8c022293..57f573f7 100644 --- a/Tests/AnnotationAsync/AnnotationAsync.csproj +++ b/Tests/AnnotationAsync/AnnotationAsync.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Tests/AnnotationAsync/AssemblyInfo.cs b/Tests/AnnotationAsync/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/AnnotationAsync/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/AnnotationAsync/AsyncTypes.cs b/Tests/AnnotationAsync/AsyncTypes.cs index 91e3d63d..a2c48b8f 100644 --- a/Tests/AnnotationAsync/AsyncTypes.cs +++ b/Tests/AnnotationAsync/AsyncTypes.cs @@ -5,7 +5,6 @@ namespace AnnotationAsync { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] [GenerateAsync] public class AsyncTypes { diff --git a/Tests/AnnotationAsync/NotAsyncType.cs b/Tests/AnnotationAsync/NotAsyncType.cs index b6ef30d9..6011a8ae 100644 --- a/Tests/AnnotationAsync/NotAsyncType.cs +++ b/Tests/AnnotationAsync/NotAsyncType.cs @@ -3,9 +3,8 @@ namespace AnnotationAsync { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] public class NotAsyncType { public string StringProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationAsyncAssembly/AnnotationAsyncAssembly.csproj b/Tests/AnnotationAsyncAssembly/AnnotationAsyncAssembly.csproj index 6b8c59ec..a56b8b8b 100644 --- a/Tests/AnnotationAsyncAssembly/AnnotationAsyncAssembly.csproj +++ b/Tests/AnnotationAsyncAssembly/AnnotationAsyncAssembly.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Tests/AnnotationAsyncAssembly/AssemblyInfo.cs b/Tests/AnnotationAsyncAssembly/AssemblyInfo.cs index eec907f2..fae5c7ae 100644 --- a/Tests/AnnotationAsyncAssembly/AssemblyInfo.cs +++ b/Tests/AnnotationAsyncAssembly/AssemblyInfo.cs @@ -1,3 +1,4 @@ using KY.Generator; -[assembly:GenerateAsync] \ No newline at end of file +[assembly:GenerateAsync] +[assembly:GenerateNoHeader] diff --git a/Tests/AnnotationAsyncAssembly/Class1.cs b/Tests/AnnotationAsyncAssembly/Class1.cs index b182d6c0..1be7b568 100644 --- a/Tests/AnnotationAsyncAssembly/Class1.cs +++ b/Tests/AnnotationAsyncAssembly/Class1.cs @@ -4,7 +4,6 @@ namespace AnnotationAsyncAssembly { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] public class Class1 { public string StringProperty { get; set; } diff --git a/Tests/AnnotationAsyncAssembly/Class2.cs b/Tests/AnnotationAsyncAssembly/Class2.cs index 414941c2..ca02870f 100644 --- a/Tests/AnnotationAsyncAssembly/Class2.cs +++ b/Tests/AnnotationAsyncAssembly/Class2.cs @@ -3,9 +3,8 @@ namespace AnnotationAsyncAssembly { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] public class Class2 { public string StringProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationAsyncAssembly/Output/class-1.ts b/Tests/AnnotationAsyncAssembly/Output/class-1.ts index bf04bbae..b6530e58 100644 --- a/Tests/AnnotationAsyncAssembly/Output/class-1.ts +++ b/Tests/AnnotationAsyncAssembly/Output/class-1.ts @@ -2,7 +2,7 @@ // tslint:disable export class Class1 { - public stringProperty: string; + public stringProperty?: string; } // outputid:01f469b8-5361-4a82-8512-fa7fefe14fc4 diff --git a/Tests/AnnotationAsyncAssembly/Output/class-2.ts b/Tests/AnnotationAsyncAssembly/Output/class-2.ts index d9d0509a..72269dcc 100644 --- a/Tests/AnnotationAsyncAssembly/Output/class-2.ts +++ b/Tests/AnnotationAsyncAssembly/Output/class-2.ts @@ -2,7 +2,7 @@ // tslint:disable export class Class2 { - public stringProperty: string; + public stringProperty?: string; } // outputid:01f469b8-5361-4a82-8512-fa7fefe14fc4 diff --git a/Tests/AnnotationInNestedClass/AnnotationInNestedClass.csproj b/Tests/AnnotationInNestedClass/AnnotationInNestedClass.csproj index 6abb73f0..a0a26bfa 100644 --- a/Tests/AnnotationInNestedClass/AnnotationInNestedClass.csproj +++ b/Tests/AnnotationInNestedClass/AnnotationInNestedClass.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Tests/AnnotationInNestedClass/AssemblyInfo.cs b/Tests/AnnotationInNestedClass/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/AnnotationInNestedClass/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/AnnotationInNestedClass/Class1.cs b/Tests/AnnotationInNestedClass/Class1.cs index 67594da3..87481a31 100644 --- a/Tests/AnnotationInNestedClass/Class1.cs +++ b/Tests/AnnotationInNestedClass/Class1.cs @@ -5,8 +5,7 @@ namespace AnnotationInNestedClass public class Class1 { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] public class Class2 { } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationsWithMultipleOutputs/AnnotationsWithMultipleOutputs.csproj b/Tests/AnnotationsWithMultipleOutputs/AnnotationsWithMultipleOutputs.csproj index dbb86912..2f087ade 100644 --- a/Tests/AnnotationsWithMultipleOutputs/AnnotationsWithMultipleOutputs.csproj +++ b/Tests/AnnotationsWithMultipleOutputs/AnnotationsWithMultipleOutputs.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Tests/AnnotationsWithMultipleOutputs/FirstType.cs b/Tests/AnnotationsWithMultipleOutputs/FirstType.cs index 317090c6..d1eca4b8 100644 --- a/Tests/AnnotationsWithMultipleOutputs/FirstType.cs +++ b/Tests/AnnotationsWithMultipleOutputs/FirstType.cs @@ -3,10 +3,10 @@ namespace AnnotationsWithMultipleOutputs { [GenerateAngularModel("Output\\First")] - [GenerateOption(GenerateOption.SkipHeader)] + [GenerateNoHeader] public class FirstType { public string StringProperty { get; set; } public SubType SubTypeProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/First/first-type.ts b/Tests/AnnotationsWithMultipleOutputs/Output/First/first-type.ts index 2d1f2441..97036768 100644 --- a/Tests/AnnotationsWithMultipleOutputs/Output/First/first-type.ts +++ b/Tests/AnnotationsWithMultipleOutputs/Output/First/first-type.ts @@ -4,8 +4,8 @@ import { SubType } from "./sub-type"; export class FirstType { - public stringProperty: string; - public subTypeProperty: SubType; + public stringProperty?: string; + public subTypeProperty?: SubType; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/First/index.ts b/Tests/AnnotationsWithMultipleOutputs/Output/First/index.ts new file mode 100644 index 00000000..d59fc8c5 --- /dev/null +++ b/Tests/AnnotationsWithMultipleOutputs/Output/First/index.ts @@ -0,0 +1,4 @@ + +export * from "./first-type"; +export * from "./sub-type"; + diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/First/sub-type.ts b/Tests/AnnotationsWithMultipleOutputs/Output/First/sub-type.ts index e24ed5e5..0991be50 100644 --- a/Tests/AnnotationsWithMultipleOutputs/Output/First/sub-type.ts +++ b/Tests/AnnotationsWithMultipleOutputs/Output/First/sub-type.ts @@ -2,7 +2,7 @@ // tslint:disable export class SubType { - public stringProperty: string; + public stringProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/Second/index.ts b/Tests/AnnotationsWithMultipleOutputs/Output/Second/index.ts new file mode 100644 index 00000000..5969fa82 --- /dev/null +++ b/Tests/AnnotationsWithMultipleOutputs/Output/Second/index.ts @@ -0,0 +1,4 @@ + +export * from "./second-type"; +export * from "./sub-type"; + diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/Second/second-type.ts b/Tests/AnnotationsWithMultipleOutputs/Output/Second/second-type.ts index 1a5029fd..e34862eb 100644 --- a/Tests/AnnotationsWithMultipleOutputs/Output/Second/second-type.ts +++ b/Tests/AnnotationsWithMultipleOutputs/Output/Second/second-type.ts @@ -4,8 +4,8 @@ import { SubType } from "./sub-type"; export class SecondType { - public stringProperty: string; - public subTypeProperty: SubType; + public stringProperty?: string; + public subTypeProperty?: SubType; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/Second/sub-type.ts b/Tests/AnnotationsWithMultipleOutputs/Output/Second/sub-type.ts index e24ed5e5..0991be50 100644 --- a/Tests/AnnotationsWithMultipleOutputs/Output/Second/sub-type.ts +++ b/Tests/AnnotationsWithMultipleOutputs/Output/Second/sub-type.ts @@ -2,7 +2,7 @@ // tslint:disable export class SubType { - public stringProperty: string; + public stringProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/AnnotationsWithMultipleOutputs/Output/Third/third-type.ts b/Tests/AnnotationsWithMultipleOutputs/Output/Third/third-type.ts index fd7db6bb..70dff1a2 100644 --- a/Tests/AnnotationsWithMultipleOutputs/Output/Third/third-type.ts +++ b/Tests/AnnotationsWithMultipleOutputs/Output/Third/third-type.ts @@ -2,7 +2,7 @@ // tslint:disable export class ThirdType { - public stringProperty: string; + public stringProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/AnnotationsWithMultipleOutputs/SecondType.cs b/Tests/AnnotationsWithMultipleOutputs/SecondType.cs index 601d60af..61cb75d5 100644 --- a/Tests/AnnotationsWithMultipleOutputs/SecondType.cs +++ b/Tests/AnnotationsWithMultipleOutputs/SecondType.cs @@ -3,10 +3,10 @@ namespace AnnotationsWithMultipleOutputs { [GenerateAngularModel("Output\\Second")] - [GenerateOption(GenerateOption.SkipHeader)] + [GenerateNoHeader] public class SecondType { public string StringProperty { get; set; } public SubType SubTypeProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/AnnotationsWithMultipleOutputs/ThirdType.cs b/Tests/AnnotationsWithMultipleOutputs/ThirdType.cs index bbaaee53..a9272eb8 100644 --- a/Tests/AnnotationsWithMultipleOutputs/ThirdType.cs +++ b/Tests/AnnotationsWithMultipleOutputs/ThirdType.cs @@ -3,9 +3,9 @@ namespace AnnotationsWithMultipleOutputs { [GenerateAngularModel("Output\\Third")] - [GenerateOption(GenerateOption.SkipHeader)] + [GenerateNoHeader] public class ThirdType { public string StringProperty { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/Caseing.Generator/Caseing.Generator.csproj b/Tests/Caseing.Generator/Caseing.Generator.csproj new file mode 100644 index 00000000..8187682d --- /dev/null +++ b/Tests/Caseing.Generator/Caseing.Generator.csproj @@ -0,0 +1,18 @@ + + + + net5.0 + {f7601c4b-055c-4bd5-a087-b514d1dde023} + + + + + + + + + + + + + diff --git a/Tests/Caseing.Generator/GeneratorMain.cs b/Tests/Caseing.Generator/GeneratorMain.cs new file mode 100644 index 00000000..61f5669e --- /dev/null +++ b/Tests/Caseing.Generator/GeneratorMain.cs @@ -0,0 +1,14 @@ +using KY.Generator; + +namespace Caseing.Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read.Reflection(reflection => reflection.FromType())) + .SetType(config => config.FormatNames(false)) + .Write(write => write.Angular(angular => angular.Models(config => config.OutputPath("Output").NoHeader()))); + } + } +} diff --git a/Tests/Caseing.Generator/Output/case-me.ts b/Tests/Caseing.Generator/Output/case-me.ts new file mode 100644 index 00000000..3b3c9970 --- /dev/null +++ b/Tests/Caseing.Generator/Output/case-me.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class CaseMe { + public stringProperty?: string; + public s1: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f7601c4b-055c-4bd5-a087-b514d1dde023 diff --git a/Tests/Caseing.Generator/Output/index.ts b/Tests/Caseing.Generator/Output/index.ts new file mode 100644 index 00000000..5673c4a2 --- /dev/null +++ b/Tests/Caseing.Generator/Output/index.ts @@ -0,0 +1,5 @@ + +export * from "./case-me"; +export * from "./keep-my-case"; +export * from "./mixed-caseing"; + diff --git a/Tests/Caseing.Generator/Output/keep-my-case.ts b/Tests/Caseing.Generator/Output/keep-my-case.ts new file mode 100644 index 00000000..7f1b7b4a --- /dev/null +++ b/Tests/Caseing.Generator/Output/keep-my-case.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class KeepMyCase { + public StringProperty?: string; + public Number_Property?: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f7601c4b-055c-4bd5-a087-b514d1dde023 diff --git a/Tests/Caseing.Generator/Output/mixed-caseing.ts b/Tests/Caseing.Generator/Output/mixed-caseing.ts new file mode 100644 index 00000000..3a71a4f6 --- /dev/null +++ b/Tests/Caseing.Generator/Output/mixed-caseing.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +import { CaseMe } from "./case-me"; +import { KeepMyCase } from "./keep-my-case"; + +export class MixedCaseing { + public caseMe?: CaseMe; + public keepMyCase?: KeepMyCase; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f7601c4b-055c-4bd5-a087-b514d1dde023 diff --git a/Tests/Caseing.sln b/Tests/Caseing.sln new file mode 100644 index 00000000..6944da91 --- /dev/null +++ b/Tests/Caseing.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Caseing", "Caseing\Caseing.csproj", "{A3ACF52A-B118-4FE2-B503-23F3ED5E30A4}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Caseing.Generator", "Caseing.Generator\Caseing.Generator.csproj", "{F867D241-0FDC-4F38-A79F-668B01198865}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {A3ACF52A-B118-4FE2-B503-23F3ED5E30A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {A3ACF52A-B118-4FE2-B503-23F3ED5E30A4}.Debug|Any CPU.Build.0 = Debug|Any CPU + {A3ACF52A-B118-4FE2-B503-23F3ED5E30A4}.Release|Any CPU.ActiveCfg = Release|Any CPU + {A3ACF52A-B118-4FE2-B503-23F3ED5E30A4}.Release|Any CPU.Build.0 = Release|Any CPU + {F867D241-0FDC-4F38-A79F-668B01198865}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F867D241-0FDC-4F38-A79F-668B01198865}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F867D241-0FDC-4F38-A79F-668B01198865}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F867D241-0FDC-4F38-A79F-668B01198865}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Caseing/CaseMe.cs b/Tests/Caseing/CaseMe.cs new file mode 100644 index 00000000..a6b385fc --- /dev/null +++ b/Tests/Caseing/CaseMe.cs @@ -0,0 +1,8 @@ +namespace Caseing +{ + public class CaseMe + { + public string StringProperty { get; set; } + public string S1 { get; set; } + } +} diff --git a/Tests/Caseing/Caseing.csproj b/Tests/Caseing/Caseing.csproj new file mode 100644 index 00000000..cbfa5815 --- /dev/null +++ b/Tests/Caseing/Caseing.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/Tests/Caseing/KeepMyCase.cs b/Tests/Caseing/KeepMyCase.cs new file mode 100644 index 00000000..36e80ea5 --- /dev/null +++ b/Tests/Caseing/KeepMyCase.cs @@ -0,0 +1,8 @@ +namespace Caseing +{ + public class KeepMyCase + { + public string StringProperty { get; set; } + public int Number_Property { get; set; } + } +} \ No newline at end of file diff --git a/Tests/Caseing/MixedCaseing.cs b/Tests/Caseing/MixedCaseing.cs new file mode 100644 index 00000000..8c0ed796 --- /dev/null +++ b/Tests/Caseing/MixedCaseing.cs @@ -0,0 +1,8 @@ +namespace Caseing +{ + public class MixedCaseing + { + public CaseMe CaseMe { get; set; } + public KeepMyCase KeepMyCase { get; set; } + } +} diff --git a/Tests/Derive.sln b/Tests/Derive.sln new file mode 100644 index 00000000..4ad01399 --- /dev/null +++ b/Tests/Derive.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Derive", "Derive\Derive.csproj", "{E818F5CA-E427-4C1C-BAF2-38476BFA9665}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E818F5CA-E427-4C1C-BAF2-38476BFA9665}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E818F5CA-E427-4C1C-BAF2-38476BFA9665}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E818F5CA-E427-4C1C-BAF2-38476BFA9665}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E818F5CA-E427-4C1C-BAF2-38476BFA9665}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Derive/AssemblyInfo.cs b/Tests/Derive/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/Derive/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/Derive/Derive.csproj b/Tests/Derive/Derive.csproj new file mode 100644 index 00000000..8e0ccd39 --- /dev/null +++ b/Tests/Derive/Derive.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Tests/Derive/DeriveFromInterface.cs b/Tests/Derive/DeriveFromInterface.cs new file mode 100644 index 00000000..08ac8de2 --- /dev/null +++ b/Tests/Derive/DeriveFromInterface.cs @@ -0,0 +1,23 @@ +using KY.Generator; + +namespace Derive; + +[GenerateTypeScriptModel] +[GenerateStrict] +public class DeriveFromInterfacePreferClass : IBaseInterface +{ + public string StringProperty { get; set; } = ""; +} + +[GenerateTypeScriptModel] +[GenerateStrict] +[GeneratePreferInterfaces] +public class DeriveFromInterfacePreferInterface : IBaseInterface +{ + public string StringProperty { get; set; } = ""; +} + +public interface IBaseInterface +{ + string StringProperty { get; set; } +} diff --git a/Tests/Derive/DerivedFromAbstractClass.cs b/Tests/Derive/DerivedFromAbstractClass.cs new file mode 100644 index 00000000..30fe9260 --- /dev/null +++ b/Tests/Derive/DerivedFromAbstractClass.cs @@ -0,0 +1,25 @@ +using KY.Generator; + +namespace Derive; + +[GenerateTypeScriptModel] +[GenerateStrict] +public class DerivedFromAbstractClassPreferClass : AbstractType +{ + public string StringProperty { get; set; } = ""; + public override string AbstractStringProperty { get; set; } = ""; +} + +[GenerateTypeScriptModel] +[GenerateStrict] +[GeneratePreferInterfaces] +public class DerivedFromAbstractClassPreferInterface : AbstractType +{ + public string StringProperty { get; set; } = ""; + public override string AbstractStringProperty { get; set; } = ""; +} + +public abstract class AbstractType +{ + public abstract string AbstractStringProperty { get; set; } +} diff --git a/Tests/Derive/DerivedFromClass.cs b/Tests/Derive/DerivedFromClass.cs new file mode 100644 index 00000000..ec97d5bf --- /dev/null +++ b/Tests/Derive/DerivedFromClass.cs @@ -0,0 +1,28 @@ +using KY.Generator; + +namespace Derive; + +[GenerateTypeScriptModel] +[GenerateStrict] +public class DerivedFromClassPreferClass : BaseClass +{ + public string StringProperty { get; set; } = ""; + public new string NewStringProperty { get; set; } = ""; + public override string VirtualStringProperty { get; set; } = ""; +} + +[GenerateTypeScriptModel] +[GenerateStrict] +[GeneratePreferInterfaces] +public class DerivedFromClassPreferInterface : BaseClass +{ + public string StringProperty { get; set; } = ""; + public new string NewStringProperty { get; set; } = ""; + public override string VirtualStringProperty { get; set; } = ""; +} + +public class BaseClass +{ + public string NewStringProperty { get; set; } = ""; + public virtual string VirtualStringProperty { get; set; } = ""; +} diff --git a/Tests/Derive/Output/abstract-type.ts b/Tests/Derive/Output/abstract-type.ts new file mode 100644 index 00000000..66846058 --- /dev/null +++ b/Tests/Derive/Output/abstract-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export abstract class AbstractType { + public abstractStringProperty?: string; +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/base-class.ts b/Tests/Derive/Output/base-class.ts new file mode 100644 index 00000000..6dca0246 --- /dev/null +++ b/Tests/Derive/Output/base-class.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class BaseClass { + public newStringProperty?: string; + public virtualStringProperty?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/base-interface.interface.ts b/Tests/Derive/Output/base-interface.interface.ts new file mode 100644 index 00000000..d8b3d6d0 --- /dev/null +++ b/Tests/Derive/Output/base-interface.interface.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export interface IBaseInterface { + stringProperty?: string; +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derive-from-interface-prefer-class.ts b/Tests/Derive/Output/derive-from-interface-prefer-class.ts new file mode 100644 index 00000000..69ef7e5c --- /dev/null +++ b/Tests/Derive/Output/derive-from-interface-prefer-class.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +// tslint:disable + +import { IBaseInterface } from "./base-interface.interface"; + +export class DeriveFromInterfacePreferClass implements IBaseInterface { + public stringProperty?: string | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derive-from-interface-prefer-interface.ts b/Tests/Derive/Output/derive-from-interface-prefer-interface.ts new file mode 100644 index 00000000..87436486 --- /dev/null +++ b/Tests/Derive/Output/derive-from-interface-prefer-interface.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// tslint:disable + +import { IBaseInterface } from "./base-interface.interface"; + +export interface DeriveFromInterfacePreferInterface extends IBaseInterface { + stringProperty?: string | undefined; +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derived-from-abstract-class-prefer-class.ts b/Tests/Derive/Output/derived-from-abstract-class-prefer-class.ts new file mode 100644 index 00000000..3eb384a5 --- /dev/null +++ b/Tests/Derive/Output/derived-from-abstract-class-prefer-class.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { AbstractType } from "./abstract-type"; + +export class DerivedFromAbstractClassPreferClass extends AbstractType { + public stringProperty?: string | undefined; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derived-from-abstract-class-prefer-interface.ts b/Tests/Derive/Output/derived-from-abstract-class-prefer-interface.ts new file mode 100644 index 00000000..15fbf2ba --- /dev/null +++ b/Tests/Derive/Output/derived-from-abstract-class-prefer-interface.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// tslint:disable + +import { AbstractType } from "./abstract-type"; + +export interface DerivedFromAbstractClassPreferInterface extends AbstractType { + stringProperty?: string | undefined; +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derived-from-class-prefer-class.ts b/Tests/Derive/Output/derived-from-class-prefer-class.ts new file mode 100644 index 00000000..4afd2800 --- /dev/null +++ b/Tests/Derive/Output/derived-from-class-prefer-class.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { BaseClass } from "./base-class"; + +export class DerivedFromClassPreferClass extends BaseClass { + public stringProperty?: string | undefined; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Derive/Output/derived-from-class-prefer-interface.ts b/Tests/Derive/Output/derived-from-class-prefer-interface.ts new file mode 100644 index 00000000..67000245 --- /dev/null +++ b/Tests/Derive/Output/derived-from-class-prefer-interface.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// tslint:disable + +import { BaseClass } from "./base-class"; + +export interface DerivedFromClassPreferInterface extends BaseClass { + stringProperty?: string | undefined; +} + +// outputid:e818f5ca-e427-4c1c-baf2-38476bfa9665 diff --git a/Tests/Fluent/Fluent.Generator/Fluent.Generator.csproj b/Tests/Fluent/Fluent.Generator/Fluent.Generator.csproj index 90dd6241..e7b6cc32 100644 --- a/Tests/Fluent/Fluent.Generator/Fluent.Generator.csproj +++ b/Tests/Fluent/Fluent.Generator/Fluent.Generator.csproj @@ -6,10 +6,10 @@ - - - - + + + + diff --git a/Tests/Fluent/Fluent.Generator/GeneratorMain.cs b/Tests/Fluent/Fluent.Generator/GeneratorMain.cs index cf2813bb..2d11aa21 100644 --- a/Tests/Fluent/Fluent.Generator/GeneratorMain.cs +++ b/Tests/Fluent/Fluent.Generator/GeneratorMain.cs @@ -7,21 +7,27 @@ public class GeneratorMain : GeneratorFluentMain { public override void Execute() { - this.Read() - .SetType(options => options.Ignore()) + this.SetType(options => options.Ignore()) .SetType>(options => options.Ignore()) .SetType(options => options.Ignore()) .SetType>(options => options.Ignore()) - .FromType() - .FromType() - .FromType() - .FromType() - .FromType() - .FromType() - .FromType() - .FromType() - .Write() - .Angular(angular => angular.Models(config => config.OutputPath("Output/Models").SkipHeader())); + .Read(read => read.Reflection(reflection => reflection.FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + .FromType() + )) + .Write(write => write.NoHeader() + .NoIndex() + .Angular(angular => angular.Models(config => config.OutputPath("Output/Models"))) + ); } } } diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type-generic.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type-generic.ts new file mode 100644 index 00000000..b09449ce --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type-generic.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { EdgeCase1SubType } from "./edge-case-1-sub-type"; + +export class EdgeCase1SubTypeGeneric extends EdgeCase1SubType { + public genericProperty?: T; + + public constructor(init?: Partial>) { + super(); + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type.ts new file mode 100644 index 00000000..38f8fa25 --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class EdgeCase1SubType { + public property?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1.ts new file mode 100644 index 00000000..0db9a354 --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-1.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +import { EdgeCase1SubTypeGeneric } from "./edge-case-1-sub-type-generic"; + +export class EdgeCase1 extends EdgeCase1SubTypeGeneric { + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type-generic.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type-generic.ts new file mode 100644 index 00000000..682a4faf --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type-generic.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class EdgeCase2SubTypeGeneric { + public genericProperty?: T; + + public constructor(init?: Partial>) { + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type.ts new file mode 100644 index 00000000..f090e58e --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2-sub-type.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { EdgeCase2SubTypeGeneric } from "./edge-case-2-sub-type-generic"; + +export class EdgeCase2SubType extends EdgeCase2SubTypeGeneric { + public property?: string; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2.ts b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2.ts new file mode 100644 index 00000000..8ff3fe72 --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/edge-case-2.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +import { EdgeCase2SubType } from "./edge-case-2-sub-type"; + +export class EdgeCase2 extends EdgeCase2SubType { + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface-with-non-generic-base.interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface-with-non-generic-base.interface.ts new file mode 100644 index 00000000..c5a7c214 --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface-with-non-generic-base.interface.ts @@ -0,0 +1,10 @@ +/* eslint-disable */ +// tslint:disable + +import { IInterface } from "./interface.interface"; + +export interface IGenericInterfaceWithNonGenericBase extends IInterface { + genericProperty?: T; +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface.interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface.interface.ts index 32b7357c..79e6fc9c 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface.interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/generic-interface.interface.ts @@ -2,7 +2,7 @@ // tslint:disable export interface IGenericInterface { - property: T; + property?: T; } // outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/interface-generic.interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/interface-generic.interface.ts new file mode 100644 index 00000000..5bb055cc --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/interface-generic.interface.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export interface IInterfaceGeneric { + property?: T; +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/interface.interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/interface.interface.ts index 4721d8bf..2690a858 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/interface.interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/interface.interface.ts @@ -2,7 +2,7 @@ // tslint:disable export interface IInterface { - property: string; + property?: string; } // outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/self-referencing-type.ts b/Tests/Fluent/Fluent.Generator/Output/Models/self-referencing-type.ts new file mode 100644 index 00000000..d92977cc --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/self-referencing-type.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class SelfReferencingType { + public property?: string; + public self?: SelfReferencingType; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/sub-type.ts b/Tests/Fluent/Fluent.Generator/Output/Models/sub-type.ts index 8a90d631..269137ca 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/sub-type.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/sub-type.ts @@ -2,7 +2,7 @@ // tslint:disable export class SubType { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-base-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-base-interface.ts new file mode 100644 index 00000000..0819a9a3 --- /dev/null +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-base-interface.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { IGenericInterfaceWithNonGenericBase } from "./generic-interface-with-non-generic-base.interface"; + +export class TypeWithGenericAndNotGenericBaseInterface implements IGenericInterfaceWithNonGenericBase { + public property?: string; + public genericProperty?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f32fd57a-e5ce-4ae5-97bc-bbca02f65904 diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-interface.ts index 3ea69490..f5e06e70 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-and-not-generic-interface.ts @@ -1,10 +1,11 @@ /* eslint-disable */ // tslint:disable +import { IInterfaceGeneric } from "./interface-generic.interface"; import { IInterface } from "./interface.interface"; -export class TypeWithGenericAndNotGenericInterface implements IInterface { - public property: string; +export class TypeWithGenericAndNotGenericInterface implements IInterfaceGeneric, IInterface { + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-ignored-base.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-ignored-base.ts index b2ed848b..c330b46e 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-ignored-base.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-ignored-base.ts @@ -2,7 +2,7 @@ // tslint:disable export class TypeWithGenericIgnoredBase { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-interface.ts index 5b212e8a..c9d68e1d 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-generic-interface.ts @@ -4,7 +4,7 @@ import { IGenericInterface } from "./generic-interface.interface"; export class TypeWithGenericInterface implements IGenericInterface { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-generic-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-generic-interface.ts index 5fec8e1a..fdf20ae0 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-generic-interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-generic-interface.ts @@ -2,7 +2,7 @@ // tslint:disable export class TypeWithIgnoreGenericInterface { - public ignoredProperty: string; + public ignoredProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-interface.ts index e4745b57..b9a991bd 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignore-interface.ts @@ -2,7 +2,7 @@ // tslint:disable export class TypeWithIgnoreInterface { - public ignoredProperty: string; + public ignoredProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignored-base.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignored-base.ts index 3c00cd52..cec02e16 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignored-base.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-ignored-base.ts @@ -2,7 +2,7 @@ // tslint:disable export class TypeWithIgnoredBase { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-interface.ts b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-interface.ts index 80205c35..a9e09045 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/type-with-interface.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/type-with-interface.ts @@ -4,7 +4,7 @@ import { IInterface } from "./interface.interface"; export class TypeWithInterface implements IInterface { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent.Generator/Output/Models/types.ts b/Tests/Fluent/Fluent.Generator/Output/Models/types.ts index bc9df16e..86851183 100644 --- a/Tests/Fluent/Fluent.Generator/Output/Models/types.ts +++ b/Tests/Fluent/Fluent.Generator/Output/Models/types.ts @@ -4,70 +4,70 @@ import { SubType } from "./sub-type"; export class Types { - public stringField: string; - public intField: number; - public dateTimeField: Date; - public stringProperty: string; - public shortProperty: number; - public uShortProperty: number; - public intProperty: number; - public uIntProperty: number; - public longProperty: number; - public uLongProperty: number; - public floatProperty: number; - public doubleProperty: number; - public boolProperty: boolean; - public objectProperty: unknown; - public nullableBoolProperty: boolean; - public nullableShortProperty: number; - public nullableUShortProperty: number; - public nullableIntProperty: number; - public nullableUIntProperty: number; - public nullableLongProperty: number; - public nullableULongProperty: number; - public nullableFloatProperty: number; - public nullableDoubleProperty: number; - public nullable2BoolProperty: boolean; - public nullable2ShortProperty: number; - public nullable2UShortProperty: number; - public nullable2IntProperty: number; - public nullable2UIntProperty: number; - public nullable2LongProperty: number; - public nullable2ULongProperty: number; - public nullable2FloatProperty: number; - public nullable2DoubleProperty: number; - public systemStringProperty: string; - public systemInt16Property: number; - public systemInt32Property: number; - public systemInt64Property: number; - public systemSingleProperty: number; - public systemDoubleProperty: number; - public systemDateTimeProperty: Date; - public systemArrayProperty: []; - public systemByteProperty: number; - public systemCharProperty: number; - public systemDecimalProperty: number; - public systemGuidProperty: string; - public systemObjectProperty: unknown; - public systemTimeSpanProperty: string; - public systemUInt16Property: number; - public systemUInt32Property: number; - public systemUInt64Property: number; - public subTypeProperty: SubType; - public stringArrayProperty: string[]; - public intArrayProperty: number[]; - public byteArrayProperty: number[]; - public systemDateTimeArrayProperty: Date[]; - public subTypeArrayProperty: SubType[]; - public stringList: string[]; - public subTypeList: SubType[]; - public stringStringDictionary: { [key: string]: string; }; - public intStringDictionary: { [key: number]: string; }; - public stringSubTypeDictionary: { [key: string]: SubType; }; - public intSubTypeDictionary: { [key: number]: SubType; }; - public subTypeStringDictionary: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; - public readonlyProperty: string; - public writeonlyProperty: string; + public stringField?: string; + public intField?: number; + public dateTimeField?: Date; + public stringProperty?: string; + public shortProperty?: number; + public uShortProperty?: number; + public intProperty?: number; + public uIntProperty?: number; + public longProperty?: number; + public uLongProperty?: number; + public floatProperty?: number; + public doubleProperty?: number; + public boolProperty?: boolean; + public objectProperty?: unknown; + public nullableBoolProperty?: boolean; + public nullableShortProperty?: number; + public nullableUShortProperty?: number; + public nullableIntProperty?: number; + public nullableUIntProperty?: number; + public nullableLongProperty?: number; + public nullableULongProperty?: number; + public nullableFloatProperty?: number; + public nullableDoubleProperty?: number; + public nullable2BoolProperty?: boolean; + public nullable2ShortProperty?: number; + public nullable2UShortProperty?: number; + public nullable2IntProperty?: number; + public nullable2UIntProperty?: number; + public nullable2LongProperty?: number; + public nullable2ULongProperty?: number; + public nullable2FloatProperty?: number; + public nullable2DoubleProperty?: number; + public systemStringProperty?: string; + public systemInt16Property?: number; + public systemInt32Property?: number; + public systemInt64Property?: number; + public systemSingleProperty?: number; + public systemDoubleProperty?: number; + public systemDateTimeProperty?: Date; + public systemArrayProperty?: []; + public systemByteProperty?: number; + public systemCharProperty?: number; + public systemDecimalProperty?: number; + public systemGuidProperty?: string; + public systemObjectProperty?: unknown; + public systemTimeSpanProperty?: string; + public systemUInt16Property?: number; + public systemUInt32Property?: number; + public systemUInt64Property?: number; + public subTypeProperty?: SubType; + public stringArrayProperty?: string[]; + public intArrayProperty?: number[]; + public byteArrayProperty?: number[]; + public systemDateTimeArrayProperty?: Date[]; + public subTypeArrayProperty?: SubType[]; + public stringList?: string[]; + public subTypeList?: SubType[]; + public stringStringDictionary?: { [key: string]: string; }; + public intStringDictionary?: { [key: number]: string; }; + public stringSubTypeDictionary?: { [key: string]: SubType; }; + public intSubTypeDictionary?: { [key: number]: SubType; }; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; + public readonlyProperty?: string; + public writeonlyProperty?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/Fluent/Fluent/EdgeCase1.cs b/Tests/Fluent/Fluent/EdgeCase1.cs new file mode 100644 index 00000000..9cc7d1fc --- /dev/null +++ b/Tests/Fluent/Fluent/EdgeCase1.cs @@ -0,0 +1,20 @@ +namespace Types +{ + /// + /// Type with Generic and non-generic base type with same name + /// + public class EdgeCase1 : EdgeCase1SubType + { + + } + + public class EdgeCase1SubType : EdgeCase1SubType + { + public T GenericProperty { get; set; } + } + + public class EdgeCase1SubType + { + public string Property { get; set; } + } +} diff --git a/Tests/Fluent/Fluent/EdgeCase2.cs b/Tests/Fluent/Fluent/EdgeCase2.cs new file mode 100644 index 00000000..8f78af6d --- /dev/null +++ b/Tests/Fluent/Fluent/EdgeCase2.cs @@ -0,0 +1,20 @@ +namespace Types +{ + /// + /// Type with Generic and non-generic base type with same name + /// + public class EdgeCase2 : EdgeCase2SubType + { + + } + + public class EdgeCase2SubType + { + public T GenericProperty { get; set; } + } + + public class EdgeCase2SubType : EdgeCase2SubType + { + public string Property { get; set; } + } +} diff --git a/Tests/Fluent/Fluent/IGenericInterfaceWithNonGenericBase.cs b/Tests/Fluent/Fluent/IGenericInterfaceWithNonGenericBase.cs new file mode 100644 index 00000000..f32ed645 --- /dev/null +++ b/Tests/Fluent/Fluent/IGenericInterfaceWithNonGenericBase.cs @@ -0,0 +1,7 @@ +namespace Types +{ + public interface IGenericInterfaceWithNonGenericBase : IInterface + { + public T GenericProperty { get; set; } + } +} \ No newline at end of file diff --git a/Tests/Fluent/Fluent/SelfReferencingType.cs b/Tests/Fluent/Fluent/SelfReferencingType.cs new file mode 100644 index 00000000..4c99da24 --- /dev/null +++ b/Tests/Fluent/Fluent/SelfReferencingType.cs @@ -0,0 +1,8 @@ +namespace Types +{ + public class SelfReferencingType + { + public string Property { get; set; } + public SelfReferencingType Self { get; set; } + } +} diff --git a/Tests/Fluent/Fluent/TypeWithGenericAndNotGenericBaseInterface.cs b/Tests/Fluent/Fluent/TypeWithGenericAndNotGenericBaseInterface.cs new file mode 100644 index 00000000..d166c7ff --- /dev/null +++ b/Tests/Fluent/Fluent/TypeWithGenericAndNotGenericBaseInterface.cs @@ -0,0 +1,8 @@ +namespace Types +{ + public class TypeWithGenericAndNotGenericBaseInterface : IGenericInterfaceWithNonGenericBase + { + public string Property { get; set; } + public string GenericProperty { get; set; } + } +} diff --git a/Tests/Formatting.sln b/Tests/Formatting.sln new file mode 100644 index 00000000..cd41a4be --- /dev/null +++ b/Tests/Formatting.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Formatting", "Formatting\Formatting\Formatting.csproj", "{5DB92058-142C-490D-8246-3E2467DC9A84}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Generator", "Formatting\Generator\Generator.csproj", "{295E1C57-1E7C-41F0-8455-0C037E36A594}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5DB92058-142C-490D-8246-3E2467DC9A84}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {5DB92058-142C-490D-8246-3E2467DC9A84}.Debug|Any CPU.Build.0 = Debug|Any CPU + {5DB92058-142C-490D-8246-3E2467DC9A84}.Release|Any CPU.ActiveCfg = Release|Any CPU + {5DB92058-142C-490D-8246-3E2467DC9A84}.Release|Any CPU.Build.0 = Release|Any CPU + {295E1C57-1E7C-41F0-8455-0C037E36A594}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {295E1C57-1E7C-41F0-8455-0C037E36A594}.Debug|Any CPU.Build.0 = Debug|Any CPU + {295E1C57-1E7C-41F0-8455-0C037E36A594}.Release|Any CPU.ActiveCfg = Release|Any CPU + {295E1C57-1E7C-41F0-8455-0C037E36A594}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Formatting/Formatting/Formatting.csproj b/Tests/Formatting/Formatting/Formatting.csproj new file mode 100644 index 00000000..cbfa5815 --- /dev/null +++ b/Tests/Formatting/Formatting/Formatting.csproj @@ -0,0 +1,7 @@ + + + + net5.0 + + + diff --git a/Tests/Formatting/Formatting/IInterface.cs b/Tests/Formatting/Formatting/IInterface.cs new file mode 100644 index 00000000..f7db2678 --- /dev/null +++ b/Tests/Formatting/Formatting/IInterface.cs @@ -0,0 +1,7 @@ +namespace Formatting +{ + public interface IInterface + { + + } +} diff --git a/Tests/Formatting/Formatting/Interface.cs b/Tests/Formatting/Formatting/Interface.cs new file mode 100644 index 00000000..cf05606d --- /dev/null +++ b/Tests/Formatting/Formatting/Interface.cs @@ -0,0 +1,7 @@ +namespace Formatting +{ + public interface Interface + { + + } +} diff --git a/Tests/Formatting/Formatting/MyClass.cs b/Tests/Formatting/Formatting/MyClass.cs new file mode 100644 index 00000000..9ef469a5 --- /dev/null +++ b/Tests/Formatting/Formatting/MyClass.cs @@ -0,0 +1,13 @@ +namespace Formatting +{ + public class MyClass + { + public string Property { get; } + } + + public class MyClassWithInterface : Interface + { } + + public class MyClassWithIInterface : IInterface + { } +} diff --git a/Tests/Formatting/Formatting/TabTest.cs b/Tests/Formatting/Formatting/TabTest.cs new file mode 100644 index 00000000..04bb506f --- /dev/null +++ b/Tests/Formatting/Formatting/TabTest.cs @@ -0,0 +1,7 @@ +namespace Formatting +{ + public class TabTest + { + public string Property { get; } + } +} \ No newline at end of file diff --git a/Tests/Formatting/Formatting/TwoWhitespaceTest.cs b/Tests/Formatting/Formatting/TwoWhitespaceTest.cs new file mode 100644 index 00000000..52a109ed --- /dev/null +++ b/Tests/Formatting/Formatting/TwoWhitespaceTest.cs @@ -0,0 +1,7 @@ +namespace Formatting +{ + public class TwoWhitespaceTest + { + public string Property { get; } + } +} diff --git a/Tests/Formatting/Generator/Generator.csproj b/Tests/Formatting/Generator/Generator.csproj new file mode 100644 index 00000000..c598829e --- /dev/null +++ b/Tests/Formatting/Generator/Generator.csproj @@ -0,0 +1,18 @@ + + + + net5.0 + {95ca21b8-f1ff-4cc7-b96e-63d5a90970c3} + + + + + + + + + + + + + diff --git a/Tests/Formatting/Generator/GeneratorMain.cs b/Tests/Formatting/Generator/GeneratorMain.cs new file mode 100644 index 00000000..ab70965f --- /dev/null +++ b/Tests/Formatting/Generator/GeneratorMain.cs @@ -0,0 +1,58 @@ +using Formatting; +using KY.Generator; +using KY.Generator.Syntax; + +namespace Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read + .Reflection(reflection => reflection + .FromType())) + .Write(write => write + .SetTestDefaults() + .Formatting(config => config.UseWhitespaces(2)) + .Angular(angular => angular.Models(config => config.OutputPath("Output")))); + + this.Read(read => read + .Reflection(reflection => reflection + .FromType())) + .Write(write => write + .SetTestDefaults() + .Formatting(config => config.UseTab()) + .Angular(angular => angular.Models(config => config.OutputPath("Output")))); + + this.Read(read => read + .Reflection(reflection => reflection + .FromType() + .FromType() + .FromType() + .FromType())) + .Write(write => write + .SetTestDefaults() + .Formatting(config => config.InterfacePrefix("I").ClassPrefix("C")) + .FileName(config => config.Replace("^c-(.*)$", "$1")) + .Angular(angular => angular.Models(config => config.OutputPath("Output/WithPrefix")))); + + this.Read(read => read + .Reflection(reflection => reflection + .FromType() + .FromType() + .FromType() + .FromType())) + .Write(write => write + .SetTestDefaults() + .Angular(angular => angular.Models(config => config.OutputPath("Output/WithoutPrefix")))); + } + } + + public static class TestExtension + { + public static IWriteFluentSyntax SetTestDefaults(this IWriteFluentSyntax syntax) + { + return syntax.NoHeader().NoIndex(); + } + } +} diff --git a/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-i-interface.ts b/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-i-interface.ts new file mode 100644 index 00000000..2bfc002a --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-i-interface.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +import { IInterface } from "./interface.interface"; + +export class CMyClassWithIInterface implements IInterface { + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-interface.ts b/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-interface.ts new file mode 100644 index 00000000..ebb033cd --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithPrefix/c-my-class-with-interface.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +import { IInterface } from "./interface.interface"; + +export class CMyClassWithInterface implements IInterface { + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithPrefix/interface.interface.ts b/Tests/Formatting/Generator/Output/WithPrefix/interface.interface.ts new file mode 100644 index 00000000..df46cbb5 --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithPrefix/interface.interface.ts @@ -0,0 +1,7 @@ +/* eslint-disable */ +// tslint:disable + +export interface IInterface { +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithoutPrefix/interface.interface.ts b/Tests/Formatting/Generator/Output/WithoutPrefix/interface.interface.ts new file mode 100644 index 00000000..df46cbb5 --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithoutPrefix/interface.interface.ts @@ -0,0 +1,7 @@ +/* eslint-disable */ +// tslint:disable + +export interface IInterface { +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithoutPrefix/interface.ts b/Tests/Formatting/Generator/Output/WithoutPrefix/interface.ts new file mode 100644 index 00000000..19f30b22 --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithoutPrefix/interface.ts @@ -0,0 +1,7 @@ +/* eslint-disable */ +// tslint:disable + +export interface Interface { +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-i-interface.ts b/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-i-interface.ts new file mode 100644 index 00000000..3172916a --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-i-interface.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +import { IInterface } from "./interface.interface"; + +export class MyClassWithIInterface implements IInterface { + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-interface.ts b/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-interface.ts new file mode 100644 index 00000000..085c8044 --- /dev/null +++ b/Tests/Formatting/Generator/Output/WithoutPrefix/my-class-with-interface.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +import { Interface } from "./interface"; + +export class MyClassWithInterface implements Interface { + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/tab-test.ts b/Tests/Formatting/Generator/Output/tab-test.ts new file mode 100644 index 00000000..3561a079 --- /dev/null +++ b/Tests/Formatting/Generator/Output/tab-test.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class TabTest { + public property?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Formatting/Generator/Output/two-whitespace-test.ts b/Tests/Formatting/Generator/Output/two-whitespace-test.ts new file mode 100644 index 00000000..719a1199 --- /dev/null +++ b/Tests/Formatting/Generator/Output/two-whitespace-test.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class TwoWhitespaceTest { + public property?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:95ca21b8-f1ff-4cc7-b96e-63d5a90970c3 diff --git a/Tests/Generator/FullStageTests.cs b/Tests/Generator/FullStageTests.cs index 29f7000e..acef8997 100644 --- a/Tests/Generator/FullStageTests.cs +++ b/Tests/Generator/FullStageTests.cs @@ -1,7 +1,6 @@ using System; using KY.Core.Dependency; using KY.Generator.AspDotNet; -using KY.Generator.Configuration; using KY.Generator.Csharp; using KY.Generator.Mappings; using KY.Generator.Output; @@ -21,7 +20,6 @@ public void Initialize() { this.resolver = new DependencyResolver(); this.resolver.Bind().ToSingleton(); - this.resolver.Bind().ToSingleton(); this.resolver.Create().Initialize(); this.resolver.Create().Initialize(); //this.resolver.Create().Initialize(); @@ -49,4 +47,4 @@ private bool Run(string configuration) throw new NotImplementedException(); } } -} \ No newline at end of file +} diff --git a/Tests/Generator/KY.Generator.Tests.csproj b/Tests/Generator/KY.Generator.Tests.csproj index 172db746..2672ec64 100644 --- a/Tests/Generator/KY.Generator.Tests.csproj +++ b/Tests/Generator/KY.Generator.Tests.csproj @@ -1,13 +1,15 @@  - netcoreapp2.1 + net6.0 false + + latest - + @@ -15,7 +17,7 @@ - + diff --git a/Tests/Generator/Models/Read1Configuration.cs b/Tests/Generator/Models/Read1Configuration.cs index ddc26060..715481b8 100644 --- a/Tests/Generator/Models/Read1Configuration.cs +++ b/Tests/Generator/Models/Read1Configuration.cs @@ -1,9 +1,7 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Tests.Models +namespace KY.Generator.Tests.Models { - internal class Read1Configuration : ReadConfigurationBase + internal class Read1Configuration { public string Property1 { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Read2Configuration.cs b/Tests/Generator/Models/Read2Configuration.cs index 6bddb994..601cf1a9 100644 --- a/Tests/Generator/Models/Read2Configuration.cs +++ b/Tests/Generator/Models/Read2Configuration.cs @@ -1,9 +1,7 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Tests.Models +namespace KY.Generator.Tests.Models { - internal class Read2Configuration : ReadConfigurationBase + internal class Read2Configuration { public string Property2 { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Reader1.cs b/Tests/Generator/Models/Reader1.cs index 578ecc39..0fc9f3d3 100644 --- a/Tests/Generator/Models/Reader1.cs +++ b/Tests/Generator/Models/Reader1.cs @@ -1,16 +1,10 @@ -using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Readers; +using KY.Generator.Transfer.Readers; namespace KY.Generator.Tests.Models { internal class Reader1 : ITransferReader { - public void Read(ConfigurationBase configurationBase, List transferObjects) - { - Read1Configuration configuration = (Read1Configuration)configurationBase; - } + public void Read(Read1Configuration configuration) + { } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Reader2.cs b/Tests/Generator/Models/Reader2.cs index ce026be5..e1c57a80 100644 --- a/Tests/Generator/Models/Reader2.cs +++ b/Tests/Generator/Models/Reader2.cs @@ -1,16 +1,10 @@ -using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Configurations; -using KY.Generator.Transfer; -using KY.Generator.Transfer.Readers; +using KY.Generator.Transfer.Readers; namespace KY.Generator.Tests.Models { internal class Reader2 : ITransferReader { - public void Read(ConfigurationBase configurationBase, List transferObjects) - { - Read2Configuration configuration = (Read2Configuration)configurationBase; - } + public void Read(Read2Configuration configuration) + { } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Write1Configuration.cs b/Tests/Generator/Models/Write1Configuration.cs index 14c3c11c..659a0de3 100644 --- a/Tests/Generator/Models/Write1Configuration.cs +++ b/Tests/Generator/Models/Write1Configuration.cs @@ -1,9 +1,7 @@ -using KY.Generator.Configurations; - -namespace KY.Generator.Tests.Models +namespace KY.Generator.Tests.Models { - internal class Write1Configuration : ConfigurationBase + internal class Write1Configuration { public string Property1 { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Write2Configuration.cs b/Tests/Generator/Models/Write2Configuration.cs index 673c3914..0f77d3b4 100644 --- a/Tests/Generator/Models/Write2Configuration.cs +++ b/Tests/Generator/Models/Write2Configuration.cs @@ -1,10 +1,7 @@ -using KY.Generator.Configuration; -using KY.Generator.Configurations; - -namespace KY.Generator.Tests.Models +namespace KY.Generator.Tests.Models { - internal class Write2Configuration : ConfigurationBase + internal class Write2Configuration { public string Property2 { get; set; } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Writer1.cs b/Tests/Generator/Models/Writer1.cs index 068d5623..226ef49c 100644 --- a/Tests/Generator/Models/Writer1.cs +++ b/Tests/Generator/Models/Writer1.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Configurations; using KY.Generator.Output; using KY.Generator.Transfer; using KY.Generator.Transfer.Writers; @@ -9,9 +7,7 @@ namespace KY.Generator.Tests.Models { internal class Writer1 : ITransferWriter { - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - Write1Configuration configuration = (Write1Configuration)configurationBase; - } + public void Write(IEnumerable transferObjects, string relativePath, IOutput output) + { } } -} \ No newline at end of file +} diff --git a/Tests/Generator/Models/Writer2.cs b/Tests/Generator/Models/Writer2.cs index 3ff07463..13abe62b 100644 --- a/Tests/Generator/Models/Writer2.cs +++ b/Tests/Generator/Models/Writer2.cs @@ -1,6 +1,4 @@ using System.Collections.Generic; -using KY.Generator.Configuration; -using KY.Generator.Configurations; using KY.Generator.Output; using KY.Generator.Transfer; using KY.Generator.Transfer.Writers; @@ -9,9 +7,7 @@ namespace KY.Generator.Tests.Models { internal class Writer2 : ITransferWriter { - public void Write(ConfigurationBase configurationBase, List transferObjects, IOutput output) - { - Write2Configuration configuration = (Write2Configuration)configurationBase; - } + public void Write(IEnumerable transferObjects, string relativePath, IOutput output) + { } } -} \ No newline at end of file +} diff --git a/Tests/Net5.sln b/Tests/Net5.sln new file mode 100644 index 00000000..9889ed60 --- /dev/null +++ b/Tests/Net5.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net5", "Net5\Net5.csproj", "{4A93E299-87F2-431E-BBF7-82C818AD7CD6}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4A93E299-87F2-431E-BBF7-82C818AD7CD6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4A93E299-87F2-431E-BBF7-82C818AD7CD6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4A93E299-87F2-431E-BBF7-82C818AD7CD6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4A93E299-87F2-431E-BBF7-82C818AD7CD6}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Net5/AssemblyInfo.cs b/Tests/Net5/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Net5/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Net5/Net5.csproj b/Tests/Net5/Net5.csproj new file mode 100644 index 00000000..78227492 --- /dev/null +++ b/Tests/Net5/Net5.csproj @@ -0,0 +1,13 @@ + + + + net5.0 + {f489d528-1077-4d58-83a4-45c2926a2206} + + + + + + + + diff --git a/Tests/Net5/Net5.csproj.DotSettings b/Tests/Net5/Net5.csproj.DotSettings new file mode 100644 index 00000000..4887f947 --- /dev/null +++ b/Tests/Net5/Net5.csproj.DotSettings @@ -0,0 +1,2 @@ + + CSharp100 \ No newline at end of file diff --git a/Tests/Net5/Output/generic-sub-type.ts b/Tests/Net5/Output/generic-sub-type.ts new file mode 100644 index 00000000..ab7abb73 --- /dev/null +++ b/Tests/Net5/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class GenericSubType { + public single?: TOne; + public single2?: string; + public enumerable?: TOne[]; + public list?: TTwo[]; + public stringList?: string[]; +} + +// outputid:f489d528-1077-4d58-83a4-45c2926a2206 diff --git a/Tests/Net5/Output/sub-type.ts b/Tests/Net5/Output/sub-type.ts new file mode 100644 index 00000000..78ea4e64 --- /dev/null +++ b/Tests/Net5/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export class SubType { + public property?: string; +} + +// outputid:f489d528-1077-4d58-83a4-45c2926a2206 diff --git a/Tests/Net5/Output/types.ts b/Tests/Net5/Output/types.ts new file mode 100644 index 00000000..99679918 --- /dev/null +++ b/Tests/Net5/Output/types.ts @@ -0,0 +1,85 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public stringField?: string; + public intField?: number; + public dateTimeField?: Date; + public stringProperty?: string; + public shortProperty?: number; + public uShortProperty?: number; + public intProperty?: number; + public uIntProperty?: number; + public longProperty?: number; + public uLongProperty?: number; + public floatProperty?: number; + public doubleProperty?: number; + public boolProperty?: boolean; + public objectProperty?: unknown; + public nullableBoolProperty?: boolean; + public nullableShortProperty?: number; + public nullableUShortProperty?: number; + public nullableIntProperty?: number; + public nullableUIntProperty?: number; + public nullableLongProperty?: number; + public nullableULongProperty?: number; + public nullableFloatProperty?: number; + public nullableDoubleProperty?: number; + public nullable2BoolProperty?: boolean; + public nullable2ShortProperty?: number; + public nullable2UShortProperty?: number; + public nullable2IntProperty?: number; + public nullable2UIntProperty?: number; + public nullable2LongProperty?: number; + public nullable2ULongProperty?: number; + public nullable2FloatProperty?: number; + public nullable2DoubleProperty?: number; + public systemStringProperty?: string; + public systemInt16Property?: number; + public systemInt32Property?: number; + public systemInt64Property?: number; + public systemSingleProperty?: number; + public systemDoubleProperty?: number; + public systemDateTimeProperty?: Date; + public systemArrayProperty?: []; + public systemByteProperty?: number; + public systemCharProperty?: number; + public systemDecimalProperty?: number; + public systemGuidProperty?: string; + public systemObjectProperty?: unknown; + public systemTimeSpanProperty?: string; + public systemUInt16Property?: number; + public systemUInt32Property?: number; + public systemUInt64Property?: number; + public subTypeProperty?: SubType; + public stringArrayProperty?: string[]; + public intArrayProperty?: number[]; + public byteArrayProperty?: number[]; + public systemDateTimeArrayProperty?: Date[]; + public subTypeArrayProperty?: SubType[]; + public stringList?: string[]; + public subTypeList?: SubType[]; + public stringStringDictionary?: { [key: string]: string; }; + public intStringDictionary?: { [key: number]: string; }; + public stringSubTypeDictionary?: { [key: string]: SubType; }; + public intSubTypeDictionary?: { [key: number]: SubType; }; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; + public genericSubType?: GenericSubType; + public readonlyProperty?: string; + public writeonlyProperty?: string; +} + +// outputid:f489d528-1077-4d58-83a4-45c2926a2206 diff --git a/Tests/Types/Types.cs b/Tests/Net5/Types.cs similarity index 95% rename from Tests/Types/Types.cs rename to Tests/Net5/Types.cs index ea644c24..b7faf3d3 100644 --- a/Tests/Types/Types.cs +++ b/Tests/Net5/Types.cs @@ -2,10 +2,9 @@ using System.Collections.Generic; using KY.Generator; -namespace Types +namespace Net5 { [Generate(OutputLanguage.TypeScript, "Output")] - [GenerateOption(GenerateOption.SkipHeader)] public class Types { // Fields @@ -99,11 +98,18 @@ public class Types // Accessors public string ReadonlyProperty => string.Empty; - public string WriteonlyProperty { set {} } + + public string WriteonlyProperty + { + set { } + } + protected string ProtectedProperty { get; set; } private string PrivateProperty { get; set; } + internal string InternalProperty { get; set; } protected string ProtectedField; private string PrivateField; + internal string InternalField; } public class SubType @@ -117,5 +123,6 @@ public class GenericSubType public string Single2 { get; } public IEnumerable Enumerable { get; set; } public List List { get; set; } + public List StringList { get; set; } } } diff --git a/Tests/Net6.sln b/Tests/Net6.sln new file mode 100644 index 00000000..0cc3d8e9 --- /dev/null +++ b/Tests/Net6.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net6", "Net6\Net6.csproj", "{BAD14FB5-07E1-427F-A980-39A198977F92}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {BAD14FB5-07E1-427F-A980-39A198977F92}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BAD14FB5-07E1-427F-A980-39A198977F92}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BAD14FB5-07E1-427F-A980-39A198977F92}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BAD14FB5-07E1-427F-A980-39A198977F92}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Net6/AssemblyInfo.cs b/Tests/Net6/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Net6/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Net6/Net6.csproj b/Tests/Net6/Net6.csproj new file mode 100644 index 00000000..f9fffd21 --- /dev/null +++ b/Tests/Net6/Net6.csproj @@ -0,0 +1,15 @@ + + + + net6.0 + enable + enable + {0aacfb49-66dd-4b19-94db-18e7cc1628c0} + + + + + + + + diff --git a/Tests/Net6/Output/generic-sub-type.ts b/Tests/Net6/Output/generic-sub-type.ts new file mode 100644 index 00000000..ab009cc7 --- /dev/null +++ b/Tests/Net6/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class GenericSubType { + public single?: TOne; + public single2?: string; + public enumerable?: TOne[]; + public list?: TTwo[]; + public stringList?: string[]; +} + +// outputid:0aacfb49-66dd-4b19-94db-18e7cc1628c0 diff --git a/Tests/Net6/Output/sub-type.ts b/Tests/Net6/Output/sub-type.ts new file mode 100644 index 00000000..db7dac06 --- /dev/null +++ b/Tests/Net6/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export class SubType { + public property?: string; +} + +// outputid:0aacfb49-66dd-4b19-94db-18e7cc1628c0 diff --git a/Tests/Net6/Output/types.ts b/Tests/Net6/Output/types.ts new file mode 100644 index 00000000..67fe5137 --- /dev/null +++ b/Tests/Net6/Output/types.ts @@ -0,0 +1,85 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public stringField?: string; + public intField?: number; + public dateTimeField?: Date; + public stringProperty?: string; + public shortProperty?: number; + public uShortProperty?: number; + public intProperty?: number; + public uIntProperty?: number; + public longProperty?: number; + public uLongProperty?: number; + public floatProperty?: number; + public doubleProperty?: number; + public boolProperty?: boolean; + public objectProperty?: unknown; + public nullableBoolProperty?: boolean; + public nullableShortProperty?: number; + public nullableUShortProperty?: number; + public nullableIntProperty?: number; + public nullableUIntProperty?: number; + public nullableLongProperty?: number; + public nullableULongProperty?: number; + public nullableFloatProperty?: number; + public nullableDoubleProperty?: number; + public nullable2BoolProperty?: boolean; + public nullable2ShortProperty?: number; + public nullable2UShortProperty?: number; + public nullable2IntProperty?: number; + public nullable2UIntProperty?: number; + public nullable2LongProperty?: number; + public nullable2ULongProperty?: number; + public nullable2FloatProperty?: number; + public nullable2DoubleProperty?: number; + public systemStringProperty?: string; + public systemInt16Property?: number; + public systemInt32Property?: number; + public systemInt64Property?: number; + public systemSingleProperty?: number; + public systemDoubleProperty?: number; + public systemDateTimeProperty?: Date; + public systemArrayProperty?: []; + public systemByteProperty?: number; + public systemCharProperty?: number; + public systemDecimalProperty?: number; + public systemGuidProperty?: string; + public systemObjectProperty?: unknown; + public systemTimeSpanProperty?: string; + public systemUInt16Property?: number; + public systemUInt32Property?: number; + public systemUInt64Property?: number; + public subTypeProperty?: SubType; + public stringArrayProperty?: string[]; + public intArrayProperty?: number[]; + public byteArrayProperty?: number[]; + public systemDateTimeArrayProperty?: Date[]; + public subTypeArrayProperty?: SubType[]; + public stringList?: string[]; + public subTypeList?: SubType[]; + public stringStringDictionary?: { [key: string]: string; }; + public intStringDictionary?: { [key: number]: string; }; + public stringSubTypeDictionary?: { [key: string]: SubType; }; + public intSubTypeDictionary?: { [key: number]: SubType; }; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; + public genericSubType?: GenericSubType; + public readonlyProperty?: string; + public writeonlyProperty?: string; +} + +// outputid:0aacfb49-66dd-4b19-94db-18e7cc1628c0 diff --git a/Tests/Net6/Types.cs b/Tests/Net6/Types.cs new file mode 100644 index 00000000..5afb9918 --- /dev/null +++ b/Tests/Net6/Types.cs @@ -0,0 +1,125 @@ +using KY.Generator; + +namespace Net6; + +[Generate(OutputLanguage.TypeScript, "Output")] +public class Types +{ + // Fields + public string StringField; + public int IntField; + public System.DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Types + public string StringProperty { get; set; } + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } + public System.Byte SystemByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } + + // Arrays + public string[] StringArrayProperty { get; set; } + public int[] IntArrayProperty { get; set; } + public byte[] ByteArrayProperty { get; set; } + public System.DateTime[] SystemDateTimeArrayProperty { get; set; } + public SubType[] SubTypeArrayProperty { get; set; } + + // Generics + public List StringList { get; set; } + public List SubTypeList { get; set; } + public Dictionary StringStringDictionary { get; set; } + public Dictionary IntStringDictionary { get; set; } + public Dictionary StringSubTypeDictionary { get; set; } + public Dictionary IntSubTypeDictionary { get; set; } + public Dictionary SubTypeStringDictionary { get; set; } + public GenericSubType GenericSubType { get; set; } + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } + private string PrivateProperty { get; set; } + internal string InternalProperty { get; set; } + protected string ProtectedField; + private string PrivateField; + internal string InternalField; +} + +public class SubType +{ + public string Property { get; set; } +} + +public class GenericSubType +{ + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } +} diff --git a/Tests/Net7.sln b/Tests/Net7.sln new file mode 100644 index 00000000..4c301f07 --- /dev/null +++ b/Tests/Net7.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net7", "Net7\Net7.csproj", "{D7A14163-E106-4524-A5AC-060DE9E05026}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {D7A14163-E106-4524-A5AC-060DE9E05026}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D7A14163-E106-4524-A5AC-060DE9E05026}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D7A14163-E106-4524-A5AC-060DE9E05026}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D7A14163-E106-4524-A5AC-060DE9E05026}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Net7/AssemblyInfo.cs b/Tests/Net7/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Net7/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Net7/Net7.csproj b/Tests/Net7/Net7.csproj new file mode 100644 index 00000000..f7df4aaf --- /dev/null +++ b/Tests/Net7/Net7.csproj @@ -0,0 +1,15 @@ + + + + net7.0 + enable + enable + {6efc183e-a677-4cf2-bd36-b22c0bb466ce} + + + + + + + + diff --git a/Tests/Net7/Output/generic-sub-type.ts b/Tests/Net7/Output/generic-sub-type.ts new file mode 100644 index 00000000..2a0d0e14 --- /dev/null +++ b/Tests/Net7/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class GenericSubType { + public single?: TOne; + public single2?: string; + public enumerable?: TOne[]; + public list?: TTwo[]; + public stringList?: string[]; +} + +// outputid:6efc183e-a677-4cf2-bd36-b22c0bb466ce diff --git a/Tests/Net7/Output/sub-type.ts b/Tests/Net7/Output/sub-type.ts new file mode 100644 index 00000000..f9a18b64 --- /dev/null +++ b/Tests/Net7/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export class SubType { + public property?: string; +} + +// outputid:6efc183e-a677-4cf2-bd36-b22c0bb466ce diff --git a/Tests/Net7/Output/types.ts b/Tests/Net7/Output/types.ts new file mode 100644 index 00000000..48370b87 --- /dev/null +++ b/Tests/Net7/Output/types.ts @@ -0,0 +1,85 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public stringField?: string; + public intField?: number; + public dateTimeField?: Date; + public stringProperty?: string; + public shortProperty?: number; + public uShortProperty?: number; + public intProperty?: number; + public uIntProperty?: number; + public longProperty?: number; + public uLongProperty?: number; + public floatProperty?: number; + public doubleProperty?: number; + public boolProperty?: boolean; + public objectProperty?: unknown; + public nullableBoolProperty?: boolean; + public nullableShortProperty?: number; + public nullableUShortProperty?: number; + public nullableIntProperty?: number; + public nullableUIntProperty?: number; + public nullableLongProperty?: number; + public nullableULongProperty?: number; + public nullableFloatProperty?: number; + public nullableDoubleProperty?: number; + public nullable2BoolProperty?: boolean; + public nullable2ShortProperty?: number; + public nullable2UShortProperty?: number; + public nullable2IntProperty?: number; + public nullable2UIntProperty?: number; + public nullable2LongProperty?: number; + public nullable2ULongProperty?: number; + public nullable2FloatProperty?: number; + public nullable2DoubleProperty?: number; + public systemStringProperty?: string; + public systemInt16Property?: number; + public systemInt32Property?: number; + public systemInt64Property?: number; + public systemSingleProperty?: number; + public systemDoubleProperty?: number; + public systemDateTimeProperty?: Date; + public systemArrayProperty?: []; + public systemByteProperty?: number; + public systemCharProperty?: number; + public systemDecimalProperty?: number; + public systemGuidProperty?: string; + public systemObjectProperty?: unknown; + public systemTimeSpanProperty?: string; + public systemUInt16Property?: number; + public systemUInt32Property?: number; + public systemUInt64Property?: number; + public subTypeProperty?: SubType; + public stringArrayProperty?: string[]; + public intArrayProperty?: number[]; + public byteArrayProperty?: number[]; + public systemDateTimeArrayProperty?: Date[]; + public subTypeArrayProperty?: SubType[]; + public stringList?: string[]; + public subTypeList?: SubType[]; + public stringStringDictionary?: { [key: string]: string; }; + public intStringDictionary?: { [key: number]: string; }; + public stringSubTypeDictionary?: { [key: string]: SubType; }; + public intSubTypeDictionary?: { [key: number]: SubType; }; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; + public genericSubType?: GenericSubType; + public readonlyProperty?: string; + public writeonlyProperty?: string; +} + +// outputid:6efc183e-a677-4cf2-bd36-b22c0bb466ce diff --git a/Tests/Net7/Types.cs b/Tests/Net7/Types.cs new file mode 100644 index 00000000..23b3a9a9 --- /dev/null +++ b/Tests/Net7/Types.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using KY.Generator; + +namespace Net7 +{ + [Generate(OutputLanguage.TypeScript, "Output")] + public class Types + { + // Fields + public string StringField; + public int IntField; + public System.DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Types + public string StringProperty { get; set; } + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } + public System.Byte SystemByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } + + // Arrays + public string[] StringArrayProperty { get; set; } + public int[] IntArrayProperty { get; set; } + public byte[] ByteArrayProperty { get; set; } + public System.DateTime[] SystemDateTimeArrayProperty { get; set; } + public SubType[] SubTypeArrayProperty { get; set; } + + // Generics + public List StringList { get; set; } + public List SubTypeList { get; set; } + public Dictionary StringStringDictionary { get; set; } + public Dictionary IntStringDictionary { get; set; } + public Dictionary StringSubTypeDictionary { get; set; } + public Dictionary IntSubTypeDictionary { get; set; } + public Dictionary SubTypeStringDictionary { get; set; } + public GenericSubType GenericSubType { get; set; } + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } + private string PrivateProperty { get; set; } + internal string InternalProperty { get; set; } + protected string ProtectedField; + private string PrivateField; + internal string InternalField; + } + + public class SubType + { + public string Property { get; set; } + } + + public class GenericSubType + { + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } + } +} diff --git a/Tests/Net8.sln b/Tests/Net8.sln new file mode 100644 index 00000000..457fa33f --- /dev/null +++ b/Tests/Net8.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net8", "Net8\Net8.csproj", "{8D02CE37-8013-4A57-A40D-4A10C8C65DE2}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {8D02CE37-8013-4A57-A40D-4A10C8C65DE2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8D02CE37-8013-4A57-A40D-4A10C8C65DE2}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8D02CE37-8013-4A57-A40D-4A10C8C65DE2}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8D02CE37-8013-4A57-A40D-4A10C8C65DE2}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Net8/AssemblyInfo.cs b/Tests/Net8/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Net8/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Net8/Net8.csproj b/Tests/Net8/Net8.csproj new file mode 100644 index 00000000..9f996fd0 --- /dev/null +++ b/Tests/Net8/Net8.csproj @@ -0,0 +1,14 @@ + + + + net8.0 + enable + enable + + + + + + + + diff --git a/Tests/Types/Output/generic-sub-type.ts b/Tests/Net8/Output/generic-sub-type.ts similarity index 70% rename from Tests/Types/Output/generic-sub-type.ts rename to Tests/Net8/Output/generic-sub-type.ts index 2c4a2c6d..b1245900 100644 --- a/Tests/Types/Output/generic-sub-type.ts +++ b/Tests/Net8/Output/generic-sub-type.ts @@ -6,6 +6,7 @@ export class GenericSubType { public single2: string; public enumerable: TOne[]; public list: TTwo[]; + public stringList: string[]; } -// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 +// outputid:8d02ce37-8013-4a57-a40d-4a10c8c65de2 diff --git a/Tests/Types/Output/sub-type.ts b/Tests/Net8/Output/sub-type.ts similarity index 66% rename from Tests/Types/Output/sub-type.ts rename to Tests/Net8/Output/sub-type.ts index 75299834..a1d288c9 100644 --- a/Tests/Types/Output/sub-type.ts +++ b/Tests/Net8/Output/sub-type.ts @@ -5,4 +5,4 @@ export class SubType { public property: string; } -// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 +// outputid:8d02ce37-8013-4a57-a40d-4a10c8c65de2 diff --git a/Tests/Types/Output/types.ts b/Tests/Net8/Output/types.ts similarity index 98% rename from Tests/Types/Output/types.ts rename to Tests/Net8/Output/types.ts index 1c49f222..d5a7ef2e 100644 --- a/Tests/Types/Output/types.ts +++ b/Tests/Net8/Output/types.ts @@ -82,4 +82,4 @@ export class Types { public writeonlyProperty: string; } -// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 +// outputid:8d02ce37-8013-4a57-a40d-4a10c8c65de2 diff --git a/Tests/Net8/Types.cs b/Tests/Net8/Types.cs new file mode 100644 index 00000000..23b3a9a9 --- /dev/null +++ b/Tests/Net8/Types.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using KY.Generator; + +namespace Net7 +{ + [Generate(OutputLanguage.TypeScript, "Output")] + public class Types + { + // Fields + public string StringField; + public int IntField; + public System.DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Types + public string StringProperty { get; set; } + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } + public System.Byte SystemByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } + + // Arrays + public string[] StringArrayProperty { get; set; } + public int[] IntArrayProperty { get; set; } + public byte[] ByteArrayProperty { get; set; } + public System.DateTime[] SystemDateTimeArrayProperty { get; set; } + public SubType[] SubTypeArrayProperty { get; set; } + + // Generics + public List StringList { get; set; } + public List SubTypeList { get; set; } + public Dictionary StringStringDictionary { get; set; } + public Dictionary IntStringDictionary { get; set; } + public Dictionary StringSubTypeDictionary { get; set; } + public Dictionary IntSubTypeDictionary { get; set; } + public Dictionary SubTypeStringDictionary { get; set; } + public GenericSubType GenericSubType { get; set; } + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } + private string PrivateProperty { get; set; } + internal string InternalProperty { get; set; } + protected string ProtectedField; + private string PrivateField; + internal string InternalField; + } + + public class SubType + { + public string Property { get; set; } + } + + public class GenericSubType + { + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } + } +} diff --git a/Tests/Net9.sln b/Tests/Net9.sln new file mode 100644 index 00000000..22ea5b13 --- /dev/null +++ b/Tests/Net9.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Net9", "Net9\Net9.csproj", "{9C33E37C-3A6C-404F-8FAB-DAE790C04A8C}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {9C33E37C-3A6C-404F-8FAB-DAE790C04A8C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9C33E37C-3A6C-404F-8FAB-DAE790C04A8C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9C33E37C-3A6C-404F-8FAB-DAE790C04A8C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9C33E37C-3A6C-404F-8FAB-DAE790C04A8C}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/Net9/AssemblyInfo.cs b/Tests/Net9/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Net9/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Net9/Net9.csproj b/Tests/Net9/Net9.csproj new file mode 100644 index 00000000..d9bbe97e --- /dev/null +++ b/Tests/Net9/Net9.csproj @@ -0,0 +1,14 @@ + + + + net9.0 + enable + enable + + + + + + + + diff --git a/Tests/Net9/Output/generic-sub-type.ts b/Tests/Net9/Output/generic-sub-type.ts new file mode 100644 index 00000000..a2da877b --- /dev/null +++ b/Tests/Net9/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export class GenericSubType { + public single: TOne; + public single2: string; + public enumerable: TOne[]; + public list: TTwo[]; + public stringList: string[]; +} + +// outputid:9c33e37c-3a6c-404f-8fab-dae790c04a8c diff --git a/Tests/Net9/Output/sub-type.ts b/Tests/Net9/Output/sub-type.ts new file mode 100644 index 00000000..552c93e4 --- /dev/null +++ b/Tests/Net9/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export class SubType { + public property: string; +} + +// outputid:9c33e37c-3a6c-404f-8fab-dae790c04a8c diff --git a/Tests/Net9/Output/types.ts b/Tests/Net9/Output/types.ts new file mode 100644 index 00000000..fba28e96 --- /dev/null +++ b/Tests/Net9/Output/types.ts @@ -0,0 +1,85 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public stringField: string; + public intField: number; + public dateTimeField: Date; + public stringProperty: string; + public shortProperty: number; + public uShortProperty: number; + public intProperty: number; + public uIntProperty: number; + public longProperty: number; + public uLongProperty: number; + public floatProperty: number; + public doubleProperty: number; + public boolProperty: boolean; + public objectProperty: unknown; + public nullableBoolProperty: boolean; + public nullableShortProperty: number; + public nullableUShortProperty: number; + public nullableIntProperty: number; + public nullableUIntProperty: number; + public nullableLongProperty: number; + public nullableULongProperty: number; + public nullableFloatProperty: number; + public nullableDoubleProperty: number; + public nullable2BoolProperty: boolean; + public nullable2ShortProperty: number; + public nullable2UShortProperty: number; + public nullable2IntProperty: number; + public nullable2UIntProperty: number; + public nullable2LongProperty: number; + public nullable2ULongProperty: number; + public nullable2FloatProperty: number; + public nullable2DoubleProperty: number; + public systemStringProperty: string; + public systemInt16Property: number; + public systemInt32Property: number; + public systemInt64Property: number; + public systemSingleProperty: number; + public systemDoubleProperty: number; + public systemDateTimeProperty: Date; + public systemArrayProperty: []; + public systemByteProperty: number; + public systemCharProperty: number; + public systemDecimalProperty: number; + public systemGuidProperty: string; + public systemObjectProperty: unknown; + public systemTimeSpanProperty: string; + public systemUInt16Property: number; + public systemUInt32Property: number; + public systemUInt64Property: number; + public subTypeProperty: SubType; + public stringArrayProperty: string[]; + public intArrayProperty: number[]; + public byteArrayProperty: number[]; + public systemDateTimeArrayProperty: Date[]; + public subTypeArrayProperty: SubType[]; + public stringList: string[]; + public subTypeList: SubType[]; + public stringStringDictionary: { [key: string]: string; }; + public intStringDictionary: { [key: number]: string; }; + public stringSubTypeDictionary: { [key: string]: SubType; }; + public intSubTypeDictionary: { [key: number]: SubType; }; + public subTypeStringDictionary: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ }; + public genericSubType: GenericSubType; + public readonlyProperty: string; + public writeonlyProperty: string; +} + +// outputid:9c33e37c-3a6c-404f-8fab-dae790c04a8c diff --git a/Tests/Net9/Types.cs b/Tests/Net9/Types.cs new file mode 100644 index 00000000..23b3a9a9 --- /dev/null +++ b/Tests/Net9/Types.cs @@ -0,0 +1,128 @@ +using System; +using System.Collections.Generic; +using KY.Generator; + +namespace Net7 +{ + [Generate(OutputLanguage.TypeScript, "Output")] + public class Types + { + // Fields + public string StringField; + public int IntField; + public System.DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Types + public string StringProperty { get; set; } + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } + public System.Byte SystemByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } + + // Arrays + public string[] StringArrayProperty { get; set; } + public int[] IntArrayProperty { get; set; } + public byte[] ByteArrayProperty { get; set; } + public System.DateTime[] SystemDateTimeArrayProperty { get; set; } + public SubType[] SubTypeArrayProperty { get; set; } + + // Generics + public List StringList { get; set; } + public List SubTypeList { get; set; } + public Dictionary StringStringDictionary { get; set; } + public Dictionary IntStringDictionary { get; set; } + public Dictionary StringSubTypeDictionary { get; set; } + public Dictionary IntSubTypeDictionary { get; set; } + public Dictionary SubTypeStringDictionary { get; set; } + public GenericSubType GenericSubType { get; set; } + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } + private string PrivateProperty { get; set; } + internal string InternalProperty { get; set; } + protected string ProtectedField; + private string PrivateField; + internal string InternalField; + } + + public class SubType + { + public string Property { get; set; } + } + + public class GenericSubType + { + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } + } +} diff --git a/Tests/ReflectionLoadFromNugetPackageNet5/AssemblyInfo.cs b/Tests/ReflectionLoadFromNugetPackageNet5/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/ReflectionLoadFromNugetPackageNet5/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/ReflectionLoadFromNugetPackageNet5/Output/class-1.ts b/Tests/ReflectionLoadFromNugetPackageNet5/Output/class-1.ts index 5af5d16e..877cbca6 100644 --- a/Tests/ReflectionLoadFromNugetPackageNet5/Output/class-1.ts +++ b/Tests/ReflectionLoadFromNugetPackageNet5/Output/class-1.ts @@ -1,16 +1,8 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated with KY.Generator 7.6.0.0 -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -// ------------------------------------------------------------------------------ -/* eslint-disable */ +/* eslint-disable */ // tslint:disable export class Class1 { - public test: string; + public test?: string; } // outputid:3d99e563-cf4b-42d2-aaca-9088f7a71b7e diff --git a/Tests/ReflectionLoadFromNugetPackageNet5/ReflectionLoadFromNugetPackageNet5.csproj b/Tests/ReflectionLoadFromNugetPackageNet5/ReflectionLoadFromNugetPackageNet5.csproj index 88eed4d6..debaa127 100644 --- a/Tests/ReflectionLoadFromNugetPackageNet5/ReflectionLoadFromNugetPackageNet5.csproj +++ b/Tests/ReflectionLoadFromNugetPackageNet5/ReflectionLoadFromNugetPackageNet5.csproj @@ -6,8 +6,8 @@ - - + + diff --git a/Tests/SignalR.sln b/Tests/SignalR.sln new file mode 100644 index 00000000..bcb0a19e --- /dev/null +++ b/Tests/SignalR.sln @@ -0,0 +1,16 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SignalR", "SignalR\SignalR.csproj", "{4FCCBE11-98E3-40AC-9646-D806BBFBA631}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4FCCBE11-98E3-40AC-9646-D806BBFBA631}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4FCCBE11-98E3-40AC-9646-D806BBFBA631}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4FCCBE11-98E3-40AC-9646-D806BBFBA631}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4FCCBE11-98E3-40AC-9646-D806BBFBA631}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/SignalR/.gitignore b/Tests/SignalR/.gitignore new file mode 100644 index 00000000..41ffa34d --- /dev/null +++ b/Tests/SignalR/.gitignore @@ -0,0 +1,231 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/Tests/SignalR/AssemblyInfo.cs b/Tests/SignalR/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/SignalR/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/SignalR/ClientApp/.browserslistrc b/Tests/SignalR/ClientApp/.browserslistrc new file mode 100644 index 00000000..427441dc --- /dev/null +++ b/Tests/SignalR/ClientApp/.browserslistrc @@ -0,0 +1,17 @@ +# This file is used by the build system to adjust CSS and JS output to support the specified browsers below. +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries + +# For the full list of supported browsers by the Angular framework, please see: +# https://angular.io/guide/browser-support + +# You can see what browsers were selected by your queries by running: +# npx browserslist + +last 1 Chrome version +last 1 Firefox version +last 2 Edge major versions +last 2 Safari major versions +last 2 iOS major versions +Firefox ESR +not IE 11 # Angular supports IE 11 only as an opt-in. To opt-in, remove the 'not' prefix on this line. diff --git a/Tests/SignalR/ClientApp/.editorconfig b/Tests/SignalR/ClientApp/.editorconfig new file mode 100644 index 00000000..5fc7188f --- /dev/null +++ b/Tests/SignalR/ClientApp/.editorconfig @@ -0,0 +1,19 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.ts] +quote_type = single + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.{razor,cshtml}] +charset = utf-8-bom diff --git a/Tests/SignalR/ClientApp/.gitignore b/Tests/SignalR/ClientApp/.gitignore new file mode 100644 index 00000000..e1f679be --- /dev/null +++ b/Tests/SignalR/ClientApp/.gitignore @@ -0,0 +1,40 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/dist-server +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Tests/SignalR/ClientApp/README.md b/Tests/SignalR/ClientApp/README.md new file mode 100644 index 00000000..f1d83826 --- /dev/null +++ b/Tests/SignalR/ClientApp/README.md @@ -0,0 +1,27 @@ +# SignalR + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.0.2. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via a platform of your choice. To use this command, you need to first add a package that implements end-to-end testing capabilities. + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/Tests/SignalR/ClientApp/angular.json b/Tests/SignalR/ClientApp/angular.json new file mode 100644 index 00000000..4c899f7d --- /dev/null +++ b/Tests/SignalR/ClientApp/angular.json @@ -0,0 +1,133 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "SignalR": { + "projectType": "application", + "schematics": { + "@schematics/angular:application": { + "strict": true + } + }, + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "progress": false, + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.app.json", + "assets": [ + "src/assets" + ], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kb", + "maximumError": "1mb" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "2kb", + "maximumError": "4kb" + } + ], + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "outputHashing": "all" + }, + "development": { + "buildOptimizer": false, + "optimization": false, + "vendorChunk": true, + "extractLicenses": false, + "sourceMap": true, + "namedChunks": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "configurations": { + "production": { + "browserTarget": "SignalR:build:production" + }, + "development": { + "browserTarget": "SignalR:build:development", + "proxyConfig": "proxy.conf.js" + } + }, + "defaultConfiguration": "development" + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "SignalR:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "tsconfig.spec.json", + "karmaConfig": "karma.conf.js", + "assets": [ + "src/assets" + ], + "styles": [ + "src/styles.css" + ], + "scripts": [] + } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist-server", + "main": "src/main.ts", + "tsConfig": "tsconfig.server.json" + }, + "configurations": { + "dev": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": true + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + } + } + } + }, + "defaultProject": "SignalR" +} diff --git a/Tests/SignalR/ClientApp/aspnetcore-https.js b/Tests/SignalR/ClientApp/aspnetcore-https.js new file mode 100644 index 00000000..2bde9286 --- /dev/null +++ b/Tests/SignalR/ClientApp/aspnetcore-https.js @@ -0,0 +1,33 @@ +// This script sets up HTTPS for the application using the ASP.NET Core HTTPS certificate +const fs = require('fs'); +const spawn = require('child_process').spawn; +const path = require('path'); + +const baseFolder = + process.env.APPDATA !== undefined && process.env.APPDATA !== '' + ? `${process.env.APPDATA}/ASP.NET/https` + : `${process.env.HOME}/.aspnet/https`; + +const certificateArg = process.argv.map(arg => arg.match(/--name=(?.+)/i)).filter(Boolean)[0]; +const certificateName = certificateArg ? certificateArg.groups.value : process.env.npm_package_name; + +if (!certificateName) { + console.error('Invalid certificate name. Run this script in the context of an npm/yarn script or pass --name=<> explicitly.') + process.exit(-1); +} + +const certFilePath = path.join(baseFolder, `${certificateName}.pem`); +const keyFilePath = path.join(baseFolder, `${certificateName}.key`); + +if (!fs.existsSync(certFilePath) || !fs.existsSync(keyFilePath)) { + spawn('dotnet', [ + 'dev-certs', + 'https', + '--export-path', + certFilePath, + '--format', + 'Pem', + '--no-password', + ], { stdio: 'inherit', }) + .on('exit', (code) => process.exit(code)); +} diff --git a/Tests/SignalR/ClientApp/karma.conf.js b/Tests/SignalR/ClientApp/karma.conf.js new file mode 100644 index 00000000..95d59d9c --- /dev/null +++ b/Tests/SignalR/ClientApp/karma.conf.js @@ -0,0 +1,44 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + jasmine: { + // you can add configuration options for Jasmine here + // the possible options are listed at https://jasmine.github.io/api/edge/Configuration.html + // for example, you can disable the random execution with `random: false` + // or set a specific seed with `seed: 4321` + }, + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + jasmineHtmlReporter: { + suppressAll: true // removes the duplicated traces + }, + coverageReporter: { + dir: require('path').join(__dirname, './coverage/angularapp'), + subdir: '.', + reporters: [ + { type: 'html' }, + { type: 'text-summary' } + ] + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false, + restartOnFileChange: true + }); +}; diff --git a/Tests/SignalR/ClientApp/package-lock.json b/Tests/SignalR/ClientApp/package-lock.json new file mode 100644 index 00000000..2a0f46d5 --- /dev/null +++ b/Tests/SignalR/ClientApp/package-lock.json @@ -0,0 +1,20450 @@ +{ + "name": "signalr", + "version": "0.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "signalr", + "version": "0.0.0", + "dependencies": { + "@angular/animations": "~13.3.5", + "@angular/common": "~13.3.5", + "@angular/compiler": "~13.3.5", + "@angular/core": "~13.3.5", + "@angular/forms": "~13.3.5", + "@angular/platform-browser": "~13.3.5", + "@angular/platform-browser-dynamic": "~13.3.5", + "@angular/platform-server": "~13.3.5", + "@angular/router": "~13.3.5", + "bootstrap": "^5.1.3", + "jquery": "^3.6.0", + "oidc-client": "^1.11.5", + "popper.js": "^1.16.0", + "run-script-os": "^1.1.6", + "rxjs": "~7.5.5", + "tslib": "^2.4.0", + "zone.js": "~0.11.5" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~13.3.4", + "@angular/cli": "~13.3.4", + "@angular/compiler-cli": "~13.3.5", + "@types/jasmine": "~4.0.3", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^17.0.29", + "jasmine-core": "~4.1.0", + "karma": "~6.3.19", + "karma-chrome-launcher": "~3.1.1", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.0.0", + "karma-jasmine-html-reporter": "^1.7.0", + "typescript": "~4.6.3" + } + }, + "node_modules/@ampproject/remapping": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "sourcemap-codec": "1.4.8" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@angular-devkit/architect": { + "version": "0.1303.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.4.tgz", + "integrity": "sha512-d6YmIWdYvwk6WaknHRcJgiXeJvX9K5i8uPMAaL2P2/LU8n3moIQ59C7SP0uULcHuuiREEmFWOyyrWnGxZCI9bg==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.4", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/architect/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.4.tgz", + "integrity": "sha512-z74cmDi2V+5XpvyZKFlUXxvQ446shxyZk5aGdToG6n+0/IJWkDXSiryQkCo8nblGMze7HKf75i3DsGWYQZLDnQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1303.4", + "@angular-devkit/build-webpack": "0.1303.4", + "@angular-devkit/core": "13.3.4", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.3.4", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild-wasm": "0.14.22", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.5", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.49.9", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.11.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.70.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "optionalDependencies": { + "esbuild": "0.14.22" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0 || ^13.3.0-rc.0", + "@angular/localize": "^13.0.0 || ^13.3.0-rc.0", + "@angular/service-worker": "^13.0.0 || ^13.3.0-rc.0", + "karma": "^6.3.0", + "ng-packagr": "^13.0.0", + "protractor": "^7.0.0", + "tailwindcss": "^2.0.0 || ^3.0.0", + "typescript": ">=4.4.3 <4.7" + }, + "peerDependenciesMeta": { + "@angular/localize": { + "optional": true + }, + "@angular/service-worker": { + "optional": true + }, + "karma": { + "optional": true + }, + "ng-packagr": { + "optional": true + }, + "protractor": { + "optional": true + }, + "tailwindcss": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + }, + "node_modules/@angular-devkit/build-webpack": { + "version": "0.1303.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.4.tgz", + "integrity": "sha512-3F10P9XshRXkI/PEmJUcgP4yK4sobaoInQfifzPNOemrS5nXs8y3uEiQuxzyswYx/dymZLV+19sV/eh1WfXnBA==", + "dev": true, + "dependencies": { + "@angular-devkit/architect": "0.1303.4", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "webpack": "^5.30.0", + "webpack-dev-server": "^4.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/core": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.4.tgz", + "integrity": "sha512-gj6i8ksPaT2bvYwI7wKJxLX53pHfTmZc1RaNbAGfZB1/zFNnb3MPj8utTcJSk4qMsGXuDDhiB7hpTKBw8ROaGA==", + "dev": true, + "dependencies": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/core/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular-devkit/schematics": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.4.tgz", + "integrity": "sha512-gKNpMMoZJjLKdXxjuVembic4GWa4AYV7kU1ou3ZuZoDKtKcig9URISr1wjS+nrhKYz+miFy0zIqSGMMattDlDQ==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.4", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "dependencies": { + "tslib": "^1.9.0" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/@angular-devkit/schematics/node_modules/tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + }, + "node_modules/@angular/animations": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.5.tgz", + "integrity": "sha512-BYXX80N1hxkATWqv2IZddfKvqxomktxH5fREv+KjwIYFkyK9KBnRBILqynyIJaXXut5KE6QNOf1zWEZxdOnc3A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.3.5" + } + }, + "node_modules/@angular/cli": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.4.tgz", + "integrity": "sha512-4S5FNjkZgq98zcBVgwkYtMgMRMSVsprCgq7dM8yTxIQh+Np3fYgj5eRJ1+mfFG/kankH2z/TFyuoYiILh2D9Uw==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@angular-devkit/architect": "0.1303.4", + "@angular-devkit/core": "13.3.4", + "@angular-devkit/schematics": "13.3.4", + "@schematics/angular": "13.3.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.3", + "resolve": "1.22.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + }, + "bin": { + "ng": "bin/ng.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular/common": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.5.tgz", + "integrity": "sha512-teG+itdlw2sOMwYeXkeFe8h32SsNqN0qHHz/v6I9qKHgCLkC/or8A7NtsoCwYSTymIEJJ7DZ1w9VWhM7DSYd1w==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/core": "13.3.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/compiler": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.5.tgz", + "integrity": "sha512-iSQlYevMk5glwZSXTXf2GytykqZWdK3Rr8heIvEPqd8n88MSB3w1KnDc1fnHLF950q/nUR9K+3r4wWPwc8J2IQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + } + }, + "node_modules/@angular/compiler-cli": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.5.tgz", + "integrity": "sha512-H7A+MZcbB4g5fa6O4giYgrCG1h5whJfIxr4txDtDfolygzwRzqH1PSMfjW/jYyIpaH6XqXMSDHvbXRFGKstboA==", + "dev": true, + "dependencies": { + "@babel/core": "^7.17.2", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "bin": { + "ng-xi18n": "bundles/src/bin/ng_xi18n.js", + "ngc": "bundles/src/bin/ngc.js", + "ngcc": "bundles/ngcc/main-ngcc.js" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/compiler": "13.3.5", + "typescript": ">=4.4.2 <4.7" + } + }, + "node_modules/@angular/compiler-cli/node_modules/magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.8" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@angular/core": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.5.tgz", + "integrity": "sha512-lf+Be8dDRvz8J+QFR2RxS3BBfgGM4eWq4bI1+k/aqDnM6OW4pQXdq8Lzae8SxN48u1NxB1M/1bbc9LcrChrj2Q==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "rxjs": "^6.5.3 || ^7.4.0", + "zone.js": "~0.11.4" + } + }, + "node_modules/@angular/forms": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.5.tgz", + "integrity": "sha512-jCxxAwf4HkDmKE76/yQmTsbqW3jsxiKyPy32Nh6Bt4r/ww8VDv+sv5YdYNuvvZcuuQ70K+/EPnKFpQgYttvS8A==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.3.5", + "@angular/core": "13.3.5", + "@angular/platform-browser": "13.3.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@angular/platform-browser": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.5.tgz", + "integrity": "sha512-DPV1J3h1ua4GI9PuXDr8IlzJoC/TR0A/onPTaE6IFOzs1r28vB+vWRRbZURXrTYeWzWVB/2R9tPOqFNoi3zlzA==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/animations": "13.3.5", + "@angular/common": "13.3.5", + "@angular/core": "13.3.5" + }, + "peerDependenciesMeta": { + "@angular/animations": { + "optional": true + } + } + }, + "node_modules/@angular/platform-browser-dynamic": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.5.tgz", + "integrity": "sha512-Mko8/mRlcVsZJQ5zHfc/p7so/ZN16UMynTnksrD7cEgGxDuJosE8m+exqgoT03VCYaOjJtCFXSwdOb/8FOUDZQ==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.3.5", + "@angular/compiler": "13.3.5", + "@angular/core": "13.3.5", + "@angular/platform-browser": "13.3.5" + } + }, + "node_modules/@angular/platform-server": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.3.5.tgz", + "integrity": "sha512-ja9/mgBIAriQO3H9Q1MTXxJV1s59a2NJeeOffGHr86TLDcaxxzumozfoaKr5p6m0Ty3yqZcFc3wUQJl5I/1H0A==", + "dependencies": { + "domino": "^2.1.2", + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/animations": "13.3.5", + "@angular/common": "13.3.5", + "@angular/compiler": "13.3.5", + "@angular/core": "13.3.5", + "@angular/platform-browser": "13.3.5", + "@angular/platform-browser-dynamic": "13.3.5" + } + }, + "node_modules/@angular/router": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.5.tgz", + "integrity": "sha512-3yUNyBpUi0KUKP91a3dVQsr9Jfjs4wGxpiFYb3apc7lKT5R1LJqt2O0EchjOgvFyJ6TDOemdCAzKgvSRkDxpMw==", + "dependencies": { + "tslib": "^2.3.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0" + }, + "peerDependencies": { + "@angular/common": "13.3.5", + "@angular/core": "13.3.5", + "@angular/platform-browser": "13.3.5", + "rxjs": "^6.5.3 || ^7.4.0" + } + }, + "node_modules/@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "node_modules/@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "dependencies": { + "@babel/highlight": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "dependencies": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/core/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dev": true, + "dependencies": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0-0" + } + }, + "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "dependencies": { + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "dev": true, + "dependencies": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dev": true, + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "dev": true, + "dependencies": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dev": true, + "dependencies": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "dev": true, + "dependencies": { + "regenerator-transform": "^0.15.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "dev": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "dependencies": { + "regenerator-runtime": "^0.13.4" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "dependencies": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "dependencies": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "node_modules/@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "dependencies": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "dependencies": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "dev": true, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "dependencies": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "node_modules/@ngtools/webpack": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.4.tgz", + "integrity": "sha512-dNDNeAOwtpX5A7TTEsgDbkg4jTmAJHD96qLqcpJqfBg8nZ4mqn6E0HinX9HZKaCST1/75T6GsFo1Muc4MsHYgA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "@angular/compiler-cli": "^13.0.0", + "typescript": ">=4.4.3 <4.7", + "webpack": "^5.30.0" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "dependencies": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + } + }, + "node_modules/@npmcli/git/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "dependencies": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "installed-package-contents": "index.js" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "node_modules/@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "dependencies": { + "infer-owner": "^1.0.4" + } + }, + "node_modules/@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "dependencies": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "node_modules/@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/@schematics/angular": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.4.tgz", + "integrity": "sha512-Cta11k965Igz2kWj60KQ/9z6RFAg9FjZ8i1TH4nyROJs9nWemWPQNA+OJFuXrEy6Ldpk7yJ5cWgJsyryGB25PA==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "13.3.4", + "@angular-devkit/schematics": "13.3.4", + "jsonc-parser": "3.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.15.0 || >=16.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "node_modules/@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "node_modules/@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "node_modules/@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "node_modules/@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/jasmine": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", + "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", + "dev": true + }, + "node_modules/@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", + "dev": true, + "dependencies": { + "@types/jasmine": "*" + } + }, + "node_modules/@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 + }, + "node_modules/@types/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "node_modules/@types/node": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.29.tgz", + "integrity": "sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA==", + "dev": true + }, + "node_modules/@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "node_modules/@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "node_modules/@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "node_modules/@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@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, + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + } + }, + "node_modules/@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 + }, + "node_modules/@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 + }, + "node_modules/@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 + }, + "node_modules/@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, + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.1", + "@webassemblyjs/helper-api-error": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@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 + }, + "node_modules/@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, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1" + } + }, + "node_modules/@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, + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@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, + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@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 + }, + "node_modules/@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, + "dependencies": { + "@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" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + } + }, + "node_modules/@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, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/helper-buffer": "1.11.1", + "@webassemblyjs/wasm-gen": "1.11.1", + "@webassemblyjs/wasm-parser": "1.11.1" + } + }, + "node_modules/@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, + "dependencies": { + "@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" + } + }, + "node_modules/@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, + "dependencies": { + "@webassemblyjs/ast": "1.11.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@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 + }, + "node_modules/@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 + }, + "node_modules/@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "node_modules/abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "node_modules/abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "node_modules/accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/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, + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "dependencies": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "engines": { + "node": ">=8.9" + } + }, + "node_modules/adjust-sourcemap-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.21.3" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true, + "engines": [ + "node >= 0.8.0" + ], + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "node_modules/are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "dependencies": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "node_modules/array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "dependencies": { + "lodash": "^4.17.14" + } + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true, + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.5.tgz", + "integrity": "sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + } + ], + "dependencies": { + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001332", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "dependencies": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "engines": { + "node": ">= 8.9" + }, + "peerDependencies": { + "@babel/core": "^7.0.0", + "webpack": ">=2" + } + }, + "node_modules/babel-loader/node_modules/json5": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz", + "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/babel-loader/node_modules/loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true, + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "node_modules/body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/body-parser/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "dependencies": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "node_modules/bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + }, + "peerDependencies": { + "@popperjs/core": "^2.10.2" + } + }, + "node_modules/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, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/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 + }, + "node_modules/buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "node_modules/builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + } + ] + }, + "node_modules/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, + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "node_modules/chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "engines": { + "node": ">=6.0.0" + }, + "peerDependencies": { + "webpack": ">=4.0.1" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/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, + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/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, + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "node_modules/color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true, + "bin": { + "color-support": "bin.js" + } + }, + "node_modules/colorette": { + "version": "2.0.16", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", + "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", + "dev": true + }, + "node_modules/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 + }, + "node_modules/commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "node_modules/content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-disposition/node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.1" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "node_modules/copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "dependencies": { + "is-what": "^3.12.0" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 12.20.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==", + "hasInstallScript": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", + "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", + "dev": true, + "dependencies": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat/node_modules/semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + } + }, + "node_modules/critters/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/critters/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/critters/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/critters/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/critters/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/critters/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/cross-spawn/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "node_modules/css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "dependencies": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + } + }, + "node_modules/css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-blank-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "bin": { + "css-has-pseudo": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "bin": { + "css-prefers-color-scheme": "dist/cli.cjs" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/cssdb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", + "dev": true + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "node_modules/date-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "dependencies": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "dependencies": { + "clone": "^1.0.2" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/del/node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/del/node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true, + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "node_modules/di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "node_modules/dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "dependencies": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "node_modules/dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "dependencies": { + "buffer-indexof": "^1.0.0" + } + }, + "node_modules/dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "dependencies": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "node_modules/dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ] + }, + "node_modules/domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "node_modules/electron-to-chromium": { + "version": "1.4.124", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.124.tgz", + "integrity": "sha512-VhaE9VUYU6d2eIb+4xf83CATD+T+3bTzvxvlADkQE+c2hisiw3sZmvEDtsW704+Zky9WZGhBuQXijDVqSriQLA==", + "dev": true + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "dependencies": { + "iconv-lite": "^0.6.2" + } + }, + "node_modules/encoding/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "dev": true, + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "dependencies": { + "@socket.io/base64-arraybuffer": "~1.0.2" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "node_modules/errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "dependencies": { + "prr": "~1.0.1" + }, + "bin": { + "errno": "cli.js" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/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 + }, + "node_modules/esbuild": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz", + "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "esbuild-android-arm64": "0.14.22", + "esbuild-darwin-64": "0.14.22", + "esbuild-darwin-arm64": "0.14.22", + "esbuild-freebsd-64": "0.14.22", + "esbuild-freebsd-arm64": "0.14.22", + "esbuild-linux-32": "0.14.22", + "esbuild-linux-64": "0.14.22", + "esbuild-linux-arm": "0.14.22", + "esbuild-linux-arm64": "0.14.22", + "esbuild-linux-mips64le": "0.14.22", + "esbuild-linux-ppc64le": "0.14.22", + "esbuild-linux-riscv64": "0.14.22", + "esbuild-linux-s390x": "0.14.22", + "esbuild-netbsd-64": "0.14.22", + "esbuild-openbsd-64": "0.14.22", + "esbuild-sunos-64": "0.14.22", + "esbuild-windows-32": "0.14.22", + "esbuild-windows-64": "0.14.22", + "esbuild-windows-arm64": "0.14.22" + } + }, + "node_modules/esbuild-android-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz", + "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz", + "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-darwin-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz", + "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz", + "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-freebsd-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz", + "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz", + "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz", + "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz", + "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz", + "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-mips64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz", + "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-ppc64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz", + "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-riscv64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz", + "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-linux-s390x": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz", + "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-netbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz", + "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-openbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz", + "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-sunos-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz", + "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-wasm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz", + "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==", + "dev": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz", + "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz", + "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/esbuild-windows-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz", + "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "node_modules/events": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", + "dev": true, + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", + "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", + "dev": true, + "dependencies": { + "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" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.0.tgz", + "integrity": "sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "node_modules/express/node_modules/cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/express/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/express/node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/express/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "node_modules/external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "dependencies": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/fast-glob": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "dependencies": { + "escape-string-regexp": "^1.0.5" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "dependencies": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + } + }, + "node_modules/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, + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "node_modules/follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://www.patreon.com/infusion" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "dependencies": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "dev": true, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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 + }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "dependencies": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "node_modules/hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "dependencies": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "node_modules/hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "node_modules/hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "node_modules/http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-errors/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "dev": true + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "dependencies": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/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, + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "dependencies": { + "ms": "^2.0.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "dependencies": { + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-fresh/node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/inquirer/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/inquirer/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/inquirer/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/inquirer/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/inquirer/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "node_modules/ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true, + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "node_modules/isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "dev": true, + "engines": { + "node": ">= 8.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/gjtorikian/" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "node_modules/isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "dependencies": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-instrument/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-report/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/istanbul-lib-source-maps/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "dev": true, + "dependencies": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jasmine-core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.0.tgz", + "integrity": "sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==", + "dev": true + }, + "node_modules/jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "dev": true, + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/jest-worker/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/jest-worker/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/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 + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true, + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true, + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/karma": { + "version": "6.3.19", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", + "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", + "dev": true, + "dependencies": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "bin": { + "karma": "bin/karma" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "dependencies": { + "which": "^1.2.1" + } + }, + "node_modules/karma-coverage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "dev": true, + "dependencies": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/karma-jasmine": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.0.tgz", + "integrity": "sha512-dsFkCoTwyoNyQnMgegS72wIA/2xPDJG5yzTry0448U6lAY7P60Wgg4UuLlbdLv8YHbimgNpDXjjmfPdc99EDWQ==", + "dev": true, + "dependencies": { + "jasmine-core": "^4.1.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "karma": "^6.0.0" + } + }, + "node_modules/karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "peerDependencies": { + "jasmine-core": ">=3.8", + "karma": ">=0.9", + "karma-jasmine": ">=1.1" + } + }, + "node_modules/karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "dependencies": { + "source-map-support": "^0.5.5" + } + }, + "node_modules/karma/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/karma/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/karma/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/karma/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/karma/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "dependencies": { + "copy-anything": "^2.0.1", + "parse-node-version": "^1.0.1", + "tslib": "^2.3.0" + }, + "bin": { + "lessc": "bin/lessc" + }, + "engines": { + "node": ">=6" + }, + "optionalDependencies": { + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "source-map": "~0.6.0" + } + }, + "node_modules/less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "less": "^3.5.0 || ^4.0.0", + "webpack": "^5.0.0" + } + }, + "node_modules/less/node_modules/make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "dependencies": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/less/node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/less/node_modules/semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": true, + "bin": { + "semver": "bin/semver" + } + }, + "node_modules/less/node_modules/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, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "dependencies": { + "webpack-sources": "^3.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-sources": { + "optional": true + } + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "dev": true + }, + "node_modules/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, + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true, + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/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, + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "node_modules/log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/log-symbols/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-symbols/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-symbols/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/log4js": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", + "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "dev": true, + "dependencies": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.6" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/log4js/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "dependencies": { + "sourcemap-codec": "^1.4.4" + } + }, + "node_modules/make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "dependencies": { + "semver": "^6.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/make-dir/node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "dependencies": { + "fs-monkey": "1.0.3" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "node_modules/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 + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", + "dev": true, + "dependencies": { + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "node_modules/minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "dependencies": { + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + }, + "engines": { + "node": ">=8" + }, + "optionalDependencies": { + "encoding": "^0.1.12" + } + }, + "node_modules/minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "dependencies": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "node_modules/minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "dependencies": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true, + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "dependencies": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "node_modules/mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "node_modules/nanoid": { + "version": "3.1.31", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz", + "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==", + "dev": true, + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "dependencies": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "bin": { + "needle": "bin/needle" + }, + "engines": { + "node": ">= 4.4.x" + } + }, + "node_modules/needle/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/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_modules/nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "hasInstallScript": true, + "optional": true, + "os": [ + "!win32" + ], + "dependencies": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node_modules/node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true, + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "bin": { + "node-gyp": "bin/node-gyp.js" + }, + "engines": { + "node": ">= 10.12.0" + } + }, + "node_modules/node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "dev": true, + "optional": true, + "bin": { + "node-gyp-build": "bin.js", + "node-gyp-build-optional": "optional.js", + "node-gyp-build-test": "build-test.js" + } + }, + "node_modules/node-gyp/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/node-releases": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "dev": true + }, + "node_modules/nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "dependencies": { + "abbrev": "1" + }, + "bin": { + "nopt": "bin/nopt.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "dependencies": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "node_modules/npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "dependencies": { + "semver": "^7.1.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "node_modules/npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "dependencies": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "dependencies": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + }, + "bin": { + "npm-packlist": "bin/index.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "dependencies": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "node_modules/npm-registry-fetch": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", + "dev": true, + "dependencies": { + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/npm-registry-fetch/node_modules/@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "dependencies": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "dependencies": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/cacache": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.7.tgz", + "integrity": "sha512-a4zfQpp5vm4Ipdvbj+ZrPonikRhm6WBEd4zT1Yc1DXsmAxrPgDwWBLF/u/wTVXSFPIgOJ1U3ghSa2Xm4s3h28w==", + "dev": true, + "dependencies": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/npm-registry-fetch/node_modules/lru-cache": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", + "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz", + "integrity": "sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==", + "dev": true, + "dependencies": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.2", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^9.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/npm-registry-fetch/node_modules/make-fetch-happen/node_modules/minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "dependencies": { + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + }, + "optionalDependencies": { + "encoding": "^0.1.13" + } + }, + "node_modules/npm-registry-fetch/node_modules/minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/npm-registry-fetch/node_modules/ssri": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", + "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/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, + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "dependencies": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16.0.0" + } + }, + "node_modules/nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "node_modules/oidc-client": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.5.tgz", + "integrity": "sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==", + "dependencies": { + "acorn": "^7.4.1", + "base64-js": "^1.5.1", + "core-js": "^3.8.3", + "crypto-js": "^4.0.0", + "serialize-javascript": "^4.0.0" + } + }, + "node_modules/oidc-client/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/oidc-client/node_modules/serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "dev": true, + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ora/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/ora/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/ora/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/ora/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/ora/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/ora/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/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, + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-retry/node_modules/retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/pacote": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", + "dev": true, + "dependencies": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^12.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + }, + "bin": { + "pacote": "lib/bin.js" + }, + "engines": { + "node": "^12.13.0 || ^14.15.0 || >=16" + } + }, + "node_modules/pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "dependencies": { + "parse5": "^6.0.1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/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 + }, + "node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "dependencies": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0" + }, + "optionalDependencies": { + "nice-napi": "^1.0.2" + } + }, + "node_modules/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, + "dependencies": { + "find-up": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==", + "deprecated": "You can find the new Popper v2 at @popperjs/core, this package is dedicated to the legacy v1", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "dependencies": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "engines": { + "node": ">= 0.12.0" + } + }, + "node_modules/portfinder/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/portfinder/node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "dependencies": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + } + }, + "node_modules/postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.2" + }, + "peerDependencies": { + "postcss": "^8.0.2" + } + }, + "node_modules/postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.3" + } + }, + "node_modules/postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-custom-properties": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", + "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.2" + } + }, + "node_modules/postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-double-position-gradients": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.9" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-lab-function": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", + "dev": true, + "dependencies": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "dependencies": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-nesting": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "peerDependencies": { + "postcss": "^8" + } + }, + "node_modules/postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "dev": true, + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "dev": true, + "dependencies": { + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-pseudo-class-any-link": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "dev": true, + "dependencies": { + "postcss-selector-parser": "^6.0.10" + }, + "engines": { + "node": "^12 || ^14 || >=16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + }, + "peerDependencies": { + "postcss": "^8.4" + } + }, + "node_modules/postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "peerDependencies": { + "postcss": "^8.0.3" + } + }, + "node_modules/postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "node_modules/promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "node_modules/promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "dependencies": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": true + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true, + "engines": { + "node": ">=0.9" + } + }, + "node_modules/qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "dependencies": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "node_modules/regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "node_modules/regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "dependencies": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "node_modules/regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true, + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "dependencies": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/resolve-url-loader/node_modules/loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/resolve-url-loader/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/run-script-os": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", + "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==", + "bin": { + "run-os": "index.js", + "run-script-os": "index.js" + } + }, + "node_modules/rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "dependencies": { + "tslib": "^2.1.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "node_modules/sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "dependencies": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "dependencies": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "fibers": ">= 3.1.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "sass": "^1.3.0", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "fibers": { + "optional": true + }, + "node-sass": { + "optional": true + }, + "sass": { + "optional": true + } + } + }, + "node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "node_modules/schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/schema-utils/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/schema-utils/node_modules/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/schema-utils/node_modules/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 + }, + "node_modules/select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "node_modules/selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "dependencies": { + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/send/node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "node_modules/send/node_modules/on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/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, + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "node_modules/serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "node_modules/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, + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "node_modules/slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true, + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "node_modules/socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "dependencies": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "dependencies": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.13.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", + "dev": true, + "dependencies": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/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, + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/source-map-loader/node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dev": true, + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "node_modules/spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "node_modules/ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "dependencies": { + "minipass": "^3.1.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/streamroller": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "dev": true, + "dependencies": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/streamroller/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string_decoder/node_modules/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, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/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, + "engines": { + "node": ">=6" + } + }, + "node_modules/stylus": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", + "dev": true, + "dependencies": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "dependencies": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "stylus": ">=0.52.4", + "webpack": "^5.0.0" + } + }, + "node_modules/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, + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "dependencies": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/terser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "dev": true, + "dependencies": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "dependencies": { + "jest-worker": "^27.4.1", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1", + "terser": "^5.7.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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 + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/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, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "dependencies": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "node_modules/thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "node_modules/tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "dependencies": { + "os-tmpdir": "~1.0.2" + }, + "engines": { + "node": ">=0.6.0" + } + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true, + "bin": { + "tree-kill": "cli.js" + } + }, + "node_modules/tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "node_modules/type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "node_modules/typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=4.2.0" + } + }, + "node_modules/ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/ua-parser-js" + }, + { + "type": "paypal", + "url": "https://paypal.me/faisalman" + } + ], + "engines": { + "node": "*" + } + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "dependencies": { + "unique-slug": "^2.0.0" + } + }, + "node_modules/unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "dependencies": { + "imurmurhash": "^0.1.4" + } + }, + "node_modules/universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "dependencies": { + "builtins": "^1.0.3" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "dependencies": { + "defaults": "^1.0.3" + } + }, + "node_modules/webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@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.9.2", + "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.9", + "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.3.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "dev": true, + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "dev": true, + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/webpack-dev-server/node_modules/schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpack-dev-server/node_modules/strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/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, + "dependencies": { + "clone-deep": "^4.0.1", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "dependencies": { + "typed-assert": "^1.0.8" + }, + "engines": { + "node": ">= 12" + }, + "peerDependencies": { + "html-webpack-plugin": ">= 5.0.0-beta.1 < 6", + "webpack": "^5.12.0" + }, + "peerDependenciesMeta": { + "html-webpack-plugin": { + "optional": true + } + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/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, + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/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 + }, + "node_modules/webpack/node_modules/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, + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "dependencies": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "node_modules/wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "node_modules/ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/zone.js": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "dependencies": { + "tslib": "^2.3.0" + } + } + }, + "dependencies": { + "@ampproject/remapping": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-1.1.1.tgz", + "integrity": "sha512-YVAcA4DKLOj296CF5SrQ8cYiMRiUGc2sqFpLxsDGWE34suHqhGP/5yMsDHKsrh8hs8I5TiRVXNwKPWQpX3iGjw==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "sourcemap-codec": "1.4.8" + } + }, + "@angular-devkit/architect": { + "version": "0.1303.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1303.4.tgz", + "integrity": "sha512-d6YmIWdYvwk6WaknHRcJgiXeJvX9K5i8uPMAaL2P2/LU8n3moIQ59C7SP0uULcHuuiREEmFWOyyrWnGxZCI9bg==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.4", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/build-angular": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-13.3.4.tgz", + "integrity": "sha512-z74cmDi2V+5XpvyZKFlUXxvQ446shxyZk5aGdToG6n+0/IJWkDXSiryQkCo8nblGMze7HKf75i3DsGWYQZLDnQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "1.1.1", + "@angular-devkit/architect": "0.1303.4", + "@angular-devkit/build-webpack": "0.1303.4", + "@angular-devkit/core": "13.3.4", + "@babel/core": "7.16.12", + "@babel/generator": "7.16.8", + "@babel/helper-annotate-as-pure": "7.16.7", + "@babel/plugin-proposal-async-generator-functions": "7.16.8", + "@babel/plugin-transform-async-to-generator": "7.16.8", + "@babel/plugin-transform-runtime": "7.16.10", + "@babel/preset-env": "7.16.11", + "@babel/runtime": "7.16.7", + "@babel/template": "7.16.7", + "@discoveryjs/json-ext": "0.5.6", + "@ngtools/webpack": "13.3.4", + "ansi-colors": "4.1.1", + "babel-loader": "8.2.3", + "babel-plugin-istanbul": "6.1.1", + "browserslist": "^4.9.1", + "cacache": "15.3.0", + "circular-dependency-plugin": "5.2.2", + "copy-webpack-plugin": "10.2.1", + "core-js": "3.20.3", + "critters": "0.0.16", + "css-loader": "6.5.1", + "esbuild": "0.14.22", + "esbuild-wasm": "0.14.22", + "glob": "7.2.0", + "https-proxy-agent": "5.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "karma-source-map-support": "1.4.0", + "less": "4.1.2", + "less-loader": "10.2.0", + "license-webpack-plugin": "4.0.2", + "loader-utils": "3.2.0", + "mini-css-extract-plugin": "2.5.3", + "minimatch": "3.0.5", + "open": "8.4.0", + "ora": "5.4.1", + "parse5-html-rewriting-stream": "6.0.1", + "piscina": "3.2.0", + "postcss": "8.4.5", + "postcss-import": "14.0.2", + "postcss-loader": "6.2.1", + "postcss-preset-env": "7.2.3", + "regenerator-runtime": "0.13.9", + "resolve-url-loader": "5.0.0", + "rxjs": "6.6.7", + "sass": "1.49.9", + "sass-loader": "12.4.0", + "semver": "7.3.5", + "source-map-loader": "3.0.1", + "source-map-support": "0.5.21", + "stylus": "0.56.0", + "stylus-loader": "6.2.0", + "terser": "5.11.0", + "text-table": "0.2.0", + "tree-kill": "1.2.2", + "tslib": "2.3.1", + "webpack": "5.70.0", + "webpack-dev-middleware": "5.3.0", + "webpack-dev-server": "4.7.3", + "webpack-merge": "5.8.0", + "webpack-subresource-integrity": "5.1.0" + }, + "dependencies": { + "@babel/core": { + "version": "7.16.12", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", + "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helpers": "^7.16.7", + "@babel/parser": "^7.16.12", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.10", + "@babel/types": "^7.16.8", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.1.2", + "semver": "^6.3.0", + "source-map": "^0.5.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + }, + "dependencies": { + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.1303.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1303.4.tgz", + "integrity": "sha512-3F10P9XshRXkI/PEmJUcgP4yK4sobaoInQfifzPNOemrS5nXs8y3uEiQuxzyswYx/dymZLV+19sV/eh1WfXnBA==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1303.4", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/core": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-13.3.4.tgz", + "integrity": "sha512-gj6i8ksPaT2bvYwI7wKJxLX53pHfTmZc1RaNbAGfZB1/zFNnb3MPj8utTcJSk4qMsGXuDDhiB7hpTKBw8ROaGA==", + "dev": true, + "requires": { + "ajv": "8.9.0", + "ajv-formats": "2.1.1", + "fast-json-stable-stringify": "2.1.0", + "magic-string": "0.25.7", + "rxjs": "6.6.7", + "source-map": "0.7.3" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular-devkit/schematics": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-13.3.4.tgz", + "integrity": "sha512-gKNpMMoZJjLKdXxjuVembic4GWa4AYV7kU1ou3ZuZoDKtKcig9URISr1wjS+nrhKYz+miFy0zIqSGMMattDlDQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.4", + "jsonc-parser": "3.0.0", + "magic-string": "0.25.7", + "ora": "5.4.1", + "rxjs": "6.6.7" + }, + "dependencies": { + "rxjs": { + "version": "6.6.7", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz", + "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "dev": true + } + } + }, + "@angular/animations": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-13.3.5.tgz", + "integrity": "sha512-BYXX80N1hxkATWqv2IZddfKvqxomktxH5fREv+KjwIYFkyK9KBnRBILqynyIJaXXut5KE6QNOf1zWEZxdOnc3A==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/cli": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-13.3.4.tgz", + "integrity": "sha512-4S5FNjkZgq98zcBVgwkYtMgMRMSVsprCgq7dM8yTxIQh+Np3fYgj5eRJ1+mfFG/kankH2z/TFyuoYiILh2D9Uw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.1303.4", + "@angular-devkit/core": "13.3.4", + "@angular-devkit/schematics": "13.3.4", + "@schematics/angular": "13.3.4", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "4.3.3", + "ini": "2.0.0", + "inquirer": "8.2.0", + "jsonc-parser": "3.0.0", + "npm-package-arg": "8.1.5", + "npm-pick-manifest": "6.1.1", + "open": "8.4.0", + "ora": "5.4.1", + "pacote": "12.0.3", + "resolve": "1.22.0", + "semver": "7.3.5", + "symbol-observable": "4.0.0", + "uuid": "8.3.2" + } + }, + "@angular/common": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-13.3.5.tgz", + "integrity": "sha512-teG+itdlw2sOMwYeXkeFe8h32SsNqN0qHHz/v6I9qKHgCLkC/or8A7NtsoCwYSTymIEJJ7DZ1w9VWhM7DSYd1w==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-13.3.5.tgz", + "integrity": "sha512-iSQlYevMk5glwZSXTXf2GytykqZWdK3Rr8heIvEPqd8n88MSB3w1KnDc1fnHLF950q/nUR9K+3r4wWPwc8J2IQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/compiler-cli": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.3.5.tgz", + "integrity": "sha512-H7A+MZcbB4g5fa6O4giYgrCG1h5whJfIxr4txDtDfolygzwRzqH1PSMfjW/jYyIpaH6XqXMSDHvbXRFGKstboA==", + "dev": true, + "requires": { + "@babel/core": "^7.17.2", + "chokidar": "^3.0.0", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.11.0", + "magic-string": "^0.26.0", + "reflect-metadata": "^0.1.2", + "semver": "^7.0.0", + "sourcemap-codec": "^1.4.8", + "tslib": "^2.3.0", + "yargs": "^17.2.1" + }, + "dependencies": { + "magic-string": { + "version": "0.26.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.26.1.tgz", + "integrity": "sha512-ndThHmvgtieXe8J/VGPjG+Apu7v7ItcD5mhEIvOscWjPF/ccOiLxHaSuCAS2G+3x4GKsAbT8u7zdyamupui8Tg==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.8" + } + } + } + }, + "@angular/core": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-13.3.5.tgz", + "integrity": "sha512-lf+Be8dDRvz8J+QFR2RxS3BBfgGM4eWq4bI1+k/aqDnM6OW4pQXdq8Lzae8SxN48u1NxB1M/1bbc9LcrChrj2Q==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/forms": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-13.3.5.tgz", + "integrity": "sha512-jCxxAwf4HkDmKE76/yQmTsbqW3jsxiKyPy32Nh6Bt4r/ww8VDv+sv5YdYNuvvZcuuQ70K+/EPnKFpQgYttvS8A==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-13.3.5.tgz", + "integrity": "sha512-DPV1J3h1ua4GI9PuXDr8IlzJoC/TR0A/onPTaE6IFOzs1r28vB+vWRRbZURXrTYeWzWVB/2R9tPOqFNoi3zlzA==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-13.3.5.tgz", + "integrity": "sha512-Mko8/mRlcVsZJQ5zHfc/p7so/ZN16UMynTnksrD7cEgGxDuJosE8m+exqgoT03VCYaOjJtCFXSwdOb/8FOUDZQ==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@angular/platform-server": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-13.3.5.tgz", + "integrity": "sha512-ja9/mgBIAriQO3H9Q1MTXxJV1s59a2NJeeOffGHr86TLDcaxxzumozfoaKr5p6m0Ty3yqZcFc3wUQJl5I/1H0A==", + "requires": { + "domino": "^2.1.2", + "tslib": "^2.3.0", + "xhr2": "^0.2.0" + } + }, + "@angular/router": { + "version": "13.3.5", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-13.3.5.tgz", + "integrity": "sha512-3yUNyBpUi0KUKP91a3dVQsr9Jfjs4wGxpiFYb3apc7lKT5R1LJqt2O0EchjOgvFyJ6TDOemdCAzKgvSRkDxpMw==", + "requires": { + "tslib": "^2.3.0" + } + }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==", + "dev": true + }, + "@babel/code-frame": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.16.7.tgz", + "integrity": "sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg==", + "dev": true, + "requires": { + "@babel/highlight": "^7.16.7" + } + }, + "@babel/compat-data": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.17.7.tgz", + "integrity": "sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ==", + "dev": true + }, + "@babel/core": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.9.tgz", + "integrity": "sha512-5ug+SfZCpDAkVp9SFIZAzlW18rlzsOcJGaetCjkySnrXXDUw9AR8cDUm1iByTmdWM6yxX6/zycaV76w3YTF2gw==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.1.0", + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-compilation-targets": "^7.17.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helpers": "^7.17.9", + "@babel/parser": "^7.17.9", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.1", + "semver": "^6.3.0" + }, + "dependencies": { + "@ampproject/remapping": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", + "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "dev": true, + "requires": { + "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/trace-mapping": "^0.3.9" + } + }, + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", + "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.8", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.7.tgz", + "integrity": "sha512-s6t2w/IPQVTAET1HitoowRGXooX8mCgtuP5195wD/QJPV6wYjpujCGF7JuMODVX2ZAJOf1GT6DT9MHEZvLOFSw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.7.tgz", + "integrity": "sha512-C6FdbRaxYjwVu/geKW4ZeQ0Q31AftgRcdSnZ5/jsH6BzCJbtvXvhpfkbkThYSuutZA7nCXpPR6AD9zd1dprMkA==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz", + "integrity": "sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.7", + "@babel/helper-validator-option": "^7.16.7", + "browserslist": "^4.17.5", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-create-class-features-plugin": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.17.9.tgz", + "integrity": "sha512-kUjip3gruz6AJKOq5i3nC6CoCEEF/oHH3cp6tOZhB+IyyyPyW0g1Gfsxn3mkk6S08pIA2y8GQh609v9G/5sHVQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-member-expression-to-functions": "^7.17.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7" + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.17.0.tgz", + "integrity": "sha512-awO2So99wG6KnlE+TPs6rn83gCz5WlEePJDTnLEqbchMVrBeAujURVphRdigsk094VhvZehFoNOihSlcBjwsXA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "regexpu-core": "^5.0.1" + } + }, + "@babel/helper-define-polyfill-provider": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", + "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.13.0", + "@babel/helper-module-imports": "^7.12.13", + "@babel/helper-plugin-utils": "^7.13.0", + "@babel/traverse": "^7.13.0", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2", + "semver": "^6.1.2" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/helper-environment-visitor": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.7.tgz", + "integrity": "sha512-SLLb0AAn6PkUeAfKJCCOl9e1R53pQlGAfc4y4XuMRZfqeMYLE0dM1LMhqbGAlGQY0lfw5/ohoYWAe9V1yibRag==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.16.7.tgz", + "integrity": "sha512-KyUenhWMC8VrxzkGP0Jizjo4/Zx+1nNZhgocs+gLzyZyB8SHidhoq9KK/8Ato4anhwsivfkBLftky7gvzbZMtQ==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-function-name": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.17.9.tgz", + "integrity": "sha512-7cRisGlVtiVqZ0MW0/yFB4atgpGLWEHUVYnb448hZK4x+vih0YO5UoS11XIYtZYqHd0dIPMdUSv8q5K4LdMnIg==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz", + "integrity": "sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.17.7.tgz", + "integrity": "sha512-thxXgnQ8qQ11W2wVUObIqDL4p148VMxkt5T/qpN5k2fboRyzFGFmKsTGViquyM5QHKUy48OZoca8kw4ajaDPyw==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-module-imports": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.16.7.tgz", + "integrity": "sha512-LVtS6TqjJHFc+nYeITRo6VLXve70xmq7wPhWTqDJusJEgGmkAACWwMiTNrvfoQo6hEhFwAIixNkvB0jPXDL8Wg==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-module-transforms": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.17.7.tgz", + "integrity": "sha512-VmZD99F3gNTYB7fJRDTi+u6l/zxY0BE6OIxPSU7a50s6ZUQkHwSDmV92FfM+oCG0pZRVojGYhkR8I0OGeCVREw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.3", + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.16.7.tgz", + "integrity": "sha512-EtgBhg7rd/JcnpZFXpBy0ze1YRfdm7BnBX4uKMBd3ixa3RGAE002JZB66FJyNH7g0F38U05pXmA5P8cBh7z+1w==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz", + "integrity": "sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.16.8.tgz", + "integrity": "sha512-fm0gH7Flb8H51LqJHy3HJ3wnE1+qtYR2A99K06ahwrawLdOFsCEWjZOrYricXJHoPSudNKxrMBUPEIPxiIIvBw==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-wrap-function": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helper-replace-supers": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.16.7.tgz", + "integrity": "sha512-y9vsWilTNaVnVh6xiJfABzsNpgDPKev9HnAgz6Gb1p6UUwf9NepdlsV7VXGCftJM+jqD5f7JIEubcpLjZj5dBw==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-member-expression-to-functions": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/traverse": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-simple-access": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.17.7.tgz", + "integrity": "sha512-txyMCGroZ96i+Pxr3Je3lzEJjqwaRC9buMUgtomcrLe5Nd0+fk1h0LLA+ixUF5OW7AhHuQ7Es1WcQJZmZsz2XA==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.16.0.tgz", + "integrity": "sha512-+il1gTy0oHwUsBQZyJvukbB4vPMdcYBrFHa0Uc4AizLxbq6BOYC51Rv4tWocX9BLBDLZ4kc6qUFpQ6HRgL+3zw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.0" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.16.7.tgz", + "integrity": "sha512-xbWoy/PFoxSWazIToT9Sif+jJTlrMcndIsaOKvTA6u7QEo7ilkRZpjew18/W3c7nm8fXdUDXh02VXTbZ0pGDNw==", + "dev": true, + "requires": { + "@babel/types": "^7.16.7" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz", + "integrity": "sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw==", + "dev": true + }, + "@babel/helper-validator-option": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz", + "integrity": "sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.16.8.tgz", + "integrity": "sha512-8RpyRVIAW1RcDDGTA+GpPAwV22wXCfKOoM9bet6TLkGIFTkRQSkH1nMQ5Yet4MpoXe1ZwHPVtNasc2w0uZMqnw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.16.7", + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.16.8", + "@babel/types": "^7.16.8" + } + }, + "@babel/helpers": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.17.9.tgz", + "integrity": "sha512-cPCt915ShDWUEzEp3+UNRktO2n6v49l5RSnG9M5pS24hA+2FAc5si+Pn1i4VVbQQ+jh+bIZhPFQOJOzbrOYY1Q==", + "dev": true, + "requires": { + "@babel/template": "^7.16.7", + "@babel/traverse": "^7.17.9", + "@babel/types": "^7.17.0" + } + }, + "@babel/highlight": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.16.7.tgz", + "integrity": "sha512-aKpPMfLvGO3Q97V0qhw/V2SWNWlwfJknuwAunU7wZLSfrM4xTBvg7E5opUVi1kJTBKihE38CPg4nBiqX83PWYw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + } + }, + "@babel/parser": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.17.9.tgz", + "integrity": "sha512-vqUSBLP8dQHFPdPi9bc5GK9vRkYHJ49fsZdtoJ8EQ8ibpwk5rPKfvNIwChB0KVXcIjcepEBBd2VHC5r9Gy8ueg==", + "dev": true + }, + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.16.7.tgz", + "integrity": "sha512-anv/DObl7waiGEnC24O9zqL0pSuI9hljihqiDuFHC8d7/bjr/4RLGPWuc8rYOff/QPzbEPSkzG8wGG9aDuhHRg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.16.7.tgz", + "integrity": "sha512-di8vUHRdf+4aJ7ltXhaDbPoszdkh59AQtJM5soLsuHpQJdFQZOA4uGj0V2u/CZ8bJ/u8ULDL5yq6FO/bCXnKHw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-proposal-optional-chaining": "^7.16.7" + } + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.16.8.tgz", + "integrity": "sha512-71YHIvMuiuqWJQkebWJtdhQTfd4Q4mF76q2IX37uZPkG9+olBxsX+rH1vkhFto4UeJZ9dPY2s+mDvhDm1u2BGQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, + "@babel/plugin-proposal-class-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.7.tgz", + "integrity": "sha512-IobU0Xme31ewjYOShSIqd/ZGM/r/cuOz2z0MDbNrhF5FW+ZVgi0f2lyeoj9KFPDOAqsYxmLWZte1WOwlvY9aww==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-class-static-block": { + "version": "7.17.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.17.6.tgz", + "integrity": "sha512-X/tididvL2zbs7jZCeeRJ8167U/+Ac135AM6jCAx6gYXDUviZV5Ku9UDvWS2NCuWlFjIRXklYhwo6HhAC7ETnA==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.17.6", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.16.7.tgz", + "integrity": "sha512-I8SW9Ho3/8DRSdmDdH3gORdyUuYnk1m4cMxUAdu5oy4n3OfN8flDEH+d60iG7dUfi0KkYwSvoalHzzdRzpWHTg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + } + }, + "@babel/plugin-proposal-export-namespace-from": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.16.7.tgz", + "integrity": "sha512-ZxdtqDXLRGBL64ocZcs7ovt71L3jhC1RGSyR996svrCi3PYqHNkb3SwPJCs8RIzD86s+WPpt2S73+EHCGO+NUA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.16.7.tgz", + "integrity": "sha512-lNZ3EEggsGY78JavgbHsK9u5P3pQaW7k4axlgFLYkMd7UBsiNahCITShLjNQschPyjtO6dADrL24757IdhBrsQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + } + }, + "@babel/plugin-proposal-logical-assignment-operators": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.16.7.tgz", + "integrity": "sha512-K3XzyZJGQCr00+EtYtrDjmwX7o7PLK6U9bi1nCwkQioRFVUv6dJoxbQjtWVtP+bCPy82bONBKG8NPyQ4+i6yjg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.16.7.tgz", + "integrity": "sha512-aUOrYU3EVtjf62jQrCj63pYZ7k6vns2h/DQvHPWGmsJRYzWXZ6/AsfgpiRy6XiuIDADhJzP2Q9MwSMKauBQ+UQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-proposal-numeric-separator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.16.7.tgz", + "integrity": "sha512-vQgPMknOIgiuVqbokToyXbkY/OmmjAzr/0lhSIbG/KmnzXPGwW/AdhdKpi+O4X/VkWiWjnkKOBiqJrTaC98VKw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.17.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.17.3.tgz", + "integrity": "sha512-yuL5iQA/TbZn+RGAfxQXfi7CNLmKi1f8zInn4IgobuCWcAb7i+zj4TYzQ9l8cEzVyJ89PDGuqxK1xZpUDISesw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.17.0", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.16.7" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.16.7.tgz", + "integrity": "sha512-eMOH/L4OvWSZAE1VkHbr1vckLG1WUcHGJSLqqQwl2GaUqG6QjddvrOaTUMNYiv77H5IKPMZ9U9P7EaHwvAShfA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.16.7.tgz", + "integrity": "sha512-eC3xy+ZrUcBtP7x+sq62Q/HYd674pPTb/77XZMb5wbDPGWIdUbSr4Agr052+zaUPSb+gGRnjxXfKFvx5iMJ+DA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + } + }, + "@babel/plugin-proposal-private-methods": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.16.11.tgz", + "integrity": "sha512-F/2uAkPlXDr8+BHpZvo19w3hLFKge+k75XUprE6jaqKxjGkSYcK+4c+bup5PdW/7W/Rpjwql7FTVEDW+fRAQsw==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.16.10", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-proposal-private-property-in-object": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.16.7.tgz", + "integrity": "sha512-rMQkjcOFbm+ufe3bTZLyOfsOUOxyvLXZJCTARhJr+8UMSoZmqTe1K1BgkFcrW37rAchWg57yI69ORxiWvUINuQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-create-class-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.16.7.tgz", + "integrity": "sha512-QRK0YI/40VLhNVGIjRNAAQkEHws0cswSdFFjpFyt943YmJIU1da9uW63Iu6NFV6CxTZW5eTDCrwZUstBWgp/Rg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", + "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.12.13" + } + }, + "@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", + "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", + "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.3" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", + "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", + "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", + "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", + "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.14.5" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.16.7.tgz", + "integrity": "sha512-9ffkFFMbvzTvv+7dTp/66xvZAWASuPD5Tl9LK3Z9vhOmANo6j94rik+5YMBt4CwHVMWLWpMsriIc2zsa3WW3xQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.16.8.tgz", + "integrity": "sha512-MtmUmTJQHCnyJVrScNzNlofQJ3dLFuobYn3mwOTKHnSCMtbNsqvF71GQmJfFjdrXSsAA7iysFmYWw4bXZ20hOg==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-remap-async-to-generator": "^7.16.8" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.16.7.tgz", + "integrity": "sha512-JUuzlzmF40Z9cXyytcbZEZKckgrQzChbQJw/5PuEHYeqzCsvebDx0K0jWnIIVcmmDOAVctCgnYs0pMcrYj2zJg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.16.7.tgz", + "integrity": "sha512-ObZev2nxVAYA4bhyusELdo9hb3H+A56bxH3FZMbEImZFiEDYVHXQSJ1hQKFlDnlt8G9bBrCZ5ZpURZUrV4G5qQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.16.7.tgz", + "integrity": "sha512-WY7og38SFAGYRe64BrjKf8OrE6ulEHtr5jEYaZMwox9KebgqPi67Zqz8K53EKk1fFEJgm96r32rkKZ3qA2nCWQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.16.7", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-optimise-call-expression": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.16.7.tgz", + "integrity": "sha512-gN72G9bcmenVILj//sv1zLNaPyYcOzUho2lIJBMh/iakJ9ygCo/hEF9cpGb61SCMEDxbbyBoVQxrt+bWKu5KGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.17.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.17.7.tgz", + "integrity": "sha512-XVh0r5yq9sLR4vZ6eVZe8FKfIcSgaTBxVBRSYokRj2qksf6QerYnTxz9/GTuKTH/n/HwLP7t6gtlybHetJ/6hQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.16.7.tgz", + "integrity": "sha512-Lyttaao2SjZF6Pf4vk1dVKv8YypMpomAbygW+mU5cYP3S5cWTfCJjG8xV6CFdzGFlfWK81IjL9viiTvpb6G7gQ==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.16.7.tgz", + "integrity": "sha512-03DvpbRfvWIXyK0/6QiR1KMTWeT6OcQ7tbhjrXyFS02kjuX/mu5Bvnh5SDSWHxyawit2g5aWhKwI86EE7GUnTw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.16.7.tgz", + "integrity": "sha512-8UYLSlyLgRixQvlYH3J2ekXFHDFLQutdy7FfFAMm3CPZ6q9wHCwnUyiXpQCe3gVVnQlHc5nsuiEVziteRNTXEA==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.16.7.tgz", + "integrity": "sha512-/QZm9W92Ptpw7sjI9Nx1mbcsWz33+l8kuMIQnDwgQBG5s3fAfQvkRjQ7NqXhtNcKOnPkdICmUHyCaWW06HCsqg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.16.7.tgz", + "integrity": "sha512-SU/C68YVwTRxqWj5kgsbKINakGag0KTgq9f2iZEXdStoAbOzLHEBRYzImmA6yFo8YZhJVflvXmIHUO7GWHmxxA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-function-name": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.16.7.tgz", + "integrity": "sha512-6tH8RTpTWI0s2sV6uq3e/C9wPo4PTqqZps4uF0kzQ9/xPLFQtipynvmT1g/dOfEJ+0EQsHhkQ/zyRId8J2b8zQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.16.7.tgz", + "integrity": "sha512-mBruRMbktKQwbxaJof32LT9KLy2f3gH+27a5XSuXo6h7R3vqltl0PgZ80C8ZMKw98Bf8bqt6BEVi3svOh2PzMw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.16.7.tgz", + "integrity": "sha512-KaaEtgBL7FKYwjJ/teH63oAmE3lP34N3kshz8mm4VMAw7U3PxjVwwUmxEFksbgsNUaO3wId9R2AVQYSEGRa2+g==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.17.9.tgz", + "integrity": "sha512-2TBFd/r2I6VlYn0YRTz2JdazS+FoUuQ2rIFHoAxtyP/0G3D82SBLaRq9rnUkpqlLg03Byfl/+M32mpxjO6KaPw==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-simple-access": "^7.17.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.17.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.17.8.tgz", + "integrity": "sha512-39reIkMTUVagzgA5x88zDYXPCMT6lcaRKs1+S9K6NKBPErbgO/w/kP8GlNQTC87b412ZTlmNgr3k2JrWgHH+Bw==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-module-transforms": "^7.17.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-identifier": "^7.16.7", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.16.7.tgz", + "integrity": "sha512-EMh7uolsC8O4xhudF2F6wedbSHm1HHZ0C6aJ7K67zcDNidMzVcxWdGr+htW9n21klm+bOn+Rx4CBsAntZd3rEQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.16.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.16.8.tgz", + "integrity": "sha512-j3Jw+n5PvpmhRR+mrgIh04puSANCk/T/UA3m3P1MjJkhlK906+ApHhDIqBQDdOgL/r1UYpz4GNclTXxyZrYGSw==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.16.7.tgz", + "integrity": "sha512-xiLDzWNMfKoGOpc6t3U+etCE2yRnn3SM09BXqWPIZOBpL2gvVrBWUKnsJx0K/ADi5F5YC5f8APFfWrz25TdlGg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.16.7.tgz", + "integrity": "sha512-14J1feiQVWaGvRxj2WjyMuXS2jsBkgB3MdSN5HuC2G5nRspa5RK9COcs82Pwy5BuGcjb+fYaUj94mYcOj7rCvw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-replace-supers": "^7.16.7" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.16.7.tgz", + "integrity": "sha512-AT3MufQ7zZEhU2hwOA11axBnExW0Lszu4RL/tAlUJBuNoRak+wehQW8h6KcXOcgjY42fHtDxswuMhMjFEuv/aw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.16.7.tgz", + "integrity": "sha512-z4FGr9NMGdoIl1RqavCqGG+ZuYjfZ/hkCIeuH6Do7tXmSm0ls11nYVSJqFEUOSJbDab5wC6lRE/w6YjVcr6Hqw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.17.9.tgz", + "integrity": "sha512-Lc2TfbxR1HOyn/c6b4Y/b6NHoTb67n/IoWLxTu4kC7h4KQnWlhCq2S8Tx0t2SVvv5Uu87Hs+6JEJ5kt2tYGylQ==", + "dev": true, + "requires": { + "regenerator-transform": "^0.15.0" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.16.7.tgz", + "integrity": "sha512-KQzzDnZ9hWQBjwi5lpY5v9shmm6IVG0U9pB18zvMu2i4H90xpT4gmqwPYsn8rObiadYe2M0gmgsiOIF5A/2rtg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-runtime": { + "version": "7.16.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.16.10.tgz", + "integrity": "sha512-9nwTiqETv2G7xI4RvXHNfpGdr8pAA+Q/YtN3yLK7OoK7n9OibVm/xymJ838a9A6E/IciOLPj82lZk0fW6O4O7w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.16.7.tgz", + "integrity": "sha512-hah2+FEnoRoATdIb05IOXf+4GzXYTq75TVhIn1PewihbpyrNWUt2JbudKQOETWw6QpLe+AIUpJ5MVLYTQbeeUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.16.7.tgz", + "integrity": "sha512-+pjJpgAngb53L0iaA5gU/1MLXJIfXcYepLgXB3esVRf4fqmj8f2cxM3/FKaHsZms08hFQJkFccEWuIpm429TXg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.16.0" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.16.7.tgz", + "integrity": "sha512-NJa0Bd/87QV5NZZzTuZG5BPJjLYadeSZ9fO6oOUoL4iQx+9EEuw/eEM92SrsT19Yc2jgB1u1hsjqDtH02c3Drw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.16.7.tgz", + "integrity": "sha512-VwbkDDUeenlIjmfNeDX/V0aWrQH2QiVyJtwymVQSzItFDTpxfyJh3EVaQiS0rIN/CqbLGr0VcGmuwyTdZtdIsA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.16.7.tgz", + "integrity": "sha512-p2rOixCKRJzpg9JB4gjnG4gjWkWa89ZoYUnl9snJ1cWIcTH/hvxZqfO+WjG6T8DRBpctEol5jw1O5rA8gkCokQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-escapes": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.16.7.tgz", + "integrity": "sha512-TAV5IGahIz3yZ9/Hfv35TV2xEm+kaBDaZQCn2S/hG9/CZ0DktxJv9eKfPc7yYCvOYR4JGx1h8C+jcSOvgaaI/Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.16.7.tgz", + "integrity": "sha512-oC5tYYKw56HO75KZVLQ+R/Nl3Hro9kf8iG0hXoaHP7tjAyCpvqBiSNe6vGrZni1Z6MggmUOC6A7VP7AVmw225Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7" + } + }, + "@babel/preset-env": { + "version": "7.16.11", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.16.11.tgz", + "integrity": "sha512-qcmWG8R7ZW6WBRPZK//y+E3Cli151B20W1Rv7ln27vuPaXU/8TKms6jFdiJtF7UDTxcrb7mZd88tAeK9LjdT8g==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.16.8", + "@babel/helper-compilation-targets": "^7.16.7", + "@babel/helper-plugin-utils": "^7.16.7", + "@babel/helper-validator-option": "^7.16.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.16.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-async-generator-functions": "^7.16.8", + "@babel/plugin-proposal-class-properties": "^7.16.7", + "@babel/plugin-proposal-class-static-block": "^7.16.7", + "@babel/plugin-proposal-dynamic-import": "^7.16.7", + "@babel/plugin-proposal-export-namespace-from": "^7.16.7", + "@babel/plugin-proposal-json-strings": "^7.16.7", + "@babel/plugin-proposal-logical-assignment-operators": "^7.16.7", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.16.7", + "@babel/plugin-proposal-numeric-separator": "^7.16.7", + "@babel/plugin-proposal-object-rest-spread": "^7.16.7", + "@babel/plugin-proposal-optional-catch-binding": "^7.16.7", + "@babel/plugin-proposal-optional-chaining": "^7.16.7", + "@babel/plugin-proposal-private-methods": "^7.16.11", + "@babel/plugin-proposal-private-property-in-object": "^7.16.7", + "@babel/plugin-proposal-unicode-property-regex": "^7.16.7", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-transform-arrow-functions": "^7.16.7", + "@babel/plugin-transform-async-to-generator": "^7.16.8", + "@babel/plugin-transform-block-scoped-functions": "^7.16.7", + "@babel/plugin-transform-block-scoping": "^7.16.7", + "@babel/plugin-transform-classes": "^7.16.7", + "@babel/plugin-transform-computed-properties": "^7.16.7", + "@babel/plugin-transform-destructuring": "^7.16.7", + "@babel/plugin-transform-dotall-regex": "^7.16.7", + "@babel/plugin-transform-duplicate-keys": "^7.16.7", + "@babel/plugin-transform-exponentiation-operator": "^7.16.7", + "@babel/plugin-transform-for-of": "^7.16.7", + "@babel/plugin-transform-function-name": "^7.16.7", + "@babel/plugin-transform-literals": "^7.16.7", + "@babel/plugin-transform-member-expression-literals": "^7.16.7", + "@babel/plugin-transform-modules-amd": "^7.16.7", + "@babel/plugin-transform-modules-commonjs": "^7.16.8", + "@babel/plugin-transform-modules-systemjs": "^7.16.7", + "@babel/plugin-transform-modules-umd": "^7.16.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.16.8", + "@babel/plugin-transform-new-target": "^7.16.7", + "@babel/plugin-transform-object-super": "^7.16.7", + "@babel/plugin-transform-parameters": "^7.16.7", + "@babel/plugin-transform-property-literals": "^7.16.7", + "@babel/plugin-transform-regenerator": "^7.16.7", + "@babel/plugin-transform-reserved-words": "^7.16.7", + "@babel/plugin-transform-shorthand-properties": "^7.16.7", + "@babel/plugin-transform-spread": "^7.16.7", + "@babel/plugin-transform-sticky-regex": "^7.16.7", + "@babel/plugin-transform-template-literals": "^7.16.7", + "@babel/plugin-transform-typeof-symbol": "^7.16.7", + "@babel/plugin-transform-unicode-escapes": "^7.16.7", + "@babel/plugin-transform-unicode-regex": "^7.16.7", + "@babel/preset-modules": "^0.1.5", + "@babel/types": "^7.16.8", + "babel-plugin-polyfill-corejs2": "^0.3.0", + "babel-plugin-polyfill-corejs3": "^0.5.0", + "babel-plugin-polyfill-regenerator": "^0.3.0", + "core-js-compat": "^3.20.2", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@babel/preset-modules": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", + "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", + "@babel/plugin-transform-dotall-regex": "^7.4.4", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + } + }, + "@babel/runtime": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.16.7.tgz", + "integrity": "sha512-9E9FJowqAsytyOY6LG+1KuueckRL+aQW+mKvXRXnuFGyRAyepJPmEo9vgMfXUA6O9u3IeEdv9MAkppFcaQwogQ==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + } + }, + "@babel/template": { + "version": "7.16.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.16.7.tgz", + "integrity": "sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/parser": "^7.16.7", + "@babel/types": "^7.16.7" + } + }, + "@babel/traverse": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.17.9.tgz", + "integrity": "sha512-PQO8sDIJ8SIwipTPiR71kJQCKQYB5NGImbOviK8K+kg5xkNSYXLBupuX9QhatFowrsvo9Hj8WgArg3W7ijNAQw==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.16.7", + "@babel/generator": "^7.17.9", + "@babel/helper-environment-visitor": "^7.16.7", + "@babel/helper-function-name": "^7.17.9", + "@babel/helper-hoist-variables": "^7.16.7", + "@babel/helper-split-export-declaration": "^7.16.7", + "@babel/parser": "^7.17.9", + "@babel/types": "^7.17.0", + "debug": "^4.1.0", + "globals": "^11.1.0" + }, + "dependencies": { + "@babel/generator": { + "version": "7.17.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.9.tgz", + "integrity": "sha512-rAdDousTwxbIxbz5I7GEQ3lUip+xVCXooZNbsydCWs3xA7ZsYOv+CFRdzGxRX78BmQHu9B1Eso59AOZQOJDEdQ==", + "dev": true, + "requires": { + "@babel/types": "^7.17.0", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.17.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.17.0.tgz", + "integrity": "sha512-TmKSNO4D5rzhL5bjWFcVHHLETzfQ/AmbKpKPOSjlP0WoHZ6L911fgoOKY4Alp/emzG4cHJdyN49zpgkbXFEHHw==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.16.7", + "to-fast-properties": "^2.0.0" + } + }, + "@colors/colors": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", + "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "dev": true + }, + "@csstools/postcss-progressive-custom-properties": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@csstools/postcss-progressive-custom-properties/-/postcss-progressive-custom-properties-1.3.0.tgz", + "integrity": "sha512-ASA9W1aIy5ygskZYuWams4BzafD12ULvSypmaLJT2jvQ8G0M3I8PRQhC0h7mG0Z3LI05+agZjqSR9+K9yaQQjA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "@discoveryjs/json-ext": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.6.tgz", + "integrity": "sha512-ws57AidsDvREKrZKYffXddNkyaF14iHNHm8VQnZH6t99E8gczjNN0GpvcGny0imC80yQ0tHz1xVUKk/KFQSUyA==", + "dev": true + }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, + "@istanbuljs/load-nyc-config": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", + "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", + "dev": true, + "requires": { + "camelcase": "^5.3.1", + "find-up": "^4.1.0", + "get-package-type": "^0.1.0", + "js-yaml": "^3.13.1", + "resolve-from": "^5.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", + "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", + "dev": true + }, + "@jridgewell/gen-mapping": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", + "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "dev": true, + "requires": { + "@jridgewell/set-array": "^1.0.0", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.6.tgz", + "integrity": "sha512-R7xHtBSNm+9SyvpJkdQl+qrM3Hm2fea3Ef197M3mUug+v+yR+Rhfbs7PBtcBUVnIWJ4JcAdjvij+c8hXS9p5aw==", + "dev": true + }, + "@jridgewell/set-array": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.0.tgz", + "integrity": "sha512-SfJxIxNVYLTsKwzB3MoOQ1yxf4w/E6MdkvTgrgAt1bfxjSrLUoHMKrDOykwN14q65waezZIdqDneUIPh4/sKxg==", + "dev": true + }, + "@jridgewell/sourcemap-codec": { + "version": "1.4.11", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.11.tgz", + "integrity": "sha512-Fg32GrJo61m+VqYSdRSjRXMjQ06j8YIYfcTqndLYVAaHmroZHLJZCydsWBOTDqXS2v+mjxohBWEMfg97GXmYQg==", + "dev": true + }, + "@jridgewell/trace-mapping": { + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", + "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, + "requires": { + "@jridgewell/resolve-uri": "^3.0.3", + "@jridgewell/sourcemap-codec": "^1.4.10" + } + }, + "@ngtools/webpack": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.3.4.tgz", + "integrity": "sha512-dNDNeAOwtpX5A7TTEsgDbkg4jTmAJHD96qLqcpJqfBg8nZ4mqn6E0HinX9HZKaCST1/75T6GsFo1Muc4MsHYgA==", + "dev": true, + "requires": {} + }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, + "@npmcli/fs": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-1.1.0.tgz", + "integrity": "sha512-VhP1qZLXcrXRIaPoqb4YA55JQxLNF3jNR4T55IdOJa3+IFJKNYHtPvtXx8slmeMavj37vCzCfrqQM1vWLsYKLA==", + "dev": true, + "requires": { + "@gar/promisify": "^1.0.1", + "semver": "^7.3.5" + } + }, + "@npmcli/git": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/git/-/git-2.1.0.tgz", + "integrity": "sha512-/hBFX/QG1b+N7PZBFs0bi+evgRZcK9nWBxQKZkGoXUT5hJSwl5c4d7y8/hm+NQZRPhQ67RzFaj5UM9YeyKoryw==", + "dev": true, + "requires": { + "@npmcli/promise-spawn": "^1.3.2", + "lru-cache": "^6.0.0", + "mkdirp": "^1.0.4", + "npm-pick-manifest": "^6.1.1", + "promise-inflight": "^1.0.1", + "promise-retry": "^2.0.1", + "semver": "^7.3.5", + "which": "^2.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "@npmcli/installed-package-contents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-1.0.7.tgz", + "integrity": "sha512-9rufe0wnJusCQoLpV9ZPKIVP55itrM5BxOXs10DmdbRfgWtHy1LDyskbwRnBghuB0PrF7pNPOqREVtpz4HqzKw==", + "dev": true, + "requires": { + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "@npmcli/move-file": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz", + "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@npmcli/node-gyp": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@npmcli/node-gyp/-/node-gyp-1.0.3.tgz", + "integrity": "sha512-fnkhw+fmX65kiLqk6E3BFLXNC26rUhK90zVwe2yncPliVT/Qos3xjhTLE59Df8KnPlcwIERXKVlU1bXoUQ+liA==", + "dev": true + }, + "@npmcli/promise-spawn": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@npmcli/promise-spawn/-/promise-spawn-1.3.2.tgz", + "integrity": "sha512-QyAGYo/Fbj4MXeGdJcFzZ+FkDkomfRBrPM+9QYJSg+PxgAUL+LU3FneQk37rKR2/zjqkCV1BLHccX98wRXG3Sg==", + "dev": true, + "requires": { + "infer-owner": "^1.0.4" + } + }, + "@npmcli/run-script": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/run-script/-/run-script-2.0.0.tgz", + "integrity": "sha512-fSan/Pu11xS/TdaTpTB0MRn9guwGU8dye+x56mEVgBEd/QsybBbYcAL0phPXi8SGWFEChkQd6M9qL4y6VOpFig==", + "dev": true, + "requires": { + "@npmcli/node-gyp": "^1.0.2", + "@npmcli/promise-spawn": "^1.3.2", + "node-gyp": "^8.2.0", + "read-package-json-fast": "^2.0.1" + } + }, + "@popperjs/core": { + "version": "2.11.2", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz", + "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==", + "peer": true + }, + "@schematics/angular": { + "version": "13.3.4", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-13.3.4.tgz", + "integrity": "sha512-Cta11k965Igz2kWj60KQ/9z6RFAg9FjZ8i1TH4nyROJs9nWemWPQNA+OJFuXrEy6Ldpk7yJ5cWgJsyryGB25PA==", + "dev": true, + "requires": { + "@angular-devkit/core": "13.3.4", + "@angular-devkit/schematics": "13.3.4", + "jsonc-parser": "3.0.0" + } + }, + "@socket.io/base64-arraybuffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@socket.io/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz", + "integrity": "sha512-dOlCBKnDw4iShaIsH/bxujKTM18+2TOAsYz+KSc11Am38H4q5Xw8Bbz97ZYdrVNM+um3p7w86Bvvmcn9q+5+eQ==", + "dev": true + }, + "@tootallnate/once": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", + "dev": true + }, + "@types/body-parser": { + "version": "1.19.2", + "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", + "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", + "dev": true, + "requires": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "@types/bonjour": { + "version": "3.5.10", + "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", + "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/component-emitter": { + "version": "1.2.11", + "resolved": "https://registry.npmjs.org/@types/component-emitter/-/component-emitter-1.2.11.tgz", + "integrity": "sha512-SRXjM+tfsSlA9VuG8hGO2nft2p8zjXCK1VcC6N4NXbBbYbSia9kzCChYQajIjzIqOOOuh5Ock6MmV2oux4jDZQ==", + "dev": true + }, + "@types/connect": { + "version": "3.4.35", + "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", + "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/connect-history-api-fallback": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", + "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", + "dev": true, + "requires": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "dev": true + }, + "@types/cors": { + "version": "2.8.12", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.12.tgz", + "integrity": "sha512-vt+kDhq/M2ayberEtJcIN/hxXy1Pk+59g2FV/ZQceeaTyCtCucjL2Q7FXlFjtWn4n15KCr1NE2lNNFhp0lEThw==", + "dev": true + }, + "@types/eslint": { + "version": "8.2.2", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.2.2.tgz", + "integrity": "sha512-nQxgB8/Sg+QKhnV8e0WzPpxjIGT3tuJDDzybkDi8ItE/IgTlHo07U0shaIjzhcvQxlq9SDRE42lsJ23uvEgJ2A==", + "dev": true, + "requires": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "@types/eslint-scope": { + "version": "3.7.3", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", + "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", + "dev": true, + "requires": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "@types/estree": { + "version": "0.0.51", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "dev": true + }, + "@types/express": { + "version": "4.17.13", + "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", + "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", + "dev": true, + "requires": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.18", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "@types/express-serve-static-core": { + "version": "4.17.28", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.28.tgz", + "integrity": "sha512-P1BJAEAW3E2DJUlkgq4tOL3RyMunoWXqbSCygWo5ZIWTjUgN1YnaXWW4VWl/oc8vs/XoYibEGBKP0uZyF4AHig==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*" + } + }, + "@types/http-proxy": { + "version": "1.17.8", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.8.tgz", + "integrity": "sha512-5kPLG5BKpWYkw/LVOGWpiq3nEVqxiN32rTgI53Sk12/xHFQ2rG3ehI9IO+O3W2QoKeyB92dJkoka8SUm6BX1pA==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-4.0.3.tgz", + "integrity": "sha512-Opp1LvvEuZdk8fSSvchK2mZwhVrsNT0JgJE9Di6MjnaIpmEXM8TLCPPrVtNTYh8+5MPdY8j9bAHMu2SSfwpZJg==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.10.tgz", + "integrity": "sha512-J7mDz7ovjwjc+Y9rR9rY53hFWKATcIkrr9DwQWmOas4/pnIPJTXawnzjwpHm3RSxz/e3ZVUvQ7cRbd5UQLo10g==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@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/mime": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "dev": true + }, + "@types/node": { + "version": "17.0.29", + "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.29.tgz", + "integrity": "sha512-tx5jMmMFwx7wBwq/V7OohKDVb/JwJU5qCVkeLMh1//xycAJ/ESuw9aJ9SEtlCZDYi2pBfe4JkisSoAtbOsBNAA==", + "dev": true + }, + "@types/parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "dev": true + }, + "@types/qs": { + "version": "6.9.7", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", + "dev": true + }, + "@types/range-parser": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "dev": true + }, + "@types/retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", + "dev": true + }, + "@types/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", + "dev": true, + "requires": { + "@types/express": "*" + } + }, + "@types/serve-static": { + "version": "1.13.10", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", + "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", + "dev": true, + "requires": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "@types/sockjs": { + "version": "0.3.33", + "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", + "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@types/ws": { + "version": "8.5.3", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", + "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, + "@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" + } + }, + "@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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "abab": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", + "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "dev": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "dev": true + }, + "accepts": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", + "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", + "dev": true, + "requires": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "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, + "requires": {} + }, + "adjust-sourcemap-loader": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz", + "integrity": "sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A==", + "dev": true, + "requires": { + "loader-utils": "^2.0.0", + "regex-parser": "^2.2.11" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + } + } + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dev": true, + "requires": { + "debug": "4" + } + }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + } + }, + "ajv": { + "version": "8.9.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.9.0.tgz", + "integrity": "sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "ajv-formats": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", + "dev": true, + "requires": { + "ajv": "^8.0.0" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", + "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", + "dev": true, + "requires": { + "type-fest": "^0.21.3" + } + }, + "ansi-html-community": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", + "dev": true + }, + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "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" + } + }, + "anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "aproba": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-2.0.0.tgz", + "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", + "dev": true + }, + "are-we-there-yet": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.0.tgz", + "integrity": "sha512-0GWpv50YSOcLXaN6/FAKY3vfRbllXWV2xvfA/oKJF8pzFhWXPV+yjhJXDBbjscDYowv7Yw1A3uigpzn5iEGTyw==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dev": true, + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz", + "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==", + "dev": true + }, + "async": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "10.4.5", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.5.tgz", + "integrity": "sha512-Fvd8yCoA7lNX/OUllvS+aS1I7WRBclGXsepbvT8ZaPgrH24rgXpZzF0/6Hh3ZEkwg+0AES/Osd196VZmYoEFtw==", + "dev": true, + "requires": { + "browserslist": "^4.20.2", + "caniuse-lite": "^1.0.30001332", + "fraction.js": "^4.2.0", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + } + }, + "babel-loader": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.3.tgz", + "integrity": "sha512-n4Zeta8NC3QAsuyiizu0GkmRcQ6clkV9WFUnUf1iXP//IeSKbWjofW3UHyZVwlOB4y039YQKefawyTn64Zwbuw==", + "dev": true, + "requires": { + "find-cache-dir": "^3.3.1", + "loader-utils": "^1.4.0", + "make-dir": "^3.1.0", + "schema-utils": "^2.6.5" + }, + "dependencies": { + "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" + } + }, + "loader-utils": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz", + "integrity": "sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^1.0.1" + } + } + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "babel-plugin-istanbul": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", + "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.0.0", + "@istanbuljs/load-nyc-config": "^1.0.0", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-instrument": "^5.0.4", + "test-exclude": "^6.0.0" + } + }, + "babel-plugin-polyfill-corejs2": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", + "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.13.11", + "@babel/helper-define-polyfill-provider": "^0.3.1", + "semver": "^6.1.1" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "babel-plugin-polyfill-corejs3": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", + "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1", + "core-js-compat": "^3.21.0" + } + }, + "babel-plugin-polyfill-regenerator": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", + "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", + "dev": true, + "requires": { + "@babel/helper-define-polyfill-provider": "^0.3.1" + } + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "body-parser": { + "version": "1.20.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz", + "integrity": "sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.10.3", + "raw-body": "2.5.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "bootstrap": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "requires": {} + }, + "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" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "browserslist": { + "version": "4.20.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", + "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001332", + "electron-to-chromium": "^1.4.118", + "escalade": "^3.1.1", + "node-releases": "^2.0.3", + "picocolors": "^1.0.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "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 + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "dev": true + }, + "cacache": { + "version": "15.3.0", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.3.0.tgz", + "integrity": "sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^1.0.0", + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "caniuse-lite": { + "version": "1.0.30001334", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001334.tgz", + "integrity": "sha512-kbaCEBRRVSoeNs74sCuq92MJyGrMtjWVfhltoHUCW4t4pXFvGjUBrfo47weBRViHkiV3eBYyIsfl956NtHGazw==", + "dev": true + }, + "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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", + "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", + "dev": true, + "requires": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "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 + }, + "circular-dependency-plugin": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", + "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", + "dev": true, + "requires": {} + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.6.1.tgz", + "integrity": "sha512-x/5fWmGMnbKQAaNwN+UZlV79qBLM9JFnJuJ03gIi5whrob0xV0ofNVHy9DhwGdsMJQc2OKv0oGmLzvaqvAVv+g==", + "dev": true + }, + "cli-width": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", + "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==", + "dev": true + }, + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "clone": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz", + "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=", + "dev": true + }, + "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 + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "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 + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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 + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "content-disposition": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", + "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", + "dev": true, + "requires": { + "safe-buffer": "5.2.1" + }, + "dependencies": { + "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 + } + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", + "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-anything": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz", + "integrity": "sha512-GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==", + "dev": true, + "requires": { + "is-what": "^3.12.0" + } + }, + "copy-webpack-plugin": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.1.tgz", + "integrity": "sha512-nr81NhCAIpAWXGCK5thrKmfCQ6GDY0L5RN0U+BnIn/7Us55+UCex5ANNsNKmIVtDRnk0Ecf+/kzp9SUVrrBMLg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "glob-parent": "^6.0.1", + "globby": "^12.0.2", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "core-js": { + "version": "3.20.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.20.3.tgz", + "integrity": "sha512-vVl8j8ph6tRS3B8qir40H7yw7voy17xL0piAjlbBUsH7WIfzoedL/ZOr1OV9FyZQLWXsayOJyV4tnRyXR85/ag==" + }, + "core-js-compat": { + "version": "3.22.3", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.22.3.tgz", + "integrity": "sha512-wliMbvPI2idgFWpFe7UEyHMvu6HWgW8WA+HnDRtgzoSDYvXFMpoGX1H3tPDDXrcfUSyXafCLDd7hOeMQHEZxGw==", + "dev": true, + "requires": { + "browserslist": "^4.20.3", + "semver": "7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", + "dev": true + }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "dev": true, + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, + "cosmiconfig": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", + "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", + "dev": true, + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, + "critters": { + "version": "0.0.16", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", + "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "css-select": "^4.2.0", + "parse5": "^6.0.1", + "parse5-htmlparser2-tree-adapter": "^6.0.1", + "postcss": "^8.3.7", + "pretty-bytes": "^5.3.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "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" + }, + "dependencies": { + "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" + } + } + } + }, + "crypto-js": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.1.1.tgz", + "integrity": "sha512-o2JlM7ydqd3Qk9CA0L4NL6mTzU2sdx96a+oOfPu8Mkl/PK51vSyoi8/rQ8NknZtk44vq15lmhAj9CIAGwgeWKw==" + }, + "css": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/css/-/css-3.0.0.tgz", + "integrity": "sha512-DG9pFfwOrzc+hawpmqX/dHYHJG+Bsdb0klhyi1sDneOgGOXy9wQIC8hzyVp1e4NRYDBdxcylvywPkkXCHAzTyQ==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "source-map": "^0.6.1", + "source-map-resolve": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "css-blank-pseudo": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/css-blank-pseudo/-/css-blank-pseudo-3.0.3.tgz", + "integrity": "sha512-VS90XWtsHGqoM0t4KpH053c4ehxZ2E6HtGI7x68YFV0pTo/QmkV/YFA+NnlvK8guxZVNWGQhVNJGC39Q8XF4OQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-has-pseudo": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/css-has-pseudo/-/css-has-pseudo-3.0.4.tgz", + "integrity": "sha512-Vse0xpR1K9MNlp2j5w1pgWIJtm1a8qS0JwS9goFYcImjlHEmywP9VUF05aGBXzGpDJF86QXk4L0ypBmwPhGArw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "css-loader": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.5.1.tgz", + "integrity": "sha512-gEy2w9AnJNnD9Kuo4XAP9VflW/ujKoS9c/syO+uWMlm5igc7LysKzPXaDoR2vroROkSwsTS2tGr1yGGEbZOYZQ==", + "dev": true, + "requires": { + "icss-utils": "^5.1.0", + "postcss": "^8.2.15", + "postcss-modules-extract-imports": "^3.0.0", + "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-scope": "^3.0.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.1.0", + "semver": "^7.3.5" + } + }, + "css-prefers-color-scheme": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", + "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", + "dev": true, + "requires": {} + }, + "css-select": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", + "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", + "dev": true, + "requires": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + } + }, + "css-what": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", + "dev": true + }, + "cssdb": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cssdb/-/cssdb-5.1.0.tgz", + "integrity": "sha512-/vqjXhv1x9eGkE/zO6o8ZOI7dgdZbLVLUGyVRbPgk6YipXbW87YzUCcO+Jrmi5bwJlAH6oD+MNeZyRgXea1GZw==", + "dev": true + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "date-format": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.6.tgz", + "integrity": "sha512-B9vvg5rHuQ8cbUXE/RMWMyX2YA5TecT3jKF5fLtGNlzPlU7zblSPmAm2OImDbWL+LDOQ6pUm+4LOFz+ywS41Zw==", + "dev": true + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", + "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", + "dev": true, + "requires": { + "execa": "^5.0.0" + } + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "^1.0.2" + } + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "dev": true + }, + "define-properties": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", + "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "del": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/del/-/del-6.0.0.tgz", + "integrity": "sha512-1shh9DQ23L16oXSZKB2JxpL7iMy2E0S9d517ptA1P8iw0alkPtQcrKH7ru31rYtKwF499HkTu+DRzq3TCKDFRQ==", + "dev": true, + "requires": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + } + } + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dev": true + }, + "destroy": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "dev": true + }, + "detect-node": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", + "dev": true + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.4.tgz", + "integrity": "sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "dom-serializer": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", + "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", + "dev": true, + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", + "dev": true + }, + "domhandler": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", + "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", + "dev": true, + "requires": { + "domelementtype": "^2.2.0" + } + }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dev": true, + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.4.124", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.124.tgz", + "integrity": "sha512-VhaE9VUYU6d2eIb+4xf83CATD+T+3bTzvxvlADkQE+c2hisiw3sZmvEDtsW704+Zky9WZGhBuQXijDVqSriQLA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "optional": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "optional": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "engine.io": { + "version": "6.1.3", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.1.3.tgz", + "integrity": "sha512-rqs60YwkvWTLLnfazqgZqLa/aKo+9cueVfEi/dZ8PyGyaf8TLOxj++4QMIgeG3Gn0AhrWiFXvghsoY9L9h25GA==", + "dev": true, + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.0.3", + "ws": "~8.2.3" + } + }, + "engine.io-parser": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.3.tgz", + "integrity": "sha512-BtQxwF27XUNnSafQLvDi0dQ8s3i6VgzSoQMJacpIcGNrlUdfHSKbgm3jmjCVvQluGzqwujQMPAoMai3oYSTurg==", + "dev": true, + "requires": { + "@socket.io/base64-arraybuffer": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", + "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", + "dev": true + }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "optional": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "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 + }, + "esbuild": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.14.22.tgz", + "integrity": "sha512-CjFCFGgYtbFOPrwZNJf7wsuzesx8kqwAffOlbYcFDLFuUtP8xloK1GH+Ai13Qr0RZQf9tE7LMTHJ2iVGJ1SKZA==", + "dev": true, + "optional": true, + "requires": { + "esbuild-android-arm64": "0.14.22", + "esbuild-darwin-64": "0.14.22", + "esbuild-darwin-arm64": "0.14.22", + "esbuild-freebsd-64": "0.14.22", + "esbuild-freebsd-arm64": "0.14.22", + "esbuild-linux-32": "0.14.22", + "esbuild-linux-64": "0.14.22", + "esbuild-linux-arm": "0.14.22", + "esbuild-linux-arm64": "0.14.22", + "esbuild-linux-mips64le": "0.14.22", + "esbuild-linux-ppc64le": "0.14.22", + "esbuild-linux-riscv64": "0.14.22", + "esbuild-linux-s390x": "0.14.22", + "esbuild-netbsd-64": "0.14.22", + "esbuild-openbsd-64": "0.14.22", + "esbuild-sunos-64": "0.14.22", + "esbuild-windows-32": "0.14.22", + "esbuild-windows-64": "0.14.22", + "esbuild-windows-arm64": "0.14.22" + } + }, + "esbuild-android-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.14.22.tgz", + "integrity": "sha512-k1Uu4uC4UOFgrnTj2zuj75EswFSEBK+H6lT70/DdS4mTAOfs2ECv2I9ZYvr3w0WL0T4YItzJdK7fPNxcPw6YmQ==", + "dev": true, + "optional": true + }, + "esbuild-darwin-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.14.22.tgz", + "integrity": "sha512-d8Ceuo6Vw6HM3fW218FB6jTY6O3r2WNcTAU0SGsBkXZ3k8SDoRLd3Nrc//EqzdgYnzDNMNtrWegK2Qsss4THhw==", + "dev": true, + "optional": true + }, + "esbuild-darwin-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.14.22.tgz", + "integrity": "sha512-YAt9Tj3SkIUkswuzHxkaNlT9+sg0xvzDvE75LlBo4DI++ogSgSmKNR6B4eUhU5EUUepVXcXdRIdqMq9ppeRqfw==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.14.22.tgz", + "integrity": "sha512-ek1HUv7fkXMy87Qm2G4IRohN+Qux4IcnrDBPZGXNN33KAL0pEJJzdTv0hB/42+DCYWylSrSKxk3KUXfqXOoH4A==", + "dev": true, + "optional": true + }, + "esbuild-freebsd-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.14.22.tgz", + "integrity": "sha512-zPh9SzjRvr9FwsouNYTqgqFlsMIW07O8mNXulGeQx6O5ApgGUBZBgtzSlBQXkHi18WjrosYfsvp5nzOKiWzkjQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.14.22.tgz", + "integrity": "sha512-SnpveoE4nzjb9t2hqCIzzTWBM0RzcCINDMBB67H6OXIuDa4KqFqaIgmTchNA9pJKOVLVIKd5FYxNiJStli21qg==", + "dev": true, + "optional": true + }, + "esbuild-linux-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.14.22.tgz", + "integrity": "sha512-Zcl9Wg7gKhOWWNqAjygyqzB+fJa19glgl2JG7GtuxHyL1uEnWlpSMytTLMqtfbmRykIHdab797IOZeKwk5g0zg==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.14.22.tgz", + "integrity": "sha512-soPDdbpt/C0XvOOK45p4EFt8HbH5g+0uHs5nUKjHVExfgR7du734kEkXR/mE5zmjrlymk5AA79I0VIvj90WZ4g==", + "dev": true, + "optional": true + }, + "esbuild-linux-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.14.22.tgz", + "integrity": "sha512-8q/FRBJtV5IHnQChO3LHh/Jf7KLrxJ/RCTGdBvlVZhBde+dk3/qS9fFsUy+rs3dEi49aAsyVitTwlKw1SUFm+A==", + "dev": true, + "optional": true + }, + "esbuild-linux-mips64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.14.22.tgz", + "integrity": "sha512-SiNDfuRXhGh1JQLLA9JPprBgPVFOsGuQ0yDfSPTNxztmVJd8W2mX++c4FfLpAwxuJe183mLuKf7qKCHQs5ZnBQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-ppc64le": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.14.22.tgz", + "integrity": "sha512-6t/GI9I+3o1EFm2AyN9+TsjdgWCpg2nwniEhjm2qJWtJyJ5VzTXGUU3alCO3evopu8G0hN2Bu1Jhz2YmZD0kng==", + "dev": true, + "optional": true + }, + "esbuild-linux-riscv64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.14.22.tgz", + "integrity": "sha512-AyJHipZKe88sc+tp5layovquw5cvz45QXw5SaDgAq2M911wLHiCvDtf/07oDx8eweCyzYzG5Y39Ih568amMTCQ==", + "dev": true, + "optional": true + }, + "esbuild-linux-s390x": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.14.22.tgz", + "integrity": "sha512-Sz1NjZewTIXSblQDZWEFZYjOK6p8tV6hrshYdXZ0NHTjWE+lwxpOpWeElUGtEmiPcMT71FiuA9ODplqzzSxkzw==", + "dev": true, + "optional": true + }, + "esbuild-netbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.14.22.tgz", + "integrity": "sha512-TBbCtx+k32xydImsHxvFgsOCuFqCTGIxhzRNbgSL1Z2CKhzxwT92kQMhxort9N/fZM2CkRCPPs5wzQSamtzEHA==", + "dev": true, + "optional": true + }, + "esbuild-openbsd-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.14.22.tgz", + "integrity": "sha512-vK912As725haT313ANZZZN+0EysEEQXWC/+YE4rQvOQzLuxAQc2tjbzlAFREx3C8+uMuZj/q7E5gyVB7TzpcTA==", + "dev": true, + "optional": true + }, + "esbuild-sunos-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.14.22.tgz", + "integrity": "sha512-/mbJdXTW7MTcsPhtfDsDyPEOju9EOABvCjeUU2OJ7fWpX/Em/H3WYDa86tzLUbcVg++BScQDzqV/7RYw5XNY0g==", + "dev": true, + "optional": true + }, + "esbuild-wasm": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.14.22.tgz", + "integrity": "sha512-FOSAM29GN1fWusw0oLMv6JYhoheDIh5+atC72TkJKfIUMID6yISlicoQSd9gsNSFsNBvABvtE2jR4JB1j4FkFw==", + "dev": true + }, + "esbuild-windows-32": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.14.22.tgz", + "integrity": "sha512-1vRIkuvPTjeSVK3diVrnMLSbkuE36jxA+8zGLUOrT4bb7E/JZvDRhvtbWXWaveUc/7LbhaNFhHNvfPuSw2QOQg==", + "dev": true, + "optional": true + }, + "esbuild-windows-64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.14.22.tgz", + "integrity": "sha512-AxjIDcOmx17vr31C5hp20HIwz1MymtMjKqX4qL6whPj0dT9lwxPexmLj6G1CpR3vFhui6m75EnBEe4QL82SYqw==", + "dev": true, + "optional": true + }, + "esbuild-windows-arm64": { + "version": "0.14.22", + "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.14.22.tgz", + "integrity": "sha512-5wvQ+39tHmRhNpu2Fx04l7QfeK3mQ9tKzDqqGR8n/4WUxsFxnVLfDRBGirIfk4AfWlxk60kqirlODPoT5LqMUg==", + "dev": true, + "optional": true + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true + }, + "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.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "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 + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "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" + } + }, + "express": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.0.tgz", + "integrity": "sha512-EJEXxiTQJS3lIPrU1AE2vRuT7X7E+0KBbpm5GSoK524yl0K8X+er8zS2P14E64eqsVNoWbMCT7MpmQ+ErAhgRg==", + "dev": true, + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.0", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.5.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.10.3", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "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 + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==", + "dev": true + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + } + }, + "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 + }, + "fast-glob": { + "version": "3.2.10", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.10.tgz", + "integrity": "sha512-s9nFhFnvR63wls6/kM88kQqDhMu0AfdjqouE2l5GVQPbqLgyFjjU5ry/r2yKsJxpb9Py1EYNqieFrmMaX4v++A==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", + "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", + "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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" + } + }, + "flatted": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.5.tgz", + "integrity": "sha512-WIWGi2L3DyTUvUrwRKgGi9TwxQMUEqPOPQBVi71R96jZXJdFskXEmf54BoZaS1kknGODoIGASGEzBUYdyMCBJg==", + "dev": true + }, + "follow-redirects": { + "version": "1.14.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", + "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", + "dev": true + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "dev": true + }, + "fraction.js": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.2.0.tgz", + "integrity": "sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA==", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.0.1.tgz", + "integrity": "sha512-NbdoVMZso2Lsrn/QwLXOy6rm0ufY2zEOKCDzJR/0kBsb0E6qed0P3iYK+Ath3BfvXEeu4JhEtXLgILx5psUfag==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-monkey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "dev": true, + "optional": 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 + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-package-type": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", + "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", + "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.2.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "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-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "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 + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz", + "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==", + "dev": true, + "requires": { + "array-union": "^3.0.1", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.7", + "ignore": "^5.1.9", + "merge2": "^1.4.1", + "slash": "^4.0.0" + } + }, + "graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==", + "dev": true + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "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-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true + }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "dev": true, + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==", + "dev": true + }, + "hosted-git-info": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", + "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + }, + "dependencies": { + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "dev": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "html-entities": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "dev": true, + "requires": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "dependencies": { + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "http-parser-js": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.6.tgz", + "integrity": "sha512-vDlkRPDJn93swjcjqMSaGSPABbIarsr1TLAui/gLDXzV5VsJNdXNzMYDyNBLQkjWQCJ1uizu8T2oDMhmGt0PRA==", + "dev": true + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", + "dev": true, + "requires": { + "@tootallnate/once": "1", + "agent-base": "6", + "debug": "4" + } + }, + "http-proxy-middleware": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "dev": true, + "requires": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dev": true, + "requires": { + "agent-base": "6", + "debug": "4" + } + }, + "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 + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "icss-utils": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", + "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", + "dev": true, + "requires": {} + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "ignore-walk": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz", + "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immutable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz", + "integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==", + "dev": true + }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "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 + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "inquirer": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-8.2.0.tgz", + "integrity": "sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^4.1.1", + "cli-cursor": "^3.1.0", + "cli-width": "^3.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.21", + "mute-stream": "0.0.8", + "ora": "^5.4.1", + "run-async": "^2.4.0", + "rxjs": "^7.2.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ipaddr.js": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", + "dev": true + }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, + "is-plain-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", + "dev": true + }, + "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-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "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 + }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "dev": true + }, + "is-what": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", + "integrity": "sha512-sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==", + "dev": true + }, + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dev": true, + "requires": { + "is-docker": "^2.0.0" + } + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isbinaryfile": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.8.tgz", + "integrity": "sha512-53h6XFniq77YdW+spoRrebh0mnmTxRPTlcuIArO57lmMdq4uBKFKaeTjnb92oYWrSn/LVL+LT+Hap2tFQj8V+w==", + "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 + }, + "istanbul-lib-coverage": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", + "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.1.0.tgz", + "integrity": "sha512-czwUz525rkOFDJxfKK6mYfIs9zBKILyrZQxjz3ABhjQXhbhFsSbo1HW/BFcsDnfJYJWA6thRR5/TUY2qs5W99Q==", + "dev": true, + "requires": { + "@babel/core": "^7.12.3", + "@babel/parser": "^7.14.7", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", + "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.0.0", + "make-dir": "^3.0.0", + "supports-color": "^7.1.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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", + "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^3.0.0", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "istanbul-reports": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.3.tgz", + "integrity": "sha512-x9LtDVtfm/t1GFiLl3NffC7hz+I1ragvgX1P/Lg1NlIagifZDKUkuuaAxH/qpwj2IuEfD8G2Bs/UKp+sZ/pKkg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0", + "istanbul-lib-report": "^3.0.0" + } + }, + "jasmine-core": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-4.1.0.tgz", + "integrity": "sha512-8E8BiffCL8sBwK1zU9cbavLe8xpJAgOduSJ6N8PJVv8VosQ/nxVTuXj2kUeHxTlZBVvh24G19ga7xdiaxlceKg==", + "dev": true + }, + "jest-worker": { + "version": "27.4.6", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.4.6.tgz", + "integrity": "sha512-gHWJF/6Xi5CTG5QCvROr6GcmpIqNYpDJyc8A1h/DyXqH1tD6SnRCM0d3U5msV31D2LB/U+E0M+W4oyvKV44oNw==", + "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" + } + } + } + }, + "jquery": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", + "integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==" + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dev": true, + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json5": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", + "dev": true + }, + "jsonc-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz", + "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "karma": { + "version": "6.3.19", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.19.tgz", + "integrity": "sha512-NDhWckzES/Y9xMiddyU1RzaKL76/scCsu8Mp0vR0Z3lQRvC3p72+Ab4ppoxs36S9tyPNX5V48yvaV++RNEBPZw==", + "dev": true, + "requires": { + "@colors/colors": "1.5.0", + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.5.1", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.7", + "graceful-fs": "^4.2.6", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.8", + "lodash": "^4.17.21", + "log4js": "^6.4.1", + "mime": "^2.5.2", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.5", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^4.4.1", + "source-map": "^0.6.1", + "tmp": "^0.2.1", + "ua-parser-js": "^0.7.30", + "yargs": "^16.1.1" + }, + "dependencies": { + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + }, + "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 + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.1.tgz", + "integrity": "sha512-hsIglcq1vtboGPAN+DGCISCFOxW+ZVnIqhDQcCMqqCp+4dmJ0Qpq5QAjkbA0X2L9Mi6OBkHi2Srrbmm7pUKkzQ==", + "dev": true, + "requires": { + "which": "^1.2.1" + } + }, + "karma-coverage": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/karma-coverage/-/karma-coverage-2.2.0.tgz", + "integrity": "sha512-gPVdoZBNDZ08UCzdMHHhEImKrw1+PAOQOIiffv1YsvxFhBjqvo/SVXNk4tqn1SYqX0BJZT6S/59zgxiBe+9OuA==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^3.2.0", + "istanbul-lib-instrument": "^5.1.0", + "istanbul-lib-report": "^3.0.0", + "istanbul-lib-source-maps": "^4.0.1", + "istanbul-reports": "^3.0.5", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-5.0.0.tgz", + "integrity": "sha512-dsFkCoTwyoNyQnMgegS72wIA/2xPDJG5yzTry0448U6lAY7P60Wgg4UuLlbdLv8YHbimgNpDXjjmfPdc99EDWQ==", + "dev": true, + "requires": { + "jasmine-core": "^4.1.0" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", + "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", + "dev": true, + "requires": {} + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + } + }, + "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 + }, + "klona": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "dev": true + }, + "less": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/less/-/less-4.1.2.tgz", + "integrity": "sha512-EoQp/Et7OSOVu0aJknJOtlXZsnr8XE8KwuzTHOLeVSEx8pVWUICc8Q0VYRHgzyjX78nMEyC/oztWFbgyhtNfDA==", + "dev": true, + "requires": { + "copy-anything": "^2.0.1", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "make-dir": "^2.1.0", + "mime": "^1.4.1", + "needle": "^2.5.2", + "parse-node-version": "^1.0.1", + "source-map": "~0.6.0", + "tslib": "^2.3.0" + }, + "dependencies": { + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "optional": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "optional": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "optional": true + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true, + "optional": 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, + "optional": true + } + } + }, + "less-loader": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-10.2.0.tgz", + "integrity": "sha512-AV5KHWvCezW27GT90WATaDnfXBv99llDbtaj4bshq6DvAihMdNjaPDcUMa6EXKLRF+P2opFenJp89BXg91XLYg==", + "dev": true, + "requires": { + "klona": "^2.0.4" + } + }, + "license-webpack-plugin": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-4.0.2.tgz", + "integrity": "sha512-771TFWFD70G1wLTC4oU2Cw4qvtmNrIw+wRvBtn+okgHl7slJVi7zfNcdmqDL72BojM30VNJ2UHylr1o77U37Jw==", + "dev": true, + "requires": { + "webpack-sources": "^3.0.0" + } + }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "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": "3.2.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-3.2.0.tgz", + "integrity": "sha512-HVl9ZqccQihZ7JM85dco1MvO9G+ONvxoGa9rkhzFsneGLKSUg1gJf9bWzhRhcvm2qChhWpebQhP44qxjKIUCaQ==", + "dev": true + }, + "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 + }, + "lodash.debounce": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", + "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=", + "dev": true + }, + "log-symbols": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "log4js": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.4.4.tgz", + "integrity": "sha512-ncaWPsuw9Vl1CKA406hVnJLGQKy1OHx6buk8J4rE2lVW+NW5Y82G5/DIloO7NkqLOUtNPEANaWC1kZYVjXssPw==", + "dev": true, + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "flatted": "^3.2.5", + "rfdc": "^1.3.0", + "streamroller": "^3.0.6" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.7", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", + "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-fetch-happen": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz", + "integrity": "sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==", + "dev": true, + "requires": { + "agentkeepalive": "^4.1.3", + "cacache": "^15.2.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^6.0.0", + "minipass": "^3.1.3", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^1.3.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.2", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.0.0", + "ssri": "^8.0.0" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "memfs": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.1.tgz", + "integrity": "sha512-1c9VPVvW5P7I85c35zAdEr1TD5+F11IToIHIlrVIcflfnzPkJa0ZoYEoEdYDP8KgPFoSZ/opDrUsAoZWym3mtw==", + "dev": true, + "requires": { + "fs-monkey": "1.0.3" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + } + }, + "mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "dev": true + }, + "mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "dev": true + }, + "mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dev": true, + "requires": { + "mime-db": "1.51.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": "2.5.3", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz", + "integrity": "sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw==", + "dev": true, + "requires": { + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", + "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "dev": true + }, + "minipass": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.6.tgz", + "integrity": "sha512-rty5kpw9/z8SX9dmxblFA6edItUmwJgMeYDZRrwlIVN27i8gysGbznJwUggw2V/FVqFSDdWy040ZPS811DYAqQ==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-fetch": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-1.4.1.tgz", + "integrity": "sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==", + "dev": true, + "requires": { + "encoding": "^0.1.12", + "minipass": "^3.1.0", + "minipass-sized": "^1.0.3", + "minizlib": "^2.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-json-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minipass-json-stream/-/minipass-json-stream-1.0.1.tgz", + "integrity": "sha512-ODqY18UZt/I8k+b7rl2AENgbWE8IDYam+undIJONvigAz8KR5GWblsFTEfQs0WODsjbSXWlm+JHEv8Gr6Tfdbg==", + "dev": true, + "requires": { + "jsonparse": "^1.3.1", + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nanoid": { + "version": "3.1.31", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.1.31.tgz", + "integrity": "sha512-ZivnJm0o9bb13p2Ot5CpgC2rQdzB9Uxm/mFZweqm5eMViqOJe3PV6LU2E30SiLgheesmcPrjquqraoolONSA0A==", + "dev": true + }, + "needle": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.9.1.tgz", + "integrity": "sha512-6R9fqJ5Zcmf+uYaFgdIHmLwNldn5HbK8L5ybn7Uz+ylX/rnOsSp1AHcvQSrCaFN+qNM1wpymHqD7mVasEOlHGQ==", + "dev": true, + "optional": true, + "requires": { + "debug": "^3.2.6", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "optional": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "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 + }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "dev": true, + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + } + }, + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true, + "optional": true + }, + "node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "dev": true + }, + "node-gyp": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-8.4.1.tgz", + "integrity": "sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^9.1.0", + "nopt": "^5.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "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" + } + } + } + }, + "node-gyp-build": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.4.0.tgz", + "integrity": "sha512-amJnQCcgtRVw9SvoebO3BKGESClrfXGCUTX9hSn1OuGQTQBOZmVd0Z0OlecpuRksKvbsUqALE8jls/ErClAPuQ==", + "dev": true, + "optional": true + }, + "node-releases": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.4.tgz", + "integrity": "sha512-gbMzqQtTtDz/00jQzZ21PQzdI9PyLYqUSvD0p3naOhX4odFji0ZxYdnVwPTxmSwkmxhcFImpozceidSG+AgoPQ==", + "dev": true + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "dev": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "npm-bundled": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz", + "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-install-checks": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/npm-install-checks/-/npm-install-checks-4.0.0.tgz", + "integrity": "sha512-09OmyDkNLYwqKPOnbI8exiOZU2GVVmQp7tgez2BPi5OZC8M82elDAps7sxC4l//uSUtotWqoEIDwjRvWH4qz8w==", + "dev": true, + "requires": { + "semver": "^7.1.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-8.1.5.tgz", + "integrity": "sha512-LhgZrg0n0VgvzVdSm1oiZworPbTxYHUJCgtsJW8mGvlDpxTM1vSJc3m5QZeUkhAHIzbz3VCHd/R4osi1L1Tg/Q==", + "dev": true, + "requires": { + "hosted-git-info": "^4.0.1", + "semver": "^7.3.4", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz", + "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==", + "dev": true, + "requires": { + "glob": "^7.1.6", + "ignore-walk": "^4.0.1", + "npm-bundled": "^1.1.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-6.1.1.tgz", + "integrity": "sha512-dBsdBtORT84S8V8UTad1WlUyKIY9iMsAmqxHbLdeEeBNMLQDlDWWra3wYUx9EBEIiG/YwAy0XyNHDd2goAsfuA==", + "dev": true, + "requires": { + "npm-install-checks": "^4.0.0", + "npm-normalize-package-bin": "^1.0.1", + "npm-package-arg": "^8.1.2", + "semver": "^7.3.4" + } + }, + "npm-registry-fetch": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-12.0.2.tgz", + "integrity": "sha512-Df5QT3RaJnXYuOwtXBXS9BWs+tHH2olvkCLh6jcR/b/u3DvPMlp3J0TvvYwplPKxHMOwfg287PYih9QqaVFoKA==", + "dev": true, + "requires": { + "make-fetch-happen": "^10.0.1", + "minipass": "^3.1.6", + "minipass-fetch": "^1.4.1", + "minipass-json-stream": "^1.0.1", + "minizlib": "^2.1.2", + "npm-package-arg": "^8.1.5" + }, + "dependencies": { + "@npmcli/fs": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.0.tgz", + "integrity": "sha512-DmfBvNXGaetMxj9LTp8NAN9vEidXURrf5ZTslQzEAi/6GbW+4yjaLFQc6Tue5cpZ9Frlk4OBo/Snf1Bh/S7qTQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + } + }, + "@npmcli/move-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.0.tgz", + "integrity": "sha512-UR6D5f4KEGWJV6BGPH3Qb2EtgH+t+1XQ1Tt85c7qicN6cezzuHPdZwwAxqZr4JLtnQu0LZsTza/5gmNmSl8XLg==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "cacache": { + "version": "16.0.7", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.0.7.tgz", + "integrity": "sha512-a4zfQpp5vm4Ipdvbj+ZrPonikRhm6WBEd4zT1Yc1DXsmAxrPgDwWBLF/u/wTVXSFPIgOJ1U3ghSa2Xm4s3h28w==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^1.1.1" + } + }, + "glob": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.1.tgz", + "integrity": "sha512-cF7FYZZ47YzmCu7dDy50xSRRfO3ErRfrXuLZcNIuyiJEco0XSrGtuilG19L5xp3NcwTx7Gn+X6Tv3fmsUPTbow==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.8.1.tgz", + "integrity": "sha512-E1v547OCgJvbvevfjgK9sNKIVXO96NnsTsFPBlg4ZxjhsJSODoH9lk8Bm0OxvHNm6Vm5Yqkl/1fErDxhYL8Skg==", + "dev": true + }, + "make-fetch-happen": { + "version": "10.1.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.1.2.tgz", + "integrity": "sha512-GWMGiZsKVeJACQGJ1P3Z+iNec7pLsU6YW1q11eaPn3RR8nRXHppFWfP7Eu0//55JK3hSjrAQRl8sDa5uXpq1Ew==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.0.2", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^6.1.1", + "ssri": "^9.0.0" + }, + "dependencies": { + "minipass-fetch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.0.tgz", + "integrity": "sha512-H9U4UVBGXEyyWJnqYDCLp1PwD8XIkJ4akNHp1aGVI+2Ym7wQMlxDKi4IB4JbmyU+pl9pEs/cVrK6cOuvmbK4Sg==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + } + } + } + }, + "minimatch": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", + "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + }, + "ssri": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.0.tgz", + "integrity": "sha512-Y1Z6J8UYnexKFN1R/hxUaYoY2LVdKEzziPmVAFKiKX8fiwvCJTVzn/xYE9TEWod5OVyNfIHHuVfIEuBClL/uJQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "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" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "nth-check": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.0.1.tgz", + "integrity": "sha512-it1vE95zF6dTT9lBsYbxvqh0Soy4SPowchj0UBGj/V6cTPnXXtQOPUbhZ6CmGzAD/rW22LQK6E96pcdJXk4A4w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object-inspect": { + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.0.tgz", + "integrity": "sha512-Ho2z80bVIvJloH+YzRmpZVQe87+qASmBUKZDWgx9cu+KDrX2ZDH/3tMy+gXbZETVGs2M8YdxObOh7XAtim9Y0g==", + "dev": true + }, + "object-is": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", + "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-client": { + "version": "1.11.5", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.5.tgz", + "integrity": "sha512-LcKrKC8Av0m/KD/4EFmo9Sg8fSQ+WFJWBrmtWd+tZkNn3WT/sQG3REmPANE9tzzhbjW6VkTNy4xhAXCfPApAOg==", + "requires": { + "acorn": "^7.4.1", + "base64-js": "^1.5.1", + "core-js": "^3.8.3", + "crypto-js": "^4.0.0", + "serialize-javascript": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "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" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dev": true, + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "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": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true + }, + "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-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" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", + "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", + "dev": true, + "requires": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "dependencies": { + "retry": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", + "dev": true + } + } + }, + "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 + }, + "pacote": { + "version": "12.0.3", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-12.0.3.tgz", + "integrity": "sha512-CdYEl03JDrRO3x18uHjBYA9TyoW8gy+ThVcypcDkxPtKlw76e4ejhYB6i9lJ+/cebbjpqPW/CijjqxwDTts8Ow==", + "dev": true, + "requires": { + "@npmcli/git": "^2.1.0", + "@npmcli/installed-package-contents": "^1.0.6", + "@npmcli/promise-spawn": "^1.2.0", + "@npmcli/run-script": "^2.0.0", + "cacache": "^15.0.5", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "infer-owner": "^1.0.4", + "minipass": "^3.1.3", + "mkdirp": "^1.0.3", + "npm-package-arg": "^8.0.1", + "npm-packlist": "^3.0.0", + "npm-pick-manifest": "^6.0.0", + "npm-registry-fetch": "^12.0.0", + "promise-retry": "^2.0.1", + "read-package-json-fast": "^2.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.1", + "tar": "^6.1.0" + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==", + "dev": true + }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, + "parse-node-version": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parse-node-version/-/parse-node-version-1.0.1.tgz", + "integrity": "sha512-3YHlOa/JgH6Mnpr05jP9eDG254US9ek25LyIxZlDItp2iJtwyaXQb57lBYLdT3MowkUFYEV2XXNAYIPlESvJlA==", + "dev": true + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "parse5-html-rewriting-stream": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-html-rewriting-stream/-/parse5-html-rewriting-stream-6.0.1.tgz", + "integrity": "sha512-vwLQzynJVEfUlURxgnf51yAJDQTtVpNyGD8tKi2Za7m+akukNHxCcUQMAa/mUGLhCeicFdpy7Tlvj8ZNKadprg==", + "dev": true, + "requires": { + "parse5": "^6.0.1", + "parse5-sax-parser": "^6.0.1" + } + }, + "parse5-htmlparser2-tree-adapter": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", + "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parse5-sax-parser": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-6.0.1.tgz", + "integrity": "sha512-kXX+5S81lgESA0LsDuGjAlBybImAChYRMT+/uKCEXFBFOeEhS52qUCydGhU3qLRD8D9DVjaUo821WK7DM4iCeg==", + "dev": true, + "requires": { + "parse5": "^6.0.1" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "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 + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "dev": true, + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, + "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" + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "requires": { + "minimist": "^1.2.6" + } + } + } + }, + "postcss": { + "version": "8.4.5", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.5.tgz", + "integrity": "sha512-jBDboWM8qpaqwkMwItqTQTiFikhs/67OYVvblFFTM7MrZjt6yMKd6r2kgXizEbTTljacm4NldIlZnhbjr84QYg==", + "dev": true, + "requires": { + "nanoid": "^3.1.30", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.1" + } + }, + "postcss-attribute-case-insensitive": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-attribute-case-insensitive/-/postcss-attribute-case-insensitive-5.0.0.tgz", + "integrity": "sha512-b4g9eagFGq9T5SWX4+USfVyjIb3liPnjhHHRMP7FMB2kFVpYyfEscV0wP3eaXhKlcHKUut8lt5BGoeylWA/dBQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.2" + } + }, + "postcss-color-functional-notation": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/postcss-color-functional-notation/-/postcss-color-functional-notation-4.2.2.tgz", + "integrity": "sha512-DXVtwUhIk4f49KK5EGuEdgx4Gnyj6+t2jBSEmxvpIK9QI40tWrpS2Pua8Q7iIZWBrki2QOaeUdEaLPPa91K0RQ==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-hex-alpha": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/postcss-color-hex-alpha/-/postcss-color-hex-alpha-8.0.3.tgz", + "integrity": "sha512-fESawWJCrBV035DcbKRPAVmy21LpoyiXdPTuHUfWJ14ZRjY7Y7PA6P4g8z6LQGYhU1WAxkTxjIjurXzoe68Glw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-color-rebeccapurple": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-color-rebeccapurple/-/postcss-color-rebeccapurple-7.0.2.tgz", + "integrity": "sha512-SFc3MaocHaQ6k3oZaFwH8io6MdypkUtEy/eXzXEB1vEQlO3S3oDc/FSZA8AsS04Z25RirQhlDlHLh3dn7XewWw==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-media": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", + "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", + "dev": true, + "requires": {} + }, + "postcss-custom-properties": { + "version": "12.1.7", + "resolved": "https://registry.npmjs.org/postcss-custom-properties/-/postcss-custom-properties-12.1.7.tgz", + "integrity": "sha512-N/hYP5gSoFhaqxi2DPCmvto/ZcRDVjE3T1LiAMzc/bg53hvhcHOLpXOHb526LzBBp5ZlAUhkuot/bfpmpgStJg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-custom-selectors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-custom-selectors/-/postcss-custom-selectors-6.0.0.tgz", + "integrity": "sha512-/1iyBhz/W8jUepjGyu7V1OPcGbc636snN1yXEQCinb6Bwt7KxsiU7/bLQlp8GwAXzCh7cobBU5odNn/2zQWR8Q==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-dir-pseudo-class": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-dir-pseudo-class/-/postcss-dir-pseudo-class-6.0.4.tgz", + "integrity": "sha512-I8epwGy5ftdzNWEYok9VjW9whC4xnelAtbajGv4adql4FIF09rnrxnA9Y8xSHN47y7gqFIv10C5+ImsLeJpKBw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-double-position-gradients": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/postcss-double-position-gradients/-/postcss-double-position-gradients-3.1.1.tgz", + "integrity": "sha512-jM+CGkTs4FcG53sMPjrrGE0rIvLDdCrqMzgDC5fLI7JHDO7o6QG8C5TQBtExb13hdBdoH9C2QVbG4jo2y9lErQ==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-env-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-env-function/-/postcss-env-function-4.0.6.tgz", + "integrity": "sha512-kpA6FsLra+NqcFnL81TnsU+Z7orGtDTxcOhl6pwXeEq1yFPpRMkCDpHhrz8CFQDr/Wfm0jLiNQ1OsGGPjlqPwA==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-focus-visible": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-visible/-/postcss-focus-visible-6.0.4.tgz", + "integrity": "sha512-QcKuUU/dgNsstIK6HELFRT5Y3lbrMLEOwG+A4s5cA+fx3A3y/JTq3X9LaOj3OC3ALH0XqyrgQIgey/MIZ8Wczw==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-focus-within": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-5.0.4.tgz", + "integrity": "sha512-vvjDN++C0mu8jz4af5d52CB184ogg/sSxAFS+oUJQq2SuCe7T5U2iIsVJtsCp2d6R4j0jr5+q3rPkBVZkXD9fQ==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.9" + } + }, + "postcss-font-variant": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", + "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", + "dev": true, + "requires": {} + }, + "postcss-gap-properties": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", + "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", + "dev": true, + "requires": {} + }, + "postcss-image-set-function": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/postcss-image-set-function/-/postcss-image-set-function-4.0.6.tgz", + "integrity": "sha512-KfdC6vg53GC+vPd2+HYzsZ6obmPqOk6HY09kttU19+Gj1nC3S3XBVEXDHxkhxTohgZqzbUb94bKXvKDnYWBm/A==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-import": { + "version": "14.0.2", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-14.0.2.tgz", + "integrity": "sha512-BJ2pVK4KhUyMcqjuKs9RijV5tatNzNa73e/32aBVE/ejYPe37iH+6vAu9WvqUkB5OAYgLHzbSvzHnorybJCm9g==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + } + }, + "postcss-initial": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", + "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", + "dev": true, + "requires": {} + }, + "postcss-lab-function": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-lab-function/-/postcss-lab-function-4.2.0.tgz", + "integrity": "sha512-Zb1EO9DGYfa3CP8LhINHCcTTCTLI+R3t7AX2mKsDzdgVQ/GkCpHOTgOr6HBHslP7XDdVbqgHW5vvRPMdVANQ8w==", + "dev": true, + "requires": { + "@csstools/postcss-progressive-custom-properties": "^1.1.0", + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-loader": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz", + "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==", + "dev": true, + "requires": { + "cosmiconfig": "^7.0.0", + "klona": "^2.0.5", + "semver": "^7.3.5" + } + }, + "postcss-logical": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", + "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", + "dev": true, + "requires": {} + }, + "postcss-media-minmax": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", + "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", + "dev": true, + "requires": {} + }, + "postcss-modules-extract-imports": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", + "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "dev": true, + "requires": {} + }, + "postcss-modules-local-by-default": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", + "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + } + }, + "postcss-modules-scope": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", + "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.4" + } + }, + "postcss-modules-values": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", + "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", + "dev": true, + "requires": { + "icss-utils": "^5.0.0" + } + }, + "postcss-nesting": { + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/postcss-nesting/-/postcss-nesting-10.1.4.tgz", + "integrity": "sha512-2ixdQ59ik/Gt1+oPHiI1kHdwEI8lLKEmui9B1nl6163ANLC+GewQn7fXMxJF2JSb4i2MKL96GU8fIiQztK4TTA==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-overflow-shorthand": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", + "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", + "dev": true, + "requires": {} + }, + "postcss-page-break": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", + "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", + "dev": true, + "requires": {} + }, + "postcss-place": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-place/-/postcss-place-7.0.4.tgz", + "integrity": "sha512-MrgKeiiu5OC/TETQO45kV3npRjOFxEHthsqGtkh3I1rPbZSbXGD/lZVi9j13cYh+NA8PIAPyk6sGjT9QbRyvSg==", + "dev": true, + "requires": { + "postcss-value-parser": "^4.2.0" + } + }, + "postcss-preset-env": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/postcss-preset-env/-/postcss-preset-env-7.2.3.tgz", + "integrity": "sha512-Ok0DhLfwrcNGrBn8sNdy1uZqWRk/9FId0GiQ39W4ILop5GHtjJs8bu1MY9isPwHInpVEPWjb4CEcEaSbBLpfwA==", + "dev": true, + "requires": { + "autoprefixer": "^10.4.2", + "browserslist": "^4.19.1", + "caniuse-lite": "^1.0.30001299", + "css-blank-pseudo": "^3.0.2", + "css-has-pseudo": "^3.0.3", + "css-prefers-color-scheme": "^6.0.2", + "cssdb": "^5.0.0", + "postcss-attribute-case-insensitive": "^5.0.0", + "postcss-color-functional-notation": "^4.2.1", + "postcss-color-hex-alpha": "^8.0.2", + "postcss-color-rebeccapurple": "^7.0.2", + "postcss-custom-media": "^8.0.0", + "postcss-custom-properties": "^12.1.2", + "postcss-custom-selectors": "^6.0.0", + "postcss-dir-pseudo-class": "^6.0.3", + "postcss-double-position-gradients": "^3.0.4", + "postcss-env-function": "^4.0.4", + "postcss-focus-visible": "^6.0.3", + "postcss-focus-within": "^5.0.3", + "postcss-font-variant": "^5.0.0", + "postcss-gap-properties": "^3.0.2", + "postcss-image-set-function": "^4.0.4", + "postcss-initial": "^4.0.1", + "postcss-lab-function": "^4.0.3", + "postcss-logical": "^5.0.3", + "postcss-media-minmax": "^5.0.0", + "postcss-nesting": "^10.1.2", + "postcss-overflow-shorthand": "^3.0.2", + "postcss-page-break": "^3.0.4", + "postcss-place": "^7.0.3", + "postcss-pseudo-class-any-link": "^7.0.2", + "postcss-replace-overflow-wrap": "^4.0.0", + "postcss-selector-not": "^5.0.0" + } + }, + "postcss-pseudo-class-any-link": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/postcss-pseudo-class-any-link/-/postcss-pseudo-class-any-link-7.1.2.tgz", + "integrity": "sha512-76XzEQv3g+Vgnz3tmqh3pqQyRojkcJ+pjaePsyhcyf164p9aZsu3t+NWxkZYbcHLK1ju5Qmalti2jPI5IWCe5w==", + "dev": true, + "requires": { + "postcss-selector-parser": "^6.0.10" + } + }, + "postcss-replace-overflow-wrap": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", + "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", + "dev": true, + "requires": {} + }, + "postcss-selector-not": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-not/-/postcss-selector-not-5.0.0.tgz", + "integrity": "sha512-/2K3A4TCP9orP4TNS7u3tGdRFVKqz/E6pX3aGnriPG0jU78of8wsUcqE4QAhWEU0d+WnMSF93Ah3F//vUtK+iQ==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "postcss-selector-parser": { + "version": "6.0.10", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", + "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, + "postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==", + "dev": true + }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", + "dev": true + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "dev": true, + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "dependencies": { + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + } + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true, + "optional": 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 + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.10.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", + "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", + "dev": true, + "requires": { + "side-channel": "^1.0.4" + } + }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "dev": true, + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json-fast": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/read-package-json-fast/-/read-package-json-fast-2.0.3.tgz", + "integrity": "sha512-W/BKtbL+dUjTuRL2vziuYhp76s5HZ9qQhd/dKfWIZveD0O40453QNyZhC0e63lqZrAQ4jiOapVoeJ7JrszenQQ==", + "dev": true, + "requires": { + "json-parse-even-better-errors": "^2.3.0", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", + "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2" + } + }, + "regenerator-runtime": { + "version": "0.13.9", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz", + "integrity": "sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==", + "dev": true + }, + "regenerator-transform": { + "version": "0.15.0", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", + "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-parser": { + "version": "2.2.11", + "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz", + "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", + "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" + } + }, + "regexpu-core": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.0.1.tgz", + "integrity": "sha512-CriEZlrKK9VJw/xQGJpQM5rY88BtuL8DM+AEwvcThHilbxiTAy8vq4iJnd2tqq8wLmjbGZzP7ZcKFjbGkmEFrw==", + "dev": true, + "requires": { + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.0.1", + "regjsgen": "^0.6.0", + "regjsparser": "^0.8.2", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.0.0" + } + }, + "regjsgen": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", + "dev": true + }, + "regjsparser": { + "version": "0.8.4", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", + "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", + "dev": true + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dev": true, + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.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 + }, + "resolve-url-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", + "integrity": "sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg==", + "dev": true, + "requires": { + "adjust-sourcemap-loader": "^4.0.0", + "convert-source-map": "^1.7.0", + "loader-utils": "^2.0.0", + "postcss": "^8.2.14", + "source-map": "0.6.1" + }, + "dependencies": { + "loader-utils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", + "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "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 + } + } + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, + "run-script-os": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/run-script-os/-/run-script-os-1.1.6.tgz", + "integrity": "sha512-ql6P2LzhBTTDfzKts+Qo4H94VUKpxKDFz6QxxwaUZN0mwvi7L3lpOI7BqPCq7lgDh3XLl0dpeXwfcVIitlrYrw==" + }, + "rxjs": { + "version": "7.5.5", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.5.5.tgz", + "integrity": "sha512-sy+H0pQofO95VDmFLzyaw9xNJU4KTRSwQIGM6+iG3SypAtCiLDzpeG8sJrNCWn2Up9km+KhkvTdbkrdy+yzZdw==", + "requires": { + "tslib": "^2.1.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", + "dev": true + }, + "sass": { + "version": "1.49.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz", + "integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==", + "dev": true, + "requires": { + "chokidar": ">=3.0.0 <4.0.0", + "immutable": "^4.0.0", + "source-map-js": ">=0.6.2 <2.0.0" + } + }, + "sass-loader": { + "version": "12.4.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.4.0.tgz", + "integrity": "sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg==", + "dev": true, + "requires": { + "klona": "^2.0.4", + "neo-async": "^2.6.2" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + }, + "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, + "requires": {} + }, + "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 + } + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selfsigned": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", + "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", + "dev": true, + "requires": { + "node-forge": "^1" + } + }, + "semver": { + "version": "7.3.5", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", + "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "send": { + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "dev": true + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "on-finished": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", + "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "dev": true + } + } + }, + "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" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "dev": true + }, + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "slash": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz", + "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==", + "dev": true + }, + "smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "dev": true + }, + "socket.io": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.4.1.tgz", + "integrity": "sha512-s04vrBswdQBUmuWJuuNTmXUVJhP0cVky8bBDhdkf8y0Ptsu7fKU2LuLbts9g+pdmAdyMMn8F/9Mf1/wbtUN0fg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "debug": "~4.3.2", + "engine.io": "~6.1.0", + "socket.io-adapter": "~2.3.3", + "socket.io-parser": "~4.0.4" + } + }, + "socket.io-adapter": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.3.3.tgz", + "integrity": "sha512-Qd/iwn3VskrpNO60BeRyCyr8ZWw9CPZyitW4AQwmRZ8zCiyDiL+znRnWX6tDHXnWn1sJrM1+b6Mn6wEDJJ4aYQ==", + "dev": true + }, + "socket.io-parser": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.0.4.tgz", + "integrity": "sha512-t+b0SS+IxG7Rxzda2EVvyBZbvFPBCjJoyHuE0P//7OAsN23GItzDRdWa6ALxZI/8R5ygK7jAR6t028/z+7295g==", + "dev": true, + "requires": { + "@types/component-emitter": "^1.2.10", + "component-emitter": "~1.3.0", + "debug": "~4.3.1" + } + }, + "sockjs": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", + "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", + "dev": true, + "requires": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "socks": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.6.2.tgz", + "integrity": "sha512-zDZhHhZRY9PxRruRMR7kMhnf3I8hDs4S3f9RecfnGxvcBHQcKcIH/oUcEWffsfl1XxdYlA7nnlGbbTvPz9D8gA==", + "dev": true, + "requires": { + "ip": "^1.1.5", + "smart-buffer": "^4.2.0" + } + }, + "socks-proxy-agent": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-6.2.0.tgz", + "integrity": "sha512-wWqJhjb32Q6GsrUqzuFkukxb/zzide5quXYcMVpIjxalDBBYy2nqKCFQ/9+Ie4dvOYSQdOk3hUlZSdzZOd3zMQ==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + } + }, + "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 + }, + "source-map-js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.1.tgz", + "integrity": "sha512-4+TN2b3tqOCd/kaGRJ/sTYA0tR0mdXx26ipdolxcwtJVqEnqNYvlCAt1q3ypy4QMlYus+Zh34RNtYLoq2oQ4IA==", + "dev": true + }, + "source-map-loader": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.1.tgz", + "integrity": "sha512-Vp1UsfyPvgujKQzi4pyDiTOnE3E4H+yHvkVRN3c/9PJmQS4CQJExvcDvaX/D+RV+xQben9HJ56jMJS3CgUeWyA==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "iconv-lite": "^0.6.3", + "source-map-js": "^1.0.1" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "source-map-resolve": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.6.0.tgz", + "integrity": "sha512-KXBr9d/fO/bWo97NXsPIAW1bFSBOuCnjbNTBMO7N59hsv5i9yzRDfcYwwt0l04+VqnKC+EwzvJZIP/qkuMgR/w==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0" + } + }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "ssri": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", + "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "streamroller": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-3.0.6.tgz", + "integrity": "sha512-Qz32plKq/MZywYyhEatxyYc8vs994Gz0Hu2MSYXXLD233UyPeIeRBZARIIGwFer4Mdb8r3Y2UqKkgyDghM6QCg==", + "dev": true, + "requires": { + "date-format": "^4.0.6", + "debug": "^4.3.4", + "fs-extra": "^10.0.1" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", + "dev": true, + "requires": { + "safe-buffer": "~5.2.0" + }, + "dependencies": { + "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 + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "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 + }, + "stylus": { + "version": "0.56.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.56.0.tgz", + "integrity": "sha512-Ev3fOb4bUElwWu4F9P9WjnnaSpc8XB9OFHSFZSKMFL1CE1oM+oFXWEgAqPmmZIyhBihuqIQlFsVTypiiS9RxeA==", + "dev": true, + "requires": { + "css": "^3.0.0", + "debug": "^4.3.2", + "glob": "^7.1.6", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "source-map": "^0.7.3" + } + }, + "stylus-loader": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-6.2.0.tgz", + "integrity": "sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==", + "dev": true, + "requires": { + "fast-glob": "^3.2.7", + "klona": "^2.0.4", + "normalize-path": "^3.0.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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "symbol-observable": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-4.0.0.tgz", + "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", + "dev": true + }, + "tapable": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", + "dev": true + }, + "tar": { + "version": "6.1.11", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.11.tgz", + "integrity": "sha512-an/KZQzQUkZCkuoAA64hM92X0Urb6VpRhAFllDzz44U2mcD5scmT3zBc4VgVpkugF580+DQn8eAFSyoQt0tznA==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "terser": { + "version": "5.11.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.11.0.tgz", + "integrity": "sha512-uCA9DLanzzWSsN1UirKwylhhRz3aKPInlfmpGfw8VN6jHsAtu8HJtIpeeHHK23rxnE/cDc+yvmq5wqkIC6Kn0A==", + "dev": true, + "requires": { + "acorn": "^8.5.0", + "commander": "^2.20.0", + "source-map": "~0.7.2", + "source-map-support": "~0.5.20" + } + }, + "terser-webpack-plugin": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.0.tgz", + "integrity": "sha512-LPIisi3Ol4chwAaPP8toUJ3L4qCM1G0wao7L3qNv57Drezxj6+VEyySpPw4B1HSO2Eg/hDY/MNF5XihCAoqnsQ==", + "dev": true, + "requires": { + "jest-worker": "^27.4.1", + "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, + "requires": {} + }, + "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 + }, + "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" + } + }, + "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 + } + } + }, + "test-exclude": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", + "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", + "dev": true, + "requires": { + "@istanbuljs/schema": "^0.1.2", + "glob": "^7.1.4", + "minimatch": "^3.0.4" + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "dev": true + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "tslib": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" + }, + "type-fest": { + "version": "0.21.3", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", + "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typed-assert": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/typed-assert/-/typed-assert-1.0.9.tgz", + "integrity": "sha512-KNNZtayBCtmnNmbo5mG47p1XsCyrx6iVqomjcZnec/1Y5GGARaxPs6r49RnSPeUP3YjNYiU9sQHAtY4BBvnZwg==", + "dev": true + }, + "typescript": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", + "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.31", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.31.tgz", + "integrity": "sha512-qLK/Xe9E2uzmYI3qLeOmI0tEOt+TBBQyUIAh4aAgU05FVYzeZrKUdkAZfBNVGRaHVgV0TDkdEngJSw/SyQchkQ==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz", + "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", + "dev": true + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", + "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", + "dev": true, + "requires": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "wcwidth": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz", + "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=", + "dev": true, + "requires": { + "defaults": "^1.0.3" + } + }, + "webpack": { + "version": "5.70.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.70.0.tgz", + "integrity": "sha512-ZMWWy8CeuTTjCxbeaQI21xSswseF2oNOwc70QSKNePvmxE7XW36i7vpBMYZFAUHPwQiEbNGCEYIOOlyRbdGmxw==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^0.0.51", + "@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.9.2", + "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.9", + "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.3.1", + "webpack-sources": "^3.2.3" + }, + "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, + "requires": {} + }, + "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 + }, + "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-dev-middleware": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.0.tgz", + "integrity": "sha512-MouJz+rXAm9B1OTOYaJnn6rtD/lWZPy2ufQCH3BPs8Rloh/Du6Jze4p7AeLYHkVi0giJnYLaSGDC7S+GM9arhg==", + "dev": true, + "requires": { + "colorette": "^2.0.10", + "memfs": "^3.2.2", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "dependencies": { + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + } + } + }, + "webpack-dev-server": { + "version": "4.7.3", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.7.3.tgz", + "integrity": "sha512-mlxq2AsIw2ag016nixkzUkdyOE8ST2GTy34uKSABp1c4nhjZvH90D5ZRR+UOLSsG4Z3TFahAi72a3ymRtfRm+Q==", + "dev": true, + "requires": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/serve-index": "^1.9.1", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.2.2", + "ansi-html-community": "^0.0.8", + "bonjour": "^3.5.0", + "chokidar": "^3.5.2", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "default-gateway": "^6.0.3", + "del": "^6.0.0", + "express": "^4.17.1", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.0", + "ipaddr.js": "^2.0.1", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "portfinder": "^1.0.28", + "schema-utils": "^4.0.0", + "selfsigned": "^2.0.0", + "serve-index": "^1.9.1", + "sockjs": "^0.3.21", + "spdy": "^4.0.2", + "strip-ansi": "^7.0.0", + "webpack-dev-middleware": "^5.3.0", + "ws": "^8.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "dev": true + }, + "schema-utils": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", + "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.8.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.0.0" + } + }, + "strip-ansi": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", + "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "dev": true, + "requires": { + "ansi-regex": "^6.0.1" + } + } + } + }, + "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": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "dev": true + }, + "webpack-subresource-integrity": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-5.1.0.tgz", + "integrity": "sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==", + "dev": true, + "requires": { + "typed-assert": "^1.0.8" + } + }, + "websocket-driver": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", + "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", + "dev": true, + "requires": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "wide-align": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", + "integrity": "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==", + "dev": true, + "requires": { + "string-width": "^1.0.2 || 2 || 3 || 4" + } + }, + "wildcard": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "dev": true + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "ws": { + "version": "8.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", + "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", + "dev": true, + "requires": {} + }, + "xhr2": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.2.1.tgz", + "integrity": "sha512-sID0rrVCqkVNUn8t6xuv9+6FViXjUVXq8H5rWOH2rz9fDNQEd4g0EA2XlcEdJXRz5BMEn4O1pJFdT+z4YHhoWw==" + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true + }, + "yargs": { + "version": "17.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.4.1.tgz", + "integrity": "sha512-WSZD9jgobAg3ZKuCQZSa3g9QOJeCCqLoLAykiWgmXnDo9EPnn4RPf5qVTtzgOx66o6/oqhcA5tHtJXpG8pMt3g==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.0.0" + } + }, + "yargs-parser": { + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", + "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==", + "dev": true + }, + "zone.js": { + "version": "0.11.5", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.5.tgz", + "integrity": "sha512-D1/7VxEuQ7xk6z/kAROe4SUbd9CzxY4zOwVGnGHerd/SgLIVU5f4esDzQUsOCeArn933BZfWMKydH7l7dPEp0g==", + "requires": { + "tslib": "^2.3.0" + } + } + } +} diff --git a/Tests/SignalR/ClientApp/package.json b/Tests/SignalR/ClientApp/package.json new file mode 100644 index 00000000..96ae3f27 --- /dev/null +++ b/Tests/SignalR/ClientApp/package.json @@ -0,0 +1,51 @@ +{ + "name": "signalr", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "prestart": "node aspnetcore-https", + "start": "run-script-os", + "start:windows": "ng serve --port 44435 --ssl --ssl-cert %APPDATA%\\ASP.NET\\https\\%npm_package_name%.pem --ssl-key %APPDATA%\\ASP.NET\\https\\%npm_package_name%.key", + "start:default": "ng serve --port 44435 --ssl --ssl-cert $HOME/.aspnet/https/${npm_package_name}.pem --ssl-key $HOME/.aspnet/https/${npm_package_name}.key", + "build": "ng build", + "build:ssr": "ng run SignalR:server:dev", + "watch": "ng build --watch --configuration development", + "test": "ng test" + }, + "private": true, + "dependencies": { + "@angular/animations": "~13.3.5", + "@angular/common": "~13.3.5", + "@angular/compiler": "~13.3.5", + "@angular/core": "~13.3.5", + "@angular/forms": "~13.3.5", + "@angular/platform-browser": "~13.3.5", + "@angular/platform-browser-dynamic": "~13.3.5", + "@angular/platform-server": "~13.3.5", + "@angular/router": "~13.3.5", + "bootstrap": "^5.1.3", + "jquery": "^3.6.0", + "oidc-client": "^1.11.5", + "popper.js": "^1.16.0", + "run-script-os": "^1.1.6", + "rxjs": "~7.5.5", + "tslib": "^2.4.0", + "zone.js": "~0.11.5" + }, + "devDependencies": { + "@angular-devkit/build-angular": "~13.3.4", + "@angular/cli": "~13.3.4", + "@angular/compiler-cli": "~13.3.5", + "@types/jasmine": "~4.0.3", + "@types/jasminewd2": "~2.0.10", + "@types/node": "^17.0.29", + "jasmine-core": "~4.1.0", + "karma": "~6.3.19", + "karma-chrome-launcher": "~3.1.1", + "karma-coverage": "~2.2.0", + "karma-jasmine": "~5.0.0", + "karma-jasmine-html-reporter": "^1.7.0", + "typescript": "~4.6.3" + }, + "optionalDependencies": {} +} diff --git a/Tests/SignalR/ClientApp/proxy.conf.js b/Tests/SignalR/ClientApp/proxy.conf.js new file mode 100644 index 00000000..ebbbb713 --- /dev/null +++ b/Tests/SignalR/ClientApp/proxy.conf.js @@ -0,0 +1,19 @@ +const { env } = require('process'); + +const target = env.ASPNETCORE_HTTPS_PORT ? `https://localhost:${env.ASPNETCORE_HTTPS_PORT}` : + env.ASPNETCORE_URLS ? env.ASPNETCORE_URLS.split(';')[0] : 'http://localhost:6749'; + +const PROXY_CONFIG = [ + { + context: [ + "/weatherforecast", + ], + target: target, + secure: false, + headers: { + Connection: 'Keep-Alive' + } + } +] + +module.exports = PROXY_CONFIG; diff --git a/Tests/SignalR/ClientApp/src/app/app.component.html b/Tests/SignalR/ClientApp/src/app/app.component.html new file mode 100644 index 00000000..7173845e --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/app.component.html @@ -0,0 +1,6 @@ + + +
+ +
+ diff --git a/Tests/SignalR/ClientApp/src/app/app.component.ts b/Tests/SignalR/ClientApp/src/app/app.component.ts new file mode 100644 index 00000000..0a40b8c1 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent { + title = 'app'; +} diff --git a/Tests/SignalR/ClientApp/src/app/app.module.ts b/Tests/SignalR/ClientApp/src/app/app.module.ts new file mode 100644 index 00000000..cecddedb --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/app.module.ts @@ -0,0 +1,34 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { NavMenuComponent } from './nav-menu/nav-menu.component'; +import { HomeComponent } from './home/home.component'; +import { CounterComponent } from './counter/counter.component'; +import { FetchDataComponent } from './fetch-data/fetch-data.component'; + +@NgModule({ + declarations: [ + AppComponent, + NavMenuComponent, + HomeComponent, + CounterComponent, + FetchDataComponent + ], + imports: [ + BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), + HttpClientModule, + FormsModule, + RouterModule.forRoot([ + { path: '', component: HomeComponent, pathMatch: 'full' }, + { path: 'counter', component: CounterComponent }, + { path: 'fetch-data', component: FetchDataComponent }, + ]) + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Tests/SignalR/ClientApp/src/app/app.server.module.ts b/Tests/SignalR/ClientApp/src/app/app.server.module.ts new file mode 100644 index 00000000..cfb0e021 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/app.server.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; +import { AppComponent } from './app.component'; +import { AppModule } from './app.module'; + +@NgModule({ + imports: [AppModule, ServerModule, ModuleMapLoaderModule], + bootstrap: [AppComponent] +}) +export class AppServerModule { } diff --git a/Tests/SignalR/ClientApp/src/app/counter/counter.component.html b/Tests/SignalR/ClientApp/src/app/counter/counter.component.html new file mode 100644 index 00000000..89b9c80f --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/counter/counter.component.html @@ -0,0 +1,7 @@ +

Counter

+ +

This is a simple example of an Angular component.

+ +

Current count: {{ currentCount }}

+ + diff --git a/Tests/SignalR/ClientApp/src/app/counter/counter.component.spec.ts b/Tests/SignalR/ClientApp/src/app/counter/counter.component.spec.ts new file mode 100644 index 00000000..37b350cc --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/counter/counter.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CounterComponent } from './counter.component'; + +describe('CounterComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CounterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CounterComponent); + fixture.detectChanges(); + }); + + it('should display a title', async(() => { + const titleText = fixture.nativeElement.querySelector('h1').textContent; + expect(titleText).toEqual('Counter'); + })); + + it('should start with count 0, then increments by 1 when clicked', async(() => { + const countElement = fixture.nativeElement.querySelector('strong'); + expect(countElement.textContent).toEqual('0'); + + const incrementButton = fixture.nativeElement.querySelector('button'); + incrementButton.click(); + fixture.detectChanges(); + expect(countElement.textContent).toEqual('1'); + })); +}); diff --git a/Tests/SignalR/ClientApp/src/app/counter/counter.component.ts b/Tests/SignalR/ClientApp/src/app/counter/counter.component.ts new file mode 100644 index 00000000..1f336aa9 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/counter/counter.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-counter-component', + templateUrl: './counter.component.html' +}) +export class CounterComponent { + public currentCount = 0; + + public incrementCounter() { + this.currentCount++; + } +} diff --git a/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.html b/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.html new file mode 100644 index 00000000..19b3835d --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.html @@ -0,0 +1,24 @@ +

Weather forecast

+ +

This component demonstrates fetching data from the server.

+ +

Loading...

+ + + + + + + + + + + + + + + + + + +
DateTemp. (C)Temp. (F)Summary
{{ forecast.date }}{{ forecast.temperatureC }}{{ forecast.temperatureF }}{{ forecast.summary }}
diff --git a/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.ts b/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.ts new file mode 100644 index 00000000..a5b14777 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/fetch-data/fetch-data.component.ts @@ -0,0 +1,23 @@ +import { Component, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-fetch-data', + templateUrl: './fetch-data.component.html' +}) +export class FetchDataComponent { + public forecasts: WeatherForecast[] = []; + + constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) { + http.get(baseUrl + 'weatherforecast').subscribe(result => { + this.forecasts = result; + }, error => console.error(error)); + } +} + +interface WeatherForecast { + date: string; + temperatureC: number; + temperatureF: number; + summary: string; +} diff --git a/Tests/SignalR/ClientApp/src/app/home/home.component.html b/Tests/SignalR/ClientApp/src/app/home/home.component.html new file mode 100644 index 00000000..f74c2e78 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/home/home.component.html @@ -0,0 +1,14 @@ +

Hello, world!

+

Welcome to your new single-page application, built with:

+ +

To help you get started, we've also set up:

+
    +
  • Client-side navigation. For example, click Counter then Back to return here.
  • +
  • Angular CLI integration. In development mode, there's no need to run ng serve. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.
  • +
  • Efficient production builds. In production mode, development-time features are disabled, and your dotnet publish configuration automatically invokes ng build to produce minified, ahead-of-time compiled JavaScript files.
  • +
+

The ClientApp subdirectory is a standard Angular CLI application. If you open a command prompt in that directory, you can run any ng command (e.g., ng test), or use npm to install extra packages into it.

diff --git a/Tests/SignalR/ClientApp/src/app/home/home.component.ts b/Tests/SignalR/ClientApp/src/app/home/home.component.ts new file mode 100644 index 00000000..2747b302 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/home/home.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { +} diff --git a/Tests/SignalR/ClientApp/src/app/models/connection-status.ts b/Tests/SignalR/ClientApp/src/app/models/connection-status.ts new file mode 100644 index 00000000..732941f1 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/models/connection-status.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +export enum ConnectionStatus { + connecting = 0, + connected = 1, + sleeping = 2, + disconnected = 3 +} + +export const ConnectionStatusValues = [0, 1, 2, 3]; +export const ConnectionStatusNames = ["connecting", "connected", "sleeping", "disconnected"]; +export const ConnectionStatusValueMapping: { [key: number]: string } = { 0: "connecting", 1: "connected", 2: "sleeping", 3: "disconnected" }; +export const ConnectionStatusNameMapping: { [key: string]: number } = { "connecting": 0, "connected": 1, "sleeping": 2, "disconnected": 3 }; + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/models/weather-forecast.ts b/Tests/SignalR/ClientApp/src/app/models/weather-forecast.ts new file mode 100644 index 00000000..c1c75b08 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/models/weather-forecast.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export class WeatherForecast { + public date?: Date = new Date(0); + public temperatureC?: number = 0; + public temperatureF?: number = 0; + public summary?: string | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/multiple/models-1/connection-status.ts b/Tests/SignalR/ClientApp/src/app/multiple/models-1/connection-status.ts new file mode 100644 index 00000000..732941f1 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/multiple/models-1/connection-status.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +export enum ConnectionStatus { + connecting = 0, + connected = 1, + sleeping = 2, + disconnected = 3 +} + +export const ConnectionStatusValues = [0, 1, 2, 3]; +export const ConnectionStatusNames = ["connecting", "connected", "sleeping", "disconnected"]; +export const ConnectionStatusValueMapping: { [key: number]: string } = { 0: "connecting", 1: "connected", 2: "sleeping", 3: "disconnected" }; +export const ConnectionStatusNameMapping: { [key: string]: number } = { "connecting": 0, "connected": 1, "sleeping": 2, "disconnected": 3 }; + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/multiple/models-2/connection-status.ts b/Tests/SignalR/ClientApp/src/app/multiple/models-2/connection-status.ts new file mode 100644 index 00000000..732941f1 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/multiple/models-2/connection-status.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +export enum ConnectionStatus { + connecting = 0, + connected = 1, + sleeping = 2, + disconnected = 3 +} + +export const ConnectionStatusValues = [0, 1, 2, 3]; +export const ConnectionStatusNames = ["connecting", "connected", "sleeping", "disconnected"]; +export const ConnectionStatusValueMapping: { [key: number]: string } = { 0: "connecting", 1: "connected", 2: "sleeping", 3: "disconnected" }; +export const ConnectionStatusNameMapping: { [key: string]: number } = { "connecting": 0, "connected": 1, "sleeping": 2, "disconnected": 3 }; + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/multiple/services-1/multiple-output-hub.service.ts b/Tests/SignalR/ClientApp/src/app/multiple/services-1/multiple-output-hub.service.ts new file mode 100644 index 00000000..021e8996 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/multiple/services-1/multiple-output-hub.service.ts @@ -0,0 +1,109 @@ +/* eslint-disable */ +// tslint:disable + +import { ConnectionStatus } from "../models-1/connection-status"; +import { Injectable } from "@angular/core"; +import { HubConnection } from "@microsoft/signalr"; +import { HubConnectionBuilder } from "@microsoft/signalr"; +import { IHttpConnectionOptions } from "@microsoft/signalr"; +import { LogLevel } from "@microsoft/signalr"; +import { Observable } from "rxjs"; +import { filter } from "rxjs/operators"; +import { map } from "rxjs/operators"; +import { mergeMap } from "rxjs/operators"; +import { take } from "rxjs/operators"; +import { ReplaySubject } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class MultipleOutputHubService { + private isClosed: boolean = true; + public serviceUrl: string = ""; + public options: IHttpConnectionOptions = { + }; + public logLevel: LogLevel = LogLevel.Error; + private connection?: ReplaySubject; + private readonly timeouts: number[] = [0, 0, 1000, 2000, 5000]; + private readonly statusSubject: ReplaySubject = new ReplaySubject(1); + public readonly status$: Observable = this.statusSubject.asObservable(); + private readonly test2Subject: Subject = new Subject(); + public readonly test2$: Observable = this.test2Subject.asObservable(); + + // Connects to the hub via given serviceUrl. + // Automatically reconnects on connection loss. + // If timeout is configured, goes to sleeping state and reconnects after the timeout + public connect(trial: number = 0): Observable { + if (! this.serviceUrl) { + throw new Error("serviceUrl can not be empty. Set it via service.serviceUrl.") + } + if (this.connection && ! this.isClosed) { + return this.status$.pipe(filter((status) => status === ConnectionStatus.connected), take(1), map(() => { + })); + } + this.isClosed = false; + this.connection = this.connection ? this.connection : new ReplaySubject(1); + let hubConnection: HubConnection = new HubConnectionBuilder().withUrl(this.serviceUrl, this.options).configureLogging(this.logLevel).build(); + let startConnection: () => Observable = () => { + this.statusSubject.next(ConnectionStatus.connecting); + let subject = new Subject(); + hubConnection.start().then(() => { + subject.next(); + subject.complete(); + this.statusSubject.next(ConnectionStatus.connected); + }).catch(() => { + if (this.isClosed) { + return; + } + this.statusSubject.next(ConnectionStatus.sleeping); + let timeout: number = this.timeouts[trial]; + trial++; + timeout = timeout || this.timeouts[this.timeouts.length - 1] || 0; + setTimeout(() => { + if (this.isClosed) { + return; + } + startConnection().subscribe(() => { + subject.next(); + subject.complete(); + }, (innerError) => subject.error(innerError)) + }, timeout); + }); + return subject; + }; + hubConnection.on("Test2", () => { + this.test2Subject.next(); + }); + hubConnection.onclose(() => { + if (! this.isClosed) { + startConnection(); + } + }); + this.connection.next(hubConnection); + return startConnection(); + } + + // Close an active connection to the hub. + // If the service is reconnecting/sleeping the connection attempt will be canceled + public disconnect(): void { + this.isClosed = true; + this.connection?.pipe(take(1)).subscribe((hubConnection) => { + hubConnection.stop().then(() => { + this.statusSubject.next(ConnectionStatus.disconnected); + }); + }); + } + + // Send a "Test" message to the hub with the given parameters. Automatically connects to the hub. + public test(): Observable { + let subject = new Subject(); + this.connect().pipe(mergeMap(() => this.connection), take(1), mergeMap((connection) => connection.send("Test"))).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } +} + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/multiple/services-2/index.ts b/Tests/SignalR/ClientApp/src/app/multiple/services-2/index.ts new file mode 100644 index 00000000..1915baf4 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/multiple/services-2/index.ts @@ -0,0 +1,3 @@ + +export * from "./multiple-output-hub.service"; + diff --git a/Tests/SignalR/ClientApp/src/app/multiple/services-2/multiple-output-hub.service.ts b/Tests/SignalR/ClientApp/src/app/multiple/services-2/multiple-output-hub.service.ts new file mode 100644 index 00000000..7cf7c88d --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/multiple/services-2/multiple-output-hub.service.ts @@ -0,0 +1,109 @@ +/* eslint-disable */ +// tslint:disable + +import { ConnectionStatus } from "../models-2/connection-status"; +import { Injectable } from "@angular/core"; +import { HubConnection } from "@microsoft/signalr"; +import { HubConnectionBuilder } from "@microsoft/signalr"; +import { IHttpConnectionOptions } from "@microsoft/signalr"; +import { LogLevel } from "@microsoft/signalr"; +import { Observable } from "rxjs"; +import { filter } from "rxjs/operators"; +import { map } from "rxjs/operators"; +import { mergeMap } from "rxjs/operators"; +import { take } from "rxjs/operators"; +import { ReplaySubject } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class MultipleOutputHubService { + private isClosed: boolean = true; + public serviceUrl: string = ""; + public options: IHttpConnectionOptions = { + }; + public logLevel: LogLevel = LogLevel.Error; + private connection?: ReplaySubject; + private readonly timeouts: number[] = [0, 0, 1000, 2000, 5000]; + private readonly statusSubject: ReplaySubject = new ReplaySubject(1); + public readonly status$: Observable = this.statusSubject.asObservable(); + private readonly test2Subject: Subject = new Subject(); + public readonly test2$: Observable = this.test2Subject.asObservable(); + + // Connects to the hub via given serviceUrl. + // Automatically reconnects on connection loss. + // If timeout is configured, goes to sleeping state and reconnects after the timeout + public connect(trial: number = 0): Observable { + if (! this.serviceUrl) { + throw new Error("serviceUrl can not be empty. Set it via service.serviceUrl.") + } + if (this.connection && ! this.isClosed) { + return this.status$.pipe(filter((status) => status === ConnectionStatus.connected), take(1), map(() => { + })); + } + this.isClosed = false; + this.connection = this.connection ? this.connection : new ReplaySubject(1); + let hubConnection: HubConnection = new HubConnectionBuilder().withUrl(this.serviceUrl, this.options).configureLogging(this.logLevel).build(); + let startConnection: () => Observable = () => { + this.statusSubject.next(ConnectionStatus.connecting); + let subject = new Subject(); + hubConnection.start().then(() => { + subject.next(); + subject.complete(); + this.statusSubject.next(ConnectionStatus.connected); + }).catch(() => { + if (this.isClosed) { + return; + } + this.statusSubject.next(ConnectionStatus.sleeping); + let timeout: number = this.timeouts[trial]; + trial++; + timeout = timeout || this.timeouts[this.timeouts.length - 1] || 0; + setTimeout(() => { + if (this.isClosed) { + return; + } + startConnection().subscribe(() => { + subject.next(); + subject.complete(); + }, (innerError) => subject.error(innerError)) + }, timeout); + }); + return subject; + }; + hubConnection.on("Test2", () => { + this.test2Subject.next(); + }); + hubConnection.onclose(() => { + if (! this.isClosed) { + startConnection(); + } + }); + this.connection.next(hubConnection); + return startConnection(); + } + + // Close an active connection to the hub. + // If the service is reconnecting/sleeping the connection attempt will be canceled + public disconnect(): void { + this.isClosed = true; + this.connection?.pipe(take(1)).subscribe((hubConnection) => { + hubConnection.stop().then(() => { + this.statusSubject.next(ConnectionStatus.disconnected); + }); + }); + } + + // Send a "Test" message to the hub with the given parameters. Automatically connects to the hub. + public test(): Observable { + let subject = new Subject(); + this.connect().pipe(mergeMap(() => this.connection), take(1), mergeMap((connection) => connection.send("Test"))).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } +} + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.css b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.css new file mode 100644 index 00000000..10389ef9 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.css @@ -0,0 +1,18 @@ +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} diff --git a/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.html b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.html new file mode 100644 index 00000000..cf12d54c --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.html @@ -0,0 +1,44 @@ +
+ +
diff --git a/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.ts b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.ts new file mode 100644 index 00000000..327a3743 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/nav-menu/nav-menu.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-nav-menu', + templateUrl: './nav-menu.component.html', + styleUrls: ['./nav-menu.component.css'] +}) +export class NavMenuComponent { + isExpanded = false; + + collapse() { + this.isExpanded = false; + } + + toggle() { + this.isExpanded = !this.isExpanded; + } +} diff --git a/Tests/SignalR/ClientApp/src/app/services/weather-forecast-hub.service.ts b/Tests/SignalR/ClientApp/src/app/services/weather-forecast-hub.service.ts new file mode 100644 index 00000000..998917df --- /dev/null +++ b/Tests/SignalR/ClientApp/src/app/services/weather-forecast-hub.service.ts @@ -0,0 +1,110 @@ +/* eslint-disable */ +// tslint:disable + +import { ConnectionStatus } from "../models/connection-status"; +import { WeatherForecast } from "../models/weather-forecast"; +import { Injectable } from "@angular/core"; +import { HubConnection } from "@microsoft/signalr"; +import { HubConnectionBuilder } from "@microsoft/signalr"; +import { IHttpConnectionOptions } from "@microsoft/signalr"; +import { LogLevel } from "@microsoft/signalr"; +import { Observable } from "rxjs"; +import { filter } from "rxjs/operators"; +import { map } from "rxjs/operators"; +import { mergeMap } from "rxjs/operators"; +import { take } from "rxjs/operators"; +import { ReplaySubject } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WeatherForecastHubService { + private isClosed: boolean = true; + public serviceUrl: string = ""; + public options: IHttpConnectionOptions = { + }; + public logLevel: LogLevel = LogLevel.Error; + private connection?: ReplaySubject; + private readonly timeouts: number[] = [0, 0, 1000, 2000, 5000]; + private readonly statusSubject: ReplaySubject = new ReplaySubject(1); + public readonly status$: Observable = this.statusSubject.asObservable(); + private readonly updatedSubject: Subject = new Subject(); + public readonly updated$: Observable = this.updatedSubject.asObservable(); + + // Connects to the hub via given serviceUrl. + // Automatically reconnects on connection loss. + // If timeout is configured, goes to sleeping state and reconnects after the timeout + public connect(trial: number = 0): Observable { + if (! this.serviceUrl) { + throw new Error("serviceUrl can not be empty. Set it via service.serviceUrl.") + } + if (this.connection && ! this.isClosed) { + return this.status$.pipe(filter((status) => status === ConnectionStatus.connected), take(1), map(() => { + })); + } + this.isClosed = false; + this.connection = this.connection ? this.connection : new ReplaySubject(1); + let hubConnection: HubConnection = new HubConnectionBuilder().withUrl(this.serviceUrl, this.options).configureLogging(this.logLevel).build(); + let startConnection: () => Observable = () => { + this.statusSubject.next(ConnectionStatus.connecting); + let subject = new Subject(); + hubConnection.start().then(() => { + subject.next(); + subject.complete(); + this.statusSubject.next(ConnectionStatus.connected); + }).catch(() => { + if (this.isClosed) { + return; + } + this.statusSubject.next(ConnectionStatus.sleeping); + let timeout: number = this.timeouts[trial]; + trial++; + timeout = timeout || this.timeouts[this.timeouts.length - 1] || 0; + setTimeout(() => { + if (this.isClosed) { + return; + } + startConnection().subscribe(() => { + subject.next(); + subject.complete(); + }, (innerError) => subject.error(innerError)) + }, timeout); + }); + return subject; + }; + hubConnection.on("Updated", (forecast: WeatherForecast[]) => { + this.updatedSubject.next(forecast); + }); + hubConnection.onclose(() => { + if (! this.isClosed) { + startConnection(); + } + }); + this.connection.next(hubConnection); + return startConnection(); + } + + // Close an active connection to the hub. + // If the service is reconnecting/sleeping the connection attempt will be canceled + public disconnect(): void { + this.isClosed = true; + this.connection?.pipe(take(1)).subscribe((hubConnection) => { + hubConnection.stop().then(() => { + this.statusSubject.next(ConnectionStatus.disconnected); + }); + }); + } + + // Send a "Fetch" message to the hub with the given parameters. Automatically connects to the hub. + public fetch(): Observable { + let subject = new Subject(); + this.connect().pipe(mergeMap(() => this.connection), take(1), mergeMap((connection) => connection.send("Fetch"))).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } +} + +// outputid:969bbdc9-df23-40ed-b6dd-702aa1fe7b03 diff --git a/Tests/SignalR/ClientApp/src/assets/.gitkeep b/Tests/SignalR/ClientApp/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Tests/SignalR/ClientApp/src/environments/environment.prod.ts b/Tests/SignalR/ClientApp/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/Tests/SignalR/ClientApp/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Tests/SignalR/ClientApp/src/environments/environment.ts b/Tests/SignalR/ClientApp/src/environments/environment.ts new file mode 100644 index 00000000..f56ff470 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/environments/environment.ts @@ -0,0 +1,16 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * For easier debugging in development mode, you can import the following file + * to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`. + * + * This import should be commented out in production mode because it will have a negative impact + * on performance if an error is thrown. + */ +// import 'zone.js/plugins/zone-error'; // Included with Angular CLI. diff --git a/Tests/SignalR/ClientApp/src/index.html b/Tests/SignalR/ClientApp/src/index.html new file mode 100644 index 00000000..bf0ced7c --- /dev/null +++ b/Tests/SignalR/ClientApp/src/index.html @@ -0,0 +1,14 @@ + + + + + Codestin Search App + + + + + + + Loading... + + diff --git a/Tests/SignalR/ClientApp/src/main.ts b/Tests/SignalR/ClientApp/src/main.ts new file mode 100644 index 00000000..a2f708cb --- /dev/null +++ b/Tests/SignalR/ClientApp/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +export function getBaseUrl() { + return document.getElementsByTagName('base')[0].href; +} + +const providers = [ + { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] } +]; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic(providers).bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/Tests/SignalR/ClientApp/src/polyfills.ts b/Tests/SignalR/ClientApp/src/polyfills.ts new file mode 100644 index 00000000..373f538a --- /dev/null +++ b/Tests/SignalR/ClientApp/src/polyfills.ts @@ -0,0 +1,65 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** + * IE11 requires the following for NgClass support on SVG elements + */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Tests/SignalR/ClientApp/src/styles.css b/Tests/SignalR/ClientApp/src/styles.css new file mode 100644 index 00000000..3ef6a649 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/styles.css @@ -0,0 +1,16 @@ +/* You can add global styles to this file, and also import other style files */ + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +code { + color: #e01a76; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} diff --git a/Tests/SignalR/ClientApp/src/test.ts b/Tests/SignalR/ClientApp/src/test.ts new file mode 100644 index 00000000..20423564 --- /dev/null +++ b/Tests/SignalR/ClientApp/src/test.ts @@ -0,0 +1,25 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require: { + context(path: string, deep?: boolean, filter?: RegExp): { + keys(): string[]; + (id: string): T; + }; +}; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Tests/SignalR/ClientApp/tsconfig.app.json b/Tests/SignalR/ClientApp/tsconfig.app.json new file mode 100644 index 00000000..82d91dc4 --- /dev/null +++ b/Tests/SignalR/ClientApp/tsconfig.app.json @@ -0,0 +1,15 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "files": [ + "src/main.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.d.ts" + ] +} diff --git a/Tests/SignalR/ClientApp/tsconfig.json b/Tests/SignalR/ClientApp/tsconfig.json new file mode 100644 index 00000000..03a93188 --- /dev/null +++ b/Tests/SignalR/ClientApp/tsconfig.json @@ -0,0 +1,29 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "outDir": "./dist/out-tsc", + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "sourceMap": true, + "declaration": false, + "downlevelIteration": true, + "experimentalDecorators": true, + "moduleResolution": "node", + "importHelpers": true, + "target": "es2017", + "module": "es2020", + "lib": [ + "es2018", + "dom" + ] + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + } +} diff --git a/Tests/SignalR/ClientApp/tsconfig.spec.json b/Tests/SignalR/ClientApp/tsconfig.spec.json new file mode 100644 index 00000000..1762d063 --- /dev/null +++ b/Tests/SignalR/ClientApp/tsconfig.spec.json @@ -0,0 +1,19 @@ +/* To learn more about this file see: https://angular.io/config/tsconfig. */ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "src/test.ts", + "src/polyfills.ts" + ], + "include": [ + "src/**/*.spec.ts", + "src/**/*.d.ts" + ] +} diff --git a/Tests/SignalR/Controllers/WeatherForecastController.cs b/Tests/SignalR/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..7e830151 --- /dev/null +++ b/Tests/SignalR/Controllers/WeatherForecastController.cs @@ -0,0 +1,24 @@ +using Microsoft.AspNetCore.Mvc; +using SignalR.Services; + +namespace SignalR.Controllers; + +[ApiController] +[Route("[controller]")] +public class WeatherForecastController : ControllerBase +{ + private readonly ILogger _logger; + private readonly WeatherForecastService forecastService; + + public WeatherForecastController(ILogger logger, WeatherForecastService forecastService) + { + _logger = logger; + this.forecastService = forecastService; + } + + [HttpGet] + public IEnumerable Get() + { + return this.forecastService.Get(); + } +} diff --git a/Tests/SignalR/Hubs/MultipleOutputHub.cs b/Tests/SignalR/Hubs/MultipleOutputHub.cs new file mode 100644 index 00000000..2a001005 --- /dev/null +++ b/Tests/SignalR/Hubs/MultipleOutputHub.cs @@ -0,0 +1,20 @@ +using KY.Generator; +using Microsoft.AspNetCore.SignalR; + +namespace SignalR.Hubs; + +public interface IMultipleOutputHub +{ + void Test2(); +} + +[GenerateAngularHub("\\ClientApp\\src\\app\\multiple\\services-1", "\\ClientApp\\src\\app\\multiple\\models-1")] +[GenerateAngularHub("\\ClientApp\\src\\app\\multiple\\services-2", "\\ClientApp\\src\\app\\multiple\\models-2")] +[GenerateWithRetry(true, 0, 0, 1000, 2000, 5000)] +public class MultipleOutputHub : Hub +{ + public void Test() + { + + } +} diff --git a/Tests/SignalR/Hubs/WeatherForecastHub.cs b/Tests/SignalR/Hubs/WeatherForecastHub.cs new file mode 100644 index 00000000..63511bf7 --- /dev/null +++ b/Tests/SignalR/Hubs/WeatherForecastHub.cs @@ -0,0 +1,34 @@ +using KY.Generator; +using Microsoft.AspNetCore.SignalR; +using SignalR.Services; + +namespace SignalR.Hubs; + +public interface IWeatherForecastHub +{ + Task Updated(IList forecast); +} + +[GenerateAngularHub("\\ClientApp\\src\\app\\services", "\\ClientApp\\src\\app\\models")] +[GenerateWithRetry(true, 0, 0, 1000, 2000, 5000)] +public class WeatherForecastHub : Hub +{ + private readonly WeatherForecastService service; + + public WeatherForecastHub(WeatherForecastService service) + { + this.service = service; + } + + public override async Task OnConnectedAsync() + { + await this.Clients.Caller.Updated(this.service.Get().ToList()); + await base.OnConnectedAsync(); + } + + public void Fetch() + { + this.service.Fetch(); + } + +} diff --git a/Tests/SignalR/Models/WeatherForecast.cs b/Tests/SignalR/Models/WeatherForecast.cs new file mode 100644 index 00000000..fa1c0865 --- /dev/null +++ b/Tests/SignalR/Models/WeatherForecast.cs @@ -0,0 +1,12 @@ +namespace SignalR; + +public class WeatherForecast +{ + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string? Summary { get; set; } +} \ No newline at end of file diff --git a/Tests/SignalR/Pages/Error.cshtml b/Tests/SignalR/Pages/Error.cshtml new file mode 100644 index 00000000..b5105b6d --- /dev/null +++ b/Tests/SignalR/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

\ No newline at end of file diff --git a/Tests/SignalR/Pages/Error.cshtml.cs b/Tests/SignalR/Pages/Error.cshtml.cs new file mode 100644 index 00000000..0c459e6c --- /dev/null +++ b/Tests/SignalR/Pages/Error.cshtml.cs @@ -0,0 +1,25 @@ +using System.Diagnostics; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; + +namespace SignalR.Pages; + +[ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] +public class ErrorModel : PageModel +{ + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public string? RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } +} \ No newline at end of file diff --git a/Tests/SignalR/Pages/_ViewImports.cshtml b/Tests/SignalR/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..0bb5702f --- /dev/null +++ b/Tests/SignalR/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using SignalR +@namespace SignalR.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Tests/SignalR/Program.cs b/Tests/SignalR/Program.cs new file mode 100644 index 00000000..75ca9567 --- /dev/null +++ b/Tests/SignalR/Program.cs @@ -0,0 +1,26 @@ +var builder = WebApplication.CreateBuilder(args); + +// Add services to the container. + +builder.Services.AddControllersWithViews(); + +var app = builder.Build(); + +// Configure the HTTP request pipeline. +if (!app.Environment.IsDevelopment()) +{ + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); +} + +app.UseHttpsRedirection(); +app.UseStaticFiles(); +app.UseRouting(); + +app.MapControllerRoute( + name: "default", + pattern: "{controller}/{action=Index}/{id?}"); + +app.MapFallbackToFile("index.html"); + +app.Run(); diff --git a/Tests/SignalR/Services/WeatherForecastService.cs b/Tests/SignalR/Services/WeatherForecastService.cs new file mode 100644 index 00000000..c4a2fcaa --- /dev/null +++ b/Tests/SignalR/Services/WeatherForecastService.cs @@ -0,0 +1,36 @@ +using Microsoft.AspNetCore.SignalR; +using SignalR.Hubs; + +namespace SignalR.Services +{ + public class WeatherForecastService + { + private readonly IHubContext hubContext; + private static readonly string[] summaries = { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; + private WeatherForecast[] forecast = Array.Empty(); + + public WeatherForecastService(IHubContext hubContext) + { + this.hubContext = hubContext; + this.Fetch(); + } + + public IEnumerable Get() + { + return this.forecast; + } + + public void Fetch() + { + Random random = new Random(); + this.forecast = Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = random.Next(-20, 55), + Summary = summaries[random.Next(summaries.Length)] + }) + .ToArray(); + this.hubContext.Clients.All.Updated(this.forecast); + } + } +} diff --git a/Tests/SignalR/SignalR.csproj b/Tests/SignalR/SignalR.csproj new file mode 100644 index 00000000..41e96bb4 --- /dev/null +++ b/Tests/SignalR/SignalR.csproj @@ -0,0 +1,52 @@ + + + + net6.0 + enable + false + ClientApp\ + https://localhost:44435 + npm start + enable + {969bbdc9-df23-40ed-b6dd-702aa1fe7b03} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + wwwroot\%(RecursiveDir)%(FileName)%(Extension) + PreserveNewest + true + + + + diff --git a/Tests/SignalR/appsettings.Development.json b/Tests/SignalR/appsettings.Development.json new file mode 100644 index 00000000..84308c97 --- /dev/null +++ b/Tests/SignalR/appsettings.Development.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.AspNetCore.SpaProxy": "Information", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Tests/SignalR/appsettings.json b/Tests/SignalR/appsettings.json new file mode 100644 index 00000000..ad75fee4 --- /dev/null +++ b/Tests/SignalR/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, +"AllowedHosts": "*" +} diff --git a/Tests/SignalR/wwwroot/favicon.ico b/Tests/SignalR/wwwroot/favicon.ico new file mode 100644 index 00000000..63e859b4 Binary files /dev/null and b/Tests/SignalR/wwwroot/favicon.ico differ diff --git a/Tests/Sqlite/AssemblyInfo.cs b/Tests/Sqlite/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/Sqlite/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/Sqlite/Output/ComplexRepository.cs b/Tests/Sqlite/Output/ComplexRepository.cs index 84bb6aa1..e5c047a0 100644 --- a/Tests/Sqlite/Output/ComplexRepository.cs +++ b/Tests/Sqlite/Output/ComplexRepository.cs @@ -1,12 +1,4 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated with KY.Generator 7.6.0.0 -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -// ------------------------------------------------------------------------------ -// ReSharper disable All +// ReSharper disable All using System; using System.CodeDom.Compiler; @@ -15,7 +7,7 @@ namespace Sqlite.Models { - [GeneratedCode("KY.Generator", "7.6.0.0")] + [GeneratedCode("KY.Generator", "9.0.0.0")] public partial class ComplexRepository { private SqliteConnection connection; diff --git a/Tests/Sqlite/Output/SimpleRepository.cs b/Tests/Sqlite/Output/SimpleRepository.cs index 894c362f..bad98fc2 100644 --- a/Tests/Sqlite/Output/SimpleRepository.cs +++ b/Tests/Sqlite/Output/SimpleRepository.cs @@ -1,12 +1,4 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated with KY.Generator 7.6.0.0 -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -// ------------------------------------------------------------------------------ -// ReSharper disable All +// ReSharper disable All using System; using System.CodeDom.Compiler; @@ -15,7 +7,7 @@ namespace Sqlite.Models { - [GeneratedCode("KY.Generator", "7.6.0.0")] + [GeneratedCode("KY.Generator", "9.0.0.0")] public partial class SimpleRepository { private SqliteConnection connection; diff --git a/Tests/Sqlite/Output/SimpleWithAutoincrementPrimaryRepository.cs b/Tests/Sqlite/Output/SimpleWithAutoincrementPrimaryRepository.cs index c7d97dc3..478af92c 100644 --- a/Tests/Sqlite/Output/SimpleWithAutoincrementPrimaryRepository.cs +++ b/Tests/Sqlite/Output/SimpleWithAutoincrementPrimaryRepository.cs @@ -1,12 +1,4 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated with KY.Generator 7.6.0.0 -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -// ------------------------------------------------------------------------------ -// ReSharper disable All +// ReSharper disable All using System; using System.CodeDom.Compiler; @@ -15,7 +7,7 @@ namespace Sqlite.Models { - [GeneratedCode("KY.Generator", "7.6.0.0")] + [GeneratedCode("KY.Generator", "9.0.0.0")] public partial class SimpleWithAutoincrementPrimaryRepository { private SqliteConnection connection; diff --git a/Tests/Sqlite/Output/SimpleWithPrimaryRepository.cs b/Tests/Sqlite/Output/SimpleWithPrimaryRepository.cs index 9190371f..89aa783c 100644 --- a/Tests/Sqlite/Output/SimpleWithPrimaryRepository.cs +++ b/Tests/Sqlite/Output/SimpleWithPrimaryRepository.cs @@ -1,12 +1,4 @@ -// ------------------------------------------------------------------------------ -// -// This code was generated with KY.Generator 7.6.0.0 -// -// Manual changes to this file may cause unexpected behavior in your application. -// Manual changes to this file will be overwritten if the code is regenerated. -// -// ------------------------------------------------------------------------------ -// ReSharper disable All +// ReSharper disable All using System; using System.CodeDom.Compiler; @@ -15,7 +7,7 @@ namespace Sqlite.Models { - [GeneratedCode("KY.Generator", "7.6.0.0")] + [GeneratedCode("KY.Generator", "9.0.0.0")] public partial class SimpleWithPrimaryRepository { private SqliteConnection connection; diff --git a/Tests/Sqlite/Sqlite.csproj b/Tests/Sqlite/Sqlite.csproj index 0ec9cdb8..5cc721e6 100644 --- a/Tests/Sqlite/Sqlite.csproj +++ b/Tests/Sqlite/Sqlite.csproj @@ -7,8 +7,8 @@ - - + + diff --git a/Tests/Types.sln b/Tests/Types.sln deleted file mode 100644 index bfd04727..00000000 --- a/Tests/Types.sln +++ /dev/null @@ -1,25 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio Version 16 -VisualStudioVersion = 16.0.30406.217 -MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Types", "Types\Types.csproj", "{85CABF07-67D9-4725-8DEA-CB274397F14D}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {85CABF07-67D9-4725-8DEA-CB274397F14D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {85CABF07-67D9-4725-8DEA-CB274397F14D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {85CABF07-67D9-4725-8DEA-CB274397F14D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {85CABF07-67D9-4725-8DEA-CB274397F14D}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {EBEB7990-1098-4BEE-8647-BC8BA813B004} - EndGlobalSection -EndGlobal diff --git a/Tests/Types/Types.csproj b/Tests/Types/Types.csproj deleted file mode 100644 index 2f577edf..00000000 --- a/Tests/Types/Types.csproj +++ /dev/null @@ -1,13 +0,0 @@ - - - - netstandard2.0 - {605e91d7-ee13-4f1d-9b92-845bb3ace852} - - - - - - - - diff --git a/Tests/UrlVersionedWebApiController/AssemblyInfo.cs b/Tests/UrlVersionedWebApiController/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/UrlVersionedWebApiController/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/UrlVersionedWebApiController/ClientApp/src/app/models/weather-forecast.ts b/Tests/UrlVersionedWebApiController/ClientApp/src/app/models/weather-forecast.ts index c078db3f..b2e55b3d 100644 --- a/Tests/UrlVersionedWebApiController/ClientApp/src/app/models/weather-forecast.ts +++ b/Tests/UrlVersionedWebApiController/ClientApp/src/app/models/weather-forecast.ts @@ -2,12 +2,12 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; - public constructor(init: Partial = undefined) { + public constructor(init?: Partial) { Object.assign(this, init); } } diff --git a/Tests/UrlVersionedWebApiController/ClientApp/src/app/services/weather-forecast.service.ts b/Tests/UrlVersionedWebApiController/ClientApp/src/app/services/weather-forecast.service.ts index c335c1f1..99284a40 100644 --- a/Tests/UrlVersionedWebApiController/ClientApp/src/app/services/weather-forecast.service.ts +++ b/Tests/UrlVersionedWebApiController/ClientApp/src/app/services/weather-forecast.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class WeatherForecastService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,24 +24,40 @@ export class WeatherForecastService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } - public get(httpOptions: {} = undefined): Observable { + public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/v1.0/weatherforecast", httpOptions).subscribe((result) => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/v1.0/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { if (result) { result.forEach((entry) => { entry.date = this.convertToDate(entry.date); }); } - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/UrlVersionedWebApiController/Controllers/WeatherForecastController.cs b/Tests/UrlVersionedWebApiController/Controllers/WeatherForecastController.cs index 659a6042..ce1dad35 100644 --- a/Tests/UrlVersionedWebApiController/Controllers/WeatherForecastController.cs +++ b/Tests/UrlVersionedWebApiController/Controllers/WeatherForecastController.cs @@ -12,7 +12,6 @@ namespace UrlVersionedWebApiController.Controllers [ApiVersion("1.0")] [Route("api/v{version:apiVersion}/[controller]")] [GenerateAngularService("ClientApp/src/app/services", "ClientApp/src/app/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class WeatherForecastController : ControllerBase { private static readonly string[] Summaries = new[] diff --git a/Tests/UrlVersionedWebApiController/UrlVersionedWebApiController.csproj b/Tests/UrlVersionedWebApiController/UrlVersionedWebApiController.csproj index e81d67fb..7177d4c4 100644 --- a/Tests/UrlVersionedWebApiController/UrlVersionedWebApiController.csproj +++ b/Tests/UrlVersionedWebApiController/UrlVersionedWebApiController.csproj @@ -14,8 +14,8 @@ - - + + diff --git a/Tests/WebApiController/AssemblyInfo.cs b/Tests/WebApiController/AssemblyInfo.cs new file mode 100644 index 00000000..4cc0bd5d --- /dev/null +++ b/Tests/WebApiController/AssemblyInfo.cs @@ -0,0 +1,3 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] diff --git a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/convert-me.ts b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/convert-me.ts index 6c8160e1..46c3ce53 100644 --- a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/convert-me.ts +++ b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/convert-me.ts @@ -2,7 +2,7 @@ // tslint:disable export interface ConvertMe { - stringProperty: string; + stringProperty?: string; } // outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/index.ts b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/index.ts new file mode 100644 index 00000000..d19bb038 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./convert-me"; +export * from "./convert-me-optional"; + diff --git a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface-optional.service.ts b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface-optional.service.ts index 789c61c3..13f2508a 100644 --- a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface-optional.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface-optional.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class ConvertToInterfaceOptionalService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,26 +24,54 @@ export class ConvertToInterfaceOptionalService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(subject: string, httpOptions?: {}): Observable { let rxjsSubject = new Subject(); - this.http.get(this.serviceUrl + "/converttointerfaceoptional/get" + "?subject=" + this.convertAny(subject), httpOptions).subscribe((result) => { - if (result) { - result.dateTimeProperty = this.convertToDate(result.dateTimeProperty); - } - rxjsSubject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/converttointerfaceoptional/get"; + url = this.append(url, subject, "subject"); + this.http.get(url, httpOptions).subscribe((result) => { + this.convertConvertMeOptionalDate(result); + rxjsSubject.next(this.fixUndefined(result)); rxjsSubject.complete(); }, (error) => rxjsSubject.error(error)); return rxjsSubject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertConvertMeOptionalDate(model: ConvertMeOptional): void { + if (!model) { + return; + } + model.dateTimeProperty = this.convertDate(model.dateTimeProperty); + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface.service.ts b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface.service.ts index 0bd4ce35..cfc9b7c8 100644 --- a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/convert-to-interface.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class ConvertToInterfaceService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,19 +24,42 @@ export class ConvertToInterfaceService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(subject: string, httpOptions?: {}): Observable { let rxjsSubject = new Subject(); - this.http.get(this.serviceUrl + "/converttointerface/get" + "?subject=" + this.convertAny(subject), httpOptions).subscribe((result) => { - rxjsSubject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/converttointerface/get"; + url = this.append(url, subject, "subject"); + this.http.get(url, httpOptions).subscribe((result) => { + rxjsSubject.next(this.fixUndefined(result)); rxjsSubject.complete(); }, (error) => rxjsSubject.error(error)); return rxjsSubject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/index.ts b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/index.ts new file mode 100644 index 00000000..929d9d4c --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/convert-to-interface/services/index.ts @@ -0,0 +1,4 @@ + +export * from "./convert-to-interface.service"; +export * from "./convert-to-interface-optional.service"; + diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-array-wrapper.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-array-wrapper.ts index 544a2d54..5eeed0fa 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-array-wrapper.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-array-wrapper.ts @@ -2,8 +2,8 @@ // tslint:disable export class DateArrayWrapper { - public id: string; - public dates: Date[]; + public id?: string; + public dates?: Date[]; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-array-wrapper.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-array-wrapper.ts index 4bb8724b..d8f8fa71 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-array-wrapper.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-array-wrapper.ts @@ -4,8 +4,8 @@ import { DateModel } from "./date-model"; export class DateModelArrayWrapper { - public id: string; - public models: DateModel[]; + public id?: string; + public models?: DateModel[]; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-list-wrapper.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-list-wrapper.ts index ef898176..d512dd74 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-list-wrapper.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-list-wrapper.ts @@ -4,7 +4,7 @@ import { DateModelWrapper } from "./date-model-wrapper"; export class DateModelWrapperListWrapper { - public list: DateModelWrapper[]; + public list?: DateModelWrapper[]; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-with-date.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-with-date.ts index 8c49e5e2..5b47c971 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-with-date.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper-with-date.ts @@ -4,9 +4,9 @@ import { DateModel } from "./date-model"; export class DateModelWrapperWithDate { - public id: string; - public date: Date; - public model: DateModel; + public id?: string; + public date?: Date; + public model?: DateModel; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper.ts index 9accd327..f16f254c 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-model-wrapper.ts @@ -4,8 +4,8 @@ import { DateModel } from "./date-model"; export class DateModelWrapper { - public id: string; - public model: DateModel; + public id?: string; + public model?: DateModel; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/date-model.ts b/Tests/WebApiController/ClientApp/src/app/date/models/date-model.ts index e74b9fb4..48482de1 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/date-model.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/date-model.ts @@ -2,8 +2,8 @@ // tslint:disable export class DateModel { - public id: string; - public date: Date; + public id?: string; + public date?: Date; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/generic-result.ts b/Tests/WebApiController/ClientApp/src/app/date/models/generic-result.ts index f1235edd..0ed18f76 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/models/generic-result.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/models/generic-result.ts @@ -2,7 +2,8 @@ // tslint:disable export class GenericResult { - public rows: T[]; + public rows?: T[]; + public strings?: string[]; public constructor(init?: Partial>) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/index.ts b/Tests/WebApiController/ClientApp/src/app/date/models/index.ts new file mode 100644 index 00000000..96d66208 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/date/models/index.ts @@ -0,0 +1,10 @@ + +export * from "./date-array-wrapper"; +export * from "./date-model"; +export * from "./date-model-array-wrapper"; +export * from "./date-model-wrapper"; +export * from "./date-model-wrapper-list-wrapper"; +export * from "./date-model-wrapper-with-date"; +export * from "./generic-result"; +export * from "./optional-properties-model"; + diff --git a/Tests/WebApiController/ClientApp/src/app/date/models/optional-properties-model.ts b/Tests/WebApiController/ClientApp/src/app/date/models/optional-properties-model.ts new file mode 100644 index 00000000..16e0ee2a --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/date/models/optional-properties-model.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +export class OptionalPropertiesModel { + public requiredString: string; + public requiredNotNullableString: string = ""; + public requiredInt: number; + public optionalString?: string; + public optionalInt?: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/date/services/date.service.ts b/Tests/WebApiController/ClientApp/src/app/date/services/date.service.ts index 106daab8..fb82a3af 100644 --- a/Tests/WebApiController/ClientApp/src/app/date/services/date.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/date/services/date.service.ts @@ -19,6 +19,7 @@ import { Subject } from "rxjs"; export class DateService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -29,12 +30,15 @@ export class DateService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/get", httpOptions).subscribe((result) => { - subject.next(this.convertToDate(result)); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/get"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(this.convertDate(result))); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -42,8 +46,10 @@ export class DateService { public getArray(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getarray", httpOptions).subscribe((result) => { - subject.next(result.map((entry) => this.convertToDate(entry))); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getarray"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result.map((entry) => this.convertDate(entry)))); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -51,8 +57,10 @@ export class DateService { public getList(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getlist", httpOptions).subscribe((result) => { - subject.next(result.map((entry) => this.convertToDate(entry))); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getlist"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result.map((entry) => this.convertDate(entry)))); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -60,8 +68,10 @@ export class DateService { public getEnumerable(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getenumerable", httpOptions).subscribe((result) => { - subject.next(result.map((entry) => this.convertToDate(entry))); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getenumerable"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result.map((entry) => this.convertDate(entry)))); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -69,11 +79,11 @@ export class DateService { public getComplex(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getcomplex", httpOptions).subscribe((result) => { - if (result) { - result.date = this.convertToDate(result.date); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getcomplex"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateModelDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -81,13 +91,11 @@ export class DateService { public getComplexArray(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getcomplexarray", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getcomplexarray"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertDateModelDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -95,13 +103,11 @@ export class DateService { public getComplexList(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getcomplexlist", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getcomplexlist"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertDateModelDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -109,13 +115,11 @@ export class DateService { public getComplexEnumerable(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getcomplexenumerable", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getcomplexenumerable"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertDateModelDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -123,8 +127,11 @@ export class DateService { public getWrappedArray(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedarray", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedarray"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateArrayWrapperDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -132,13 +139,11 @@ export class DateService { public getWrappedModel(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodel", httpOptions).subscribe((result) => { - if (result) { - if (result.model) { - result.model.date = this.convertToDate(result.model.date); - } - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodel"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateModelWrapperDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -146,15 +151,11 @@ export class DateService { public getWrappedModelList(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodellist", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - if (entry.model) { - entry.model.date = this.convertToDate(entry.model.date); - } - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodellist"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertDateModelWrapperDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -162,17 +163,11 @@ export class DateService { public getWrappedModelListWrapper(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodellistwrapper", httpOptions).subscribe((result) => { - if (result) { - if (result.list) { - result.list.forEach((entry) => { - if (entry.model) { - entry.model.date = this.convertToDate(entry.model.date); - } - }); - } - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodellistwrapper"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateModelWrapperListWrapperDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -180,19 +175,11 @@ export class DateService { public getWrappedModelListWrapperList(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodellistwrapperlist", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - if (entry.list) { - entry.list.forEach((entry) => { - if (entry.model) { - entry.model.date = this.convertToDate(entry.model.date); - } - }); - } - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodellistwrapperlist"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertDateModelWrapperListWrapperDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -200,14 +187,11 @@ export class DateService { public getWrappedModelWithDate(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodelwithdate", httpOptions).subscribe((result) => { - if (result) { - result.date = this.convertToDate(result.date); - if (result.model) { - result.model.date = this.convertToDate(result.model.date); - } - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodelwithdate"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateModelWrapperWithDateDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -215,15 +199,11 @@ export class DateService { public getWrappedModelArray(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/api/date/getwrappedmodelarray", httpOptions).subscribe((result) => { - if (result) { - if (result.models) { - result.models.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getwrappedmodelarray"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertDateModelArrayWrapperDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -231,15 +211,11 @@ export class DateService { public getGenericWithModel(httpOptions?: {}): Observable> { let subject = new Subject>(); - this.http.get>(this.serviceUrl + "/api/date/getgenericwithmodel", httpOptions).subscribe((result) => { - if (result) { - if (result.rows) { - result.rows.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/getgenericwithmodel"; + this.http.get>(url, httpOptions).subscribe((result) => { + this.convertGenericResultDate(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -247,19 +223,95 @@ export class DateService { public post(date: Date, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/api/date/post" + "?date=" + this.convertFromDate(date), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/date/post"; + url = this.appendDate(url, date, "date"); + this.http.post(url, undefined, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertFromDate(date: Date): string { - return date === null || date === undefined ? "" : typeof(date) === "string" ? date : date.toISOString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private appendDate(url: string, date: Date, parameterName: string = "", separator: string = ""): string { + return this.append(url, date === null || date === undefined ? "" : typeof(date) === "string" ? date : date.toISOString(), parameterName, separator); + } + + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertDateModelDate(model: DateModel): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); + } + + public convertDateArrayWrapperDate(model: DateArrayWrapper): void { + if (!model) { + return; + } + model.dates = model.dates.map((m) => this.convertDate(m)) + } + + public convertDateModelWrapperDate(model: DateModelWrapper): void { + if (!model) { + return; + } + this.convertDateModelDate(model.model) + } + + public convertDateModelWrapperListWrapperDate(model: DateModelWrapperListWrapper): void { + if (!model) { + return; + } + model.list.forEach((m) => this.convertDateModelWrapperDate(m)) + } + + public convertDateModelWrapperWithDateDate(model: DateModelWrapperWithDate): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); + this.convertDateModelDate(model.model) + } + + public convertDateModelArrayWrapperDate(model: DateModelArrayWrapper): void { + if (!model) { + return; + } + model.models.forEach((m) => this.convertDateModelDate(m)) + } + + public convertGenericResultDate(model: GenericResult): void { + if (!model) { + return; + } + model.rows.forEach((m) => this.convertDateModelDate(m)) + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/date/services/index.ts b/Tests/WebApiController/ClientApp/src/app/date/services/index.ts new file mode 100644 index 00000000..599b0911 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/date/services/index.ts @@ -0,0 +1,4 @@ + +export * from "./date.service"; +export * from "./optional-property.service"; + diff --git a/Tests/WebApiController/ClientApp/src/app/date/services/optional-property.service.ts b/Tests/WebApiController/ClientApp/src/app/date/services/optional-property.service.ts new file mode 100644 index 00000000..4084d482 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/date/services/optional-property.service.ts @@ -0,0 +1,55 @@ +/* eslint-disable */ +// tslint:disable + +import { OptionalPropertiesModel } from "../models/optional-properties-model"; +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class OptionalPropertyService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + public httpOptions: {} = {}; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public getOptionalPropertiesModel(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/optionalproperty/getoptionalpropertiesmodel"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/derived/services/derived.service.ts b/Tests/WebApiController/ClientApp/src/app/derived/services/derived.service.ts index 47786f9c..319514a1 100644 --- a/Tests/WebApiController/ClientApp/src/app/derived/services/derived.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/derived/services/derived.service.ts @@ -12,6 +12,7 @@ import { Subject } from "rxjs"; export class DerivedService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -22,11 +23,14 @@ export class DerivedService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/derived/get", httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/derived/get"; + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -35,7 +39,9 @@ export class DerivedService { public overwritten(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/derived/overwritten", httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/derived/overwritten"; + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -44,7 +50,9 @@ export class DerivedService { public getBase(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/derived/getbase", httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/derived/getbase"; + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -53,12 +61,27 @@ export class DerivedService { public notOverwritten(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/derived/notoverwritten", httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/derived/notoverwritten"; + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } } // outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/duplicate-name/services/duplicate-name.service.ts b/Tests/WebApiController/ClientApp/src/app/duplicate-name/services/duplicate-name.service.ts index 7ab439b3..9c2b8f77 100644 --- a/Tests/WebApiController/ClientApp/src/app/duplicate-name/services/duplicate-name.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/duplicate-name/services/duplicate-name.service.ts @@ -12,6 +12,7 @@ import { Subject } from "rxjs"; export class DuplicateNameService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -22,11 +23,15 @@ export class DuplicateNameService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public testA(id: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/duplicatename/" + id, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/duplicatename"; + url = this.append(url, id, undefined, "/"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -35,7 +40,11 @@ export class DuplicateNameService { public testAById(id: number, variantA: string, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/duplicatename/" + id + "/" + variantA, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/duplicatename"; + url = this.append(url, id, undefined, "/"); + url = this.append(url, variantA, undefined, "/"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -44,7 +53,12 @@ export class DuplicateNameService { public testAByIdAndVariantA(id: number, variantA: string, variantB: string, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/duplicatename/" + id + "/" + variantA + "/" + variantB, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/duplicatename"; + url = this.append(url, id, undefined, "/"); + url = this.append(url, variantA, undefined, "/"); + url = this.append(url, variantB, undefined, "/"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -53,9 +67,11 @@ export class DuplicateNameService { public testB(id: number, httpOptions?: {}): Observable { let subject = new Subject(); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/duplicatename/testb" + "?id=" + this.convertAny(id), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/duplicatename/testb"; + url = this.append(url, id, "id"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -63,16 +79,37 @@ export class DuplicateNameService { public testBById(id: string, httpOptions?: {}): Observable { let subject = new Subject(); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/duplicatename" + "?id=" + this.convertAny(id), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/duplicatename"; + url = this.append(url, id, "id"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/components/edge-cases.component.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/components/edge-cases.component.ts index 36af1d78..ff86e07b 100644 --- a/Tests/WebApiController/ClientApp/src/app/edge-cases/components/edge-cases.component.ts +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/components/edge-cases.component.ts @@ -1,5 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { EdgeCasesService } from '../services/edge-cases.service'; +import { HttpHeaders } from '@angular/common/http'; @Component({ selector: 'app-edge-cases', @@ -19,7 +20,9 @@ export class EdgeCasesComponent implements OnInit { ) { } ngOnInit() { - + this.service.httpOptions = { + headers: new HttpHeaders({'X-Test': 'Test'}) + } } public withDi(): void { diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/models/date-model.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/date-model.ts new file mode 100644 index 00000000..48482de1 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/date-model.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class DateModel { + public id?: string; + public date?: Date; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/models/generic-result.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/generic-result.ts index f1235edd..0ed18f76 100644 --- a/Tests/WebApiController/ClientApp/src/app/edge-cases/models/generic-result.ts +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/generic-result.ts @@ -2,7 +2,8 @@ // tslint:disable export class GenericResult { - public rows: T[]; + public rows?: T[]; + public strings?: string[]; public constructor(init?: Partial>) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/models/index.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/index.ts new file mode 100644 index 00000000..b044e265 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/index.ts @@ -0,0 +1,6 @@ + +export * from "./date-model"; +export * from "./exclusive-generic-complex-result"; +export * from "./generic-result"; +export * from "./self-referencing-model"; + diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/models/self-referencing-model.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/self-referencing-model.ts new file mode 100644 index 00000000..d492b42d --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/models/self-referencing-model.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class SelfReferencingModel { + public name?: string; + public children?: SelfReferencingModel[]; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/edge-cases/services/edge-cases.service.ts b/Tests/WebApiController/ClientApp/src/app/edge-cases/services/edge-cases.service.ts index 5d55caae..a26db3a7 100644 --- a/Tests/WebApiController/ClientApp/src/app/edge-cases/services/edge-cases.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/edge-cases/services/edge-cases.service.ts @@ -1,8 +1,10 @@ /* eslint-disable */ // tslint:disable +import { DateModel } from "../models/date-model"; import { ExclusiveGenericComplexResult } from "../models/exclusive-generic-complex-result"; import { GenericResult } from "../models/generic-result"; +import { SelfReferencingModel } from "../models/self-referencing-model"; import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import { Observable } from "rxjs"; @@ -14,6 +16,7 @@ import { Subject } from "rxjs"; export class EdgeCasesService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -24,11 +27,15 @@ export class EdgeCasesService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(subject: string, httpOptions?: {}): Observable { let rxjsSubject = new Subject(); - this.http.get(this.serviceUrl + "/edgecases/get" + "?subject=" + this.convertAny(subject), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/get"; + url = this.append(url, subject, "subject"); + this.http.get(url, httpOptions).subscribe(() => { rxjsSubject.next(); rxjsSubject.complete(); }, (error) => rxjsSubject.error(error)); @@ -37,7 +44,10 @@ export class EdgeCasesService { public post(subject: string, httpOptions?: {}): Observable { let rxjsSubject = new Subject(); - this.http.post(this.serviceUrl + "/edgecases/post" + "?subject=" + this.convertAny(subject), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/post"; + url = this.append(url, subject, "subject"); + this.http.post(url, undefined, httpOptions).subscribe(() => { rxjsSubject.next(); rxjsSubject.complete(); }, (error) => rxjsSubject.error(error)); @@ -46,8 +56,11 @@ export class EdgeCasesService { public cancelable(subject: string, httpOptions?: {}): Observable { let rxjsSubject = new Subject(); - this.http.get(this.serviceUrl + "/edgecases/cancelable" + "?subject=" + this.convertAny(subject), httpOptions).subscribe((result) => { - rxjsSubject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/cancelable"; + url = this.append(url, subject, "subject"); + this.http.get(url, httpOptions).subscribe((result) => { + rxjsSubject.next(this.fixUndefined(result)); rxjsSubject.complete(); }, (error) => rxjsSubject.error(error)); return rxjsSubject; @@ -55,9 +68,10 @@ export class EdgeCasesService { public string(httpOptions?: {}): Observable { let subject = new Subject(); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/edgecases/string", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/string"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -65,8 +79,10 @@ export class EdgeCasesService { public getGuid(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/edgecases/getguid", httpOptions).subscribe((result) => { - subject.next(result.replace(/(^"|"$)/g, "")); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/getguid"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result?.replace(/(^"|"$)/g, ""))); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -74,8 +90,11 @@ export class EdgeCasesService { public withDI(value: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/edgecases/withdi" + "?value=" + this.convertAny(value), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/withdi"; + url = this.append(url, value, "value"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -83,9 +102,11 @@ export class EdgeCasesService { public fromHeader(value?: number, httpOptions?: {}): Observable { let subject = new Subject(); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/edgecases/fromheader" + "?value=" + this.convertAny(value), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/fromheader"; + url = this.append(url, value, "value"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -93,9 +114,12 @@ export class EdgeCasesService { public fromQuery(queryValue?: string, value?: number, httpOptions?: {}): Observable { let subject = new Subject(); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/edgecases/fromquery" + "?queryValue=" + this.convertAny(queryValue) + "&value=" + this.convertAny(value), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/fromquery"; + url = this.append(url, queryValue, "queryValue"); + url = this.append(url, value, "value"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -103,10 +127,11 @@ export class EdgeCasesService { public fromQueryArray(queryArray: string[], httpOptions?: {}): Observable { let subject = new Subject(); - let queryArrayJoin: string = queryArray.map((x, index) => index ? "queryArray=" + this.convertAny(x) : this.convertAny(x)).join("&"); - httpOptions = { responseType: 'text', ...httpOptions}; - this.http.get(this.serviceUrl + "/edgecases/fromqueryarray" + "?queryArray=" + this.convertAny(queryArrayJoin), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/fromqueryarray"; + queryArray.forEach((entry) => url = this.append(url, entry, "queryArray")); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -114,8 +139,12 @@ export class EdgeCasesService { public genericResult(value1: string, value2: string, httpOptions?: {}): Observable> { let subject = new Subject>(); - this.http.get>(this.serviceUrl + "/edgecases/genericresult" + "?value1=" + this.convertAny(value1) + "&value2=" + this.convertAny(value2), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/genericresult"; + url = this.append(url, value1, "value1"); + url = this.append(url, value2, "value2"); + this.http.get>(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -123,8 +152,86 @@ export class EdgeCasesService { public genericComplexResult(httpOptions?: {}): Observable> { let subject = new Subject>(); - this.http.get>(this.serviceUrl + "/edgecases/genericcomplexresult", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/genericcomplexresult"; + this.http.get>(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getGenericWithModel(httpOptions?: {}): Observable> { + let subject = new Subject>(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/getgenericwithmodel"; + this.http.get>(url, httpOptions).subscribe((result) => { + this.convertGenericResultDate(result); + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getWithOptional(required: number, optional?: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/getwithoptional"; + url = this.append(url, required, "required"); + url = this.append(url, optional, "optional"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getInlineWithOptional(required: number, optional?: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/getinlinewithoptional"; + url = this.append(url, required, undefined, "/"); + url = this.append(url, optional, undefined, "/"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getNamedInlineWithOptional(required: number, optional?: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/getnamedinlinewithoptional/required"; + url = this.append(url, required, undefined, "/"); + url += "/optional"; + url = this.append(url, optional, undefined, "/"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getWithAbsoluteRoute(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/test/edgecases/getwithabsoluteroute"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getWithAbsoluteRouteAndParameter(id: number, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/test"; + url = this.append(url, id, undefined, "/"); + url += "/getwithabsoluterouteandparameter/edgecases"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -132,15 +239,74 @@ export class EdgeCasesService { public unknownResult(value: string, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/edgecases/unknownresult" + "?value=" + this.convertAny(value), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/unknownresult"; + url = this.append(url, value, "value"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public selfReferencing(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/edgecases/selfreferencing"; + this.http.get(url, httpOptions).subscribe((result) => { + this.convertSelfReferencingModelDate(result); + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertGenericResultDate(model: GenericResult): void { + if (!model) { + return; + } + model.rows.forEach((m) => this.convertDateModelDate(m)) + } + + public convertDateModelDate(model: DateModel): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); + } + + public convertSelfReferencingModelDate(model: SelfReferencingModel): void { + if (!model) { + return; + } + model.children.forEach((m) => this.convertSelfReferencingModelDate(m)) + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-model.ts b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-model.ts index 1c24dcd8..72af48ab 100644 --- a/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-model.ts +++ b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-model.ts @@ -2,12 +2,12 @@ // tslint:disable export class CasingModel { - public alllower: string; - public allupper: string; - public pascalCase: string; - public camelCase: string; - public snakeCase: string; - public upperSnakeCase: string; + public alllower?: string; + public allupper?: string; + public pascalCase?: string; + public camelCase?: string; + public snakeCase?: string; + public upperSnakeCase?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-with-mapping-model.ts b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-with-mapping-model.ts index 05640f61..ec67c47d 100644 --- a/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-with-mapping-model.ts +++ b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/casing-with-mapping-model.ts @@ -2,12 +2,12 @@ // tslint:disable export class CasingWithMappingModel { - public alllower: string; - public allupper: string; - public pascalCase: string; - public camelCase: string; - public snakeCase: string; - public upperSnakeCase: string; + public alllower?: string; + public allupper?: string; + public pascalCase?: string; + public camelCase?: string; + public snakeCase?: string; + public upperSnakeCase?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/fix-casing/models/index.ts b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/index.ts new file mode 100644 index 00000000..f14c9a62 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/fix-casing/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./casing-model"; +export * from "./casing-with-mapping-model"; + diff --git a/Tests/WebApiController/ClientApp/src/app/fix-casing/services/fix-casing.service.ts b/Tests/WebApiController/ClientApp/src/app/fix-casing/services/fix-casing.service.ts index f5f5e0ac..1404409e 100644 --- a/Tests/WebApiController/ClientApp/src/app/fix-casing/services/fix-casing.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/fix-casing/services/fix-casing.service.ts @@ -14,6 +14,7 @@ import { Subject } from "rxjs"; export class FixCasingService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -24,12 +25,15 @@ export class FixCasingService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/fixcasing/get", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/fixcasing/get"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -37,7 +41,9 @@ export class FixCasingService { public post(model: CasingModel, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/fixcasing/post", model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/fixcasing/post"; + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -46,7 +52,9 @@ export class FixCasingService { public getWithMapping(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/fixcasing/getwithmapping", httpOptions).subscribe((result) => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/fixcasing/getwithmapping"; + this.http.get(url, httpOptions).subscribe((result) => { result.allupper = result.allupper || result["ALLUPPER"]; delete result['ALLUPPER']; result.pascalCase = result.pascalCase || result["PascalCase"]; @@ -55,7 +63,7 @@ export class FixCasingService { delete result['snake_case']; result.upperSnakeCase = result.upperSnakeCase || result["UPPER_SNAKE_CASE"]; delete result['UPPER_SNAKE_CASE']; - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -63,7 +71,9 @@ export class FixCasingService { public getArrayWithMapping(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/fixcasing/getarraywithmapping", httpOptions).subscribe((result) => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/fixcasing/getarraywithmapping"; + this.http.get(url, httpOptions).subscribe((result) => { if (result) { result.forEach((entry) => { entry.allupper = entry.allupper || entry["ALLUPPER"]; @@ -76,7 +86,7 @@ export class FixCasingService { delete entry['UPPER_SNAKE_CASE']; }) } - subject.next(result); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -84,12 +94,27 @@ export class FixCasingService { public postWithMapping(model: CasingWithMappingModel, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/fixcasing/postwithmapping", model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/fixcasing/postwithmapping"; + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } } // outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model-service.ts b/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model-service.ts index 3f9092cb..6c7d344d 100644 --- a/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model-service.ts +++ b/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model-service.ts @@ -2,7 +2,7 @@ // tslint:disable export class GetComplexModelService { - public property: string; + public property?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model.ts b/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model.ts index 94515b31..ebaa8d05 100644 --- a/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model.ts +++ b/Tests/WebApiController/ClientApp/src/app/get-complex/models/get-complex-model.ts @@ -4,9 +4,9 @@ import { GetComplexModelService } from "./get-complex-model-service"; export class GetComplexModel { - public property: string; - public service: GetComplexModelService; - public services: GetComplexModelService[]; + public property?: string; + public service?: GetComplexModelService; + public services?: GetComplexModelService[]; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/get-complex/models/index.ts b/Tests/WebApiController/ClientApp/src/app/get-complex/models/index.ts new file mode 100644 index 00000000..ca6461f1 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/get-complex/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./get-complex-model"; +export * from "./get-complex-model-service"; + diff --git a/Tests/WebApiController/ClientApp/src/app/get-complex/services/get-complex.service.ts b/Tests/WebApiController/ClientApp/src/app/get-complex/services/get-complex.service.ts index 7298dc7b..72a426ba 100644 --- a/Tests/WebApiController/ClientApp/src/app/get-complex/services/get-complex.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/get-complex/services/get-complex.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class GetComplexService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,16 +24,32 @@ export class GetComplexService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/getcomplex/get", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/getcomplex/get"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } } // outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/http-types/services/http-types.service.ts b/Tests/WebApiController/ClientApp/src/app/http-types/services/http-types.service.ts new file mode 100644 index 00000000..05b96ab9 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/http-types/services/http-types.service.ts @@ -0,0 +1,98 @@ +/* eslint-disable */ +// tslint:disable + +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class HttpTypesService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + public httpOptions: {} = {}; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public get(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/httptypes"; + this.http.get(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public post(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/httptypes"; + this.http.post(url, undefined, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public patch(test: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/httptypes"; + this.http.patch(url, test, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public put(test: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/httptypes"; + this.http.put(url, test, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public delete(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/httptypes"; + this.http.delete(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/invalid-words/services/invalid-words.service.ts b/Tests/WebApiController/ClientApp/src/app/invalid-words/services/invalid-words.service.ts new file mode 100644 index 00000000..85a5ab99 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/invalid-words/services/invalid-words.service.ts @@ -0,0 +1,123 @@ +/* eslint-disable */ +// tslint:disable + +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class InvalidWordsService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + public httpOptions: {} = {}; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public switch(switchValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + url = this.append(url, switchValue, "switch"); + this.http.get(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public getCase(caseValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + url = this.append(url, caseValue, "case"); + this.http.get(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public postCase(caseValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + url = this.append(url, caseValue, "case"); + this.http.post(url, undefined, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public patchCase(caseValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + this.http.patch(url, caseValue, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public putCase(caseValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + this.http.put(url, caseValue, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public deleteCase(caseValue: string, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/invalidwords"; + url = this.append(url, caseValue, "case"); + this.http.delete(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/keep-casing/keep-casing.component.ts b/Tests/WebApiController/ClientApp/src/app/keep-casing/keep-casing.component.ts index 7c95370f..7e3c11d4 100644 --- a/Tests/WebApiController/ClientApp/src/app/keep-casing/keep-casing.component.ts +++ b/Tests/WebApiController/ClientApp/src/app/keep-casing/keep-casing.component.ts @@ -1,5 +1,5 @@ import { Component, OnInit } from '@angular/core'; -import { CasingModel } from './models/casing-model'; +import { KeepCasingModel } from './models/keep-casing-model'; import { KeepCasingService } from './services/keep-casing.service'; @Component({ @@ -8,7 +8,7 @@ import { KeepCasingService } from './services/keep-casing.service'; styleUrls: ['./keep-casing.component.css'] }) export class KeepCasingComponent implements OnInit { - public model: CasingModel; + public model: KeepCasingModel; constructor( private readonly service: KeepCasingService diff --git a/Tests/WebApiController/ClientApp/src/app/keep-casing/models/casing-model.ts b/Tests/WebApiController/ClientApp/src/app/keep-casing/models/casing-model.ts deleted file mode 100644 index b4b2dc6a..00000000 --- a/Tests/WebApiController/ClientApp/src/app/keep-casing/models/casing-model.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* eslint-disable */ -// tslint:disable - -export class CasingModel { - public alllower: string; - public ALLUPPER: string; - public PascalCase: string; - public camelCase: string; - public snake_case: string; - public UPPER_SNAKE_CASE: string; - - public constructor(init?: Partial) { - Object.assign(this, init); - } -} - -// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/keep-casing/models/keep-casing-model.ts b/Tests/WebApiController/ClientApp/src/app/keep-casing/models/keep-casing-model.ts new file mode 100644 index 00000000..c9baec20 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/keep-casing/models/keep-casing-model.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// tslint:disable + +export class KeepCasingModel { + public alllower?: string; + public ALLUPPER?: string; + public PascalCase?: string; + public camelCase?: string; + public snake_case?: string; + public UPPER_SNAKE_CASE?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/keep-casing/services/keep-casing.service.ts b/Tests/WebApiController/ClientApp/src/app/keep-casing/services/keep-casing.service.ts index 865c4d71..d6c1dd04 100644 --- a/Tests/WebApiController/ClientApp/src/app/keep-casing/services/keep-casing.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/keep-casing/services/keep-casing.service.ts @@ -1,7 +1,7 @@ /* eslint-disable */ // tslint:disable -import { CasingModel } from "../models/casing-model"; +import { KeepCasingModel } from "../models/keep-casing-model"; import { HttpClient } from "@angular/common/http"; import { Injectable } from "@angular/core"; import { Observable } from "rxjs"; @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class KeepCasingService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,25 +24,43 @@ export class KeepCasingService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } - public get(httpOptions?: {}): Observable { - let subject = new Subject(); - this.http.get(this.serviceUrl + "/keepcasing", httpOptions).subscribe((result) => { - subject.next(result); + public get(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/keepcasing"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public post(model: CasingModel, httpOptions?: {}): Observable { + public post(model: KeepCasingModel, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/keepcasing", model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/keepcasing"; + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } } // outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/parameter-on-controller/services/parameter-on.service.ts b/Tests/WebApiController/ClientApp/src/app/parameter-on-controller/services/parameter-on.service.ts index 7998d87f..08c4de48 100644 --- a/Tests/WebApiController/ClientApp/src/app/parameter-on-controller/services/parameter-on.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/parameter-on-controller/services/parameter-on.service.ts @@ -12,6 +12,7 @@ import { Subject } from "rxjs"; export class ParameterOnService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -22,19 +23,44 @@ export class ParameterOnService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(test: string, id: string, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/parameteron/" + id + "/get" + "?test=" + this.convertAny(test), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/parameteron"; + url = this.append(url, id, undefined, "/"); + url += "/get"; + url = this.append(url, test, "test"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/post/models/post-model.ts b/Tests/WebApiController/ClientApp/src/app/post/models/post-model.ts index 71bb3962..0f635616 100644 --- a/Tests/WebApiController/ClientApp/src/app/post/models/post-model.ts +++ b/Tests/WebApiController/ClientApp/src/app/post/models/post-model.ts @@ -2,7 +2,7 @@ // tslint:disable export class PostModel { - public value: string; + public value?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/post/services/post.service.ts b/Tests/WebApiController/ClientApp/src/app/post/services/post.service.ts index b3c75222..d150df52 100644 --- a/Tests/WebApiController/ClientApp/src/app/post/services/post.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/post/services/post.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class PostService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,11 +24,14 @@ export class PostService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public postWithoutParameter(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithoutparameter", httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithoutparameter"; + this.http.post(url, undefined, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -36,7 +40,10 @@ export class PostService { public postWithOneParameter(test: string, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithoneparameter" + "?test=" + this.convertAny(test), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithoneparameter"; + url = this.append(url, test, "test"); + this.http.post(url, undefined, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -45,7 +52,11 @@ export class PostService { public postWithTwoParameter(text: string, count: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithtwoparameter" + "?text=" + this.convertAny(text) + "&count=" + this.convertAny(count), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithtwoparameter"; + url = this.append(url, text, "text"); + url = this.append(url, count, "count"); + this.http.post(url, undefined, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -54,7 +65,9 @@ export class PostService { public postWithBodyParameter(model: PostModel, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithbodyparameter", model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithbodyparameter"; + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -63,7 +76,10 @@ export class PostService { public postWithValueAndBodyParameter(id: number, model: PostModel, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithvalueandbodyparameter" + "?id=" + this.convertAny(id), model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithvalueandbodyparameter"; + url = this.append(url, id, "id"); + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -72,15 +88,37 @@ export class PostService { public postWithValueAndBodyParameterFlipped(model: PostModel, id: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/post/postwithvalueandbodyparameterflipped" + "?id=" + this.convertAny(id), model, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/post/postwithvalueandbodyparameterflipped"; + url = this.append(url, id, "id"); + this.http.post(url, model, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/produces/models/weather-forecast.ts b/Tests/WebApiController/ClientApp/src/app/produces/models/weather-forecast.ts index 3d5e78fb..5c0a0191 100644 --- a/Tests/WebApiController/ClientApp/src/app/produces/models/weather-forecast.ts +++ b/Tests/WebApiController/ClientApp/src/app/produces/models/weather-forecast.ts @@ -2,10 +2,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/produces/services/produces.service.ts b/Tests/WebApiController/ClientApp/src/app/produces/services/produces.service.ts index a3087bd8..6c2224b5 100644 --- a/Tests/WebApiController/ClientApp/src/app/produces/services/produces.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/produces/services/produces.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class ProducesService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,17 +24,17 @@ export class ProducesService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/produces" + "?days=" + this.convertAny(days), httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/produces"; + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -41,24 +42,49 @@ export class ProducesService { public get2(days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/produces/get2" + "?days=" + this.convertAny(days), httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/produces/get2"; + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertWeatherForecastDate(model: WeatherForecast): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/rename/models/index.ts b/Tests/WebApiController/ClientApp/src/app/rename/models/index.ts new file mode 100644 index 00000000..3fc0f476 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/rename/models/index.ts @@ -0,0 +1,4 @@ + +export * from "./data"; +export * from "./rename-model"; + diff --git a/Tests/WebApiController/ClientApp/src/app/rename/services/rename.service.ts b/Tests/WebApiController/ClientApp/src/app/rename/services/rename.service.ts index c78f9cd0..b9dd156d 100644 --- a/Tests/WebApiController/ClientApp/src/app/rename/services/rename.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/rename/services/rename.service.ts @@ -14,6 +14,7 @@ import { Subject } from "rxjs"; export class RenameService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -24,12 +25,16 @@ export class RenameService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public renameDtoToModel(id: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/rename" + "?id=" + this.convertAny(id), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/rename"; + url = this.append(url, id, "id"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -37,15 +42,37 @@ export class RenameService { public removeDummy(id: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/rename" + "?id=" + this.convertAny(id), httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/rename"; + url = this.append(url, id, "id"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/routed/models/weather-forecast.ts b/Tests/WebApiController/ClientApp/src/app/routed/models/weather-forecast.ts index 3d5e78fb..5c0a0191 100644 --- a/Tests/WebApiController/ClientApp/src/app/routed/models/weather-forecast.ts +++ b/Tests/WebApiController/ClientApp/src/app/routed/models/weather-forecast.ts @@ -2,10 +2,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/routed/services/routed.service.ts b/Tests/WebApiController/ClientApp/src/app/routed/services/routed.service.ts index 285203aa..0da4e601 100644 --- a/Tests/WebApiController/ClientApp/src/app/routed/services/routed.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/routed/services/routed.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class RoutedService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,17 +24,16 @@ export class RoutedService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -41,13 +41,11 @@ export class RoutedService { public getThree(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/three", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/three"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -55,13 +53,11 @@ export class RoutedService { public getThreeDays(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/three/days", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/three/days"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -69,13 +65,13 @@ export class RoutedService { public getNext(days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/next/" + days + "/days", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/next"; + url = this.append(url, days, undefined, "/"); + url += "/days"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -83,7 +79,12 @@ export class RoutedService { public test(test: number, days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/next/" + days + "/days/" + test, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/next"; + url = this.append(url, days, undefined, "/"); + url += "/days"; + url = this.append(url, test, undefined, "/"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -92,7 +93,11 @@ export class RoutedService { public test2(test: number, days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test2" + "?test=" + this.convertAny(test) + "&days=" + this.convertAny(days), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test2"; + url = this.append(url, test, "test"); + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -101,7 +106,11 @@ export class RoutedService { public test3(test: number, days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test3/" + test + "?days=" + this.convertAny(days), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test3"; + url = this.append(url, test, undefined, "/"); + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -110,7 +119,11 @@ export class RoutedService { public test4(days: number, test: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test4/" + test + "?days=" + this.convertAny(days), httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test4"; + url = this.append(url, test, undefined, "/"); + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -119,7 +132,10 @@ export class RoutedService { public getTest5(test: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test5/" + test, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test5"; + url = this.append(url, test, undefined, "/"); + this.http.get(url, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -128,7 +144,10 @@ export class RoutedService { public postTest5(test: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.post(this.serviceUrl + "/routed/test5/" + test, httpOptions).subscribe(() => { + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test5"; + url = this.append(url, test, undefined, "/"); + this.http.post(url, undefined, httpOptions).subscribe(() => { subject.next(); subject.complete(); }, (error) => subject.error(error)); @@ -137,8 +156,11 @@ export class RoutedService { public test6(test: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test6/" + test, httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test6"; + url = this.append(url, test, undefined, "/"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -146,8 +168,11 @@ export class RoutedService { public test7(test: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test7/" + test, httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test7"; + url = this.append(url, test, undefined, "/"); + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -155,8 +180,10 @@ export class RoutedService { public test8(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test8", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test8"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -164,8 +191,10 @@ export class RoutedService { public test9(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test9", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test9"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -173,8 +202,10 @@ export class RoutedService { public test10(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test10", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test10"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -182,8 +213,10 @@ export class RoutedService { public test11(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test11", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test11"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -191,8 +224,10 @@ export class RoutedService { public test12(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test12", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test12"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -200,19 +235,47 @@ export class RoutedService { public test13(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/routed/test13", httpOptions).subscribe((result) => { - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/routed/test13"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertWeatherForecastDate(model: WeatherForecast): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/versioned-api/models/weather-forecast.ts b/Tests/WebApiController/ClientApp/src/app/versioned-api/models/weather-forecast.ts index 3d5e78fb..5c0a0191 100644 --- a/Tests/WebApiController/ClientApp/src/app/versioned-api/models/weather-forecast.ts +++ b/Tests/WebApiController/ClientApp/src/app/versioned-api/models/weather-forecast.ts @@ -2,10 +2,10 @@ // tslint:disable export class WeatherForecast { - public date: Date; - public temperatureC: number; - public temperatureF: number; - public summary: string; + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; public constructor(init?: Partial) { Object.assign(this, init); diff --git a/Tests/WebApiController/ClientApp/src/app/versioned-api/services/versioned-api.service.ts b/Tests/WebApiController/ClientApp/src/app/versioned-api/services/versioned-api.service.ts index a58e740b..f0674341 100644 --- a/Tests/WebApiController/ClientApp/src/app/versioned-api/services/versioned-api.service.ts +++ b/Tests/WebApiController/ClientApp/src/app/versioned-api/services/versioned-api.service.ts @@ -13,6 +13,7 @@ import { Subject } from "rxjs"; export class VersionedApiService { private readonly http: HttpClient; private serviceUrlValue: string = ""; + public httpOptions: {} = {}; public get serviceUrl(): string { return this.serviceUrlValue; @@ -23,17 +24,16 @@ export class VersionedApiService { public constructor(http: HttpClient) { this.http = http; + this.serviceUrl = document.baseURI ?? ""; } public get(httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/versionedapi" + "?api-version=1.0", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/versionedapi"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -41,13 +41,13 @@ export class VersionedApiService { public getNext(days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/versionedapi/next/" + days + "/days" + "?api-version=1.0", httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/versionedapi/next"; + url = this.append(url, days, undefined, "/"); + url += "/days"; + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; @@ -55,24 +55,60 @@ export class VersionedApiService { public getNext2(days: number, httpOptions?: {}): Observable { let subject = new Subject(); - this.http.get(this.serviceUrl + "/versionedapi/next-days" + "?api-version=2.0" + "&days=" + this.convertAny(days), httpOptions).subscribe((result) => { - if (result) { - result.forEach((entry) => { - entry.date = this.convertToDate(entry.date); - }); - } - subject.next(result); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/versionedapi/next-days"; + url = this.append(url, days, "days"); + this.http.get(url, httpOptions).subscribe((result) => { + result.forEach((m) => this.convertWeatherForecastDate(m)); + subject.next(this.fixUndefined(result)); subject.complete(); }, (error) => subject.error(error)); return subject; } - public convertAny(value: any): string { - return value === null || value === undefined ? "" : value.toString(); + public getWithAbsoluteRoute(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { responseType: 'text', ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/test/versionedapi/getwithabsoluteroute"; + this.http.get(url, httpOptions).subscribe((result) => { + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private convertDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + public convertWeatherForecastDate(model: WeatherForecast): void { + if (!model) { + return; + } + model.date = this.convertDate(model.date); } - public convertToDate(value: string | Date): Date { - return typeof(value) === "string" ? new Date(value) : value; + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; } } diff --git a/Tests/WebApiController/ClientApp/src/app/warnings/models/weather-forecast.ts b/Tests/WebApiController/ClientApp/src/app/warnings/models/weather-forecast.ts new file mode 100644 index 00000000..5c0a0191 --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/warnings/models/weather-forecast.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export class WeatherForecast { + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/ClientApp/src/app/warnings/services/warning.service.ts b/Tests/WebApiController/ClientApp/src/app/warnings/services/warning.service.ts new file mode 100644 index 00000000..ffdfbecb --- /dev/null +++ b/Tests/WebApiController/ClientApp/src/app/warnings/services/warning.service.ts @@ -0,0 +1,111 @@ +/* eslint-disable */ +// tslint:disable + +import { WeatherForecast } from "../models/weather-forecast"; +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WarningService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + public httpOptions: {} = {}; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public getWithBody(model: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/warning"; + url = this.append(url, model, "model"); + this.http.get(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public postWithBody(model: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/warning"; + this.http.post(url, model, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public patchWithBody(model: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/warning"; + this.http.patch(url, model, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public putWithBody(model: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/warning"; + this.http.put(url, model, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public deleteWithBody(model: WeatherForecast, httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/api/warning"; + url = this.append(url, model, "model"); + this.http.delete(url, httpOptions).subscribe(() => { + subject.next(); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + public append(url: string, value: {toString(): string} | undefined | null, parameterName: string = "", separator: string = ""): string { + if (! parameterName) { + return url + separator + (value === null || value === undefined ? "" : value.toString()); + } + if (value !== null && value !== undefined) { + return url + (url.indexOf("?") === -1 ? "?" : "&") + parameterName + "=" + value.toString(); + } + return url; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:627408ca-a818-4326-b843-415f5bbfb028 diff --git a/Tests/WebApiController/Controllers/ConvertToInterfaceController.cs b/Tests/WebApiController/Controllers/ConvertToInterfaceController.cs index 2846f012..9986adf4 100644 --- a/Tests/WebApiController/Controllers/ConvertToInterfaceController.cs +++ b/Tests/WebApiController/Controllers/ConvertToInterfaceController.cs @@ -7,7 +7,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/convert-to-interface/services", "ClientApp/src/app/convert-to-interface/models")] - [GenerateOption(GenerateOption.SkipHeader)] [GeneratePreferInterfaces] public class ConvertToInterfaceController : ControllerBase { @@ -21,7 +20,6 @@ public ConvertMe Get(string subject) [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/convert-to-interface/services", "ClientApp/src/app/convert-to-interface/models")] - [GenerateOption(GenerateOption.SkipHeader)] [GeneratePreferInterfaces] [GenerateWithOptionalProperties] public class ConvertToInterfaceOptionalController : ControllerBase diff --git a/Tests/WebApiController/Controllers/DateController.cs b/Tests/WebApiController/Controllers/DateController.cs index 77e18c89..b0b30f93 100644 --- a/Tests/WebApiController/Controllers/DateController.cs +++ b/Tests/WebApiController/Controllers/DateController.cs @@ -9,7 +9,6 @@ namespace WebApiController.Controllers [ApiController] [Route("api/[controller]")] [GenerateAngularService("ClientApp/src/app/date/services", "ClientApp/src/app/date/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class DateController : ControllerBase { [HttpGet("[action]")] diff --git a/Tests/WebApiController/Controllers/DerivedController.cs b/Tests/WebApiController/Controllers/DerivedController.cs index 61100b29..b20b25a7 100644 --- a/Tests/WebApiController/Controllers/DerivedController.cs +++ b/Tests/WebApiController/Controllers/DerivedController.cs @@ -6,7 +6,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/derived/services", "ClientApp/src/app/derived/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class DerivedController : DerivableController { [HttpGet("[action]")] diff --git a/Tests/WebApiController/Controllers/DuplicateNameController.cs b/Tests/WebApiController/Controllers/DuplicateNameController.cs index 6f571f9a..f7d3f7ef 100644 --- a/Tests/WebApiController/Controllers/DuplicateNameController.cs +++ b/Tests/WebApiController/Controllers/DuplicateNameController.cs @@ -6,7 +6,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/duplicate-name/services", "ClientApp/src/app/duplicate-name/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class DuplicateNameController : ControllerBase { [HttpGet("{id}")] diff --git a/Tests/WebApiController/Controllers/EdgeCasesController.cs b/Tests/WebApiController/Controllers/EdgeCasesController.cs index 85d8fb65..f9d75161 100644 --- a/Tests/WebApiController/Controllers/EdgeCasesController.cs +++ b/Tests/WebApiController/Controllers/EdgeCasesController.cs @@ -9,9 +9,8 @@ namespace WebApiController.Controllers { [ApiController] - [Route("[controller]")] + [Route("/api/[controller]")] [GenerateAngularService("ClientApp/src/app/edge-cases/services", "ClientApp/src/app/edge-cases/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class EdgeCasesController : ControllerBase { [HttpGet("[action]")] @@ -77,11 +76,53 @@ public GenericResult GenericComplexResult() return new GenericResult(new List { new ExclusiveGenericComplexResult() }); } + [HttpGet("[action]")] + public GenericResult GetGenericWithModel() + { + return new GenericResult(new List { new DateModel() }); + } + + [HttpGet("[action]")] + public string GetWithOptional(int required, string optional = null) + { + return required + " " + (optional ?? "null"); + } + + [HttpGet("[action]/{required}/{optional?}")] + public string GetInlineWithOptional(int required, string optional = null) + { + return required + " " + (optional ?? "null"); + } + + [HttpGet("[action]/required/{required}/optional/{optional?}")] + public string GetNamedInlineWithOptional(int required, string optional = null) + { + return required + " " + (optional ?? "null"); + } + + [HttpGet("/api/test/[controller]/[action]")] + public string GetWithAbsoluteRoute() + { + return "works"; + } + + [HttpGet("/api/test/{id}/[action]/[controller]")] + public string GetWithAbsoluteRouteAndParameter(int id) + { + return "works " + id; + } + [HttpGet("[action]")] public object UnknownResult(string value) { return new UnknownResult(value); } + + [HttpGet("[action]")] + public SelfReferencingModel SelfReferencing() + { + return new SelfReferencingModel(); + } } public class ExclusiveGenericComplexResult diff --git a/Tests/WebApiController/Controllers/FixCasingController.cs b/Tests/WebApiController/Controllers/FixCasingController.cs index 0ee4d723..20b0a89d 100644 --- a/Tests/WebApiController/Controllers/FixCasingController.cs +++ b/Tests/WebApiController/Controllers/FixCasingController.cs @@ -19,7 +19,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/fix-casing/services", "ClientApp/src/app/fix-casing/models")] - [GenerateOption(GenerateOption.SkipHeader)] [FixCasingController] public class FixCasingController : ControllerBase { diff --git a/Tests/WebApiController/Controllers/GetComplexController.cs b/Tests/WebApiController/Controllers/GetComplexController.cs index ea2bf12f..b8bdff04 100644 --- a/Tests/WebApiController/Controllers/GetComplexController.cs +++ b/Tests/WebApiController/Controllers/GetComplexController.cs @@ -7,7 +7,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/get-complex/services", "ClientApp/src/app/get-complex/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class GetComplexController { [HttpGet("[action]")] @@ -34,4 +33,4 @@ public GetComplexModel Get() }; } } -} \ No newline at end of file +} diff --git a/Tests/WebApiController/Controllers/HttpTypesController.cs b/Tests/WebApiController/Controllers/HttpTypesController.cs new file mode 100644 index 00000000..42baa3bd --- /dev/null +++ b/Tests/WebApiController/Controllers/HttpTypesController.cs @@ -0,0 +1,32 @@ +using KY.Generator; +using Microsoft.AspNetCore.Mvc; +using WebApiController.Models; + +namespace WebApiController.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [GenerateAngularService("ClientApp/src/app/http-types/services", "ClientApp/src/app/http-types/models")] + public class HttpTypesController : ControllerBase + { + [HttpGet] + public void Get() + { } + + [HttpPost] + public void Post() + { } + + [HttpPatch] + public void Patch(string test) + { } + + [HttpPut] + public void Put(string test) + { } + + [HttpDelete] + public void Delete() + { } + } +} diff --git a/Tests/WebApiController/Controllers/InvalidWordsController.cs b/Tests/WebApiController/Controllers/InvalidWordsController.cs new file mode 100644 index 00000000..65adb0a2 --- /dev/null +++ b/Tests/WebApiController/Controllers/InvalidWordsController.cs @@ -0,0 +1,21 @@ +using KY.Generator; +using Microsoft.AspNetCore.Mvc; +using WebApiController.Models; + +namespace WebApiController.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [GenerateAngularService("ClientApp/src/app/invalid-words/services", "ClientApp/src/app/invalid-words/models")] + public class InvalidWordsController : ControllerBase + { + [HttpGet] + public void Switch(string @switch) + { } + + [HttpGet, HttpPost, HttpPatch, HttpPut, HttpDelete] + public void Case(string @case) + { } + } + +} diff --git a/Tests/WebApiController/Controllers/KeepCasingController.cs b/Tests/WebApiController/Controllers/KeepCasingController.cs index 21302e1a..d2260c84 100644 --- a/Tests/WebApiController/Controllers/KeepCasingController.cs +++ b/Tests/WebApiController/Controllers/KeepCasingController.cs @@ -6,19 +6,18 @@ namespace WebApiController.Controllers { [ApiController] [Route("[controller]")] - [GenerateAngularService("ClientApp/src/app/keep-casing/services", "ClientApp/src/app/keep-casing/models", formatModelNames: Option.No)] - [GenerateOption(GenerateOption.SkipHeader)] + [GenerateAngularService("ClientApp/src/app/keep-casing/services", "ClientApp/src/app/keep-casing/models")] public class KeepCasingController : ControllerBase { [HttpGet] - public CasingModel Get() + public KeepCasingModel Get() { - return new CasingModel(); + return new KeepCasingModel(); } [HttpPost] - public void Post(CasingModel model) + public void Post(KeepCasingModel model) { } } -} \ No newline at end of file +} diff --git a/Tests/WebApiController/Controllers/OptionalPropertyController.cs b/Tests/WebApiController/Controllers/OptionalPropertyController.cs new file mode 100644 index 00000000..def28fff --- /dev/null +++ b/Tests/WebApiController/Controllers/OptionalPropertyController.cs @@ -0,0 +1,18 @@ +using KY.Generator; +using Microsoft.AspNetCore.Mvc; +using WebApiController.Models; + +namespace WebApiController.Controllers +{ + [ApiController] + [Route("api/[controller]")] + [GenerateAngularService("ClientApp/src/app/date/services", "ClientApp/src/app/date/models")] + public class OptionalPropertyController : ControllerBase + { + [HttpGet("[action]")] + public OptionalPropertiesModel GetOptionalPropertiesModel() + { + return new OptionalPropertiesModel(); + } + } +} diff --git a/Tests/WebApiController/Controllers/ParameterOnController.cs b/Tests/WebApiController/Controllers/ParameterOnController.cs index 77121fbc..1ba07396 100644 --- a/Tests/WebApiController/Controllers/ParameterOnController.cs +++ b/Tests/WebApiController/Controllers/ParameterOnController.cs @@ -5,7 +5,6 @@ namespace WebApiController.Controllers { [Route("[controller]/{id}")] [GenerateAngularService("ClientApp/src/app/parameter-on-controller/services", "ClientApp/src/app/parameter-on-controller/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class ParameterOnController : ControllerBase { [HttpGet("[action]")] diff --git a/Tests/WebApiController/Controllers/PostController.cs b/Tests/WebApiController/Controllers/PostController.cs index 6cca29a5..79520f34 100644 --- a/Tests/WebApiController/Controllers/PostController.cs +++ b/Tests/WebApiController/Controllers/PostController.cs @@ -7,7 +7,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/post/services", "ClientApp/src/app/post/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class PostController : ControllerBase { [HttpPost("[action]")] @@ -34,4 +33,4 @@ public void PostWithValueAndBodyParameter(int id, [FromBody] PostModel model) public void PostWithValueAndBodyParameterFlipped([FromBody] PostModel model, int id) { } } -} \ No newline at end of file +} diff --git a/Tests/WebApiController/Controllers/ProducesController.cs b/Tests/WebApiController/Controllers/ProducesController.cs index fa7b2014..0921d40e 100644 --- a/Tests/WebApiController/Controllers/ProducesController.cs +++ b/Tests/WebApiController/Controllers/ProducesController.cs @@ -11,7 +11,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/produces/services", "ClientApp/src/app/produces/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class ProducesController : ControllerBase { private static readonly string[] summaries = { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; diff --git a/Tests/WebApiController/Controllers/RenameController.cs b/Tests/WebApiController/Controllers/RenameController.cs index a0394ca3..7bdbb4a7 100644 --- a/Tests/WebApiController/Controllers/RenameController.cs +++ b/Tests/WebApiController/Controllers/RenameController.cs @@ -7,7 +7,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/rename/services", "ClientApp/src/app/rename/models")] - [GenerateOption(GenerateOption.SkipHeader)] [GenerateRename("Dto", "Model")] [GenerateRename("Dummy")] public class RenameController : ControllerBase diff --git a/Tests/WebApiController/Controllers/RoutedController.cs b/Tests/WebApiController/Controllers/RoutedController.cs index 26ff7ffc..0655a79d 100644 --- a/Tests/WebApiController/Controllers/RoutedController.cs +++ b/Tests/WebApiController/Controllers/RoutedController.cs @@ -10,7 +10,6 @@ namespace WebApiController.Controllers [ApiController] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/routed/services", "ClientApp/src/app/routed/models")] - [GenerateOption(GenerateOption.SkipHeader)] [GenerateIgnoreGeneric(typeof(IgnoreMe2<>))] public class RoutedController : ControllerBase { @@ -18,7 +17,7 @@ public class RoutedController : ControllerBase { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; - + [HttpGet] public IEnumerable Get() { @@ -139,4 +138,4 @@ public IgnoreMe> Test13() return new IgnoreMe>(new List()); } } -} \ No newline at end of file +} diff --git a/Tests/WebApiController/Controllers/VersionedApiController.cs b/Tests/WebApiController/Controllers/VersionedApiController.cs index 374e7634..6010f382 100644 --- a/Tests/WebApiController/Controllers/VersionedApiController.cs +++ b/Tests/WebApiController/Controllers/VersionedApiController.cs @@ -8,10 +8,9 @@ namespace WebApiController.Controllers { [ApiController] - [ApiVersion("1.0")] + // [ApiVersion("1.0")] [Route("[controller]")] [GenerateAngularService("ClientApp/src/app/versioned-api/services", "ClientApp/src/app/versioned-api/models")] - [GenerateOption(GenerateOption.SkipHeader)] public class VersionedApiController : ControllerBase { private static readonly string[] summaries = { "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" }; @@ -28,13 +27,20 @@ public IEnumerable GetNext(int days) return this.Random(days); } - [ApiVersion("2.0")] + // [ApiVersion("2.0")] [HttpGet("next-days")] public IEnumerable GetNext2(int days) { return this.Random(days); } + // [HttpGet("/api/v{version:apiVersion}/test/[controller]/[action]")] + [HttpGet("/api/test/[controller]/[action]")] + public string GetWithAbsoluteRoute() + { + return "works"; + } + private IEnumerable Random(int days) { var rng = new Random(); diff --git a/Tests/WebApiController/Controllers/WarningController.cs b/Tests/WebApiController/Controllers/WarningController.cs new file mode 100644 index 00000000..21356ab6 --- /dev/null +++ b/Tests/WebApiController/Controllers/WarningController.cs @@ -0,0 +1,16 @@ +using KY.Generator; +using Microsoft.AspNetCore.Mvc; +using WebApiController.Models; + +namespace WebApiController.Controllers +{ + [ApiController] + [Route("/api/[controller]")] + [GenerateAngularService("ClientApp/src/app/warnings/services", "ClientApp/src/app/warnings/models")] + public class WarningController : ControllerBase + { + [HttpGet, HttpPost, HttpPatch, HttpPut, HttpDelete] + public void WithBody([FromBody] WeatherForecast model) + { } + } +} diff --git a/Tests/WebApiController/Models/GenericResult.cs b/Tests/WebApiController/Models/GenericResult.cs index 5c07c840..9f924320 100644 --- a/Tests/WebApiController/Models/GenericResult.cs +++ b/Tests/WebApiController/Models/GenericResult.cs @@ -5,6 +5,7 @@ namespace WebApiController.Models public class GenericResult { public IEnumerable Rows { get; } + public List Strings { get; set; } public GenericResult(IEnumerable rows) { diff --git a/Tests/WebApiController/Models/KeepCasingModel.cs b/Tests/WebApiController/Models/KeepCasingModel.cs new file mode 100644 index 00000000..ee66ba5c --- /dev/null +++ b/Tests/WebApiController/Models/KeepCasingModel.cs @@ -0,0 +1,25 @@ +using KY.Generator; + +namespace WebApiController.Models +{ + [GenerateFormatNames(false)] + public class KeepCasingModel + { + public string alllower { get; set; } + public string ALLUPPER { get; set; } + public string PascalCase { get; set; } + public string camelCase { get; set; } + public string snake_case { get; set; } + public string UPPER_SNAKE_CASE { get; set; } + + public KeepCasingModel() + { + this.alllower = KY.Core.Random2.NextString(); + this.ALLUPPER = KY.Core.Random2.NextString(); + this.PascalCase = KY.Core.Random2.NextString(); + this.camelCase = KY.Core.Random2.NextString(); + this.snake_case = KY.Core.Random2.NextString(); + this.UPPER_SNAKE_CASE = KY.Core.Random2.NextString(); + } + } +} diff --git a/Tests/WebApiController/Models/OptionalPropertiesModel.cs b/Tests/WebApiController/Models/OptionalPropertiesModel.cs new file mode 100644 index 00000000..ef4da4cc --- /dev/null +++ b/Tests/WebApiController/Models/OptionalPropertiesModel.cs @@ -0,0 +1,21 @@ +using System.ComponentModel; +using System.ComponentModel.DataAnnotations; +using System.Diagnostics.CodeAnalysis; + +namespace WebApiController.Models +{ + public class OptionalPropertiesModel + { + [Required] + public string RequiredString { get; set; } + + [Required, DefaultValue("")] + public string RequiredNotNullableString { get; set; } + + [Required] + public int RequiredInt { get; set; } + + public string OptionalString { get; set; } + public int OptionalInt { get; set; } + } +} diff --git a/Tests/WebApiController/Models/SelfReferencingModel.cs b/Tests/WebApiController/Models/SelfReferencingModel.cs new file mode 100644 index 00000000..d25819ac --- /dev/null +++ b/Tests/WebApiController/Models/SelfReferencingModel.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace WebApiController.Models +{ + public class SelfReferencingModel + { + public string Name { get; set; } + public List Children { get; } = new List(); + } +} diff --git a/Tests/WebApiController/WebApiController.csproj b/Tests/WebApiController/WebApiController.csproj index 81929fce..bbfef378 100644 --- a/Tests/WebApiController/WebApiController.csproj +++ b/Tests/WebApiController/WebApiController.csproj @@ -15,8 +15,8 @@ - - + + diff --git a/Tests/WebApiFluent.Generator/GeneratorMain.cs b/Tests/WebApiFluent.Generator/GeneratorMain.cs new file mode 100644 index 00000000..fb1dbb0f --- /dev/null +++ b/Tests/WebApiFluent.Generator/GeneratorMain.cs @@ -0,0 +1,19 @@ +using KY.Generator; +using WebApiFluent.Controllers; + +namespace WebApiFluent.Generator +{ + public class GeneratorMain : GeneratorFluentMain + { + public override void Execute() + { + this.Read(read => read.AspDotNet(asp => asp.FromController())) + .Write(write => write.Angular(angular => angular.Services(config => config.OutputPath("../WebApiFluent/ClientApp/src/app/services").NoHeader()) + .Models(config => config.OutputPath("../WebApiFluent/ClientApp/src/app/models").NoHeader()) + ) + .Formatter("\"$output../WebApiFluent/ClientApp/node_modules/.bin/prettier\" --write \"$file\"") + .ForceOverwrite() + ); + } + } +} diff --git a/Tests/WebApiFluent.Generator/WebApiFluent.Generator.csproj b/Tests/WebApiFluent.Generator/WebApiFluent.Generator.csproj new file mode 100644 index 00000000..7222b5f2 --- /dev/null +++ b/Tests/WebApiFluent.Generator/WebApiFluent.Generator.csproj @@ -0,0 +1,18 @@ + + + + net5.0 + {7d7037b1-21de-4798-a761-dcb57d990403} + + + + + + + + + + + + + diff --git a/Tests/WebApiFluent.sln b/Tests/WebApiFluent.sln new file mode 100644 index 00000000..bb7a0267 --- /dev/null +++ b/Tests/WebApiFluent.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiFluent", "WebApiFluent\WebApiFluent.csproj", "{1CC1F243-A9A6-4A2D-A723-D4603E1B4D58}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "WebApiFluent.Generator", "WebApiFluent.Generator\WebApiFluent.Generator.csproj", "{669ECAFD-74B0-43C0-8196-4965CD0625FC}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1CC1F243-A9A6-4A2D-A723-D4603E1B4D58}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CC1F243-A9A6-4A2D-A723-D4603E1B4D58}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CC1F243-A9A6-4A2D-A723-D4603E1B4D58}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CC1F243-A9A6-4A2D-A723-D4603E1B4D58}.Release|Any CPU.Build.0 = Release|Any CPU + {669ECAFD-74B0-43C0-8196-4965CD0625FC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {669ECAFD-74B0-43C0-8196-4965CD0625FC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {669ECAFD-74B0-43C0-8196-4965CD0625FC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {669ECAFD-74B0-43C0-8196-4965CD0625FC}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/WebApiFluent/.gitignore b/Tests/WebApiFluent/.gitignore new file mode 100644 index 00000000..41ffa34d --- /dev/null +++ b/Tests/WebApiFluent/.gitignore @@ -0,0 +1,231 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. + +# User-specific files +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +build/ +bld/ +bin/ +Bin/ +obj/ +Obj/ + +# Visual Studio 2015 cache/options directory +.vs/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +*_i.c +*_p.c +*_i.h +*.ilk +*.meta +*.obj +*.pch +*.pdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# TODO: Comment the next line if you want to checkin your web deploy settings +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/packages/* +# except build/, which is used as an MSBuild target. +!**/packages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/packages/repositories.config + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Microsoft Azure ApplicationInsights config file +ApplicationInsights.config + +# Windows Store app package directory +AppPackages/ +BundleArtifacts/ + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.pfx +*.publishsettings +orleans.codegen.cs + +/node_modules + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm + +# SQL Server files +*.mdf +*.ldf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe + +# FAKE - F# Make +.fake/ diff --git a/Tests/WebApiFluent/ClientApp/.editorconfig b/Tests/WebApiFluent/ClientApp/.editorconfig new file mode 100644 index 00000000..934f2fe8 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/.editorconfig @@ -0,0 +1,16 @@ +# Editor configuration, see http://editorconfig.org +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 2 +insert_final_newline = true +trim_trailing_whitespace = true + +[*.md] +max_line_length = off +trim_trailing_whitespace = false + +[*.{razor,cshtml}] +charset = utf-8-bom diff --git a/Tests/WebApiFluent/ClientApp/.gitignore b/Tests/WebApiFluent/ClientApp/.gitignore new file mode 100644 index 00000000..e1f679be --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/.gitignore @@ -0,0 +1,40 @@ +# See http://help.github.com/ignore-files/ for more about ignoring files. + +# compiled output +/dist +/dist-server +/tmp +/out-tsc + +# dependencies +/node_modules + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +# misc +/.sass-cache +/connect.lock +/coverage +/libpeerconnection.log +npm-debug.log +yarn-error.log +testem.log +/typings + +# System Files +.DS_Store +Thumbs.db diff --git a/Tests/WebApiFluent/ClientApp/README.md b/Tests/WebApiFluent/ClientApp/README.md new file mode 100644 index 00000000..df58690f --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/README.md @@ -0,0 +1,27 @@ +# WebApiFluent + +This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 6.0.0. + +## Development server + +Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. + +## Code scaffolding + +Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. + +## Build + +Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. + +## Running unit tests + +Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). + +## Running end-to-end tests + +Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). + +## Further help + +To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). diff --git a/Tests/WebApiFluent/ClientApp/angular.json b/Tests/WebApiFluent/ClientApp/angular.json new file mode 100644 index 00000000..cf1f4c5d --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/angular.json @@ -0,0 +1,136 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "newProjectRoot": "projects", + "projects": { + "WebApiFluent": { + "root": "", + "sourceRoot": "src", + "projectType": "application", + "prefix": "app", + "schematics": {}, + "architect": { + "build": { + "builder": "@angular-devkit/build-angular:browser", + "options": { + "progress": false, + "extractCss": true, + "outputPath": "dist", + "index": "src/index.html", + "main": "src/main.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.app.json", + "assets": ["src/assets"], + "styles": [ + "node_modules/bootstrap/dist/css/bootstrap.min.css", + "src/styles.css" + ], + "scripts": [] + }, + "configurations": { + "production": { + "fileReplacements": [ + { + "replace": "src/environments/environment.ts", + "with": "src/environments/environment.prod.ts" + } + ], + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "extractCss": true, + "namedChunks": false, + "aot": true, + "extractLicenses": true, + "vendorChunk": false, + "buildOptimizer": true + } + } + }, + "serve": { + "builder": "@angular-devkit/build-angular:dev-server", + "options": { + "browserTarget": "WebApiFluent:build" + }, + "configurations": { + "production": { + "browserTarget": "WebApiFluent:build:production" + } + } + }, + "extract-i18n": { + "builder": "@angular-devkit/build-angular:extract-i18n", + "options": { + "browserTarget": "WebApiFluent:build" + } + }, + "test": { + "builder": "@angular-devkit/build-angular:karma", + "options": { + "main": "src/test.ts", + "polyfills": "src/polyfills.ts", + "tsConfig": "src/tsconfig.spec.json", + "karmaConfig": "src/karma.conf.js", + "styles": ["src/styles.css"], + "scripts": [], + "assets": ["src/assets"] + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": ["src/tsconfig.app.json", "src/tsconfig.spec.json"], + "exclude": ["**/node_modules/**"] + } + }, + "server": { + "builder": "@angular-devkit/build-angular:server", + "options": { + "outputPath": "dist-server", + "main": "src/main.ts", + "tsConfig": "src/tsconfig.server.json" + }, + "configurations": { + "dev": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": true + }, + "production": { + "optimization": true, + "outputHashing": "all", + "sourceMap": false, + "namedChunks": false, + "extractLicenses": true, + "vendorChunk": false + } + } + } + } + }, + "WebApiFluent-e2e": { + "root": "e2e/", + "projectType": "application", + "architect": { + "e2e": { + "builder": "@angular-devkit/build-angular:protractor", + "options": { + "protractorConfig": "e2e/protractor.conf.js", + "devServerTarget": "WebApiFluent:serve" + } + }, + "lint": { + "builder": "@angular-devkit/build-angular:tslint", + "options": { + "tsConfig": "e2e/tsconfig.e2e.json", + "exclude": ["**/node_modules/**"] + } + } + } + } + }, + "defaultProject": "WebApiFluent" +} diff --git a/Tests/WebApiFluent/ClientApp/browserslist b/Tests/WebApiFluent/ClientApp/browserslist new file mode 100644 index 00000000..8e09ab49 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/browserslist @@ -0,0 +1,9 @@ +# This file is currently used by autoprefixer to adjust CSS to support the below specified browsers +# For additional information regarding the format and rule options, please see: +# https://github.com/browserslist/browserslist#queries +# For IE 9-11 support, please uncomment the last line of the file and adjust as needed +> 0.5% +last 2 versions +Firefox ESR +not dead +# IE 9-11 \ No newline at end of file diff --git a/Tests/WebApiFluent/ClientApp/e2e/protractor.conf.js b/Tests/WebApiFluent/ClientApp/e2e/protractor.conf.js new file mode 100644 index 00000000..d60eff06 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/e2e/protractor.conf.js @@ -0,0 +1,28 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts + +const { SpecReporter } = require("jasmine-spec-reporter"); + +exports.config = { + allScriptsTimeout: 11000, + specs: ["./src/**/*.e2e-spec.ts"], + capabilities: { + browserName: "chrome" + }, + directConnect: true, + baseUrl: "http://localhost:4200/", + framework: "jasmine", + jasmineNodeOpts: { + showColors: true, + defaultTimeoutInterval: 30000, + print: function() {} + }, + onPrepare() { + require("ts-node").register({ + project: require("path").join(__dirname, "./tsconfig.e2e.json") + }); + jasmine + .getEnv() + .addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); + } +}; diff --git a/Tests/WebApiFluent/ClientApp/e2e/src/app.e2e-spec.ts b/Tests/WebApiFluent/ClientApp/e2e/src/app.e2e-spec.ts new file mode 100644 index 00000000..5b3b4b27 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/e2e/src/app.e2e-spec.ts @@ -0,0 +1,14 @@ +import { AppPage } from './app.po'; + +describe('App', () => { + let page: AppPage; + + beforeEach(() => { + page = new AppPage(); + }); + + it('should display welcome message', () => { + page.navigateTo(); + expect(page.getMainHeading()).toEqual('Hello, world!'); + }); +}); diff --git a/Tests/WebApiFluent/ClientApp/e2e/src/app.po.ts b/Tests/WebApiFluent/ClientApp/e2e/src/app.po.ts new file mode 100644 index 00000000..24bc8b3c --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/e2e/src/app.po.ts @@ -0,0 +1,11 @@ +import { browser, by, element } from 'protractor'; + +export class AppPage { + navigateTo() { + return browser.get('/'); + } + + getMainHeading() { + return element(by.css('app-root h1')).getText(); + } +} diff --git a/Tests/WebApiFluent/ClientApp/e2e/tsconfig.e2e.json b/Tests/WebApiFluent/ClientApp/e2e/tsconfig.e2e.json new file mode 100644 index 00000000..a6dd6220 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/e2e/tsconfig.e2e.json @@ -0,0 +1,13 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "module": "commonjs", + "target": "es5", + "types": [ + "jasmine", + "jasminewd2", + "node" + ] + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/ClientApp/package-lock.json b/Tests/WebApiFluent/ClientApp/package-lock.json new file mode 100644 index 00000000..ec2a802c --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/package-lock.json @@ -0,0 +1,12839 @@ +{ + "name": "webapifluent", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@angular-devkit/architect": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.803.29.tgz", + "integrity": "sha512-yHBud/fZHTelX24yjQg5lefZrfIebruoFTGeOwF0JdX8+KiHcTIxS4LOnUTYriasfHarcHRFXBAV/bRm+wv5ow==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/build-angular": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-0.803.29.tgz", + "integrity": "sha512-XAgfP1gi0rEJ3oVt+8ipvS5RfPNbeK5r2n8Ll2H3xkKjU0p1PN8+S6/0XVBtmMfeQ06SJWEAKFcAYqrxXhVTzw==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/build-optimizer": "0.803.29", + "@angular-devkit/build-webpack": "0.803.29", + "@angular-devkit/core": "8.3.29", + "@babel/core": "7.8.7", + "@babel/preset-env": "7.8.7", + "@ngtools/webpack": "8.3.29", + "ajv": "6.12.3", + "autoprefixer": "9.6.1", + "browserslist": "4.10.0", + "cacache": "12.0.2", + "caniuse-lite": "1.0.30001035", + "circular-dependency-plugin": "5.2.0", + "clean-css": "4.2.1", + "copy-webpack-plugin": "6.0.3", + "core-js": "3.6.4", + "coverage-istanbul-loader": "2.0.3", + "file-loader": "4.2.0", + "find-cache-dir": "3.0.0", + "glob": "7.1.4", + "jest-worker": "24.9.0", + "karma-source-map-support": "1.4.0", + "less": "3.9.0", + "less-loader": "5.0.0", + "license-webpack-plugin": "2.1.2", + "loader-utils": "1.2.3", + "mini-css-extract-plugin": "0.8.0", + "minimatch": "3.0.4", + "open": "6.4.0", + "parse5": "4.0.0", + "postcss": "7.0.17", + "postcss-import": "12.0.1", + "postcss-loader": "3.0.0", + "raw-loader": "3.1.0", + "regenerator-runtime": "0.13.3", + "rxjs": "6.4.0", + "sass": "1.22.9", + "sass-loader": "7.2.0", + "semver": "6.3.0", + "source-map": "0.7.3", + "source-map-loader": "0.2.4", + "source-map-support": "0.5.13", + "speed-measure-webpack-plugin": "1.3.1", + "style-loader": "1.0.0", + "stylus": "0.54.5", + "stylus-loader": "3.0.2", + "terser": "4.6.3", + "terser-webpack-plugin": "3.0.3", + "tree-kill": "1.2.2", + "webpack": "4.39.2", + "webpack-dev-middleware": "3.7.2", + "webpack-dev-server": "3.11.0", + "webpack-merge": "4.2.1", + "webpack-sources": "1.4.3", + "webpack-subresource-integrity": "1.1.0-rc.6", + "worker-plugin": "3.2.0" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "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" + } + }, + "core-js": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.4.tgz", + "integrity": "sha512-4paDGScNgZP2IXXilaffL9X7968RuvwlkK3xWtZRVqgd8SYNiVKRJvkFd1aqqEuPfN7E68ZHEp9hDj6lHj4Hyw==", + "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" + } + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "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 + }, + "source-map-support": { + "version": "0.5.13", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", + "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + } + } + }, + "@angular-devkit/build-optimizer": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-optimizer/-/build-optimizer-0.803.29.tgz", + "integrity": "sha512-E/MXtKc3oaP7UvQm0g4ayfH8ImEoQnRWseKD4jjYG6TbTIqfIyHCZRcKIr3svY28hzASbro5IZI6SugG+llvFw==", + "dev": true, + "requires": { + "loader-utils": "1.2.3", + "source-map": "0.7.3", + "tslib": "1.10.0", + "typescript": "3.5.3", + "webpack-sources": "1.4.3" + }, + "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 + }, + "tslib": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", + "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", + "dev": true + } + } + }, + "@angular-devkit/build-webpack": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.803.29.tgz", + "integrity": "sha512-3dJ3iEGU6AFT8VFTe72T9uNLobfd18Sq5Hz22UCCYji9K3ZyVc/bn5uXVVX+/Yj91MFtXuhOjLj7Z+XDeNy+OQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular-devkit/core": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-8.3.29.tgz", + "integrity": "sha512-4jdja9QPwR6XG14ZSunyyOWT3nE2WtZC5IMDIBZADxujXvhzOU0n4oWpy6/JVHLUAxYNNgzLz+/LQORRWndcPg==", + "dev": true, + "requires": { + "ajv": "6.12.3", + "fast-json-stable-stringify": "2.0.0", + "magic-string": "0.25.3", + "rxjs": "6.4.0", + "source-map": "0.7.3" + }, + "dependencies": { + "ajv": { + "version": "6.12.3", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.3.tgz", + "integrity": "sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==", + "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" + } + }, + "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 + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "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 + } + } + }, + "@angular-devkit/schematics": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-8.3.29.tgz", + "integrity": "sha512-AFJ9EK0XbcNlO5Dm9vr0OlBo1Nw6AaFXPR+DmHGBdcDDHxqEmYYLWfT+JU/8U2YFIdgrtlwvdtf6UQ3V2jdz1g==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "rxjs": "6.4.0" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@angular/animations": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-8.2.12.tgz", + "integrity": "sha512-QVtZUw5J9c0RcDaJntIoeWVk/q9dhjDFxh+yw/uPl9Z4upWASdsOpZU2lfjqyU0myfg8dnQyZa1+Ce7n/DaClQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/cli": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-8.3.29.tgz", + "integrity": "sha512-pW+iU0eKHIae+A1b9W5g8DKefMQcehZ+drGKs4Hryh8G+XGFS00BIWkmh6c1mydWTEhdsFlhdjD/rXCem7MAQQ==", + "dev": true, + "requires": { + "@angular-devkit/architect": "0.803.29", + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@schematics/angular": "8.3.29", + "@schematics/update": "0.803.29", + "@yarnpkg/lockfile": "1.1.0", + "ansi-colors": "4.1.1", + "debug": "^4.1.1", + "ini": "1.3.5", + "inquirer": "6.5.1", + "npm-package-arg": "6.1.0", + "npm-pick-manifest": "3.0.2", + "open": "6.4.0", + "pacote": "9.5.5", + "read-package-tree": "5.3.1", + "rimraf": "3.0.0", + "semver": "6.3.0", + "symbol-observable": "1.2.0", + "universal-analytics": "^0.4.20", + "uuid": "^3.3.2" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", + "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "rimraf": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.0.tgz", + "integrity": "sha512-NDGVxTsjqfunkds7CqsOiEnxln4Bo7Nddl3XhS4pXg5OzwkLqJ971ZVAAnB+DDLnF76N+VnDEiBHaVV8I06SUg==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@angular/common": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-8.2.12.tgz", + "integrity": "sha512-BNz1lo+PP+lwIX3sErRGBRnkMzT5yT8CJ5o/M29AanCdcx9dpoJG2WKgpIgw8UBcj9QlP0CkSmzPtUNtcNMthA==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-8.2.12.tgz", + "integrity": "sha512-V5mDWioGmSZ4cJJ2THo8qHYKwj3sUI7dpJ0oab2Al0FQAN8JCimWO6AQKRtjmnr78ZkMy9Xe/KK6ebl40ewL5Q==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/compiler-cli": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-8.2.14.tgz", + "integrity": "sha512-XDrTyrlIZM+0NquVT+Kbg5bn48AaWFT+B3bAT288PENrTdkuxuF9AhjFRZj8jnMdmaE4O2rioEkXBtl6z3zptA==", + "dev": true, + "requires": { + "canonical-path": "1.0.0", + "chokidar": "^2.1.1", + "convert-source-map": "^1.5.1", + "dependency-graph": "^0.7.2", + "magic-string": "^0.25.0", + "minimist": "^1.2.0", + "reflect-metadata": "^0.1.2", + "source-map": "^0.6.1", + "tslib": "^1.9.0", + "yargs": "13.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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 + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.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" + } + } + } + }, + "yargs": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.1.0.tgz", + "integrity": "sha512-1UhJbXfzHiPqkfXNHYhiz79qM/kZqjTE8yGlEjZa85Q+3+OwcV6NRkV7XOV1W2Eom2bzILeUn55pQYffjVOLAg==", + "dev": true, + "requires": { + "cliui": "^4.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "os-locale": "^3.1.0", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.0.0" + } + } + } + }, + "@angular/core": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-8.2.12.tgz", + "integrity": "sha512-wEFwhHCuuXynXAMeA1G+0KIYY0jqXYs7I8p+GO+ufKoUmzWHFTvtMJ6nvKgy+LmZTByO2gf9oVAAlRodNb8ttQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/forms": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-8.2.12.tgz", + "integrity": "sha512-y1UObndCGbTYwLSzUWzCiX7th+mb4n712asApooGmfmIQmgTyHbKxYUJ9Ep1pgd0pqLBBnK249MQLH15NDpbyQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/language-service": { + "version": "8.2.14", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-8.2.14.tgz", + "integrity": "sha512-7EhN9JJbAJcH2xCa+rIOmekjiEuB0qwPdHuD5qn/wwMfRzMZo+Db4hHbR9KHrLH6H82PTwYKye/LLpDaZqoHOA==", + "dev": true + }, + "@angular/platform-browser": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-8.2.12.tgz", + "integrity": "sha512-VBvMjmFJapZ2pFlmxZiHtfPwbHp79RRi5mrdMhETjKMaLaC2tAR/99ijCpx2urDMqb/VDm7YHOtoLEpBFVDulg==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-browser-dynamic": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-8.2.12.tgz", + "integrity": "sha512-O4krb+9tj028JOQHPgLk/87lyUlHt8dpNxzuYCT0G6kEmknjpyZBaxhvDPygGjGHXV3LDqlYVH+bh8ygJUhwmw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@angular/platform-server": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-server/-/platform-server-8.2.12.tgz", + "integrity": "sha512-NQvfW3YnM2FBdNpfIAKBnGjit/ZimtWEt60xskoQ+GcusJIbsB6m78XTYZru1S7CBHW3TeUztKMNZmI2MjU6Cw==", + "requires": { + "domino": "^2.1.2", + "tslib": "^1.9.0", + "xhr2": "^0.1.4" + } + }, + "@angular/router": { + "version": "8.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-8.2.12.tgz", + "integrity": "sha512-mq1FethFpYosSVzChstMpxZlL+oUFeaA+FrzZQL7zJP/mm61yFkkhoYGVG6pG0NWSzpJE4NY6YvGCvHgN4ZECw==", + "requires": { + "tslib": "^1.9.0" + } + }, + "@babel/code-frame": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", + "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", + "requires": { + "@babel/highlight": "^7.10.4" + } + }, + "@babel/compat-data": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.12.7.tgz", + "integrity": "sha512-YaxPMGs/XIWtYqrdEOZOCPsVWfEoriXopnsz3/i7apYPXQ3698UFhS6dVT1KN5qOsWmVgw/FOrmQgpRaZayGsw==", + "dev": true + }, + "@babel/core": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.7.tgz", + "integrity": "sha512-rBlqF3Yko9cynC5CCFy6+K/w2N+Sq/ff2BPy+Krp7rHlABIr5epbA7OxVeKoMHB39LZOp1UY5SuLjy6uWi35yA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.8.3", + "@babel/generator": "^7.8.7", + "@babel/helpers": "^7.8.4", + "@babel/parser": "^7.8.7", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.7", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.1", + "json5": "^2.1.0", + "lodash": "^4.17.13", + "resolve": "^1.3.2", + "semver": "^5.4.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/generator": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.12.11.tgz", + "integrity": "sha512-Ggg6WPOJtSi8yYQvLVjG8F/TlpWDlKx0OpS4Kt+xMQPs5OaGYWy+v1A+1TvxI6sAMGZpKWWoAQ1DaeQbImlItA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11", + "jsesc": "^2.5.1", + "source-map": "^0.5.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "@babel/helper-annotate-as-pure": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.10.tgz", + "integrity": "sha512-XplmVbC1n+KY6jL8/fgLVXXUauDIB+lD5+GsQEh6F6GBF1dq1qy4DP4yXWzDKcoqXB3X58t61e85Fitoww4JVQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.4.tgz", + "integrity": "sha512-L0zGlFrGWZK4PbT8AszSfLTM5sDU1+Az/En9VrdT8/LmEiJt4zXt+Jve9DCAnQcbqDhCI+29y/L93mrDzddCcg==", + "dev": true, + "requires": { + "@babel/helper-explode-assignable-expression": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-compilation-targets": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.12.5.tgz", + "integrity": "sha512-+qH6NrscMolUlzOYngSBMIOQpKUGPPsc61Bu5W10mg84LxZ7cmvnBHzARKbDoFxVvqqAbj6Tg6N7bSrWSPXMyw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.12.5", + "@babel/helper-validator-option": "^7.12.1", + "browserslist": "^4.14.5", + "semver": "^5.5.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + } + } + }, + "@babel/helper-create-regexp-features-plugin": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.7.tgz", + "integrity": "sha512-idnutvQPdpbduutvi3JVfEgcVIHooQnhvhx0Nk9isOINOIGYkZea1Pk2JlJRiUnMefrlvr0vkByATBY/mB4vjQ==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "regexpu-core": "^4.7.1" + } + }, + "@babel/helper-define-map": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.10.5.tgz", + "integrity": "sha512-fMw4kgFB720aQFXSVaXr79pjjcW5puTCM16+rECJ/plGS+zByelE8l9nCpV1GibxTnFVmUuYG9U8wYfQHdzOEQ==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/types": "^7.10.5", + "lodash": "^4.17.19" + } + }, + "@babel/helper-explode-assignable-expression": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.12.1.tgz", + "integrity": "sha512-dmUwH8XmlrUpVqgtZ737tK88v07l840z9j3OEhCLwKTkjlvKpfqXVIZ0wpK3aeOxspwGrf/5AP5qLx4rO3w5rA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-function-name": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.11.tgz", + "integrity": "sha512-AtQKjtYNolKNi6nNNVLQ27CP6D9oFR6bq/HPYSizlzbp7uC1M59XJe8L+0uXjbIaZaUJF99ruHqVGiKXU/7ybA==", + "dev": true, + "requires": { + "@babel/helper-get-function-arity": "^7.12.10", + "@babel/template": "^7.12.7", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-get-function-arity": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.10.tgz", + "integrity": "sha512-mm0n5BPjR06wh9mPQaDdXWDoll/j5UpCAPl1x8fS71GHm7HA6Ua2V4ylG1Ju8lvcTOietbPNNPaSilKj+pj+Ag==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-hoist-variables": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.4.tgz", + "integrity": "sha512-wljroF5PgCk2juF69kanHVs6vrLwIPNp6DLD+Lrl3hoQ3PpPPikaDRNFA+0t81NOoMt2DL6WW/mdU8k4k6ZzuA==", + "dev": true, + "requires": { + "@babel/types": "^7.10.4" + } + }, + "@babel/helper-member-expression-to-functions": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.12.7.tgz", + "integrity": "sha512-DCsuPyeWxeHgh1Dus7APn7iza42i/qXqiFPWyBDdOFtvS581JQePsc1F/nD+fHrcswhLlRc2UpYS1NwERxZhHw==", + "dev": true, + "requires": { + "@babel/types": "^7.12.7" + } + }, + "@babel/helper-module-imports": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.12.5.tgz", + "integrity": "sha512-SR713Ogqg6++uexFRORf/+nPXMmWIn80TALu0uaFb+iQIUoR7bOC7zBWyzBs5b3tBBJXuyD0cRu1F15GyzjOWA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.5" + } + }, + "@babel/helper-module-transforms": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.12.1.tgz", + "integrity": "sha512-QQzehgFAZ2bbISiCpmVGfiGux8YVFXQ0abBic2Envhej22DVXV9nCFaS5hIQbkyo1AdGb+gNME2TSh3hYJVV/w==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-simple-access": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.11.0", + "@babel/helper-validator-identifier": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.1", + "@babel/types": "^7.12.1", + "lodash": "^4.17.19" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.10.tgz", + "integrity": "sha512-4tpbU0SrSTjjt65UMWSrUOPZTsgvPgGG4S8QSTNHacKzpS51IVWGDj0yCwyeZND/i+LSN2g/O63jEXEWm49sYQ==", + "dev": true, + "requires": { + "@babel/types": "^7.12.10" + } + }, + "@babel/helper-plugin-utils": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", + "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==", + "dev": true + }, + "@babel/helper-remap-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.12.1.tgz", + "integrity": "sha512-9d0KQCRM8clMPcDwo8SevNs+/9a8yWVVmaE80FGJcEP8N1qToREmWEGnBn8BUlJhYRFz6fqxeRL1sl5Ogsed7A==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-wrap-function": "^7.10.4", + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-replace-supers": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.12.11.tgz", + "integrity": "sha512-q+w1cqmhL7R0FNzth/PLLp2N+scXEK/L2AHbXUyydxp828F4FEa5WcVoqui9vFRiHDQErj9Zof8azP32uGVTRA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.12.7", + "@babel/helper-optimise-call-expression": "^7.12.10", + "@babel/traverse": "^7.12.10", + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-simple-access": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.12.1.tgz", + "integrity": "sha512-OxBp7pMrjVewSSC8fXDFrHrBcJATOOFssZwv16F3/6Xtc138GHybBfPbm9kfiqQHKhYQrlamWILwlDCeyMFEaA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz", + "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==", + "dev": true, + "requires": { + "@babel/types": "^7.12.1" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.11.tgz", + "integrity": "sha512-LsIVN8j48gHgwzfocYUSkO/hjYAOJqlpJEc7tGXcIm4cubjVUf8LGW6eWRyxEu7gA25q02p0rQUWoCI33HNS5g==", + "dev": true, + "requires": { + "@babel/types": "^7.12.11" + } + }, + "@babel/helper-validator-identifier": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz", + "integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==" + }, + "@babel/helper-validator-option": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.11.tgz", + "integrity": "sha512-TBFCyj939mFSdeX7U7DDj32WtzYY7fDcalgq8v3fBZMNOJQNn7nOYzMaUCiPxPYfCup69mtIpqlKgMZLvQ8Xhw==", + "dev": true + }, + "@babel/helper-wrap-function": { + "version": "7.12.3", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.12.3.tgz", + "integrity": "sha512-Cvb8IuJDln3rs6tzjW3Y8UeelAOdnpB8xtQ4sme2MSZ9wOxrbThporC0y/EtE16VAtoyEfLM404Xr1e0OOp+ow==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.10.4", + "@babel/types": "^7.10.4" + } + }, + "@babel/helpers": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.12.5.tgz", + "integrity": "sha512-lgKGMQlKqA8meJqKsW6rUnc4MdUk35Ln0ATDqdM1a/UpARODdI4j5Y5lVfUScnSNkJcdCRAaWkspykNoFg9sJA==", + "dev": true, + "requires": { + "@babel/template": "^7.10.4", + "@babel/traverse": "^7.12.5", + "@babel/types": "^7.12.5" + } + }, + "@babel/highlight": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.10.4.tgz", + "integrity": "sha512-i6rgnR/YgPEQzZZnbTHHuZdlE8qyoBNalD6F+q4vAFlcMEcqmkoG+mPqJYJCo63qPf74+Y1UZsl3l6f7/RIkmA==", + "requires": { + "@babel/helper-validator-identifier": "^7.10.4", + "chalk": "^2.0.0", + "js-tokens": "^4.0.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==", + "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==", + "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==", + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "@babel/parser": { + "version": "7.12.11", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.12.11.tgz", + "integrity": "sha512-N3UxG+uuF4CMYoNj8AhnbAcJF0PiuJ9KHuy1lQmkYsxTer/MAH9UBNHsBoAX/4s6NvlDD047No8mYVGGzLL4hg==", + "dev": true + }, + "@babel/plugin-proposal-async-generator-functions": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.12.12.tgz", + "integrity": "sha512-nrz9y0a4xmUrRq51bYkWJIO5SBZyG2ys2qinHsN0zHDHVsUaModrkpyWWWXfGqYQmOL3x9sQIcTNN/pBGpo09A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1", + "@babel/plugin-syntax-async-generators": "^7.8.0" + } + }, + "@babel/plugin-proposal-dynamic-import": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.12.1.tgz", + "integrity": "sha512-a4rhUSZFuq5W8/OO8H7BL5zspjnc1FLd9hlOxIK/f7qG4a0qsqk8uvF/ywgBA8/OmjsapjpvaEOYItfGG1qIvQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-dynamic-import": "^7.8.0" + } + }, + "@babel/plugin-proposal-json-strings": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.12.1.tgz", + "integrity": "sha512-GoLDUi6U9ZLzlSda2Df++VSqDJg3CG+dR0+iWsv6XRw1rEq+zwt4DirM9yrxW6XWaTpmai1cWJLMfM8qQJf+yw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.0" + } + }, + "@babel/plugin-proposal-nullish-coalescing-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.12.1.tgz", + "integrity": "sha512-nZY0ESiaQDI1y96+jk6VxMOaL4LPo/QDHBqL+SF3/vl6dHkTwHlOI8L4ZwuRBHgakRBw5zsVylel7QPbbGuYgg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0" + } + }, + "@babel/plugin-proposal-object-rest-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.12.1.tgz", + "integrity": "sha512-s6SowJIjzlhx8o7lsFx5zmY4At6CTtDvgNQDdPzkBQucle58A6b/TTeEBYtyDgmcXjUTM+vE8YOGHZzzbc/ioA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-transform-parameters": "^7.12.1" + } + }, + "@babel/plugin-proposal-optional-catch-binding": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.12.1.tgz", + "integrity": "sha512-hFvIjgprh9mMw5v42sJWLI1lzU5L2sznP805zeT6rySVRA0Y18StRhDqhSxlap0oVgItRsB6WSROp4YnJTJz0g==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0" + } + }, + "@babel/plugin-proposal-optional-chaining": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.12.7.tgz", + "integrity": "sha512-4ovylXZ0PWmwoOvhU2vhnzVNnm88/Sm9nx7V8BPgMvAzn5zDou3/Awy0EjglyubVHasJj+XCEkr/r1X3P5elCA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1", + "@babel/plugin-syntax-optional-chaining": "^7.8.0" + } + }, + "@babel/plugin-proposal-unicode-property-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.1.tgz", + "integrity": "sha512-MYq+l+PvHuw/rKUz1at/vb6nCnQ2gmJBNaM62z0OgH7B2W1D9pvkpYtlti9bGtizNIU1K3zm4bZF9F91efVY0w==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", + "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", + "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", + "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", + "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", + "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", + "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", + "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.8.0" + } + }, + "@babel/plugin-syntax-top-level-await": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.1.tgz", + "integrity": "sha512-i7ooMZFS+a/Om0crxZodrTzNEPJHZrlMVGMTEpFAj6rYY/bKCddB0Dk/YxfPuYXOopuhKk/e1jV6h+WUU9XN3A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.12.1.tgz", + "integrity": "sha512-5QB50qyN44fzzz4/qxDPQMBCTHgxg3n0xRBLJUmBlLoU/sFvxVWGZF/ZUfMVDQuJUKXaBhbupxIzIfZ6Fwk/0A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-async-to-generator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.12.1.tgz", + "integrity": "sha512-SDtqoEcarK1DFlRJ1hHRY5HvJUj5kX4qmtpMAm2QnhOlyuMC4TMdCRgW6WXpv93rZeYNeLP22y8Aq2dbcDRM1A==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-remap-async-to-generator": "^7.12.1" + } + }, + "@babel/plugin-transform-block-scoped-functions": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.1.tgz", + "integrity": "sha512-5OpxfuYnSgPalRpo8EWGPzIYf0lHBWORCkj5M0oLBwHdlux9Ri36QqGW3/LR13RSVOAoUUMzoPI/jpE4ABcHoA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-block-scoping": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.12.12.tgz", + "integrity": "sha512-VOEPQ/ExOVqbukuP7BYJtI5ZxxsmegTwzZ04j1aF0dkSypGo9XpDHuOrABsJu+ie+penpSJheDJ11x1BEZNiyQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-classes": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.12.1.tgz", + "integrity": "sha512-/74xkA7bVdzQTBeSUhLLJgYIcxw/dpEpCdRDiHgPJ3Mv6uC11UhjpOhl72CgqbBCmt1qtssCyB2xnJm1+PFjog==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.10.4", + "@babel/helper-define-map": "^7.10.4", + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-optimise-call-expression": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1", + "@babel/helper-split-export-declaration": "^7.10.4", + "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.12.1.tgz", + "integrity": "sha512-vVUOYpPWB7BkgUWPo4C44mUQHpTZXakEqFjbv8rQMg7TC6S6ZhGZ3otQcRH6u7+adSlE5i0sp63eMC/XGffrzg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-destructuring": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.12.1.tgz", + "integrity": "sha512-fRMYFKuzi/rSiYb2uRLiUENJOKq4Gnl+6qOv5f8z0TZXg3llUwUhsNNwrwaT/6dUhJTzNpBr+CUvEWBtfNY1cw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-dotall-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.1.tgz", + "integrity": "sha512-B2pXeRKoLszfEW7J4Hg9LoFaWEbr/kzo3teWHmtFCszjRNa/b40f9mfeqZsIDLLt/FjwQ6pz/Gdlwy85xNckBA==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-duplicate-keys": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.1.tgz", + "integrity": "sha512-iRght0T0HztAb/CazveUpUQrZY+aGKKaWXMJ4uf9YJtqxSUe09j3wteztCUDRHs+SRAL7yMuFqUsLoAKKzgXjw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-exponentiation-operator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.1.tgz", + "integrity": "sha512-7tqwy2bv48q+c1EHbXK0Zx3KXd2RVQp6OC7PbwFNt/dPTAV3Lu5sWtWuAj8owr5wqtWnqHfl2/mJlUmqkChKug==", + "dev": true, + "requires": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-for-of": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.12.1.tgz", + "integrity": "sha512-Zaeq10naAsuHo7heQvyV0ptj4dlZJwZgNAtBYBnu5nNKJoW62m0zKcIEyVECrUKErkUkg6ajMy4ZfnVZciSBhg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-function-name": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.1.tgz", + "integrity": "sha512-JF3UgJUILoFrFMEnOJLJkRHSk6LUSXLmEFsA23aR2O5CSLUxbeUX1IZ1YQ7Sn0aXb601Ncwjx73a+FVqgcljVw==", + "dev": true, + "requires": { + "@babel/helper-function-name": "^7.10.4", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.1.tgz", + "integrity": "sha512-+PxVGA+2Ag6uGgL0A5f+9rklOnnMccwEBzwYFL3EUaKuiyVnUipyXncFcfjSkbimLrODoqki1U9XxZzTvfN7IQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-member-expression-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.1.tgz", + "integrity": "sha512-1sxePl6z9ad0gFMB9KqmYofk34flq62aqMt9NqliS/7hPEpURUCMbyHXrMPlo282iY7nAvUB1aQd5mg79UD9Jg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-modules-amd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.12.1.tgz", + "integrity": "sha512-tDW8hMkzad5oDtzsB70HIQQRBiTKrhfgwC/KkJeGsaNFTdWhKNt/BiE8c5yj19XiGyrxpbkOfH87qkNg1YGlOQ==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-commonjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.12.1.tgz", + "integrity": "sha512-dY789wq6l0uLY8py9c1B48V8mVL5gZh/+PQ5ZPrylPYsnAvnEMjqsUXkuoDVPeVK+0VyGar+D08107LzDQ6pag==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-simple-access": "^7.12.1", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-systemjs": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.12.1.tgz", + "integrity": "sha512-Hn7cVvOavVh8yvW6fLwveFqSnd7rbQN3zJvoPNyNaQSvgfKmDBO9U1YL9+PCXGRlZD9tNdWTy5ACKqMuzyn32Q==", + "dev": true, + "requires": { + "@babel/helper-hoist-variables": "^7.10.4", + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-validator-identifier": "^7.10.4", + "babel-plugin-dynamic-import-node": "^2.3.3" + } + }, + "@babel/plugin-transform-modules-umd": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.12.1.tgz", + "integrity": "sha512-aEIubCS0KHKM0zUos5fIoQm+AZUMt1ZvMpqz0/H5qAQ7vWylr9+PLYurT+Ic7ID/bKLd4q8hDovaG3Zch2uz5Q==", + "dev": true, + "requires": { + "@babel/helper-module-transforms": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.1.tgz", + "integrity": "sha512-tB43uQ62RHcoDp9v2Nsf+dSM8sbNodbEicbQNA53zHz8pWUhsgHSJCGpt7daXxRydjb0KnfmB+ChXOv3oADp1Q==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1" + } + }, + "@babel/plugin-transform-new-target": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.1.tgz", + "integrity": "sha512-+eW/VLcUL5L9IvJH7rT1sT0CzkdUTvPrXC2PXTn/7z7tXLBuKvezYbGdxD5WMRoyvyaujOq2fWoKl869heKjhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-object-super": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.1.tgz", + "integrity": "sha512-AvypiGJH9hsquNUn+RXVcBdeE3KHPZexWRdimhuV59cSoOt5kFBmqlByorAeUlGG2CJWd0U+4ZtNKga/TB0cAw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-replace-supers": "^7.12.1" + } + }, + "@babel/plugin-transform-parameters": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.12.1.tgz", + "integrity": "sha512-xq9C5EQhdPK23ZeCdMxl8bbRnAgHFrw5EOC3KJUsSylZqdkCaFEXxGSBuTSObOpiiHHNyb82es8M1QYgfQGfNg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-property-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.1.tgz", + "integrity": "sha512-6MTCR/mZ1MQS+AwZLplX4cEySjCpnIF26ToWo942nqn8hXSm7McaHQNeGx/pt7suI1TWOWMfa/NgBhiqSnX0cQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-regenerator": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.12.1.tgz", + "integrity": "sha512-gYrHqs5itw6i4PflFX3OdBPMQdPbF4bj2REIUxlMRUFk0/ZOAIpDFuViuxPjUL7YC8UPnf+XG7/utJvqXdPKng==", + "dev": true, + "requires": { + "regenerator-transform": "^0.14.2" + } + }, + "@babel/plugin-transform-reserved-words": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.1.tgz", + "integrity": "sha512-pOnUfhyPKvZpVyBHhSBoX8vfA09b7r00Pmm1sH+29ae2hMTKVmSp4Ztsr8KBKjLjx17H0eJqaRC3bR2iThM54A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-shorthand-properties": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.1.tgz", + "integrity": "sha512-GFZS3c/MhX1OusqB1MZ1ct2xRzX5ppQh2JU1h2Pnfk88HtFTM+TWQqJNfwkmxtPQtb/s1tk87oENfXJlx7rSDw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-spread": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.12.1.tgz", + "integrity": "sha512-vuLp8CP0BE18zVYjsEBZ5xoCecMK6LBMMxYzJnh01rxQRvhNhH1csMMmBfNo5tGpGO+NhdSNW2mzIvBu3K1fng==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4", + "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1" + } + }, + "@babel/plugin-transform-sticky-regex": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.7.tgz", + "integrity": "sha512-VEiqZL5N/QvDbdjfYQBhruN0HYjSPjC4XkeqW4ny/jNtH9gcbgaqBIXYEZCNnESMAGs0/K/R7oFGMhOyu/eIxg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-template-literals": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.12.1.tgz", + "integrity": "sha512-b4Zx3KHi+taXB1dVRBhVJtEPi9h1THCeKmae2qP0YdUHIFhVjtpqqNfxeVAa1xeHVhAy4SbHxEwx5cltAu5apw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-typeof-symbol": { + "version": "7.12.10", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.10.tgz", + "integrity": "sha512-JQ6H8Rnsogh//ijxspCjc21YPd3VLVoYtAwv3zQmqAt8YGYUtdo5usNhdl4b9/Vir2kPFZl6n1h0PfUz4hJhaA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/plugin-transform-unicode-regex": { + "version": "7.12.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.1.tgz", + "integrity": "sha512-SqH4ClNngh/zGwHZOOQMTD+e8FGWexILV+ePMyiDJttAWRh5dhDL8rcl5lSgU3Huiq6Zn6pWTMvdPAb21Dwdyg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.12.1", + "@babel/helper-plugin-utils": "^7.10.4" + } + }, + "@babel/preset-env": { + "version": "7.8.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.8.7.tgz", + "integrity": "sha512-BYftCVOdAYJk5ASsznKAUl53EMhfBbr8CJ1X+AJLfGPscQkwJFiaV/Wn9DPH/7fzm2v6iRYJKYHSqyynTGw0nw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.8.6", + "@babel/helper-compilation-targets": "^7.8.7", + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-plugin-utils": "^7.8.3", + "@babel/plugin-proposal-async-generator-functions": "^7.8.3", + "@babel/plugin-proposal-dynamic-import": "^7.8.3", + "@babel/plugin-proposal-json-strings": "^7.8.3", + "@babel/plugin-proposal-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-proposal-object-rest-spread": "^7.8.3", + "@babel/plugin-proposal-optional-catch-binding": "^7.8.3", + "@babel/plugin-proposal-optional-chaining": "^7.8.3", + "@babel/plugin-proposal-unicode-property-regex": "^7.8.3", + "@babel/plugin-syntax-async-generators": "^7.8.0", + "@babel/plugin-syntax-dynamic-import": "^7.8.0", + "@babel/plugin-syntax-json-strings": "^7.8.0", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.0", + "@babel/plugin-syntax-object-rest-spread": "^7.8.0", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.0", + "@babel/plugin-syntax-optional-chaining": "^7.8.0", + "@babel/plugin-syntax-top-level-await": "^7.8.3", + "@babel/plugin-transform-arrow-functions": "^7.8.3", + "@babel/plugin-transform-async-to-generator": "^7.8.3", + "@babel/plugin-transform-block-scoped-functions": "^7.8.3", + "@babel/plugin-transform-block-scoping": "^7.8.3", + "@babel/plugin-transform-classes": "^7.8.6", + "@babel/plugin-transform-computed-properties": "^7.8.3", + "@babel/plugin-transform-destructuring": "^7.8.3", + "@babel/plugin-transform-dotall-regex": "^7.8.3", + "@babel/plugin-transform-duplicate-keys": "^7.8.3", + "@babel/plugin-transform-exponentiation-operator": "^7.8.3", + "@babel/plugin-transform-for-of": "^7.8.6", + "@babel/plugin-transform-function-name": "^7.8.3", + "@babel/plugin-transform-literals": "^7.8.3", + "@babel/plugin-transform-member-expression-literals": "^7.8.3", + "@babel/plugin-transform-modules-amd": "^7.8.3", + "@babel/plugin-transform-modules-commonjs": "^7.8.3", + "@babel/plugin-transform-modules-systemjs": "^7.8.3", + "@babel/plugin-transform-modules-umd": "^7.8.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.8.3", + "@babel/plugin-transform-new-target": "^7.8.3", + "@babel/plugin-transform-object-super": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.8.7", + "@babel/plugin-transform-property-literals": "^7.8.3", + "@babel/plugin-transform-regenerator": "^7.8.7", + "@babel/plugin-transform-reserved-words": "^7.8.3", + "@babel/plugin-transform-shorthand-properties": "^7.8.3", + "@babel/plugin-transform-spread": "^7.8.3", + "@babel/plugin-transform-sticky-regex": "^7.8.3", + "@babel/plugin-transform-template-literals": "^7.8.3", + "@babel/plugin-transform-typeof-symbol": "^7.8.4", + "@babel/plugin-transform-unicode-regex": "^7.8.3", + "@babel/types": "^7.8.7", + "browserslist": "^4.8.5", + "core-js-compat": "^3.6.2", + "invariant": "^2.2.2", + "levenary": "^1.1.1", + "semver": "^5.5.0" + } + }, + "@babel/runtime": { + "version": "7.12.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.12.5.tgz", + "integrity": "sha512-plcc+hbExy3McchJCEQG3knOsuh3HH+Prx1P6cLIkET/0dLuQDEnrT+s27Axgc9bqfsmNUNHfscgMUdBpC9xfg==", + "dev": true, + "requires": { + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==", + "dev": true + } + } + }, + "@babel/template": { + "version": "7.12.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.7.tgz", + "integrity": "sha512-GkDzmHS6GV7ZeXfJZ0tLRBhZcMcY0/Lnb+eEbXDBfCAcZCjrZKe6p3J4we/D24O9Y8enxWAg1cWwof59yLh2ow==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.10.4", + "@babel/parser": "^7.12.7", + "@babel/types": "^7.12.7" + } + }, + "@babel/traverse": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.12.12.tgz", + "integrity": "sha512-s88i0X0lPy45RrLM8b9mz8RPH5FqO9G9p7ti59cToE44xFm1Q+Pjh5Gq4SXBbtb88X7Uy7pexeqRIQDDMNkL0w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.12.11", + "@babel/generator": "^7.12.11", + "@babel/helper-function-name": "^7.12.11", + "@babel/helper-split-export-declaration": "^7.12.11", + "@babel/parser": "^7.12.11", + "@babel/types": "^7.12.12", + "debug": "^4.1.0", + "globals": "^11.1.0", + "lodash": "^4.17.19" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@babel/types": { + "version": "7.12.12", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.12.12.tgz", + "integrity": "sha512-lnIX7piTxOH22xE7fDXDbSHg9MM1/6ORnafpJmov5rs0kX5g4BZxeXNJLXsMRiO0U5Rb8/FvMS6xlTnTHvxonQ==", + "dev": true, + "requires": { + "@babel/helper-validator-identifier": "^7.12.11", + "lodash": "^4.17.19", + "to-fast-properties": "^2.0.0" + } + }, + "@istanbuljs/schema": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.2.tgz", + "integrity": "sha512-tsAQNx32a8CoFhjhijUIhI4kccIAgmGhy8LZMZgGfmXcpMbPRUqn5LWmgRttILi6yeGmBJd2xsPkFMs0PzgPCw==", + "dev": true + }, + "@ngtools/webpack": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-8.3.29.tgz", + "integrity": "sha512-7uB7dlAHR7RmxcQCYidnWRR1tFRJq7CzI+MM3725ibAvi4HnM5viC/HnKRTK7V+3iS1C0l0u0Gyo/769NsUDTQ==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "enhanced-resolve": "4.1.0", + "rxjs": "6.4.0", + "tree-kill": "1.2.2", + "webpack-sources": "1.4.3" + }, + "dependencies": { + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + } + } + }, + "@nguniversal/module-map-ngfactory-loader": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@nguniversal/module-map-ngfactory-loader/-/module-map-ngfactory-loader-8.1.1.tgz", + "integrity": "sha512-vXFydMTPFRfGjmtdwtbNhl4Pmfg580Yit0vzlTeb3ZC1v+TJKR2GzaWYUileWxS60FrgNF4/tkOEL5ouDDx6Bw==" + }, + "@nodelib/fs.scandir": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz", + "integrity": "sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.4", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz", + "integrity": "sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz", + "integrity": "sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.4", + "fastq": "^1.6.0" + } + }, + "@npmcli/move-file": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", + "integrity": "sha512-Uv6h1sT+0DrblvIrolFtbvM1FgWm+/sy4B3pvLp67Zys+thcukzS5ekn7HsZFGpWP4Q3fYJCljbWQE/XivMRLw==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + } + } + }, + "@schematics/angular": { + "version": "8.3.29", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-8.3.29.tgz", + "integrity": "sha512-If+UhCsQzCgnQymiiF8dQRoic34+RgJ6rV0n4k7Tm4N2xNYJOG7ajjzKM7PIeafsF50FKnFP8dqaNGxCMyq5Ew==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29" + } + }, + "@schematics/update": { + "version": "0.803.29", + "resolved": "https://registry.npmjs.org/@schematics/update/-/update-0.803.29.tgz", + "integrity": "sha512-Syf6h6DYeu1WU9aLihMwIgVASpcHCxUYqhZyHfQABiK8NkdlZ+KAp4cOxihsZyDqIJNLWON+0/FLPAQF3BXh5Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "8.3.29", + "@angular-devkit/schematics": "8.3.29", + "@yarnpkg/lockfile": "1.1.0", + "ini": "1.3.5", + "pacote": "9.5.5", + "rxjs": "6.4.0", + "semver": "6.3.0", + "semver-intersect": "1.4.0" + }, + "dependencies": { + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "rxjs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz", + "integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "@types/glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/jasmine": { + "version": "3.4.6", + "resolved": "https://registry.npmjs.org/@types/jasmine/-/jasmine-3.4.6.tgz", + "integrity": "sha512-hpQHs+lmZ0uuCrGyqypdI1Ho7jRFolOBT6OkNdZPFziLSSEKvWu+VxWU6bGdNEA/hoV4jV8pdDeNx8EWlmfNAw==", + "dev": true + }, + "@types/jasminewd2": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/@types/jasminewd2/-/jasminewd2-2.0.8.tgz", + "integrity": "sha512-d9p31r7Nxk0ZH0U39PTH0hiDlJ+qNVGjlt1ucOoTUptxb2v+Y5VMnsxfwN+i3hK4yQnqBi3FMmoMFcd1JHDxdg==", + "dev": true, + "requires": { + "@types/jasmine": "*" + } + }, + "@types/json-schema": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.6.tgz", + "integrity": "sha512-3c+yGKvVP5Y9TYBEibGNR+kLtijnj7mYrXRg+WpFb2X9xm04g/DXYkfg4hmzJQosc9snFNUPkbYIhu+KAm6jJw==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/node": { + "version": "12.11.7", + "resolved": "https://registry.npmjs.org/@types/node/-/node-12.11.7.tgz", + "integrity": "sha512-JNbGaHFCLwgHn/iCckiGSOZ1XYHsKFwREtzPwSGCVld1SGhOlmZw2D4ZI94HQCrBHbADzW9m4LER/8olJTRGHA==", + "dev": true + }, + "@types/q": { + "version": "0.0.32", + "resolved": "https://registry.npmjs.org/@types/q/-/q-0.0.32.tgz", + "integrity": "sha1-vShOV8hPEyXacCur/IKlMoGQwMU=", + "optional": true + }, + "@types/selenium-webdriver": { + "version": "3.0.17", + "resolved": "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz", + "integrity": "sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw==", + "optional": true + }, + "@types/source-list-map": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz", + "integrity": "sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==", + "dev": true + }, + "@types/webpack-sources": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.8.tgz", + "integrity": "sha512-JHB2/xZlXOjzjBB6fMOpH1eQAfsrpqVVIbneE0Rok16WXwFaznaI5vfg75U5WgGJm7V9W1c4xeRQDjX/zwvghA==", + "dev": true, + "requires": { + "@types/node": "*", + "@types/source-list-map": "*", + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "@webassemblyjs/ast": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.8.5.tgz", + "integrity": "sha512-aJMfngIZ65+t71C3y2nBBg5FFG0Okt9m0XEgWZ7Ywgn1oMAT8cNwx00Uv1cQyHtidq0Xn94R4TAywO+LCQ+ZAQ==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.8.5.tgz", + "integrity": "sha512-9p+79WHru1oqBh9ewP9zW95E3XAo+90oth7S5Re3eQnECGq59ly1Ri5tsIipKGpiStHsUYmY3zMLqtk3gTcOtQ==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.8.5.tgz", + "integrity": "sha512-Za/tnzsvnqdaSPOUXHyKJ2XI7PDX64kWtURyGiJJZKVEdFOsdKUCPTNEVFZq3zJ2R0G5wc2PZ5gvdTRFgm81zA==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.8.5.tgz", + "integrity": "sha512-Ri2R8nOS0U6G49Q86goFIPNgjyl6+oE1abW1pS84BuhP1Qcr5JqMwRFT3Ah3ADDDYGEgGs1iyb1DGX+kAi/c/Q==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.8.5.tgz", + "integrity": "sha512-VQAadSubZIhNpH46IR3yWO4kZZjMxN1opDrzePLdVKAZ+DFjkGD/rf4v1jap744uPVU6yjL/smZbRIIJTOUnKQ==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.8.5.tgz", + "integrity": "sha512-kRuX/saORcg8se/ft6Q2UbRpZwP4y7YrWsLXPbbmtepKr22i8Z4O3V5QE9DbZK908dh5Xya4Un57SDIKwB9eow==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.8.5.tgz", + "integrity": "sha512-/O1B236mN7UNEU4t9X7Pj38i4VoU8CcMHyy3l2cV/kIF4U5KoHXDVqcDuOs1ltkac90IM4vZdHc52t1x8Yfs3g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "mamacro": "^0.0.3" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.8.5.tgz", + "integrity": "sha512-Cu4YMYG3Ddl72CbmpjU/wbP6SACcOPVbHN1dI4VJNJVgFwaKf1ppeFJrwydOG3NDHxVGuCfPlLZNyEdIYlQ6QQ==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.8.5.tgz", + "integrity": "sha512-VV083zwR+VTrIWWtgIUpqfvVdK4ff38loRmrdDBgBT8ADXYsEZ5mPQ4Nde90N3UYatHdYoDIFb7oHzMncI02tA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.8.5.tgz", + "integrity": "sha512-aaCvQYrvKbY/n6wKHb/ylAJr27GglahUO89CcGXMItrOBqRarUMxWLJgxm9PJNuKULwN5n1csT9bYoMeZOGF3g==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.8.5.tgz", + "integrity": "sha512-plYUuUwleLIziknvlP8VpTgO4kqNaH57Y3JnNa6DLpu/sGcP6hbVdfdX5aHAV716pQBKrfuU26BJK29qY37J7A==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.8.5.tgz", + "integrity": "sha512-U7zgftmQriw37tfD934UNInokz6yTmn29inT2cAetAsaU9YeVCveWEwhKL1Mg4yS7q//NGdzy79nlXh3bT8Kjw==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.8.5.tgz", + "integrity": "sha512-A41EMy8MWw5yvqj7MQzkDjU29K7UJq1VrX2vWLzfpRHt3ISftOXqrtojn7nlPsZ9Ijhp5NwuODuycSvfAO/26Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/helper-wasm-section": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-opt": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "@webassemblyjs/wast-printer": "1.8.5" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.8.5.tgz", + "integrity": "sha512-BCZBT0LURC0CXDzj5FXSc2FPTsxwp3nWcqXQdOZE4U7h7i8FqtFK5Egia6f9raQLpEKT1VL7zr4r3+QX6zArWg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.8.5.tgz", + "integrity": "sha512-HKo2mO/Uh9A6ojzu7cjslGaHaUU14LdLbGEKqTR7PBKwT6LdPtLLh9fPY33rmr5wcOMrsWDbbdCHq4hQUdd37Q==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-buffer": "1.8.5", + "@webassemblyjs/wasm-gen": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.8.5.tgz", + "integrity": "sha512-pi0SYE9T6tfcMkthwcgCpL0cM9nRYr6/6fjgDtL6q/ZqKHdMWvxitRi5JcZ7RI4SNJJYnYNaWy5UUrHQy998lw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-wasm-bytecode": "1.8.5", + "@webassemblyjs/ieee754": "1.8.5", + "@webassemblyjs/leb128": "1.8.5", + "@webassemblyjs/utf8": "1.8.5" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.8.5.tgz", + "integrity": "sha512-daXC1FyKWHF1i11obK086QRlsMsY4+tIOKgBqI1lxAnkp9xe9YMcgOxm9kLe+ttjs5aWV2KKE1TWJCN57/Btsg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/floating-point-hex-parser": "1.8.5", + "@webassemblyjs/helper-api-error": "1.8.5", + "@webassemblyjs/helper-code-frame": "1.8.5", + "@webassemblyjs/helper-fsm": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.8.5.tgz", + "integrity": "sha512-w0U0pD4EhlnvRyeJzBqaVSJAo9w/ce7/WPogeXLzGkO6hzhr4GnQIZ4W4uUt5b9ooAaXPtnXlj0gzsXEOUNYMg==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/wast-parser": "1.8.5", + "@xtuc/long": "4.2.2" + } + }, + "@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 + }, + "@yarnpkg/lockfile": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", + "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==", + "dev": true + }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", + "optional": true + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dev": true, + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.2.tgz", + "integrity": "sha512-XtGIhXwF8YM8bJhGxG5kXgjkEuNGLTkoYqVE+KMR+aspr4KGYmKYg7yUe3KghyQ9yheNwLnjmzh/7+gfDBmHCQ==", + "dev": true + }, + "adm-zip": { + "version": "0.4.16", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.4.16.tgz", + "integrity": "sha512-TFi4HBKSGfIKsK5YCkKaaFG2m4PEDyViZmEwof3MTIgzimHLto6muaHVpbrljdIvIrFZzEq/p4nafOeLcYegrg==", + "optional": true + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz", + "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=", + "dev": true + }, + "agent-base": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", + "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", + "requires": { + "es6-promisify": "^5.0.0" + } + }, + "agentkeepalive": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", + "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", + "dev": true, + "requires": { + "humanize-ms": "^1.2.1" + } + }, + "aggregate-error": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz", + "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==", + "dev": true, + "requires": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "dependencies": { + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", + "dev": true + } + } + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "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-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.5.2", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", + "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", + "dev": true + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=" + }, + "ansi-colors": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.4.tgz", + "integrity": "sha512-hHUXGagefjN2iRrID63xckIvotOXOojhQKWIPUZ4mNUZ9nLZW+7FMNoE1lOkEhNWYsx/7ysGIuJYCiMAA9FnrA==", + "dev": true + }, + "ansi-escapes": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", + "dev": true, + "requires": { + "type-fest": "^0.11.0" + } + }, + "ansi-html": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.7.tgz", + "integrity": "sha1-gTWEAhliqenm/QOflA0S9WynhZ4=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "optional": true + }, + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "app-root-path": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-2.2.1.tgz", + "integrity": "sha512-91IFKeKk7FjfmezPKkwtaRvSpnUc4gDwPAjA1YZ9Gn0q0PPeW+vbeUsZuyDwjI7+QTHhcLen2v25fi/AmhvbJA==", + "dev": true + }, + "append-transform": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz", + "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==", + "dev": true, + "requires": { + "default-require-extensions": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "arg": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "optional": true + }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "aria-query": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-3.0.0.tgz", + "integrity": "sha1-ZbP8wcoRVajJrmTW7uKX8V1RM8w=", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7", + "commander": "^2.11.0" + } + }, + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "optional": true + }, + "array-flatten": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "requires": { + "array-uniq": "^1.0.1" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=" + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "optional": true + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=", + "dev": true + }, + "asn1": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", + "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", + "requires": { + "safer-buffer": "~2.1.0" + } + }, + "asn1.js": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", + "integrity": "sha512-+I//4cYPccV8LdmBLiX8CYvf9Sp3vQsrqu2QNXRcrbiWvcx/UdlFiqUJJzxRQxgsZmvhXhn4cSKeSmoFjVdupA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "safer-buffer": "^2.1.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "assert": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz", + "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==", + "dev": true, + "requires": { + "object-assign": "^4.1.1", + "util": "0.10.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "dev": true + }, + "util": { + "version": "0.10.3", + "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz", + "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=", + "dev": true, + "requires": { + "inherits": "2.0.1" + } + } + } + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "ast-types-flow": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", + "integrity": "sha1-9wtzXGvKGlycItmCw+Oef+ujva0=", + "dev": true + }, + "async": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", + "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "dev": true, + "requires": { + "lodash": "^4.17.14" + } + }, + "async-each": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", + "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==", + "dev": true + }, + "async-foreach": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz", + "integrity": "sha1-NhIfhFwFeBct5Bmpfb6x0W7DRUI=", + "optional": true + }, + "async-limiter": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz", + "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "dev": true + }, + "autoprefixer": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-9.6.1.tgz", + "integrity": "sha512-aVo5WxR3VyvyJxcJC3h4FKfwCQvQWb1tSI5VHNibddCVWrcD1NvlxEweg3TSgiPztMnWfjpy2FURKA2kvDE+Tw==", + "dev": true, + "requires": { + "browserslist": "^4.6.3", + "caniuse-lite": "^1.0.30000980", + "chalk": "^2.4.2", + "normalize-range": "^0.1.2", + "num2fraction": "^1.2.2", + "postcss": "^7.0.17", + "postcss-value-parser": "^4.0.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" + } + } + } + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" + }, + "axobject-query": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-2.0.2.tgz", + "integrity": "sha512-MCeek8ZH7hKyO1rWUbKNQBbl4l2eY0ntk7OGi+q0RlafrCnfPxC06WZA+uebCfmYp4mNU9jRBP1AhGyf8+W3ww==", + "dev": true, + "requires": { + "ast-types-flow": "0.0.7" + } + }, + "babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", + "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", + "dev": true, + "requires": { + "object.assign": "^4.1.0" + } + }, + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "^1.0.1", + "class-utils": "^0.3.5", + "component-emitter": "^1.2.1", + "define-property": "^1.0.0", + "isobject": "^3.0.1", + "mixin-deep": "^1.2.0", + "pascalcase": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha1-mBjHngWbE1X5fgQooBfIOOkLqBI=", + "dev": true + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", + "integrity": "sha1-3DQxT05nkxgJP8dgJyUl+UvyXBY=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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 + }, + "binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "dev": true + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==", + "dev": true + }, + "blocking-proxy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/blocking-proxy/-/blocking-proxy-1.0.1.tgz", + "integrity": "sha512-KE8NFMZr3mN2E0HcvCgRtX7DjhiIQrwle+nSVJVC/yqFb9+xznHl2ZcoBp2L9qzkI4t4cBFJ1efXF8Dwi132RA==", + "optional": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==", + "dev": true + }, + "bn.js": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-5.1.3.tgz", + "integrity": "sha512-GkTiFpjFtUzU9CbMeJ5iazkCzGL3jrhzerzZIuqLABjbwRaFt33I9tUdSNryIptM+RxDet6OKm2WnLXzW51KsQ==", + "dev": true + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "bonjour": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/bonjour/-/bonjour-3.5.0.tgz", + "integrity": "sha1-jokKGD2O6aI5OzhExpGkK897yfU=", + "dev": true, + "requires": { + "array-flatten": "^2.1.0", + "deep-equal": "^1.0.1", + "dns-equal": "^1.0.0", + "dns-txt": "^2.0.2", + "multicast-dns": "^6.0.1", + "multicast-dns-service-types": "^1.1.0" + } + }, + "bootstrap": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz", + "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==" + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "brorand": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz", + "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=", + "dev": true + }, + "browserify-aes": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", + "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==", + "dev": true, + "requires": { + "buffer-xor": "^1.0.3", + "cipher-base": "^1.0.0", + "create-hash": "^1.1.0", + "evp_bytestokey": "^1.0.3", + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "browserify-cipher": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz", + "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==", + "dev": true, + "requires": { + "browserify-aes": "^1.0.4", + "browserify-des": "^1.0.0", + "evp_bytestokey": "^1.0.0" + } + }, + "browserify-des": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz", + "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "des.js": "^1.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "browserify-rsa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.1.0.tgz", + "integrity": "sha512-AdEER0Hkspgno2aR97SAf6vi0y0k8NuOpGnVH3O99rcA5Q6sh8QxcngtHuJ6uXwnfAXNM4Gn1Gb7/MV1+Ymbog==", + "dev": true, + "requires": { + "bn.js": "^5.0.0", + "randombytes": "^2.0.1" + } + }, + "browserify-sign": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", + "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "dev": true, + "requires": { + "bn.js": "^5.1.1", + "browserify-rsa": "^4.0.1", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "elliptic": "^6.5.3", + "inherits": "^2.0.4", + "parse-asn1": "^5.1.5", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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 + } + } + }, + "browserify-zlib": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz", + "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==", + "dev": true, + "requires": { + "pako": "~1.0.5" + } + }, + "browserslist": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.10.0.tgz", + "integrity": "sha512-TpfK0TDgv71dzuTsEAlQiHeWQ/tiPqgNZVdv046fvNtBZrjbv2O3TsWCDU0AWGJJKCF/KsjNdLzR9hXOsh/CfA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001035", + "electron-to-chromium": "^1.3.378", + "node-releases": "^1.1.52", + "pkg-up": "^3.1.0" + } + }, + "browserstack": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/browserstack/-/browserstack-1.6.1.tgz", + "integrity": "sha512-GxtFjpIaKdbAyzHfFDKixKO8IBT7wR3NjbzrGc78nNs/Ciys9wU3/nBtsqsWv5nDSrdI5tz0peKuzCPuNXNUiw==", + "optional": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "buffer": { + "version": "4.9.2", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", + "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==", + "dev": true, + "requires": { + "base64-js": "^1.0.2", + "ieee754": "^1.1.4", + "isarray": "^1.0.0" + } + }, + "buffer-from": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", + "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" + }, + "buffer-indexof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/buffer-indexof/-/buffer-indexof-1.1.1.tgz", + "integrity": "sha512-4/rOEg86jivtPTeOUUT61jJO1Ya1TrR/OkqCSZDyq84WJh3LuuiphBYJN+fm5xufIk4XAFcEwte/8WzC8If/1g==", + "dev": true + }, + "buffer-xor": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz", + "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "optional": true + }, + "builtin-status-codes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz", + "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=", + "dev": true + }, + "builtins": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", + "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "cacache": { + "version": "12.0.2", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.2.tgz", + "integrity": "sha512-ifKgxH2CKhJEg6tNdAwziu6Q33EvuG26tYcda6PT3WKisZcYDXsnEdnRv67Po3yCzFfaSoMjGZzJyD2c3DT1dg==", + "dev": true, + "requires": { + "bluebird": "^3.5.5", + "chownr": "^1.1.1", + "figgy-pudding": "^3.5.1", + "glob": "^7.1.4", + "graceful-fs": "^4.1.15", + "infer-owner": "^1.0.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "move-concurrently": "^1.0.1", + "promise-inflight": "^1.0.1", + "rimraf": "^2.6.3", + "ssri": "^6.0.1", + "unique-filename": "^1.1.1", + "y18n": "^4.0.0" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "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" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "^1.0.0", + "component-emitter": "^1.2.1", + "get-value": "^2.0.6", + "has-value": "^1.0.0", + "isobject": "^3.0.1", + "set-value": "^2.0.0", + "to-object-path": "^0.3.0", + "union-value": "^1.0.0", + "unset-value": "^1.0.0" + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "caller-callsite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz", + "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=", + "dev": true, + "requires": { + "callsites": "^2.0.0" + } + }, + "caller-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz", + "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=", + "dev": true, + "requires": { + "caller-callsite": "^2.0.0" + } + }, + "callsites": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz", + "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "optional": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "optional": true, + "requires": { + "camelcase": "^2.0.0", + "map-obj": "^1.0.0" + } + }, + "caniuse-lite": { + "version": "1.0.30001035", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001035.tgz", + "integrity": "sha512-C1ZxgkuA4/bUEdMbU5WrGY4+UhMFFiXrgNAfxiMIqWgFTWfv/xsZCS2xEHT2LMq7xAZfuAnu6mcqyDl0ZR6wLQ==", + "dev": true + }, + "canonical-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/canonical-path/-/canonical-path-1.0.0.tgz", + "integrity": "sha512-feylzsbDxi1gPZ1IjystzIQZagYYLvfKrSuygUCgf7z6x790VEzze5QEkdSV1U58RA7Hi0+v6fv4K54atOzATg==", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "optional": 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" + } + }, + "chardet": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", + "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", + "dev": true + }, + "chokidar": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.0.tgz", + "integrity": "sha512-JgQM9JS92ZbFR4P90EvmzNpSGhpPBGBSj10PILeDyYFwp4h2/D9OM03wsJ4zW1fEp4ka2DGrnUeD7FuvQ2aZ2Q==", + "dev": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.3.1", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.5.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==" + }, + "chrome-trace-event": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz", + "integrity": "sha512-9e/zx1jw7B4CO+c/RXoCsfg/x1AfUBioy4owYH0bJprEYAx5hRFLRhWBqHAG57D0ZM4H7vxbP7bPe0VwhQRYDQ==", + "dev": true, + "requires": { + "tslib": "^1.9.0" + } + }, + "cipher-base": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", + "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "circular-dependency-plugin": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.0.tgz", + "integrity": "sha512-7p4Kn/gffhQaavNfyDFg7LS5S/UT1JAjyGd4UqR2+jzoYF02eDkj0Ec3+48TsIa4zghjLY87nQHIh/ecK9qLdw==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "define-property": "^0.2.5", + "isobject": "^3.0.0", + "static-extend": "^0.1.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "clean-css": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz", + "integrity": "sha512-4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==", + "dev": true, + "requires": { + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "clean-stack": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz", + "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==", + "dev": true + }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "dev": true, + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "dev": true + }, + "cliui": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz", + "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==", + "requires": { + "string-width": "^3.1.0", + "strip-ansi": "^5.2.0", + "wrap-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=", + "dev": true + }, + "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" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "codelyzer": { + "version": "5.2.2", + "resolved": "https://registry.npmjs.org/codelyzer/-/codelyzer-5.2.2.tgz", + "integrity": "sha512-jB4FZ1Sx7kZhvZVdf+N2BaKTdrrNZOL0Bj10RRfrhHrb3zEvXjJvvq298JPMJAiyiCS/v4zs1QlGU0ip7xGqeA==", + "dev": true, + "requires": { + "app-root-path": "^2.2.1", + "aria-query": "^3.0.0", + "axobject-query": "2.0.2", + "css-selector-tokenizer": "^0.7.1", + "cssauron": "^1.4.0", + "damerau-levenshtein": "^1.0.4", + "semver-dsl": "^1.0.1", + "source-map": "^0.5.7", + "sprintf-js": "^1.1.2" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "sprintf-js": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz", + "integrity": "sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug==", + "dev": true + } + } + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "^1.0.0", + "object-visit": "^1.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==", + "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=" + }, + "colorette": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.1.tgz", + "integrity": "sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "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==" + }, + "commondir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", + "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=", + "dev": true + }, + "compare-versions": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/compare-versions/-/compare-versions-3.6.0.tgz", + "integrity": "sha512-W6Af2Iw1z4CB7q4uU4hv646dW9GQuBM+YpC0UvUCWSD8w90SJjp+ujJuXaEMtAXBtSqGfMPuFOVn4/+FlaqfBA==", + "dev": true + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=", + "dev": true + }, + "component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==", + "dev": true + }, + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=", + "dev": true + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dev": true, + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dev": true, + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "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=" + }, + "concat-stream": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", + "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^2.2.2", + "typedarray": "^0.0.6" + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "dev": true + }, + "console-browserify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz", + "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "optional": true + }, + "constants-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz", + "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=", + "dev": true + }, + "content-disposition": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", + "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", + "dev": true, + "requires": { + "safe-buffer": "5.1.2" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "convert-source-map": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz", + "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==", + "dev": true, + "requires": { + "safe-buffer": "~5.1.1" + } + }, + "cookie": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", + "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==", + "dev": true + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "copy-concurrently": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", + "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "fs-write-stream-atomic": "^1.0.8", + "iferr": "^0.1.5", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "copy-webpack-plugin": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-6.0.3.tgz", + "integrity": "sha512-q5m6Vz4elsuyVEIUXr7wJdIdePWTubsqVbEMvf1WQnHGv0Q+9yPRu7MtYFPt+GBOXRav9lvIINifTQ1vSCs+eA==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "fast-glob": "^3.2.4", + "find-cache-dir": "^3.3.1", + "glob-parent": "^5.1.1", + "globby": "^11.0.1", + "loader-utils": "^2.0.0", + "normalize-path": "^3.0.0", + "p-limit": "^3.0.1", + "schema-utils": "^2.7.0", + "serialize-javascript": "^4.0.0", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "emojis-list": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", + "dev": true + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "globby": { + "version": "11.0.2", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.0.2.tgz", + "integrity": "sha512-2ZThXDvvV8fYFRVIxnrMQBipZQDr7MxKAmQK1vujaj9/7eF0efG7BPUKJ7jP7G5SLF37xKDXvO4S/KKLj/Z0og==", + "dev": true, + "requires": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.1.1", + "ignore": "^5.1.4", + "merge2": "^1.3.0", + "slash": "^3.0.0" + } + }, + "json5": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz", + "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==", + "dev": true, + "requires": { + "minimist": "^1.2.5" + } + }, + "loader-utils": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz", + "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==", + "dev": true, + "requires": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "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" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + } + } + }, + "core-js": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.8.3.tgz", + "integrity": "sha512-KPYXeVZYemC2TkNEkX/01I+7yd+nX3KddKwZ1Ww7SKWdI2wQprSgLmrTddT8nw92AjEklTsPBoSdQBhbI1bQ6Q==" + }, + "core-js-compat": { + "version": "3.8.2", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.8.2.tgz", + "integrity": "sha512-LO8uL9lOIyRRrQmZxHZFl1RV+ZbcsAkFWTktn5SmH40WgLtSNYN4m4W2v9ONT147PxBY/XrRhrWq8TlvObyUjQ==", + "dev": true, + "requires": { + "browserslist": "^4.16.0", + "semver": "7.0.0" + }, + "dependencies": { + "browserslist": { + "version": "4.16.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.1.tgz", + "integrity": "sha512-UXhDrwqsNcpTYJBTZsbGATDxZbiVDsx6UjpmRUmtnP10pr8wAYr5LgFoEFw9ixriQH2mv/NX2SfGzE/o8GndLA==", + "dev": true, + "requires": { + "caniuse-lite": "^1.0.30001173", + "colorette": "^1.2.1", + "electron-to-chromium": "^1.3.634", + "escalade": "^3.1.1", + "node-releases": "^1.1.69" + } + }, + "caniuse-lite": { + "version": "1.0.30001174", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001174.tgz", + "integrity": "sha512-tqClL/4ThQq6cfFXH3oJL4rifFBeM6gTkphjao5kgwMaW9yn0tKgQLAEfKzDwj6HQWCB/aWo8kTFlSvIN8geEA==", + "dev": true + }, + "semver": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", + "dev": true + } + } + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + }, + "dependencies": { + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + } + } + }, + "coverage-istanbul-loader": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/coverage-istanbul-loader/-/coverage-istanbul-loader-2.0.3.tgz", + "integrity": "sha512-LiGRvyIuzVYs3M1ZYK1tF0HekjH0DJ8zFdUwAZq378EJzqOgToyb1690dp3TAUlP6Y+82uu42LRjuROVeJ54CA==", + "dev": true, + "requires": { + "convert-source-map": "^1.7.0", + "istanbul-lib-instrument": "^4.0.0", + "loader-utils": "^1.2.3", + "merge-source-map": "^1.1.0", + "schema-utils": "^2.6.1" + } + }, + "create-ecdh": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.4.tgz", + "integrity": "sha512-mf+TCx8wWc9VpuxfP2ht0iSISLZnt0JgWlrOKZiNqyUZWnjIaCIVNQArMHnCZKfEYRg6IM7A+NeJoN8gf/Ws0A==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "elliptic": "^6.5.3" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "create-hash": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz", + "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.1", + "inherits": "^2.0.1", + "md5.js": "^1.3.4", + "ripemd160": "^2.0.1", + "sha.js": "^2.4.0" + } + }, + "create-hmac": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz", + "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==", + "dev": true, + "requires": { + "cipher-base": "^1.0.3", + "create-hash": "^1.1.0", + "inherits": "^2.0.1", + "ripemd160": "^2.0.0", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "optional": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "crypto-browserify": { + "version": "3.12.0", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", + "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "dev": true, + "requires": { + "browserify-cipher": "^1.0.0", + "browserify-sign": "^4.0.0", + "create-ecdh": "^4.0.0", + "create-hash": "^1.1.0", + "create-hmac": "^1.1.0", + "diffie-hellman": "^5.0.0", + "inherits": "^2.0.1", + "pbkdf2": "^3.0.3", + "public-encrypt": "^4.0.0", + "randombytes": "^2.0.0", + "randomfill": "^1.0.3" + } + }, + "crypto-js": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/crypto-js/-/crypto-js-4.0.0.tgz", + "integrity": "sha512-bzHZN8Pn+gS7DQA6n+iUmBfl0hO5DJq++QP3U6uTucDtk/0iGpXd/Gg7CGR0p8tJhofJyaKoWBuJI4eAO00BBg==" + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=", + "dev": true + }, + "css-selector-tokenizer": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.3.tgz", + "integrity": "sha512-jWQv3oCEL5kMErj4wRnK/OPoBi0D+P1FR2cDCKYPaMeD2eW3/mttav8HT4hT1CKopiJI/psEULjkClhvJo4Lvg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "fastparse": "^1.1.2" + } + }, + "cssauron": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/cssauron/-/cssauron-1.4.0.tgz", + "integrity": "sha1-pmAt/34EqDBtwNuaVR6S6LVmKtg=", + "dev": true, + "requires": { + "through": "X.X.X" + } + }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "optional": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, + "custom-event": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", + "integrity": "sha1-XQKkaFCt8bSjF5RqOSj8y1v9BCU=", + "dev": true + }, + "cyclist": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", + "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=", + "dev": true + }, + "damerau-levenshtein": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.6.tgz", + "integrity": "sha512-JVrozIeElnj3QzfUIt8tB8YMluBJom4Vw9qTPpjGYQ9fYlB3D/rb6OordUxf3xeFB35LKWs0xqcO5U6ySvBtug==", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "date-format": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-3.0.0.tgz", + "integrity": "sha512-eyTcpKOcamdhWJXj56DpQMo1ylSQpcGtGKXcU0Tb97+K56/CF5amAqqqNj0+KvA0iw2ynxtHWFsPDSClCxe48w==", + "dev": true + }, + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "debuglog": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", + "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-equal": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", + "integrity": "sha512-yd9c5AdiqVcR+JjcwUQb9DkhJc8ngNr0MahEBGvDiJw8puWab2yZlh+nkasOnZP+EGTAP6rRp2JzJhJZzvNF8g==", + "dev": true, + "requires": { + "is-arguments": "^1.0.4", + "is-date-object": "^1.0.1", + "is-regex": "^1.0.4", + "object-is": "^1.0.1", + "object-keys": "^1.1.1", + "regexp.prototype.flags": "^1.2.0" + } + }, + "default-gateway": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-4.2.0.tgz", + "integrity": "sha512-h6sMrVB1VMWVrW13mSc6ia/DwYYw5MN6+exNu1OaJeFac5aSAvwM7lZ0NVfTABuSkQelr4h5oebg3KB1XPdjgA==", + "dev": true, + "requires": { + "execa": "^1.0.0", + "ip-regex": "^2.1.0" + } + }, + "default-require-extensions": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz", + "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=", + "dev": true, + "requires": { + "strip-bom": "^3.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + } + } + }, + "define-properties": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", + "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", + "dev": true, + "requires": { + "object-keys": "^1.0.12" + } + }, + "define-property": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", + "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==", + "dev": true, + "requires": { + "is-descriptor": "^1.0.2", + "isobject": "^3.0.1" + }, + "dependencies": { + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "optional": true, + "requires": { + "globby": "^5.0.0", + "is-path-cwd": "^1.0.0", + "is-path-in-cwd": "^1.0.0", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", + "dev": true + }, + "dependency-graph": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.7.2.tgz", + "integrity": "sha512-KqtH4/EZdtdfWX0p6MGP9jljvxSY6msy/pRUD4jgNwVpv3v1QmNLlsB3LDSSUg79BRVSn7jI1QPRtArGABovAQ==", + "dev": true + }, + "des.js": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", + "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0" + } + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "detect-node": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.0.4.tgz", + "integrity": "sha512-ZIzRpLJrOj7jjP2miAtgqIfmzbxa4ZOr5jJc601zklsfEx9oTzmmj2nVpIPRpNlRTIh8lc1kyViIY7BWSGNmKw==", + "dev": true + }, + "dezalgo": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", + "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", + "dev": true, + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, + "di": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/di/-/di-0.0.1.tgz", + "integrity": "sha1-gGZJMmzqp8qjMG112YXqJ0i6kTw=", + "dev": true + }, + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "optional": true + }, + "diffie-hellman": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz", + "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "miller-rabin": "^4.0.0", + "randombytes": "^2.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + }, + "dependencies": { + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + } + } + }, + "dns-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", + "integrity": "sha1-s55/HabrCnW6nBcySzR1PEfgZU0=", + "dev": true + }, + "dns-packet": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-1.3.1.tgz", + "integrity": "sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==", + "dev": true, + "requires": { + "ip": "^1.1.0", + "safe-buffer": "^5.0.1" + } + }, + "dns-txt": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/dns-txt/-/dns-txt-2.0.2.tgz", + "integrity": "sha1-uR2Ab10nGI5Ks+fRB9iBocxGQrY=", + "dev": true, + "requires": { + "buffer-indexof": "^1.0.0" + } + }, + "dom-serialize": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz", + "integrity": "sha1-ViromZ9Evl6jB29UGdzVnrQ6yVs=", + "dev": true, + "requires": { + "custom-event": "~1.0.0", + "ent": "~2.2.0", + "extend": "^3.0.0", + "void-elements": "^2.0.0" + } + }, + "domain-browser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz", + "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==", + "dev": true + }, + "domino": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/domino/-/domino-2.1.6.tgz", + "integrity": "sha512-3VdM/SXBZX2omc9JF9nOPCtDaYQ67BGp5CoLpIQlO2KCAPETs8TcDHacF26jXadGbvUteZzRTeos2fhID5+ucQ==" + }, + "duplexify": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", + "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", + "dev": true, + "requires": { + "end-of-stream": "^1.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.0.0", + "stream-shift": "^1.0.0" + } + }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "electron-to-chromium": { + "version": "1.3.636", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.636.tgz", + "integrity": "sha512-Adcvng33sd3gTjNIDNXGD1G4H6qCImIy2euUJAQHtLNplEKU5WEz5KRJxupRNIIT8sD5oFZLTKBWAf12Bsz24A==", + "dev": true + }, + "elliptic": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.3.tgz", + "integrity": "sha512-IMqzv5wNQf+E6aHeIqATs0tOLeOTwj1QKbRcS3jBbYkl5oLAserA8yJTT7/VyHUYG91PRmPyeQDObKLPpeS4dw==", + "dev": true, + "requires": { + "bn.js": "^4.4.0", + "brorand": "^1.0.1", + "hash.js": "^1.0.0", + "hmac-drbg": "^1.0.0", + "inherits": "^2.0.1", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.0" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "emoji-regex": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", + "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==" + }, + "emojis-list": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz", + "integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k=", + "dev": true + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", + "dev": true + }, + "encoding": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", + "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", + "dev": true, + "requires": { + "iconv-lite": "^0.6.2" + }, + "dependencies": { + "iconv-lite": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", + "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + } + } + } + }, + "end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "requires": { + "once": "^1.4.0" + } + }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-client": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.5.0.tgz", + "integrity": "sha512-12wPRfMrugVw/DNyJk34GQ5vIVArEcVMXWugQGGuw2XxUSztFNmJggZmv8IZlLyEdnpO1QB9LkcjeWewO2vxtA==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.5.4", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "ws": { + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.2.tgz", + "integrity": "sha512-T4tewALS3+qsrpGI/8dqNMLIVdq/g/85U98HPMa6F0m6xTbvhXU6RCQLqPH3+SlomNV/LdY6RXEbBpMH6EOJnA==", + "dev": true + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dev": true, + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "enhanced-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz", + "integrity": "sha512-F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "memory-fs": "^0.4.0", + "tapable": "^1.0.0" + } + }, + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha1-6WQhkyWiHQX0RGai9obtbOX13R0=", + "dev": true + }, + "env-paths": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.0.tgz", + "integrity": "sha512-6u0VYSCo/OW6IoD5WCLLy9JUGARbamfSavcNXry/eu8aHVFei6CD3Sw+VGX5alea1i9pgPHW0mbu6Xj0uBh7gA==", + "optional": true + }, + "err-code": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", + "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=", + "dev": true + }, + "errno": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz", + "integrity": "sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==", + "dev": true, + "requires": { + "prr": "~1.0.1" + } + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.17.7", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.7.tgz", + "integrity": "sha512-VBl/gnfcJ7OercKA9MVaegWsBHFjV492syMudcnQZvt/Dw8ezpcOHYZXa/J96O8vx+g4x65YKhxOwDUh63aS5g==", + "dev": true, + "requires": { + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-regex": "^1.1.1", + "object-inspect": "^1.8.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.1", + "string.prototype.trimend": "^1.0.1", + "string.prototype.trimstart": "^1.0.1" + } + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "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=" + }, + "eslint-scope": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.3.tgz", + "integrity": "sha512-p7VutNr1O/QrxysMo3E45FjYDTeXBy0iTltPFNSqKAIfjDSXC+4dj+qfyuD8bfAXrW/y6lW3O76VaYNPKfpKrg==", + "dev": true, + "requires": { + "esrecurse": "^4.1.0", + "estraverse": "^4.1.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "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 + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", + "dev": true + }, + "events": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/events/-/events-3.2.0.tgz", + "integrity": "sha512-/46HWwbfCX2xTawVfkKLGxMifJYQBWMwY1mjywRtb4c9x8l5NP3KoJtnIOiL1hfdRkIuYhETxQlo62IF8tcnlg==", + "dev": true + }, + "eventsource": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-1.0.7.tgz", + "integrity": "sha512-4Ln17+vVT0k8aWq+t/bF5arcS3EpT9gYtW66EPacdj/mAFevznsnyoHLPy2BA8gbIQeIHoPsvwmfBftfcG//BQ==", + "dev": true, + "requires": { + "original": "^1.0.0" + } + }, + "evp_bytestokey": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz", + "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==", + "dev": true, + "requires": { + "md5.js": "^1.3.4", + "safe-buffer": "^5.1.1" + } + }, + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "dependencies": { + "cross-spawn": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", + "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "requires": { + "nice-try": "^1.0.4", + "path-key": "^2.0.1", + "semver": "^5.5.0", + "shebang-command": "^1.2.0", + "which": "^1.2.9" + } + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "requires": { + "shebang-regex": "^1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "optional": true + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "^2.3.3", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "posix-character-classes": "^0.1.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "express": { + "version": "4.17.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.17.1.tgz", + "integrity": "sha512-mHJ9O79RqluphRrcw2X/GTh3k9tVv8YcoyY4Kkh4WDMUYKRZUq0h1o0w2rrrxBqM7VoeUVqgb27xlEMXTnYt4g==", + "dev": true, + "requires": { + "accepts": "~1.3.7", + "array-flatten": "1.1.1", + "body-parser": "1.19.0", + "content-disposition": "0.5.3", + "content-type": "~1.0.4", + "cookie": "0.4.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "~1.1.2", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "~1.1.2", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.5", + "qs": "6.7.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.1.2", + "send": "0.17.1", + "serve-static": "1.14.1", + "setprototypeof": "1.1.1", + "statuses": "~1.5.0", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==", + "dev": true + } + } + }, + "extend": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", + "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "^1.0.0", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "external-editor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", + "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", + "dev": true, + "requires": { + "chardet": "^0.7.0", + "iconv-lite": "^0.4.24", + "tmp": "^0.0.33" + }, + "dependencies": { + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "dev": true, + "requires": { + "os-tmpdir": "~1.0.2" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "^0.3.2", + "define-property": "^1.0.0", + "expand-brackets": "^2.1.4", + "extend-shallow": "^2.0.1", + "fragment-cache": "^0.2.1", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" + }, + "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==" + }, + "fast-glob": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.4.tgz", + "integrity": "sha512-kr/Oo6PX51265qeuCYsyGypiO5uJFgBS0jksyG7FUeCyQzNwYnzrNIMR1NXfkZXsMYXYLRAHgISHBz8gQcxKHQ==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.0", + "merge2": "^1.3.0", + "micromatch": "^4.0.2", + "picomatch": "^2.2.1" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" + }, + "fastparse": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz", + "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==", + "dev": true + }, + "fastq": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.10.0.tgz", + "integrity": "sha512-NL2Qc5L3iQEsyYzweq7qfgy5OtXCmGzGvhElGEd/SoFWEMOEczNh5s5ocaF01HDetxz+p8ecjNPA6cZxxIHmzA==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "faye-websocket": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.10.0.tgz", + "integrity": "sha1-TkkvjQTftviQA1B/btvy1QHnxvQ=", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + }, + "figgy-pudding": { + "version": "3.5.2", + "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", + "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==", + "dev": true + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "file-loader": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-4.2.0.tgz", + "integrity": "sha512-+xZnaK5R8kBJrHK0/6HRlrKNamvVS5rjyuju+rnyxRGuwUJwpAMsVzUl5dz6rK8brkzjV6JpcFNjp6NqV0g1OQ==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.0" + } + }, + "fileset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fileset/-/fileset-2.0.3.tgz", + "integrity": "sha1-jnVIqW08wjJ+5eZ0FocjozO7oqA=", + "dev": true, + "requires": { + "glob": "^7.0.3", + "minimatch": "^3.0.3" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.0.0.tgz", + "integrity": "sha512-t7ulV1fmbxh5G9l/492O1p5+EBbr3uwpt6odhFTMc+nWyhmbloe+ja9BZ8pIBtqFWhOmCWVjx+pTW4zDkFoclw==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.0", + "pkg-dir": "^4.1.0" + } + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "optional": true, + "requires": { + "path-exists": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "flatted": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz", + "integrity": "sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==", + "dev": true + }, + "flush-write-stream": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", + "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "readable-stream": "^2.3.6" + } + }, + "follow-redirects": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.13.1.tgz", + "integrity": "sha512-SSG5xmZh1mkPGyKzjZP8zLjltIfpW32Y5QpdNJyjcfGxK3qo3NDDkZOZSFiGn1A6SclQxY9GzEwAHQ3dmYRWpg==", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "^0.2.2" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "from2": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", + "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "readable-stream": "^2.0.0" + } + }, + "fs-extra": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", + "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^4.0.0", + "universalify": "^0.1.0" + } + }, + "fs-minipass": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz", + "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==", + "requires": { + "minipass": "^3.0.0" + } + }, + "fs-write-stream-atomic": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", + "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.2", + "iferr": "^0.1.5", + "imurmurhash": "^0.1.4", + "readable-stream": "1 || 2" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.1.tgz", + "integrity": "sha512-YR47Eg4hChJGAB1O3yEAOkGO+rlzutoICGqGo9EZ4lKWokzZRSyIW1QmTzqjtw8MJdj9srP869CuWw/hyzSiBw==", + "dev": true, + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "gaze": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz", + "integrity": "sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==", + "optional": true, + "requires": { + "globule": "^1.0.0" + } + }, + "genfun": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/genfun/-/genfun-5.0.0.tgz", + "integrity": "sha512-KGDOARWVga7+rnB3z9Sd2Letx515owfk0hSxHGuqjANb1M+x2bGZGqHLiozPsYMdM2OubeMni/Hpwmjq6qIUhA==", + "dev": true + }, + "gensync": { + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.0.2.tgz", + "integrity": "sha512-aeX0vrFm21ILl3+JpFFRNe9aUvp6VFZb2/CTbgLb8j75kOhvoNYjt9d8KA/tJG4gSo8nzEDedRl0h7vDmBYRVg==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "optional": true + }, + "get-stream": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", + "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", + "requires": { + "pump": "^3.0.0" + } + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "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-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "optional": true, + "requires": { + "array-union": "^1.0.1", + "arrify": "^1.0.0", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "globule": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/globule/-/globule-1.3.2.tgz", + "integrity": "sha512-7IDTQTIu2xzXkT+6mlluidnWo+BypnbSoEVVQCGfzqnl5Ik8d3e1d4wycb8Rj9tWW+Z39uPWsdlquqiqPCd/pA==", + "optional": true, + "requires": { + "glob": "~7.1.1", + "lodash": "~4.17.10", + "minimatch": "~3.0.2" + } + }, + "graceful-fs": { + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", + "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" + }, + "handle-thing": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" + }, + "har-validator": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", + "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", + "requires": { + "ajv": "^6.12.3", + "har-schema": "^2.0.0" + } + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "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=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dev": true, + "requires": { + "isarray": "2.0.1" + }, + "dependencies": { + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, + "has-symbols": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", + "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", + "dev": true + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "optional": true + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "^2.0.6", + "has-values": "^1.0.0", + "isobject": "^3.0.0" + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "hash-base": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", + "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "dev": true, + "requires": { + "inherits": "^2.0.4", + "readable-stream": "^3.6.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "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 + } + } + }, + "hash.js": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz", + "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "minimalistic-assert": "^1.0.1" + } + }, + "hmac-drbg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz", + "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=", + "dev": true, + "requires": { + "hash.js": "^1.0.3", + "minimalistic-assert": "^1.0.0", + "minimalistic-crypto-utils": "^1.0.1" + } + }, + "hosted-git-info": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.8.tgz", + "integrity": "sha512-f/wzC2QaWBs7t9IYqB4T3sR1xviIViXJRJTWBlx2Gf3g0Xi5vI7Yy4koXQ1c9OYDGHN9sBy1DQ2AB8fqZBWhUg==" + }, + "hpack.js": { + "version": "2.1.6", + "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", + "integrity": "sha1-h3dMCUnlE/QuhFdbPEVoH63ioLI=", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "html-entities": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.4.0.tgz", + "integrity": "sha512-8nxjcBcd8wovbeKx7h3wTji4e6+rhaVuPNpMqwWgnHh+N9ToqsCs6XztWRBPQ+UtzsoMAdKZtUENoVzU/EMtZA==", + "dev": true + }, + "html-escaper": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", + "dev": true + }, + "http-cache-semantics": { + "version": "3.8.1", + "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", + "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==", + "dev": true + }, + "http-deceiver": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", + "integrity": "sha1-+nFolEq5pRnTN8sL7HKE3D5yPYc=", + "dev": true + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dev": true, + "requires": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", + "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", + "dev": true, + "requires": { + "agent-base": "4", + "debug": "3.1.0" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "http-proxy-middleware": { + "version": "0.19.1", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz", + "integrity": "sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==", + "dev": true, + "requires": { + "http-proxy": "^1.17.0", + "is-glob": "^4.0.0", + "lodash": "^4.17.11", + "micromatch": "^3.1.10" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "https-browserify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", + "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=", + "dev": true + }, + "https-proxy-agent": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", + "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", + "requires": { + "agent-base": "^4.3.0", + "debug": "^3.1.0" + } + }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dev": true, + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "dev": true + }, + "iferr": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", + "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=", + "dev": true + }, + "ignore": { + "version": "5.1.8", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz", + "integrity": "sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==", + "dev": true + }, + "ignore-walk": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz", + "integrity": "sha512-m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==", + "dev": true, + "requires": { + "minimatch": "^3.0.4" + } + }, + "image-size": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz", + "integrity": "sha1-Cd/Uq50g4p6xw+gLiZA3jfnjy5w=", + "dev": true, + "optional": true + }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha1-nbHb0Pr43m++D13V5Wu2BigN5ps=", + "optional": true + }, + "import-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz", + "integrity": "sha1-qmzzbnInYShcs3HsZRn1PiQ1sKk=", + "dev": true, + "requires": { + "import-from": "^2.1.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "import-from": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/import-from/-/import-from-2.1.0.tgz", + "integrity": "sha1-M1238qev/VOqpHHUuAId7ja387E=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "import-local": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz", + "integrity": "sha512-b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==", + "dev": true, + "requires": { + "pkg-dir": "^3.0.0", + "resolve-cwd": "^2.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + } + } + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "optional": true, + "requires": { + "repeating": "^2.0.0" + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=", + "dev": true + }, + "infer-owner": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", + "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "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==" + }, + "ini": { + "version": "1.3.8", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", + "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==" + }, + "inquirer": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.1.tgz", + "integrity": "sha512-uxNHBeQhRXIoHWTSNYUFhQVrHYFThIt6IVo2fFmSe8aBwdR3/w6b58hJpiL/fMukFkvGzjg+hSxFtwvVmKZmXw==", + "dev": true, + "requires": { + "ansi-escapes": "^4.2.1", + "chalk": "^2.4.2", + "cli-cursor": "^3.1.0", + "cli-width": "^2.0.0", + "external-editor": "^3.0.3", + "figures": "^3.0.0", + "lodash": "^4.17.15", + "mute-stream": "0.0.8", + "run-async": "^2.2.0", + "rxjs": "^6.4.0", + "string-width": "^4.1.0", + "strip-ansi": "^5.1.0", + "through": "^2.3.6" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "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" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.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" + } + } + } + }, + "internal-ip": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/internal-ip/-/internal-ip-4.3.0.tgz", + "integrity": "sha512-S1zBo1D6zcsyuC6PMmY5+55YMILQ9av8lotMx447Bq6SAgo/sDK6y6uUKmuYhW7eacnIhFfsPmCNYdDzsnnDCg==", + "dev": true, + "requires": { + "default-gateway": "^4.2.0", + "ipaddr.js": "^1.9.0" + } + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "dev": true, + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", + "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==" + }, + "ip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", + "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=", + "dev": true + }, + "ip-regex": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ip-regex/-/ip-regex-2.1.0.tgz", + "integrity": "sha1-+ni/XS5pE8kRzp+BnuUUa7bYROk=", + "dev": true + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "dev": true + }, + "is-absolute-url": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz", + "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==", + "dev": true + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-arguments": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.0.tgz", + "integrity": "sha512-1Ij4lOMPl/xB5kBDn7I+b2ttPMKa8szhEIrXDuXQD/oe3HJLTLhqhgGspwgyGd6MOywBUqVvYicF72lkgDnIHg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-callable": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.2.tgz", + "integrity": "sha512-dnMqspv5nU3LoewK2N/y7KLtxtakvTuaCsU9FU50/QDmdbHNy/4/JuRtMHqRU22o3q+W89YQndQEeCVwK+3qrA==", + "dev": true + }, + "is-core-module": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", + "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", + "requires": { + "has": "^1.0.3" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-date-object": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", + "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", + "dev": true + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^0.1.6", + "is-data-descriptor": "^0.1.4", + "kind-of": "^5.0.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-directory": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz", + "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-finite": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", + "integrity": "sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", + "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, + "is-negative-zero": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz", + "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "optional": true + }, + "is-path-in-cwd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz", + "integrity": "sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ==", + "optional": true, + "requires": { + "is-path-inside": "^1.0.0" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "optional": true, + "requires": { + "path-is-inside": "^1.0.1" + } + }, + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + }, + "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-regex": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.1.tgz", + "integrity": "sha512-1+QkEcxiLlB7VEyFtyBg94e08OAsvq7FUBgApTq/w2ymCLyKJgDPsybBENVtA7XCQEgEXxKPonG+mvYRxh/LIg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-symbol": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", + "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "optional": true + }, + "is-windows": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", + "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", + "dev": true + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isbinaryfile": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.6.tgz", + "integrity": "sha512-ORrEy+SNVqUhrCaal4hA4fBzhggQQ+BaLntyPOdoEiwlKZW9BZiJXjg3RMiruE4tPEI3pyVPpySHQF/dKWperg==", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "istanbul-api": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/istanbul-api/-/istanbul-api-2.1.7.tgz", + "integrity": "sha512-LYTOa2UrYFyJ/aSczZi/6lBykVMjCCvUmT64gOe+jPZFy4w6FYfPGqFT2IiQ2BxVHHDOvCD7qrIXb0EOh4uGWw==", + "dev": true, + "requires": { + "async": "^2.6.2", + "compare-versions": "^3.4.0", + "fileset": "^2.0.3", + "istanbul-lib-coverage": "^2.0.5", + "istanbul-lib-hook": "^2.0.7", + "istanbul-lib-instrument": "^3.3.0", + "istanbul-lib-report": "^2.0.8", + "istanbul-lib-source-maps": "^3.0.6", + "istanbul-reports": "^2.2.5", + "js-yaml": "^3.13.1", + "make-dir": "^2.1.0", + "minimatch": "^3.0.4", + "once": "^1.4.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "istanbul-lib-instrument": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.3.0.tgz", + "integrity": "sha512-5nnIN4vo5xQZHdXno/YDXJ0G+I3dAm4XgzfSVTPLQpj/zAV2dV6Juy0yaf10/zrJOJeHoN3fraFe+XRq2bFVZA==", + "dev": true, + "requires": { + "@babel/generator": "^7.4.0", + "@babel/parser": "^7.4.3", + "@babel/template": "^7.4.0", + "@babel/traverse": "^7.4.3", + "@babel/types": "^7.4.0", + "istanbul-lib-coverage": "^2.0.5", + "semver": "^6.0.0" + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + } + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-coverage": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.0.0.tgz", + "integrity": "sha512-UiUIqxMgRDET6eR+o5HbfRYP1l0hqkWOs7vNxC/mggutCMUIhWMm8gAHb8tHlyfD3/l6rlgNA5cKdDzEAf6hEg==", + "dev": true + }, + "istanbul-lib-hook": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.7.tgz", + "integrity": "sha512-vrRztU9VRRFDyC+aklfLoeXyNdTfga2EI3udDGn4cZ6fpSXpHLV9X6CHvfoMCPtggg8zvDDmC4b9xfu0z6/llA==", + "dev": true, + "requires": { + "append-transform": "^1.0.0" + } + }, + "istanbul-lib-instrument": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-4.0.3.tgz", + "integrity": "sha512-BXgQl9kf4WTCPCCpmFGoJkz/+uhvm7h7PFKUYxh7qarQd3ER33vHG//qaE8eN25l07YqZPpHXU9I09l/RD5aGQ==", + "dev": true, + "requires": { + "@babel/core": "^7.7.5", + "@istanbuljs/schema": "^0.1.2", + "istanbul-lib-coverage": "^3.0.0", + "semver": "^6.3.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "istanbul-lib-report": { + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.8.tgz", + "integrity": "sha512-fHBeG573EIihhAblwgxrSenp0Dby6tJMFR/HvlerBsrCTD5bkUuoNtn3gVh29ZCS824cGGBPn7Sg7cNk+2xUsQ==", + "dev": true, + "requires": { + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "istanbul-lib-source-maps": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.6.tgz", + "integrity": "sha512-R47KzMtDJH6X4/YW9XTx+jrLnZnscW4VpNN+1PViSYTejLVPWv7oov+Duf8YQSPyVRUvueQqz1TcsC6mooZTXw==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "istanbul-lib-coverage": "^2.0.5", + "make-dir": "^2.1.0", + "rimraf": "^2.6.3", + "source-map": "^0.6.1" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "istanbul-lib-coverage": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.5.tgz", + "integrity": "sha512-8aXznuEPCJvGnMSRft4udDRDtb1V3pkQkMMI5LI+6HuQz5oQ4J2UFn1H82raA3qJtyOLkkwVqICBQkjnGtn5mA==", + "dev": true + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "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" + } + }, + "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 + } + } + }, + "istanbul-reports": { + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.7.tgz", + "integrity": "sha512-uu1F/L1o5Y6LzPVSVZXNOoD/KXpJue9aeLRd0sM9uMXfZvzomB0WxVamWb5ue8kA2vVWEmW7EG+A5n3f1kqHKg==", + "dev": true, + "requires": { + "html-escaper": "^2.0.0" + } + }, + "jasmine": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine/-/jasmine-2.8.0.tgz", + "integrity": "sha1-awicChFXax8W3xG4AUbZHU6Lij4=", + "optional": true, + "requires": { + "exit": "^0.1.2", + "glob": "^7.0.6", + "jasmine-core": "~2.8.0" + }, + "dependencies": { + "jasmine-core": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-2.8.0.tgz", + "integrity": "sha1-vMl5rh+f0FcB5F5S5l06XWPxok4=", + "optional": true + } + } + }, + "jasmine-core": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.5.0.tgz", + "integrity": "sha512-nCeAiw37MIMA9w9IXso7bRaLl+c/ef3wnxsoSAlYrzS+Ot0zTG6nU8G/cIfGkqpkjX2wNaIW9RFG0TwIFnG6bA==", + "dev": true + }, + "jasmine-spec-reporter": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/jasmine-spec-reporter/-/jasmine-spec-reporter-4.2.1.tgz", + "integrity": "sha512-FZBoZu7VE5nR7Nilzy+Np8KuVIOxF4oXDPDknehCYBDE080EnlPu0afdZNmpGDBRCUBv3mj5qgqCRmk6W/K8vg==", + "dev": true, + "requires": { + "colors": "1.1.2" + } + }, + "jasminewd2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/jasminewd2/-/jasminewd2-2.2.0.tgz", + "integrity": "sha1-43zwsX8ZnM4jvqcbIDk5Uka07E4=", + "optional": true + }, + "jest-worker": { + "version": "24.9.0", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-24.9.0.tgz", + "integrity": "sha512-51PE4haMSXcHohnSMdM42anbvZANYTqMrr52tVKPqqsPJMzoP6FYYDVqahX/HrAoKEKz3uUPzSvKs9A3qR4iVw==", + "dev": true, + "requires": { + "merge-stream": "^2.0.0", + "supports-color": "^6.1.0" + }, + "dependencies": { + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "jquery": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.5.1.tgz", + "integrity": "sha512-XwIBPqcMn57FxfT+Go5pzySnm4KWkT1Tv7gjrpT1srtf8Weynl6R273VJ5GjkRb51IzMp5nbaPjJXMWeju2MKg==" + }, + "js-base64": { + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz", + "integrity": "sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==", + "optional": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" + }, + "jsesc": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "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-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "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==" + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.3.tgz", + "integrity": "sha512-c7/8mbUsKigAbLkD5B010BK4D9LZm7A1pNItkEwiUZRpIN66exu/e7YQWysGun+TRKaJp8MhemM+VkfWv42aCA==", + "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" + } + }, + "jsonfile": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", + "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6" + } + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "jszip": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/jszip/-/jszip-3.5.0.tgz", + "integrity": "sha512-WRtu7TPCmYePR1nazfrtuF216cIVon/3GWOvHS9QR5bIwSbnxtdpma6un3jyGGNhHsKCSzn5Ypk+EkDRvTGiFA==", + "optional": true, + "requires": { + "lie": "~3.3.0", + "pako": "~1.0.2", + "readable-stream": "~2.3.6", + "set-immediate-shim": "~1.0.1" + } + }, + "karma": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/karma/-/karma-5.2.3.tgz", + "integrity": "sha512-tHdyFADhVVPBorIKCX8A37iLHxc6RBRphkSoQ+MLKdAtFn1k97tD8WUGi1KlEtDZKL3hui0qhsY9HXUfSNDYPQ==", + "dev": true, + "requires": { + "body-parser": "^1.19.0", + "braces": "^3.0.2", + "chokidar": "^3.4.2", + "colors": "^1.4.0", + "connect": "^3.7.0", + "di": "^0.0.1", + "dom-serialize": "^2.2.1", + "glob": "^7.1.6", + "graceful-fs": "^4.2.4", + "http-proxy": "^1.18.1", + "isbinaryfile": "^4.0.6", + "lodash": "^4.17.19", + "log4js": "^6.2.1", + "mime": "^2.4.5", + "minimatch": "^3.0.4", + "qjobs": "^1.2.0", + "range-parser": "^1.2.1", + "rimraf": "^3.0.2", + "socket.io": "^2.3.0", + "source-map": "^0.6.1", + "tmp": "0.2.1", + "ua-parser-js": "0.7.22", + "yargs": "^15.3.1" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "dev": true + }, + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "colors": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.4.0.tgz", + "integrity": "sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA==", + "dev": true + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "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" + } + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "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" + } + }, + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true + }, + "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" + } + }, + "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 + }, + "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 + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dev": true, + "requires": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + } + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dev": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "karma-chrome-launcher": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/karma-chrome-launcher/-/karma-chrome-launcher-3.1.0.tgz", + "integrity": "sha512-3dPs/n7vgz1rxxtynpzZTvb9y/GIaW8xjAwcIGttLbycqoFtI7yo1NGnQi6oFTherRE+GIhCAHZC4vEqWGhNvg==", + "dev": true, + "requires": { + "which": "^1.2.1" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "karma-coverage-istanbul-reporter": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/karma-coverage-istanbul-reporter/-/karma-coverage-istanbul-reporter-2.1.1.tgz", + "integrity": "sha512-CH8lTi8+kKXGvrhy94+EkEMldLCiUA0xMOiL31vvli9qK0T+qcXJAwWBRVJWnVWxYkTmyWar8lPz63dxX6/z1A==", + "dev": true, + "requires": { + "istanbul-api": "^2.1.6", + "minimatch": "^3.0.4" + } + }, + "karma-jasmine": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/karma-jasmine/-/karma-jasmine-2.0.1.tgz", + "integrity": "sha512-iuC0hmr9b+SNn1DaUD2QEYtUxkS1J+bSJSn7ejdEexs7P8EYvA1CWkEdrDQ+8jVH3AgWlCNwjYsT1chjcNW9lA==", + "dev": true, + "requires": { + "jasmine-core": "^3.3" + } + }, + "karma-jasmine-html-reporter": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.5.4.tgz", + "integrity": "sha512-PtilRLno5O6wH3lDihRnz0Ba8oSn0YUJqKjjux1peoYGwo0AQqrWRbdWk/RLzcGlb+onTyXAnHl6M+Hu3UxG/Q==", + "dev": true + }, + "karma-source-map-support": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/karma-source-map-support/-/karma-source-map-support-1.4.0.tgz", + "integrity": "sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==", + "dev": true, + "requires": { + "source-map-support": "^0.5.5" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "killable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz", + "integrity": "sha512-LzqtLKlUwirEUyl/nicirVmNiPvYs7l5n8wOPP7fyJVpUPkvCnW/vuiXGpylGUlnPDnB7311rARzAt3Mhswpjg==", + "dev": true + }, + "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 + }, + "lcid": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", + "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", + "requires": { + "invert-kv": "^2.0.0" + } + }, + "less": { + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/less/-/less-3.9.0.tgz", + "integrity": "sha512-31CmtPEZraNUtuUREYjSqRkeETFdyEHSEPAGq4erDlUXtda7pzNmctdljdIagSb589d/qXGWiiP31R5JVf+v0w==", + "dev": true, + "requires": { + "clone": "^2.1.2", + "errno": "^0.1.1", + "graceful-fs": "^4.1.2", + "image-size": "~0.5.0", + "mime": "^1.4.1", + "mkdirp": "^0.5.0", + "promise": "^7.1.1", + "request": "^2.83.0", + "source-map": "~0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, + "less-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/less-loader/-/less-loader-5.0.0.tgz", + "integrity": "sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==", + "dev": true, + "requires": { + "clone": "^2.1.1", + "loader-utils": "^1.1.0", + "pify": "^4.0.1" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "leven": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", + "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", + "dev": true + }, + "levenary": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/levenary/-/levenary-1.1.1.tgz", + "integrity": "sha512-mkAdOIt79FD6irqjYSs4rdbnlT5vRonMEvBVPVb3XmevfS8kgRXwfes0dhPdEtzTWD/1eNE/Bm/G1iRt6DcnQQ==", + "dev": true, + "requires": { + "leven": "^3.1.0" + } + }, + "license-webpack-plugin": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/license-webpack-plugin/-/license-webpack-plugin-2.1.2.tgz", + "integrity": "sha512-7poZHRla+ae0eEButlwMrPpkXyhNVBf2EHePYWT0jyLnI6311/OXJkTI2sOIRungRpQgU2oDMpro5bSFPT5F0A==", + "dev": true, + "requires": { + "@types/webpack-sources": "^0.1.5", + "webpack-sources": "^1.2.0" + } + }, + "lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "optional": true, + "requires": { + "immediate": "~3.0.5" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "parse-json": "^2.2.0", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0", + "strip-bom": "^2.0.0" + } + }, + "loader-runner": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-2.4.0.tgz", + "integrity": "sha512-Jsmr89RcXGIwivFY21FcRrisYZfvLMTWx5kOLc+JTxtpBOG6xML0vzbc6SEQG2FO9/4Fc3wW4LVcB5DmGflaRw==", + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" + } + } + }, + "lodash": { + "version": "4.17.20", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.20.tgz", + "integrity": "sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==" + }, + "lodash.clonedeep": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", + "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=", + "dev": true + }, + "log4js": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/log4js/-/log4js-6.3.0.tgz", + "integrity": "sha512-Mc8jNuSFImQUIateBFwdOQcmC6Q5maU0VVvdC2R6XMb66/VnT+7WS4D/0EeNMZu1YODmJe5NIn2XftCzEocUgw==", + "dev": true, + "requires": { + "date-format": "^3.0.0", + "debug": "^4.1.1", + "flatted": "^2.0.1", + "rfdc": "^1.1.4", + "streamroller": "^2.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "loglevel": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.7.1.tgz", + "integrity": "sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==", + "dev": true + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "optional": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "magic-string": { + "version": "0.25.3", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.3.tgz", + "integrity": "sha512-6QK0OpF/phMz0Q2AxILkX2mFhi7m+WMwTRg0LQKq/WBB0cDP4rYH3Wp4/d3OTXlrPLVJT/RFqj8tFeAR4nk8AA==", + "dev": true, + "requires": { + "sourcemap-codec": "^1.4.4" + } + }, + "make-dir": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", + "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "dev": true, + "requires": { + "semver": "^6.0.0" + }, + "dependencies": { + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + } + } + }, + "make-error": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "optional": true + }, + "make-fetch-happen": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", + "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", + "dev": true, + "requires": { + "agentkeepalive": "^3.4.1", + "cacache": "^12.0.0", + "http-cache-semantics": "^3.8.1", + "http-proxy-agent": "^2.1.0", + "https-proxy-agent": "^2.2.3", + "lru-cache": "^5.1.1", + "mississippi": "^3.0.0", + "node-fetch-npm": "^2.0.2", + "promise-retry": "^1.1.1", + "socks-proxy-agent": "^4.0.0", + "ssri": "^6.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "mamacro": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/mamacro/-/mamacro-0.0.3.tgz", + "integrity": "sha512-qMEwh+UujcQ+kbz3T6V+wAmO2U8veoq2w+3wY8MquqwVA3jChfwY+Tk52GZKDfACEPjuZ7r2oJLejwpt8jtwTA==", + "dev": true + }, + "map-age-cleaner": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", + "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", + "requires": { + "p-defer": "^1.0.0" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "optional": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "^1.0.0" + } + }, + "md5.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz", + "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1", + "safe-buffer": "^5.1.2" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "mem": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", + "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", + "requires": { + "map-age-cleaner": "^0.1.1", + "mimic-fn": "^2.0.0", + "p-is-promise": "^2.0.0" + } + }, + "memory-fs": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz", + "integrity": "sha1-OpoguEYlI+RHz7x+i7gO1me/xVI=", + "dev": true, + "requires": { + "errno": "^0.1.3", + "readable-stream": "^2.0.1" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "optional": true, + "requires": { + "camelcase-keys": "^2.0.0", + "decamelize": "^1.1.2", + "loud-rejection": "^1.0.0", + "map-obj": "^1.0.1", + "minimist": "^1.1.3", + "normalize-package-data": "^2.3.4", + "object-assign": "^4.0.1", + "read-pkg-up": "^1.0.1", + "redent": "^1.0.0", + "trim-newlines": "^1.0.0" + } + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "merge-source-map": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz", + "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==", + "dev": true, + "requires": { + "source-map": "^0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "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 + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "miller-rabin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz", + "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==", + "dev": true, + "requires": { + "bn.js": "^4.0.0", + "brorand": "^1.0.1" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true + }, + "mime-db": { + "version": "1.45.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", + "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" + }, + "mime-types": { + "version": "2.1.28", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", + "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", + "requires": { + "mime-db": "1.45.0" + } + }, + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "mini-css-extract-plugin": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.8.0.tgz", + "integrity": "sha512-MNpRGbNA52q6U92i0qbVpQNsgk7LExy41MdAlG84FeytfDOtRIf/mCHdEgG8rpTKOaNKiqUnZdlptF469hxqOw==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "normalize-url": "1.9.1", + "schema-utils": "^1.0.0", + "webpack-sources": "^1.1.0" + }, + "dependencies": { + "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" + } + } + } + }, + "minimalistic-assert": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", + "dev": true + }, + "minimalistic-crypto-utils": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz", + "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "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==" + }, + "minipass": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", + "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==", + "requires": { + "yallist": "^4.0.0" + } + }, + "minipass-collect": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz", + "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-flush": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", + "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minipass-pipeline": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz", + "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "mississippi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", + "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", + "dev": true, + "requires": { + "concat-stream": "^1.5.0", + "duplexify": "^3.4.2", + "end-of-stream": "^1.1.0", + "flush-write-stream": "^1.0.0", + "from2": "^2.1.0", + "parallel-transform": "^1.1.0", + "pump": "^3.0.0", + "pumpify": "^1.3.3", + "stream-each": "^1.1.0", + "through2": "^2.0.0" + } + }, + "mixin-deep": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz", + "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==", + "dev": true, + "requires": { + "for-in": "^1.0.2", + "is-extendable": "^1.0.1" + }, + "dependencies": { + "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==", + "dev": true, + "requires": { + "is-plain-object": "^2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "requires": { + "minimist": "^1.2.5" + } + }, + "move-concurrently": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", + "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", + "dev": true, + "requires": { + "aproba": "^1.1.1", + "copy-concurrently": "^1.0.0", + "fs-write-stream-atomic": "^1.0.8", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.4", + "run-queue": "^1.0.3" + }, + "dependencies": { + "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" + } + } + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "multicast-dns": { + "version": "6.2.3", + "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-6.2.3.tgz", + "integrity": "sha512-ji6J5enbMyGRHIAkAOu3WdV8nggqviKCEKtXcOqfphZZtQrmHKycfynJ2V7eVPUA4NhJ6V7Wf4TmGbTwKE9B6g==", + "dev": true, + "requires": { + "dns-packet": "^1.3.1", + "thunky": "^1.0.2" + } + }, + "multicast-dns-service-types": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz", + "integrity": "sha1-iZ8R2WhuXgXLkbNdXw5jt3PPyQE=", + "dev": true + }, + "mute-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz", + "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==", + "dev": true + }, + "nan": { + "version": "2.14.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", + "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", + "optional": true + }, + "nanomatch": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz", + "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "fragment-cache": "^0.2.1", + "is-windows": "^1.0.2", + "kind-of": "^6.0.2", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.1" + } + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "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 + }, + "nice-try": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", + "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" + }, + "node-fetch-npm": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", + "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", + "dev": true, + "requires": { + "encoding": "^0.1.11", + "json-parse-better-errors": "^1.0.0", + "safe-buffer": "^5.1.1" + } + }, + "node-forge": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz", + "integrity": "sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA==", + "dev": true + }, + "node-gyp": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-7.1.2.tgz", + "integrity": "sha512-CbpcIo7C3eMu3dL1c3d0xw449fHIGALIJsRP4DDPHpyiW8vcriNY7ubh9TE4zEKfSxscY7PjeFnshE7h75ynjQ==", + "optional": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.3", + "nopt": "^5.0.0", + "npmlog": "^4.1.2", + "request": "^2.88.2", + "rimraf": "^3.0.2", + "semver": "^7.3.2", + "tar": "^6.0.2", + "which": "^2.0.2" + }, + "dependencies": { + "semver": { + "version": "7.3.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.4.tgz", + "integrity": "sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw==", + "optional": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "node-libs-browser": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz", + "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==", + "dev": true, + "requires": { + "assert": "^1.1.1", + "browserify-zlib": "^0.2.0", + "buffer": "^4.3.0", + "console-browserify": "^1.1.0", + "constants-browserify": "^1.0.0", + "crypto-browserify": "^3.11.0", + "domain-browser": "^1.1.1", + "events": "^3.0.0", + "https-browserify": "^1.0.0", + "os-browserify": "^0.3.0", + "path-browserify": "0.0.1", + "process": "^0.11.10", + "punycode": "^1.2.4", + "querystring-es3": "^0.2.0", + "readable-stream": "^2.3.3", + "stream-browserify": "^2.0.1", + "stream-http": "^2.7.2", + "string_decoder": "^1.0.0", + "timers-browserify": "^2.0.4", + "tty-browserify": "0.0.0", + "url": "^0.11.0", + "util": "^0.11.0", + "vm-browserify": "^1.0.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "node-releases": { + "version": "1.1.69", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.69.tgz", + "integrity": "sha512-DGIjo79VDEyAnRlfSqYTsy+yoHd2IOjJiKUozD2MV2D85Vso6Bug56mb9tT/fY5Urt0iqk01H7x+llAruDR2zA==", + "dev": true + }, + "node-sass": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/node-sass/-/node-sass-5.0.0.tgz", + "integrity": "sha512-opNgmlu83ZCF792U281Ry7tak9IbVC+AKnXGovcQ8LG8wFaJv6cLnRlc6DIHlmNxWEexB5bZxi9SZ9JyUuOYjw==", + "optional": true, + "requires": { + "async-foreach": "^0.1.3", + "chalk": "^1.1.1", + "cross-spawn": "^7.0.3", + "gaze": "^1.0.0", + "get-stdin": "^4.0.1", + "glob": "^7.0.3", + "lodash": "^4.17.15", + "meow": "^3.7.0", + "mkdirp": "^0.5.1", + "nan": "^2.13.2", + "node-gyp": "^7.1.0", + "npmlog": "^4.0.0", + "request": "^2.88.0", + "sass-graph": "2.2.5", + "stdout-stream": "^1.4.0", + "true-case-path": "^1.0.2" + } + }, + "nopt": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz", + "integrity": "sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==", + "optional": true, + "requires": { + "abbrev": "1" + } + }, + "normalize-package-data": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", + "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", + "requires": { + "hosted-git-info": "^2.1.4", + "resolve": "^1.10.0", + "semver": "2 || 3 || 4 || 5", + "validate-npm-package-license": "^3.0.1" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha1-LRDAa9/TEuqXd2laTShDlFa3WUI=", + "dev": true + }, + "normalize-url": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz", + "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=", + "dev": true, + "requires": { + "object-assign": "^4.0.1", + "prepend-http": "^1.0.0", + "query-string": "^4.1.0", + "sort-keys": "^1.0.0" + } + }, + "npm-bundled": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz", + "integrity": "sha512-gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==", + "dev": true, + "requires": { + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-normalize-package-bin": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", + "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==", + "dev": true + }, + "npm-package-arg": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", + "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", + "dev": true, + "requires": { + "hosted-git-info": "^2.6.0", + "osenv": "^0.1.5", + "semver": "^5.5.0", + "validate-npm-package-name": "^3.0.0" + } + }, + "npm-packlist": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz", + "integrity": "sha512-5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==", + "dev": true, + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1", + "npm-normalize-package-bin": "^1.0.1" + } + }, + "npm-pick-manifest": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-3.0.2.tgz", + "integrity": "sha512-wNprTNg+X5nf+tDi+hbjdHhM4bX+mKqv6XmPh7B5eG+QY9VARfQPfCEH013H5GqfNj6ee8Ij2fg8yk0mzps1Vw==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "npm-registry-fetch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", + "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", + "dev": true, + "requires": { + "JSONStream": "^1.3.4", + "bluebird": "^3.5.1", + "figgy-pudding": "^3.4.1", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "npm-package-arg": "^6.1.0", + "safe-buffer": "^5.2.0" + }, + "dependencies": { + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "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 + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "requires": { + "path-key": "^2.0.0" + }, + "dependencies": { + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" + } + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "num2fraction": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz", + "integrity": "sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "oauth-sign": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", + "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "^0.1.0", + "define-property": "^0.2.5", + "kind-of": "^3.0.3" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "object-inspect": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz", + "integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==", + "dev": true + }, + "object-is": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.4.tgz", + "integrity": "sha512-1ZvAZ4wlF7IyPVOcE1Omikt7UpaFlOQq0HlSti+ZvDH3UiD2brwGMwDbyV43jao2bKJ+4+WdPJHSd7kgzKYVqg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "^3.0.0" + } + }, + "object.assign": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", + "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "has-symbols": "^1.0.1", + "object-keys": "^1.1.1" + } + }, + "object.getownpropertydescriptors": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.1.tgz", + "integrity": "sha512-6DtXgZ/lIZ9hqx4GtZETobXLR/ZLaa0aqV0kzbn80Rf8Z2e/XFnhA0I7p07N2wH8bBBltr2xQPi6sbKWAY2Eng==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3", + "es-abstract": "^1.18.0-next.1" + }, + "dependencies": { + "es-abstract": { + "version": "1.18.0-next.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0-next.2.tgz", + "integrity": "sha512-Ih4ZMFHEtZupnUh6497zEL4y2+w8+1ljnCyaTa+adcoafI1GOvMwFlDjBLfWR7y9VLfrjRJe9ocuHY1PSR9jjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2", + "has": "^1.0.3", + "has-symbols": "^1.0.1", + "is-callable": "^1.2.2", + "is-negative-zero": "^2.0.1", + "is-regex": "^1.1.1", + "object-inspect": "^1.9.0", + "object-keys": "^1.1.1", + "object.assign": "^4.1.2", + "string.prototype.trimend": "^1.0.3", + "string.prototype.trimstart": "^1.0.3" + } + } + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "^3.0.1" + } + }, + "obuf": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", + "dev": true + }, + "oidc-client": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/oidc-client/-/oidc-client-1.11.3.tgz", + "integrity": "sha512-kMA5KRP++88nn3nxogwDA4p8jH+YwyoA1JxxVHA9YZFgYqcnK8qjc6WLEoOBheKbxQSl89r0gDh8+zscZHmGlw==", + "requires": { + "acorn": "^7.4.1", + "base64-js": "^1.5.1", + "core-js": "^3.8.3", + "crypto-js": "^4.0.0", + "serialize-javascript": "^4.0.0" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "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" + } + }, + "open": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.4.0.tgz", + "integrity": "sha512-IFenVPgF70fSm1keSd2iDBIDIBZkroLeuffXq+wKTzTJlBpesFWojV9lb8mzOfaAzM1sr7HQHuO0vtV0zYekGg==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "opn": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", + "dev": true, + "requires": { + "is-wsl": "^1.1.0" + } + }, + "original": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.2.tgz", + "integrity": "sha512-hyBVl6iqqUOJ8FqRe+l/gS8H+kKYjrEndd5Pm1MfBtsEKA038HkkdbAl/72EAXGyonD/PFsvmVG+EvcIpliMBg==", + "dev": true, + "requires": { + "url-parse": "^1.4.3" + } + }, + "os-browserify": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz", + "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", + "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", + "requires": { + "execa": "^1.0.0", + "lcid": "^2.0.0", + "mem": "^4.0.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "dev": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "p-defer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" + }, + "p-is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", + "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==" + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "requires": { + "p-limit": "^2.0.0" + } + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "p-retry": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-3.0.1.tgz", + "integrity": "sha512-XE6G4+YTTkT2a0UWb2kjZe8xNwf8bIbnqpc/IS/idOBVhyves0mK5OJgeocjx7q5pvX/6m23xuzVPYT1uGM73w==", + "dev": true, + "requires": { + "retry": "^0.12.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==" + }, + "pacote": { + "version": "9.5.5", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-9.5.5.tgz", + "integrity": "sha512-jAEP+Nqj4kyMWyNpfTU/Whx1jA7jEc5cCOlurm0/0oL+v8TAp1QSsK83N7bYe+2bEdFzMAtPG5TBebjzzGV0cA==", + "dev": true, + "requires": { + "bluebird": "^3.5.3", + "cacache": "^12.0.2", + "figgy-pudding": "^3.5.1", + "get-stream": "^4.1.0", + "glob": "^7.1.3", + "infer-owner": "^1.0.4", + "lru-cache": "^5.1.1", + "make-fetch-happen": "^5.0.0", + "minimatch": "^3.0.4", + "minipass": "^2.3.5", + "mississippi": "^3.0.0", + "mkdirp": "^0.5.1", + "normalize-package-data": "^2.4.0", + "npm-package-arg": "^6.1.0", + "npm-packlist": "^1.1.12", + "npm-pick-manifest": "^2.2.3", + "npm-registry-fetch": "^4.0.0", + "osenv": "^0.1.5", + "promise-inflight": "^1.0.1", + "promise-retry": "^1.1.1", + "protoduck": "^5.0.1", + "rimraf": "^2.6.2", + "safe-buffer": "^5.1.2", + "semver": "^5.6.0", + "ssri": "^6.0.1", + "tar": "^4.4.8", + "unique-filename": "^1.1.1", + "which": "^1.3.1" + }, + "dependencies": { + "chownr": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", + "dev": true + }, + "fs-minipass": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz", + "integrity": "sha512-GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==", + "dev": true, + "requires": { + "minipass": "^2.6.0" + } + }, + "lru-cache": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", + "dev": true, + "requires": { + "yallist": "^3.0.2" + } + }, + "minipass": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz", + "integrity": "sha512-wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==", + "dev": true, + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + } + }, + "minizlib": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", + "integrity": "sha512-6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==", + "dev": true, + "requires": { + "minipass": "^2.9.0" + } + }, + "npm-pick-manifest": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.2.3.tgz", + "integrity": "sha512-+IluBC5K201+gRU85vFlUwX3PFShZAbAgDNp2ewJdWMVSppdo/Zih0ul2Ecky/X7b51J7LrrUAP+XOmOCvYZqA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1", + "npm-package-arg": "^6.0.0", + "semver": "^5.4.1" + } + }, + "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" + } + }, + "tar": { + "version": "4.4.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz", + "integrity": "sha512-w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==", + "dev": true, + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.8.6", + "minizlib": "^1.2.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.3" + } + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", + "dev": true + } + } + }, + "pako": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", + "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" + }, + "parallel-transform": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", + "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", + "dev": true, + "requires": { + "cyclist": "^1.0.1", + "inherits": "^2.0.3", + "readable-stream": "^2.1.5" + } + }, + "parse-asn1": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.6.tgz", + "integrity": "sha512-RnZRo1EPU6JBnra2vGHj0yhp6ebyjBZpmUCLHWiFhxlzvBCCpAuZ7elsBp1PVAbQN0/04VD/19rfzlBSwLstMw==", + "dev": true, + "requires": { + "asn1.js": "^5.2.0", + "browserify-aes": "^1.0.0", + "evp_bytestokey": "^1.0.0", + "pbkdf2": "^3.0.3", + "safe-buffer": "^5.1.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "optional": true, + "requires": { + "error-ex": "^1.2.0" + } + }, + "parse5": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-4.0.0.tgz", + "integrity": "sha512-VrZ7eOd3T1Fk4XWNXMgiGBK/z0MG48BWG2uQNU4I72fkQuKUTZpl+u9k+CxEG0twMVzSmXEEz12z5Fnw1jIQFA==", + "dev": true + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==", + "dev": true + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==", + "dev": true + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-browserify": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz", + "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "optional": true, + "requires": { + "pinkie-promise": "^2.0.0" + } + }, + "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=" + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "optional": true + }, + "path-parse": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + } + }, + "pbkdf2": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.1.1.tgz", + "integrity": "sha512-4Ejy1OPxi9f2tt1rRV7Go7zmfDQ+ZectEQz3VGUQhgq62HtIRPDyG/JtnwIxs6x3uNMwo2V7q1fMvKjb+Tnpqg==", + "dev": true, + "requires": { + "create-hash": "^1.1.2", + "create-hmac": "^1.1.4", + "ripemd160": "^2.0.1", + "safe-buffer": "^5.0.1", + "sha.js": "^2.4.8" + } + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" + }, + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=" + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "^2.0.0" + } + }, + "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" + }, + "dependencies": { + "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" + } + }, + "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" + } + }, + "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" + } + }, + "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 + } + } + }, + "pkg-up": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-3.1.0.tgz", + "integrity": "sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + } + } + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portfinder": { + "version": "1.0.28", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz", + "integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==", + "dev": true, + "requires": { + "async": "^2.6.2", + "debug": "^3.1.1", + "mkdirp": "^0.5.5" + } + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "postcss": { + "version": "7.0.17", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.17.tgz", + "integrity": "sha512-546ZowA+KZ3OasvQZHsbuEpysvwTZNGJv9EfyCQdsIDltPSWHAeTQ5fQy/Npi2ZDtLI3zs7Ps/p6wThErhm9fQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "source-map": "^0.6.1", + "supports-color": "^6.1.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" + }, + "dependencies": { + "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" + } + } + } + }, + "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 + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "postcss-import": { + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-12.0.1.tgz", + "integrity": "sha512-3Gti33dmCjyKBgimqGxL3vcV8w9+bsHwO5UrBawp796+jdardbcFl4RP5w/76BwNL7aGzpKstIfF9I+kdE8pTw==", + "dev": true, + "requires": { + "postcss": "^7.0.1", + "postcss-value-parser": "^3.2.3", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "dependencies": { + "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 + } + } + }, + "postcss-load-config": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-2.1.2.tgz", + "integrity": "sha512-/rDeGV6vMUo3mwJZmeHfEDvwnTKKqQ0S7OHUi/kJvvtx3aWtyWG2/0ZWnzCt2keEclwN6Tf0DST2v9kITdOKYw==", + "dev": true, + "requires": { + "cosmiconfig": "^5.0.0", + "import-cwd": "^2.0.0" + } + }, + "postcss-loader": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-3.0.0.tgz", + "integrity": "sha512-cLWoDEY5OwHcAjDnkyRQzAXfs2jrKjXpO/HQFcc5b5u/r7aa471wdmChmwfnv7x2u840iat/wi0lQ5nbRgSkUA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "postcss": "^7.0.0", + "postcss-load-config": "^2.0.0", + "schema-utils": "^1.0.0" + }, + "dependencies": { + "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" + } + } + } + }, + "postcss-value-parser": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz", + "integrity": "sha512-97DXOFbQJhk71ne5/Mt6cOu6yxsSfM0QGQyl0L25Gca4yGWEGJaig7l7gbCX623VqTBNGLRLaVUCnNkcedlRSQ==", + "dev": true + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "prettier": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.4.1.tgz", + "integrity": "sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA==" + }, + "process": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz", + "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dev": true, + "optional": true, + "requires": { + "asap": "~2.0.3" + } + }, + "promise-inflight": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", + "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=", + "dev": true + }, + "promise-retry": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", + "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", + "dev": true, + "requires": { + "err-code": "^1.0.0", + "retry": "^0.10.0" + }, + "dependencies": { + "retry": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", + "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=", + "dev": true + } + } + }, + "protoduck": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.1.tgz", + "integrity": "sha512-WxoCeDCoCBY55BMvj4cAEjdVUFGRWed9ZxPlqTKYyw1nDDTQ4pqmnIMAGfJlg7Dx35uB/M+PHJPTmGOvaCaPTg==", + "dev": true, + "requires": { + "genfun": "^5.0.0" + } + }, + "protractor": { + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/protractor/-/protractor-5.4.4.tgz", + "integrity": "sha512-BaL4vePgu3Vfa/whvTUAlgaCAId4uNSGxIFSCXMgj7LMYENPWLp85h5RBi9pdpX/bWQ8SF6flP7afmi2TC4eHw==", + "optional": true, + "requires": { + "@types/q": "^0.0.32", + "@types/selenium-webdriver": "^3.0.0", + "blocking-proxy": "^1.0.0", + "browserstack": "^1.5.1", + "chalk": "^1.1.3", + "glob": "^7.0.3", + "jasmine": "2.8.0", + "jasminewd2": "^2.1.0", + "q": "1.4.1", + "saucelabs": "^1.5.0", + "selenium-webdriver": "3.6.0", + "source-map-support": "~0.4.0", + "webdriver-js-extender": "2.1.0", + "webdriver-manager": "^12.0.6", + "yargs": "^12.0.5" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "optional": true + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "optional": true + }, + "cliui": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", + "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", + "optional": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0", + "wrap-ansi": "^2.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "optional": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "get-caller-file": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", + "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "optional": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "optional": true + }, + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "optional": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "optional": true, + "requires": { + "ansi-regex": "^3.0.0" + } + }, + "webdriver-manager": { + "version": "12.1.8", + "resolved": "https://registry.npmjs.org/webdriver-manager/-/webdriver-manager-12.1.8.tgz", + "integrity": "sha512-qJR36SXG2VwKugPcdwhaqcLQOD7r8P2Xiv9sfNbfZrKBnX243iAkOueX1yAmeNgIKhJ3YAT/F2gq6IiEZzahsg==", + "optional": true, + "requires": { + "adm-zip": "^0.4.9", + "chalk": "^1.1.1", + "del": "^2.2.0", + "glob": "^7.0.3", + "ini": "^1.3.4", + "minimist": "^1.2.0", + "q": "^1.4.1", + "request": "^2.87.0", + "rimraf": "^2.5.2", + "semver": "^5.3.0", + "xml2js": "^0.4.17" + } + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "optional": true, + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "yargs": { + "version": "12.0.5", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", + "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "optional": true, + "requires": { + "cliui": "^4.0.0", + "decamelize": "^1.2.0", + "find-up": "^3.0.0", + "get-caller-file": "^1.0.1", + "os-locale": "^3.0.0", + "require-directory": "^2.1.1", + "require-main-filename": "^1.0.1", + "set-blocking": "^2.0.0", + "string-width": "^2.0.0", + "which-module": "^2.0.0", + "y18n": "^3.2.1 || ^4.0.0", + "yargs-parser": "^11.1.1" + } + }, + "yargs-parser": { + "version": "11.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", + "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", + "optional": true, + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } + } + }, + "proxy-addr": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.6.tgz", + "integrity": "sha512-dh/frvCBVmSsDYzw6n926jv974gddhkFPfiN8hPOi30Wax25QZyZEGveluCgliBnqmuM+UJmBErbAUFIoDbjOw==", + "dev": true, + "requires": { + "forwarded": "~0.1.2", + "ipaddr.js": "1.9.1" + } + }, + "prr": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", + "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=", + "dev": true + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "public-encrypt": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", + "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==", + "dev": true, + "requires": { + "bn.js": "^4.1.0", + "browserify-rsa": "^4.0.0", + "create-hash": "^1.1.0", + "parse-asn1": "^5.0.0", + "randombytes": "^2.0.1", + "safe-buffer": "^5.1.2" + }, + "dependencies": { + "bn.js": { + "version": "4.11.9", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.9.tgz", + "integrity": "sha512-E6QoYqCKZfgatHTdHzs1RRKP7ip4vvm+EyRUeE2RF0NblwVvb0p6jSVeNTOFxPn26QXN2o6SMfNxKp6kU8zQaw==", + "dev": true + } + } + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "pumpify": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", + "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", + "dev": true, + "requires": { + "duplexify": "^3.6.0", + "inherits": "^2.0.3", + "pump": "^2.0.0" + }, + "dependencies": { + "pump": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", + "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + } + } + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=", + "optional": true + }, + "qjobs": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/qjobs/-/qjobs-1.2.0.tgz", + "integrity": "sha512-8YOJEHtxpySA3fFDyCRxA+UUV+fA+rTWnuWvylOK/NCjhY+b4ocCtmu8TtsWb+mYeU+GCHf/S66KZF/AsteKHg==", + "dev": true + }, + "qs": { + "version": "6.5.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", + "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" + }, + "query-string": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz", + "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=", + "dev": true, + "requires": { + "object-assign": "^4.1.0", + "strict-uri-encode": "^1.0.0" + } + }, + "querystring": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystring-es3": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz", + "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=", + "dev": true + }, + "querystringify": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz", + "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==", + "dev": true + }, + "randombytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", + "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", + "requires": { + "safe-buffer": "^5.1.0" + } + }, + "randomfill": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz", + "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==", + "dev": true, + "requires": { + "randombytes": "^2.0.5", + "safe-buffer": "^5.1.0" + } + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "dev": true + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "dev": true, + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==", + "dev": true + } + } + }, + "raw-loader": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/raw-loader/-/raw-loader-3.1.0.tgz", + "integrity": "sha512-lzUVMuJ06HF4rYveaz9Tv0WRlUMxJ0Y1hgSkkgg+50iEdaI0TthyEDe08KIHb0XsF6rn8WYTqPCaGTZg3sX+qA==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0", + "schema-utils": "^2.0.1" + } + }, + "read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha1-5mTvMRYRZsl1HNvo28+GtftY93Q=", + "dev": true, + "requires": { + "pify": "^2.3.0" + } + }, + "read-package-json": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", + "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", + "dev": true, + "requires": { + "glob": "^7.1.1", + "json-parse-even-better-errors": "^2.3.0", + "normalize-package-data": "^2.0.0", + "npm-normalize-package-bin": "^1.0.0" + } + }, + "read-package-tree": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/read-package-tree/-/read-package-tree-5.3.1.tgz", + "integrity": "sha512-mLUDsD5JVtlZxjSlPPx1RETkNjjvQYuweKwNVt1Sn8kP5Jh44pvYuUHCp6xSVDZWbNxVxG5lyZJ921aJH61sTw==", + "dev": true, + "requires": { + "read-package-json": "^2.0.0", + "readdir-scoped-modules": "^1.0.0", + "util-promisify": "^2.1.0" + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "optional": true, + "requires": { + "load-json-file": "^1.0.0", + "normalize-package-data": "^2.3.2", + "path-type": "^1.0.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "optional": true, + "requires": { + "find-up": "^1.0.0", + "read-pkg": "^1.0.0" + } + }, + "readable-stream": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", + "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "readdir-scoped-modules": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", + "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", + "dev": true, + "requires": { + "debuglog": "^1.0.1", + "dezalgo": "^1.0.0", + "graceful-fs": "^4.1.2", + "once": "^1.3.0" + } + }, + "readdirp": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", + "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", + "dev": true, + "requires": { + "picomatch": "^2.2.1" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "optional": true, + "requires": { + "indent-string": "^2.1.0", + "strip-indent": "^1.0.1" + } + }, + "reflect-metadata": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "dev": true + }, + "regenerate": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", + "dev": true + }, + "regenerate-unicode-properties": { + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz", + "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==", + "dev": true, + "requires": { + "regenerate": "^1.4.0" + } + }, + "regenerator-runtime": { + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.3.tgz", + "integrity": "sha512-naKIZz2GQ8JWh///G7L3X6LaQUAMp2lvb1rvwwsURe/VXwD6VMfr+/1NuNw3ag8v2kY1aQ/go5SNn79O9JU7yw==", + "dev": true + }, + "regenerator-transform": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz", + "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.8.4" + } + }, + "regex-not": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz", + "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.2", + "safe-regex": "^1.1.0" + } + }, + "regexp.prototype.flags": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz", + "integrity": "sha512-2+Q0C5g951OlYlJz6yu5/M33IcsESLlLfsyIaLJaG4FA2r4yP8MvVMJUUP/fVBkSpbbbZlS5gynbEWLipiiXiQ==", + "dev": true, + "requires": { + "define-properties": "^1.1.3", + "es-abstract": "^1.17.0-next.1" + } + }, + "regexpu-core": { + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz", + "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==", + "dev": true, + "requires": { + "regenerate": "^1.4.0", + "regenerate-unicode-properties": "^8.2.0", + "regjsgen": "^0.5.1", + "regjsparser": "^0.6.4", + "unicode-match-property-ecmascript": "^1.0.4", + "unicode-match-property-value-ecmascript": "^1.2.0" + } + }, + "regjsgen": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz", + "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==", + "dev": true + }, + "regjsparser": { + "version": "0.6.6", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.6.tgz", + "integrity": "sha512-jjyuCp+IEMIm3N1H1LLTJW1EISEJV9+5oHdEyrt43Pg9cDSb6rrLZei2cVWpl0xTjmmlpec/lEQGYgM7xfpGCQ==", + "dev": true, + "requires": { + "jsesc": "~0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz", + "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "optional": true, + "requires": { + "is-finite": "^1.0.0" + } + }, + "request": { + "version": "2.88.2", + "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", + "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", + "requires": { + "aws-sign2": "~0.7.0", + "aws4": "^1.8.0", + "caseless": "~0.12.0", + "combined-stream": "~1.0.6", + "extend": "~3.0.2", + "forever-agent": "~0.6.1", + "form-data": "~2.3.2", + "har-validator": "~5.1.3", + "http-signature": "~1.2.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "oauth-sign": "~0.9.0", + "performance-now": "^2.1.0", + "qs": "~6.5.2", + "safe-buffer": "^5.1.2", + "tough-cookie": "~2.5.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.3.2" + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", + "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", + "requires": { + "is-core-module": "^2.1.0", + "path-parse": "^1.0.6" + } + }, + "resolve-cwd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", + "integrity": "sha1-AKn3OHVW4nA46uIyyqNypqWbZlo=", + "dev": true, + "requires": { + "resolve-from": "^3.0.0" + } + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "dev": true, + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + } + }, + "ret": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", + "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==", + "dev": true + }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha1-G0KmJmoh8HQh0bC1S33BZ7AcATs=", + "dev": true + }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, + "rfdc": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz", + "integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug==", + "dev": true + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "requires": { + "glob": "^7.1.3" + } + }, + "ripemd160": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz", + "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==", + "dev": true, + "requires": { + "hash-base": "^3.0.0", + "inherits": "^2.0.1" + } + }, + "run-async": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", + "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==", + "dev": true + }, + "run-parallel": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.1.10.tgz", + "integrity": "sha512-zb/1OuZ6flOlH6tQyMPUrE3x3Ulxjlo9WIVXR4yVYi4H9UXQaeIsPbLn2R3O3vQCnDKkAl2qHiuocKKX4Tz/Sw==", + "dev": true + }, + "run-queue": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", + "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", + "dev": true, + "requires": { + "aproba": "^1.1.1" + } + }, + "rxjs": { + "version": "6.6.3", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", + "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", + "requires": { + "tslib": "^1.9.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safe-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz", + "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=", + "dev": true, + "requires": { + "ret": "~0.1.10" + } + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sass": { + "version": "1.22.9", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.22.9.tgz", + "integrity": "sha512-FzU1X2V8DlnqabrL4u7OBwD2vcOzNMongEJEx3xMEhWY/v26FFR3aG0hyeu2T965sfR0E9ufJwmG+Qjz78vFPQ==", + "dev": true, + "requires": { + "chokidar": ">=2.0.0 <4.0.0" + } + }, + "sass-graph": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz", + "integrity": "sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==", + "optional": true, + "requires": { + "glob": "^7.0.0", + "lodash": "^4.0.0", + "scss-tokenizer": "^0.2.3", + "yargs": "^13.3.2" + } + }, + "sass-loader": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.2.0.tgz", + "integrity": "sha512-h8yUWaWtsbuIiOCgR9fd9c2lRXZ2uG+h8Dzg/AGNj+Hg/3TO8+BBAW9mEP+mh8ei+qBKqSJ0F1FLlYjNBc61OA==", + "dev": true, + "requires": { + "clone-deep": "^4.0.1", + "loader-utils": "^1.0.1", + "neo-async": "^2.5.0", + "pify": "^4.0.1", + "semver": "^5.5.0" + }, + "dependencies": { + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + } + } + }, + "saucelabs": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/saucelabs/-/saucelabs-1.5.0.tgz", + "integrity": "sha512-jlX3FGdWvYf4Q3LFfFWS1QvPg3IGCGWxIc8QBFdPTbpTJnt/v17FHXYVAn7C8sHf1yUXo2c7yIM0isDryfYtHQ==", + "optional": true, + "requires": { + "https-proxy-agent": "^2.2.1" + } + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "optional": true + }, + "schema-utils": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", + "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.5", + "ajv": "^6.12.4", + "ajv-keywords": "^3.5.2" + } + }, + "scss-tokenizer": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz", + "integrity": "sha1-jrBtualyMzOCTT9VMGQRSYR85dE=", + "optional": true, + "requires": { + "js-base64": "^2.1.8", + "source-map": "^0.4.2" + } + }, + "select-hose": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", + "integrity": "sha1-Yl2GWPhlr0Psliv8N2o3NZpJlMo=", + "dev": true + }, + "selenium-webdriver": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz", + "integrity": "sha512-WH7Aldse+2P5bbFBO4Gle/nuQOdVwpHMTL6raL3uuBj/vPG07k6uzt3aiahu352ONBr5xXh0hDlM3LhtXPOC4Q==", + "optional": true, + "requires": { + "jszip": "^3.1.3", + "rimraf": "^2.5.4", + "tmp": "0.0.30", + "xml2js": "^0.4.17" + }, + "dependencies": { + "rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "optional": true, + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "selfsigned": { + "version": "1.10.8", + "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-1.10.8.tgz", + "integrity": "sha512-2P4PtieJeEwVgTU9QEcwIRDQ/mXJLX8/+I3ur+Pg16nS8oNbrGxEso9NyYWy8NAmXiNl4dlAp5MwoNeCWzON4w==", + "dev": true, + "requires": { + "node-forge": "^0.10.0" + } + }, + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" + }, + "semver-dsl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/semver-dsl/-/semver-dsl-1.0.1.tgz", + "integrity": "sha1-02eN5VVeimH2Ke7QJTZq5fJzQKA=", + "dev": true, + "requires": { + "semver": "^5.3.0" + } + }, + "semver-intersect": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/semver-intersect/-/semver-intersect-1.4.0.tgz", + "integrity": "sha512-d8fvGg5ycKAq0+I6nfWeCx6ffaWJCsBYU0H2Rq56+/zFePYfT8mXkB3tWBSjR5BerkHNZ5eTPIk1/LBYas35xQ==", + "dev": true, + "requires": { + "semver": "^5.0.0" + } + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", + "dev": true + } + } + }, + "serialize-javascript": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-4.0.0.tgz", + "integrity": "sha512-GaNA54380uFefWghODBWEGisLZFj00nS5ACs6yHa9nLqlLpVLO8ChDGeKRjZnV4Nh4n0Qi7nhYZD/9fCPzEqkw==", + "requires": { + "randombytes": "^2.1.0" + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha1-03aNabHn2C5c4FD/9bRTvqEqkjk=", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "dev": true, + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "dev": true, + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "optional": true + }, + "set-value": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", + "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-extendable": "^0.1.1", + "is-plain-object": "^2.0.3", + "split-string": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "setimmediate": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz", + "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=", + "dev": true + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", + "dev": true + }, + "sha.js": { + "version": "2.4.11", + "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz", + "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==", + "dev": true, + "requires": { + "inherits": "^2.0.1", + "safe-buffer": "^5.0.1" + } + }, + "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==", + "optional": 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==", + "optional": true + }, + "signal-exit": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "smart-buffer": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", + "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==", + "dev": true + }, + "snapdragon": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", + "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==", + "dev": true, + "requires": { + "base": "^0.11.1", + "debug": "^2.2.0", + "define-property": "^0.2.5", + "extend-shallow": "^2.0.1", + "map-cache": "^0.2.2", + "source-map": "^0.5.6", + "source-map-resolve": "^0.5.0", + "use": "^3.1.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "^1.0.0", + "isobject": "^3.0.0", + "snapdragon-util": "^3.0.1" + }, + "dependencies": { + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "^1.0.0" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "^6.0.0" + } + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "^1.0.0", + "is-data-descriptor": "^1.0.0", + "kind-of": "^6.0.2" + } + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "^3.2.0" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "socket.io": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-2.4.1.tgz", + "integrity": "sha512-Si18v0mMXGAqLqCVpTxBa8MGqriHGQh8ccEOhmsmNS3thNCGBwO8WGrwMibANsWtQQ5NStdZwHqZR3naJVFc3w==", + "dev": true, + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==", + "dev": true + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dev": true, + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dev": true, + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dev": true, + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=", + "dev": true + } + } + }, + "sockjs": { + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", + "dev": true, + "requires": { + "faye-websocket": "^0.10.0", + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" + } + }, + "sockjs-client": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/sockjs-client/-/sockjs-client-1.4.0.tgz", + "integrity": "sha512-5zaLyO8/nri5cua0VtOrFXBPK1jbL4+1cebT/mmKA1E1ZXOvJrII75bPu0l0k843G/+iAbhEqzyKr0w/eCCj7g==", + "dev": true, + "requires": { + "debug": "^3.2.5", + "eventsource": "^1.0.7", + "faye-websocket": "~0.11.1", + "inherits": "^2.0.3", + "json3": "^3.3.2", + "url-parse": "^1.4.3" + }, + "dependencies": { + "faye-websocket": { + "version": "0.11.3", + "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.3.tgz", + "integrity": "sha512-D2y4bovYpzziGgbHYtGCMjlJM36vAl/y+xUyn1C+FVx8szd1E+86KwVw6XvYSzOP8iMpm1X0I4xJD+QtUb36OA==", + "dev": true, + "requires": { + "websocket-driver": ">=0.5.1" + } + } + } + }, + "socks": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", + "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", + "dev": true, + "requires": { + "ip": "1.1.5", + "smart-buffer": "^4.1.0" + } + }, + "socks-proxy-agent": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", + "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", + "dev": true, + "requires": { + "agent-base": "~4.2.1", + "socks": "~2.3.2" + }, + "dependencies": { + "agent-base": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", + "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", + "dev": true, + "requires": { + "es6-promisify": "^5.0.0" + } + } + } + }, + "sort-keys": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", + "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=", + "dev": true, + "requires": { + "is-plain-obj": "^1.0.0" + } + }, + "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.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "source-map-loader": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-0.2.4.tgz", + "integrity": "sha512-OU6UJUty+i2JDpTItnizPrlpOIBLmQbWMuBg9q5bVtnHACqw1tn9nNwqJLbv0/00JjnJb/Ee5g5WS5vrRv7zIQ==", + "dev": true, + "requires": { + "async": "^2.5.0", + "loader-utils": "^1.1.0" + } + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "dev": true, + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "optional": true, + "requires": { + "source-map": "^0.5.6" + }, + "dependencies": { + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "optional": true + } + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sourcemap-codec": { + "version": "1.4.8", + "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", + "dev": true + }, + "spdx-correct": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", + "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", + "requires": { + "spdx-expression-parse": "^3.0.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-exceptions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", + "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" + }, + "spdx-expression-parse": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", + "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", + "requires": { + "spdx-exceptions": "^2.1.0", + "spdx-license-ids": "^3.0.0" + } + }, + "spdx-license-ids": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", + "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" + }, + "spdy": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "spdy-transport": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", + "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "speed-measure-webpack-plugin": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/speed-measure-webpack-plugin/-/speed-measure-webpack-plugin-1.3.1.tgz", + "integrity": "sha512-qVIkJvbtS9j/UeZumbdfz0vg+QfG/zxonAjzefZrqzkr7xOncLVXkeGbTpzd1gjCBM4PmVNkWlkeTVhgskAGSQ==", + "dev": true, + "requires": { + "chalk": "^2.0.1" + }, + "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" + } + } + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "^3.0.0" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", + "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "safer-buffer": "^2.0.2", + "tweetnacl": "~0.14.0" + } + }, + "ssri": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.1.tgz", + "integrity": "sha512-3Wge10hNcT1Kur4PDFwEieXSCMCJs/7WvSACcrMYrNp+b8kDL1/0wJch5Ni2WrtwEa2IO8OsVfeKIciKCDx/QA==", + "dev": true, + "requires": { + "figgy-pudding": "^3.5.1" + } + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "^0.2.5", + "object-copy": "^0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "^0.1.0" + } + } + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", + "dev": true + }, + "stdout-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz", + "integrity": "sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==", + "optional": true, + "requires": { + "readable-stream": "^2.0.1" + } + }, + "stream-browserify": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", + "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==", + "dev": true, + "requires": { + "inherits": "~2.0.1", + "readable-stream": "^2.0.2" + } + }, + "stream-each": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", + "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "stream-shift": "^1.0.0" + } + }, + "stream-http": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz", + "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==", + "dev": true, + "requires": { + "builtin-status-codes": "^3.0.0", + "inherits": "^2.0.1", + "readable-stream": "^2.3.6", + "to-arraybuffer": "^1.0.0", + "xtend": "^4.0.0" + } + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==", + "dev": true + }, + "streamroller": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/streamroller/-/streamroller-2.2.4.tgz", + "integrity": "sha512-OG79qm3AujAM9ImoqgWEY1xG4HX+Lw+yY6qZj9R1K2mhF5bEmQ849wvrb+4vt4jLMLzwXttJlQbOdPOQVRv7DQ==", + "dev": true, + "requires": { + "date-format": "^2.1.0", + "debug": "^4.1.1", + "fs-extra": "^8.1.0" + }, + "dependencies": { + "date-format": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-2.1.0.tgz", + "integrity": "sha512-bYQuGLeFxhkxNOF3rcMtiZxvCBAquGzZm6oWA1oZ0g2THUzivaRhv8uOhdr19LmoobSOLoIAxeUK2RdbM8IFTA==", + "dev": true + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string.prototype.trimend": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.3.tgz", + "integrity": "sha512-ayH0pB+uf0U28CtjlLvL7NaohvR1amUvVZk+y3DYb0Ey2PUV5zPkkKy9+U1ndVEIXO8hNg18eIv9Jntbii+dKw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string.prototype.trimstart": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.3.tgz", + "integrity": "sha512-oBIBUy5lea5tt0ovtOFiEQaBkoBBkyJhZXzJYrSmDo5IUUqbOPvVezuRs/agBIdZ2p2Eo1FD6bD9USyBLfl3xg==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "define-properties": "^1.1.3" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "optional": true, + "requires": { + "is-utf8": "^0.2.0" + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "optional": true, + "requires": { + "get-stdin": "^4.0.1" + } + }, + "style-loader": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-1.0.0.tgz", + "integrity": "sha512-B0dOCFwv7/eY31a5PCieNwMgMhVGFe9w+rh7s/Bx8kfFkrth9zfTZquoYvdw8URgiqxObQKcpW51Ugz1HjfdZw==", + "dev": true, + "requires": { + "loader-utils": "^1.2.3", + "schema-utils": "^2.0.1" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha1-QrlWCTHKcJDOhRWnmLqeaqPW3Hk=", + "dev": true, + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "glob": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.0.6.tgz", + "integrity": "sha1-IRuvr0nlJbjNkyYNFKsTYVKz9Xo=", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=", + "dev": true + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "dev": true, + "requires": { + "amdefine": ">=0.0.4" + } + } + } + }, + "stylus-loader": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz", + "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==", + "dev": true, + "requires": { + "loader-utils": "^1.0.2", + "lodash.clonedeep": "^4.5.0", + "when": "~3.6.x" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "symbol-observable": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz", + "integrity": "sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ==", + "dev": true + }, + "tapable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/tapable/-/tapable-1.1.3.tgz", + "integrity": "sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==", + "dev": true + }, + "tar": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.0.tgz", + "integrity": "sha512-DUCttfhsnLCjwoDoFcI+B2iJgYa93vBnDUATYEeRx6sntCTdN01VnqsIuTlALXla/LWooNg0yEGeB+Y8WdFxGA==", + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + }, + "dependencies": { + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + } + } + }, + "terser": { + "version": "4.6.3", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.3.tgz", + "integrity": "sha512-Lw+ieAXmY69d09IIc/yqeBqXpEQIpDGZqT34ui1QWXIUpR2RjbqEkT8X7Lgex19hslSqcWM5iMN2kM11eMsESQ==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "terser-webpack-plugin": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-3.0.3.tgz", + "integrity": "sha512-bZFnotuIKq5Rqzrs+qIwFzGdKdffV9epG5vDSEbYzvKAhPeR5RbbrQysfPgbIIMhNAQtZD2hGwBfSKUXjXZZZw==", + "dev": true, + "requires": { + "cacache": "^15.0.4", + "find-cache-dir": "^3.3.1", + "jest-worker": "^26.0.0", + "p-limit": "^2.3.0", + "schema-utils": "^2.6.6", + "serialize-javascript": "^3.1.0", + "source-map": "^0.6.1", + "terser": "^4.6.13", + "webpack-sources": "^1.4.3" + }, + "dependencies": { + "cacache": { + "version": "15.0.5", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.5.tgz", + "integrity": "sha512-lloiL22n7sOjEEXdL8NAjTgv9a1u43xICE9/203qonkZUCj5X1UEWIdf2/Y0d6QcCtMzbKQyhrcDbdvlZTs/+A==", + "dev": true, + "requires": { + "@npmcli/move-file": "^1.0.1", + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "glob": "^7.1.4", + "infer-owner": "^1.0.4", + "lru-cache": "^6.0.0", + "minipass": "^3.1.1", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.2", + "mkdirp": "^1.0.3", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^8.0.0", + "tar": "^6.0.2", + "unique-filename": "^1.1.1" + } + }, + "find-cache-dir": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz", + "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^3.0.2", + "pkg-dir": "^4.1.0" + } + }, + "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 + }, + "jest-worker": { + "version": "26.6.2", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz", + "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==", + "dev": true, + "requires": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^7.0.0" + } + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "dev": true + }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, + "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.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "ssri": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.0.tgz", + "integrity": "sha512-aq/pz989nxVYwn16Tsbj1TqFpD5LLrQxHf5zaHuieFV+R0Bbr4y8qUsOA45hXT/N4/9UNXTarBjnjVmjSOVaAA==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "terser": { + "version": "4.8.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz", + "integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==", + "dev": true, + "requires": { + "commander": "^2.20.0", + "source-map": "~0.6.1", + "source-map-support": "~0.5.12" + } + } + } + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", + "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", + "dev": true, + "requires": { + "readable-stream": "~2.3.6", + "xtend": "~4.0.1" + } + }, + "thunky": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", + "dev": true + }, + "timers-browserify": { + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.12.tgz", + "integrity": "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ==", + "dev": true, + "requires": { + "setimmediate": "^1.0.4" + } + }, + "tmp": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.30.tgz", + "integrity": "sha1-ckGdSovn1s51FI/YsyTlk6cRwu0=", + "optional": true, + "requires": { + "os-tmpdir": "~1.0.1" + } + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=", + "dev": true + }, + "to-arraybuffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz", + "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=", + "dev": true + }, + "to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "to-regex": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz", + "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==", + "dev": true, + "requires": { + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "regex-not": "^1.0.2", + "safe-regex": "^1.1.0" + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", + "dev": true + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } + }, + "tree-kill": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", + "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", + "dev": true + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "optional": true + }, + "true-case-path": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz", + "integrity": "sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==", + "optional": true, + "requires": { + "glob": "^7.1.2" + } + }, + "ts-node": { + "version": "8.4.1", + "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.4.1.tgz", + "integrity": "sha512-5LpRN+mTiCs7lI5EtbXmF/HfMeCjzt7DH9CZwtkr6SywStrNQC723wG+aOWFiLNn7zT3kD/RnFqi3ZUfr4l5Qw==", + "optional": true, + "requires": { + "arg": "^4.1.0", + "diff": "^4.0.1", + "make-error": "^1.1.1", + "source-map-support": "^0.5.6", + "yn": "^3.0.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "optional": true + }, + "source-map-support": { + "version": "0.5.19", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz", + "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==", + "optional": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + } + } + }, + "tslib": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", + "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" + }, + "tslint": { + "version": "5.20.1", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", + "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", + "optional": true, + "requires": { + "@babel/code-frame": "^7.0.0", + "builtin-modules": "^1.1.1", + "chalk": "^2.3.0", + "commander": "^2.12.1", + "diff": "^4.0.1", + "glob": "^7.1.1", + "js-yaml": "^3.13.1", + "minimatch": "^3.0.4", + "mkdirp": "^0.5.1", + "resolve": "^1.3.2", + "semver": "^5.3.0", + "tslib": "^1.8.0", + "tsutils": "^2.29.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==", + "optional": 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==", + "optional": 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==", + "optional": true, + "requires": { + "has-flag": "^3.0.0" + } + } + } + }, + "tsutils": { + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", + "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", + "optional": true, + "requires": { + "tslib": "^1.8.1" + } + }, + "tty-browserify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz", + "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" + }, + "type-fest": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", + "dev": true + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.3.tgz", + "integrity": "sha512-ACzBtm/PhXBDId6a6sDJfroT2pOWt/oOnk4/dElG5G33ZL776N3Y6/6bKZJBFpd+b05F3Ct9qDjMeJmRWtE2/g==", + "dev": true + }, + "ua-parser-js": { + "version": "0.7.22", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.22.tgz", + "integrity": "sha512-YUxzMjJ5T71w6a8WWVcMGM6YWOTX27rCoIQgLXiWaxqXSx9D7DNjiGWn1aJIRSQ5qr0xuhra77bSIh6voR/46Q==", + "dev": true + }, + "unicode-canonical-property-names-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz", + "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==", + "dev": true + }, + "unicode-match-property-ecmascript": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz", + "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==", + "dev": true, + "requires": { + "unicode-canonical-property-names-ecmascript": "^1.0.4", + "unicode-property-aliases-ecmascript": "^1.0.4" + } + }, + "unicode-match-property-value-ecmascript": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz", + "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==", + "dev": true + }, + "unicode-property-aliases-ecmascript": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz", + "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==", + "dev": true + }, + "union-value": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", + "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==", + "dev": true, + "requires": { + "arr-union": "^3.1.0", + "get-value": "^2.0.6", + "is-extendable": "^0.1.1", + "set-value": "^2.0.1" + } + }, + "unique-filename": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", + "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", + "dev": true, + "requires": { + "unique-slug": "^2.0.0" + } + }, + "unique-slug": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", + "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "universal-analytics": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/universal-analytics/-/universal-analytics-0.4.23.tgz", + "integrity": "sha512-lgMIH7XBI6OgYn1woDEmxhGdj8yDefMKg7GkWdeATAlQZFrMrNyxSkpDzY57iY0/6fdlzTbBV03OawvvzG+q7A==", + "dev": true, + "requires": { + "debug": "^4.1.1", + "request": "^2.88.2", + "uuid": "^3.0.0" + }, + "dependencies": { + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "dev": true + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "^0.3.1", + "isobject": "^3.0.0" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "^2.0.3", + "has-values": "^0.1.4", + "isobject": "^2.0.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + } + } + }, + "upath": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz", + "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==", + "dev": true + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "requires": { + "punycode": "^2.1.0" + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "1.3.2", + "querystring": "0.2.0" + }, + "dependencies": { + "punycode": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + } + } + }, + "url-parse": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.7.tgz", + "integrity": "sha512-d3uaVyzDB9tQoSXFvuSUNFibTd9zxd2bkVrDRvF5TmvWWQwqE4lgYJ5m+x1DbecWkw+LK4RNl2CU1hHuOKPVlg==", + "dev": true, + "requires": { + "querystringify": "^2.1.1", + "requires-port": "^1.0.0" + } + }, + "use": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz", + "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", + "dev": true + }, + "util": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", + "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + }, + "dependencies": { + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + } + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "util-promisify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/util-promisify/-/util-promisify-2.1.0.tgz", + "integrity": "sha1-PCI2R2xNMsX/PEcAKt18E7moKlM=", + "dev": true, + "requires": { + "object.getownpropertydescriptors": "^2.0.3" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" + }, + "validate-npm-package-license": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", + "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", + "requires": { + "spdx-correct": "^3.0.0", + "spdx-expression-parse": "^3.0.0" + } + }, + "validate-npm-package-name": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", + "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", + "dev": true, + "requires": { + "builtins": "^1.0.3" + } + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "vm-browserify": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", + "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==", + "dev": true + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", + "dev": true + }, + "watchpack": { + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz", + "integrity": "sha512-9P3MWk6SrKjHsGkLT2KHXdQ/9SNkyoJbabxnKOoJepsvJjJG8uYTR3yTPxPQvNDI3w4Nz1xnE0TLHK4RIVe/MQ==", + "dev": true, + "requires": { + "chokidar": "^3.4.1", + "graceful-fs": "^4.1.2", + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.1" + } + }, + "watchpack-chokidar2": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz", + "integrity": "sha512-nCFfBIPKr5Sh61s4LPpy1Wtfi0HE8isJ3d2Yb5/Ppw2P2B/3eVSEBjKfN0fmHJSK14+31KwMKmcrzs2GM4P0Ww==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "optional": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "optional": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true, + "optional": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "optional": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "optional": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "optional": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "optional": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "optional": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "optional": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "optional": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "optional": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "optional": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "wbuf": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", + "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", + "dev": true, + "requires": { + "minimalistic-assert": "^1.0.0" + } + }, + "webdriver-js-extender": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/webdriver-js-extender/-/webdriver-js-extender-2.1.0.tgz", + "integrity": "sha512-lcUKrjbBfCK6MNsh7xaY2UAUmZwe+/ib03AjVOpFobX4O7+83BUveSrLfU0Qsyb1DaKJdQRbuU+kM9aZ6QUhiQ==", + "optional": true, + "requires": { + "@types/selenium-webdriver": "^3.0.0", + "selenium-webdriver": "^3.0.1" + } + }, + "webpack": { + "version": "4.39.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.39.2.tgz", + "integrity": "sha512-AKgTfz3xPSsEibH00JfZ9sHXGUwIQ6eZ9tLN8+VLzachk1Cw2LVmy+4R7ZiwTa9cZZ15tzySjeMui/UnSCAZhA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.8.5", + "@webassemblyjs/helper-module-context": "1.8.5", + "@webassemblyjs/wasm-edit": "1.8.5", + "@webassemblyjs/wasm-parser": "1.8.5", + "acorn": "^6.2.1", + "ajv": "^6.10.2", + "ajv-keywords": "^3.4.1", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^4.1.0", + "eslint-scope": "^4.0.3", + "json-parse-better-errors": "^1.0.2", + "loader-runner": "^2.4.0", + "loader-utils": "^1.2.3", + "memory-fs": "^0.4.1", + "micromatch": "^3.1.10", + "mkdirp": "^0.5.1", + "neo-async": "^2.6.1", + "node-libs-browser": "^2.2.1", + "schema-utils": "^1.0.0", + "tapable": "^1.1.3", + "terser-webpack-plugin": "^1.4.1", + "watchpack": "^1.6.0", + "webpack-sources": "^1.4.1" + }, + "dependencies": { + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "find-cache-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz", + "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==", + "dev": true, + "requires": { + "commondir": "^1.0.1", + "make-dir": "^2.0.0", + "pkg-dir": "^3.0.0" + } + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "make-dir": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", + "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", + "dev": true, + "requires": { + "pify": "^4.0.1", + "semver": "^5.6.0" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-dir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz", + "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==", + "dev": true, + "requires": { + "find-up": "^3.0.0" + } + }, + "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" + } + }, + "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 + }, + "terser-webpack-plugin": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.5.tgz", + "integrity": "sha512-04Rfe496lN8EYruwi6oPQkG0vo8C+HT49X687FZnpPF0qMAIHONI6HEXYPKDOE8e5HjXTyKfqRd/agHtH0kOtw==", + "dev": true, + "requires": { + "cacache": "^12.0.2", + "find-cache-dir": "^2.1.0", + "is-wsl": "^1.1.0", + "schema-utils": "^1.0.0", + "serialize-javascript": "^4.0.0", + "source-map": "^0.6.1", + "terser": "^4.1.2", + "webpack-sources": "^1.4.0", + "worker-farm": "^1.7.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-core": { + "version": "0.6.9", + "resolved": "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz", + "integrity": "sha1-/FcViMhVjad76e+23r3Fo7FyvcI=", + "dev": true, + "requires": { + "source-list-map": "~0.1.7", + "source-map": "~0.4.1" + }, + "dependencies": { + "source-list-map": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz", + "integrity": "sha1-xVCyq1Qn9rPyH1r+rYjE9Vh7IQY=", + "dev": true + } + } + }, + "webpack-dev-middleware": { + "version": "3.7.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz", + "integrity": "sha512-1xC42LxbYoqLNAhV6YzTYacicgMZQTqRd27Sim9wn5hJrX3I5nxYy1SxSd4+gjUFsz1dQFj+yEe6zEVmSkeJjw==", + "dev": true, + "requires": { + "memory-fs": "^0.4.1", + "mime": "^2.4.4", + "mkdirp": "^0.5.1", + "range-parser": "^1.2.1", + "webpack-log": "^2.0.0" + }, + "dependencies": { + "mime": { + "version": "2.4.7", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.4.7.tgz", + "integrity": "sha512-dhNd1uA2u397uQk3Nv5LM4lm93WYDUXFn3Fu291FJerns4jyTudqhIWe4W04YLy7Uk1tm1Ore04NpjRvQp/NPA==", + "dev": true + } + } + }, + "webpack-dev-server": { + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", + "dev": true, + "requires": { + "ansi-html": "0.0.7", + "bonjour": "^3.5.0", + "chokidar": "^2.1.8", + "compression": "^1.7.4", + "connect-history-api-fallback": "^1.6.0", + "debug": "^4.1.1", + "del": "^4.1.1", + "express": "^4.17.1", + "html-entities": "^1.3.1", + "http-proxy-middleware": "0.19.1", + "import-local": "^2.0.0", + "internal-ip": "^4.3.0", + "ip": "^1.1.5", + "is-absolute-url": "^3.0.3", + "killable": "^1.0.1", + "loglevel": "^1.6.8", + "opn": "^5.5.0", + "p-retry": "^3.0.1", + "portfinder": "^1.0.26", + "schema-utils": "^1.0.0", + "selfsigned": "^1.10.7", + "semver": "^6.3.0", + "serve-index": "^1.9.1", + "sockjs": "0.3.20", + "sockjs-client": "1.4.0", + "spdy": "^4.0.2", + "strip-ansi": "^3.0.1", + "supports-color": "^6.1.0", + "url": "^0.11.0", + "webpack-dev-middleware": "^3.7.2", + "webpack-log": "^2.0.0", + "ws": "^6.2.1", + "yargs": "^13.3.2" + }, + "dependencies": { + "anymatch": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz", + "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==", + "dev": true, + "requires": { + "micromatch": "^3.1.4", + "normalize-path": "^2.1.1" + }, + "dependencies": { + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "^1.0.1" + } + } + } + }, + "binary-extensions": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz", + "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", + "dev": true + }, + "braces": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz", + "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==", + "dev": true, + "requires": { + "arr-flatten": "^1.1.0", + "array-unique": "^0.3.2", + "extend-shallow": "^2.0.1", + "fill-range": "^4.0.0", + "isobject": "^3.0.1", + "repeat-element": "^1.1.2", + "snapdragon": "^0.8.1", + "snapdragon-node": "^2.0.1", + "split-string": "^3.0.2", + "to-regex": "^3.0.1" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "chokidar": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz", + "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==", + "dev": true, + "requires": { + "anymatch": "^2.0.0", + "async-each": "^1.0.1", + "braces": "^2.3.2", + "fsevents": "^1.2.7", + "glob-parent": "^3.1.0", + "inherits": "^2.0.3", + "is-binary-path": "^1.0.0", + "is-glob": "^4.0.0", + "normalize-path": "^3.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.2.1", + "upath": "^1.1.1" + } + }, + "debug": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", + "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + }, + "del": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", + "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "globby": "^6.1.0", + "is-path-cwd": "^2.0.0", + "is-path-in-cwd": "^2.0.0", + "p-map": "^2.0.0", + "pify": "^4.0.1", + "rimraf": "^2.6.3" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "^2.0.1", + "is-number": "^3.0.0", + "repeat-string": "^1.6.1", + "to-regex-range": "^2.1.0" + }, + "dependencies": { + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "^0.1.0" + } + } + } + }, + "fsevents": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", + "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", + "dev": true, + "optional": true, + "requires": { + "nan": "^2.12.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "^3.1.0", + "path-dirname": "^1.0.0" + }, + "dependencies": { + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "^2.1.0" + } + } + } + }, + "globby": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", + "integrity": "sha1-9abXDoOV4hyFj7BInWTfAkJNUGw=", + "dev": true, + "requires": { + "array-union": "^1.0.1", + "glob": "^7.0.3", + "object-assign": "^4.0.1", + "pify": "^2.0.0", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + } + } + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "is-path-cwd": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", + "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", + "dev": true + }, + "is-path-in-cwd": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", + "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", + "dev": true, + "requires": { + "is-path-inside": "^2.1.0" + } + }, + "is-path-inside": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", + "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", + "dev": true, + "requires": { + "path-is-inside": "^1.0.2" + } + }, + "micromatch": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz", + "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==", + "dev": true, + "requires": { + "arr-diff": "^4.0.0", + "array-unique": "^0.3.2", + "braces": "^2.3.1", + "define-property": "^2.0.2", + "extend-shallow": "^3.0.2", + "extglob": "^2.0.4", + "fragment-cache": "^0.2.1", + "kind-of": "^6.0.2", + "nanomatch": "^1.2.9", + "object.pick": "^1.3.0", + "regex-not": "^1.0.0", + "snapdragon": "^0.8.1", + "to-regex": "^3.0.2" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "readdirp": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz", + "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.11", + "micromatch": "^3.1.10", + "readable-stream": "^2.0.2" + } + }, + "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" + } + }, + "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" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "dev": true + }, + "supports-color": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz", + "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "^3.0.0", + "repeat-string": "^1.6.1" + } + } + } + }, + "webpack-log": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/webpack-log/-/webpack-log-2.0.0.tgz", + "integrity": "sha512-cX8G2vR/85UYG59FgkoMamwHUIkSSlV3bBMRsbxVXVUk2j6NleCKjQ/WE9eYg9WY4w25O9w8wKP4rzNZFmUcUg==", + "dev": true, + "requires": { + "ansi-colors": "^3.0.0", + "uuid": "^3.3.2" + } + }, + "webpack-merge": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-4.2.1.tgz", + "integrity": "sha512-4p8WQyS98bUJcCvFMbdGZyZmsKuWjWVnVHnAS3FFg0HDaRVrPbkivx2RYCre8UiemD67RsiFFLfn4JhLAin8Vw==", + "dev": true, + "requires": { + "lodash": "^4.17.5" + } + }, + "webpack-sources": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz", + "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==", + "dev": true, + "requires": { + "source-list-map": "^2.0.0", + "source-map": "~0.6.1" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, + "webpack-subresource-integrity": { + "version": "1.1.0-rc.6", + "resolved": "https://registry.npmjs.org/webpack-subresource-integrity/-/webpack-subresource-integrity-1.1.0-rc.6.tgz", + "integrity": "sha512-Az7y8xTniNhaA0620AV1KPwWOqawurVVDzQSpPAeR5RwNbL91GoBSJAAo9cfd+GiFHwsS5bbHepBw1e6Hzxy4w==", + "dev": true, + "requires": { + "webpack-core": "^0.6.8" + } + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } + }, + "websocket-extensions": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", + "dev": true + }, + "when": { + "version": "3.6.4", + "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz", + "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "optional": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "optional": true, + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "worker-farm": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.7.0.tgz", + "integrity": "sha512-rvw3QTZc8lAxyVrqcSGVm5yP/IJ2UcB3U0graE3LCFoZ0Yn2x4EoVSqJKdB/T5M+FLcRPjz4TDacRf3OCfNUzw==", + "dev": true, + "requires": { + "errno": "~0.1.7" + } + }, + "worker-plugin": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/worker-plugin/-/worker-plugin-3.2.0.tgz", + "integrity": "sha512-W5nRkw7+HlbsEt3qRP6MczwDDISjiRj2GYt9+bpe8A2La00TmJdwzG5bpdMXhRt1qcWmwAvl1TiKaHRa+XDS9Q==", + "dev": true, + "requires": { + "loader-utils": "^1.1.0" + } + }, + "wrap-ansi": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz", + "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==", + "requires": { + "ansi-styles": "^3.2.0", + "string-width": "^3.0.0", + "strip-ansi": "^5.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "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==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", + "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==", + "dev": true, + "requires": { + "async-limiter": "~1.0.0" + } + }, + "xhr2": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/xhr2/-/xhr2-0.1.4.tgz", + "integrity": "sha1-f4dliEdxbbUCYyOBL4GMras4el8=" + }, + "xml2js": { + "version": "0.4.23", + "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", + "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", + "optional": true, + "requires": { + "sax": ">=0.6.0", + "xmlbuilder": "~11.0.0" + } + }, + "xmlbuilder": { + "version": "11.0.1", + "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", + "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", + "optional": true + }, + "xmlhttprequest-ssl": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz", + "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", + "dev": true + }, + "xtend": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", + "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", + "dev": true + }, + "y18n": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", + "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "yargs": { + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", + "requires": { + "cliui": "^5.0.0", + "find-up": "^3.0.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^3.0.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==" + }, + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "requires": { + "locate-path": "^3.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + } + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "dependencies": { + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" + } + } + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=", + "dev": true + }, + "yn": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", + "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "optional": 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 + }, + "zone.js": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.9.1.tgz", + "integrity": "sha512-GkPiJL8jifSrKReKaTZ5jkhrMEgXbXYC+IPo1iquBjayRa0q86w3Dipjn8b415jpitMExe9lV8iTsv8tk3DGag==" + } + } +} diff --git a/Tests/WebApiFluent/ClientApp/package.json b/Tests/WebApiFluent/ClientApp/package.json new file mode 100644 index 00000000..e4e15c15 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/package.json @@ -0,0 +1,63 @@ +{ + "name": "webapifluent", + "version": "0.0.0", + "scripts": { + "ng": "ng", + "start": "ng serve", + "build": "ng build", + "build:ssr": "ng run WebApiFluent:server:dev", + "test": "ng test", + "lint": "ng lint", + "e2e": "ng e2e" + }, + "private": true, + "dependencies": { + "@angular/animations": "8.2.12", + "@angular/common": "8.2.12", + "@angular/compiler": "8.2.12", + "@angular/core": "8.2.12", + "@angular/forms": "8.2.12", + "@angular/platform-browser": "8.2.12", + "@angular/platform-browser-dynamic": "8.2.12", + "@angular/platform-server": "8.2.12", + "@angular/router": "8.2.12", + "@nguniversal/module-map-ngfactory-loader": "8.1.1", + "bootstrap": "^4.6.0", + "core-js": "^3.8.3", + "jquery": "^3.5.1", + "node-sass": "^5.0.0", + "oidc-client": "^1.11.3", + "popper.js": "^1.16.0", + "prettier": "^2.4.1", + "protractor": "~5.4.2", + "rxjs": "^6.6.3", + "ts-node": "~8.4.1", + "tslint": "~5.20.0", + "zone.js": "0.9.1" + }, + "devDependencies": { + "@angular-devkit/build-angular": "^0.803.29", + "@angular/cli": "^8.3.29", + "@angular/compiler-cli": "^8.2.14", + "@angular/language-service": "^8.2.14", + "@types/jasmine": "~3.4.4", + "@types/jasminewd2": "~2.0.8", + "@types/node": "~12.11.6", + "codelyzer": "^5.2.2", + "ini": "^1.3.7", + "jasmine-core": "~3.5.0", + "jasmine-spec-reporter": "~4.2.1", + "karma": "^5.2.3", + "karma-chrome-launcher": "~3.1.0", + "karma-coverage-istanbul-reporter": "~2.1.0", + "karma-jasmine": "~2.0.1", + "karma-jasmine-html-reporter": "^1.5.4", + "typescript": "3.5.3" + }, + "optionalDependencies": { + "node-sass": "^5.0.0", + "protractor": "~5.4.2", + "ts-node": "~8.4.1", + "tslint": "~5.20.0" + } +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/app.component.html b/Tests/WebApiFluent/ClientApp/src/app/app.component.html new file mode 100644 index 00000000..7173845e --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/app.component.html @@ -0,0 +1,6 @@ + + +
+ +
+ diff --git a/Tests/WebApiFluent/ClientApp/src/app/app.component.ts b/Tests/WebApiFluent/ClientApp/src/app/app.component.ts new file mode 100644 index 00000000..0a40b8c1 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/app.component.ts @@ -0,0 +1,9 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-root', + templateUrl: './app.component.html' +}) +export class AppComponent { + title = 'app'; +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/app.module.ts b/Tests/WebApiFluent/ClientApp/src/app/app.module.ts new file mode 100644 index 00000000..cecddedb --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/app.module.ts @@ -0,0 +1,34 @@ +import { BrowserModule } from '@angular/platform-browser'; +import { NgModule } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { HttpClientModule } from '@angular/common/http'; +import { RouterModule } from '@angular/router'; + +import { AppComponent } from './app.component'; +import { NavMenuComponent } from './nav-menu/nav-menu.component'; +import { HomeComponent } from './home/home.component'; +import { CounterComponent } from './counter/counter.component'; +import { FetchDataComponent } from './fetch-data/fetch-data.component'; + +@NgModule({ + declarations: [ + AppComponent, + NavMenuComponent, + HomeComponent, + CounterComponent, + FetchDataComponent + ], + imports: [ + BrowserModule.withServerTransition({ appId: 'ng-cli-universal' }), + HttpClientModule, + FormsModule, + RouterModule.forRoot([ + { path: '', component: HomeComponent, pathMatch: 'full' }, + { path: 'counter', component: CounterComponent }, + { path: 'fetch-data', component: FetchDataComponent }, + ]) + ], + providers: [], + bootstrap: [AppComponent] +}) +export class AppModule { } diff --git a/Tests/WebApiFluent/ClientApp/src/app/app.server.module.ts b/Tests/WebApiFluent/ClientApp/src/app/app.server.module.ts new file mode 100644 index 00000000..cfb0e021 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/app.server.module.ts @@ -0,0 +1,11 @@ +import { NgModule } from '@angular/core'; +import { ServerModule } from '@angular/platform-server'; +import { ModuleMapLoaderModule } from '@nguniversal/module-map-ngfactory-loader'; +import { AppComponent } from './app.component'; +import { AppModule } from './app.module'; + +@NgModule({ + imports: [AppModule, ServerModule, ModuleMapLoaderModule], + bootstrap: [AppComponent] +}) +export class AppServerModule { } diff --git a/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.html b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.html new file mode 100644 index 00000000..89b9c80f --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.html @@ -0,0 +1,7 @@ +

Counter

+ +

This is a simple example of an Angular component.

+ +

Current count: {{ currentCount }}

+ + diff --git a/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.spec.ts b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.spec.ts new file mode 100644 index 00000000..37b350cc --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.spec.ts @@ -0,0 +1,34 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CounterComponent } from './counter.component'; + +describe('CounterComponent', () => { + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CounterComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CounterComponent); + fixture.detectChanges(); + }); + + it('should display a title', async(() => { + const titleText = fixture.nativeElement.querySelector('h1').textContent; + expect(titleText).toEqual('Counter'); + })); + + it('should start with count 0, then increments by 1 when clicked', async(() => { + const countElement = fixture.nativeElement.querySelector('strong'); + expect(countElement.textContent).toEqual('0'); + + const incrementButton = fixture.nativeElement.querySelector('button'); + incrementButton.click(); + fixture.detectChanges(); + expect(countElement.textContent).toEqual('1'); + })); +}); diff --git a/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.ts b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.ts new file mode 100644 index 00000000..1f336aa9 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/counter/counter.component.ts @@ -0,0 +1,13 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-counter-component', + templateUrl: './counter.component.html' +}) +export class CounterComponent { + public currentCount = 0; + + public incrementCounter() { + this.currentCount++; + } +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.html b/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.html new file mode 100644 index 00000000..19b3835d --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.html @@ -0,0 +1,24 @@ +

Weather forecast

+ +

This component demonstrates fetching data from the server.

+ +

Loading...

+ + + + + + + + + + + + + + + + + + +
DateTemp. (C)Temp. (F)Summary
{{ forecast.date }}{{ forecast.temperatureC }}{{ forecast.temperatureF }}{{ forecast.summary }}
diff --git a/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.ts b/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.ts new file mode 100644 index 00000000..9b81e1be --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/fetch-data/fetch-data.component.ts @@ -0,0 +1,23 @@ +import { Component, Inject } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'app-fetch-data', + templateUrl: './fetch-data.component.html' +}) +export class FetchDataComponent { + public forecasts: WeatherForecast[]; + + constructor(http: HttpClient, @Inject('BASE_URL') baseUrl: string) { + http.get(baseUrl + 'weatherforecast').subscribe(result => { + this.forecasts = result; + }, error => console.error(error)); + } +} + +interface WeatherForecast { + date: string; + temperatureC: number; + temperatureF: number; + summary: string; +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/home/home.component.html b/Tests/WebApiFluent/ClientApp/src/app/home/home.component.html new file mode 100644 index 00000000..f74c2e78 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/home/home.component.html @@ -0,0 +1,14 @@ +

Hello, world!

+

Welcome to your new single-page application, built with:

+ +

To help you get started, we've also set up:

+
    +
  • Client-side navigation. For example, click Counter then Back to return here.
  • +
  • Angular CLI integration. In development mode, there's no need to run ng serve. It runs in the background automatically, so your client-side resources are dynamically built on demand and the page refreshes when you modify any file.
  • +
  • Efficient production builds. In production mode, development-time features are disabled, and your dotnet publish configuration automatically invokes ng build to produce minified, ahead-of-time compiled JavaScript files.
  • +
+

The ClientApp subdirectory is a standard Angular CLI application. If you open a command prompt in that directory, you can run any ng command (e.g., ng test), or use npm to install extra packages into it.

diff --git a/Tests/WebApiFluent/ClientApp/src/app/home/home.component.ts b/Tests/WebApiFluent/ClientApp/src/app/home/home.component.ts new file mode 100644 index 00000000..2747b302 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/home/home.component.ts @@ -0,0 +1,8 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-home', + templateUrl: './home.component.html', +}) +export class HomeComponent { +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/models/weather-forecast.ts b/Tests/WebApiFluent/ClientApp/src/app/models/weather-forecast.ts new file mode 100644 index 00000000..9ffa2354 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/models/weather-forecast.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export class WeatherForecast { + public date?: Date; + public temperatureC?: number; + public temperatureF?: number; + public summary?: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:7d7037b1-21de-4798-a761-dcb57d990403 diff --git a/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.css b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.css new file mode 100644 index 00000000..10389ef9 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.css @@ -0,0 +1,18 @@ +a.navbar-brand { + white-space: normal; + text-align: center; + word-break: break-all; +} + +html { + font-size: 14px; +} +@media (min-width: 768px) { + html { + font-size: 16px; + } +} + +.box-shadow { + box-shadow: 0 .25rem .75rem rgba(0, 0, 0, .05); +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.html b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.html new file mode 100644 index 00000000..04e9825f --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.html @@ -0,0 +1,44 @@ +
+ +
diff --git a/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.ts b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.ts new file mode 100644 index 00000000..327a3743 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/nav-menu/nav-menu.component.ts @@ -0,0 +1,18 @@ +import { Component } from '@angular/core'; + +@Component({ + selector: 'app-nav-menu', + templateUrl: './nav-menu.component.html', + styleUrls: ['./nav-menu.component.css'] +}) +export class NavMenuComponent { + isExpanded = false; + + collapse() { + this.isExpanded = false; + } + + toggle() { + this.isExpanded = !this.isExpanded; + } +} diff --git a/Tests/WebApiFluent/ClientApp/src/app/services/weather-forecast.service.ts b/Tests/WebApiFluent/ClientApp/src/app/services/weather-forecast.service.ts new file mode 100644 index 00000000..d4ffa1e0 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/app/services/weather-forecast.service.ts @@ -0,0 +1,64 @@ +/* eslint-disable */ +// tslint:disable + +import { WeatherForecast } from "../models/weather-forecast"; +import { HttpClient } from "@angular/common/http"; +import { Injectable } from "@angular/core"; +import { Observable } from "rxjs"; +import { Subject } from "rxjs"; + +@Injectable({ + providedIn: "root" +}) +export class WeatherForecastService { + private readonly http: HttpClient; + private serviceUrlValue: string = ""; + public httpOptions: {} = {}; + + public get serviceUrl(): string { + return this.serviceUrlValue; + } + public set serviceUrl(value: string) { + this.serviceUrlValue = value.replace(/\/+$/, ""); + } + + public constructor(http: HttpClient) { + this.http = http; + this.serviceUrl = document.baseURI ?? ""; + } + + public get(httpOptions?: {}): Observable { + let subject = new Subject(); + httpOptions = { ...this.httpOptions, ...httpOptions}; + let url: string = this.serviceUrl + "/weatherforecast"; + this.http.get(url, httpOptions).subscribe((result) => { + if (result) { + result.forEach((entry) => { + entry.date = this.convertToDate(entry.date); + }); + } + subject.next(this.fixUndefined(result)); + subject.complete(); + }, (error) => subject.error(error)); + return subject; + } + + private convertToDate(value: string | Date | undefined): Date | undefined { + return value === "0001-01-01T00:00:00" ? new Date("0001-01-01T00:00:00Z") : typeof(value) === "string" ? new Date(value) : value; + } + + private fixUndefined(value: any): any { + if (! value) { + return value ?? undefined; + } + if (Array.isArray(value)) { + value.forEach((entry, index) => value[index] = this.fixUndefined(entry)); + } + if (typeof value === 'object') { + for (const key of Object.keys(value)) { value[key] = this.fixUndefined(value[key]); } + } + return value; + } +} + +// outputid:7d7037b1-21de-4798-a761-dcb57d990403 diff --git a/Tests/WebApiFluent/ClientApp/src/assets/.gitkeep b/Tests/WebApiFluent/ClientApp/src/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/Tests/WebApiFluent/ClientApp/src/environments/environment.prod.ts b/Tests/WebApiFluent/ClientApp/src/environments/environment.prod.ts new file mode 100644 index 00000000..3612073b --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/environments/environment.prod.ts @@ -0,0 +1,3 @@ +export const environment = { + production: true +}; diff --git a/Tests/WebApiFluent/ClientApp/src/environments/environment.ts b/Tests/WebApiFluent/ClientApp/src/environments/environment.ts new file mode 100644 index 00000000..012182ef --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/environments/environment.ts @@ -0,0 +1,15 @@ +// This file can be replaced during build by using the `fileReplacements` array. +// `ng build ---prod` replaces `environment.ts` with `environment.prod.ts`. +// The list of file replacements can be found in `angular.json`. + +export const environment = { + production: false +}; + +/* + * In development mode, to ignore zone related error stack frames such as + * `zone.run`, `zoneDelegate.invokeTask` for easier debugging, you can + * import the following file, but please comment it out in production mode + * because it will have performance impact when throw error + */ +// import 'zone.js/dist/zone-error'; // Included with Angular CLI. diff --git a/Tests/WebApiFluent/ClientApp/src/index.html b/Tests/WebApiFluent/ClientApp/src/index.html new file mode 100644 index 00000000..1895c59f --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/index.html @@ -0,0 +1,14 @@ + + + + + Codestin Search App + + + + + + + Loading... + + diff --git a/Tests/WebApiFluent/ClientApp/src/karma.conf.js b/Tests/WebApiFluent/ClientApp/src/karma.conf.js new file mode 100644 index 00000000..4a9730b9 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/karma.conf.js @@ -0,0 +1,31 @@ +// Karma configuration file, see link for more information +// https://karma-runner.github.io/1.0/config/configuration-file.html + +module.exports = function (config) { + config.set({ + basePath: '', + frameworks: ['jasmine', '@angular-devkit/build-angular'], + plugins: [ + require('karma-jasmine'), + require('karma-chrome-launcher'), + require('karma-jasmine-html-reporter'), + require('karma-coverage-istanbul-reporter'), + require('@angular-devkit/build-angular/plugins/karma') + ], + client: { + clearContext: false // leave Jasmine Spec Runner output visible in browser + }, + coverageIstanbulReporter: { + dir: require('path').join(__dirname, '../coverage'), + reports: ['html', 'lcovonly'], + fixWebpackSourcePaths: true + }, + reporters: ['progress', 'kjhtml'], + port: 9876, + colors: true, + logLevel: config.LOG_INFO, + autoWatch: true, + browsers: ['Chrome'], + singleRun: false + }); +}; diff --git a/Tests/WebApiFluent/ClientApp/src/main.ts b/Tests/WebApiFluent/ClientApp/src/main.ts new file mode 100644 index 00000000..a2f708cb --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/main.ts @@ -0,0 +1,20 @@ +import { enableProdMode } from '@angular/core'; +import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; + +import { AppModule } from './app/app.module'; +import { environment } from './environments/environment'; + +export function getBaseUrl() { + return document.getElementsByTagName('base')[0].href; +} + +const providers = [ + { provide: 'BASE_URL', useFactory: getBaseUrl, deps: [] } +]; + +if (environment.production) { + enableProdMode(); +} + +platformBrowserDynamic(providers).bootstrapModule(AppModule) + .catch(err => console.log(err)); diff --git a/Tests/WebApiFluent/ClientApp/src/polyfills.ts b/Tests/WebApiFluent/ClientApp/src/polyfills.ts new file mode 100644 index 00000000..aa665d6b --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/polyfills.ts @@ -0,0 +1,63 @@ +/** + * This file includes polyfills needed by Angular and is loaded before the app. + * You can add your own extra polyfills to this file. + * + * This file is divided into 2 sections: + * 1. Browser polyfills. These are applied before loading ZoneJS and are sorted by browsers. + * 2. Application imports. Files imported after ZoneJS that should be loaded before your main + * file. + * + * The current setup is for so-called "evergreen" browsers; the last versions of browsers that + * automatically update themselves. This includes Safari >= 10, Chrome >= 55 (including Opera), + * Edge >= 13 on the desktop, and iOS 10 and Chrome on mobile. + * + * Learn more in https://angular.io/guide/browser-support + */ + +/*************************************************************************************************** + * BROWSER POLYFILLS + */ + +/** IE10 and IE11 requires the following for NgClass support on SVG elements */ +// import 'classlist.js'; // Run `npm install --save classlist.js`. + +/** + * Web Animations `@angular/platform-browser/animations` + * Only required if AnimationBuilder is used within the application and using IE/Edge or Safari. + * Standard animation support in Angular DOES NOT require any polyfills (as of Angular 6.0). + */ +// import 'web-animations-js'; // Run `npm install --save web-animations-js`. + +/** + * By default, zone.js will patch all possible macroTask and DomEvents + * user can disable parts of macroTask/DomEvents patch by setting following flags + * because those flags need to be set before `zone.js` being loaded, and webpack + * will put import in the top of bundle, so user need to create a separate file + * in this directory (for example: zone-flags.ts), and put the following flags + * into that file, and then add the following code before importing zone.js. + * import './zone-flags.ts'; + * + * The flags allowed in zone-flags.ts are listed here. + * + * The following flags will work for all browsers. + * + * (window as any).__Zone_disable_requestAnimationFrame = true; // disable patch requestAnimationFrame + * (window as any).__Zone_disable_on_property = true; // disable patch onProperty such as onclick + * (window as any).__zone_symbol__UNPATCHED_EVENTS = ['scroll', 'mousemove']; // disable patch specified eventNames + * + * in IE/Edge developer tools, the addEventListener will also be wrapped by zone.js + * with the following flag, it will bypass `zone.js` patch for IE/Edge + * + * (window as any).__Zone_enable_cross_context_check = true; + * + */ + +/*************************************************************************************************** + * Zone JS is required by default for Angular itself. + */ +import 'zone.js/dist/zone'; // Included with Angular CLI. + + +/*************************************************************************************************** + * APPLICATION IMPORTS + */ diff --git a/Tests/WebApiFluent/ClientApp/src/styles.css b/Tests/WebApiFluent/ClientApp/src/styles.css new file mode 100644 index 00000000..3ef6a649 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/styles.css @@ -0,0 +1,16 @@ +/* You can add global styles to this file, and also import other style files */ + +/* Provide sufficient contrast against white background */ +a { + color: #0366d6; +} + +code { + color: #e01a76; +} + +.btn-primary { + color: #fff; + background-color: #1b6ec2; + border-color: #1861ac; +} diff --git a/Tests/WebApiFluent/ClientApp/src/test.ts b/Tests/WebApiFluent/ClientApp/src/test.ts new file mode 100644 index 00000000..88492582 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/test.ts @@ -0,0 +1,20 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import 'zone.js/dist/zone-testing'; +import { getTestBed } from '@angular/core/testing'; +import { + BrowserDynamicTestingModule, + platformBrowserDynamicTesting +} from '@angular/platform-browser-dynamic/testing'; + +declare const require; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment( + BrowserDynamicTestingModule, + platformBrowserDynamicTesting() +); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/Tests/WebApiFluent/ClientApp/src/tsconfig.app.json b/Tests/WebApiFluent/ClientApp/src/tsconfig.app.json new file mode 100644 index 00000000..8ea061ea --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/tsconfig.app.json @@ -0,0 +1,11 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/app", + "types": [] + }, + "exclude": [ + "src/test.ts", + "**/*.spec.ts" + ] +} diff --git a/Tests/WebApiFluent/ClientApp/src/tsconfig.server.json b/Tests/WebApiFluent/ClientApp/src/tsconfig.server.json new file mode 100644 index 00000000..3f183ef3 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/tsconfig.server.json @@ -0,0 +1,9 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "module": "commonjs" + }, + "angularCompilerOptions": { + "entryModule": "app/app.server.module#AppServerModule" + } +} diff --git a/Tests/WebApiFluent/ClientApp/src/tsconfig.spec.json b/Tests/WebApiFluent/ClientApp/src/tsconfig.spec.json new file mode 100644 index 00000000..de773363 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/tsconfig.spec.json @@ -0,0 +1,18 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "outDir": "../out-tsc/spec", + "types": [ + "jasmine", + "node" + ] + }, + "files": [ + "test.ts", + "polyfills.ts" + ], + "include": [ + "**/*.spec.ts", + "**/*.d.ts" + ] +} diff --git a/Tests/WebApiFluent/ClientApp/src/tslint.json b/Tests/WebApiFluent/ClientApp/src/tslint.json new file mode 100644 index 00000000..52e2c1a5 --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/src/tslint.json @@ -0,0 +1,17 @@ +{ + "extends": "../tslint.json", + "rules": { + "directive-selector": [ + true, + "attribute", + "app", + "camelCase" + ], + "component-selector": [ + true, + "element", + "app", + "kebab-case" + ] + } +} diff --git a/Tests/WebApiFluent/ClientApp/tsconfig.json b/Tests/WebApiFluent/ClientApp/tsconfig.json new file mode 100644 index 00000000..b93cbfce --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/tsconfig.json @@ -0,0 +1,21 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "baseUrl": "./", + "module": "esnext", + "outDir": "./dist/out-tsc", + "sourceMap": true, + "declaration": false, + "moduleResolution": "node", + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es2015", + "typeRoots": [ + "node_modules/@types" + ], + "lib": [ + "es2017", + "dom" + ] + } +} diff --git a/Tests/WebApiFluent/ClientApp/tslint.json b/Tests/WebApiFluent/ClientApp/tslint.json new file mode 100644 index 00000000..f5f06e9e --- /dev/null +++ b/Tests/WebApiFluent/ClientApp/tslint.json @@ -0,0 +1,130 @@ +{ + "rulesDirectory": [ + "node_modules/codelyzer" + ], + "rules": { + "arrow-return-shorthand": true, + "callable-types": true, + "class-name": true, + "comment-format": [ + true, + "check-space" + ], + "curly": true, + "deprecation": { + "severity": "warn" + }, + "eofline": true, + "forin": true, + "import-blacklist": [ + true, + "rxjs/Rx" + ], + "import-spacing": true, + "indent": [ + true, + "spaces" + ], + "interface-over-type-literal": true, + "label-position": true, + "max-line-length": [ + true, + 140 + ], + "member-access": false, + "member-ordering": [ + true, + { + "order": [ + "static-field", + "instance-field", + "static-method", + "instance-method" + ] + } + ], + "no-arg": true, + "no-bitwise": true, + "no-console": [ + true, + "debug", + "info", + "time", + "timeEnd", + "trace" + ], + "no-construct": true, + "no-debugger": true, + "no-duplicate-super": true, + "no-empty": false, + "no-empty-interface": true, + "no-eval": true, + "no-inferrable-types": [ + true, + "ignore-params" + ], + "no-misused-new": true, + "no-non-null-assertion": true, + "no-shadowed-variable": true, + "no-string-literal": false, + "no-string-throw": true, + "no-switch-case-fall-through": true, + "no-trailing-whitespace": true, + "no-unnecessary-initializer": true, + "no-unused-expression": true, + "no-use-before-declare": true, + "no-var-keyword": true, + "object-literal-sort-keys": false, + "one-line": [ + true, + "check-open-brace", + "check-catch", + "check-else", + "check-whitespace" + ], + "prefer-const": true, + "quotemark": [ + true, + "single" + ], + "radix": true, + "semicolon": [ + true, + "always" + ], + "triple-equals": [ + true, + "allow-null-check" + ], + "typedef-whitespace": [ + true, + { + "call-signature": "nospace", + "index-signature": "nospace", + "parameter": "nospace", + "property-declaration": "nospace", + "variable-declaration": "nospace" + } + ], + "unified-signatures": true, + "variable-name": false, + "whitespace": [ + true, + "check-branch", + "check-decl", + "check-operator", + "check-separator", + "check-type" + ], + "no-output-on-prefix": true, + "no-inputs-metadata-property": true, + "no-outputs-metadata-property": true, + "no-host-metadata-property": true, + "no-input-rename": true, + "no-output-rename": true, + "use-lifecycle-interface": true, + "use-pipe-transform-interface": true, + "component-class-suffix": true, + "directive-class-suffix": true + } +} diff --git a/Tests/WebApiFluent/Controllers/WeatherForecastController.cs b/Tests/WebApiFluent/Controllers/WeatherForecastController.cs new file mode 100644 index 00000000..7762e816 --- /dev/null +++ b/Tests/WebApiFluent/Controllers/WeatherForecastController.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.Logging; + +namespace WebApiFluent.Controllers +{ + [ApiController] + [Route("[controller]")] + public class WeatherForecastController : ControllerBase + { + private static readonly string[] Summaries = new[] + { + "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching" + }; + + private readonly ILogger _logger; + + public WeatherForecastController(ILogger logger) + { + _logger = logger; + } + + [HttpGet] + public IEnumerable Get() + { + var rng = new Random(); + return Enumerable.Range(1, 5).Select(index => new WeatherForecast + { + Date = DateTime.Now.AddDays(index), + TemperatureC = rng.Next(-20, 55), + Summary = Summaries[rng.Next(Summaries.Length)] + }) + .ToArray(); + } + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/Pages/Error.cshtml b/Tests/WebApiFluent/Pages/Error.cshtml new file mode 100644 index 00000000..2ad9ed71 --- /dev/null +++ b/Tests/WebApiFluent/Pages/Error.cshtml @@ -0,0 +1,26 @@ +@page +@model ErrorModel +@{ + ViewData["Title"] = "Error"; +} + +

Error.

+

An error occurred while processing your request.

+ +@if (Model.ShowRequestId) +{ +

+ Request ID: @Model.RequestId +

+} + +

Development Mode

+

+ Swapping to the Development environment displays detailed information about the error that occurred. +

+

+ The Development environment shouldn't be enabled for deployed applications. + It can result in displaying sensitive information from exceptions to end users. + For local debugging, enable the Development environment by setting the ASPNETCORE_ENVIRONMENT environment variable to Development + and restarting the app. +

\ No newline at end of file diff --git a/Tests/WebApiFluent/Pages/Error.cshtml.cs b/Tests/WebApiFluent/Pages/Error.cshtml.cs new file mode 100644 index 00000000..abec37fc --- /dev/null +++ b/Tests/WebApiFluent/Pages/Error.cshtml.cs @@ -0,0 +1,31 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Microsoft.AspNetCore.Mvc.RazorPages; +using Microsoft.Extensions.Logging; + +namespace WebApiFluent.Pages +{ + [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] + public class ErrorModel : PageModel + { + private readonly ILogger _logger; + + public ErrorModel(ILogger logger) + { + _logger = logger; + } + + public string RequestId { get; set; } + + public bool ShowRequestId => !string.IsNullOrEmpty(RequestId); + + public void OnGet() + { + RequestId = Activity.Current?.Id ?? HttpContext.TraceIdentifier; + } + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/Pages/_ViewImports.cshtml b/Tests/WebApiFluent/Pages/_ViewImports.cshtml new file mode 100644 index 00000000..74e2cbd5 --- /dev/null +++ b/Tests/WebApiFluent/Pages/_ViewImports.cshtml @@ -0,0 +1,3 @@ +@using WebApiFluent +@namespace WebApiFluent.Pages +@addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers \ No newline at end of file diff --git a/Tests/WebApiFluent/Program.cs b/Tests/WebApiFluent/Program.cs new file mode 100644 index 00000000..ea6e0635 --- /dev/null +++ b/Tests/WebApiFluent/Program.cs @@ -0,0 +1,23 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.Hosting; +using Microsoft.Extensions.Logging; + +namespace WebApiFluent +{ + public class Program + { + public static void Main(string[] args) + { + CreateHostBuilder(args).Build().Run(); + } + + public static IHostBuilder CreateHostBuilder(string[] args) => + Host.CreateDefaultBuilder(args) + .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup(); }); + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/Startup.cs b/Tests/WebApiFluent/Startup.cs new file mode 100644 index 00000000..43593d48 --- /dev/null +++ b/Tests/WebApiFluent/Startup.cs @@ -0,0 +1,72 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.HttpsPolicy; +using Microsoft.AspNetCore.SpaServices.AngularCli; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; + +namespace WebApiFluent +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + // This method gets called by the runtime. Use this method to add services to the container. + public void ConfigureServices(IServiceCollection services) + { + services.AddControllersWithViews(); + // In production, the Angular files will be served from this directory + services.AddSpaStaticFiles(configuration => { configuration.RootPath = "ClientApp/dist"; }); + } + + // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + else + { + app.UseExceptionHandler("/Error"); + // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. + app.UseHsts(); + } + + app.UseHttpsRedirection(); + app.UseStaticFiles(); + if (!env.IsDevelopment()) + { + app.UseSpaStaticFiles(); + } + + app.UseRouting(); + + app.UseEndpoints(endpoints => + { + endpoints.MapControllerRoute( + name: "default", + pattern: "{controller}/{action=Index}/{id?}"); + }); + + app.UseSpa(spa => + { + // To learn more about options for serving an Angular SPA from ASP.NET Core, + // see https://go.microsoft.com/fwlink/?linkid=864501 + + spa.Options.SourcePath = "ClientApp"; + + if (env.IsDevelopment()) + { + spa.UseAngularCliServer(npmScript: "start"); + } + }); + } + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/WeatherForecast.cs b/Tests/WebApiFluent/WeatherForecast.cs new file mode 100644 index 00000000..8915aacf --- /dev/null +++ b/Tests/WebApiFluent/WeatherForecast.cs @@ -0,0 +1,15 @@ +using System; + +namespace WebApiFluent +{ + public class WeatherForecast + { + public DateTime Date { get; set; } + + public int TemperatureC { get; set; } + + public int TemperatureF => 32 + (int)(TemperatureC / 0.5556); + + public string Summary { get; set; } + } +} \ No newline at end of file diff --git a/Tests/WebApiFluent/WebApiFluent.csproj b/Tests/WebApiFluent/WebApiFluent.csproj new file mode 100644 index 00000000..5ca511b8 --- /dev/null +++ b/Tests/WebApiFluent/WebApiFluent.csproj @@ -0,0 +1,54 @@ + + + + net5.0 + true + Latest + false + ClientApp\ + $(DefaultItemExcludes);$(SpaRoot)node_modules\** + + + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %(DistFiles.Identity) + PreserveNewest + true + + + + + diff --git a/Tests/WebApiFluent/appsettings.Development.json b/Tests/WebApiFluent/appsettings.Development.json new file mode 100644 index 00000000..8983e0fc --- /dev/null +++ b/Tests/WebApiFluent/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + } +} diff --git a/Tests/WebApiFluent/appsettings.json b/Tests/WebApiFluent/appsettings.json new file mode 100644 index 00000000..ad75fee4 --- /dev/null +++ b/Tests/WebApiFluent/appsettings.json @@ -0,0 +1,10 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, +"AllowedHosts": "*" +} diff --git a/Tests/WebApiFluent/wwwroot/favicon.ico b/Tests/WebApiFluent/wwwroot/favicon.ico new file mode 100644 index 00000000..63e859b4 Binary files /dev/null and b/Tests/WebApiFluent/wwwroot/favicon.ico differ diff --git a/Tests/build.cmd b/Tests/build.cmd index d3b83281..2abcea84 100644 --- a/Tests/build.cmd +++ b/Tests/build.cmd @@ -1,5 +1,9 @@ @title KY-Generator Tests +cd v10 +start build +cd .. + REM ========================================== REM || AnnotationsWithMultipleOutputs || REM ========================================== @@ -13,14 +17,15 @@ dotnet build --no-incremental cd .. REM ========================================== -REM || Types || +REM || Caseing || REM ========================================== REM -cd Types +cd Caseing.Generator rmdir /S/Q bin rmdir /S/Q Output -dotnet add package KY.Generator --prerelease -dotnet add package KY.Generator.Annotations --prerelease +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.Reflection --prerelease dotnet build --no-incremental cd .. @@ -30,16 +35,49 @@ REM ========================================== REM cd WebApiController rmdir /S/Q bin +rmdir /S/Q ClientApp\src\app\convert-to-interface\models +rmdir /S/Q ClientApp\src\app\convert-to-interface\services +rmdir /S/Q ClientApp\src\app\date\models +rmdir /S/Q ClientApp\src\app\date\services +rmdir /S/Q ClientApp\src\app\derived\models +rmdir /S/Q ClientApp\src\app\derived\services +rmdir /S/Q ClientApp\src\app\duplicate-name\models +rmdir /S/Q ClientApp\src\app\duplicate-name\services +rmdir /S/Q ClientApp\src\app\edge-cases\models +rmdir /S/Q ClientApp\src\app\edge-cases\services rmdir /S/Q ClientApp\src\app\fix-casing\models rmdir /S/Q ClientApp\src\app\fix-casing\services +rmdir /S/Q ClientApp\src\app\get-complex\models +rmdir /S/Q ClientApp\src\app\get-complex\services rmdir /S/Q ClientApp\src\app\keep-casing\models rmdir /S/Q ClientApp\src\app\keep-casing\services +rmdir /S/Q ClientApp\src\app\parameter-on-controller\models +rmdir /S/Q ClientApp\src\app\parameter-on-controller\services +rmdir /S/Q ClientApp\src\app\post\models +rmdir /S/Q ClientApp\src\app\post\services rmdir /S/Q ClientApp\src\app\produces\models rmdir /S/Q ClientApp\src\app\produces\services +rmdir /S/Q ClientApp\src\app\rename\models +rmdir /S/Q ClientApp\src\app\rename\services rmdir /S/Q ClientApp\src\app\routed\models rmdir /S/Q ClientApp\src\app\routed\services rmdir /S/Q ClientApp\src\app\versioned-api\models rmdir /S/Q ClientApp\src\app\versioned-api\services +rmdir /S/Q ClientApp\src\app\warnings\services +rmdir /S/Q ClientApp\src\app\warnings\models +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || UrlVersionedWebApiController || +REM ========================================== +REM +cd UrlVersionedWebApiController +rmdir /S/Q bin +rmdir /S/Q ClientApp\src\app\models +rmdir /S/Q ClientApp\src\app\services dotnet add package KY.Generator --prerelease dotnet add package KY.Generator.Annotations --prerelease dotnet build --no-incremental @@ -119,4 +157,97 @@ dotnet add package KY.Generator.Annotations --prerelease dotnet build --no-incremental cd .. -PAUSE \ No newline at end of file +REM ========================================== +REM || Formatting || +REM ========================================== +REM +cd Formatting\Generator +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.Reflection --prerelease +dotnet build --no-incremental +cd ..\.. + +REM ========================================== +REM || WebApiFluent || +REM ========================================== +REM +rmdir /S/Q WebApiFluent.Generator\bin +rmdir /S/Q WebApiFluent\ClientApp\src\app\models +rmdir /S/Q WebApiFluent\ClientApp\src\app\services +cd WebApiFluent.Generator +dotnet add package KY.Generator.Fluent --prerelease +dotnet add package KY.Generator.Angular --prerelease +dotnet add package KY.Generator.AspDotNet --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || Net5 || +REM ========================================== +REM +cd Net5 +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || Net6 || +REM ========================================== +REM +cd Net6 +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || Net7 || +REM ========================================== +REM +cd Net7 +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || Net8 || +REM ========================================== +REM +cd Net8 +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || Net9 || +REM ========================================== +REM +cd Net9 +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || SignalR || +REM ========================================== +REM +cd SignalR +rmdir /S/Q ClientApp\src\app\services +rmdir /S/Q ClientApp\src\app\models +rmdir /S/Q ClientApp\src\app\multiple +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. diff --git a/Tests/v10.sln b/Tests/v10.sln new file mode 100644 index 00000000..85b5777b --- /dev/null +++ b/Tests/v10.sln @@ -0,0 +1,52 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypesAnnotationsNotNullable", "v10\TypesAnnotationsNotNullable\TypesAnnotationsNotNullable.csproj", "{E2CB9FFE-9EA7-4262-8140-0584AC30B2FE}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "TypesAnnotationsNullable", "v10\TypesAnnotationsNullable\TypesAnnotationsNullable.csproj", "{AD084BCD-7AF6-4A96-8916-42CC842F41F8}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StrictAnnotationsNotNullable", "v10\StrictAnnotationsNotNullable\StrictAnnotationsNotNullable.csproj", "{C9C47C85-6BFE-4EF3-B777-03C1193F6ADB}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StrictAnnotationsNullable", "v10\StrictAnnotationsNullable\StrictAnnotationsNullable.csproj", "{FF4F3F37-D98A-458C-B14F-1C62AA344E6B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SelfReferencingAnnotationsNullable", "v10\SelfReferencingAnnotationsNullable\SelfReferencingAnnotationsNullable.csproj", "{B84D2F96-FBA8-416C-B067-F17F09809015}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "EnumAnnotationsNotNullable", "v10\EnumAnnotationsNotNullable\EnumAnnotationsNotNullable.csproj", "{6E81AC59-1AC5-47CF-A3F6-ABA0BD471546}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "InheritanceAnnotationsNotNullable", "v10\InheritanceAnnotationsNotNullable\InheritanceAnnotationsNotNullable.csproj", "{DE1DACB4-0916-4152-925D-BB9825CC3427}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E2CB9FFE-9EA7-4262-8140-0584AC30B2FE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E2CB9FFE-9EA7-4262-8140-0584AC30B2FE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E2CB9FFE-9EA7-4262-8140-0584AC30B2FE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E2CB9FFE-9EA7-4262-8140-0584AC30B2FE}.Release|Any CPU.Build.0 = Release|Any CPU + {AD084BCD-7AF6-4A96-8916-42CC842F41F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AD084BCD-7AF6-4A96-8916-42CC842F41F8}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AD084BCD-7AF6-4A96-8916-42CC842F41F8}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AD084BCD-7AF6-4A96-8916-42CC842F41F8}.Release|Any CPU.Build.0 = Release|Any CPU + {C9C47C85-6BFE-4EF3-B777-03C1193F6ADB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C9C47C85-6BFE-4EF3-B777-03C1193F6ADB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C9C47C85-6BFE-4EF3-B777-03C1193F6ADB}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C9C47C85-6BFE-4EF3-B777-03C1193F6ADB}.Release|Any CPU.Build.0 = Release|Any CPU + {FF4F3F37-D98A-458C-B14F-1C62AA344E6B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {FF4F3F37-D98A-458C-B14F-1C62AA344E6B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {FF4F3F37-D98A-458C-B14F-1C62AA344E6B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {FF4F3F37-D98A-458C-B14F-1C62AA344E6B}.Release|Any CPU.Build.0 = Release|Any CPU + {B84D2F96-FBA8-416C-B067-F17F09809015}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B84D2F96-FBA8-416C-B067-F17F09809015}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B84D2F96-FBA8-416C-B067-F17F09809015}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B84D2F96-FBA8-416C-B067-F17F09809015}.Release|Any CPU.Build.0 = Release|Any CPU + {6E81AC59-1AC5-47CF-A3F6-ABA0BD471546}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6E81AC59-1AC5-47CF-A3F6-ABA0BD471546}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6E81AC59-1AC5-47CF-A3F6-ABA0BD471546}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6E81AC59-1AC5-47CF-A3F6-ABA0BD471546}.Release|Any CPU.Build.0 = Release|Any CPU + {DE1DACB4-0916-4152-925D-BB9825CC3427}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DE1DACB4-0916-4152-925D-BB9825CC3427}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DE1DACB4-0916-4152-925D-BB9825CC3427}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DE1DACB4-0916-4152-925D-BB9825CC3427}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/Tests/v10/EnumAnnotationsNotNullable/AssemblyInfo.cs b/Tests/v10/EnumAnnotationsNotNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/EnumAnnotationsNotNullable/EnumAnnotationsNotNullable.csproj b/Tests/v10/EnumAnnotationsNotNullable/EnumAnnotationsNotNullable.csproj new file mode 100644 index 00000000..f3a7e2e4 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/EnumAnnotationsNotNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + disable + Enum + + + + + + + + + + + diff --git a/Tests/v10/EnumAnnotationsNotNullable/Enums.cs b/Tests/v10/EnumAnnotationsNotNullable/Enums.cs new file mode 100644 index 00000000..56756fa4 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Enums.cs @@ -0,0 +1,123 @@ +using KY.Generator; + +namespace Enum; + +[GenerateTypeScriptModel("Output")] +[GenerateStrict] +public class Enums +{ + public DefaultEnum DefaultEnum { get; set; } + public StartingIndexEnum StartingIndexEnum { get; set; } + public IndexedEnum IndexedEnum { get; set; } + public SkippedEnum SkippedEnum { get; set; } + public NegativeEnum NegativeEnum { get; set; } + public SpecialNameEnum SpecialNameEnum { get; set; } + + // Types + public ByteEnum ByteEnum { get; set; } + public SByteEnum SByteEnum { get; set; } + public ShortEnum ShortEnum { get; set; } + public UShortEnum UShortEnum { get; set; } + public IntEnum IntEnum { get; set; } + public UIntEnum UIntEnum { get; set; } + public LongEnum LongEnum { get; set; } + public ULongEnum ULongEnum { get; set; } +} + +public enum DefaultEnum +{ + Value1, + Value2, + Value3 +} + +public enum StartingIndexEnum +{ + Value1 = 1, + Value2, + Value3 +} + +public enum IndexedEnum +{ + Value1 = 10, + Value2 = 20, + Value3 = 5 +} + +public enum SkippedEnum +{ + Value1, + Value3 = 3, + Value4 +} + +public enum NegativeEnum +{ + Value1 = -1, + Value2 = -2, + Value0 = 0 +} + +public enum ByteEnum : byte +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum SByteEnum : sbyte +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum ShortEnum : short +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum UShortEnum : ushort +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum IntEnum : int +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum UIntEnum : uint +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum LongEnum : long +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum ULongEnum : ulong +{ + Value1 = 1, + Value2 = 2, + Value3 = 3 +} + +public enum SpecialNameEnum +{ + Default, + Number, + String +} diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/byte-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/byte-enum.ts new file mode 100644 index 00000000..bb416490 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/byte-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum ByteEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const ByteEnumValues = [1, 2, 3]; +export const ByteEnumNames = ["Value1", "Value2", "Value3"]; +export const ByteEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const ByteEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/default-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/default-enum.ts new file mode 100644 index 00000000..df8c96bb --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/default-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum DefaultEnum { + value1 = 0, + value2 = 1, + value3 = 2 +} + +export const DefaultEnumValues = [0, 1, 2]; +export const DefaultEnumNames = ["Value1", "Value2", "Value3"]; +export const DefaultEnumValueMapping: { [key: number]: string } = { 0: "Value1", 1: "Value2", 2: "Value3" }; +export const DefaultEnumNameMapping: { [key: string]: number } = { "Value1": 0, "Value2": 1, "Value3": 2 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/indexed-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/indexed-enum.ts new file mode 100644 index 00000000..ca1aeab8 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/indexed-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum IndexedEnum { + value1 = 10, + value2 = 20, + value3 = 5 +} + +export const IndexedEnumValues = [10, 20, 5]; +export const IndexedEnumNames = ["Value1", "Value2", "Value3"]; +export const IndexedEnumValueMapping: { [key: number]: string } = { 10: "Value1", 20: "Value2", 5: "Value3" }; +export const IndexedEnumNameMapping: { [key: string]: number } = { "Value1": 10, "Value2": 20, "Value3": 5 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/int-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/int-enum.ts new file mode 100644 index 00000000..29777813 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/int-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum IntEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const IntEnumValues = [1, 2, 3]; +export const IntEnumNames = ["Value1", "Value2", "Value3"]; +export const IntEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const IntEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/long-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/long-enum.ts new file mode 100644 index 00000000..89b68d17 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/long-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum LongEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const LongEnumValues = [1, 2, 3]; +export const LongEnumNames = ["Value1", "Value2", "Value3"]; +export const LongEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const LongEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/negative-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/negative-enum.ts new file mode 100644 index 00000000..c28b7ca8 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/negative-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum NegativeEnum { + value1 = -1, + value2 = -2, + value0 = 0 +} + +export const NegativeEnumValues = [-1, -2, 0]; +export const NegativeEnumNames = ["Value1", "Value2", "Value0"]; +export const NegativeEnumValueMapping: { [key: number]: string } = { -1: "Value1", -2: "Value2", 0: "Value0" }; +export const NegativeEnumNameMapping: { [key: string]: number } = { "Value1": -1, "Value2": -2, "Value0": 0 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/s-byte-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/s-byte-enum.ts new file mode 100644 index 00000000..c9000114 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/s-byte-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum SByteEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const SByteEnumValues = [1, 2, 3]; +export const SByteEnumNames = ["Value1", "Value2", "Value3"]; +export const SByteEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const SByteEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/short-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/short-enum.ts new file mode 100644 index 00000000..935a5e32 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/short-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum ShortEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const ShortEnumValues = [1, 2, 3]; +export const ShortEnumNames = ["Value1", "Value2", "Value3"]; +export const ShortEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const ShortEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/skipped-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/skipped-enum.ts new file mode 100644 index 00000000..300524cd --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/skipped-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum SkippedEnum { + value1 = 0, + value3 = 3, + value4 = 4 +} + +export const SkippedEnumValues = [0, 3, 4]; +export const SkippedEnumNames = ["Value1", "Value3", "Value4"]; +export const SkippedEnumValueMapping: { [key: number]: string } = { 0: "Value1", 3: "Value3", 4: "Value4" }; +export const SkippedEnumNameMapping: { [key: string]: number } = { "Value1": 0, "Value3": 3, "Value4": 4 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/special-name-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/special-name-enum.ts new file mode 100644 index 00000000..3338850a --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/special-name-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum SpecialNameEnum { + default = 0, + number = 1, + string = 2 +} + +export const SpecialNameEnumValues = [0, 1, 2]; +export const SpecialNameEnumNames = ["Default", "Number", "String"]; +export const SpecialNameEnumValueMapping: { [key: number]: string } = { 0: "Default", 1: "Number", 2: "String" }; +export const SpecialNameEnumNameMapping: { [key: string]: number } = { "Default": 0, "Number": 1, "String": 2 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/starting-index-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/starting-index-enum.ts new file mode 100644 index 00000000..82613abe --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/starting-index-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum StartingIndexEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const StartingIndexEnumValues = [1, 2, 3]; +export const StartingIndexEnumNames = ["Value1", "Value2", "Value3"]; +export const StartingIndexEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const StartingIndexEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/u-int-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/u-int-enum.ts new file mode 100644 index 00000000..3dbdeb6a --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/u-int-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum UIntEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const UIntEnumValues = [1, 2, 3]; +export const UIntEnumNames = ["Value1", "Value2", "Value3"]; +export const UIntEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const UIntEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/u-long-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/u-long-enum.ts new file mode 100644 index 00000000..c282a034 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/u-long-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum ULongEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const ULongEnumValues = [1, 2, 3]; +export const ULongEnumNames = ["Value1", "Value2", "Value3"]; +export const ULongEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const ULongEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/EnumAnnotationsNotNullable/Output/u-short-enum.ts b/Tests/v10/EnumAnnotationsNotNullable/Output/u-short-enum.ts new file mode 100644 index 00000000..2efad610 --- /dev/null +++ b/Tests/v10/EnumAnnotationsNotNullable/Output/u-short-enum.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +export enum UShortEnum { + value1 = 1, + value2 = 2, + value3 = 3 +} + +export const UShortEnumValues = [1, 2, 3]; +export const UShortEnumNames = ["Value1", "Value2", "Value3"]; +export const UShortEnumValueMapping: { [key: number]: string } = { 1: "Value1", 2: "Value2", 3: "Value3" }; +export const UShortEnumNameMapping: { [key: string]: number } = { "Value1": 1, "Value2": 2, "Value3": 3 }; + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/AssemblyInfo.cs b/Tests/v10/InheritanceAnnotationsNotNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Inheritance.cs b/Tests/v10/InheritanceAnnotationsNotNullable/Inheritance.cs new file mode 100644 index 00000000..0ecaec8a --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Inheritance.cs @@ -0,0 +1,54 @@ +using KY.Generator; + +namespace Inheritance; + +[GenerateTypeScriptModel("Output")] +[GenerateAngularModel("Output/Angular")] +[GenerateOnlySubTypes] +[GenerateStrict] +public class Inheritance +{ + public Derived Derived { get; set; } + public DeriveWithNew DeriveWithNew { get; set; } + public DerivedFromAbstract DerivedFromAbstract { get; set; } + public DerivedFromVirtual DerivedFromVirtual { get; set; } +} + +public class Base +{ + public string StringField; + public string StringProperty { get; set; } +} + +public class Derived : Base +{ } + +public class DeriveWithNew : Base +{ + public new string StringField; + public new int StringProperty { get; set; } +} + +public abstract class Abstract +{ + public string StringProperty { get; set; } + public abstract string AbstractProperty { get; set; } +} + +public class DerivedFromAbstract : Abstract +{ + public int IntProperty { get; set; } + public override string AbstractProperty { get; set; } +} + +public class Virtual +{ + public string StringProperty { get; set; } + public virtual string VirtualProperty { get; set; } +} + +public class DerivedFromVirtual : Virtual +{ + public int IntProperty { get; set; } + public override string VirtualProperty { get; set; } +} diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/InheritanceAnnotationsNotNullable.csproj b/Tests/v10/InheritanceAnnotationsNotNullable/InheritanceAnnotationsNotNullable.csproj new file mode 100644 index 00000000..0327c919 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/InheritanceAnnotationsNotNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + disable + Inheritance + + + + + + + + + + + diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/abstract.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/abstract.ts new file mode 100644 index 00000000..93b800f8 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/abstract.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// tslint:disable + +export abstract class Abstract { + public stringProperty: string; + public abstractProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/base.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/base.ts new file mode 100644 index 00000000..ebf73f93 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/base.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class Base { + public stringField: string; + public stringProperty: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derive-with-new.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derive-with-new.ts new file mode 100644 index 00000000..f483db7e --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derive-with-new.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +import { Base } from "./base"; + +export class DeriveWithNew extends Base { + public stringField: string; + public stringProperty: number; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-abstract.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-abstract.ts new file mode 100644 index 00000000..a06dcfea --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-abstract.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { Abstract } from "./abstract"; + +export class DerivedFromAbstract extends Abstract { + public intProperty: number; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-virtual.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-virtual.ts new file mode 100644 index 00000000..4bba8d28 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived-from-virtual.ts @@ -0,0 +1,15 @@ +/* eslint-disable */ +// tslint:disable + +import { Virtual } from "./virtual"; + +export class DerivedFromVirtual extends Virtual { + public intProperty: number; + + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived.ts new file mode 100644 index 00000000..f226980b --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/derived.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +import { Base } from "./base"; + +export class Derived extends Base { + public constructor(init?: Partial) { + super(); + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/index.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/index.ts new file mode 100644 index 00000000..9dc6fc4a --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/index.ts @@ -0,0 +1,9 @@ + +export * from "./abstract"; +export * from "./base"; +export * from "./derive-with-new"; +export * from "./derived-from-abstract"; +export * from "./derived-from-virtual"; +export * from "./derived"; +export * from "./virtual"; + diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/virtual.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/virtual.ts new file mode 100644 index 00000000..3ef67ec0 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/Angular/virtual.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export class Virtual { + public stringProperty: string; + public virtualProperty: string; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/abstract.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/abstract.ts new file mode 100644 index 00000000..93b800f8 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/abstract.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// tslint:disable + +export abstract class Abstract { + public stringProperty: string; + public abstractProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/base.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/base.ts new file mode 100644 index 00000000..1dfb0554 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/base.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// tslint:disable + +export class Base { + public stringField: string; + public stringProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/derive-with-new.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derive-with-new.ts new file mode 100644 index 00000000..769446b4 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derive-with-new.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// tslint:disable + +import { Base } from "./base"; + +export class DeriveWithNew extends Base { + public stringField: string; + public stringProperty: number; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-abstract.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-abstract.ts new file mode 100644 index 00000000..dfb13c13 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-abstract.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// tslint:disable + +import { Abstract } from "./abstract"; + +export class DerivedFromAbstract extends Abstract { + public intProperty: number; + public abstractProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-virtual.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-virtual.ts new file mode 100644 index 00000000..273e2ece --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived-from-virtual.ts @@ -0,0 +1,11 @@ +/* eslint-disable */ +// tslint:disable + +import { Virtual } from "./virtual"; + +export class DerivedFromVirtual extends Virtual { + public intProperty: number; + public virtualProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived.ts new file mode 100644 index 00000000..c686c6a2 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/derived.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// tslint:disable + +import { Base } from "./base"; + +export class Derived extends Base { +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/InheritanceAnnotationsNotNullable/Output/virtual.ts b/Tests/v10/InheritanceAnnotationsNotNullable/Output/virtual.ts new file mode 100644 index 00000000..68065f52 --- /dev/null +++ b/Tests/v10/InheritanceAnnotationsNotNullable/Output/virtual.ts @@ -0,0 +1,9 @@ +/* eslint-disable */ +// tslint:disable + +export class Virtual { + public stringProperty: string; + public virtualProperty: string; +} + +// outputid:605e91d7-ee13-4f1d-9b92-845bb3ace852 diff --git a/Tests/v10/SelfReferencingAnnotationsNullable/AssemblyInfo.cs b/Tests/v10/SelfReferencingAnnotationsNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/SelfReferencingAnnotationsNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/SelfReferencingAnnotationsNullable/Output/self-referencing-type.ts b/Tests/v10/SelfReferencingAnnotationsNullable/Output/self-referencing-type.ts new file mode 100644 index 00000000..63aac0c2 --- /dev/null +++ b/Tests/v10/SelfReferencingAnnotationsNullable/Output/self-referencing-type.ts @@ -0,0 +1,14 @@ +/* eslint-disable */ +// tslint:disable + +export class SelfReferencingType { + public stringProperty?: string | undefined; + public selfProperty: SelfReferencingType; + public selfList?: SelfReferencingType[] | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingAnnotationsNullable.csproj b/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingAnnotationsNullable.csproj new file mode 100644 index 00000000..90ea1ad2 --- /dev/null +++ b/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingAnnotationsNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + enable + SelfReferencing + + + + + + + + + + + diff --git a/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingType.cs b/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingType.cs new file mode 100644 index 00000000..3e1a7daf --- /dev/null +++ b/Tests/v10/SelfReferencingAnnotationsNullable/SelfReferencingType.cs @@ -0,0 +1,12 @@ +using KY.Generator; + +namespace SelfReferencing; + +[GenerateTypeScriptModel] +[GenerateStrict] +public class SelfReferencingType +{ + public string StringProperty { get; set; } = ""; + public SelfReferencingType? SelfProperty { get; set; } + public List SelfList { get; set; } = []; +} diff --git a/Tests/v10/StrictAnnotationsNotNullable/AssemblyInfo.cs b/Tests/v10/StrictAnnotationsNotNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-class.ts b/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-class.ts new file mode 100644 index 00000000..a3c17e28 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-class.ts @@ -0,0 +1,16 @@ +/* eslint-disable */ +// tslint:disable + +export class NotStrictClass { + public stringProperty?: string; + public requiredStringProperty: string; + public intProperty: number; + public nullableIntProperty?: number; + public requiredNullableIntProperty: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-interface.ts b/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-interface.ts new file mode 100644 index 00000000..0802aaba --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/Output/not-strict-interface.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export interface NotStrictInterface { + stringProperty?: string; + requiredStringProperty: string; + intProperty: number; + nullableIntProperty?: number; + requiredNullableIntProperty: number; +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/StrictAnnotationsNotNullable/Output/strict-class.ts b/Tests/v10/StrictAnnotationsNotNullable/Output/strict-class.ts new file mode 100644 index 00000000..8b5f6603 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/Output/strict-class.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// tslint:disable + +export class StrictClass { + public stringProperty?: string | undefined; + public requiredStringProperty: string | undefined; + public requiredStringWithDefaultProperty: string | undefined; + public intProperty: number = 0; + public nullableIntProperty?: number | undefined; + public requiredNullableIntProperty: number | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/StrictAnnotationsNotNullable/Output/strict-interface.ts b/Tests/v10/StrictAnnotationsNotNullable/Output/strict-interface.ts new file mode 100644 index 00000000..4b50b467 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/Output/strict-interface.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export interface StrictInterface { + stringProperty?: string | undefined; + requiredStringProperty: string | undefined; + requiredStringWithDefaultProperty: string | undefined; + intProperty: number; + nullableIntProperty?: number | undefined; + requiredNullableIntProperty: number | undefined; +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/StrictAnnotationsNotNullable/Strict.cs b/Tests/v10/StrictAnnotationsNotNullable/Strict.cs new file mode 100644 index 00000000..843a2df6 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/Strict.cs @@ -0,0 +1,50 @@ +using System.ComponentModel.DataAnnotations; +using KY.Generator; + +namespace Strict; + +[GenerateTypeScriptModel] +[GenerateStrict] +[GeneratePreferInterfaces] +public class StrictInterface +{ + public string StringProperty { get; set; } = string.Empty; + [Required] public string RequiredStringProperty { get; set; } + [Required] public string RequiredStringWithDefaultProperty { get; set; } + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + [Required] public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +[GeneratePreferInterfaces] +public class NotStrictInterface +{ + public string StringProperty { get; set; } = string.Empty; + [Required] public string RequiredStringProperty { get; set; } + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + [Required] public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +[GenerateStrict] +public class StrictClass +{ + public string StringProperty { get; set; } = string.Empty; + [Required] public string RequiredStringProperty { get; set; } + [Required] public string RequiredStringWithDefaultProperty { get; set; } + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + [Required] public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +public class NotStrictClass +{ + public string StringProperty { get; set; } = string.Empty; + [Required] public string RequiredStringProperty { get; set; } + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + [Required] public int? RequiredNullableIntProperty { get; set; } +} diff --git a/Tests/v10/StrictAnnotationsNotNullable/StrictAnnotationsNotNullable.csproj b/Tests/v10/StrictAnnotationsNotNullable/StrictAnnotationsNotNullable.csproj new file mode 100644 index 00000000..6b0fcdd2 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNotNullable/StrictAnnotationsNotNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + disable + Strict + + + + + + + + + + + diff --git a/Tests/v10/StrictAnnotationsNullable/AssemblyInfo.cs b/Tests/v10/StrictAnnotationsNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/StrictAnnotationsNullable/Output/not-strict-class.ts b/Tests/v10/StrictAnnotationsNullable/Output/not-strict-class.ts new file mode 100644 index 00000000..6c9daa11 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/Output/not-strict-class.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// tslint:disable + +export class NotStrictClass { + public stringProperty: string; + public nullableStringProperty?: string; + public requiredNullableStringProperty: string; + public intProperty: number; + public nullableIntProperty?: number; + public requiredNullableIntProperty: number; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/StrictAnnotationsNullable/Output/not-strict-interface.ts b/Tests/v10/StrictAnnotationsNullable/Output/not-strict-interface.ts new file mode 100644 index 00000000..18b5328b --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/Output/not-strict-interface.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export interface NotStrictInterface { + stringProperty: string; + nullableStringProperty?: string; + requiredNullableStringProperty: string; + intProperty: number; + nullableIntProperty?: number; + requiredNullableIntProperty: number; +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/StrictAnnotationsNullable/Output/strict-class.ts b/Tests/v10/StrictAnnotationsNullable/Output/strict-class.ts new file mode 100644 index 00000000..1c0979a8 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/Output/strict-class.ts @@ -0,0 +1,17 @@ +/* eslint-disable */ +// tslint:disable + +export class StrictClass { + public stringProperty: string; + public nullableStringProperty?: string | undefined; + public requiredNullableStringProperty: string | undefined; + public intProperty: number = 0; + public nullableIntProperty?: number | undefined; + public requiredNullableIntProperty: number | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/StrictAnnotationsNullable/Output/strict-interface.ts b/Tests/v10/StrictAnnotationsNullable/Output/strict-interface.ts new file mode 100644 index 00000000..31f164f9 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/Output/strict-interface.ts @@ -0,0 +1,13 @@ +/* eslint-disable */ +// tslint:disable + +export interface StrictInterface { + stringProperty: string; + nullableStringProperty?: string | undefined; + requiredNullableStringProperty: string | undefined; + intProperty: number; + nullableIntProperty?: number | undefined; + requiredNullableIntProperty: number | undefined; +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/StrictAnnotationsNullable/Strict.cs b/Tests/v10/StrictAnnotationsNullable/Strict.cs new file mode 100644 index 00000000..3c284da1 --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/Strict.cs @@ -0,0 +1,72 @@ +using System.ComponentModel.DataAnnotations; +using KY.Generator; + +namespace Strict; + +[GenerateTypeScriptModel] +[GenerateStrict] +[GeneratePreferInterfaces] +public class StrictInterface +{ + public string StringProperty { get; set; } = string.Empty; + public string? NullableStringProperty { get; set; } + + [Required] + public string? RequiredNullableStringProperty { get; set; } + + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + + [Required] + public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +[GeneratePreferInterfaces] +public class NotStrictInterface +{ + public string StringProperty { get; set; } = string.Empty; + public string? NullableStringProperty { get; set; } + + [Required] + public string? RequiredNullableStringProperty { get; set; } + + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + + [Required] + public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +[GenerateStrict] +public class StrictClass +{ + public string StringProperty { get; set; } = string.Empty; + public string? NullableStringProperty { get; set; } + + [Required] + public string? RequiredNullableStringProperty { get; set; } + + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + + [Required] + public int? RequiredNullableIntProperty { get; set; } +} + +[GenerateTypeScriptModel] +public class NotStrictClass +{ + public string StringProperty { get; set; } = string.Empty; + public string? NullableStringProperty { get; set; } + + [Required] + public string? RequiredNullableStringProperty { get; set; } + + public int IntProperty { get; set; } + public int? NullableIntProperty { get; set; } + + [Required] + public int? RequiredNullableIntProperty { get; set; } +} diff --git a/Tests/v10/StrictAnnotationsNullable/StrictAnnotationsNullable.csproj b/Tests/v10/StrictAnnotationsNullable/StrictAnnotationsNullable.csproj new file mode 100644 index 00000000..79ed796b --- /dev/null +++ b/Tests/v10/StrictAnnotationsNullable/StrictAnnotationsNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + enable + Strict + + + + + + + + + + + diff --git a/Tests/v10/TypesAnnotationsNotNullable/AssemblyInfo.cs b/Tests/v10/TypesAnnotationsNotNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/TypesAnnotationsNotNullable/Output/generic-sub-type.ts b/Tests/v10/TypesAnnotationsNotNullable/Output/generic-sub-type.ts new file mode 100644 index 00000000..73e61b08 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export interface GenericSubType { + single?: TOne; + single2?: string; + enumerable?: TOne[]; + list?: TTwo[]; + stringList?: string[]; +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/TypesAnnotationsNotNullable/Output/index.ts b/Tests/v10/TypesAnnotationsNotNullable/Output/index.ts new file mode 100644 index 00000000..8776c0cf --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/Output/index.ts @@ -0,0 +1,5 @@ + +export * from "./generic-sub-type"; +export * from "./sub-type"; +export * from "./types"; + diff --git a/Tests/v10/TypesAnnotationsNotNullable/Output/sub-type.ts b/Tests/v10/TypesAnnotationsNotNullable/Output/sub-type.ts new file mode 100644 index 00000000..472fb215 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export interface SubType { + property?: string; +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/TypesAnnotationsNotNullable/Output/types.ts b/Tests/v10/TypesAnnotationsNotNullable/Output/types.ts new file mode 100644 index 00000000..a53c531c --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/Output/types.ts @@ -0,0 +1,126 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public static readonly constByte: number = 9; + public static readonly constSByte: number = 10; + public stringField?: string; + public intField?: number = 0; + public dateTimeField?: Date = new Date(0); + public defaultString?: string | undefined = "Default"; + public defaultShort: number = 1; + public defaultUShort: number = 2; + public defaultInt: number = 3; + public defaultUInt: number = 4; + public defaultLong: number = 5; + public defaultULong: number = 6; + public defaultFloat: number = 7.1; + public defaultDouble: number = 8.2; + public defaultBool: boolean = true; + public defaultNullableString?: string | undefined = "Default"; + public defaultNullableShort?: number | undefined = 1; + public defaultNullableUShort?: number | undefined = 2; + public defaultNullableInt?: number | undefined = 3; + public defaultNullableUInt?: number | undefined = 4; + public defaultNullableLong?: number | undefined = 5; + public defaultNullableULong?: number | undefined = 6; + public defaultNullableFloat?: number | undefined = 7.1; + public defaultNullableDouble?: number | undefined = 8.2; + public defaultNullableBool?: boolean | undefined = true; + public stringProperty?: string | undefined; + public shortProperty: number = 0; + public uShortProperty: number = 0; + public intProperty: number = 0; + public uIntProperty: number = 0; + public longProperty: number = 0; + public uLongProperty: number = 0; + public floatProperty: number = 0; + public doubleProperty: number = 0; + public boolProperty: boolean = false; + public objectProperty?: unknown | undefined; + public byteProperty: number; + public sByteProperty: number; + public nullableBoolProperty?: boolean | undefined; + public nullableShortProperty?: number | undefined; + public nullableUShortProperty?: number | undefined; + public nullableIntProperty?: number | undefined; + public nullableUIntProperty?: number | undefined; + public nullableLongProperty?: number | undefined; + public nullableULongProperty?: number | undefined; + public nullableFloatProperty?: number | undefined; + public nullableDoubleProperty?: number | undefined; + public nullable2BoolProperty?: boolean | undefined; + public nullable2ShortProperty?: number | undefined; + public nullable2UShortProperty?: number | undefined; + public nullable2IntProperty?: number | undefined; + public nullable2UIntProperty?: number | undefined; + public nullable2LongProperty?: number | undefined; + public nullable2ULongProperty?: number | undefined; + public nullable2FloatProperty?: number | undefined; + public nullable2DoubleProperty?: number | undefined; + public systemStringProperty?: string | undefined; + public systemInt16Property: number = 0; + public systemInt32Property: number = 0; + public systemInt64Property: number = 0; + public systemSingleProperty: number = 0; + public systemDoubleProperty: number = 0; + public systemDateTimeProperty: Date = new Date(0); + public systemArrayProperty?: [] | undefined; + public systemByteProperty: number = 0; + public systemSByteProperty: number = 0; + public systemCharProperty: number = 0; + public systemDecimalProperty: number = 0; + public systemGuidProperty: string; + public systemObjectProperty?: unknown | undefined; + public systemTimeSpanProperty: string; + public systemUInt16Property: number = 0; + public systemUInt32Property: number = 0; + public systemUInt64Property: number = 0; + public subTypeProperty?: SubType | undefined; + public stringArrayProperty?: string[] | undefined; + public intArrayProperty?: number[] | undefined; + public byteArrayProperty?: number[] | undefined; + public systemDateTimeArrayProperty?: Date[] | undefined; + public subTypeArrayProperty?: SubType[] | undefined; + public stringList?: string[] | undefined; + public subTypeList?: SubType[] | undefined; + public stringIList?: string[] | undefined; + public subTypeIList?: SubType[] | undefined; + public stringIEnumerable?: string[] | undefined; + public subTypeIEnumerable?: SubType[] | undefined; + public stringIReadOnlyList?: string[] | undefined; + public subTypeIReadOnlyList?: SubType[] | undefined; + public stringICollection?: string[] | undefined; + public subTypeICollection?: SubType[] | undefined; + public stringIReadOnlyCollection?: string[] | undefined; + public subTypeIReadOnlyCollection?: SubType[] | undefined; + public stringStringDictionary?: { [key: string]: string; } | undefined; + public intStringDictionary?: { [key: number]: string; } | undefined; + public stringSubTypeDictionary?: { [key: string]: SubType; } | undefined; + public intSubTypeDictionary?: { [key: number]: SubType; } | undefined; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ } | undefined; + public stringStringIDictionary?: { [key: string]: string; } | undefined; + public stringStringIReadOnlyDictionary?: { [key: string]: string; } | undefined; + public typesGenericSubType?: GenericSubType | undefined; + public readonlyProperty?: string | undefined; + public writeonlyProperty?: string | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:88210355-ddb5-4bf6-a426-81493e839d4e diff --git a/Tests/v10/TypesAnnotationsNotNullable/Types.cs b/Tests/v10/TypesAnnotationsNotNullable/Types.cs new file mode 100644 index 00000000..5496542b --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/Types.cs @@ -0,0 +1,209 @@ +using System.ComponentModel; +using KY.Generator; + +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable ConvertNullableToShortForm +// ReSharper disable UnusedType.Global +#pragma warning disable CS0414 // Field is assigned but its value is never used + +namespace Types; + +[GenerateTypeScriptModel("Output/Types")] +[GenerateStrict] +[GeneratePreferInterfaces] +public class Types +{ + // Fields + public string StringField = ""; + public int IntField; + public DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + public const byte ConstByte = 9; + public const sbyte ConstSByte = 10; + + // Default Values + [DefaultValue("Default")] + public string DefaultString { get; set; } = "Default"; + + [DefaultValue(1)] + public short DefaultShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort DefaultUShort { get; set; } = 2; + + [DefaultValue(3)] + public int DefaultInt { get; set; } = 3; + + [DefaultValue(4)] + public uint DefaultUInt { get; set; } = 4; + + [DefaultValue(5)] + public long DefaultLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong DefaultULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float DefaultFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double DefaultDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool DefaultBool { get; set; } = true; + + // Default Nullable Values + [DefaultValue("Default")] + public string? DefaultNullableString { get; set; } = "Default"; + + [DefaultValue(1)] + public short? DefaultNullableShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort? DefaultNullableUShort { get; set; } = 2; + + [DefaultValue(3)] + public int? DefaultNullableInt { get; set; } = 3; + + [DefaultValue(4)] + public uint? DefaultNullableUInt { get; set; } = 4; + + [DefaultValue(5)] + public long? DefaultNullableLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong? DefaultNullableULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float? DefaultNullableFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double? DefaultNullableDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool? DefaultNullableBool { get; set; } = true; + + // Types + public string StringProperty { get; set; } = ""; + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } = new(); + public byte ByteProperty { get; set; } + public sbyte SByteProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } = ""; + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } = Array.Empty(); + public System.Byte SystemByteProperty { get; set; } + public System.SByte SystemSByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } = new(); + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } = new(); + + // Arrays + public string[] StringArrayProperty { get; set; } = []; + public int[] IntArrayProperty { get; set; } = []; + public byte[] ByteArrayProperty { get; set; } = []; + public DateTime[] SystemDateTimeArrayProperty { get; set; } = []; + public SubType[] SubTypeArrayProperty { get; set; } = []; + + // Generics + public List StringList { get; set; } = []; + public List SubTypeList { get; set; } = []; + public IList StringIList { get; set; } = []; + public IList SubTypeIList { get; set; } = []; + public IEnumerable StringIEnumerable { get; set; } = []; + public IEnumerable SubTypeIEnumerable { get; set; } = []; + public IReadOnlyList StringIReadOnlyList { get; set; } = []; + public IReadOnlyList SubTypeIReadOnlyList { get; set; } = []; + public ICollection StringICollection { get; set; } = []; + public ICollection SubTypeICollection { get; set; } = []; + public IReadOnlyCollection StringIReadOnlyCollection { get; set; } = []; + public IReadOnlyCollection SubTypeIReadOnlyCollection { get; set; } = []; + public Dictionary StringStringDictionary { get; set; } = []; + public Dictionary IntStringDictionary { get; set; } = []; + public Dictionary StringSubTypeDictionary { get; set; } = []; + public Dictionary IntSubTypeDictionary { get; set; } = []; + public Dictionary SubTypeStringDictionary { get; set; } = []; + public IDictionary StringStringIDictionary { get; set; } = new Dictionary(); + public IReadOnlyDictionary StringStringIReadOnlyDictionary { get; set; } = new Dictionary(); + public GenericSubType GenericSubType { get; set; } = new(); + + // Accessors + public string ReadonlyProperty => string.Empty; + // ReSharper disable once ValueParameterNotUsed + public string WriteonlyProperty { set {} } + protected string ProtectedProperty { get; set; } = ""; + private string PrivateProperty { get; set; } = ""; + internal string InternalProperty { get; set; } = ""; + protected string ProtectedField = ""; + private string PrivateField = ""; + internal string InternalField = ""; +} + +public class SubType +{ + public string Property { get; set; } = ""; +} + +public class GenericSubType +{ + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } +} diff --git a/Tests/v10/TypesAnnotationsNotNullable/TypesAnnotationsNotNullable.csproj b/Tests/v10/TypesAnnotationsNotNullable/TypesAnnotationsNotNullable.csproj new file mode 100644 index 00000000..1e39a727 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNotNullable/TypesAnnotationsNotNullable.csproj @@ -0,0 +1,18 @@ + + + + net9.0 + enable + disable + Types + + + + + + + + + + + diff --git a/Tests/v10/TypesAnnotationsNullable/AssemblyInfo.cs b/Tests/v10/TypesAnnotationsNullable/AssemblyInfo.cs new file mode 100644 index 00000000..c6aeb85a --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/AssemblyInfo.cs @@ -0,0 +1,4 @@ +using KY.Generator; + +[assembly:GenerateNoHeader] +[assembly:GenerateModelOutput("Output")] diff --git a/Tests/v10/TypesAnnotationsNullable/Output/generic-sub-type.ts b/Tests/v10/TypesAnnotationsNullable/Output/generic-sub-type.ts new file mode 100644 index 00000000..67fa489e --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/Output/generic-sub-type.ts @@ -0,0 +1,12 @@ +/* eslint-disable */ +// tslint:disable + +export interface GenericSubType { + single?: TOne; + single2?: string; + enumerable?: TOne[]; + list?: TTwo[]; + stringList?: string[]; +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/TypesAnnotationsNullable/Output/index.ts b/Tests/v10/TypesAnnotationsNullable/Output/index.ts new file mode 100644 index 00000000..8776c0cf --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/Output/index.ts @@ -0,0 +1,5 @@ + +export * from "./generic-sub-type"; +export * from "./sub-type"; +export * from "./types"; + diff --git a/Tests/v10/TypesAnnotationsNullable/Output/sub-type.ts b/Tests/v10/TypesAnnotationsNullable/Output/sub-type.ts new file mode 100644 index 00000000..80db01a5 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/Output/sub-type.ts @@ -0,0 +1,8 @@ +/* eslint-disable */ +// tslint:disable + +export interface SubType { + property?: string; +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/TypesAnnotationsNullable/Output/types.ts b/Tests/v10/TypesAnnotationsNullable/Output/types.ts new file mode 100644 index 00000000..b8d19511 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/Output/types.ts @@ -0,0 +1,126 @@ +/* eslint-disable */ +// tslint:disable + +import { GenericSubType } from "./generic-sub-type"; +import { SubType } from "./sub-type"; + +export class Types { + public static readonly constString: string = "String"; + public static readonly constShort: number = 1; + public static readonly constUShort: number = 2; + public static readonly constInt: number = 3; + public static readonly constUInt: number = 4; + public static readonly constLong: number = 5; + public static readonly constULong: number = 6; + public static readonly constFloat: number = 7.1; + public static readonly constDouble: number = 8.2; + public static readonly constBool: boolean = true; + public static readonly constByte: number = 9; + public static readonly constSByte: number = 10; + public stringField?: string; + public intField?: number = 0; + public dateTimeField?: Date = new Date(0); + public defaultString?: string | undefined = "Default"; + public defaultShort: number = 1; + public defaultUShort: number = 2; + public defaultInt: number = 3; + public defaultUInt: number = 4; + public defaultLong: number = 5; + public defaultULong: number = 6; + public defaultFloat: number = 7.1; + public defaultDouble: number = 8.2; + public defaultBool: boolean = true; + public defaultNullableString: string = "Default"; + public defaultNullableShort?: number | undefined = 1; + public defaultNullableUShort?: number | undefined = 2; + public defaultNullableInt?: number | undefined = 3; + public defaultNullableUInt?: number | undefined = 4; + public defaultNullableLong?: number | undefined = 5; + public defaultNullableULong?: number | undefined = 6; + public defaultNullableFloat?: number | undefined = 7.1; + public defaultNullableDouble?: number | undefined = 8.2; + public defaultNullableBool?: boolean | undefined = true; + public stringProperty?: string | undefined; + public shortProperty: number = 0; + public uShortProperty: number = 0; + public intProperty: number = 0; + public uIntProperty: number = 0; + public longProperty: number = 0; + public uLongProperty: number = 0; + public floatProperty: number = 0; + public doubleProperty: number = 0; + public boolProperty: boolean = false; + public objectProperty?: unknown | undefined; + public byteProperty: number = 0; + public sByteProperty: number = 0; + public nullableBoolProperty?: boolean | undefined; + public nullableShortProperty?: number | undefined; + public nullableUShortProperty?: number | undefined; + public nullableIntProperty?: number | undefined; + public nullableUIntProperty?: number | undefined; + public nullableLongProperty?: number | undefined; + public nullableULongProperty?: number | undefined; + public nullableFloatProperty?: number | undefined; + public nullableDoubleProperty?: number | undefined; + public nullable2BoolProperty?: boolean | undefined; + public nullable2ShortProperty?: number | undefined; + public nullable2UShortProperty?: number | undefined; + public nullable2IntProperty?: number | undefined; + public nullable2UIntProperty?: number | undefined; + public nullable2LongProperty?: number | undefined; + public nullable2ULongProperty?: number | undefined; + public nullable2FloatProperty?: number | undefined; + public nullable2DoubleProperty?: number | undefined; + public systemStringProperty?: string | undefined; + public systemInt16Property: number = 0; + public systemInt32Property: number = 0; + public systemInt64Property: number = 0; + public systemSingleProperty: number = 0; + public systemDoubleProperty: number = 0; + public systemDateTimeProperty: Date = new Date(0); + public systemArrayProperty?: [] | undefined; + public systemByteProperty: number = 0; + public systemCharProperty: number = 0; + public systemDecimalProperty: number = 0; + public systemGuidProperty: string; + public systemObjectProperty?: unknown | undefined; + public systemSByteProperty: number = 0; + public systemTimeSpanProperty: string; + public systemUInt16Property: number = 0; + public systemUInt32Property: number = 0; + public systemUInt64Property: number = 0; + public subTypeProperty?: SubType | undefined; + public stringArrayProperty?: string[] | undefined; + public intArrayProperty?: number[] | undefined; + public byteArrayProperty?: number[] | undefined; + public systemDateTimeArrayProperty?: Date[] | undefined; + public subTypeArrayProperty?: SubType[] | undefined; + public stringList?: string[] | undefined; + public subTypeList?: SubType[] | undefined; + public stringIList?: string[] | undefined; + public subTypeIList?: SubType[] | undefined; + public stringIEnumerable?: string[] | undefined; + public subTypeIEnumerable?: SubType[] | undefined; + public stringIReadOnlyList?: string[] | undefined; + public subTypeIReadOnlyList?: SubType[] | undefined; + public stringICollection?: string[] | undefined; + public subTypeICollection?: SubType[] | undefined; + public stringIReadOnlyCollection?: string[] | undefined; + public subTypeIReadOnlyCollection?: SubType[] | undefined; + public stringStringDictionary?: { [key: string]: string; } | undefined; + public intStringDictionary?: { [key: number]: string; } | undefined; + public stringSubTypeDictionary?: { [key: string]: SubType; } | undefined; + public intSubTypeDictionary?: { [key: number]: SubType; } | undefined; + public subTypeStringDictionary?: { /* unsupported type for key. Expected string or number. Got 'SubType'. */ } | undefined; + public stringStringIDictionary?: { [key: string]: string; } | undefined; + public stringStringIReadOnlyDictionary?: { [key: string]: string; } | undefined; + public typesGenericSubType?: GenericSubType | undefined; + public readonlyProperty?: string | undefined; + public writeonlyProperty?: string | undefined; + + public constructor(init?: Partial) { + Object.assign(this, init); + } +} + +// outputid:f13dd313-1bd6-4a8e-9b3f-d6266d3a25ff diff --git a/Tests/v10/TypesAnnotationsNullable/Types.cs b/Tests/v10/TypesAnnotationsNullable/Types.cs new file mode 100644 index 00000000..5496542b --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/Types.cs @@ -0,0 +1,209 @@ +using System.ComponentModel; +using KY.Generator; + +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable ConvertNullableToShortForm +// ReSharper disable UnusedType.Global +#pragma warning disable CS0414 // Field is assigned but its value is never used + +namespace Types; + +[GenerateTypeScriptModel("Output/Types")] +[GenerateStrict] +[GeneratePreferInterfaces] +public class Types +{ + // Fields + public string StringField = ""; + public int IntField; + public DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + public const byte ConstByte = 9; + public const sbyte ConstSByte = 10; + + // Default Values + [DefaultValue("Default")] + public string DefaultString { get; set; } = "Default"; + + [DefaultValue(1)] + public short DefaultShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort DefaultUShort { get; set; } = 2; + + [DefaultValue(3)] + public int DefaultInt { get; set; } = 3; + + [DefaultValue(4)] + public uint DefaultUInt { get; set; } = 4; + + [DefaultValue(5)] + public long DefaultLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong DefaultULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float DefaultFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double DefaultDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool DefaultBool { get; set; } = true; + + // Default Nullable Values + [DefaultValue("Default")] + public string? DefaultNullableString { get; set; } = "Default"; + + [DefaultValue(1)] + public short? DefaultNullableShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort? DefaultNullableUShort { get; set; } = 2; + + [DefaultValue(3)] + public int? DefaultNullableInt { get; set; } = 3; + + [DefaultValue(4)] + public uint? DefaultNullableUInt { get; set; } = 4; + + [DefaultValue(5)] + public long? DefaultNullableLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong? DefaultNullableULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float? DefaultNullableFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double? DefaultNullableDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool? DefaultNullableBool { get; set; } = true; + + // Types + public string StringProperty { get; set; } = ""; + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } = new(); + public byte ByteProperty { get; set; } + public sbyte SByteProperty { get; set; } + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public System.String SystemStringProperty { get; set; } = ""; + public System.Int16 SystemInt16Property { get; set; } + public System.Int32 SystemInt32Property { get; set; } + public System.Int64 SystemInt64Property { get; set; } + public System.Single SystemSingleProperty { get; set; } + public System.Double SystemDoubleProperty { get; set; } + public System.DateTime SystemDateTimeProperty { get; set; } + public System.Array SystemArrayProperty { get; set; } = Array.Empty(); + public System.Byte SystemByteProperty { get; set; } + public System.SByte SystemSByteProperty { get; set; } + public System.Char SystemCharProperty { get; set; } + public System.Decimal SystemDecimalProperty { get; set; } + public System.Guid SystemGuidProperty { get; set; } + public System.Object SystemObjectProperty { get; set; } = new(); + public System.TimeSpan SystemTimeSpanProperty { get; set; } + public System.UInt16 SystemUInt16Property { get; set; } + public System.UInt32 SystemUInt32Property { get; set; } + public System.UInt64 SystemUInt64Property { get; set; } + + // Complex Types + public SubType SubTypeProperty { get; set; } = new(); + + // Arrays + public string[] StringArrayProperty { get; set; } = []; + public int[] IntArrayProperty { get; set; } = []; + public byte[] ByteArrayProperty { get; set; } = []; + public DateTime[] SystemDateTimeArrayProperty { get; set; } = []; + public SubType[] SubTypeArrayProperty { get; set; } = []; + + // Generics + public List StringList { get; set; } = []; + public List SubTypeList { get; set; } = []; + public IList StringIList { get; set; } = []; + public IList SubTypeIList { get; set; } = []; + public IEnumerable StringIEnumerable { get; set; } = []; + public IEnumerable SubTypeIEnumerable { get; set; } = []; + public IReadOnlyList StringIReadOnlyList { get; set; } = []; + public IReadOnlyList SubTypeIReadOnlyList { get; set; } = []; + public ICollection StringICollection { get; set; } = []; + public ICollection SubTypeICollection { get; set; } = []; + public IReadOnlyCollection StringIReadOnlyCollection { get; set; } = []; + public IReadOnlyCollection SubTypeIReadOnlyCollection { get; set; } = []; + public Dictionary StringStringDictionary { get; set; } = []; + public Dictionary IntStringDictionary { get; set; } = []; + public Dictionary StringSubTypeDictionary { get; set; } = []; + public Dictionary IntSubTypeDictionary { get; set; } = []; + public Dictionary SubTypeStringDictionary { get; set; } = []; + public IDictionary StringStringIDictionary { get; set; } = new Dictionary(); + public IReadOnlyDictionary StringStringIReadOnlyDictionary { get; set; } = new Dictionary(); + public GenericSubType GenericSubType { get; set; } = new(); + + // Accessors + public string ReadonlyProperty => string.Empty; + // ReSharper disable once ValueParameterNotUsed + public string WriteonlyProperty { set {} } + protected string ProtectedProperty { get; set; } = ""; + private string PrivateProperty { get; set; } = ""; + internal string InternalProperty { get; set; } = ""; + protected string ProtectedField = ""; + private string PrivateField = ""; + internal string InternalField = ""; +} + +public class SubType +{ + public string Property { get; set; } = ""; +} + +public class GenericSubType +{ + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } +} diff --git a/Tests/v10/TypesAnnotationsNullable/TypesAnnotationsNullable.csproj b/Tests/v10/TypesAnnotationsNullable/TypesAnnotationsNullable.csproj new file mode 100644 index 00000000..09e612e8 --- /dev/null +++ b/Tests/v10/TypesAnnotationsNullable/TypesAnnotationsNullable.csproj @@ -0,0 +1,17 @@ + + + + net9.0 + enable + enable + + + + + + + + + + + diff --git a/Tests/v10/TypesFluentNotNullable/Generator.cs b/Tests/v10/TypesFluentNotNullable/Generator.cs new file mode 100644 index 00000000..97bc74e2 --- /dev/null +++ b/Tests/v10/TypesFluentNotNullable/Generator.cs @@ -0,0 +1,16 @@ +using KY.Generator; + +namespace Types; + +public class Generator : GeneratorFluentMain +{ + public override void Execute() + { + // this.Read(read => read.Reflection(reflection => reflection.FromType())) + // .Write(write => write.NoHeader() + // .Strict() + // .PreferInterfaces() + // .Output("Output") + // .TypeScriptModel()); + } +} diff --git a/Tests/v10/TypesFluentNotNullable/Types.cs b/Tests/v10/TypesFluentNotNullable/Types.cs new file mode 100644 index 00000000..680338f1 --- /dev/null +++ b/Tests/v10/TypesFluentNotNullable/Types.cs @@ -0,0 +1,192 @@ +using System.ComponentModel; + +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable ConvertNullableToShortForm +// ReSharper disable UnusedType.Global +#pragma warning disable CS0414 // Field is assigned but its value is never used + +namespace Types; + +public class Types +{ + // Fields + public string StringField = ""; + public int IntField; + public DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Default Values + [DefaultValue("Default")] + public string DefaultString { get; set; } = "Default"; + + [DefaultValue(1)] + public short DefaultShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort DefaultUShort { get; set; } = 2; + + [DefaultValue(3)] + public int DefaultInt { get; set; } = 3; + + [DefaultValue(4)] + public uint DefaultUInt { get; set; } = 4; + + [DefaultValue(5)] + public long DefaultLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong DefaultULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float DefaultFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double DefaultDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool DefaultBool { get; set; } = true; + + // Default Nullable Values + [DefaultValue("Default")] + public string DefaultNullableString { get; set; } = "Default"; + + [DefaultValue(1)] + public short? DefaultNullableShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort? DefaultNullableUShort { get; set; } = 2; + + [DefaultValue(3)] + public int? DefaultNullableInt { get; set; } = 3; + + [DefaultValue(4)] + public uint? DefaultNullableUInt { get; set; } = 4; + + [DefaultValue(5)] + public long? DefaultNullableLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong? DefaultNullableULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float? DefaultNullableFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double? DefaultNullableDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool? DefaultNullableBool { get; set; } = true; + + // Types + public string StringProperty { get; set; } = ""; + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } = new(); + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public string SystemStringProperty { get; set; } = ""; + public short SystemInt16Property { get; set; } + public int SystemInt32Property { get; set; } + public long SystemInt64Property { get; set; } + public float SystemSingleProperty { get; set; } + public double SystemDoubleProperty { get; set; } + public DateTime SystemDateTimeProperty { get; set; } + public Array SystemArrayProperty { get; set; } = Array.Empty(); + public byte SystemByteProperty { get; set; } + public char SystemCharProperty { get; set; } + public decimal SystemDecimalProperty { get; set; } + public Guid SystemGuidProperty { get; set; } + public object SystemObjectProperty { get; set; } = new(); + public TimeSpan SystemTimeSpanProperty { get; set; } + public ushort SystemUInt16Property { get; set; } + public uint SystemUInt32Property { get; set; } + public ulong SystemUInt64Property { get; set; } + + // Complex Types + public TypesSubType TypesSubTypeProperty { get; set; } = new(); + + // Arrays + public string[] StringArrayProperty { get; set; } = []; + public int[] IntArrayProperty { get; set; } = []; + public byte[] ByteArrayProperty { get; set; } = []; + public DateTime[] SystemDateTimeArrayProperty { get; set; } = []; + public TypesSubType[] SubTypeArrayProperty { get; set; } = []; + + // Generics + public List StringList { get; set; } = []; + public List SubTypeList { get; set; } = []; + public Dictionary StringStringDictionary { get; set; } = new(); + public Dictionary IntStringDictionary { get; set; } = new(); + public Dictionary StringSubTypeDictionary { get; set; } = new(); + public Dictionary IntSubTypeDictionary { get; set; } = new(); + public Dictionary SubTypeStringDictionary { get; set; } = new(); + public TypesGenericSubType TypesGenericSubType { get; set; } = new(); + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } = ""; + private string PrivateProperty { get; set; } = ""; + internal string InternalProperty { get; set; } = ""; + protected string ProtectedField = ""; + private string PrivateField = ""; + internal string InternalField = ""; +} + +public class TypesSubType +{ + public string Property { get; set; } = ""; +} + +public class TypesGenericSubType +{ + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } +} diff --git a/Tests/v10/TypesFluentNotNullable/TypesFluentNotNullable.csproj b/Tests/v10/TypesFluentNotNullable/TypesFluentNotNullable.csproj new file mode 100644 index 00000000..c8bbab30 --- /dev/null +++ b/Tests/v10/TypesFluentNotNullable/TypesFluentNotNullable.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + disable + Types + + + + + + + + diff --git a/Tests/v10/TypesFluentNullable/Generator.cs b/Tests/v10/TypesFluentNullable/Generator.cs new file mode 100644 index 00000000..97bc74e2 --- /dev/null +++ b/Tests/v10/TypesFluentNullable/Generator.cs @@ -0,0 +1,16 @@ +using KY.Generator; + +namespace Types; + +public class Generator : GeneratorFluentMain +{ + public override void Execute() + { + // this.Read(read => read.Reflection(reflection => reflection.FromType())) + // .Write(write => write.NoHeader() + // .Strict() + // .PreferInterfaces() + // .Output("Output") + // .TypeScriptModel()); + } +} diff --git a/Tests/v10/TypesFluentNullable/Types.cs b/Tests/v10/TypesFluentNullable/Types.cs new file mode 100644 index 00000000..680338f1 --- /dev/null +++ b/Tests/v10/TypesFluentNullable/Types.cs @@ -0,0 +1,192 @@ +using System.ComponentModel; + +// ReSharper disable UnusedMember.Global +// ReSharper disable InconsistentNaming +// ReSharper disable ConvertNullableToShortForm +// ReSharper disable UnusedType.Global +#pragma warning disable CS0414 // Field is assigned but its value is never used + +namespace Types; + +public class Types +{ + // Fields + public string StringField = ""; + public int IntField; + public DateTime DateTimeField; + + // Constants + public const string ConstString = "String"; + public const short ConstShort = 1; + public const ushort ConstUShort = 2; + public const int ConstInt = 3; + public const uint ConstUInt = 4; + public const long ConstLong = 5; + public const ulong ConstULong = 6; + public const float ConstFloat = 7.1f; + public const double ConstDouble = 8.2; + public const bool ConstBool = true; + + // Default Values + [DefaultValue("Default")] + public string DefaultString { get; set; } = "Default"; + + [DefaultValue(1)] + public short DefaultShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort DefaultUShort { get; set; } = 2; + + [DefaultValue(3)] + public int DefaultInt { get; set; } = 3; + + [DefaultValue(4)] + public uint DefaultUInt { get; set; } = 4; + + [DefaultValue(5)] + public long DefaultLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong DefaultULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float DefaultFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double DefaultDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool DefaultBool { get; set; } = true; + + // Default Nullable Values + [DefaultValue("Default")] + public string DefaultNullableString { get; set; } = "Default"; + + [DefaultValue(1)] + public short? DefaultNullableShort { get; set; } = 1; + + [DefaultValue(2)] + public ushort? DefaultNullableUShort { get; set; } = 2; + + [DefaultValue(3)] + public int? DefaultNullableInt { get; set; } = 3; + + [DefaultValue(4)] + public uint? DefaultNullableUInt { get; set; } = 4; + + [DefaultValue(5)] + public long? DefaultNullableLong { get; set; } = 5; + + [DefaultValue(6)] + public ulong? DefaultNullableULong { get; set; } = 6; + + [DefaultValue(7.1f)] + public float? DefaultNullableFloat { get; set; } = 7.1f; + + [DefaultValue(8.2)] + public double? DefaultNullableDouble { get; set; } = 8.2; + + [DefaultValue(true)] + public bool? DefaultNullableBool { get; set; } = true; + + // Types + public string StringProperty { get; set; } = ""; + public short ShortProperty { get; set; } + public ushort UShortProperty { get; set; } + public int IntProperty { get; set; } + public uint UIntProperty { get; set; } + public long LongProperty { get; set; } + public ulong ULongProperty { get; set; } + public float FloatProperty { get; set; } + public double DoubleProperty { get; set; } + public bool BoolProperty { get; set; } + public object ObjectProperty { get; set; } = new(); + + // Nullable Types + public bool? NullableBoolProperty { get; set; } + public short? NullableShortProperty { get; set; } + public ushort? NullableUShortProperty { get; set; } + public int? NullableIntProperty { get; set; } + public uint? NullableUIntProperty { get; set; } + public long? NullableLongProperty { get; set; } + public ulong? NullableULongProperty { get; set; } + public float? NullableFloatProperty { get; set; } + public double? NullableDoubleProperty { get; set; } + public Nullable Nullable2BoolProperty { get; set; } + public Nullable Nullable2ShortProperty { get; set; } + public Nullable Nullable2UShortProperty { get; set; } + public Nullable Nullable2IntProperty { get; set; } + public Nullable Nullable2UIntProperty { get; set; } + public Nullable Nullable2LongProperty { get; set; } + public Nullable Nullable2ULongProperty { get; set; } + public Nullable Nullable2FloatProperty { get; set; } + public Nullable Nullable2DoubleProperty { get; set; } + + // System Types + public string SystemStringProperty { get; set; } = ""; + public short SystemInt16Property { get; set; } + public int SystemInt32Property { get; set; } + public long SystemInt64Property { get; set; } + public float SystemSingleProperty { get; set; } + public double SystemDoubleProperty { get; set; } + public DateTime SystemDateTimeProperty { get; set; } + public Array SystemArrayProperty { get; set; } = Array.Empty(); + public byte SystemByteProperty { get; set; } + public char SystemCharProperty { get; set; } + public decimal SystemDecimalProperty { get; set; } + public Guid SystemGuidProperty { get; set; } + public object SystemObjectProperty { get; set; } = new(); + public TimeSpan SystemTimeSpanProperty { get; set; } + public ushort SystemUInt16Property { get; set; } + public uint SystemUInt32Property { get; set; } + public ulong SystemUInt64Property { get; set; } + + // Complex Types + public TypesSubType TypesSubTypeProperty { get; set; } = new(); + + // Arrays + public string[] StringArrayProperty { get; set; } = []; + public int[] IntArrayProperty { get; set; } = []; + public byte[] ByteArrayProperty { get; set; } = []; + public DateTime[] SystemDateTimeArrayProperty { get; set; } = []; + public TypesSubType[] SubTypeArrayProperty { get; set; } = []; + + // Generics + public List StringList { get; set; } = []; + public List SubTypeList { get; set; } = []; + public Dictionary StringStringDictionary { get; set; } = new(); + public Dictionary IntStringDictionary { get; set; } = new(); + public Dictionary StringSubTypeDictionary { get; set; } = new(); + public Dictionary IntSubTypeDictionary { get; set; } = new(); + public Dictionary SubTypeStringDictionary { get; set; } = new(); + public TypesGenericSubType TypesGenericSubType { get; set; } = new(); + + // Accessors + public string ReadonlyProperty => string.Empty; + + public string WriteonlyProperty + { + set { } + } + + protected string ProtectedProperty { get; set; } = ""; + private string PrivateProperty { get; set; } = ""; + internal string InternalProperty { get; set; } = ""; + protected string ProtectedField = ""; + private string PrivateField = ""; + internal string InternalField = ""; +} + +public class TypesSubType +{ + public string Property { get; set; } = ""; +} + +public class TypesGenericSubType +{ + public TOne Single { get; } + public string Single2 { get; } + public IEnumerable Enumerable { get; set; } + public List List { get; set; } + public List StringList { get; set; } +} diff --git a/Tests/v10/TypesFluentNullable/TypesFluentNullable.csproj b/Tests/v10/TypesFluentNullable/TypesFluentNullable.csproj new file mode 100644 index 00000000..9a21b085 --- /dev/null +++ b/Tests/v10/TypesFluentNullable/TypesFluentNullable.csproj @@ -0,0 +1,15 @@ + + + + net8.0 + enable + enable + Types + + + + + + + + diff --git a/Tests/v10/build.cmd b/Tests/v10/build.cmd new file mode 100644 index 00000000..1a0e1693 --- /dev/null +++ b/Tests/v10/build.cmd @@ -0,0 +1,84 @@ +REM ========================================== +REM || SelfReferencingAnnotationsNullable || +REM ========================================== +REM +cd SelfReferencingAnnotationsNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || StrictAnnotationsNotNullable || +REM ========================================== +REM +cd StrictAnnotationsNotNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || StrictAnnotationsNullable || +REM ========================================== +REM +cd StrictAnnotationsNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || TypesAnnotationsNotNullable || +REM ========================================== +REM +cd TypesAnnotationsNotNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || TypesAnnotationsNullable || +REM ========================================== +REM +cd TypesAnnotationsNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || TypesFluentNotNullable || +REM ========================================== +REM +cd TypesFluentNotNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + +REM ========================================== +REM || TypesFluentNullable || +REM ========================================== +REM +cd TypesFluentNullable +rmdir /S/Q bin +rmdir /S/Q Output +dotnet add package KY.Generator --prerelease +dotnet add package KY.Generator.Annotations --prerelease +dotnet build --no-incremental +cd .. + diff --git a/Tsql.Tests/FullStageTests.cs b/Tsql.Tests/FullStageTests.cs index 7365cca8..4a983265 100644 --- a/Tsql.Tests/FullStageTests.cs +++ b/Tsql.Tests/FullStageTests.cs @@ -1,8 +1,4 @@ -using System.Collections.Generic; using KY.Core.Dependency; -using KY.Generator.Configuration; -using KY.Generator.Csharp; -using KY.Generator.Mappings; using KY.Generator.Output; using KY.Generator.Tsql.Tests.Properties; using Microsoft.VisualStudio.TestTools.UnitTesting; @@ -12,10 +8,11 @@ namespace KY.Generator.Tsql.Tests [TestClass] public class FullStageTests { - private IDependencyResolver resolver; + // private IDependencyResolver resolver; + //private ConfigurationsReader reader; //private ConfigurationRunner runner; - private MemoryOutput output; + // private MemoryOutput output; [TestInitialize] public void Initialize() @@ -35,9 +32,9 @@ public void Initialize() [TestMethod] public void TestMethod1() { - Assert.AreEqual(true, this.Run(Resources.tsql_generator), "Generation not successful"); - Assert.AreEqual(1, this.output.Files.Count); - Assert.AreEqual(Resources.User_cs, this.output.Files["User.cs"]); + // Assert.AreEqual(true, this.Run(Resources.tsql_generator), "Generation not successful"); + // Assert.AreEqual(1, this.output.Files.Count); + // Assert.AreEqual(Resources.User_cs, this.output.Files["User.cs"]); } private bool Run(string configuration) @@ -48,4 +45,4 @@ private bool Run(string configuration) return false; } } -} \ No newline at end of file +} diff --git a/Tsql.Tests/KY.Generator.Tsql.Tests.csproj b/Tsql.Tests/KY.Generator.Tsql.Tests.csproj index d4da876a..c26dcb0d 100644 --- a/Tsql.Tests/KY.Generator.Tsql.Tests.csproj +++ b/Tsql.Tests/KY.Generator.Tsql.Tests.csproj @@ -1,35 +1,25 @@ - netcoreapp2.1 + net6.0 false + + latest - + - + - - - System - - - System.Data - - - System.Xml - - - True diff --git a/Tsql/Commands/TsqlReadCommand.cs b/Tsql/Commands/TsqlReadCommand.cs index 0b26a614..f086cec6 100644 --- a/Tsql/Commands/TsqlReadCommand.cs +++ b/Tsql/Commands/TsqlReadCommand.cs @@ -1,47 +1,45 @@ using KY.Core.Dependency; using KY.Generator.Command; -using KY.Generator.Output; using KY.Generator.Tsql.Configurations; using KY.Generator.Tsql.Readers; -namespace KY.Generator.Tsql.Commands +namespace KY.Generator.Tsql.Commands; + +public class TsqlReadCommand : GeneratorCommand { - public class TsqlReadCommand : GeneratorCommand + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(TsqlReadCommand)), "tsql-read"]; + + public TsqlReadCommand(IDependencyResolver resolver) { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "tsql-read" }; + this.resolver = resolver; + } - public TsqlReadCommand(IDependencyResolver resolver) + public override IGeneratorCommandResult Run() + { + TsqlReadConfiguration configuration = new(); + configuration.Connection = this.Parameters.ConnectionString; + if (!string.IsNullOrEmpty(this.Parameters.Table)) { - this.resolver = resolver; + configuration.Entities.Add(new TsqlReadEntity + { + Schema = this.Parameters.Schema, + Table = this.Parameters.Table, + Namespace = this.Parameters.Namespace, + Name = this.Parameters.Name + }); } - - public override IGeneratorCommandResult Run(IOutput output) + if (!string.IsNullOrEmpty(this.Parameters.StoredProcedure)) { - TsqlReadConfiguration configuration = new TsqlReadConfiguration(); - configuration.Connection = this.Parameters.ConnectionString; - if (!string.IsNullOrEmpty(this.Parameters.Table)) - { - configuration.Entities.Add(new TsqlReadEntity - { - Schema = this.Parameters.Schema, - Table = this.Parameters.Table, - Namespace = this.Parameters.Namespace, - Name = this.Parameters.Name - }); - } - if (!string.IsNullOrEmpty(this.Parameters.StoredProcedure)) - { - configuration.StoredProcedures.Add(new TsqlReadStoredProcedure - { - Schema = this.Parameters.Schema, - Name = this.Parameters.StoredProcedure - }); - } + configuration.StoredProcedures.Add(new TsqlReadStoredProcedure + { + Schema = this.Parameters.Schema, + Name = this.Parameters.StoredProcedure + }); + } - this.resolver.Create().Read(configuration, this.TransferObjects); + this.resolver.Create().Read(configuration); - return this.Success(); - } + return this.Success(); } -} \ No newline at end of file +} diff --git a/Tsql/Configurations/TsqlReadConfiguration.cs b/Tsql/Configurations/TsqlReadConfiguration.cs index a98a22be..561c995e 100644 --- a/Tsql/Configurations/TsqlReadConfiguration.cs +++ b/Tsql/Configurations/TsqlReadConfiguration.cs @@ -1,10 +1,9 @@ using System.Collections.Generic; -using KY.Generator.Configurations; namespace KY.Generator.Tsql.Configurations { - public class TsqlReadConfiguration : ReadConfigurationBase - { + public class TsqlReadConfiguration + { public string Connection { get; set; } public List Entities { get; } public List StoredProcedures { get; } @@ -17,4 +16,4 @@ public TsqlReadConfiguration() this.StoredProcedures = new List(); } } -} \ No newline at end of file +} diff --git a/Tsql/Configurations/TsqlReadEntity.cs b/Tsql/Configurations/TsqlReadEntity.cs index 99c5486e..a287f12a 100644 --- a/Tsql/Configurations/TsqlReadEntity.cs +++ b/Tsql/Configurations/TsqlReadEntity.cs @@ -1,19 +1,16 @@ -using System.Collections.Generic; +namespace KY.Generator.Tsql.Configurations; -namespace KY.Generator.Tsql.Configurations +public class TsqlReadEntity { - public class TsqlReadEntity - { - public string Schema { get; set; } - public string Table { get; set; } - public string StoredProcedure { get; set; } - public string Name { get; set; } - public string Namespace { get; set; } - public List KeyActions { get; set; } + public string? Schema { get; set; } + public string? Table { get; set; } + public string? StoredProcedure { get; set; } + public string? Name { get; set; } + public string? Namespace { get; set; } + public List? KeyActions { get; set; } - public TsqlReadEntity() - { - this.KeyActions = new List(); - } + public TsqlReadEntity() + { + this.KeyActions = new List(); } -} \ No newline at end of file +} diff --git a/Tsql/Fluent/Extensions/ReadFluentSyntaxExtension.cs b/Tsql/Fluent/Extensions/ReadFluentSyntaxExtension.cs new file mode 100644 index 00000000..da00d70b --- /dev/null +++ b/Tsql/Fluent/Extensions/ReadFluentSyntaxExtension.cs @@ -0,0 +1,25 @@ +using System; +using KY.Core; +using KY.Generator.Syntax; +using KY.Generator.Tsql.Fluent; + +// ReSharper disable once CheckNamespace : Easier usage on lower namespace +namespace KY.Generator +{ + public static class ReadFluentSyntaxExtension + { + /// + /// Executes the Tsql read commands. Use at least one command! + /// + // TODO: Use action instead to insert connectionString parameter here + public static IReadFluentSyntax Tsql(this IReadFluentSyntax syntax, string connectionString, Action action) + { + IReadFluentSyntaxInternal internalSyntax = (IReadFluentSyntaxInternal)syntax; + TsqlReadSyntax readSyntax = new(internalSyntax, connectionString); + internalSyntax.Syntaxes.Add(readSyntax); + action(readSyntax); + readSyntax.Commands.Count.AssertIsPositive(message: $"The {nameof(Tsql)} action requires at least one command. E.g. '.{nameof(Tsql)}(read => read.{nameof(ITsqlReadSyntax.FromTable)}(...))'"); + return syntax; + } + } +} diff --git a/Tsql/Fluent/ITsqlReadSyntax.cs b/Tsql/Fluent/ITsqlReadSyntax.cs new file mode 100644 index 00000000..a4ced7c5 --- /dev/null +++ b/Tsql/Fluent/ITsqlReadSyntax.cs @@ -0,0 +1,7 @@ +namespace KY.Generator.Tsql.Fluent +{ + public interface ITsqlReadSyntax + { + ITsqlReadSyntax FromTable(string schema, string table); + } +} diff --git a/Tsql/Fluent/ReadFluentSyntaxExtension.cs b/Tsql/Fluent/ReadFluentSyntaxExtension.cs deleted file mode 100644 index 291b9f6e..00000000 --- a/Tsql/Fluent/ReadFluentSyntaxExtension.cs +++ /dev/null @@ -1,50 +0,0 @@ -using KY.Generator.Syntax; -using KY.Generator.Tsql.Commands; - -namespace KY.Generator -{ - public static class ReadFluentSyntaxExtension - { - public static ITsqlReadTableSyntax Tsql(this IReadFluentSyntax syntax, string connectionString) - { - return new TsqlReadSyntax((IReadFluentSyntaxInternal)syntax, connectionString); - } - } - - public interface ITsqlReadTableSyntax - { - ITsqlReadTableOrSwitchToWriteSyntax FromTable(string schema, string table); - } - - public interface ITsqlReadTableOrSwitchToWriteSyntax : ITsqlReadTableSyntax, ISwitchToWriteSyntax - { - - } - - public class TsqlReadSyntax : ITsqlReadTableSyntax, ITsqlReadTableOrSwitchToWriteSyntax - { - private readonly IReadFluentSyntaxInternal syntax; - private readonly string connectionString; - - public TsqlReadSyntax(IReadFluentSyntaxInternal syntax, string connectionString) - { - this.syntax = syntax; - this.connectionString = connectionString; - } - - public ITsqlReadTableOrSwitchToWriteSyntax FromTable(string schema, string table) - { - TsqlReadCommand command = new TsqlReadCommand(this.syntax.Resolver); - command.Parameters.ConnectionString = this.connectionString; - command.Parameters.Schema = schema; - command.Parameters.Table = table; - this.syntax.Commands.Add(command); - return this; - } - - public IWriteFluentSyntax Write() - { - return this.syntax.Write(); - } - } -} \ No newline at end of file diff --git a/Tsql/Fluent/TsqlReadSyntax.cs b/Tsql/Fluent/TsqlReadSyntax.cs new file mode 100644 index 00000000..27963542 --- /dev/null +++ b/Tsql/Fluent/TsqlReadSyntax.cs @@ -0,0 +1,31 @@ +using System.Collections.Generic; +using KY.Generator.Command; +using KY.Generator.Syntax; +using KY.Generator.Tsql.Commands; + +namespace KY.Generator.Tsql.Fluent +{ + public class TsqlReadSyntax : ITsqlReadSyntax, IExecutableSyntax + { + private readonly IReadFluentSyntaxInternal syntax; + private readonly string connectionString; + + public List Commands { get; } = new(); + + public TsqlReadSyntax(IReadFluentSyntaxInternal syntax, string connectionString) + { + this.syntax = syntax; + this.connectionString = connectionString; + } + + public ITsqlReadSyntax FromTable(string schema, string table) + { + TsqlReadCommand command = this.syntax.Resolver.Create(); + command.Parameters.ConnectionString = this.connectionString; + command.Parameters.Schema = schema; + command.Parameters.Table = table; + this.Commands.Add(command); + return this; + } + } +} diff --git a/Tsql/KY.Generator.Tsql.csproj b/Tsql/KY.Generator.Tsql.csproj index 0bc81b50..07a6a837 100644 --- a/Tsql/KY.Generator.Tsql.csproj +++ b/Tsql/KY.Generator.Tsql.csproj @@ -1,40 +1,49 @@  - - netstandard2.0 - KY-Programming - KY-Programming - KY.Generator - 7.6.0 - TSQL Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator TSQL - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + KY.Generator + 10.0.0-preview.2 + TSQL Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator TSQL + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - - + + + - - - - - - + + + + + + + + + + + diff --git a/Tsql/Language/TypeMappingExtension.cs b/Tsql/Language/TypeMappingExtension.cs index b27174ea..12c4e03e 100644 --- a/Tsql/Language/TypeMappingExtension.cs +++ b/Tsql/Language/TypeMappingExtension.cs @@ -8,39 +8,41 @@ public static class TypeMappingExtension { public static ITypeMapping Initialize(this ITypeMapping typeMapping) { - typeMapping.Add(TsqlLanguage.Instance, "smallint", CsharpLanguage.Instance, "short", true); - typeMapping.Add(TsqlLanguage.Instance, "bigint", CsharpLanguage.Instance, "long", true); - typeMapping.Add(TsqlLanguage.Instance, "bit", CsharpLanguage.Instance, "bool", true); - typeMapping.Add(TsqlLanguage.Instance, "int", CsharpLanguage.Instance, "int", true); - typeMapping.Add(TsqlLanguage.Instance, "date", CsharpLanguage.Instance, "DateTime", true, "System"); - typeMapping.Add(TsqlLanguage.Instance, "datetime", CsharpLanguage.Instance, "DateTime", true, "System"); - typeMapping.Add(TsqlLanguage.Instance, "datetime2", CsharpLanguage.Instance, "DateTime", true, "System"); - typeMapping.Add(TsqlLanguage.Instance, "decimal", CsharpLanguage.Instance, "decimal", true); - typeMapping.Add(TsqlLanguage.Instance, "nchar", CsharpLanguage.Instance, "string"); - typeMapping.Add(TsqlLanguage.Instance, "nvarchar", CsharpLanguage.Instance, "string"); - typeMapping.Add(TsqlLanguage.Instance, "char", CsharpLanguage.Instance, "string"); - typeMapping.Add(TsqlLanguage.Instance, "varchar", CsharpLanguage.Instance, "string"); - typeMapping.Add(TsqlLanguage.Instance, "varbinary", CsharpLanguage.Instance, "byte[]"); - typeMapping.Add(TsqlLanguage.Instance, "timestamp", CsharpLanguage.Instance, "byte[]"); - typeMapping.Add(TsqlLanguage.Instance, "uniqueidentifier", CsharpLanguage.Instance, "Guid", false, "System"); - typeMapping.Add(TsqlLanguage.Instance, "float", CsharpLanguage.Instance, "double", true); + typeMapping.Map().To() + .From("smallint").To("short").Nullable() + .From("bigint").To("long").Nullable() + .From("bit").To("bool").Nullable() + .From("int").To("int").Nullable() + .From("date").To("DateTime").Nullable().Namespace("System") + .From("datetime").To("DateTime").Nullable().Namespace("System") + .From("datetime2").To("DateTime").Nullable().Namespace("System") + .From("decimal").To("decimal").Nullable() + .From("nchar").To("string") + .From("nvarchar").To("string") + .From("char").To("string") + .From("varchar").To("string") + .From("varbinary").To("byte[]") + .From("timestamp").To("byte[]") + .From("uniqueidentifier").To("Guid").Namespace("System") + .From("float").To("double").Nullable(); - typeMapping.Add(TsqlLanguage.Instance, "smallint", TypeScriptLanguage.Instance, "number", true); - typeMapping.Add(TsqlLanguage.Instance, "bigint", TypeScriptLanguage.Instance, "number", true); - typeMapping.Add(TsqlLanguage.Instance, "bit", TypeScriptLanguage.Instance, "boolean", true); - typeMapping.Add(TsqlLanguage.Instance, "int", TypeScriptLanguage.Instance, "number", true); - typeMapping.Add(TsqlLanguage.Instance, "date", TypeScriptLanguage.Instance, "Date", true); - typeMapping.Add(TsqlLanguage.Instance, "datetime", TypeScriptLanguage.Instance, "Date", true); - typeMapping.Add(TsqlLanguage.Instance, "datetime2", TypeScriptLanguage.Instance, "Date", true); - typeMapping.Add(TsqlLanguage.Instance, "decimal", TypeScriptLanguage.Instance, "number", true); - typeMapping.Add(TsqlLanguage.Instance, "nchar", TypeScriptLanguage.Instance, "string", true); - typeMapping.Add(TsqlLanguage.Instance, "nvarchar", TypeScriptLanguage.Instance, "string", true); - typeMapping.Add(TsqlLanguage.Instance, "char", TypeScriptLanguage.Instance, "string", true); - typeMapping.Add(TsqlLanguage.Instance, "varchar", TypeScriptLanguage.Instance, "string", true); - typeMapping.Add(TsqlLanguage.Instance, "varbinary", TypeScriptLanguage.Instance, "number[]", true); - typeMapping.Add(TsqlLanguage.Instance, "timestamp", TypeScriptLanguage.Instance, "number[]", true); - typeMapping.Add(TsqlLanguage.Instance, "uniqueidentifier", TypeScriptLanguage.Instance, "string", true); - typeMapping.Add(TsqlLanguage.Instance, "float", TypeScriptLanguage.Instance, "number", true); + typeMapping.Map().To() + .From("smallint").To("number").Nullable() + .From("bigint").To("number").Nullable() + .From("bit").To("boolean").Nullable() + .From("int").To("number").Nullable() + .From("date").To("Date").Nullable() + .From("datetime").To("Date").Nullable() + .From("datetime2").To("Date").Nullable() + .From("decimal").To("number").Nullable() + .From("nchar").To("string").Nullable() + .From("nvarchar").To("string").Nullable() + .From("char").To("string").Nullable() + .From("varchar").To("string").Nullable() + .From("varbinary").To("number[]").Nullable() + .From("timestamp").To("number[]").Nullable() + .From("uniqueidentifier").To("string").Nullable() + .From("float").To("number").Nullable(); return typeMapping; } } diff --git a/Tsql/Readers/TsqlReader.cs b/Tsql/Readers/TsqlReader.cs index b4066bb6..1c3f8086 100644 --- a/Tsql/Readers/TsqlReader.cs +++ b/Tsql/Readers/TsqlReader.cs @@ -1,9 +1,4 @@ -using System; -using System.Collections.Generic; -using System.Linq; -using KY.Core; -using KY.Generator.Configuration; -using KY.Generator.Configurations; +using KY.Core; using KY.Generator.Transfer; using KY.Generator.Transfer.Readers; using KY.Generator.Tsql.Configurations; @@ -11,118 +6,124 @@ using KY.Generator.Tsql.Transfers; using KY.Generator.Tsql.Type; -namespace KY.Generator.Tsql.Readers +namespace KY.Generator.Tsql.Readers; + +public class TsqlReader : ITransferReader { - public class TsqlReader : ITransferReader + private readonly List transferObjects; + + public TsqlReader(List transferObjects) + { + this.transferObjects = transferObjects; + } + + public void Read(TsqlReadConfiguration configuration) { - public void Read(ConfigurationBase configurationBase, List transferObjects) + this.Validate(configuration); + TsqlTypeReader typeReader = new(configuration.Connection); + foreach (TsqlReadEntity readEntity in configuration.Entities) { - TsqlReadConfiguration configuration = (TsqlReadConfiguration)configurationBase; - this.Validate(configuration); - TsqlTypeReader typeReader = new TsqlTypeReader(configuration.Connection); - foreach (TsqlReadEntity readEntity in configuration.Entities) + ModelTransferObject model; + if (!string.IsNullOrEmpty(readEntity.Table)) { - ModelTransferObject model; - if (!string.IsNullOrEmpty(readEntity.Table)) - { - List columns = typeReader.GetColumns(readEntity.Schema ?? configuration.Schema, readEntity.Table); - model = new ModelTransferObject - { - Name = readEntity.Name ?? readEntity.Table, - Namespace = readEntity.Namespace ?? configuration.Namespace, - Language = TsqlLanguage.Instance - }; - foreach (TsqlColumn column in columns) - { - model.Properties.Add(new PropertyTransferObject - { - Name = column.Name, - Type = new TypeTransferObject { Name = column.Type, IsNullable = column.IsNullable } - }); - } - transferObjects.Add(model); - } - else - { - //TODO: Implement for StoredProcedure - model = new ModelTransferObject - { - Name = readEntity.Name ?? readEntity.StoredProcedure, - Namespace = readEntity.Namespace ?? configuration.Namespace, - Language = TsqlLanguage.Instance - }; - } - EntityTransferObject entity = new EntityTransferObject - { - Name = model.Name, - Model = model, - Table = readEntity.Table, - Schema = readEntity.Schema ?? configuration.Schema - }; - if (!string.IsNullOrEmpty(readEntity.Table)) - { - typeReader.GetPrimaryKeys(readEntity.Schema ?? configuration.Schema, readEntity.Table) - .Select(x => new EntityKeyTransferObject { Name = x.Name }) - .ForEach(entity.Keys.Add); - List navigationProperties = typeReader.GetNavigationProperties(readEntity.Schema ?? configuration.Schema, readEntity.Table); - } - foreach (TsqlReadEntityKeyAction action in readEntity.KeyActions) + List columns = typeReader.GetColumns(readEntity.Schema ?? configuration.Schema, readEntity.Table); + model = new ModelTransferObject + { + Name = readEntity.Name ?? readEntity.Table, + Namespace = readEntity.Namespace ?? configuration.Namespace, + Language = TsqlLanguage.Instance + }; + foreach (TsqlColumn column in columns) { - switch (action.Action.ToLowerInvariant()) - { - case "remove": - case "delete": - if (action.All) - { - entity.Keys.Clear(); - } - else - { - entity.Keys.Remove(entity.Keys.FirstOrDefault(x => x.Name.Equals(action.Name, StringComparison.InvariantCultureIgnoreCase))); - } - break; - case "add": - case "insert": - entity.Keys.Add(new EntityKeyTransferObject { Name = action.Name }); - break; - default: - throw new InvalidOperationException($"Unknown entity key action {action.Action} found"); - } + model.Properties.Add(new PropertyTransferObject + { + Name = column.Name, + Type = new TypeTransferObject { Name = column.Type, IsNullable = column.IsNullable }, + DeclaringType = model + }); } - foreach (EntityKeyTransferObject key in entity.Keys) + this.transferObjects.Add(model); + } + else + { + //TODO: Implement for StoredProcedure + model = new ModelTransferObject + { + Name = readEntity.Name ?? readEntity.StoredProcedure, + Namespace = readEntity.Namespace ?? configuration.Namespace, + Language = TsqlLanguage.Instance + }; + } + EntityTransferObject entity = new() + { + Name = model.Name, + Model = model, + Table = readEntity.Table, + Schema = readEntity.Schema ?? configuration.Schema + }; + if (!string.IsNullOrEmpty(readEntity.Table)) + { + typeReader.GetPrimaryKeys(readEntity.Schema ?? configuration.Schema, readEntity.Table) + .Select(x => new EntityKeyTransferObject { Name = x.Name }) + .ForEach(entity.Keys.Add); + List navigationProperties = typeReader.GetNavigationProperties(readEntity.Schema ?? configuration.Schema, readEntity.Table); + } + foreach (TsqlReadEntityKeyAction action in readEntity.KeyActions) + { + switch (action.Action.ToLowerInvariant()) { - key.Property = entity.Model.Properties.FirstOrDefault(x => x.Name == key.Name).AssertIsNotNull(key.Name, $"Key {key.Name} has no matching property"); - key.Type = key.Property.Type; + case "remove": + case "delete": + if (action.All) + { + entity.Keys.Clear(); + } + else + { + entity.Keys.Remove(entity.Keys.FirstOrDefault(x => x.Name.Equals(action.Name, StringComparison.InvariantCultureIgnoreCase))); + } + break; + case "add": + case "insert": + entity.Keys.Add(new EntityKeyTransferObject { Name = action.Name }); + break; + default: + throw new InvalidOperationException($"Unknown entity key action {action.Action} found"); } - transferObjects.Add(entity); } - foreach (TsqlReadStoredProcedure readStoredProcedure in configuration.StoredProcedures) + foreach (EntityKeyTransferObject key in entity.Keys) { - string schema = readStoredProcedure.Schema ?? configuration.Schema; - //List columns = typeReader.GetColumnsFromStoredProcedure(schema, readStoredProcedure.Name); - StoredProcedureTransferObject storedProcedure = new StoredProcedureTransferObject { Schema = schema, Name = readStoredProcedure.Name}; - storedProcedure.ReturnType = new TypeTransferObject { Name = "void", FromSystem = true }; - transferObjects.Add(storedProcedure); + key.Property = entity.Model.Properties.FirstOrDefault(x => x.Name == key.Name).AssertIsNotNull(key.Name, $"Key {key.Name} has no matching property"); + key.Type = key.Property.Type; } + this.transferObjects.Add(entity); } - - private void Validate(TsqlReadConfiguration configuration) + foreach (TsqlReadStoredProcedure readStoredProcedure in configuration.StoredProcedures) { - //if (string.IsNullOrEmpty(configuration.Connection)) - //{ - // throw new InvalidConfigurationException("Tsql setting without connection found. Connection can not be null or empty"); - //} - //foreach (TsqlReadEntity entity in configuration.Entities) - //{ - // if (string.IsNullOrEmpty(entity.Schema ?? configuration.Schema)) - // { - // throw new InvalidConfigurationException($"Tsql entity '{entity.Name ?? "without name"}' {nameof(entity.Schema)} can not be null or empty"); - // } - // if (string.IsNullOrEmpty(entity.Table) && string.IsNullOrEmpty(entity.StoredProcedure)) - // { - // throw new InvalidConfigurationException($"Tsql entity '{entity.Name ?? "without name"}' have to has at leas a {nameof(entity.Table)} or {nameof(entity.StoredProcedure)} filled"); - // } - //} + string schema = readStoredProcedure.Schema ?? configuration.Schema; + //List columns = typeReader.GetColumnsFromStoredProcedure(schema, readStoredProcedure.Name); + StoredProcedureTransferObject storedProcedure = new() { Schema = schema, Name = readStoredProcedure.Name }; + storedProcedure.ReturnType = new TypeTransferObject { Name = "void", FromSystem = true }; + this.transferObjects.Add(storedProcedure); } } -} \ No newline at end of file + + private void Validate(TsqlReadConfiguration configuration) + { + //if (string.IsNullOrEmpty(configuration.Connection)) + //{ + // throw new InvalidConfigurationException("Tsql setting without connection found. Connection can not be null or empty"); + //} + //foreach (TsqlReadEntity entity in configuration.Entities) + //{ + // if (string.IsNullOrEmpty(entity.Schema ?? configuration.Schema)) + // { + // throw new InvalidConfigurationException($"Tsql entity '{entity.Name ?? "without name"}' {nameof(entity.Schema)} can not be null or empty"); + // } + // if (string.IsNullOrEmpty(entity.Table) && string.IsNullOrEmpty(entity.StoredProcedure)) + // { + // throw new InvalidConfigurationException($"Tsql entity '{entity.Name ?? "without name"}' have to has at leas a {nameof(entity.Table)} or {nameof(entity.StoredProcedure)} filled"); + // } + //} + } +} diff --git a/Tsql/TsqlModule.cs b/Tsql/TsqlModule.cs index 72ddb657..d125ccc9 100644 --- a/Tsql/TsqlModule.cs +++ b/Tsql/TsqlModule.cs @@ -1,23 +1,21 @@ using KY.Core.Dependency; using KY.Core.Module; -using KY.Generator.Configuration; +using KY.Generator.Command; using KY.Generator.Mappings; -using KY.Generator.Tsql.Configurations; +using KY.Generator.Tsql.Commands; using KY.Generator.Tsql.Language; -using KY.Generator.Tsql.Readers; -namespace KY.Generator.Tsql +namespace KY.Generator.Tsql; + +public class TsqlModule : ModuleBase { - public class TsqlModule : ModuleBase - { - public TsqlModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { } + public TsqlModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) + { } - public override void Initialize() - { - this.DependencyResolver.Get().Initialize(); - this.DependencyResolver.Get().Map("tsql"); - } + public override void Initialize() + { + this.DependencyResolver.Get().Initialize(); + this.DependencyResolver.Get().Register(TsqlReadCommand.Names); } -} \ No newline at end of file +} diff --git a/TypeScript.Tests/KY.Generator.TypeScript.Tests.csproj b/TypeScript.Tests/KY.Generator.TypeScript.Tests.csproj index 29cdb380..3c263a2c 100644 --- a/TypeScript.Tests/KY.Generator.TypeScript.Tests.csproj +++ b/TypeScript.Tests/KY.Generator.TypeScript.Tests.csproj @@ -1,20 +1,22 @@  - netcoreapp2.1 + net6.0 false + + latest - + - + diff --git a/TypeScript.Tests/TemplateWriterTests.cs b/TypeScript.Tests/TemplateWriterTests.cs index 35355428..9818f33d 100644 --- a/TypeScript.Tests/TemplateWriterTests.cs +++ b/TypeScript.Tests/TemplateWriterTests.cs @@ -6,32 +6,35 @@ using KY.Generator.TypeScript.Languages; using KY.Generator.Writers; using Microsoft.VisualStudio.TestTools.UnitTesting; +using FileWriter = KY.Generator.Output.FileWriter; -namespace KY.Generator.TypeScript.Tests -{ - [TestClass] - public class TemplateWriterTests : Codeable - { - private IDependencyResolver resolver; - private IOutputCache output; +namespace KY.Generator.TypeScript.Tests; - [TestInitialize] - public void Initialize() - { - this.resolver = new DependencyResolver(); - this.output = new FileWriter(TypeScriptLanguage.Instance); - } +[TestClass] +public class TemplateWriterTests : Codeable +{ + private IDependencyResolver resolver; + private IOutputCache output; + private Options options; + [TestInitialize] + public void Initialize() + { + this.resolver = new DependencyResolver(); + this.options = new Options(); + GeneratorOptions generatorOptions = this.options.Get(); + generatorOptions.Language = new TypeScriptLanguage(this.resolver); + this.output = new FileWriter(generatorOptions); + } - [TestMethod] - public void ClassOneFieldAndOneConstructor() - { - ClassTemplate template = new ClassTemplate((NamespaceTemplate)null, "test"); - template.AddField("field1", Code.Type("string")); - template.AddConstructor(); - ClassWriter writer = new ClassWriter(); - writer.Write(template, this.output); - Assert.AreEqual("export class test {\r\n private field1: string;\r\n\r\n public constructor() {\r\n }\r\n}", this.output.ToString()); - } + [TestMethod] + public void ClassOneFieldAndOneConstructor() + { + ClassTemplate template = new((NamespaceTemplate)null, "test"); + template.AddField("field1", Code.Type("string")); + template.AddConstructor(); + ClassWriter writer = new(this.options); + writer.Write(template, this.output); + Assert.AreEqual("export class test {\r\n private field1: string;\r\n\r\n public constructor() {\r\n }\r\n}", this.output.ToString()); } } diff --git a/TypeScript.Tests/TypeScriptIndexReaderTests.cs b/TypeScript.Tests/TypeScriptIndexReaderTests.cs new file mode 100644 index 00000000..1bd44db1 --- /dev/null +++ b/TypeScript.Tests/TypeScriptIndexReaderTests.cs @@ -0,0 +1,51 @@ +using KY.Core; +using KY.Generator.Models; +using KY.Generator.TypeScript.Transfer; +using KY.Generator.TypeScript.Transfer.Readers; +using Microsoft.VisualStudio.TestTools.UnitTesting; + +namespace KY.Generator.TypeScript.Tests +{ + [TestClass] + public class TypeScriptIndexReaderTests + { + private IEnvironment environment = new GeneratorEnvironment(); + + [TestMethod] + public void Test() + { + string file = @" +export * from './lib/test/file1'; +export * from './lib/test/file-2' +export * from ""./lib/test/file3""; +// Comment here +export { Type } from ""./lib/test/file4""; +export { Type1, Type2 } from ""./lib/test/file5""; +export { + Type1, + Type2, + Type3 +} from './lib/test/file6';"; + TypeScriptIndexReader reader = new(this.environment); + TypeScriptIndexFile indexFile = reader.Parse(file); + Assert.AreEqual(7, indexFile.Lines.Count, "Lines count does not match"); + Assert.AreEqual("*", indexFile.Lines[0].CastTo().Types[0]); + Assert.AreEqual("./lib/test/file1", indexFile.Lines[0].CastTo().Path); + Assert.AreEqual("*", indexFile.Lines[1].CastTo().Types[0]); + Assert.AreEqual("./lib/test/file-2", indexFile.Lines[1].CastTo().Path); + Assert.AreEqual("*", indexFile.Lines[2].CastTo().Types[0]); + Assert.AreEqual("./lib/test/file3", indexFile.Lines[2].CastTo().Path); + Assert.AreEqual("// Comment here", indexFile.Lines[3].CastTo().Content); + Assert.AreEqual("Type", indexFile.Lines[4].CastTo().Types[0]); + Assert.AreEqual("./lib/test/file4", indexFile.Lines[4].CastTo().Path); + Assert.AreEqual("Type1", indexFile.Lines[5].CastTo().Types[0]); + Assert.AreEqual("Type2", indexFile.Lines[5].CastTo().Types[1]); + Assert.AreEqual("./lib/test/file5", indexFile.Lines[5].CastTo().Path); + Assert.AreEqual("Type1", indexFile.Lines[6].CastTo().Types[0]); + Assert.AreEqual("Type2", indexFile.Lines[6].CastTo().Types[1]); + Assert.AreEqual("Type3", indexFile.Lines[6].CastTo().Types[2]); + Assert.AreEqual("./lib/test/file6", indexFile.Lines[6].CastTo().Path); + } + + } +} diff --git a/TypeScript/Commands/TypeScriptModelCommand.cs b/TypeScript/Commands/TypeScriptModelCommand.cs new file mode 100644 index 00000000..1d0225f1 --- /dev/null +++ b/TypeScript/Commands/TypeScriptModelCommand.cs @@ -0,0 +1,33 @@ +using KY.Core.Dependency; +using KY.Generator.Command; +using KY.Generator.Command.Extensions; +using KY.Generator.Output; +using KY.Generator.TypeScript.Languages; +using KY.Generator.TypeScript.Transfer; + +namespace KY.Generator.TypeScript.Commands; + +public class TypeScriptModelCommand(IDependencyResolver resolver) : GeneratorCommand +{ + public static string[] Names { get; } = [ToCommand(nameof(TypeScriptModelCommand)), "typescript-model"]; + + public override void Prepare() + { + Options options = resolver.Get(); + GeneratorOptions generatorOptions = options.Get(); + generatorOptions.SetFromParameter(this.Parameters); + generatorOptions.Language = resolver.Get(); + generatorOptions.Formatting.AllowedSpecialCharacters = "$"; + generatorOptions.SkipNamespace = true; + generatorOptions.PropertiesToFields = true; + } + + public override IGeneratorCommandResult Run() + { + // TODO: Fix path is null + resolver.Get().DeleteAllRelatedFiles(this.Parameters.RelativePath); + resolver.Create().FormatNames().Write(this.Parameters.RelativePath); + resolver.Create().Execute(this.Parameters.RelativePath); + return this.Success(); + } +} diff --git a/TypeScript/Extensions/DeclareTypeTemplateExtension.cs b/TypeScript/Extensions/DeclareTypeTemplateExtension.cs index eb23abd5..583d1009 100644 --- a/TypeScript/Extensions/DeclareTypeTemplateExtension.cs +++ b/TypeScript/Extensions/DeclareTypeTemplateExtension.cs @@ -1,20 +1,18 @@ -using KY.Generator.Configurations; -using KY.Generator.TypeScript.Templates; +using KY.Generator.TypeScript.Templates; -namespace KY.Generator.TypeScript.Extensions +namespace KY.Generator.TypeScript.Extensions; + +public static class DeclareTypeTemplateExtension { - public static class DeclareTypeTemplateExtension + public static DeclareTypeTemplate FormatName(this DeclareTypeTemplate declareTypeTemplate, GeneratorOptions options, bool force = false) { - public static DeclareTypeTemplate FormatName(this DeclareTypeTemplate declareTypeTemplate, IConfiguration configuration, bool force = false) - { - declareTypeTemplate.Name = Formatter.FormatClass(declareTypeTemplate.Name, configuration, force); - return declareTypeTemplate; - } + declareTypeTemplate.Name = Formatter.FormatClass(declareTypeTemplate.Name, options, force); + return declareTypeTemplate; + } - public static DeclareTypeTemplate Public(this DeclareTypeTemplate template) - { - template.IsPublic = true; - return template; - } + public static DeclareTypeTemplate Public(this DeclareTypeTemplate template) + { + template.IsPublic = true; + return template; } } \ No newline at end of file diff --git a/TypeScript/Extensions/FileTemplateExtension.cs b/TypeScript/Extensions/FileTemplateExtension.cs new file mode 100644 index 00000000..26dfc9be --- /dev/null +++ b/TypeScript/Extensions/FileTemplateExtension.cs @@ -0,0 +1,33 @@ +using KY.Generator.Templates; + +namespace KY.Generator.TypeScript.Extensions +{ + public static class FileTemplateExtension + { + public static UsingTemplate AddUsing(this FileTemplate fileTemplate, string type, string path) + { + UsingTemplate usingTemplate = new UsingTemplate(null, type, path); + fileTemplate.Usings.Add(usingTemplate); + return usingTemplate; + } + + public static FileTemplate WithUsing(this FileTemplate fileTemplate, string type, string path) + { + fileTemplate.AddUsing(type, path); + return fileTemplate; + } + + public static ExportTemplate AddExport(this FileTemplate fileTemplate, string type, string path) + { + ExportTemplate usingTemplate = new(null, type, path); + fileTemplate.Usings.Add(usingTemplate); + return usingTemplate; + } + + public static FileTemplate WithExport(this FileTemplate fileTemplate, string type, string path) + { + fileTemplate.AddExport(type, path); + return fileTemplate; + } + } +} diff --git a/TypeScript/Fluent/WriteFluentSyntaxExtension.cs b/TypeScript/Fluent/WriteFluentSyntaxExtension.cs new file mode 100644 index 00000000..b839f4fd --- /dev/null +++ b/TypeScript/Fluent/WriteFluentSyntaxExtension.cs @@ -0,0 +1,39 @@ +using KY.Generator.Syntax; +using KY.Generator.TypeScript; + +// ReSharper disable once CheckNamespace +namespace KY.Generator; + +public static class WriteFluentSyntaxExtension +{ + /// + /// Generates code, valid for TypeScripts strict mode + /// + public static IWriteFluentSyntax Strict(this IWriteFluentSyntax syntax, bool value = true) + { + TypeScriptOptions options = ((IWriteFluentSyntaxInternal)syntax).Resolver.Get().Get(); + options.Strict = value; + return syntax; + } + + /// + /// Does not generate index.ts files anymore + /// + public static IWriteFluentSyntax NoIndex(this IWriteFluentSyntax syntax) + { + TypeScriptOptions options = ((IWriteFluentSyntaxInternal)syntax).Resolver.Get().Get(); + options.NoIndex = true; + return syntax; + } + + /// + /// Executes the TypeScript model write commands + /// + // TODO: Implement TypeScriptModel syntax + // public static IWriteFluentSyntax TypeScriptModel(this IWriteFluentSyntax syntax) + // { + // IFluentInternalSyntax internalSyntax = syntax.CastTo(); + // syntax.co + // return syntax; + // } +} diff --git a/TypeScript/Helpers/TypeScriptCode.cs b/TypeScript/Helpers/TypeScriptCode.cs index eb27cd07..ac50842c 100644 --- a/TypeScript/Helpers/TypeScriptCode.cs +++ b/TypeScript/Helpers/TypeScriptCode.cs @@ -2,34 +2,37 @@ using KY.Generator.Templates.Extensions; using KY.Generator.TypeScript.Templates; -namespace KY.Generator.TypeScript +namespace KY.Generator.TypeScript; + +public static class TypeScriptCode { - public static class TypeScriptCode + public static TypeScriptTemplate TypeScript(this Code _, string code) { - public static TypeScriptTemplate TypeScript(this Code _, string code) - { - return new TypeScriptTemplate(code); - } + return new TypeScriptTemplate(code); + } - public static NullTemplate Undefined(this Code _) - { - return new NullTemplate(); - } + public static NullTemplate Undefined(this Code _) + { + return new NullTemplate(); + } - public static NullValueTemplate Undefined(this ChainedCodeFragment template) - { - return new NullValueTemplate().Chain(template); - } + public static NullValueTemplate Undefined(this ChainedCodeFragment template) + { + return new NullValueTemplate().Chain(template); + } - public static ForceNullTemplate ForceNull(this Code _) - { - return new ForceNullTemplate(); - } + public static ForceNullTemplate ForceNull(this Code _) + { + return new ForceNullTemplate(); + } - public static ForceNullValueTemplate ForceNull(this ChainedCodeFragment template) - { - return new ForceNullValueTemplate().Chain(template); - } + public static ForceNullValueTemplate ForceNull(this ChainedCodeFragment template) + { + return new ForceNullValueTemplate().Chain(template); + } + public static TypeScriptUnionTypeTemplate UnionType(this Code _, params TypeTemplate[] types) + { + return new TypeScriptUnionTypeTemplate(types); } -} \ No newline at end of file +} diff --git a/TypeScript/Helpers/TypeScriptStrictHelper.cs b/TypeScript/Helpers/TypeScriptStrictHelper.cs index 9fba6190..96adce8b 100644 --- a/TypeScript/Helpers/TypeScriptStrictHelper.cs +++ b/TypeScript/Helpers/TypeScriptStrictHelper.cs @@ -1,20 +1,48 @@ using System.Collections.Generic; +using System.Linq; using KY.Core.DataAccess; using KY.Core.Dependency; using KY.Generator.Output; -using KY.Generator.Transfer; +using KY.Generator.TypeScript.Transfer; using KY.Generator.TypeScript.Transfer.Readers; -namespace KY.Generator.TypeScript +namespace KY.Generator.TypeScript; + +public static class TypeScriptStrictHelper { - public static class TypeScriptStrictHelper + private static readonly Dictionary cache = new(); + + public static void SetStrict(this TypeScriptOptions options, string relativePath, IDependencyResolver resolver) { - public static void Read(string relativePath, IOutput output, IDependencyResolver resolver, List transferObjects) + if (options.IsStrictSet) + { + return; + } + options.Strict = Read(relativePath, resolver); + } + + public static bool Read(string relativePath, IDependencyResolver resolver) + { + Options options = resolver.Get(); + if (options.Get().IsStrictSet) + { + return true; + } + if (resolver.Get() is FileOutput fileOutput) { - if (output is FileOutput fileOutput) + string fullPath = FileSystem.Combine(fileOutput.BasePath, relativePath); + TsConfig tsConfig = cache.FirstOrDefault(x => fullPath.StartsWith(x.Key)).Value; + if (tsConfig == null) { - resolver.Create().Read(FileSystem.Combine(fileOutput.BasePath, relativePath), transferObjects); + tsConfig = resolver.Create().Read(fullPath); + if (tsConfig?.Path != null) + { + string basePath = FileSystem.GetDirectoryName(tsConfig.Path); + cache[basePath] = tsConfig; + } } + return tsConfig?.CompilerOptions?.Strict ?? false; } + return false; } -} +} \ No newline at end of file diff --git a/TypeScript/KY.Generator.TypeScript.csproj b/TypeScript/KY.Generator.TypeScript.csproj index 85d4f4db..61153840 100644 --- a/TypeScript/KY.Generator.TypeScript.csproj +++ b/TypeScript/KY.Generator.TypeScript.csproj @@ -1,37 +1,44 @@  - - netstandard2.0 - KY-Programming - KY-Programming - 7.6.0 - KY.Generator - TypeScript Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - - KY-Generator KY Generator TypeScript - latest - + + netstandard2.0 + enable + enable + KY-Programming + KY-Programming + 10.0.0-preview.2 + KY.Generator + TypeScript Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + git + KY-Generator KY.Generator TypeScript + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - + + + + + - - - + + + + diff --git a/TypeScript/KY.Generator.TypeScript.csproj.DotSettings b/TypeScript/KY.Generator.TypeScript.csproj.DotSettings index 8b01856a..7ed7849d 100644 --- a/TypeScript/KY.Generator.TypeScript.csproj.DotSettings +++ b/TypeScript/KY.Generator.TypeScript.csproj.DotSettings @@ -1,2 +1,4 @@  - True \ No newline at end of file + False + True + True \ No newline at end of file diff --git a/TypeScript/Languages/TypeScriptLanguage.cs b/TypeScript/Languages/TypeScriptLanguage.cs index dca0fbd8..641bd984 100644 --- a/TypeScript/Languages/TypeScriptLanguage.cs +++ b/TypeScript/Languages/TypeScriptLanguage.cs @@ -1,86 +1,103 @@ -using System; -using System.Collections.Generic; -using KY.Core; +using KY.Core.Dependency; +using KY.Generator.Extensions; using KY.Generator.Languages; -using KY.Generator.Output; using KY.Generator.Templates; using KY.Generator.TypeScript.Templates; using KY.Generator.TypeScript.Writers; -using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Languages -{ - public class TypeScriptLanguage : BaseLanguage - { - public static TypeScriptLanguage Instance { get; } = new TypeScriptLanguage(); +namespace KY.Generator.TypeScript.Languages; - public override string NamespaceKeyword => "export namespace"; - public override string ClassScope => "export"; - public override string PartialKeyword => string.Empty; - public override string Name => "TypeScript"; - public override bool ImportFromSystem => false; - - protected TypeScriptLanguage() - { - this.Formatting.StartBlockInNewLine = false; - this.Formatting.EndFileWithNewLine = true; - this.Formatting.FileCase = Case.KebabCase; - this.Formatting.ClassCase = Case.PascalCase; - this.Formatting.FieldCase = Case.CamelCase; - this.Formatting.PropertyCase = Case.CamelCase; - this.Formatting.MethodCase = Case.CamelCase; - this.Formatting.ParameterCase = Case.CamelCase; +public class TypeScriptLanguage : BaseLanguage +{ + public override string ClassScope => "export"; + public override string PartialKeyword => string.Empty; + public override string Name => "TypeScript"; + public override bool ImportFromSystem => false; + public override bool IsGenericTypeWithSameNameAllowed => false; - this.ReservedKeywords.Add("function", "func"); + public TypeScriptLanguage(IDependencyResolver resolver) + : base(resolver) + { + this.Formatting.StartBlockInNewLine = false; + this.Formatting.FileCase = Case.KebabCase; + this.Formatting.ClassCase = Case.PascalCase; + this.Formatting.FieldCase = Case.CamelCase; + this.Formatting.PropertyCase = Case.CamelCase; + this.Formatting.MethodCase = Case.CamelCase; + this.Formatting.ParameterCase = Case.CamelCase; + this.Formatting.FileNameReplacer.Get("interface-prefix").SetReplacement("$1.interface"); - this.HasStaticClasses = false; - this.TemplateWriters[typeof(BaseTypeTemplate)] = new BaseTypeWriter(); - this.TemplateWriters[typeof(BaseTemplate)] = new BaseWriter(); - this.TemplateWriters[typeof(CastTemplate)] = new CastWriter(); - this.TemplateWriters[typeof(ConstructorTemplate)] = new TypeScriptMethodWriter(); - this.TemplateWriters[typeof(DeclareTemplate)] = new DeclareWriter(); - this.TemplateWriters[typeof(FieldTemplate)] = new TypeScriptFieldWriter(); - this.TemplateWriters[typeof(GenericTypeTemplate)] = new TypeScriptGenericTypeWriter(); - this.TemplateWriters[typeof(MethodTemplate)] = new TypeScriptMethodWriter(); - this.TemplateWriters[typeof(ExtensionMethodTemplate)] = new TypeScriptMethodWriter(); - this.TemplateWriters[typeof(NullValueTemplate)] = new UndefinedValueWriter(); - this.TemplateWriters[typeof(ForceNullValueTemplate)] = new UndefinedValueWriter(); - this.TemplateWriters[typeof(NullTemplate)] = new UndefinedWriter(); - this.TemplateWriters[typeof(ForceNullTemplate)] = new UndefinedWriter(); - this.TemplateWriters[typeof(ParameterTemplate)] = new TypeScriptParameterWriter(); - this.TemplateWriters[typeof(PropertyTemplate)] = new TypeScriptPropertyWriter(); - this.TemplateWriters[typeof(ThrowTemplate)] = new ThrowWriter(); - this.TemplateWriters[typeof(EnumTemplate)] = new TypeScriptEnumWriter(); - this.TemplateWriters[typeof(OperatorTemplate)] = new TypeScriptOperatorWriter(); - this.TemplateWriters[typeof(TypeScriptTemplate)] = new TypeScriptWriter(); - this.TemplateWriters[typeof(UsingTemplate)] = new UsingWriter(); - this.TemplateWriters[typeof(AttributeTemplate)] = new AttributeWriter(this); - this.TemplateWriters[typeof(AnonymousObjectTemplate)] = new AnonymousObjectWriter(); - this.TemplateWriters[typeof(TypeTemplate)] = new TypeScriptTypeWriter(); - this.TemplateWriters[typeof(DateTimeTemplate)] = new TypeScriptDateTimeWriter(); - this.TemplateWriters[typeof(NumberTemplate)] = new TypeScriptNumberWriter(); - this.TemplateWriters[typeof(DeclareTypeTemplate)] = new DeclareTypeWriter(); - } + this.ReservedKeywords.Add("any", "anyValue"); + this.ReservedKeywords.Add("async", "asyncValue"); + this.ReservedKeywords.Add("await", "awaitValue"); + this.ReservedKeywords.Add("boolean", "booleanValue"); + this.ReservedKeywords.Add("constructor", "constructorValue"); + this.ReservedKeywords.Add("debugger", "debuggerValue"); + this.ReservedKeywords.Add("declare", "declareValue"); + this.ReservedKeywords.Add("delete", "deleteValue"); + this.ReservedKeywords.Add("export", "exportValue"); + this.ReservedKeywords.Add("extends", "extendsValue"); + this.ReservedKeywords.Add("from", "fromValue"); + this.ReservedKeywords.Add("function", "functionValue"); + this.ReservedKeywords.Add("get", "getValue"); + this.ReservedKeywords.Add("implements", "implementsValue"); + this.ReservedKeywords.Add("import", "importValue"); + this.ReservedKeywords.Add("instanceof", "instanceofValue"); + this.ReservedKeywords.Add("let", "letValue"); + this.ReservedKeywords.Add("module", "moduleValue"); + this.ReservedKeywords.Add("number", "numberValue"); + this.ReservedKeywords.Add("of", "ofValue"); + this.ReservedKeywords.Add("package", "packageValue"); + this.ReservedKeywords.Add("require", "requireValue"); + this.ReservedKeywords.Add("set", "setValue"); + this.ReservedKeywords.Add("string", "stringValue"); + this.ReservedKeywords.Add("super", "superValue"); + this.ReservedKeywords.Add("symbol", "symbolValue"); + this.ReservedKeywords.Add("type", "typeValue"); + this.ReservedKeywords.Add("var", "varValue"); + this.ReservedKeywords.Add("with", "withValue"); + this.ReservedKeywords.Add("yield", "yieldValue"); - protected override void WriteHeader(FileTemplate fileTemplate, IOutputCache output) - { - fileTemplate.Header.Description += Environment.NewLine + "/* eslint-disable */" + Environment.NewLine + "tslint:disable"; - base.WriteHeader(fileTemplate, output); - } + this.HasStaticClasses = false; - public override string FormatFileName(string fileName, string fileType = null) - { - fileName = Formatter.Format(fileName, this.Formatting.FileCase, this.Formatting.AllowedSpecialCharacters); - if (fileName.StartsWith("i-") || "interface".Equals(fileType, StringComparison.CurrentCultureIgnoreCase)) - { - fileName = fileName.TrimStart("i-") + ".interface"; - } - return fileName + ".ts"; - } + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + this.AddWriter(); + } - protected override IEnumerable GetUsings(FileTemplate fileTemplate) - { - return fileTemplate.GetUsingsByTypeAndPath(); - } + public override string FormatFile(string name, GeneratorOptions options, string type = null, bool force = false) + { + string fileName = base.FormatFile(name, options, type, force); + // if ("interface".Equals(type, StringComparison.CurrentCultureIgnoreCase)) + // { + // fileName += ".interface"; + // } + return fileName + ".ts"; } } diff --git a/TypeScript/Options/TypeScriptOptions.cs b/TypeScript/Options/TypeScriptOptions.cs new file mode 100644 index 00000000..b9fba6b1 --- /dev/null +++ b/TypeScript/Options/TypeScriptOptions.cs @@ -0,0 +1,41 @@ +namespace KY.Generator.TypeScript; + +public class TypeScriptOptions(TypeScriptOptions? parent, TypeScriptOptions? global, object? target = null) + : OptionsBase(parent, global, target) +{ + private bool? strict; + private bool? isStrictSet; + private bool? noIndex; + private bool? forceIndex; + private string? modelOutput; + + public bool Strict + { + get => this.GetValue(x => x.strict); + set => this.strict = value; + } + + public bool IsStrictSet + { + get => this.GetValue(x => x.isStrictSet); + set => this.isStrictSet = value; + } + + public bool NoIndex + { + get => this.GetValue(x => x.noIndex); + set => this.noIndex = value; + } + + public bool ForceIndex + { + get => this.GetValue(x => x.forceIndex); + set => this.forceIndex = value; + } + + public string? ModelOutput + { + get => this.GetValue(x => x.modelOutput); + set => this.modelOutput = value; + } +} diff --git a/TypeScript/Options/TypeScriptOptionsFactory.cs b/TypeScript/Options/TypeScriptOptionsFactory.cs new file mode 100644 index 00000000..6b5017ec --- /dev/null +++ b/TypeScript/Options/TypeScriptOptionsFactory.cs @@ -0,0 +1,53 @@ +using System.Reflection; + +namespace KY.Generator.TypeScript; + +public class TypeScriptOptionsFactory : IOptionsFactory +{ + public bool CanCreate(Type optionsType) + { + return optionsType == typeof(TypeScriptOptions); + } + + public object Create(Type optionsType, object key, object? parent, object global) + { + return new TypeScriptOptions(parent as TypeScriptOptions, global as TypeScriptOptions, key); + } + + public object CreateGlobal(Type optionsType, object key, object? parent) + { + return key switch + { + Assembly assembly => this.CreateFromCustomAttributes(assembly.GetCustomAttributes(), key, parent as TypeScriptOptions), + MemberInfo member => this.CreateFromCustomAttributes(member.GetCustomAttributes(), key, parent as TypeScriptOptions), + ParameterInfo parameter => this.CreateFromCustomAttributes(parameter.GetCustomAttributes(), key, parent as TypeScriptOptions), + Options.GlobalKey => new TypeScriptOptions(parent as TypeScriptOptions, null, "global"), + _ => new TypeScriptOptions(parent as TypeScriptOptions, null, key) + // _ => throw new InvalidOperationException($"Could not create {nameof(TypeScriptOptions)} {key.GetType()}") + }; + } + + private TypeScriptOptions CreateFromCustomAttributes(IEnumerable customAttributes, object key, TypeScriptOptions? parent) + { + TypeScriptOptions options = new(parent, null, key); + foreach (Attribute attribute in customAttributes) + { + switch (attribute) + { + case GenerateStrictAttribute strictAttribute: + options.Strict = strictAttribute.Strict; + break; + case GenerateNoIndexAttribute: + options.NoIndex = true; + break; + case GenerateForceIndexAttribute: + options.ForceIndex = true; + break; + case GenerateModelOutputAttribute modelOutputAttribute: + options.ModelOutput = modelOutputAttribute.RelativePath; + break; + } + } + return options; + } +} diff --git a/TypeScript/Templates/Extensions/ClassTemplateExtension.cs b/TypeScript/Templates/Extensions/ClassTemplateExtension.cs new file mode 100644 index 00000000..2f499437 --- /dev/null +++ b/TypeScript/Templates/Extensions/ClassTemplateExtension.cs @@ -0,0 +1,63 @@ +using KY.Core; +using KY.Generator.Templates; + +namespace KY.Generator.TypeScript.Templates.Extensions; + +public static class ClassTemplateExtension +{ + public static MethodTemplate AddOverload(this MethodTemplate method, Action action) + { + TypeScriptMethodTemplate typeScriptMethod = method as TypeScriptMethodTemplate ?? new TypeScriptMethodTemplate(method); + TypeScriptMethodOverloadTemplate overload = new(); + action(overload); + typeScriptMethod.Overloads.Add(overload); + method.Class.Methods.Replace(method, typeScriptMethod); + return typeScriptMethod; + } +} + +public static class TypeScriptMethodOverloadTemplateExtension +{ + public static TypeScriptMethodOverloadTemplate WithGeneric(this TypeScriptMethodOverloadTemplate methodTemplate, string alias, TypeTemplate? defaultType = null) + { + methodTemplate.Generics.Add(new MethodGenericTemplate(alias, defaultType)); + return methodTemplate; + } + + public static ParameterTemplate AddParameter(this TypeScriptMethodOverloadTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + ParameterTemplate parameter = new(type, name, defaultValue); + methodTemplate.Parameters.Add(parameter); + return parameter; + } + + public static TypeScriptMethodOverloadTemplate WithParameter(this TypeScriptMethodOverloadTemplate methodTemplate, ParameterTemplate parameter) + { + methodTemplate.Parameters.Add(parameter); + return methodTemplate; + } + + public static TypeScriptMethodOverloadTemplate WithParameter(this TypeScriptMethodOverloadTemplate methodTemplate, TypeTemplate type, string name, ICodeFragment? defaultValue = null) + { + methodTemplate.AddParameter(type, name, defaultValue); + return methodTemplate; + } + + public static TypeScriptMethodOverloadTemplate WithParameters(this TypeScriptMethodOverloadTemplate methodTemplate, IEnumerable parameters) + { + methodTemplate.Parameters.AddRange(parameters); + return methodTemplate; + } + + public static TypeScriptMethodOverloadTemplate WithComment(this TypeScriptMethodOverloadTemplate methodTemplate, string description) + { + methodTemplate.Comment = new CommentTemplate(description, CommentType.Summary); + return methodTemplate; + } + + public static TypeScriptMethodOverloadTemplate WithReturnType(this TypeScriptMethodOverloadTemplate methodTemplate, TypeTemplate type) + { + methodTemplate.ReturnType = type; + return methodTemplate; + } +} diff --git a/TypeScript/Templates/TypeScriptMethodTemplate.cs b/TypeScript/Templates/TypeScriptMethodTemplate.cs new file mode 100644 index 00000000..803a814f --- /dev/null +++ b/TypeScript/Templates/TypeScriptMethodTemplate.cs @@ -0,0 +1,24 @@ +using KY.Generator.Templates; + +namespace KY.Generator.TypeScript.Templates; + +public class TypeScriptMethodTemplate : MethodTemplate +{ + public List Overloads { get; } = []; + + public TypeScriptMethodTemplate(ClassTemplate classTemplate, string name, TypeTemplate type) + : base(classTemplate, name, type) + { } + + public TypeScriptMethodTemplate(MethodTemplate methodTemplate) + : base(methodTemplate) + { } +} + +public class TypeScriptMethodOverloadTemplate +{ + public TypeTemplate ReturnType { get; set; } + public List Parameters { get; } = []; + public CommentTemplate? Comment { get; set; } + public List Generics { get; set; } = []; +} diff --git a/TypeScript/Templates/TypeScriptTemplate.cs b/TypeScript/Templates/TypeScriptTemplate.cs index b14cd487..037321a8 100644 --- a/TypeScript/Templates/TypeScriptTemplate.cs +++ b/TypeScript/Templates/TypeScriptTemplate.cs @@ -1,8 +1,10 @@ +using System; +using KY.Core; using KY.Generator.Templates; namespace KY.Generator.TypeScript.Templates { - public class TypeScriptTemplate : ICodeFragment + public class TypeScriptTemplate : ICodeFragment, ICloneable { public string Code { get; } public bool BreakAfter { get; set; } @@ -16,5 +18,12 @@ public TypeScriptTemplate(string code) { this.Code = code; } + + object ICloneable.Clone() + { + TypeScriptTemplate clone = new(this.Code); + clone.SetFrom(this); + return clone; + } } -} \ No newline at end of file +} diff --git a/TypeScript/Templates/TypeScriptUnionTypeTemplate.cs b/TypeScript/Templates/TypeScriptUnionTypeTemplate.cs new file mode 100644 index 00000000..319d915b --- /dev/null +++ b/TypeScript/Templates/TypeScriptUnionTypeTemplate.cs @@ -0,0 +1,31 @@ +using KY.Core; +using KY.Generator.Templates; + +namespace KY.Generator.TypeScript.Templates; + +public class TypeScriptUnionTypeTemplate : TypeTemplate +{ + public List Types { get; } = []; + + public TypeScriptUnionTypeTemplate(IEnumerable? types = null) + { + if (types == null) + { + return; + } + foreach (TypeTemplate type in types) + { + if (type is TypeScriptUnionTypeTemplate unionType) + { + foreach (TypeTemplate subType in unionType.Types) + { + this.Types.AddIfNotExists(subType); + } + } + else + { + this.Types.Add(type); + } + } + } +} diff --git a/TypeScript/Templates/UnknownExportTemplate.cs b/TypeScript/Templates/UnknownExportTemplate.cs new file mode 100644 index 00000000..8fb10b0b --- /dev/null +++ b/TypeScript/Templates/UnknownExportTemplate.cs @@ -0,0 +1,14 @@ +using KY.Generator.Templates; + +namespace KY.Generator.TypeScript.Templates +{ + public class UnknownExportTemplate : UsingTemplate + { + public TypeScriptTemplate Code { get; } + + public UnknownExportTemplate(TypeScriptTemplate code) + { + this.Code = code; + } + } +} diff --git a/TypeScript/Transfer/ExportIndexLine.cs b/TypeScript/Transfer/ExportIndexLine.cs new file mode 100644 index 00000000..69ec786e --- /dev/null +++ b/TypeScript/Transfer/ExportIndexLine.cs @@ -0,0 +1,10 @@ +using System.Collections.Generic; + +namespace KY.Generator.TypeScript.Transfer +{ + public class ExportIndexLine : IIndexLine + { + public List Types { get; set; } = new(); + public string Path { get; set; } + } +} \ No newline at end of file diff --git a/TypeScript/Transfer/IIndexLine.cs b/TypeScript/Transfer/IIndexLine.cs new file mode 100644 index 00000000..d83a4915 --- /dev/null +++ b/TypeScript/Transfer/IIndexLine.cs @@ -0,0 +1,5 @@ +namespace KY.Generator.TypeScript.Transfer +{ + public interface IIndexLine + { } +} \ No newline at end of file diff --git a/TypeScript/Transfer/Readers/TsConfigReader.cs b/TypeScript/Transfer/Readers/TsConfigReader.cs index 13079482..64639cbf 100644 --- a/TypeScript/Transfer/Readers/TsConfigReader.cs +++ b/TypeScript/Transfer/Readers/TsConfigReader.cs @@ -10,13 +10,26 @@ namespace KY.Generator.TypeScript.Transfer.Readers { public class TsConfigReader { - private static readonly Regex pathRegex = new Regex(@"(?.*ClientApp[^\\\/]*)", RegexOptions.Compiled | RegexOptions.IgnoreCase); + private readonly List transferObjects; + private static readonly Dictionary cache = new(); + private static readonly Regex pathRegex = new(@"(?.*ClientApp[^\\\/]*)", RegexOptions.Compiled | RegexOptions.IgnoreCase); - public void Read(string fullPath, List transferObjects) + public TsConfigReader(List transferObjects) { - if (transferObjects.OfType().Any()) + this.transferObjects = transferObjects; + } + + public TsConfig Read(string fullPath) + { + TsConfig tsConfig = transferObjects.OfType().FirstOrDefault(); + if (tsConfig != null) + { + return tsConfig; + } + if (cache.TryGetValue(fullPath, out TsConfig read)) { - return; + this.LogInfo(read); + return read; } string path = FileSystem.Combine(fullPath, "tsconfig.json"); Logger.Trace($"Try to read strict mode from {path}"); @@ -27,30 +40,41 @@ public void Read(string fullPath, List transferObjects) { string basePath = match.Groups["path"].Value; path = FileSystem.Combine(basePath, "tsconfig.json"); + Logger.Trace($"Try to read strict mode from {path}"); } - Logger.Trace($"Try to read strict mode from {path}"); } if (!FileSystem.FileExists(path) && fullPath.Contains("src")) { path = FileSystem.Combine(fullPath.Substring(0, fullPath.IndexOf("src")), "tsconfig.json"); Logger.Trace($"Try to read strict mode from {path}"); } + TsConfig config; if (FileSystem.FileExists(path)) { - this.Parse(path, transferObjects); + config = this.Parse(path); + this.LogInfo(config); } else { Logger.Trace("Could not find tsconfig.json"); + config = null; } + cache[fullPath] = config; + return config; } - private void Parse(string path, List transferObjects) + private TsConfig Parse(string path) { string text = FileSystem.ReadAllText(path); TsConfig tsConfig = JsonConvert.DeserializeObject(text); - transferObjects.Add(tsConfig); - Logger.Trace($"Activate TypeScript {(tsConfig?.CompilerOptions?.Strict == true ? "strict" : "regular")} mode"); + tsConfig.Path = path; + this.transferObjects.Add(tsConfig); + return tsConfig; + } + + private void LogInfo(TsConfig config) + { + Logger.Trace($"Activate TypeScript {(config?.CompilerOptions?.Strict == true ? "strict" : "regular")} mode"); } } } diff --git a/TypeScript/Transfer/Readers/TypeScriptIndexReader.cs b/TypeScript/Transfer/Readers/TypeScriptIndexReader.cs new file mode 100644 index 00000000..b32a735b --- /dev/null +++ b/TypeScript/Transfer/Readers/TypeScriptIndexReader.cs @@ -0,0 +1,65 @@ +using System.Linq; +using System.Text.RegularExpressions; +using KY.Core; +using KY.Core.DataAccess; +using KY.Generator.Models; + +namespace KY.Generator.TypeScript.Transfer.Readers +{ + public class TypeScriptIndexReader + { + private readonly IEnvironment environment; + private static readonly Regex regex = new(@"\s*(export\s*(?(\*|{[^}]+}))\s*from\s*['""](?[^'""]+)['""];?|(?.*))"); + + public TypeScriptIndexReader(IEnvironment environment) + { + this.environment = environment; + } + + public TypeScriptIndexFile Read(string relativePath) + { + string fullPath = FileSystem.Combine(this.environment.OutputPath, relativePath, "index.ts"); + if (!FileSystem.FileExists(fullPath)) + { + return null; + } + string fileContent = FileSystem.ReadAllText(fullPath); + return this.Parse(fileContent); + } + + public TypeScriptIndexFile Parse(string value) + { + Match match = regex.Match(value); + if (!match.Success) + { + Logger.Error($"Could not parse index.ts. Please contact support@ky-programming.de"); + return null; + } + + TypeScriptIndexFile file = new(); + Match currentMatch = match; + do + { + string types = currentMatch.Groups["types"].Value.Trim(); + string path = currentMatch.Groups["path"].Value.Trim(); + string fallback = currentMatch.Groups["fallback"].Value.Trim(); + + if (!string.IsNullOrEmpty(types) && !string.IsNullOrEmpty(path)) + { + file.Lines.Add(new ExportIndexLine + { + Types = types.Trim(' ', '{', '}').Split(',').Select(x => x.Trim()).ToList(), + Path = path + } + ); + } + else if (!string.IsNullOrEmpty(fallback)) + { + file.Lines.Add(new UnknownIndexLine { Content = fallback }); + } + currentMatch = currentMatch.NextMatch(); + } while (currentMatch.Success); + return file; + } + } +} diff --git a/TypeScript/Transfer/TsConfig.cs b/TypeScript/Transfer/TsConfig.cs index 64d27297..6f68ea51 100644 --- a/TypeScript/Transfer/TsConfig.cs +++ b/TypeScript/Transfer/TsConfig.cs @@ -4,6 +4,7 @@ namespace KY.Generator.TypeScript.Transfer { public class TsConfig : ITransferObject { + public string Path { get; set; } public CompilerOptions CompilerOptions { get; set; } = new(); } diff --git a/TypeScript/Transfer/TypeScriptIndexFile.cs b/TypeScript/Transfer/TypeScriptIndexFile.cs new file mode 100644 index 00000000..6742439d --- /dev/null +++ b/TypeScript/Transfer/TypeScriptIndexFile.cs @@ -0,0 +1,12 @@ +using System.Collections.Generic; +using KY.Generator.Transfer; + +namespace KY.Generator.TypeScript.Transfer +{ + public class TypeScriptIndexFile : ITransferObject + { + public string RelativePath { get; set; } + public List Lines { get; } = new(); + } + +} diff --git a/TypeScript/Transfer/TypeScriptIndexHelper.cs b/TypeScript/Transfer/TypeScriptIndexHelper.cs new file mode 100644 index 00000000..59b33875 --- /dev/null +++ b/TypeScript/Transfer/TypeScriptIndexHelper.cs @@ -0,0 +1,54 @@ +using System.Collections.Generic; +using System.Linq; +using KY.Core.DataAccess; +using KY.Generator.Templates; +using KY.Generator.TypeScript.Languages; +using KY.Generator.TypeScript.Transfer.Readers; +using KY.Generator.TypeScript.Transfer.Writers; + +namespace KY.Generator.TypeScript.Transfer; + +public class TypeScriptIndexHelper +{ + private readonly TypeScriptIndexReader reader; + private readonly TypeScriptIndexWriter writer; + private readonly List files; + private readonly TypeScriptOptions options; + + public TypeScriptIndexHelper(TypeScriptIndexReader reader, TypeScriptIndexWriter writer, List files, Options options) + { + this.reader = reader; + this.writer = writer; + this.files = files; + this.options = options.Get(); + } + + public void Execute(string relativePath) + { + if (this.options.NoIndex && !this.options.ForceIndex) + { + return; + } + + TypeScriptIndexFile indexFile = this.reader.Read(relativePath); + + List fileTemplates = this.files.Where(file => file.RelativePath == relativePath + && file.Name != "index.ts" + && file.Options.Language.IsTypeScript() + ).ToList(); + if ((fileTemplates.Count > 1 || this.options.ForceIndex) && indexFile == null) + { + indexFile = new TypeScriptIndexFile(); + } + if (indexFile != null) + { + foreach (FileTemplate file in fileTemplates) + { + string shortenedRelativePath = FileSystem.Combine(".", FileSystem.RelativeTo(FileSystem.Combine(file.RelativePath, file.Name), relativePath)); + indexFile.Lines.Add(new ExportIndexLine { Path = shortenedRelativePath.Replace("\\", "/"), Types = { "*" } }); + } + } + + this.writer.Write(indexFile, relativePath); + } +} \ No newline at end of file diff --git a/TypeScript/Transfer/TypeScriptModelWriter.cs b/TypeScript/Transfer/TypeScriptModelWriter.cs index 4b6b77e1..d2377375 100644 --- a/TypeScript/Transfer/TypeScriptModelWriter.cs +++ b/TypeScript/Transfer/TypeScriptModelWriter.cs @@ -1,7 +1,4 @@ -using System.Collections.Generic; -using System.Linq; -using KY.Generator.Configurations; -using KY.Generator.Mappings; +using KY.Generator.Mappings; using KY.Generator.Templates; using KY.Generator.Templates.Extensions; using KY.Generator.Transfer; @@ -10,67 +7,61 @@ using KY.Generator.TypeScript.Languages; using KY.Generator.TypeScript.Templates; -namespace KY.Generator.TypeScript.Transfer -{ - public class TypeScriptModelWriter : ModelWriter - { - public bool Strict { get; set; } - - public TypeScriptModelWriter(ITypeMapping typeMapping) - : base(typeMapping) - { } +namespace KY.Generator.TypeScript.Transfer; - public override List Write(IModelConfiguration configuration, IEnumerable transferObjects) - { - List list = transferObjects.ToList(); - TsConfig tsConfig = list.OfType().FirstOrDefault(); - this.Strict = tsConfig?.CompilerOptions?.Strict ?? false; - return base.Write(configuration, list); - } +public class TypeScriptModelWriter : ModelWriter +{ + public TypeScriptModelWriter(Options options, ITypeMapping typeMapping, IEnumerable transferObjects, IList files) + : base(options, typeMapping, transferObjects, files) + { } - protected override ClassTemplate WriteClass(IModelConfiguration configuration, ModelTransferObject model, string nameSpace, List files) + protected override ClassTemplate WriteClass(ModelTransferObject model, string relativePath) + { + GeneratorOptions modelOptions = this.Options.Get(model); + ClassTemplate classTemplate = base.WriteClass(model, relativePath); + if (!model.IsAbstract && !classTemplate.IsInterface && modelOptions.Language.IsTypeScript()) { - ClassTemplate classTemplate = base.WriteClass(configuration, model, nameSpace, files); - if (!model.IsAbstract && !classTemplate.IsInterface && configuration.Language.IsTypeScript()) + ConstructorTemplate constructor = classTemplate.AddConstructor(); + constructor.AddParameter(Code.Generic("Partial", classTemplate.ToType()), "init").Optional(); + constructor.WithCode(Code.Static(Code.Type("Object")).Method("assign", Code.This(), Code.Local("init")).Close()); + if (classTemplate.BasedOn.Any(x => !x.ToType().IsInterface)) { - ConstructorTemplate constructor = classTemplate.AddConstructor(); - constructor.AddParameter(Code.Generic("Partial", classTemplate.ToType()), "init").Optional(); - constructor.WithCode(Code.Static(Code.Type("Object")).Method("assign", Code.This(), Code.Local("init")).Close()); - if (classTemplate.BasedOn.Any(x => !x.ToType().IsInterface)) - { - // TODO: Add super parameters - constructor.WithSuper(); - } + // TODO: Add super parameters + constructor.WithSuper(); } - return classTemplate; } + return classTemplate; + } - protected override FieldTemplate AddField(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration) + protected override FieldTemplate AddField(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + if (member.IsOverwrite) { - FieldTemplate fieldTemplate = base.AddField(model, name, type, classTemplate, configuration); - fieldTemplate.Strict = this.Strict; - if (fieldTemplate.DefaultValue == null && this.Strict && !fieldTemplate.Type.IsNullable) - { - fieldTemplate.DefaultValue = type.Default; - } - return fieldTemplate; + return null; + } + TypeScriptOptions fieldOptions = this.Options.Get(member); + FieldTemplate fieldTemplate = base.AddField(model, member, classTemplate); + fieldTemplate.Strict = fieldOptions.Strict; + if (fieldTemplate.DefaultValue == null && fieldOptions.Strict && !fieldTemplate.IsNullable) + { + fieldTemplate.DefaultValue = member.Type?.Default; } + return fieldTemplate; + } - protected override PropertyTemplate AddProperty(ModelTransferObject model, string name, TypeTransferObject type, ClassTemplate classTemplate, IConfiguration configuration, bool canRead = true, bool canWrite = true) + protected override PropertyTemplate AddProperty(ModelTransferObject model, MemberTransferObject member, ClassTemplate classTemplate) + { + if (member.IsOverwrite) { - PropertyTemplate propertyTemplate = base.AddProperty(model, name, type, classTemplate, configuration, canRead, canWrite); - if (propertyTemplate.DefaultValue == null && this.Strict) - { - if (propertyTemplate.Type.IsNullable) - { - propertyTemplate.Type.Name += " | undefined"; - } - else - { - propertyTemplate.DefaultValue = type.Default; - } - } - return propertyTemplate; + return null; + } + TypeScriptOptions propertyOptions = this.Options.Get(member); + PropertyTemplate propertyTemplate = base.AddProperty(model, member, classTemplate); + propertyTemplate.Strict = propertyOptions.Strict; + if (propertyTemplate.DefaultValue == null && propertyOptions.Strict && !propertyTemplate.IsNullable) + { + propertyTemplate.DefaultValue = member.Type?.Default; } + return propertyTemplate; } } diff --git a/TypeScript/Transfer/UnknownIndexLine.cs b/TypeScript/Transfer/UnknownIndexLine.cs new file mode 100644 index 00000000..0e28b3bb --- /dev/null +++ b/TypeScript/Transfer/UnknownIndexLine.cs @@ -0,0 +1,7 @@ +namespace KY.Generator.TypeScript.Transfer +{ + public class UnknownIndexLine : IIndexLine + { + public string Content { get; set; } + } +} \ No newline at end of file diff --git a/TypeScript/Transfer/Writers/TypeScriptIndexWriter.cs b/TypeScript/Transfer/Writers/TypeScriptIndexWriter.cs new file mode 100644 index 00000000..9d460026 --- /dev/null +++ b/TypeScript/Transfer/Writers/TypeScriptIndexWriter.cs @@ -0,0 +1,71 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using KY.Core; +using KY.Generator.Mappings; +using KY.Generator.Templates; +using KY.Generator.Templates.Extensions; +using KY.Generator.Transfer; +using KY.Generator.Transfer.Writers; +using KY.Generator.TypeScript.Extensions; +using KY.Generator.TypeScript.Templates; + +namespace KY.Generator.TypeScript.Transfer.Writers; + +public class TypeScriptIndexWriter : TransferWriter +{ + private readonly List transferObjects; + private readonly List files; + + public TypeScriptIndexWriter(Options options, ITypeMapping typeMapping, List transferObjects, List files) + : base(options, typeMapping) + { + this.transferObjects = transferObjects; + this.files = files; + } + + public virtual void Write() + { + Logger.Trace("Generate index.ts..."); + foreach (TypeScriptIndexFile file in this.transferObjects.OfType()) + { + this.Write(file, file.RelativePath); + } + } + + public virtual void Write(TypeScriptIndexFile file, string relativePath) + { + if (file == null) + { + return; + } + GeneratorOptions generatorOptions = this.Options.Get(); + FileTemplate fileTemplate = this.files.AddFile(relativePath, generatorOptions) + .WithName(Formatter.FormatFile("index", generatorOptions)) + .IgnoreOutputId() + .ForceOverwrite() + .NoHeader(); + fileTemplate.Linters = new Dictionary(); + foreach (IIndexLine line in file.Lines) + { + if (line is ExportIndexLine indexLine) + { + foreach (string type in indexLine.Types) + { + fileTemplate.AddExport(type, indexLine.Path.TrimEnd(".ts")); + } + } + else if (line is UnknownIndexLine unknownIndexLine) + { + fileTemplate.Usings.Add(new UnknownExportTemplate(Code.TypeScript(unknownIndexLine.Content))); + } + } + foreach (ExportTemplate exportTemplate in fileTemplate.Usings.OfType().ToList()) + { + if (fileTemplate.Usings.Count(u => u.Type == exportTemplate.Type && u.Path.Equals(exportTemplate.Path, StringComparison.InvariantCultureIgnoreCase)) > 1) + { + fileTemplate.Usings.Remove(exportTemplate); + } + } + } +} diff --git a/TypeScript/TypeScriptModule.cs b/TypeScript/TypeScriptModule.cs index 4df577ad..5c7d3394 100644 --- a/TypeScript/TypeScriptModule.cs +++ b/TypeScript/TypeScriptModule.cs @@ -1,18 +1,26 @@ using KY.Core.Dependency; using KY.Core.Module; +using KY.Generator.Command; using KY.Generator.Languages; +using KY.Generator.TypeScript.Commands; using KY.Generator.TypeScript.Languages; using KY.Generator.TypeScript.Transfer; +using KY.Generator.TypeScript.Transfer.Readers; +using KY.Generator.TypeScript.Transfer.Writers; -namespace KY.Generator.TypeScript +namespace KY.Generator.TypeScript; + +public class TypeScriptModule : ModuleBase { - public class TypeScriptModule : ModuleBase + public TypeScriptModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public TypeScriptModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(TypeScriptLanguage.Instance); - this.DependencyResolver.Bind().ToSelf(); - } + this.DependencyResolver.Bind().To(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSelf(); + this.DependencyResolver.Bind().ToSingleton(); + this.DependencyResolver.Get().Register(TypeScriptModelCommand.Names); } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/AttributeWriter.cs b/TypeScript/Writers/AttributeWriter.cs index 80ea0341..6cf0a041 100644 --- a/TypeScript/Writers/AttributeWriter.cs +++ b/TypeScript/Writers/AttributeWriter.cs @@ -8,13 +8,6 @@ namespace KY.Generator.TypeScript.Writers { public class AttributeWriter : ITemplateWriter { - protected BaseLanguage Language { get; } - - public AttributeWriter(BaseLanguage language) - { - this.Language = language; - } - public virtual void Write(ICodeFragment fragment, IOutputCache output) { AttributeTemplate template = (AttributeTemplate)fragment; @@ -29,9 +22,9 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) } if (template.Properties.Count > 0) { - foreach (KeyValuePair pair in template.Properties) + foreach (KeyValuePair pair in template.Properties) { - output.Add($"{pair.Key} = {this.Language.ConvertValue(pair.Value)}"); + output.Add($"{pair.Key} = ").Add(pair.Value); } } output.Add(")") diff --git a/TypeScript/Writers/BaseTypeWriter.cs b/TypeScript/Writers/BaseTypeWriter.cs index 032fd9b1..f2d68d75 100644 --- a/TypeScript/Writers/BaseTypeWriter.cs +++ b/TypeScript/Writers/BaseTypeWriter.cs @@ -17,9 +17,10 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) { return; } - + TypeTemplate type = template.ToType(); - if (output.LastFragments.Skip(2).FirstOrDefault() is BaseTypeTemplate baseType && baseType.ToType().IsInterface == type.IsInterface) + BaseTypeTemplate previousBaseTypeTemplate = output.LastFragments.TakeWhile(x => !Equals(x, template.Parent)).OfType().FirstOrDefault(x => x != template); + if (previousBaseTypeTemplate?.ToType().IsInterface == type.IsInterface) { output.Add(", "); } @@ -30,4 +31,4 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) output.Add(type); } } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/DeclareWriter.cs b/TypeScript/Writers/DeclareWriter.cs index e504eefd..0b230451 100644 --- a/TypeScript/Writers/DeclareWriter.cs +++ b/TypeScript/Writers/DeclareWriter.cs @@ -11,10 +11,10 @@ public virtual void Write(ICodeFragment fragment, IOutputCache output) DeclareTemplate template = (DeclareTemplate)fragment; output.Add(template.IsConstant ? "const " : "let ") .Add(template.Name) - .If(template.Type != null && !(template.Code is NewTemplate)).Add(": ").Add(template.Type).EndIf() + .If(template.Type != null && template.Code is not NewTemplate).Add(": ").Add(template.Type).EndIf() .Add(" = ") .Add(template.Code) .CloseLine(); } } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/ThrowWriter.cs b/TypeScript/Writers/ThrowWriter.cs index 7fe9fe35..a1cf52ed 100644 --- a/TypeScript/Writers/ThrowWriter.cs +++ b/TypeScript/Writers/ThrowWriter.cs @@ -3,27 +3,38 @@ using KY.Generator.Templates; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class ThrowWriter : ITemplateWriter { - public class ThrowWriter : ITemplateWriter + private readonly Options options; + + public ThrowWriter(Options options) { - public virtual void Write(ICodeFragment fragment, IOutputCache output) + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + GeneratorOptions generatorOptions = this.options.Get(); + ThrowTemplate template = (ThrowTemplate)fragment; + if (template.Type.Name == nameof(ArgumentOutOfRangeException)) + { + output.Add("throw new Error(") + .Add(template.Parameters[2]) + .Add(" + ") + .Add(generatorOptions.Formatting.Quote) + .Add(" Actual value: ") + .Add(generatorOptions.Formatting.Quote) + .Add(" + ") + .Add(template.Parameters[1]) + .Add(")"); + } + else { - ThrowTemplate template = (ThrowTemplate)fragment; - if (template.Type.Name == nameof(ArgumentOutOfRangeException)) - { - output.Add("throw new Error(") - .Add(template.Parameters[2]) - .Add(" + \" Actual value: \" + ") - .Add(template.Parameters[1]) - .Add(")"); - } - else - { - output.Add("throw new Error(") - .Add(template.Parameters) - .Add(")"); - } + output.Add("throw new Error(") + .Add(template.Parameters) + .Add(")"); } } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/TypeScriptDictionaryWriter.cs b/TypeScript/Writers/TypeScriptDictionaryWriter.cs index a13298e8..8d63f035 100644 --- a/TypeScript/Writers/TypeScriptDictionaryWriter.cs +++ b/TypeScript/Writers/TypeScriptDictionaryWriter.cs @@ -12,7 +12,7 @@ public void Write(GenericTypeTemplate template, IOutputCache output) { TypeTemplate keyType = template.Types.First(); TypeTemplate valueType = template.Types.Second(); - if (keyType.Name == "string" || keyType.Name == "number") + if (keyType.Name is "string" or "number") { output.Add($"{{ [key: {keyType.Name}]: {valueType.Name}; }}"); } @@ -22,4 +22,4 @@ public void Write(GenericTypeTemplate template, IOutputCache output) } } } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/TypeScriptEnumWriter.cs b/TypeScript/Writers/TypeScriptEnumWriter.cs index b464824b..fea9e814 100644 --- a/TypeScript/Writers/TypeScriptEnumWriter.cs +++ b/TypeScript/Writers/TypeScriptEnumWriter.cs @@ -3,49 +3,52 @@ using KY.Generator.Templates; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class TypeScriptEnumWriter : EnumWriter { - public class TypeScriptEnumWriter : EnumWriter + public TypeScriptEnumWriter(Options options) + : base(options) + { } + + public override void Write(ICodeFragment fragment, IOutputCache output) { - public override void Write(ICodeFragment fragment, IOutputCache output) - { - EnumTemplate template = (EnumTemplate)fragment; - template.BasedOn = null; - base.Write(fragment, output); + EnumTemplate template = (EnumTemplate)fragment; + template.BasedOn = null; + base.Write(fragment, output); - output.BreakLine() - .Add($"export const {template.Name}Values = [").Add(template.Values.Select(x => x.Value), ", ").Add("]").CloseLine() - .Add($"export const {template.Name}Names = [").Add(template.Values.Select(x => Code.String(x.Name)), ", ").Add("]").CloseLine() - .Add($"export const {template.Name}ValueMapping: {{ [key: number]: string }} = {{ "); - bool isFirst = true; - foreach (EnumValueTemplate value in template.Values) + output.BreakLine() + .Add($"export const {template.Name}Values = [").Add(template.Values.Select(x => x.Value), ", ").Add("]").CloseLine() + .Add($"export const {template.Name}Names = [").Add(template.Values.Select(x => Code.String(x.Name)), ", ").Add("]").CloseLine() + .Add($"export const {template.Name}ValueMapping: {{ [key: number]: string }} = {{ "); + bool isFirst = true; + foreach (EnumValueTemplate value in template.Values) + { + if (isFirst) + { + isFirst = false; + } + else + { + output.Add(", "); + } + output.Add(value.Value).Add(": ").Add(Code.String(value.Name)); + } + output.Add(" }").CloseLine() + .Add($"export const {template.Name}NameMapping: {{ [key: string]: number }} = {{ "); + isFirst = true; + foreach (EnumValueTemplate value in template.Values) + { + if (isFirst) { - if (isFirst) - { - isFirst = false; - } - else - { - output.Add(", "); - } - output.Add(value.Value).Add(": ").Add(Code.String(value.Name)); + isFirst = false; } - output.Add(" }").CloseLine() - .Add($"export const {template.Name}NameMapping: {{ [key: string]: number }} = {{ "); - isFirst = true; - foreach (EnumValueTemplate value in template.Values) + else { - if (isFirst) - { - isFirst = false; - } - else - { - output.Add(", "); - } - output.Add(Code.String(value.Name)).Add(": ").Add(value.Value); + output.Add(", "); } - output.Add(" }").CloseLine(); + output.Add(Code.String(value.Name)).Add(": ").Add(value.Value); } + output.Add(" }").CloseLine(); } -} \ No newline at end of file +} diff --git a/TypeScript/Writers/TypeScriptFieldWriter.cs b/TypeScript/Writers/TypeScriptFieldWriter.cs index 59039bca..08b5aa30 100644 --- a/TypeScript/Writers/TypeScriptFieldWriter.cs +++ b/TypeScript/Writers/TypeScriptFieldWriter.cs @@ -3,23 +3,22 @@ using KY.Generator.Templates; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class TypeScriptFieldWriter : ITemplateWriter { - public class TypeScriptFieldWriter : ITemplateWriter + public virtual void Write(ICodeFragment fragment, IOutputCache output) { - public virtual void Write(ICodeFragment fragment, IOutputCache output) - { - FieldTemplate template = (FieldTemplate)fragment; - output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() - .If(template.IsStatic || template.IsConstant).Add("static ").EndIf() - .If(template.IsReadonly || template.IsConstant).Add("readonly ").EndIf() - .Add(template.Name) - .If(template.IsOptional).Add("?").EndIf() - .Add(": ") - .Add(template.Type) - .If(template.DefaultValue == null && template.Strict && template.Type.IsNullable).Add(" | undefined").EndIf() - .If(template.DefaultValue != null && !template.Class.IsInterface).Add(" = ").Add(template.DefaultValue).EndIf() - .CloseLine(); - } + FieldTemplate template = (FieldTemplate)fragment; + output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() + .If(template.IsStatic || template.IsConstant).Add("static ").EndIf() + .If(template.IsReadonly || template.IsConstant).Add("readonly ").EndIf() + .Add(template.Name) + .If(template.IsOptional).Add("?").EndIf() + .Add(": ") + .Add(template.Type) + .If(template.Strict && template.IsNullable).Add(" | undefined").EndIf() + .If(template.DefaultValue != null && !template.Class.IsInterface).Add(" = ").Add(template.DefaultValue!).EndIf() + .CloseLine(); } -} +} \ No newline at end of file diff --git a/TypeScript/Writers/TypeScriptFileWriter.cs b/TypeScript/Writers/TypeScriptFileWriter.cs new file mode 100644 index 00000000..7513e4d0 --- /dev/null +++ b/TypeScript/Writers/TypeScriptFileWriter.cs @@ -0,0 +1,35 @@ +using System.Collections.Generic; +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.Writers; + +namespace KY.Generator.TypeScript.Writers +{ + public class TypeScriptFileWriter : FileWriter + { + protected override void WriteHeader(FileTemplate fileTemplate, IOutputCache output, bool appendBlankLine = true) + { + base.WriteHeader(fileTemplate, output, false); + Dictionary linters = fileTemplate.Linters ?? new Dictionary { { "eslint", false }, { "tslint", false } }; + foreach (KeyValuePair linter in linters) + { + switch (linter.Key.ToLower()) + { + case "eslint": + output.Add("/* eslint-disable */"); + break; + case "tslint": + output.Add("// tslint:disable"); + break; + } + output.BreakLine(); + } + output.BreakLine(); + } + + protected override IEnumerable GetUsings(FileTemplate fileTemplate) + { + return fileTemplate.GetUsingsByTypeAndPath(); + } + } +} diff --git a/TypeScript/Writers/TypeScriptMethodWriter.cs b/TypeScript/Writers/TypeScriptMethodWriter.cs index 7cd2d7a1..9460316a 100644 --- a/TypeScript/Writers/TypeScriptMethodWriter.cs +++ b/TypeScript/Writers/TypeScriptMethodWriter.cs @@ -1,30 +1,95 @@ -using System.Linq; -using KY.Generator.Models; +using KY.Generator.Models; using KY.Generator.Output; using KY.Generator.Templates; +using KY.Generator.TypeScript.Templates; +using KY.Generator.TypeScript.Templates.Extensions; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class TypeScriptMethodWriter : Codeable, ITemplateWriter { - public class TypeScriptMethodWriter : ITemplateWriter + public virtual void Write(ICodeFragment fragment, IOutputCache output) + { + MethodTemplate template = (MethodTemplate)fragment; + this.WriteSignature(template, null, output); + if (template is TypeScriptMethodTemplate methodTemplate) + { + output.BreakLine(); + TypeScriptMethodOverloadTemplate combinedOverloadTemplate = new(); + this.Combine(combinedOverloadTemplate, methodTemplate); + foreach (TypeScriptMethodOverloadTemplate overload in methodTemplate.Overloads) + { + this.Combine(combinedOverloadTemplate, overload); + this.WriteSignature(template, overload, output); + output.BreakLine(); + } + this.WriteSignature(template, combinedOverloadTemplate, output); + } + output.StartBlock() + .Add(template.Code) + .EndBlock(); + } + + private void Combine(TypeScriptMethodOverloadTemplate target, TypeScriptMethodOverloadTemplate source) + { + target.ReturnType = Code.UnionType(target.ReturnType, source.ReturnType); + // TODO: Implement + // target.Generics ??= source.Generics; + for (int index = 0; index < source.Parameters.Count; index++) + { + ParameterTemplate sourceParameter = source.Parameters[index]; + if (target.Parameters.Count <= index) + { + target.AddParameter(sourceParameter.Type, sourceParameter.Name, sourceParameter.DefaultValue); + } + else + { + ParameterTemplate targetParameter = target.Parameters[index]; + targetParameter.Type = Code.UnionType(targetParameter.Type, sourceParameter.Type); + targetParameter.DefaultValue ??= sourceParameter.DefaultValue; + targetParameter.IsOptional = targetParameter.IsOptional || sourceParameter.IsOptional; + } + } + } + + private void Combine(TypeScriptMethodOverloadTemplate target, TypeScriptMethodTemplate source) { - public virtual void Write(ICodeFragment fragment, IOutputCache output) + target.ReturnType = Code.UnionType(target.ReturnType, source.Type); + // TODO: Implement + // target.Generics ??= source.Generics; + for (int index = 0; index < source.Parameters.Count; index++) { - MethodTemplate template = (MethodTemplate)fragment; - output.Add(template.Comment) - .Add(template.Attributes) - .If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() - .If(template.IsStatic).Add("static ").EndIf() - .If(template.IsOverride).Add("override ").EndIf() - .Add(template.Name) - .If(template.Generics != null && template.Generics.Count > 0).Add("<").Add(template.Generics, ", ").Add(">").EndIf() - .Add("(") - .Add(template.Parameters.OrderBy(x => x.DefaultValue == null ? 0 : 1), ", ") - .Add(")") - .If(template.Type != null).Add(": ").Add(template.Type).EndIf() - .StartBlock() - .Add(template.Code) - .EndBlock(); + ParameterTemplate sourceParameter = source.Parameters[index]; + if (target.Parameters.Count <= index) + { + target.AddParameter(sourceParameter.Type, sourceParameter.Name, sourceParameter.DefaultValue); + } + else + { + ParameterTemplate targetParameter = target.Parameters[index]; + targetParameter.Type = Code.UnionType(targetParameter.Type, sourceParameter.Type); + targetParameter.DefaultValue ??= sourceParameter.DefaultValue; + targetParameter.IsOptional = targetParameter.IsOptional || sourceParameter.IsOptional; + } } } + + private void WriteSignature(MethodTemplate template, TypeScriptMethodOverloadTemplate? overload, IOutputCache output) + { + List? generics = overload?.Generics ?? template.Generics; + List parameters = overload?.Parameters ?? template.Parameters; + TypeTemplate? returnType = overload?.ReturnType ?? template.Type; + output.Add(overload?.Comment ?? template.Comment) + .Add(template.Attributes) + .If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() + .If(template.IsStatic).Add("static ").EndIf() + .If(template.IsOverride).Add("override ").EndIf() + .Add(template.Name) + .If(generics != null && generics.Count > 0).Add("<").Add(generics, ", ").Add(">").EndIf() + .Add("(") + .Add(parameters.OrderBy(x => x.DefaultValue == null ? 0 : 1), ", ") + .Add(")") + .If(returnType != null).Add(": ").Add(returnType!).EndIf(); + } } diff --git a/TypeScript/Writers/TypeScriptNamespaceWriter.cs b/TypeScript/Writers/TypeScriptNamespaceWriter.cs new file mode 100644 index 00000000..7d04d768 --- /dev/null +++ b/TypeScript/Writers/TypeScriptNamespaceWriter.cs @@ -0,0 +1,13 @@ +using KY.Generator.Writers; + +namespace KY.Generator.TypeScript.Writers +{ + public class TypeScriptNamespaceWriter : NamespaceWriter + { + public TypeScriptNamespaceWriter() + { + this.NamespaceKeyword = "export namespace"; + } + + } +} diff --git a/TypeScript/Writers/TypeScriptPropertyWriter.cs b/TypeScript/Writers/TypeScriptPropertyWriter.cs index 0959df98..3f7e3549 100644 --- a/TypeScript/Writers/TypeScriptPropertyWriter.cs +++ b/TypeScript/Writers/TypeScriptPropertyWriter.cs @@ -4,44 +4,48 @@ using KY.Generator.Templates.Extensions; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class TypeScriptPropertyWriter : Codeable, ITemplateWriter { - public class TypeScriptPropertyWriter : Codeable, ITemplateWriter + public virtual void Write(ICodeFragment fragment, IOutputCache output) { - public virtual void Write(ICodeFragment fragment, IOutputCache output) + PropertyTemplate template = (PropertyTemplate)fragment; + FieldTemplate fieldTemplate = new(template.Class, template.Name, template.Type); + fieldTemplate.Strict = template.Strict; + if ((template.Getter == null && template.HasGetter) || (template.Setter == null && template.HasSetter)) { - PropertyTemplate template = (PropertyTemplate)fragment; - FieldTemplate fieldTemplate = new FieldTemplate(template.Class, template.Name, template.Type).FormatName(output.Language, true); - if (template.Getter == null && template.HasGetter || template.Setter == null && template.HasSetter) - { - if (fieldTemplate.Name == template.Name) - { - fieldTemplate.Name += "Field"; - } - fieldTemplate.DefaultValue = template.DefaultValue; - output.Add(fieldTemplate); - } - if (template.HasGetter || template.Getter != null) - { - output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() - .If(template.IsStatic).Add("static ").EndIf() - .Add($"get {template.Name}(): ") - .Add(template.Type) - .StartBlock() - .Add(template.Getter ?? Code.Return(Code.This().Field(fieldTemplate.Name))) - .EndBlock(); - } - if (template.HasSetter || template.Setter != null) + if (fieldTemplate.Name == template.Name) { - output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() - .If(template.IsStatic).Add("static ").EndIf() - .Add($"set {template.Name}(value: ") - .Add(template.Type) - .Add(")") - .StartBlock() - .Add(template.Setter ?? Code.This().Field(fieldTemplate.Name).Assign(Code.Local("value")).Close()) - .EndBlock(); + fieldTemplate.Name += "Field"; } + fieldTemplate.DefaultValue = template.DefaultValue; + output.Add(fieldTemplate); + } + if (template.HasGetter || template.Getter != null) + { + output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() + .If(template.IsStatic).Add("static ").EndIf() + .Add($"get {template.Name}(): ") + .Add(template.Type) + .If(template.Strict && template.IsNullable).Add(" | undefined").EndIf() + .StartBlock() + .Add(template.Getter ?? Code.Return(Code.This().Field(fieldTemplate.Name))) + .EndBlock() + .If(template.DefaultValue != null && !template.Class.IsInterface).Add(" = ").Add(template.DefaultValue!).EndIf(); + } + if (template.HasSetter || template.Setter != null) + { + output.If(template.Visibility != Visibility.None).Add(template.Visibility.ToString().ToLower()).Add(" ").EndIf() + .If(template.IsStatic).Add("static ").EndIf() + .Add($"set {template.Name}(value: ") + .Add(template.Type) + .If(template.Strict && template.IsNullable).Add(" | undefined").EndIf() + .Add(")") + .StartBlock() + .Add(template.Setter ?? Code.This().Field(fieldTemplate.Name).Assign(Code.Local("value")).Close()) + .EndBlock() + .If(template.DefaultValue != null && !template.Class.IsInterface).Add(" = ").Add(template.DefaultValue!).EndIf(); } } -} +} \ No newline at end of file diff --git a/TypeScript/Writers/TypeScriptUnionTypeWriter.cs b/TypeScript/Writers/TypeScriptUnionTypeWriter.cs new file mode 100644 index 00000000..c6999e08 --- /dev/null +++ b/TypeScript/Writers/TypeScriptUnionTypeWriter.cs @@ -0,0 +1,27 @@ +using KY.Generator.Output; +using KY.Generator.Templates; +using KY.Generator.TypeScript.Templates; +using KY.Generator.Writers; + +namespace KY.Generator.TypeScript.Writers; + +public class TypeScriptUnionTypeWriter : ITemplateWriter +{ + public void Write(ICodeFragment fragment, IOutputCache output) + { + TypeScriptUnionTypeTemplate template = (TypeScriptUnionTypeTemplate)fragment; + bool isFirst = true; + foreach (TypeTemplate typeTemplate in template.Types) + { + if (isFirst) + { + isFirst = false; + } + else + { + output.Add(" | "); + } + output.Add(typeTemplate); + } + } +} diff --git a/TypeScript/Writers/UsingWriter.cs b/TypeScript/Writers/UsingWriter.cs index 396eb089..27f372d2 100644 --- a/TypeScript/Writers/UsingWriter.cs +++ b/TypeScript/Writers/UsingWriter.cs @@ -1,21 +1,44 @@ using KY.Core; using KY.Generator.Output; using KY.Generator.Templates; +using KY.Generator.TypeScript.Templates; using KY.Generator.Writers; -namespace KY.Generator.TypeScript.Writers +namespace KY.Generator.TypeScript.Writers; + +public class UsingWriter : ITemplateWriter { - public class UsingWriter : ITemplateWriter + private readonly Options options; + + public UsingWriter(Options options) + { + this.options = options; + } + + public virtual void Write(ICodeFragment fragment, IOutputCache output) { - public virtual void Write(ICodeFragment fragment, IOutputCache output) + GeneratorOptions generatorOptions = this.options.Get(); + UsingTemplate template = (UsingTemplate)fragment; + if (template is UnknownExportTemplate unknownUsing) + { + output.Add(unknownUsing.Code).BreakLine(); + return; + } + if (template.Path == null || template.Type == null) + { + Logger.Error("Invalid TypeScript import/export (path or type is missing)"); + return; + } + string action = template is ExportTemplate ? "export" : "import"; + string typeName = template.Type; + if (!typeName.StartsWith("*")) { - UsingTemplate template = (UsingTemplate)fragment; - string typeName = template.Type; - if (!typeName.StartsWith("*")) - { - typeName = $"{{ {typeName} }}"; - } - output.Add($"import {typeName} from \"{template.Path.TrimEnd(".ts")}\"").CloseLine(); + typeName = $"{{ {typeName} }}"; } + output.Add($"{action} {typeName} from ") + .Add(generatorOptions.Formatting.Quote) + .Add(template.Path.TrimEnd(".ts")) + .Add(generatorOptions.Formatting.Quote) + .CloseLine(); } -} \ No newline at end of file +} diff --git a/Watchdog/Commands/WatchdogCommand.cs b/Watchdog/Commands/WatchdogCommand.cs index 6ca1d2d1..67b19170 100644 --- a/Watchdog/Commands/WatchdogCommand.cs +++ b/Watchdog/Commands/WatchdogCommand.cs @@ -1,99 +1,95 @@ -using System; -using System.Collections.Generic; -using System.Diagnostics; +using System.Diagnostics; using System.Reflection; using KY.Core; using KY.Core.DataAccess; using KY.Core.Dependency; using KY.Generator.Command; -using KY.Generator.Output; using KY.Generator.Watchdog.Helpers; using KY.Generator.Watchdog.Watchdogs; -namespace KY.Generator.Watchdog.Commands +namespace KY.Generator.Watchdog.Commands; + +public class WatchdogCommand : GeneratorCommand { - public class WatchdogCommand : GeneratorCommand - { - private readonly IDependencyResolver resolver; - public override string[] Names { get; } = { "watchdog" }; - public List Commands { get; } = new List(); + private readonly IDependencyResolver resolver; + public static string[] Names { get; } = [ToCommand(nameof(WatchdogCommand)), "watchdog"]; + public List Commands { get; } = new(); - public WatchdogCommand(IDependencyResolver resolver) - { - this.resolver = resolver; - } + public WatchdogCommand(IDependencyResolver resolver) + { + this.resolver = resolver; + } - public override IGeneratorCommandResult Run(IOutput output) + public override IGeneratorCommandResult Run() + { + Logger.Trace("Execute watchdog command..."); + if (this.Parameters.IsAsync) { - Logger.Trace("Execute watchdog command..."); - if (this.Parameters.IsAsync) + Logger.Trace("Start generation in separate process..."); + if (InstanceHelper.IsRunning()) { - Logger.Trace("Start generation in separate process..."); - if (InstanceHelper.IsRunning()) - { - Logger.Trace("Generation aborted. An other watchdog is already running."); - return this.Success(); - } - string arguments = string.Join(" ", this.Parameters); - ProcessStartInfo startInfo = new ProcessStartInfo(Assembly.GetEntryAssembly().Location, $"watchdog {arguments}"); - startInfo.WindowStyle = ProcessWindowStyle.Hidden; - startInfo.WorkingDirectory = FileSystem.Parent(startInfo.FileName); - Logger.Trace($"{startInfo.FileName} {startInfo.Arguments}"); - Process.Start(startInfo); + Logger.Trace("Generation aborted. An other watchdog is already running."); return this.Success(); } + string arguments = string.Join(" ", this.Parameters); + ProcessStartInfo startInfo = new(Assembly.GetEntryAssembly().Location, $"watchdog {arguments}"); + startInfo.WindowStyle = ProcessWindowStyle.Hidden; + startInfo.WorkingDirectory = FileSystem.Parent(startInfo.FileName); + Logger.Trace($"{startInfo.FileName} {startInfo.Arguments}"); + Process.Start(startInfo); + return this.Success(); + } - string url = this.Parameters.Url; - string launchSettings = this.Parameters.LaunchSettings; - TimeSpan timeout = this.Parameters.Timeout; - TimeSpan delay = this.Parameters.Delay; - TimeSpan sleep = this.Parameters.Sleep; - int tries = this.Parameters.Tries; + string url = this.Parameters.Url; + string launchSettings = this.Parameters.LaunchSettings; + TimeSpan timeout = this.Parameters.Timeout; + TimeSpan delay = this.Parameters.Delay; + TimeSpan sleep = this.Parameters.Sleep; + int tries = this.Parameters.Tries; - string command = this.Parameters.Command; - if (string.IsNullOrEmpty(command)) - { - Logger.Error("Command can not be empty"); - return this.Error(); - } - if (string.IsNullOrEmpty(url) && string.IsNullOrEmpty(launchSettings)) + string command = this.Parameters.Command; + if (string.IsNullOrEmpty(command)) + { + Logger.Error("Command can not be empty"); + return this.Error(); + } + if (string.IsNullOrEmpty(url) && string.IsNullOrEmpty(launchSettings)) + { + Logger.Error("No valid target found. Add at least a -url=... or a -launchSettings=... parameter"); + return this.Error(); + } + if (!string.IsNullOrEmpty(launchSettings)) + { + LaunchSettingsReader reader = new(); + url = reader.ReadApplicationUrl(launchSettings); + if (string.IsNullOrEmpty(url)) { - Logger.Error("No valid target found. Add at least a -url=... or a -launchSettings=... parameter"); + Logger.Error("No value for iisSettings/iisExpress/applicationUrl in launchSettings.json found"); return this.Error(); } - if (!string.IsNullOrEmpty(launchSettings)) - { - LaunchSettingsReader reader = new LaunchSettingsReader(); - url = reader.ReadApplicationUrl(launchSettings); - if (string.IsNullOrEmpty(url)) - { - Logger.Error("No value for iisSettings/iisExpress/applicationUrl in launchSettings.json found"); - return this.Error(); - } - url += "/api/v1/generator/available"; - } - HttpWatchdog watchdog = new HttpWatchdog(url, tries, delay, sleep, timeout); - bool success = watchdog.WaitAsync().Result; - if (success) - { - throw new NotImplementedException(); - //CommandConfiguration nextCommand = new CommandConfiguration(command); - //nextCommand.Parameters.AddRange(configuration.Parameters.Where(x => x.Name.StartsWith(command)).Select(x => this.MapParameter(x, command))); - //nextCommand.ReadFromParameters(nextCommand.Parameters, this.resolver.Get>()); - - //this.resolver.Get().Run(nextCommand, output); - } - return this.Success(); + url += "/api/v1/generator/available"; } + HttpWatchdog watchdog = new(url, tries, delay, sleep, timeout); + bool success = watchdog.WaitAsync().Result; + if (success) + { + throw new NotImplementedException(); + //CommandConfiguration nextCommand = new CommandConfiguration(command); + //nextCommand.Parameters.AddRange(configuration.Parameters.Where(x => x.Name.StartsWith(command)).Select(x => this.MapParameter(x, command))); + //nextCommand.ReadFromParameters(nextCommand.Parameters, this.resolver.Get>()); - //private ICommandParameter MapParameter(ICommandParameter parameter, string command) - //{ - // string name = parameter.Name.TrimStart($"{command}-"); - // if (parameter is CommandValueParameter valueParameter) - // { - // return new CommandValueParameter(name, valueParameter.Value); - // } - // return new CommandParameter(name); - //} + //this.resolver.Get().Run(nextCommand, output); + } + return this.Success(); } -} \ No newline at end of file + + //private ICommandParameter MapParameter(ICommandParameter parameter, string command) + //{ + // string name = parameter.Name.TrimStart($"{command}-"); + // if (parameter is CommandValueParameter valueParameter) + // { + // return new CommandValueParameter(name, valueParameter.Value); + // } + // return new CommandParameter(name); + //} +} diff --git a/Watchdog/Fluent/GeneratorFluentMainExtension.cs b/Watchdog/Fluent/GeneratorFluentMainExtension.cs index 3667ab62..91787b51 100644 --- a/Watchdog/Fluent/GeneratorFluentMainExtension.cs +++ b/Watchdog/Fluent/GeneratorFluentMainExtension.cs @@ -4,10 +4,10 @@ public static class GeneratorFluentMainExtension { public static IWatchdogWaitSyntax WaitFor(this GeneratorFluentMain main, string url) { - WatchdogWaitSyntax syntax = new WatchdogWaitSyntax(url, main.ResolverReference); + WatchdogWaitSyntax syntax = main.Resolver.Create(url); main.Syntaxes.Add(syntax); return syntax; } } -} \ No newline at end of file +} diff --git a/Watchdog/Fluent/WatchdogWaitSyntax.cs b/Watchdog/Fluent/WatchdogWaitSyntax.cs index 6c431524..3bfc9cd0 100644 --- a/Watchdog/Fluent/WatchdogWaitSyntax.cs +++ b/Watchdog/Fluent/WatchdogWaitSyntax.cs @@ -2,23 +2,24 @@ using System.Collections.Generic; using KY.Core.Dependency; using KY.Generator.Command; -using KY.Generator.Helpers; using KY.Generator.Syntax; using KY.Generator.Watchdog.Commands; namespace KY.Generator { - public class WatchdogWaitSyntax : IWatchdogWaitSyntax, IFluentSyntax + public class WatchdogWaitSyntax : IWatchdogWaitSyntax, IFluentInternalSyntax, IExecutableSyntax { private readonly WatchdogCommand command; - + public IDependencyResolver Resolver { get; } - public List Commands { get; } = new List(); - - public WatchdogWaitSyntax(string url, DependencyResolverReference resolverReference) + public List Commands { get; } = new(); + + public List Syntaxes { get; } = new(); + + public WatchdogWaitSyntax(string url, IDependencyResolver resolver) { - this.Resolver = resolverReference; - this.command = new WatchdogCommand(this.Resolver); + this.Resolver = resolver; + this.command = this.Resolver.Create(); this.Commands.Add(this.command); this.command.Parameters.Url = url; } @@ -49,16 +50,25 @@ public IWatchdogWaitSyntax Tries(int tries) public IReadFluentSyntax Read() { - FluentSyntax syntax = new FluentSyntax(this.Resolver); - syntax.Commands = this.command.Commands; + FluentSyntax syntax = this.Resolver.Create(); + syntax.Syntaxes.Add(this); return syntax; } public IWriteFluentSyntax Write() { - FluentSyntax syntax = new FluentSyntax(this.Resolver); - syntax.Commands = this.command.Commands; + FluentSyntax syntax = this.Resolver.Create(); + syntax.Syntaxes.Add(this); return syntax; } + + public IGeneratorCommandResult Run() + { + return new SuccessResult(); + } + + public void FollowUp() + { + } } -} \ No newline at end of file +} diff --git a/Watchdog/KY.Generator.Watchdog.csproj b/Watchdog/KY.Generator.Watchdog.csproj index 1c1d7bb0..4fa29631 100644 --- a/Watchdog/KY.Generator.Watchdog.csproj +++ b/Watchdog/KY.Generator.Watchdog.csproj @@ -1,36 +1,42 @@  - - netstandard2.0 - 7.6.0 - KY-Programming - KY-Programming - KY.Generator - Watchdog Module for KY-Generator -Download KY.Generator to use this module - 2021 - KY-Programming - GPL-3.0-or-later - https://generator.ky-programming.de - https://ky-programming.de/images/logos/128.png - https://github.com/KY-Programming/generator - KY-Generator KY Generator Watchdog - + + netstandard2.0 + enable + enable + 10.0.0-preview.2 + KY-Programming + KY-Programming + KY.Generator + Watchdog Module for KY-Generator + Download KY.Generator to use this module + + 2025 - KY-Programming + README.md + MIT + https://generator.ky-programming.de + assets\icon.png + https://github.com/KY-Programming/generator + KY-Generator KY.Generator Watchdog + latest + - - ..\bin\Debug - + + ..\bin\Debug + - - ..\bin\Release - + + ..\bin\Release + - - - + + + + - - - - + + + + diff --git a/Watchdog/WatchdogModule.cs b/Watchdog/WatchdogModule.cs index 5894c54d..4e4cc194 100644 --- a/Watchdog/WatchdogModule.cs +++ b/Watchdog/WatchdogModule.cs @@ -3,14 +3,13 @@ using KY.Generator.Command; using KY.Generator.Watchdog.Commands; -namespace KY.Generator.Watchdog +namespace KY.Generator.Watchdog; + +public class WatchdogModule : ModuleBase { - public class WatchdogModule : ModuleBase + public WatchdogModule(IDependencyResolver dependencyResolver) + : base(dependencyResolver) { - public WatchdogModule(IDependencyResolver dependencyResolver) - : base(dependencyResolver) - { - this.DependencyResolver.Bind().To(); - } + this.DependencyResolver.Get().Register(WatchdogCommand.Names); } -} \ No newline at end of file +} diff --git a/build.cmd b/build.cmd index ed8cefa2..2aadfe2f 100644 --- a/build.cmd +++ b/build.cmd @@ -2,10 +2,10 @@ cd Tests start build +cd .. -cd ..\Examples +cd Examples start build - cd .. nircmd cmdwait 100 win center ititle "KY-Generator Test Builder" diff --git a/icon.png b/icon.png new file mode 100644 index 00000000..e3c28206 Binary files /dev/null and b/icon.png differ