From 83cdea5ccbebd8aa3af5840d3ce07e9b3c30d6e9 Mon Sep 17 00:00:00 2001 From: Howard van Rooijen Date: Fri, 6 Jun 2025 09:27:33 +0100 Subject: [PATCH 1/5] Update dependencies and configuration for Azure Functions - Modified `build.yml` to use GitHub SHA for concurrency. - Updated `Endjin.RecommendedPractices.GitHub` to version 2.1.18 in multiple projects. - Upgraded `Azure.Identity` to version 1.14.0 and adjusted version specifications for related packages. - Changed credential type in `AzureTokenCredentialSourceFromConfiguration.cs` for Visual Studio Code. - Updated `local.settings.template.json` to use `dotnet-isolated` for Azure Functions. - Reflected new package versions in `packages.lock.json`, ensuring compatibility. - Added new testing dependencies and removed outdated ones in `packages.lock.json`. --- .github/workflows/build.yml | 2 +- .../Corvus.Identity.Abstractions.csproj | 2 +- .../Corvus.Identity.Azure.csproj | 8 +- ...eTokenCredentialSourceFromConfiguration.cs | 2 +- ...us.Identity.Examples.AzureFunctions.csproj | 4 +- .../local.settings.template.json | 2 +- .../packages.lock.json | 91 ++--- ...us.Identity.Examples.UsingAzureCore.csproj | 2 +- ....Identity.Examples.UsingPlainTokens.csproj | 2 +- .../Corvus.Identity.Specs.csproj | 9 +- .../Corvus.Identity.Specs/packages.lock.json | 367 +++++++++--------- 11 files changed, 225 insertions(+), 266 deletions(-) diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1efbc9a..1fc110e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -22,7 +22,7 @@ on: type: boolean concurrency: - group: ${{ github.workflow }}-${{ github.ref }} + group: ${{ github.workflow }}-${{ github.sha }} cancel-in-progress: true permissions: diff --git a/Solutions/Corvus.Identity.Abstractions/Corvus.Identity.Abstractions.csproj b/Solutions/Corvus.Identity.Abstractions/Corvus.Identity.Abstractions.csproj index 24f93b7..9e72158 100644 --- a/Solutions/Corvus.Identity.Abstractions/Corvus.Identity.Abstractions.csproj +++ b/Solutions/Corvus.Identity.Abstractions/Corvus.Identity.Abstractions.csproj @@ -15,7 +15,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Solutions/Corvus.Identity.Azure/Corvus.Identity.Azure.csproj b/Solutions/Corvus.Identity.Azure/Corvus.Identity.Azure.csproj index 1a5a29d..23a7761 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus.Identity.Azure.csproj +++ b/Solutions/Corvus.Identity.Azure/Corvus.Identity.Azure.csproj @@ -16,14 +16,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - - + + diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs index 4fecc6c..a488ea1 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs @@ -66,7 +66,7 @@ public async ValueTask CredentialSourceForConfigura ClientIdentitySourceTypes.AzureIdentityDefaultAzureCredential => new DefaultAzureCredential(), ClientIdentitySourceTypes.AzureCli => new AzureCliCredential(), ClientIdentitySourceTypes.VisualStudio => new VisualStudioCredential(), - ClientIdentitySourceTypes.VisualStudioCode => new VisualStudioCodeCredential(), + ClientIdentitySourceTypes.VisualStudioCode => new AzureCliCredential(), // VisualStuCredential is obsolete _ => throw new ArgumentException( $"Unsupported IdentitySourceType: {identitySourceType}", diff --git a/Solutions/Corvus.Identity.Examples.AzureFunctions/Corvus.Identity.Examples.AzureFunctions.csproj b/Solutions/Corvus.Identity.Examples.AzureFunctions/Corvus.Identity.Examples.AzureFunctions.csproj index 6e4121d..28c9b90 100644 --- a/Solutions/Corvus.Identity.Examples.AzureFunctions/Corvus.Identity.Examples.AzureFunctions.csproj +++ b/Solutions/Corvus.Identity.Examples.AzureFunctions/Corvus.Identity.Examples.AzureFunctions.csproj @@ -5,9 +5,7 @@ net8.0 v4 - false - enable @@ -36,7 +34,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Solutions/Corvus.Identity.Examples.AzureFunctions/local.settings.template.json b/Solutions/Corvus.Identity.Examples.AzureFunctions/local.settings.template.json index 2740f2d..6c82f51 100644 --- a/Solutions/Corvus.Identity.Examples.AzureFunctions/local.settings.template.json +++ b/Solutions/Corvus.Identity.Examples.AzureFunctions/local.settings.template.json @@ -2,7 +2,7 @@ "IsEncrypted": false, "Values": { "AzureWebJobsStorage": "UseDevelopmentStorage=true", - "FUNCTIONS_WORKER_RUNTIME": "dotnet", + "FUNCTIONS_WORKER_RUNTIME": "dotnet-isolated", // To use a specific principle as the service identity, do this: // "AzureServicesAuthConnectionString": "RunAs=App;AppId=;TenantId=;AppKey=", diff --git a/Solutions/Corvus.Identity.Examples.AzureFunctions/packages.lock.json b/Solutions/Corvus.Identity.Examples.AzureFunctions/packages.lock.json index 18b1fe4..df62017 100644 --- a/Solutions/Corvus.Identity.Examples.AzureFunctions/packages.lock.json +++ b/Solutions/Corvus.Identity.Examples.AzureFunctions/packages.lock.json @@ -4,11 +4,11 @@ "net8.0": { "Endjin.RecommendedPractices.GitHub": { "type": "Direct", - "requested": "[2.1.14, )", - "resolved": "2.1.14", - "contentHash": "87FGP9G88n999p4Xzd0v+V1eigr9RpK08/Ihz7gSvabcss+9+u76IecDokCVHoS5MyR0c6YhVkncKXnKbwYE7g==", + "requested": "[2.1.18, )", + "resolved": "2.1.18", + "contentHash": "5zdIpj3qn+hQKvpkJO77wW74S4w8UKE0l8oDIm6jq70X7O0iNfgD+0FzEKXIYM17JtqnVSVaBd4ZyuDxHqVnLg==", "dependencies": { - "Endjin.RecommendedPractices": "2.1.14", + "Endjin.RecommendedPractices": "2.1.18", "Microsoft.SourceLink.GitHub": "1.1.1" } }, @@ -41,9 +41,9 @@ }, "Roslynator.Analyzers": { "type": "Direct", - "requested": "[4.12.9, )", - "resolved": "4.12.9", - "contentHash": "X6lDpN/D5wuinq37KIx+l3GSUe9No+8bCjGBTI5sEEtxapLztkHg6gzNVhMXpXw8P+/5gFYxTXJ5Pf8O4iNz/w==" + "requested": "[4.13.1, )", + "resolved": "4.13.1", + "contentHash": "KZpLy6ZlCebMk+d/3I5KU2R7AOb4LNJ6tPJqPtvFXmO8bEBHQvCIAvJOnY2tu4C9/aVOROTDYUFADxFqw1gh/g==" }, "StyleCop.Analyzers": { "type": "Direct", @@ -56,30 +56,23 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.44.1", - "contentHash": "YyznXLQZCregzHvioip07/BkzjuWNXogJEVz9T5W6TwjNr17ax41YGzYMptlo2G10oLCuVPoyva62y0SIRDixg==", + "resolved": "1.46.1", + "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "System.ClientModel": "1.1.0", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "6.0.0", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "System.ClientModel": "1.4.1", + "System.Memory.Data": "6.0.1" } }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.13.1", - "contentHash": "4eeK9XztjTmvA4WN+qAvlUCSxSv45+LqTMeC8XT2giGGZHKthTMU2IuXcHjAOf5VLH3wE3Bo6EwhIcJxVB8RmQ==", + "resolved": "1.14.0", + "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", "dependencies": { - "Azure.Core": "1.44.1", - "Microsoft.Identity.Client": "4.66.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.66.1", - "System.Memory": "4.5.5", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "Azure.Core": "1.46.1", + "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", + "System.Memory": "4.5.5" } }, "Azure.Security.KeyVault.Secrets": { @@ -95,8 +88,8 @@ }, "Endjin.RecommendedPractices": { "type": "Transitive", - "resolved": "2.1.14", - "contentHash": "6I3Gb6CHHzZ6+a6IwzFAw4ffpuSRW25ddMG9cdsfzDZ5FUB9wxlEtLOFWTmQu/IbysOGDFjb+LAAlk2GXTZESg==", + "resolved": "2.1.18", + "contentHash": "AAD5aVVKTdFYsMpdHft4Q4rPdLaBt/IG4K2ozmB0qkotXpIWBhNUDtguBZCkYvTt0o2UXS5fQDP3os86F03lpw==", "dependencies": { "Microsoft.Build.Tasks.Git": "1.1.1" } @@ -379,8 +372,8 @@ }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", @@ -593,8 +586,8 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } @@ -641,8 +634,8 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.66.1", - "contentHash": "mE+m3pZ7zSKocSubKXxwZcUrCzLflC86IdLxrVjS8tialy0b1L+aECBqRBC/ykcPlB4y7skg49TaTiA+O2UfDw==", + "resolved": "4.71.1", + "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", "dependencies": { "Microsoft.IdentityModel.Abstractions": "6.35.0", "System.Diagnostics.DiagnosticSource": "6.0.1" @@ -650,10 +643,10 @@ }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.66.1", - "contentHash": "osgt1J9Rve3LO7wXqpWoFx9UFjl0oeqoUMK/xEru7dvafQ28RgV1A17CoCGCCRSUbgDQ4Arg5FgGK2lQ3lXR4A==", + "resolved": "4.71.1", + "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", "dependencies": { - "Microsoft.Identity.Client": "4.66.1", + "Microsoft.Identity.Client": "4.71.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -910,11 +903,11 @@ }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "UocOlCkxLZrG2CKMAAImPcldJTxeesHnHGHwhJ0pNlZEvEXcWKuQvVOER2/NiOkJGRJk978SNdw3j6/7O9H1lg==", + "resolved": "1.4.1", + "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", "dependencies": { - "System.Memory.Data": "1.0.2", - "System.Text.Json": "6.0.9" + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "System.Memory.Data": "6.0.1" } }, "System.Collections": { @@ -1187,11 +1180,8 @@ }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==", - "dependencies": { - "System.Text.Json": "6.0.0" - } + "resolved": "6.0.1", + "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" }, "System.Net.Http": { "type": "Transitive", @@ -1250,11 +1240,6 @@ "System.Threading.Tasks": "4.3.0" } }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, "System.ObjectModel": { "type": "Transitive", "resolved": "4.3.0", @@ -1726,11 +1711,11 @@ "corvus.identity.azure": { "type": "Project", "dependencies": { - "Azure.Identity": "[1.13.1, )", + "Azure.Identity": "[1.14.0, )", "Azure.Security.KeyVault.Secrets": "[4.7.0, )", "Corvus.Identity.Abstractions": "[1.0.0, )", - "Microsoft.Extensions.Caching.Memory": "[8.0.1, )", - "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.2, )" + "Microsoft.Extensions.Caching.Memory": "[8.0.*, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.*, )" } }, "corvus.identity.examples.usingazurecore": { diff --git a/Solutions/Corvus.Identity.Examples.UsingAzureCore/Corvus.Identity.Examples.UsingAzureCore.csproj b/Solutions/Corvus.Identity.Examples.UsingAzureCore/Corvus.Identity.Examples.UsingAzureCore.csproj index 406f3d3..b9b914f 100644 --- a/Solutions/Corvus.Identity.Examples.UsingAzureCore/Corvus.Identity.Examples.UsingAzureCore.csproj +++ b/Solutions/Corvus.Identity.Examples.UsingAzureCore/Corvus.Identity.Examples.UsingAzureCore.csproj @@ -10,7 +10,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Solutions/Corvus.Identity.Examples.UsingPlainTokens/Corvus.Identity.Examples.UsingPlainTokens.csproj b/Solutions/Corvus.Identity.Examples.UsingPlainTokens/Corvus.Identity.Examples.UsingPlainTokens.csproj index 92ced97..337deb4 100644 --- a/Solutions/Corvus.Identity.Examples.UsingPlainTokens/Corvus.Identity.Examples.UsingPlainTokens.csproj +++ b/Solutions/Corvus.Identity.Examples.UsingPlainTokens/Corvus.Identity.Examples.UsingPlainTokens.csproj @@ -9,7 +9,7 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/Solutions/Corvus.Identity.Specs/Corvus.Identity.Specs.csproj b/Solutions/Corvus.Identity.Specs/Corvus.Identity.Specs.csproj index 46e0c03..4b24bbc 100644 --- a/Solutions/Corvus.Identity.Specs/Corvus.Identity.Specs.csproj +++ b/Solutions/Corvus.Identity.Specs/Corvus.Identity.Specs.csproj @@ -29,7 +29,7 @@ - - - + diff --git a/Solutions/Corvus.Identity.Specs/packages.lock.json b/Solutions/Corvus.Identity.Specs/packages.lock.json index 97a36ef..a745995 100644 --- a/Solutions/Corvus.Identity.Specs/packages.lock.json +++ b/Solutions/Corvus.Identity.Specs/packages.lock.json @@ -2,13 +2,28 @@ "version": 1, "dependencies": { "net8.0": { + "Corvus.Testing.ReqnRoll.NUnit": { + "type": "Direct", + "requested": "[4.0.5, )", + "resolved": "4.0.5", + "contentHash": "3Rf0LULXc/wr26SLZVbkHZxj4dgpm4VvjE8Ti5UrdIds7ya1ZZHkfKcAOczvkFuXsAfBHuNygr4Qrnf0eHJ++w==", + "dependencies": { + "Corvus.Testing.ReqnRoll": "4.0.5", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Microsoft.NET.Test.Sdk": "17.14.1", + "NUnit3TestAdapter": "5.0.0", + "Reqnroll.NUnit": "2.4.1", + "coverlet.msbuild": "6.0.4" + } + }, "Endjin.RecommendedPractices.GitHub": { "type": "Direct", - "requested": "[2.1.14, )", - "resolved": "2.1.14", - "contentHash": "87FGP9G88n999p4Xzd0v+V1eigr9RpK08/Ihz7gSvabcss+9+u76IecDokCVHoS5MyR0c6YhVkncKXnKbwYE7g==", + "requested": "[2.1.18, )", + "resolved": "2.1.18", + "contentHash": "5zdIpj3qn+hQKvpkJO77wW74S4w8UKE0l8oDIm6jq70X7O0iNfgD+0FzEKXIYM17JtqnVSVaBd4ZyuDxHqVnLg==", "dependencies": { - "Endjin.RecommendedPractices": "2.1.14", + "Endjin.RecommendedPractices": "2.1.18", "Microsoft.SourceLink.GitHub": "1.1.1" } }, @@ -42,16 +57,6 @@ "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } }, - "Microsoft.NET.Test.Sdk": { - "type": "Direct", - "requested": "[17.12.0, )", - "resolved": "17.12.0", - "contentHash": "kt/PKBZ91rFCWxVIJZSgVLk+YR+4KxTuHf799ho8WNiK5ZQpJNAEZCAWX86vcKrs+DiYjiibpYKdGZP6+/N17w==", - "dependencies": { - "Microsoft.CodeCoverage": "17.12.0", - "Microsoft.TestPlatform.TestHost": "17.12.0" - } - }, "Moq": { "type": "Direct", "requested": "[4.20.72, )", @@ -61,28 +66,11 @@ "Castle.Core": "5.1.1" } }, - "NUnit3TestAdapter": { - "type": "Direct", - "requested": "[4.6.0, )", - "resolved": "4.6.0", - "contentHash": "R7e1+a4vuV/YS+ItfL7f//rG+JBvVeVLX4mHzFEZo4W1qEKl8Zz27AqvQSAqo+BtIzUCo4aAJMYa56VXS4hudw==" - }, - "Reqnroll.NUnit": { - "type": "Direct", - "requested": "[2.2.1, )", - "resolved": "2.2.1", - "contentHash": "xNEj6ZNKyglOV0nk11082HJMVSSgTScpRGBEyC38o4CaRgg6SwHXf43i2wUfy423mFsHQ449+QRiw8UlHYTN2g==", - "dependencies": { - "NUnit": "3.13.1", - "Reqnroll": "[2.2.1]", - "Reqnroll.Tools.MsBuild.Generation": "[2.2.1]" - } - }, "Roslynator.Analyzers": { "type": "Direct", - "requested": "[4.12.9, )", - "resolved": "4.12.9", - "contentHash": "X6lDpN/D5wuinq37KIx+l3GSUe9No+8bCjGBTI5sEEtxapLztkHg6gzNVhMXpXw8P+/5gFYxTXJ5Pf8O4iNz/w==" + "requested": "[4.13.1, )", + "resolved": "4.13.1", + "contentHash": "KZpLy6ZlCebMk+d/3I5KU2R7AOb4LNJ6tPJqPtvFXmO8bEBHQvCIAvJOnY2tu4C9/aVOROTDYUFADxFqw1gh/g==" }, "StyleCop.Analyzers": { "type": "Direct", @@ -95,30 +83,23 @@ }, "Azure.Core": { "type": "Transitive", - "resolved": "1.44.1", - "contentHash": "YyznXLQZCregzHvioip07/BkzjuWNXogJEVz9T5W6TwjNr17ax41YGzYMptlo2G10oLCuVPoyva62y0SIRDixg==", + "resolved": "1.46.1", + "contentHash": "iE5DPOlGsN5kCkF4gN+vasN1RihO0Ypie92oQ5tohQYiokmnrrhLnee+3zcE8n7vB6ZAzhPTfUGAEXX/qHGkYA==", "dependencies": { - "Microsoft.Bcl.AsyncInterfaces": "6.0.0", - "System.ClientModel": "1.1.0", - "System.Diagnostics.DiagnosticSource": "6.0.1", - "System.Memory.Data": "6.0.0", - "System.Numerics.Vectors": "4.5.0", - "System.Text.Encodings.Web": "6.0.0", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "Microsoft.Bcl.AsyncInterfaces": "8.0.0", + "System.ClientModel": "1.4.1", + "System.Memory.Data": "6.0.1" } }, "Azure.Identity": { "type": "Transitive", - "resolved": "1.13.1", - "contentHash": "4eeK9XztjTmvA4WN+qAvlUCSxSv45+LqTMeC8XT2giGGZHKthTMU2IuXcHjAOf5VLH3wE3Bo6EwhIcJxVB8RmQ==", + "resolved": "1.14.0", + "contentHash": "xQ6mpNhifb8W/KG2BclhbJWAupvE3JF8lPEBF8t59Q5sc1yN0Ci+dvS0qXtc6m9auxwYpmc8rhOmK541dcGwmA==", "dependencies": { - "Azure.Core": "1.44.1", - "Microsoft.Identity.Client": "4.66.1", - "Microsoft.Identity.Client.Extensions.Msal": "4.66.1", - "System.Memory": "4.5.5", - "System.Text.Json": "6.0.10", - "System.Threading.Tasks.Extensions": "4.5.4" + "Azure.Core": "1.46.1", + "Microsoft.Identity.Client": "4.71.1", + "Microsoft.Identity.Client.Extensions.Msal": "4.71.1", + "System.Memory": "4.5.5" } }, "Azure.Security.KeyVault.Secrets": { @@ -140,6 +121,22 @@ "System.Diagnostics.EventLog": "6.0.0" } }, + "Corvus.Testing.ReqnRoll": { + "type": "Transitive", + "resolved": "4.0.5", + "contentHash": "Sc3TQyUNP/APr0f+OPEHWOpuIZuHADnli2eQ3zLXgSOTIlzBnWhvPJeQ90+mwYhQmodRulnXJ+LaARd5KyLBig==", + "dependencies": { + "Microsoft.Extensions.Configuration.Abstractions": "8.0.0", + "Microsoft.Extensions.DependencyInjection": "8.0.1", + "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2", + "Reqnroll": "2.4.1" + } + }, + "coverlet.msbuild": { + "type": "Transitive", + "resolved": "6.0.4", + "contentHash": "Qa7Hg+wrOMDKpXVn2dw4Wlun490bIWsFW0fdNJQFJLZnbU27MCP0HJ2mPgS+3EQBQUb0zKlkwiQzP+j38Hc3Iw==" + }, "Cucumber.CucumberExpressions": { "type": "Transitive", "resolved": "17.1.0", @@ -147,8 +144,8 @@ }, "Endjin.RecommendedPractices": { "type": "Transitive", - "resolved": "2.1.14", - "contentHash": "6I3Gb6CHHzZ6+a6IwzFAw4ffpuSRW25ddMG9cdsfzDZ5FUB9wxlEtLOFWTmQu/IbysOGDFjb+LAAlk2GXTZESg==", + "resolved": "2.1.18", + "contentHash": "AAD5aVVKTdFYsMpdHft4Q4rPdLaBt/IG4K2ozmB0qkotXpIWBhNUDtguBZCkYvTt0o2UXS5fQDP3os86F03lpw==", "dependencies": { "Microsoft.Build.Tasks.Git": "1.1.1" } @@ -158,10 +155,18 @@ "resolved": "30.0.0", "contentHash": "jZM9zm9eg62vRSAOtYvcmQh4w0oYqjP6myKxMaJAlQq9VCKm4wnTfHhS5QRnLhx/sH3R5jTaoQAKLs5hhjuq7g==" }, + "Microsoft.ApplicationInsights": { + "type": "Transitive", + "resolved": "2.22.0", + "contentHash": "3AOM9bZtku7RQwHyMEY3tQMrHIgjcfRDa6YQpd/QG2LDGvMydSlL9Di+8LLMt7J2RDdfJ7/2jdYv6yHcMJAnNw==", + "dependencies": { + "System.Diagnostics.DiagnosticSource": "5.0.0" + } + }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" + "resolved": "8.0.0", + "contentHash": "3WA9q9yVqJp222P3x1wYIGDAkpjAku0TMUaaQV22g6L67AI0LdOIrVS7Ht2vJfLHGSPVuqN94vIr15qn+HEkHw==" }, "Microsoft.Build.Tasks.Git": { "type": "Transitive", @@ -170,8 +175,8 @@ }, "Microsoft.CodeCoverage": { "type": "Transitive", - "resolved": "17.12.0", - "contentHash": "4svMznBd5JM21JIG2xZKGNanAHNXplxf/kQDFfLHXQ3OnpJkayRK/TjacFjA+EYmoyuNXHo/sOETEfcYtAzIrA==" + "resolved": "17.14.1", + "contentHash": "pmTrhfFIoplzFVbhVwUquT+77CbGH+h4/3mBpdmIlYtBi9nAB+kKI6dN3A/nV4DFi3wLLx/BlHIPK+MkbQ6Tpg==" }, "Microsoft.Extensions.Caching.Abstractions": { "type": "Transitive", @@ -257,8 +262,8 @@ }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", - "resolved": "8.0.2", - "contentHash": "nroMDjS7hNBPtkZqVBbSiQaQjWRDxITI8Y7XnDs97rqG3EbzVTNLZQf7bIeUJcaHOV8bca47s1Uxq94+2oGdxA==", + "resolved": "8.0.3", + "contentHash": "dL0QGToTxggRLMYY4ZYX5AMwBb+byQBd/5dMiZE07Nv73o6I5Are3C7eQTh7K2+A4ct0PVISSr7TZANbiNb2yQ==", "dependencies": { "Microsoft.Extensions.DependencyInjection.Abstractions": "8.0.2" } @@ -279,8 +284,8 @@ }, "Microsoft.Identity.Client": { "type": "Transitive", - "resolved": "4.66.1", - "contentHash": "mE+m3pZ7zSKocSubKXxwZcUrCzLflC86IdLxrVjS8tialy0b1L+aECBqRBC/ykcPlB4y7skg49TaTiA+O2UfDw==", + "resolved": "4.71.1", + "contentHash": "SgvSBcMRvmEEyV10pcvxNVUbwYoShmj/9pxXFVr3AFjE26IUzuwYLtLgt58xkEnT0xJBjfObaXxcol3BMtmEAg==", "dependencies": { "Microsoft.IdentityModel.Abstractions": "6.35.0", "System.Diagnostics.DiagnosticSource": "6.0.1" @@ -288,10 +293,10 @@ }, "Microsoft.Identity.Client.Extensions.Msal": { "type": "Transitive", - "resolved": "4.66.1", - "contentHash": "osgt1J9Rve3LO7wXqpWoFx9UFjl0oeqoUMK/xEru7dvafQ28RgV1A17CoCGCCRSUbgDQ4Arg5FgGK2lQ3lXR4A==", + "resolved": "4.71.1", + "contentHash": "PGOHaoQhKBKnXy1kfW+Gu9/rxStKsqR+UZKeVv4XAsATdzmfj9y9kkUOftIjVFvxP3oh2Sk7v65ylS0K/qYADA==", "dependencies": { - "Microsoft.Identity.Client": "4.66.1", + "Microsoft.Identity.Client": "4.71.1", "System.Security.Cryptography.ProtectedData": "4.5.0" } }, @@ -300,15 +305,19 @@ "resolved": "6.35.0", "contentHash": "xuR8E4Rd96M41CnUSCiOJ2DBh+z+zQSmyrYHdYhD6K4fXBcQGVnRCFQ0efROUYpP+p0zC1BLKr0JRpVuujTZSg==" }, - "Microsoft.NETCore.Platforms": { + "Microsoft.NET.Test.Sdk": { "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" + "resolved": "17.14.1", + "contentHash": "HJKqKOE+vshXra2aEHpi2TlxYX7Z9VFYkr+E5rwEvHC8eIXiyO+K9kNm8vmNom3e2rA56WqxU+/N9NJlLGXsJQ==", + "dependencies": { + "Microsoft.CodeCoverage": "17.14.1", + "Microsoft.TestPlatform.TestHost": "17.14.1" + } }, - "Microsoft.NETCore.Targets": { + "Microsoft.NETCore.Platforms": { "type": "Transitive", "resolved": "1.1.0", - "contentHash": "aOZA3BWfz9RXjpzt0sRJJMjAscAUm3Hoa4UWAfceV9UTYxgwZ1lZt5nO2myFf+/jetYQo4uTP7zS8sJY67BBxg==" + "contentHash": "kz0PEW2lhqygehI/d6XsPCQzD7ff7gUJaVGPVETX611eadGsA3A877GdSlU0LRVMCTH/+P3o2iDTak+S08V2+A==" }, "Microsoft.SourceLink.Common": { "type": "Transitive", @@ -324,21 +333,63 @@ "Microsoft.SourceLink.Common": "1.1.1" } }, + "Microsoft.Testing.Extensions.Telemetry": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "U9pGd5DQuX1PfkrdFI+xH34JGgQ2nes5QAwIITTk+MQfLvRITqsZjJeHTjpGWh33D/0q1l7aA8/LQHR7UuCgLQ==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.Testing.Platform": "1.5.3" + } + }, + "Microsoft.Testing.Extensions.TrxReport.Abstractions": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "h34zKNpGyni66VH738mRHeXSnf3klSShUdavUWNhSfWICUUi5aXeI0LBvoX/ad93N0+9xBDU3Fyi6WfxrwKQGw==", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + } + }, + "Microsoft.Testing.Extensions.VSTestBridge": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "cJD67YfDT98wEWyazKVD/yPVW6+H1usXeuselCnRes7JZBTIYWtrCchcOzOahnmajT79eDKqt9sta7DXwTDU4Q==", + "dependencies": { + "Microsoft.ApplicationInsights": "2.22.0", + "Microsoft.TestPlatform.ObjectModel": "17.12.0", + "Microsoft.Testing.Extensions.Telemetry": "1.5.3", + "Microsoft.Testing.Extensions.TrxReport.Abstractions": "1.5.3", + "Microsoft.Testing.Platform": "1.5.3" + } + }, + "Microsoft.Testing.Platform": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "WqJydnJ99dEKtquR9HwINz104ehWJKTXbQQrydGatlLRw14bmsx0pa8+E6KUXMYXZAimN0swWlDmcJGjjW4TIg==" + }, + "Microsoft.Testing.Platform.MSBuild": { + "type": "Transitive", + "resolved": "1.5.3", + "contentHash": "bOtpRMSPeT5YLQo+NNY8EtdNTphAUcmALjW4ABU7P0rb6yR2XAZau3TzNieLmR3lRuwudguWzzBhgcLRXwZh0A==", + "dependencies": { + "Microsoft.Testing.Platform": "1.5.3" + } + }, "Microsoft.TestPlatform.ObjectModel": { "type": "Transitive", - "resolved": "17.12.0", - "contentHash": "TDqkTKLfQuAaPcEb3pDDWnh7b3SyZF+/W9OZvWFp6eJCIiiYFdSB6taE2I6tWrFw5ywhzOb6sreoGJTI6m3rSQ==", + "resolved": "17.14.1", + "contentHash": "xTP1W6Mi6SWmuxd3a+jj9G9UoC850WGwZUps1Wah9r1ZxgXhdJfj1QqDLJkFjHDCvN42qDL2Ps5KjQYWUU0zcQ==", "dependencies": { - "System.Reflection.Metadata": "1.6.0" + "System.Reflection.Metadata": "8.0.0" } }, "Microsoft.TestPlatform.TestHost": { "type": "Transitive", - "resolved": "17.12.0", - "contentHash": "MiPEJQNyADfwZ4pJNpQex+t9/jOClBGMiCiVVFuELCMSX2nmNfvUor3uFVxNNCg30uxDP8JDYfPnMXQzsfzYyg==", + "resolved": "17.14.1", + "contentHash": "d78LPzGKkJwsJXAQwsbJJ7LE7D1wB+rAyhHHAaODF+RDSQ0NgMjDFkSA1Djw18VrxO76GlKAjRUhl+H8NL8Z+Q==", "dependencies": { - "Microsoft.TestPlatform.ObjectModel": "17.12.0", - "Newtonsoft.Json": "13.0.1" + "Microsoft.TestPlatform.ObjectModel": "17.14.1", + "Newtonsoft.Json": "13.0.3" } }, "NETStandard.Library": { @@ -351,8 +402,8 @@ }, "Newtonsoft.Json": { "type": "Transitive", - "resolved": "13.0.1", - "contentHash": "ppPFpBcvxdsfUonNcvITKqLl3bqxWbDCZIzDWHzjpdAHRFfZe0Dw9HmA0+za13IdyrgJwpkDTDA9fHaxOrt20A==" + "resolved": "13.0.3", + "contentHash": "HrC5BXdl00IP9zeV+0Z848QWPAoCr9P3bDEZguI+gkLcBKAOxix/tLEAAHC+UvDNPv4a2d18lOReHMOagPa+zQ==" }, "NUnit": { "type": "Transitive", @@ -362,30 +413,43 @@ "NETStandard.Library": "2.0.0" } }, + "NUnit3TestAdapter": { + "type": "Transitive", + "resolved": "5.0.0", + "contentHash": "sy4cLoUAdE6TDM4wNX5gmNCyhMev5wUz4cA6ZRf/aON9vf9t4xTVGLj/4huhDKcS4dFfmVVcgcP70yC7WC9kKg==", + "dependencies": { + "Microsoft.Testing.Extensions.VSTestBridge": "1.5.3", + "Microsoft.Testing.Platform.MSBuild": "1.5.3" + } + }, "Reqnroll": { "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "v83D63zou3tsmcPp1MV0CLgt0DzThJwVm941ZSOHHNMnY7TbxBMWDimMifORjbhlukA6CQSNy+u0/Tx3d3Kaxg==", + "resolved": "2.4.1", + "contentHash": "Ui229q21Kmkrv3L89THgsxGMXooJGK5OrFPLvYDXfE2nO/u4tqYsbmMRddyEE3fsR40IDP++HsRrDxlkR6reVw==", "dependencies": { "Cucumber.CucumberExpressions": "17.1.0", "Gherkin": "30.0.0", "Microsoft.Extensions.DependencyModel": "8.0.2", - "SpecFlow.Internal.Json": "1.0.8", - "System.Runtime.Loader": "4.3.0" + "System.Text.Json": "8.0.5" } }, - "Reqnroll.Tools.MsBuild.Generation": { + "Reqnroll.NUnit": { "type": "Transitive", - "resolved": "2.2.1", - "contentHash": "A8a5dcZXfk3UlRJur9XzkJsBNHr/hwrHEzCYdJe1VUV1/NsN4cPK+S+7DV0haR4sJ2PfDhqds3FOK4rVRNDXmQ==", + "resolved": "2.4.1", + "contentHash": "IbP1uVirMVpopeRwjvtz2b0PO9oQtHcDnAQigTpZY9lxSRYBycQSYQaZ6fbkkg/mG/azkPPGV3YIjNILQ8jWrw==", "dependencies": { - "Reqnroll": "[2.2.1]" + "NUnit": "3.13.1", + "Reqnroll": "[2.4.1]", + "Reqnroll.Tools.MsBuild.Generation": "[2.4.1]" } }, - "SpecFlow.Internal.Json": { + "Reqnroll.Tools.MsBuild.Generation": { "type": "Transitive", - "resolved": "1.0.8", - "contentHash": "lVCC/Rie7N5rFoc7YxPS0nneLfsWSTIMMlkndwxhaD8MxBp3Bsv1HeiVjVwXCjWaQeoqZcvIy52fF5Xit00ZLw==" + "resolved": "2.4.1", + "contentHash": "+Up0eUWnKRKPdRIttE52DYzwayUd4bGMyRytYeeCwtqwZA4tLhK2NspOZJ8axPcmATOM9QSTCUHUlyp9pgcfQg==", + "dependencies": { + "Reqnroll": "[2.4.1]" + } }, "StyleCop.Analyzers.Unstable": { "type": "Transitive", @@ -394,13 +458,18 @@ }, "System.ClientModel": { "type": "Transitive", - "resolved": "1.1.0", - "contentHash": "UocOlCkxLZrG2CKMAAImPcldJTxeesHnHGHwhJ0pNlZEvEXcWKuQvVOER2/NiOkJGRJk978SNdw3j6/7O9H1lg==", + "resolved": "1.4.1", + "contentHash": "MY7eFGKp+Hu7Ciub8wigQ0odGrkml4eTjUy8d5Bu2eGAVvm8Qskkq+YuXiiS5wMJGq7iSvqseV4skd5WxTUdDA==", "dependencies": { - "System.Memory.Data": "1.0.2", - "System.Text.Json": "6.0.9" + "Microsoft.Extensions.Logging.Abstractions": "8.0.3", + "System.Memory.Data": "6.0.1" } }, + "System.Collections.Immutable": { + "type": "Transitive", + "resolved": "8.0.0", + "contentHash": "AurL6Y5BA1WotzlEvVaIDpqzpIPvYnnldxru8oXJU2yFxFUy3+pNXjXd1ymO+RA0rq0+590Q8gaz2l3Sr7fmqg==" + }, "System.Diagnostics.DiagnosticSource": { "type": "Transitive", "resolved": "6.0.1", @@ -414,18 +483,6 @@ "resolved": "6.0.0", "contentHash": "lcyUiXTsETK2ALsZrX+nWuHSIQeazhqPphLfaRxzdGaG93+0kELqpgEHtwWOlQe7+jSFnKwaCAgL4kjeZCQJnw==" }, - "System.IO": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "3qjaHvxQPDpSOYICjUoTsmoq5u6QJAFRUITgeT/4gqkF1bajbSmb1kwSxEA8AHlofqgcKJcM8udgieRNhaJ5Cg==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0", - "System.Text.Encoding": "4.3.0", - "System.Threading.Tasks": "4.3.0" - } - }, "System.Memory": { "type": "Transitive", "resolved": "4.5.5", @@ -433,51 +490,15 @@ }, "System.Memory.Data": { "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "ntFHArH3I4Lpjf5m4DCXQHJuGwWPNVJPaAvM95Jy/u+2Yzt2ryiyIN04LAogkjP9DeRcEOiviAjQotfmPq/FrQ==", - "dependencies": { - "System.Text.Json": "6.0.0" - } - }, - "System.Numerics.Vectors": { - "type": "Transitive", - "resolved": "4.5.0", - "contentHash": "QQTlPTl06J/iiDbJCiepZ4H//BVraReU4O4EoRw1U02H5TLUIT7xn3GnDp9AXPSlJUDyFs4uWjWafNX6WrAojQ==" - }, - "System.Reflection": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "KMiAFoW7MfJGa9nDFNcfu+FpEdiHpWgTcS2HdMpDvt9saK3y/G4GwprPyzqjFH9NTaGPQeWNHU+iDlDILj96aQ==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.IO": "4.3.0", - "System.Reflection.Primitives": "4.3.0", - "System.Runtime": "4.3.0" - } + "resolved": "6.0.1", + "contentHash": "yliDgLh9S9Mcy5hBIdZmX6yphYIW3NH+3HN1kV1m7V1e0s7LNTw/tHNjJP4U9nSMEgl3w1TzYv/KA1Tg9NYy6w==" }, "System.Reflection.Metadata": { "type": "Transitive", - "resolved": "1.6.0", - "contentHash": "COC1aiAJjCoA5GBF+QKL2uLqEBew4JsCkQmoHKbN3TlOZKa2fKLz5CpiRQKDz0RsAOEGsVKqOD5bomsXq/4STQ==" - }, - "System.Reflection.Primitives": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "5RXItQz5As4xN2/YUDxdpsEkMhvw3e6aNveFXUn4Hl/udNTCNhnKp8lT9fnc3MhvGKh1baak5CovpuQUXHAlIA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Runtime": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "JufQi0vPQ0xGnAczR13AUFglDyVYt4Kqnz1AZaiKZ5+GICq0/1MH/mO/eAJHt/mHW1zjKBJd7kV26SrxddAhiw==", + "resolved": "8.0.0", + "contentHash": "ptvgrFh7PvWI8bcVqG5rsA/weWM09EnthFHR5SCnS6IN+P4mj6rE1lBDC4U8HL9/57htKAqy4KQ3bBj84cfYyQ==", "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0" + "System.Collections.Immutable": "8.0.0" } }, "System.Runtime.CompilerServices.Unsafe": { @@ -485,57 +506,15 @@ "resolved": "6.0.0", "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" }, - "System.Runtime.Loader": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "DHMaRn8D8YCK2GG2pw+UzNxn/OHVfaWx7OTLBD/hPegHZZgcZh3H6seWegrC4BYwsfuGrywIuT+MQs+rPqRLTQ==", - "dependencies": { - "System.IO": "4.3.0", - "System.Reflection": "4.3.0", - "System.Runtime": "4.3.0" - } - }, "System.Security.Cryptography.ProtectedData": { "type": "Transitive", "resolved": "4.5.0", "contentHash": "wLBKzFnDCxP12VL9ANydSYhk59fC4cvOr9ypYQLPnAj48NQIhqnjdD2yhP8yEKyBJEjERWS9DisKL7rX5eU25Q==" }, - "System.Text.Encoding": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "BiIg+KWaSDOITze6jGQynxg64naAPtqGHBwDrLaCtixsa5bKiR8dpPOHA7ge3C0JJQizJE+sfkz1wV+BAKAYZw==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } - }, - "System.Text.Encodings.Web": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "Vg8eB5Tawm1IFqj4TVK1czJX89rhFxJo9ELqc/Eiq0eXy13RK00eubyU6TJE6y+GQXjyV5gSfiewDUZjQgSE0w==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, "System.Text.Json": { "type": "Transitive", - "resolved": "6.0.10", - "contentHash": "NSB0kDipxn2ychp88NXWfFRFlmi1bst/xynOutbnpEfRCT9JZkZ7KOmF/I/hNKo2dILiMGnqblm+j1sggdLB9g==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0", - "System.Text.Encodings.Web": "6.0.0" - } - }, - "System.Threading.Tasks": { - "type": "Transitive", - "resolved": "4.3.0", - "contentHash": "LbSxKEdOUhVe8BezB/9uOGGppt+nZf6e1VFyw6v3DN6lqitm0OSn2uXMOdtP0M3W4iMcqcivm2J6UgqiwwnXiA==", - "dependencies": { - "Microsoft.NETCore.Platforms": "1.1.0", - "Microsoft.NETCore.Targets": "1.1.0", - "System.Runtime": "4.3.0" - } + "resolved": "8.0.5", + "contentHash": "0f1B50Ss7rqxXiaBJyzUu9bWFOO2/zSlifZ/UNMdiIpDYe4cY4LQQicP4nirK1OS31I43rn062UIJ1Q9bpmHpg==" }, "System.Threading.Tasks.Extensions": { "type": "Transitive", @@ -548,11 +527,11 @@ "corvus.identity.azure": { "type": "Project", "dependencies": { - "Azure.Identity": "[1.13.1, )", + "Azure.Identity": "[1.14.0, )", "Azure.Security.KeyVault.Secrets": "[4.7.0, )", "Corvus.Identity.Abstractions": "[1.0.0, )", - "Microsoft.Extensions.Caching.Memory": "[8.0.1, )", - "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.2, )" + "Microsoft.Extensions.Caching.Memory": "[8.0.*, )", + "Microsoft.Extensions.DependencyInjection.Abstractions": "[8.0.*, )" } } } From d159064a19ff084ef2bb8398bb89b3c3a5f56c90 Mon Sep 17 00:00:00 2001 From: Howard van Rooijen Date: Fri, 6 Jun 2025 09:36:18 +0100 Subject: [PATCH 2/5] Update TokenCredential type in test scenario Changed the expected type of the `TokenCredential` from 'VisualStudioCodeCredential' to 'AzureCliCredential' in the Visual Studio Code credential configuration test as VisualStudioCodeCredential is now obsolete. --- .../SimpleSourceTypes.feature | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature b/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature index 9ee7fff..c864bbc 100644 --- a/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature +++ b/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature @@ -71,4 +71,4 @@ Scenario: Visual Studio Code Credential } """ When a TokenCredential is fetched for this configuration - Then the TokenCredential should be of type 'VisualStudioCodeCredential' + Then the TokenCredential should be of type 'AzureCliCredential' From f0d2abd927d27134092f6d4ffe7b8be7a28a60c8 Mon Sep 17 00:00:00 2001 From: James Dawson Date: Fri, 6 Jun 2025 10:20:23 +0100 Subject: [PATCH 3/5] Migrate to ZeroFailed --- .github/workflows/build.yml | 9 ++- .gitignore | 3 +- .zf/config.ps1 | 66 ++++++++++++++++++ build.ps1 | 129 ++++++++++-------------------------- 4 files changed, 112 insertions(+), 95 deletions(-) create mode 100644 .zf/config.ps1 diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 1fc110e..da30953 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -15,6 +15,11 @@ on: required: false default: false type: boolean + forcePublicNugetDestination: + description: When true the NuGet Publish destination will always be set to nuget.org. (Normally, force publishing publishes to the private feed on GitHub.) + required: false + default: false + type: boolean skipCleanup: description: When true the pipeline clean-up stage will not be run. For example, the cache used between pipeline stages will be retained. required: false @@ -46,9 +51,10 @@ jobs: id: prepareEnvVarsAndSecrets with: environmentVariablesYaml: | - BUILDVAR_NuGetPublishSource: "${{ startsWith(github.ref, 'refs/tags/') && 'https://api.nuget.org/v3/index.json' || format('https://nuget.pkg.github.com/{0}/index.json', github.repository_owner) }}" + ZF_NUGET_PUBLISH_SOURCE: ${{ (startsWith(github.ref, 'refs/tags/') || github.event.inputs.forcePublicNugetDestination == 'true') && 'https://api.nuget.org/v3/index.json' || format('https://nuget.pkg.github.com/{0}/index.json', github.repository_owner) }} secretsYaml: | NUGET_API_KEY: "${{ startsWith(github.ref, 'refs/tags/') && secrets.NUGET_APIKEY || secrets.BUILD_PUBLISHER_PAT }}" + secretsEncryptionKey: ${{ secrets.SHARED_WORKFLOW_KEY }} build: needs: prepareConfig @@ -74,3 +80,4 @@ jobs: # testPhaseSecrets: ${{ needs.prepareConfig.outputs.RESOLVED_SECRETS }} # packagePhaseSecrets: ${{ needs.prepareConfig.outputs.RESOLVED_SECRETS }} publishPhaseSecrets: ${{ needs.prepareConfig.outputs.RESOLVED_SECRETS }} + secretsEncryptionKey: ${{ secrets.SHARED_WORKFLOW_KEY }} diff --git a/.gitignore b/.gitignore index c10493d..5dcf360 100644 --- a/.gitignore +++ b/.gitignore @@ -344,4 +344,5 @@ local.settings.json # Scripted build artifacts /_codeCoverage /_packages -*.sbom.* \ No newline at end of file +*.sbom.* +.zf/extensions/ \ No newline at end of file diff --git a/.zf/config.ps1 b/.zf/config.ps1 new file mode 100644 index 0000000..da45816 --- /dev/null +++ b/.zf/config.ps1 @@ -0,0 +1,66 @@ +<# +This example demonstrates a software build process using the 'ZeroFailed.Build.DotNet' extension +to provide the features needed when building a .NET solutions. +#> + +$zerofailedExtensions = @( + @{ + # References the extension from its GitHub repository. If not already installed, use latest version from 'main' will be downloaded. + Name = "ZeroFailed.Build.DotNet" + GitRepository = "https://github.com/zerofailed/ZeroFailed.Build.DotNet" + GitRef = "main" + } +) + +# Load the tasks and process +. ZeroFailed.tasks -ZfPath $here/.zf + + +# +# Build process configuration +# +# +# Build process control options +# +$SkipInit = $false +$SkipVersion = $false +$SkipBuild = $false +$CleanBuild = $Clean +$SkipTest = $false +$SkipTestReport = $false +$SkipAnalysis = $false +$SkipPackage = $false + + +$SolutionToBuild = (Resolve-Path (Join-Path $here ".\Solutions\Corvus.Identity.sln")).Path +$ProjectsToPublish = @() +$NuSpecFilesToPackage = @() +$NugetPublishSource = property ZF_NUGET_PUBLISH_SOURCE "$here/_local-nuget-feed" +$IncludeAssembliesInCodeCoverage = "Corvus.Identity*" + + +# Synopsis: Build, Test and Package +task . FullBuild + +# +# Build Process Extensibility Points - uncomment and implement as required +# + +# task RunFirst {} +# task PreInit {} +# task PostInit {} +# task PreVersion {} +# task PostVersion {} +# task PreBuild {} +# task PostBuild {} +# task PreTest {} +# task PostTest {} +# task PreTestReport {} +# task PostTestReport {} +# task PreAnalysis {} +# task PostAnalysis {} +# task PrePackage {} +# task PostPackage {} +# task PrePublish {} +# task PostPublish {} +# task RunLast {} diff --git a/build.ps1 b/build.ps1 index 9584c67..bb95a74 100644 --- a/build.ps1 +++ b/build.ps1 @@ -1,12 +1,13 @@ +#Requires -Version 7 <# .SYNOPSIS Runs a .NET flavoured build process. .DESCRIPTION - This script was scaffolded using a template from the Endjin.RecommendedPractices.Build PowerShell module. - It uses the InvokeBuild module to orchestrate an opinonated software build process for .NET solutions. + This script was scaffolded using a template from the ZeroFailed project. + It uses the InvokeBuild module to orchestrate an opinionated software build process for .NET solutions. .EXAMPLE PS C:\> ./build.ps1 - Downloads any missing module dependencies (Endjin.RecommendedPractices.Build & InvokeBuild) and executes + Downloads any missing module dependencies (ZeroFailed & InvokeBuild) and executes the build process. .PARAMETER Tasks Optionally override the default task executed as the entry-point of the build. @@ -26,14 +27,12 @@ The logging verbosity. .PARAMETER Clean When true, the .NET solution will be cleaned and all output/intermediate folders deleted. -.PARAMETER BuildModulePath - The path to import the Endjin.RecommendedPractices.Build module from. This is useful when - testing pre-release versions of the Endjin.RecommendedPractices.Build that are not yet - available in the PowerShell Gallery. -.PARAMETER BuildModuleVersion - The version of the Endjin.RecommendedPractices.Build module to import. This is useful when - testing pre-release versions of the Endjin.RecommendedPractices.Build that are not yet - available in the PowerShell Gallery. +.PARAMETER ZfModulePath + The path to import the ZeroFailed module from. This is useful when testing pre-release + versions of ZeroFailed that are not yet available in the PowerShell Gallery. +.PARAMETER ZfModuleVersion + The version of the ZeroFailed module to import. This is useful when testing pre-release + versions of ZeroFailed that are not yet available in the PowerShell Gallery. .PARAMETER InvokeBuildModuleVersion The version of the InvokeBuild module to be used. #> @@ -68,111 +67,55 @@ param ( [switch] $Clean, [Parameter()] - [string] $BuildModulePath, + [string] $ZfModulePath, [Parameter()] - [version] $BuildModuleVersion = "1.5.12", + [string] $ZfModuleVersion = "1.0.5", [Parameter()] - [version] $InvokeBuildModuleVersion = "5.11.3" + [version] $InvokeBuildModuleVersion = "5.12.1" ) - -$ErrorActionPreference = $ErrorActionPreference ? $ErrorActionPreference : 'Stop' -$InformationPreference = 'Continue' - +$ErrorActionPreference = 'Stop' $here = Split-Path -Parent $PSCommandPath #region InvokeBuild setup -if (!(Get-Module -ListAvailable InvokeBuild)) { - Install-Module InvokeBuild -RequiredVersion $InvokeBuildModuleVersion -Scope CurrentUser -Force -Repository PSGallery -} -Import-Module InvokeBuild # This handles calling the build engine when this file is run like a normal PowerShell script # (i.e. avoids the need to have another script to setup the InvokeBuild environment and issue the 'Invoke-Build' command ) if ($MyInvocation.ScriptName -notlike '*Invoke-Build.ps1') { + Install-PSResource InvokeBuild -Version $InvokeBuildModuleVersion -Scope CurrentUser -TrustRepository -Verbose:$false | Out-Null try { Invoke-Build $Tasks $MyInvocation.MyCommand.Path @PSBoundParameters } catch { - $_.ScriptStackTrace - throw + Write-Host -f Yellow "`n`n***`n*** Build Failure Summary - check previous logs for more details`n***" + Write-Host -f Yellow $_.Exception.Message + Write-Host -f Yellow $_.ScriptStackTrace + exit 1 } return } #endregion -#region Import shared tasks and initialise build framework -if (!($BuildModulePath)) { - if (!(Get-Module -ListAvailable Endjin.RecommendedPractices.Build | ? { $_.Version -eq $BuildModuleVersion })) { - Write-Information "Installing 'Endjin.RecommendedPractices.Build' module..." - Install-Module Endjin.RecommendedPractices.Build -RequiredVersion $BuildModuleVersion -Scope CurrentUser -Force -Repository PSGallery - } - $BuildModulePath = "Endjin.RecommendedPractices.Build" +#region Initialise build framework +$splat = @{ Force = $true; Verbose = $false} +Import-Module Microsoft.PowerShell.PSResourceGet +if (!($ZfModulePath)) { + Install-PSResource ZeroFailed -Version $ZfModuleVersion -Scope CurrentUser -TrustRepository | Out-Null + $ZfModulePath = "ZeroFailed" + $splat.Add("RequiredVersion", ($ZfModuleVersion -split '-')[0]) } else { - Write-Information "BuildModulePath: $BuildModulePath" + Write-Host "ZfModulePath: $ZfModulePath" } -Import-Module $BuildModulePath -RequiredVersion $BuildModuleVersion -Force - -# Load the build process & tasks -. Endjin.RecommendedPractices.Build.tasks +$splat.Add("Name", $ZfModulePath) +# Ensure only 1 version of the module is loaded +Get-Module ZeroFailed | Remove-Module +Import-Module @splat +$ver = "{0} {1}" -f (Get-Module ZeroFailed).Version, (Get-Module ZeroFailed).PrivateData.PsData.PreRelease +Write-Host "Using ZeroFailed module version: $ver" #endregion +$PSModuleAutoloadingPreference = 'none' -# -# Build process control options -# -$SkipInit = $false -$SkipVersion = $false -$SkipBuild = $false -$CleanBuild = $Clean -$SkipTest = $false -$SkipTestReport = $false -$SkipAnalysis = $false -$SkipPackage = $false -$SkipPublish = $false - - -# -# Build process configuration -# -$SolutionToBuild = (Resolve-Path (Join-Path $here ".\Solutions\Corvus.Identity.sln")).Path -$ProjectsToPublish = @( - # "Solutions/MySolution/MyWebSite/MyWebSite.csproj" -) -$NuSpecFilesToPackage = @( - # "Solutions/MySolution/MyProject/MyProject.nuspec" -) - -# -# Specify files to exclude from code coverage -# This option is for excluding generated code -# - Use file path or directory path with globbing (e.g dir1/*.cs) -# - Use single or multiple paths (separated by comma) (e.g. **/dir1/class1.cs,**/dir2/*.cs,**/dir3/**/*.cs) -# -$ExcludeFilesFromCodeCoverage = "" - -# Synopsis: Build, Test and Package -task . FullBuild - - -# build extensibility tasks -task RunFirst {} -task PreInit {} -task PostInit {} -task PreVersion {} -task PostVersion {} -task PreBuild {} -task PostBuild {} -task PreTest {} -task PostTest {} -task PreTestReport {} -task PostTestReport {} -task PreAnalysis {} -task PostAnalysis {} -task PrePackage {} -task PostPackage {} -task PrePublish {} -task PostPublish {} -task RunLast {} - +# Load the build configuration +. $here/.zf/config.ps1 From 1086f8dc48b1b75c5e9bde9dae291591c6319d02 Mon Sep 17 00:00:00 2001 From: Howard van Rooijen Date: Fri, 6 Jun 2025 11:08:53 +0100 Subject: [PATCH 4/5] Update comment for VisualStudioCode credential type Clarified the deprecation notice in the switch statement for `ClientIdentitySourceTypes.VisualStudioCode`, correcting the reference from `VisualStuCredential` to `VisualStudioCodeCredential`. --- .../Internal/AzureTokenCredentialSourceFromConfiguration.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs index a488ea1..802b120 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs @@ -66,7 +66,7 @@ public async ValueTask CredentialSourceForConfigura ClientIdentitySourceTypes.AzureIdentityDefaultAzureCredential => new DefaultAzureCredential(), ClientIdentitySourceTypes.AzureCli => new AzureCliCredential(), ClientIdentitySourceTypes.VisualStudio => new VisualStudioCredential(), - ClientIdentitySourceTypes.VisualStudioCode => new AzureCliCredential(), // VisualStuCredential is obsolete + ClientIdentitySourceTypes.VisualStudioCode => new AzureCliCredential(), // VisualStudioCodeCredential is obsolete _ => throw new ArgumentException( $"Unsupported IdentitySourceType: {identitySourceType}", From 026d658be20fd4e56113f6f6bfa5a20c4be46ad7 Mon Sep 17 00:00:00 2001 From: Howard van Rooijen Date: Fri, 6 Jun 2025 13:20:15 +0100 Subject: [PATCH 5/5] Deprecate VisualStudioCode and update related files This commit updates the `Corvus.Identity.ClientAuthentication.Azure` namespace by: - Changing the initialization of `indicatedSourceTypes` in `ClientIdentityConfigurationValidation.cs` to use an empty array. - Modifying the handling of `configuration.IdentitySourceType` to use array syntax in the `Except` method. - Marking the `VisualStudioCode` enum value as obsolete in `ClientIdentitySourceTypes.cs`, recommending the use of `AzureCli` instead. - Correcting a typo in `IAzureTokenCredentialSource.cs`. - Removing the mapping for `ClientIdentitySourceTypes.VisualStudioCode` in `AzureTokenCredentialSourceFromConfiguration.cs`. - Updating the `SimpleSourceTypes.feature` file to reflect the deprecation of `VisualStudioCode` and adding a scenario to ignore related tests. --- .../Azure/ClientIdentityConfigurationValidation.cs | 4 ++-- .../ClientAuthentication/Azure/ClientIdentitySourceTypes.cs | 1 + .../ClientAuthentication/Azure/IAzureTokenCredentialSource.cs | 2 +- .../Internal/AzureTokenCredentialSourceFromConfiguration.cs | 1 - .../SimpleSourceTypes.feature | 2 ++ 5 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentityConfigurationValidation.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentityConfigurationValidation.cs index 8a3ee67..d48dad1 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentityConfigurationValidation.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentityConfigurationValidation.cs @@ -30,7 +30,7 @@ internal static class ClientIdentityConfigurationValidation { type = default; - HashSet indicatedSourceTypes = new(); + HashSet indicatedSourceTypes = []; if (configuration is null) { @@ -74,7 +74,7 @@ internal static class ClientIdentityConfigurationValidation default: if (configuration.IdentitySourceType.HasValue) { - string sourceTypes = string.Join(", ", indicatedSourceTypes.Except(new[] { configuration.IdentitySourceType.Value })); + string sourceTypes = string.Join(", ", indicatedSourceTypes.Except([configuration.IdentitySourceType.Value])); return $"identity type is ambiguous because the IdentitySourceType is {SourceTypeString(configuration.IdentitySourceType)} but the properties set are for {sourceTypes}"; } diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentitySourceTypes.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentitySourceTypes.cs index 6446889..77c1153 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentitySourceTypes.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/ClientIdentitySourceTypes.cs @@ -68,6 +68,7 @@ public enum ClientIdentitySourceTypes /// Visual Studio Code's authentication should be used to determine the identity. (For local /// development purposes only.) /// + [Obsolete("Use AzureCli")] VisualStudioCode, /// diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/IAzureTokenCredentialSource.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/IAzureTokenCredentialSource.cs index bbdb772..787212d 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/IAzureTokenCredentialSource.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/IAzureTokenCredentialSource.cs @@ -62,7 +62,7 @@ public interface IAzureTokenCredentialSource /// This method enables the application to obtain updated credentials. It also enables the /// implementation to know that the credentials /// in question are no longer valid. Implementations that cache credentials can choose to - /// stop handing out the now-failed cached credentials to any futher calls to + /// stop handing out the now-failed cached credentials to any further calls to /// , making those wait until refreshed credentials have /// become available. /// diff --git a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs index 802b120..db43a3c 100644 --- a/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs +++ b/Solutions/Corvus.Identity.Azure/Corvus/Identity/ClientAuthentication/Azure/Internal/AzureTokenCredentialSourceFromConfiguration.cs @@ -66,7 +66,6 @@ public async ValueTask CredentialSourceForConfigura ClientIdentitySourceTypes.AzureIdentityDefaultAzureCredential => new DefaultAzureCredential(), ClientIdentitySourceTypes.AzureCli => new AzureCliCredential(), ClientIdentitySourceTypes.VisualStudio => new VisualStudioCredential(), - ClientIdentitySourceTypes.VisualStudioCode => new AzureCliCredential(), // VisualStudioCodeCredential is obsolete _ => throw new ArgumentException( $"Unsupported IdentitySourceType: {identitySourceType}", diff --git a/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature b/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature index c864bbc..b2465b2 100644 --- a/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature +++ b/Solutions/Corvus.Identity.Specs/Corvus/Identity/Azure/TokenCredentialSourceFromDynamicConfiguration/SimpleSourceTypes.feature @@ -63,6 +63,8 @@ Scenario: Visual Studio Credential When a TokenCredential is fetched for this configuration Then the TokenCredential should be of type 'VisualStudioCredential' +# VisualStudioCode is now obsolete. +@ignore Scenario: Visual Studio Code Credential Given configuration of """