diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9d95cadc38..04defd78d7 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -32,19 +32,24 @@ jobs: name: windows-2022 runs-on: windows-2022 steps: + - name: 'Allow long file path' + run: git config --system core.longpaths true - uses: actions/checkout@v1 - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 2.1.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 3.1.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 5.0.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.* + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.* - name: Cache .nuke/temp, ~/.nuget/packages uses: actions/cache@v2 with: diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index e0629ce084..2749d79c85 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -30,19 +30,24 @@ jobs: name: windows-2022 runs-on: windows-2022 steps: + - name: 'Allow long file path' + run: git config --system core.longpaths true - uses: actions/checkout@v1 - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 2.1.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 3.1.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 5.0.* - - uses: actions/setup-dotnet@v1 + - uses: actions/setup-dotnet@v3 with: dotnet-version: 6.0.* + - uses: actions/setup-dotnet@v3 + with: + dotnet-version: 7.0.* - name: Cache .nuke/temp, ~/.nuget/packages uses: actions/cache@v2 with: diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 12b7d01de0..ccb54a74e0 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -15,6 +15,11 @@ variables: Projects: 'src/NSwag.sln' steps: +- task: CmdLine@2 + displayName: 'Allow long file path' + inputs: + script: 'git config --system core.longpaths true' +- checkout: self # Install required SDKs and tools - task: UseDotNet@2 displayName: 'Install .NET Core SDK' @@ -25,6 +30,15 @@ steps: performMultiLevelLookup: true useGlobalJson: true +- task: UseDotNet@2 + displayName: 'Install .NET Core SDK' + inputs: + packageType: 'sdk' + version: '7.0.x' + includePreviewVersions: true + performMultiLevelLookup: true + useGlobalJson: true + - task: CmdLine@2 displayName: 'Install DNT' inputs: @@ -93,4 +107,4 @@ steps: inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: 'drop' - publishLocation: 'Container' \ No newline at end of file + publishLocation: 'Container' diff --git a/build/Build.CI.GitHubActions.cs b/build/Build.CI.GitHubActions.cs index 2e4fad30a3..3805c4bb54 100644 --- a/build/Build.CI.GitHubActions.cs +++ b/build/Build.CI.GitHubActions.cs @@ -45,26 +45,40 @@ protected override GitHubActionsJob GetJobs(GitHubActionsImage image, IReadOnlyC var job = base.GetJobs(image, relevantTargets); var newSteps = new List(job.Steps); - foreach (var version in new[] { "6.0.*", "5.0.*", "3.1.*", "2.1.*" }) + foreach (var version in new[] { "7.0.*", "6.0.*", "5.0.*", "3.1.*", "2.1.*" }) { newSteps.Insert(1, new GitHubActionsSetupDotNetStep { Version = version }); } + + newSteps.Insert(0, new GitHubActionsConfigureLongPathsStep()); job.Steps = newSteps.ToArray(); return job; } } +class GitHubActionsConfigureLongPathsStep : GitHubActionsStep +{ + public override void Write(CustomFileWriter writer) + { + writer.WriteLine("- name: 'Allow long file path'"); + using (writer.Indent()) + { + writer.WriteLine("run: git config --system core.longpaths true"); + } + } +} + class GitHubActionsSetupDotNetStep : GitHubActionsStep { public string Version { get; init; } public override void Write(CustomFileWriter writer) { - writer.WriteLine("- uses: actions/setup-dotnet@v1"); + writer.WriteLine("- uses: actions/setup-dotnet@v3"); using (writer.Indent()) { diff --git a/build/Build.cs b/build/Build.cs index 9ec68a4b6f..b99152b57c 100644 --- a/build/Build.cs +++ b/build/Build.cs @@ -239,7 +239,9 @@ protected override void OnBuildInitialized() ("NSwag.Sample.NETCore31", "NetCore31"), ("NSwag.Sample.NET50", "Net50"), ("NSwag.Sample.NET60", "Net60"), - ("NSwag.Sample.NET60Minimal", "Net60") + ("NSwag.Sample.NET60Minimal", "Net60"), + ("NSwag.Sample.NET70", "Net70"), + ("NSwag.Sample.NET70Minimal", "Net70") }; foreach (var (projectName, runtime) in dotnetTargets) @@ -355,7 +357,7 @@ void PublishConsoleProject(Nuke.Common.ProjectModel.Project project, string[] ta PublishConsoleProject(consoleX86Project, new[] { "net461" }); PublishConsoleProject(consoleProject, new[] { "net461" }); - PublishConsoleProject(consoleCoreProject, new[] { "netcoreapp2.1", "netcoreapp3.1", "net5.0", "net6.0" }); + PublishConsoleProject(consoleCoreProject, new[] { "netcoreapp2.1", "netcoreapp3.1", "net5.0", "net6.0", "net7.0" }); void CopyConsoleBinaries(AbsolutePath target) { @@ -371,6 +373,7 @@ void CopyConsoleBinaries(AbsolutePath target) CopyDirectoryRecursively(consoleCoreDirectory / "netcoreapp3.1" / "publish", target / "NetCore31"); CopyDirectoryRecursively(consoleCoreDirectory / "net5.0" / "publish", target / "Net50"); CopyDirectoryRecursively(consoleCoreDirectory / "net6.0" / "publish", target / "Net60"); + CopyDirectoryRecursively(consoleCoreDirectory / "net7.0" / "publish", target / "Net70"); } Serilog.Log.Information("Copy published Console for NSwagStudio"); diff --git a/build/_build.csproj b/build/_build.csproj index de45e833a9..7116cf2a71 100644 --- a/build/_build.csproj +++ b/build/_build.csproj @@ -2,7 +2,7 @@ Exe - net6.0 + net7.0 CS0649;CS0169 .. diff --git a/global.json b/global.json index 08fc58c61f..4037c7755e 100644 --- a/global.json +++ b/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "6.0.100", + "version": "7.0.100", "rollForward": "latestMinor" } } \ No newline at end of file diff --git a/src/Directory.Build.props b/src/Directory.Build.props index bbf7e88b62..66f5be097f 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - 13.17.0 + 13.18.0 Rico Suter Copyright © Rico Suter, 2021 diff --git a/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.targets b/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.targets index f4c085820b..e95c616469 100644 --- a/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.targets +++ b/src/NSwag.ApiDescription.Client/NSwag.ApiDescription.Client.targets @@ -8,6 +8,8 @@ Condition="'$(TargetFramework)' == 'net5.0'">dotnet --roll-forward-on-no-candidate-fx 2 "$(NSwagDir_Net50)/dotnet-nswag.dll" <_NSwagCommand Condition="'$(TargetFramework)' == 'net6.0'">dotnet --roll-forward-on-no-candidate-fx 2 "$(NSwagDir_Net60)/dotnet-nswag.dll" + <_NSwagCommand + Condition="'$(TargetFramework)' == 'net7.0'">dotnet --roll-forward-on-no-candidate-fx 2 "$(NSwagDir_Net70)/dotnet-nswag.dll" diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj index 6914d671cc..e807a52221 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.csproj @@ -1,6 +1,6 @@  - net461;netstandard1.6;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + net461;netstandard1.6;netstandard2.0;netcoreapp3.1;net5.0;net6.0;net7.0 Swagger Documentation AspNetCore NetCore TypeScript CodeGen $(MSBuildProjectName).nuspec symbols.nupkg @@ -16,6 +16,7 @@ [3.1, 4.0) [5, 6.0) [6.0.0, 7.0) + [7.0.0, 8.0) 1.6.1 4.3.0 4.0.1 @@ -54,6 +55,10 @@ + + + + @@ -79,6 +84,7 @@ microsoftExtensionsFileProvidersEmbeddedPackageVersionCore31=$(MicrosoftExtensionsFileProvidersEmbeddedPackageVersionCore31); microsoftExtensionsFileProvidersEmbeddedPackageVersionNet5=$(MicrosoftExtensionsFileProvidersEmbeddedPackageVersionNet5); microsoftExtensionsFileProvidersEmbeddedPackageVersionNet6=$(MicrosoftExtensionsFileProvidersEmbeddedPackageVersionNet6); + microsoftExtensionsFileProvidersEmbeddedPackageVersionNet7=$(MicrosoftExtensionsFileProvidersEmbeddedPackageVersionNet7); netStandardLibraryPackageVersion=$(NETStandardLibraryPackageVersion); systemIOFileSystemPackageVersion=$(SystemIOFileSystemPackageVersion); systemXmlXPathXDocumentPackageVersion=$(SystemXmlXPathXDocumentPackageVersion); diff --git a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec index 563fb5af3c..349060e3ab 100644 --- a/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec +++ b/src/NSwag.AspNetCore/NSwag.AspNetCore.nuspec @@ -78,7 +78,16 @@ - + + + + + + + + + + @@ -97,5 +106,7 @@ + + diff --git a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj index a4d43edf58..462456ea36 100644 --- a/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj +++ b/src/NSwag.CodeGeneration/NSwag.CodeGeneration.csproj @@ -6,7 +6,7 @@ bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + diff --git a/src/NSwag.Commands/NSwag.Commands.csproj b/src/NSwag.Commands/NSwag.Commands.csproj index 9ed5377741..3961cc38d7 100644 --- a/src/NSwag.Commands/NSwag.Commands.csproj +++ b/src/NSwag.Commands/NSwag.Commands.csproj @@ -1,7 +1,7 @@  - net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + net461;netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml $(NoWarn),618,1591 @@ -40,6 +40,13 @@ + + + + + + + @@ -70,4 +77,4 @@ - \ No newline at end of file + diff --git a/src/NSwag.Commands/NSwagDocument.cs b/src/NSwag.Commands/NSwagDocument.cs index ae26af3159..898401894b 100644 --- a/src/NSwag.Commands/NSwagDocument.cs +++ b/src/NSwag.Commands/NSwagDocument.cs @@ -324,6 +324,10 @@ private string GetArgumentsPrefix() { return "\"" + System.IO.Path.Combine(RootBinaryDirectory, "Net60/dotnet-nswag.dll") + "\" "; } + else if (runtime == Runtime.Net70) + { + return "\"" + System.IO.Path.Combine(RootBinaryDirectory, "Net70/dotnet-nswag.dll") + "\" "; + } else #endif return ""; @@ -381,4 +385,4 @@ public override string ToString() } } } -} \ No newline at end of file +} diff --git a/src/NSwag.Commands/Runtime.cs b/src/NSwag.Commands/Runtime.cs index 78557e6714..d05b3ca628 100644 --- a/src/NSwag.Commands/Runtime.cs +++ b/src/NSwag.Commands/Runtime.cs @@ -32,7 +32,10 @@ public enum Runtime /// .NET 6 app. Net60, + /// .NET 7 app. + Net70, + /// Execute in the same process. Debug } -} \ No newline at end of file +} diff --git a/src/NSwag.Commands/RuntimeUtilities.cs b/src/NSwag.Commands/RuntimeUtilities.cs index d8dcee38ad..cb9958b386 100644 --- a/src/NSwag.Commands/RuntimeUtilities.cs +++ b/src/NSwag.Commands/RuntimeUtilities.cs @@ -29,6 +29,10 @@ public static Runtime CurrentRuntime { return Runtime.NetCore21; } + else if (framework.Version.Major >= 7) + { + return Runtime.Net70; + } else if (framework.Version.Major >= 6) { return Runtime.Net60; @@ -49,4 +53,4 @@ public static Runtime CurrentRuntime } } } -} \ No newline at end of file +} diff --git a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj index 6fa2ee93f9..2899db20f1 100644 --- a/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj +++ b/src/NSwag.ConsoleCore/NSwag.ConsoleCore.csproj @@ -1,6 +1,6 @@  - netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 Exe dotnet-nswag NSwag.ConsoleCore @@ -36,6 +36,12 @@ + + + + + + diff --git a/src/NSwag.Core/NSwag.Core.csproj b/src/NSwag.Core/NSwag.Core.csproj index f82c759423..5747f66bf8 100644 --- a/src/NSwag.Core/NSwag.Core.csproj +++ b/src/NSwag.Core/NSwag.Core.csproj @@ -7,7 +7,7 @@ bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml - + diff --git a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj index 58093d529e..68b38d0a86 100644 --- a/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests.Web/NSwag.Generation.AspNetCore.Tests.Web.csproj @@ -1,7 +1,7 @@  - net5.0;net6.0;netcoreapp2.1;netcoreapp3.1 + net5.0;net6.0;net7.0;netcoreapp2.1;netcoreapp3.1 true $(NoWarn),618,1591 @@ -30,4 +30,4 @@ - \ No newline at end of file + diff --git a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj index 3fe3c3ae8f..6f9e6b1267 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj +++ b/src/NSwag.Generation.AspNetCore.Tests/NSwag.Generation.AspNetCore.Tests.csproj @@ -1,6 +1,6 @@  - netcoreapp2.1;netcoreapp3.1;net5.0;net6.0 + netcoreapp2.1;netcoreapp3.1;net5.0;net6.0;net7.0 $(NoWarn),618,1591 @@ -32,10 +32,14 @@ + + + + - \ No newline at end of file + diff --git a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs index 89c0e245d4..2dd5c7bcc0 100644 --- a/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs +++ b/src/NSwag.Generation.AspNetCore.Tests/Parameters/BodyParametersTests.cs @@ -22,7 +22,11 @@ public async Task When_primitive_body_parameter_has_no_default_value_then_it_is_ Assert.True(operation.ActualParameters.First().IsRequired); } - [Fact] + [Fact( +#if !NET7_0_OR_GREATER + Skip = "Failing before .Net 6" +#endif + )] public async Task When_primitive_body_parameter_has_default_value_then_it_is_optional() { // Arrange @@ -34,6 +38,25 @@ public async Task When_primitive_body_parameter_has_default_value_then_it_is_opt // Assert var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredPrimitiveWithDefault").Operation; + Assert.False(operation.ActualParameters.First().IsRequired); + } + + [Fact( +#if NET7_0_OR_GREATER + Skip = "Wrong in .Net 7" +#endif + )] + public async Task When_primitive_body_parameter_has_default_value_then_it_is_required_before_net7() + { + // Arrange + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + + // Act + var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); + + // Assert + var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredPrimitiveWithDefault").Operation; + Assert.True(operation.ActualParameters.First().IsRequired); } @@ -52,7 +75,11 @@ public async Task When_complex_body_parameter_has_no_default_value_then_it_is_re Assert.True(operation.ActualParameters.First().IsRequired); } - [Fact] + [Fact( +#if !NET7_0_OR_GREATER + Skip = "Failing before .Net 6" +#endif + )] public async Task When_complex_body_parameter_has_default_value_then_it_is_optional() { // Arrange @@ -64,7 +91,26 @@ public async Task When_complex_body_parameter_has_default_value_then_it_is_optio // Assert var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredComplexWithDefault").Operation; + Assert.False(operation.ActualParameters.First().IsRequired); + } + + [Fact( +#if NET7_0_OR_GREATER + Skip = "Wrong in .Net 7" +#endif + )] + public async Task When_complex_body_parameter_has_default_value_then_it_is_required_before_net7() + { + // Arrange + var settings = new AspNetCoreOpenApiDocumentGeneratorSettings(); + + // Act + var document = await GenerateDocumentAsync(settings, typeof(BodyParametersController)); + + // Assert + var operation = document.Operations.First(o => o.Operation.OperationId == "BodyParameters_RequiredComplexWithDefault").Operation; + Assert.True(operation.ActualParameters.First().IsRequired); } } -} \ No newline at end of file +} diff --git a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj index e4be33f3d8..9b0b7c4e90 100644 --- a/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj +++ b/src/NSwag.Generation.AspNetCore/NSwag.Generation.AspNetCore.csproj @@ -1,6 +1,6 @@  - netstandard1.6;net461;netstandard2.0;netcoreapp3.1;net5.0;net6.0 + netstandard1.6;net461;netstandard2.0;netcoreapp3.1;net5.0;net6.0;net7.0 Swagger Documentation AspNetCore $(DefineConstants);ASPNETCORE bin\$(Configuration)\$(TargetFramework)\$(AssemblyName).xml @@ -30,8 +30,14 @@ - - + + + + + + + + diff --git a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj index 42fb75ef96..ecba6cd684 100644 --- a/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj +++ b/src/NSwag.Generation.WebApi/NSwag.Generation.WebApi.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/NSwag.Generation/NSwag.Generation.csproj b/src/NSwag.Generation/NSwag.Generation.csproj index c4e1e125fa..7a8080b0ff 100644 --- a/src/NSwag.Generation/NSwag.Generation.csproj +++ b/src/NSwag.Generation/NSwag.Generation.csproj @@ -7,7 +7,7 @@ - + diff --git a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj index 79ec9c9155..9b3d33fca5 100644 --- a/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj +++ b/src/NSwag.Integration.Console/NSwag.Integration.Console.csproj @@ -38,6 +38,6 @@ - + \ No newline at end of file diff --git a/src/NSwag.MSBuild/NSwag.MSBuild.nuspec b/src/NSwag.MSBuild/NSwag.MSBuild.nuspec index 37109c79bf..85441f8d12 100644 --- a/src/NSwag.MSBuild/NSwag.MSBuild.nuspec +++ b/src/NSwag.MSBuild/NSwag.MSBuild.nuspec @@ -31,5 +31,6 @@ + - \ No newline at end of file + diff --git a/src/NSwag.MSBuild/NSwag.MSBuild.props b/src/NSwag.MSBuild/NSwag.MSBuild.props index bb0a3ad06d..e60a59d7a3 100644 --- a/src/NSwag.MSBuild/NSwag.MSBuild.props +++ b/src/NSwag.MSBuild/NSwag.MSBuild.props @@ -7,11 +7,13 @@ dotnet "$(MSBuildThisFileDirectory)../tools/NetCore31/dotnet-nswag.dll" dotnet "$(MSBuildThisFileDirectory)../tools/Net50/dotnet-nswag.dll" dotnet "$(MSBuildThisFileDirectory)../tools/Net60/dotnet-nswag.dll" + dotnet "$(MSBuildThisFileDirectory)../tools/Net70/dotnet-nswag.dll" $(MSBuildThisFileDirectory)../tools/Win/ $(MSBuildThisFileDirectory)../tools/NetCore21/ $(MSBuildThisFileDirectory)../tools/NetCore31/ $(MSBuildThisFileDirectory)../tools/Net50/ $(MSBuildThisFileDirectory)../tools/Net60/ + $(MSBuildThisFileDirectory)../tools/Net70/ diff --git a/src/NSwag.Npm/bin/nswag.js b/src/NSwag.Npm/bin/nswag.js index 049c7fe28c..90d727b77e 100644 --- a/src/NSwag.Npm/bin/nswag.js +++ b/src/NSwag.Npm/bin/nswag.js @@ -1,7 +1,7 @@ #!/usr/bin/env node "use strict"; -var defaultCoreVersion = "Net60"; +var defaultCoreVersion = "Net70"; var supportedCoreVersions = [ { ver: '2.1', dir: "NetCore21", }, { ver: '2.2', dir: "NetCore22", }, @@ -9,6 +9,7 @@ var supportedCoreVersions = [ { ver: '3.1', dir: "NetCore31", }, { ver: '5.0', dir: "Net50", }, { ver: '6.0', dir: "Net60", }, + { ver: '7.0', dir: "Net70", }, ]; // Initialize @@ -23,6 +24,7 @@ args = args.replace("--core 2.1", "/runtime:NetCore21"); args = args.replace("--core 3.1", "/runtime:NetCore31"); args = args.replace("--core 5.0", "/runtime:Net50"); args = args.replace("--core 6.0", "/runtime:Net60"); +args = args.replace("--core 7.0", "/runtime:Net70"); args = args.replace("--core", "/runtime:" + defaultCoreVersion); // Search for full .NET installation diff --git a/src/NSwag.Sample.NET60/Properties/launchSettings.json b/src/NSwag.Sample.NET60/Properties/launchSettings.json index 50ee08064c..e08cb1201c 100644 --- a/src/NSwag.Sample.NET60/Properties/launchSettings.json +++ b/src/NSwag.Sample.NET60/Properties/launchSettings.json @@ -15,7 +15,7 @@ "ASPNETCORE_ENVIRONMENT": "Development" } }, - "NSwag.Sample.NET50": { + "NSwag.Sample.NET60": { "commandName": "Project", "launchBrowser": true, "environmentVariables": { @@ -24,4 +24,4 @@ "applicationUrl": "http://localhost:5000;https://localhost:5001" } } -} \ No newline at end of file +} diff --git a/src/NSwag.Sample.NET70/Controllers/ValuesController.cs b/src/NSwag.Sample.NET70/Controllers/ValuesController.cs new file mode 100644 index 0000000000..37b3244048 --- /dev/null +++ b/src/NSwag.Sample.NET70/Controllers/ValuesController.cs @@ -0,0 +1,66 @@ +using System; +using System.Collections.Generic; +using Microsoft.AspNetCore.Mvc; + +namespace NSwag.Sample.NET70.Controllers +{ + [Route("api/[controller]")] + [ApiController] + public class ValuesController : ControllerBase + { + public class Person + { + public string FirstName { get; set; } = ""; + + public string? MiddleName { get; set; } + + public string LastName { get; set; } = ""; + + public DateTime DayOfBirth { get; set; } + } + + public enum TestEnum + { + Foo, + Bar + } + + [HttpGet] + public ActionResult> Get() + { + return new Person[] { }; + } + + // GET api/values/5 + [HttpGet("{id}")] + public ActionResult Get(int id) + { + return TestEnum.Foo; + } + + // GET api/values/5 + [HttpGet("{id}/foo")] + public ActionResult GetFooBar(int id) + { + return "value"; + } + + // POST api/values + [HttpPost] + public void Post([FromBody] string value) + { + } + + // PUT api/values/5 + [HttpPut("{id}")] + public void Put(int id, [FromBody] string value) + { + } + + // DELETE api/values/5 + [HttpDelete("{id}")] + public void Delete(int id) + { + } + } +} diff --git a/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj b/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj new file mode 100644 index 0000000000..1123044def --- /dev/null +++ b/src/NSwag.Sample.NET70/NSwag.Sample.NET70.csproj @@ -0,0 +1,16 @@ + + + + net7.0 + enable + + + + + + + + + + + diff --git a/src/NSwag.Sample.NET70/Program.cs b/src/NSwag.Sample.NET70/Program.cs new file mode 100644 index 0000000000..ba59da74aa --- /dev/null +++ b/src/NSwag.Sample.NET70/Program.cs @@ -0,0 +1,21 @@ +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Hosting; +using NSwag.Sample.NET70; + +namespace NSwag.Sample.NET70 +{ + 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(); + }); + } +} diff --git a/src/NSwag.Sample.NET70/Properties/launchSettings.json b/src/NSwag.Sample.NET70/Properties/launchSettings.json new file mode 100644 index 0000000000..bfda022edd --- /dev/null +++ b/src/NSwag.Sample.NET70/Properties/launchSettings.json @@ -0,0 +1,27 @@ +{ + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:1284/", + "sslPort": 44390 + } + }, + "profiles": { + "IIS Express": { + "commandName": "IISExpress", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "NSwag.Sample.NET70": { + "commandName": "Project", + "launchBrowser": true, + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "http://localhost:5000;https://localhost:5001" + } + } +} diff --git a/src/NSwag.Sample.NET70/Startup.cs b/src/NSwag.Sample.NET70/Startup.cs new file mode 100644 index 0000000000..09c1d2c48e --- /dev/null +++ b/src/NSwag.Sample.NET70/Startup.cs @@ -0,0 +1,65 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Hosting; +using NJsonSchema.Generation; +using System.Text.Json.Serialization; + +namespace NSwag.Sample.NET70 +{ + public class Startup + { + public Startup(IConfiguration configuration) + { + Configuration = configuration; + } + + public IConfiguration Configuration { get; } + + public void ConfigureServices(IServiceCollection services) + { + services.AddMvc(); + + services + .AddControllers() + .AddJsonOptions(options => + { + options.JsonSerializerOptions.DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull; + options.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + + services.AddOpenApiDocument(document => + { + document.Description = "Hello world!"; + document.DefaultReferenceTypeNullHandling = ReferenceTypeNullHandling.NotNull; + }); + } + + public void Configure(IApplicationBuilder app, IWebHostEnvironment env) + { + if (env.IsDevelopment()) + { + app.UseDeveloperExceptionPage(); + } + + app.UseHttpsRedirection(); + app.UseRouting(); + app.UseAuthorization(); + app.UseEndpoints(endpoints => + { + endpoints.MapControllers(); + }); + + app.UseOpenApi(p => p.Path = "/swagger/{documentName}/swagger.yaml"); + app.UseSwaggerUi3(p => p.DocumentPath = "/swagger/{documentName}/swagger.yaml"); + //app.UseApimundo(); + app.UseApimundo(settings => + { + //settings.CompareTo = "a:a:27:25:15:latest"; + settings.DocumentPath = "/swagger/v1/swagger.yaml"; + settings.ApimundoUrl = "https://localhost:5001"; + }); + } + } +} diff --git a/src/NSwag.Sample.NET70/appsettings.Development.json b/src/NSwag.Sample.NET70/appsettings.Development.json new file mode 100644 index 0000000000..e203e9407e --- /dev/null +++ b/src/NSwag.Sample.NET70/appsettings.Development.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Debug", + "System": "Information", + "Microsoft": "Information" + } + } +} diff --git a/src/NSwag.Sample.NET70/appsettings.json b/src/NSwag.Sample.NET70/appsettings.json new file mode 100644 index 0000000000..7cb5ac8193 --- /dev/null +++ b/src/NSwag.Sample.NET70/appsettings.json @@ -0,0 +1,9 @@ +{ + "Logging": { + "LogLevel": { + "Default": "Warning", + "Microsoft.Hosting.Lifetime": "Information" + } + }, + "AllowedHosts": "*" +} diff --git a/src/NSwag.Sample.NET70/nswag.json b/src/NSwag.Sample.NET70/nswag.json new file mode 100644 index 0000000000..374a8ab13d --- /dev/null +++ b/src/NSwag.Sample.NET70/nswag.json @@ -0,0 +1,58 @@ +{ + "runtime": "Net70", + "defaultVariables": null, + "documentGenerator": { + "aspNetCoreToOpenApi": { + "project": "NSwag.Sample.NET70.csproj", + "msBuildProjectExtensionsPath": null, + "configuration": null, + "runtime": null, + "targetFramework": null, + "noBuild": false, + "verbose": true, + "workingDirectory": null, + "requireParametersWithoutDefault": false, + "apiGroupNames": null, + "defaultPropertyNameHandling": "Default", + "defaultReferenceTypeNullHandling": "Null", + "defaultDictionaryValueReferenceTypeNullHandling": "NotNull", + "defaultResponseReferenceTypeNullHandling": "NotNull", + "defaultEnumHandling": "Integer", + "flattenInheritanceHierarchy": false, + "generateKnownTypes": true, + "generateEnumMappingDescription": false, + "generateXmlObjects": false, + "generateAbstractProperties": false, + "generateAbstractSchemas": true, + "ignoreObsoleteProperties": false, + "allowReferencesWithProperties": false, + "excludedTypeNames": [], + "serviceHost": null, + "serviceBasePath": null, + "serviceSchemes": [], + "infoTitle": "My Title", + "infoDescription": null, + "infoVersion": "1.0.0", + "documentTemplate": null, + "documentProcessorTypes": [], + "operationProcessorTypes": [], + "typeNameGeneratorType": null, + "schemaNameGeneratorType": null, + "contractResolverType": null, + "serializerSettingsType": null, + "useDocumentProvider": true, + "documentName": "v1", + "aspNetCoreEnvironment": null, + "createWebHostBuilderMethod": null, + "startupType": null, + "allowNullableBodyParameters": true, + "output": "openapi.json", + "outputType": "Swagger2", + "assemblyPaths": [], + "assemblyConfig": null, + "referencePaths": [], + "useNuGetCache": false + } + }, + "codeGenerators": {} +} diff --git a/src/NSwag.Sample.NET70/openapi.json b/src/NSwag.Sample.NET70/openapi.json new file mode 100644 index 0000000000..ac84f3d2f4 --- /dev/null +++ b/src/NSwag.Sample.NET70/openapi.json @@ -0,0 +1,215 @@ +{ + "x-generator": "NSwag v13.15.5.0 (NJsonSchema v10.6.6.0 (Newtonsoft.Json v13.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "My Title", + "description": "Hello world!", + "version": "1.0.0" + }, + "paths": { + "/api/Values": { + "get": { + "tags": [ + "Values" + ], + "operationId": "Values_GetAll", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "$ref": "#/components/schemas/Person" + } + } + } + } + } + } + }, + "post": { + "tags": [ + "Values" + ], + "operationId": "Values_Post", + "requestBody": { + "x-name": "value", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "required": true, + "x-position": 1 + }, + "responses": { + "200": { + "description": "" + } + } + } + }, + "/api/Values/{id}": { + "get": { + "tags": [ + "Values" + ], + "operationId": "Values_Get", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/TestEnum" + } + } + } + } + } + }, + "put": { + "tags": [ + "Values" + ], + "operationId": "Values_Put", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "requestBody": { + "x-name": "value", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + }, + "required": true, + "x-position": 2 + }, + "responses": { + "200": { + "description": "" + } + } + }, + "delete": { + "tags": [ + "Values" + ], + "operationId": "Values_Delete", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "" + } + } + } + }, + "/api/Values/{id}/foo": { + "get": { + "tags": [ + "Values" + ], + "operationId": "Values_GetFooBar", + "parameters": [ + { + "name": "id", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + } + }, + "components": { + "schemas": { + "Person": { + "type": "object", + "additionalProperties": false, + "properties": { + "firstName": { + "type": "string" + }, + "middleName": { + "type": "string", + "nullable": true + }, + "lastName": { + "type": "string" + }, + "dayOfBirth": { + "type": "string", + "format": "date-time" + } + } + }, + "TestEnum": { + "type": "string", + "description": "", + "x-enumNames": [ + "Foo", + "Bar" + ], + "enum": [ + "Foo", + "Bar" + ] + } + } + } +} \ No newline at end of file diff --git a/src/NSwag.Sample.NET70Minimal/NSwag.Sample.NET70Minimal.csproj b/src/NSwag.Sample.NET70Minimal/NSwag.Sample.NET70Minimal.csproj new file mode 100644 index 0000000000..17bcb5b8fa --- /dev/null +++ b/src/NSwag.Sample.NET70Minimal/NSwag.Sample.NET70Minimal.csproj @@ -0,0 +1,8 @@ + + + net7.0 + + + + + diff --git a/src/NSwag.Sample.NET70Minimal/Program.cs b/src/NSwag.Sample.NET70Minimal/Program.cs new file mode 100644 index 0000000000..f14eec5b49 --- /dev/null +++ b/src/NSwag.Sample.NET70Minimal/Program.cs @@ -0,0 +1,51 @@ +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Mvc; +using Microsoft.Extensions.DependencyInjection; +using System; + +var builder = WebApplication.CreateBuilder(args); + +// Optional: Use controllers +builder.Services.AddControllers(); + +builder.Services.AddEndpointsApiExplorer(); +builder.Services.AddOpenApiDocument(settings => +{ + settings.Title = "Minimal API"; + settings.Version = "v1"; +}); + +var app = builder.Build(); +app.UseDeveloperExceptionPage(); + +app.UseOpenApi(); +app.UseSwaggerUi3(); + +app.MapGet("/", (Func)(() => "Hello World!")) + .WithTags("General"); + +app.MapGet("/sum/{a}/{b}", (Func)((a, b) => a + b)) + .WithName("CalculateSum") + .WithTags("Calculator"); + +// Optional: Use controllers +app.UseRouting(); +app.UseEndpoints(x => +{ + x.MapControllers(); +}); + +app.Run(); + +// Optional: Use controllers +[ApiController] +[Route("examples")] +public class ExampleController : ControllerBase +{ + [HttpGet] + public IActionResult Get() + { + return Ok("Get Method"); + } +} \ No newline at end of file diff --git a/src/NSwag.Sample.NET70Minimal/Properties/launchSettings.json b/src/NSwag.Sample.NET70Minimal/Properties/launchSettings.json new file mode 100644 index 0000000000..1822eca017 --- /dev/null +++ b/src/NSwag.Sample.NET70Minimal/Properties/launchSettings.json @@ -0,0 +1,13 @@ +{ + "profiles": { + "NSwag.Sample.NET70Minimal": { + "commandName": "Project", + "launchBrowser": true, + "launchUrl": "swagger/v1/swagger.json", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + }, + "applicationUrl": "https://localhost:5001;http://localhost:5000" + } + } +} diff --git a/src/NSwag.Sample.NET70Minimal/nswag.json b/src/NSwag.Sample.NET70Minimal/nswag.json new file mode 100644 index 0000000000..e12c0cfbf2 --- /dev/null +++ b/src/NSwag.Sample.NET70Minimal/nswag.json @@ -0,0 +1,58 @@ +{ + "runtime": "Net70", + "defaultVariables": null, + "documentGenerator": { + "aspNetCoreToOpenApi": { + "project": "NSwag.Sample.NET70Minimal.csproj", + "msBuildProjectExtensionsPath": null, + "configuration": null, + "runtime": null, + "targetFramework": null, + "noBuild": false, + "verbose": true, + "workingDirectory": null, + "requireParametersWithoutDefault": false, + "apiGroupNames": null, + "defaultPropertyNameHandling": "Default", + "defaultReferenceTypeNullHandling": "Null", + "defaultDictionaryValueReferenceTypeNullHandling": "NotNull", + "defaultResponseReferenceTypeNullHandling": "NotNull", + "defaultEnumHandling": "Integer", + "flattenInheritanceHierarchy": false, + "generateKnownTypes": true, + "generateEnumMappingDescription": false, + "generateXmlObjects": false, + "generateAbstractProperties": false, + "generateAbstractSchemas": true, + "ignoreObsoleteProperties": false, + "allowReferencesWithProperties": false, + "excludedTypeNames": [], + "serviceHost": null, + "serviceBasePath": null, + "serviceSchemes": [], + "infoTitle": "My Title", + "infoDescription": null, + "infoVersion": "1.0.0", + "documentTemplate": null, + "documentProcessorTypes": [], + "operationProcessorTypes": [], + "typeNameGeneratorType": null, + "schemaNameGeneratorType": null, + "contractResolverType": null, + "serializerSettingsType": null, + "useDocumentProvider": true, + "documentName": "v1", + "aspNetCoreEnvironment": null, + "createWebHostBuilderMethod": null, + "startupType": null, + "allowNullableBodyParameters": true, + "output": "openapi.json", + "outputType": "Swagger2", + "assemblyPaths": [], + "assemblyConfig": null, + "referencePaths": [], + "useNuGetCache": false + } + }, + "codeGenerators": {} +} diff --git a/src/NSwag.Sample.NET70Minimal/openapi.json b/src/NSwag.Sample.NET70Minimal/openapi.json new file mode 100644 index 0000000000..32d5d8ad08 --- /dev/null +++ b/src/NSwag.Sample.NET70Minimal/openapi.json @@ -0,0 +1,74 @@ +{ + "x-generator": "NSwag v13.15.5.0 (NJsonSchema v10.6.6.0 (Newtonsoft.Json v9.0.0.0))", + "openapi": "3.0.0", + "info": { + "title": "Minimal API", + "version": "v1" + }, + "paths": { + "/": { + "get": { + "tags": [ + "General" + ], + "operationId": "Get", + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "string" + } + } + } + } + } + } + }, + "/sum/{a}/{b}": { + "get": { + "tags": [ + "Calculator" + ], + "operationId": "CalculateSum", + "parameters": [ + { + "name": "a", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 1 + }, + { + "name": "b", + "in": "path", + "required": true, + "schema": { + "type": "integer", + "format": "int32" + }, + "x-position": 2 + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "integer", + "format": "int32" + } + } + } + } + } + } + } + }, + "components": {} +} \ No newline at end of file diff --git a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj index 7f5350f364..026a029808 100644 --- a/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj +++ b/src/NSwag.Sample.NetGlobalAsax/NSwag.Sample.NetGlobalAsax.csproj @@ -199,7 +199,7 @@ - + diff --git a/src/NSwag.sln b/src/NSwag.sln index 7c196ef946..a0a43ddb0f 100644 --- a/src/NSwag.sln +++ b/src/NSwag.sln @@ -172,6 +172,16 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60", "NSwag EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NSwag.Sample.NET60Minimal", "NSwag.Sample.NET60Minimal\NSwag.Sample.NET60Minimal.csproj", "{24693FBC-445E-4360-A1E8-B6F136C563FB}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NSwag.Sample.NET70", "NSwag.Sample.NET70\NSwag.Sample.NET70.csproj", "{4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "NSwag.Sample.NET70Minimal", "NSwag.Sample.NET70Minimal\NSwag.Sample.NET70Minimal.csproj", "{EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "workflows", "workflows", "{F6478768-C7C9-4879-A327-233785330F86}" + ProjectSection(SolutionItems) = preProject + ..\.github\workflows\build.yml = ..\.github\workflows\build.yml + ..\.github\workflows\pr.yml = ..\.github\workflows\pr.yml + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -1069,6 +1079,42 @@ Global {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x64.Build.0 = Release|Any CPU {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x86.ActiveCfg = Release|Any CPU {24693FBC-445E-4360-A1E8-B6F136C563FB}.ReleaseTypeScriptStrict|x86.Build.0 = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|x64.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|x64.Build.0 = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|x86.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Debug|x86.Build.0 = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|Any CPU.Build.0 = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|x64.ActiveCfg = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|x64.Build.0 = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|x86.ActiveCfg = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.Release|x86.Build.0 = Release|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|x64.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|x64.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|x86.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Debug|x86.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|Any CPU.Build.0 = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|x64.ActiveCfg = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|x64.Build.0 = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|x86.ActiveCfg = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.Release|x86.Build.0 = Release|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|Any CPU.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|Any CPU.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|x64.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|x64.Build.0 = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|x86.ActiveCfg = Debug|Any CPU + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E}.ReleaseTypeScriptStrict|x86.Build.0 = Debug|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -1129,6 +1175,9 @@ Global {AC3D8125-AE21-49FC-A217-D96C7B585FF9} = {6F5E4FDF-0A82-42D5-94AC-A9CD43CC931D} {DE82965A-6935-43E0-A9A1-F3F35B4487EB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} {24693FBC-445E-4360-A1E8-B6F136C563FB} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} + {4D70DC56-C31D-49EF-8CDC-AB1E4DF77ED9} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} + {EBFFF84D-A50D-4E0E-A0A5-A4483E78FC8E} = {D8CC0D1C-8DAC-49FE-AA78-C028DC124DD5} + {F6478768-C7C9-4879-A327-233785330F86} = {6F5E4FDF-0A82-42D5-94AC-A9CD43CC931D} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {98FCEEE2-A45C-41E7-B2ED-1B14755E9067}