Skip to content

Commit e8c2908

Browse files
Decouple ImageSharp dependency
1 parent c9c44f8 commit e8c2908

File tree

8 files changed

+92
-85
lines changed

8 files changed

+92
-85
lines changed

Umbraco.StorageProviders.sln

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution
2323
EndProject
2424
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.StorageProviders", "src\Umbraco.StorageProviders\Umbraco.StorageProviders.csproj", "{5EC38982-2C9A-4D8D-AAE2-743A690FCD71}"
2525
EndProject
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Umbraco.StorageProviders.AzureBlob.ImageSharp", "src\Umbraco.StorageProviders.AzureBlob.ImageSharp\Umbraco.StorageProviders.AzureBlob.ImageSharp.csproj", "{D88EAD61-5596-415D-B8B2-CBE83B35DC68}"
27+
EndProject
2628
Global
2729
GlobalSection(SolutionConfigurationPlatforms) = preSolution
2830
Debug|Any CPU = Debug|Any CPU
@@ -57,6 +59,18 @@ Global
5759
{5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x64.Build.0 = Release|Any CPU
5860
{5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x86.ActiveCfg = Release|Any CPU
5961
{5EC38982-2C9A-4D8D-AAE2-743A690FCD71}.Release|x86.Build.0 = Release|Any CPU
62+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
63+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|Any CPU.Build.0 = Debug|Any CPU
64+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|x64.ActiveCfg = Debug|Any CPU
65+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|x64.Build.0 = Debug|Any CPU
66+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|x86.ActiveCfg = Debug|Any CPU
67+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Debug|x86.Build.0 = Debug|Any CPU
68+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|Any CPU.ActiveCfg = Release|Any CPU
69+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|Any CPU.Build.0 = Release|Any CPU
70+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|x64.ActiveCfg = Release|Any CPU
71+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|x64.Build.0 = Release|Any CPU
72+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|x86.ActiveCfg = Release|Any CPU
73+
{D88EAD61-5596-415D-B8B2-CBE83B35DC68}.Release|x86.Build.0 = Release|Any CPU
6074
EndGlobalSection
6175
GlobalSection(SolutionProperties) = preSolution
6276
HideSolutionNode = FALSE

src/Umbraco.StorageProviders.AzureBlob/Imaging/AzureBlobFileSystemImageCache.cs renamed to src/Umbraco.StorageProviders.AzureBlob.ImageSharp/AzureBlobFileSystemImageCache.cs

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
using System;
2-
using System.IO;
3-
using System.Threading.Tasks;
41
using Azure.Storage.Blobs;
52
using Microsoft.Extensions.Options;
63
using SixLabors.ImageSharp.Web;
@@ -9,21 +6,21 @@
96
using SixLabors.ImageSharp.Web.Resolvers.Azure;
107
using Umbraco.StorageProviders.AzureBlob.IO;
118

12-
namespace Umbraco.StorageProviders.AzureBlob.Imaging
9+
namespace Umbraco.StorageProviders.AzureBlob.ImageSharp
1310
{
1411
/// <summary>
1512
/// Implements an Azure Blob Storage based cache storing files in a <c>cache</c> subfolder.
1613
/// </summary>
1714
public sealed class AzureBlobFileSystemImageCache : IImageCache
1815
{
19-
private const string _cachePath = "cache/";
16+
private const string CachePath = "cache/";
2017
private BlobContainerClient _container;
2118

2219
/// <summary>
2320
/// Initializes a new instance of the <see cref="AzureBlobFileSystemImageCache" /> class.
2421
/// </summary>
2522
/// <param name="options">The options.</param>
26-
/// <exception cref="System.ArgumentNullException"><paramref name="options" /> is <c>null</c>.</exception>
23+
/// <exception cref="ArgumentNullException"><paramref name="options" /> is <c>null</c>.</exception>
2724
public AzureBlobFileSystemImageCache(IOptionsMonitor<AzureBlobFileSystemOptions> options)
2825
: this(AzureBlobFileSystemOptions.MediaFileSystemName, options)
2926
{ }
@@ -33,8 +30,8 @@ public AzureBlobFileSystemImageCache(IOptionsMonitor<AzureBlobFileSystemOptions>
3330
/// </summary>
3431
/// <param name="name">The name.</param>
3532
/// <param name="options">The options.</param>
36-
/// <exception cref="System.ArgumentNullException"><paramref name="name" /> is <c>null</c>.</exception>
37-
/// <exception cref="System.ArgumentNullException"><paramref name="options" /> is <c>null</c>.</exception>
33+
/// <exception cref="ArgumentNullException"><paramref name="name" /> is <c>null</c>.</exception>
34+
/// <exception cref="ArgumentNullException"><paramref name="options" /> is <c>null</c>.</exception>
3835
public AzureBlobFileSystemImageCache(string name, IOptionsMonitor<AzureBlobFileSystemOptions> options)
3936
{
4037
ArgumentNullException.ThrowIfNull(name);
@@ -56,14 +53,14 @@ public AzureBlobFileSystemImageCache(string name, IOptionsMonitor<AzureBlobFileS
5653
/// Initializes a new instance of the <see cref="AzureBlobFileSystemImageCache" /> class.
5754
/// </summary>
5855
/// <param name="blobContainerClient">The blob container client.</param>
59-
/// <exception cref="System.ArgumentNullException"><paramref name="blobContainerClient" /> is <c>null</c>.</exception>
56+
/// <exception cref="ArgumentNullException"><paramref name="blobContainerClient" /> is <c>null</c>.</exception>
6057
public AzureBlobFileSystemImageCache(BlobContainerClient blobContainerClient)
6158
=> _container = blobContainerClient ?? throw new ArgumentNullException(nameof(blobContainerClient));
6259

6360
/// <inheritdoc />
6461
public async Task<IImageCacheResolver?> GetAsync(string key)
6562
{
66-
var blob = _container.GetBlobClient(_cachePath + key);
63+
var blob = _container.GetBlobClient(CachePath + key);
6764

6865
return !await blob.ExistsAsync().ConfigureAwait(false)
6966
? null
@@ -73,7 +70,7 @@ public AzureBlobFileSystemImageCache(BlobContainerClient blobContainerClient)
7370
/// <inheritdoc />
7471
public async Task SetAsync(string key, Stream stream, ImageCacheMetadata metadata)
7572
{
76-
var blob = _container.GetBlobClient(_cachePath + key);
73+
var blob = _container.GetBlobClient(CachePath + key);
7774

7875
await blob.UploadAsync(stream, metadata: metadata.ToDictionary()).ConfigureAwait(false);
7976
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
using Microsoft.Extensions.DependencyInjection;
2+
using Microsoft.Extensions.Options;
3+
using SixLabors.ImageSharp.Web.Caching;
4+
using Umbraco.Extensions;
5+
using Umbraco.StorageProviders.AzureBlob.ImageSharp;
6+
using Umbraco.StorageProviders.AzureBlob.IO;
7+
8+
namespace Umbraco.Cms.Core.DependencyInjection
9+
{
10+
/// <summary>
11+
/// Extension methods to help registering Azure Blob Storage image caches for ImageSharp.
12+
/// </summary>
13+
public static class AddAzureBlobImageSharpCacheExtensions
14+
{
15+
/// <summary>
16+
/// Registers an <see cref="IImageCache" /> configured using the specified <see cref="IAzureBlobFileSystem" />.
17+
/// </summary>
18+
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
19+
/// <param name="name">The name of the file system.</param>
20+
/// <returns>
21+
/// The <see cref="IUmbracoBuilder" />.
22+
/// </returns>
23+
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
24+
public static IUmbracoBuilder AddAzureBlobImageSharpCache(this IUmbracoBuilder builder, string name = AzureBlobFileSystemOptions.MediaFileSystemName)
25+
=> builder.AddInternal(name);
26+
27+
/// <summary>
28+
/// Registers an <see cref="IImageCache" /> configured using the specified <see cref="IAzureBlobFileSystem" />.
29+
/// </summary>
30+
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
31+
/// <param name="name">The name of the file system.</param>
32+
/// <returns>
33+
/// The <see cref="IUmbracoBuilder" />.
34+
/// </returns>
35+
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
36+
internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, string name = AzureBlobFileSystemOptions.MediaFileSystemName)
37+
{
38+
ArgumentNullException.ThrowIfNull(builder);
39+
40+
builder.Services.AddUnique<IImageCache>(provider => new AzureBlobFileSystemImageCache(name, provider.GetRequiredService<IOptionsMonitor<AzureBlobFileSystemOptions>>()));
41+
42+
return builder;
43+
}
44+
}
45+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<Project Sdk="Microsoft.NET.Sdk">
2+
<PropertyGroup>
3+
<Title>Umbraco Storage Providers - Azure Blob Storage - ImageSharp</Title>
4+
<Description>Adds ImageSharp support using the Azure Blob Storage provider for Umbraco CMS.</Description>
5+
<PackageTags>umbraco storage azure blob imagesharp</PackageTags>
6+
</PropertyGroup>
7+
<ItemGroup>
8+
<PackageReference Include="SixLabors.ImageSharp.Web.Providers.Azure" Version="2.0.1" />
9+
<PackageReference Include="Umbraco.Cms.Imaging.ImageSharp" Version="[11.0.0--rc1.preview.31.ged9a26b, 12)" />
10+
<ProjectReference Include="..\Umbraco.StorageProviders.AzureBlob\Umbraco.StorageProviders.AzureBlob.csproj" />
11+
</ItemGroup>
12+
</Project>

src/Umbraco.StorageProviders.AzureBlob.ImageSharp/packages.lock.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2385,7 +2385,6 @@
23852385
"type": "Project",
23862386
"dependencies": {
23872387
"Azure.Storage.Blobs": "[12.12.0, )",
2388-
"SixLabors.ImageSharp.Web.Providers.Azure": "[2.0.1, )",
23892388
"Umbraco.Cms.Web.Common": "[11.0.0--rc1.preview.31.ged9a26b, 12.0.0)",
23902389
"Umbraco.StorageProviders": "[1.0.0, )"
23912390
}

src/Umbraco.StorageProviders.AzureBlob/DependencyInjection/AzureBlobMediaFileSystemExtensions.cs

Lines changed: 7 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,7 @@
1-
using System;
21
using Microsoft.Extensions.DependencyInjection;
32
using Microsoft.Extensions.Options;
4-
using SixLabors.ImageSharp.Web.Caching;
53
using Umbraco.Cms.Core.Configuration.Models;
64
using Umbraco.Cms.Infrastructure.DependencyInjection;
7-
using Umbraco.Extensions;
8-
using Umbraco.StorageProviders.AzureBlob.Imaging;
95
using Umbraco.StorageProviders.AzureBlob.IO;
106

117
namespace Umbraco.Cms.Core.DependencyInjection
@@ -19,66 +15,49 @@ public static class AzureBlobMediaFileSystemExtensions
1915
/// Registers an <see cref="IAzureBlobFileSystem" /> and it's dependencies configured for media.
2016
/// </summary>
2117
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
22-
/// <param name="useAzureBlobImageCache">If set to <c>true</c> also configures Azure Blob Storage for the image cache.</param>
2318
/// <returns>
2419
/// The <see cref="IUmbracoBuilder" />.
2520
/// </returns>
2621
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
27-
public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, bool useAzureBlobImageCache = true)
28-
=> builder.AddInternal(useAzureBlobImageCache);
22+
public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder)
23+
=> builder.AddInternal();
2924

3025
/// <summary>
3126
/// Registers a <see cref="IAzureBlobFileSystem" /> and it's dependencies configured for media.
3227
/// </summary>
3328
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
3429
/// <param name="configure">An action used to configure the <see cref="AzureBlobFileSystemOptions" />.</param>
35-
/// <param name="useAzureBlobImageCache">If set to <c>true</c> also configures Azure Blob Storage for the image cache.</param>
3630
/// <returns>
3731
/// The <see cref="IUmbracoBuilder" />.
3832
/// </returns>
3933
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
40-
public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, Action<AzureBlobFileSystemOptions> configure, bool useAzureBlobImageCache = true)
41-
=> builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
42-
43-
/// <summary>
44-
/// Registers a <see cref="IAzureBlobFileSystem" /> and it's dependencies configured for media.
45-
/// </summary>
46-
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
47-
/// <param name="configure">An action used to configure the <see cref="AzureBlobFileSystemOptions" />.</param>
48-
/// <param name="useAzureBlobImageCache">If set to <c>true</c> also configures Azure Blob Storage for the image cache.</param>
49-
/// <returns>
50-
/// The <see cref="IUmbracoBuilder" />.
51-
/// </returns>
52-
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
53-
public static IUmbracoBuilder AddAzureBlobFileSystem(this IUmbracoBuilder builder, Action<AzureBlobFileSystemOptions, IServiceProvider> configure, bool useAzureBlobImageCache = true)
54-
=> builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
34+
public static IUmbracoBuilder AddAzureBlobMediaFileSystem(this IUmbracoBuilder builder, Action<AzureBlobFileSystemOptions> configure)
35+
=> builder.AddInternal(x => x.Configure(configure));
5536

5637
/// <summary>
5738
/// Registers a <see cref="IAzureBlobFileSystem" /> and it's dependencies configured for media.
5839
/// </summary>
5940
/// <typeparam name="TDep">A dependency used by the configure action.</typeparam>
6041
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
6142
/// <param name="configure">An action used to configure the <see cref="AzureBlobFileSystemOptions" />.</param>
62-
/// <param name="useAzureBlobImageCache">If set to <c>true</c> also configures Azure Blob Storage for the image cache.</param>
6343
/// <returns>
6444
/// The <see cref="IUmbracoBuilder" />.
6545
/// </returns>
6646
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
67-
public static IUmbracoBuilder AddAzureBlobFileSystem<TDep>(this IUmbracoBuilder builder, Action<AzureBlobFileSystemOptions, TDep> configure, bool useAzureBlobImageCache = true)
47+
public static IUmbracoBuilder AddAzureBlobFileSystem<TDep>(this IUmbracoBuilder builder, Action<AzureBlobFileSystemOptions, TDep> configure)
6848
where TDep : class
69-
=> builder.AddInternal(useAzureBlobImageCache, x => x.Configure(configure));
49+
=> builder.AddInternal(x => x.Configure(configure));
7050

7151
/// <summary>
7252
/// Registers a <see cref="IAzureBlobFileSystem" /> and it's dependencies configured for media.
7353
/// </summary>
7454
/// <param name="builder">The <see cref="IUmbracoBuilder" />.</param>
75-
/// <param name="useAzureBlobImageCache">If set to <c>true</c> also configures Azure Blob Storage for the image cache.</param>
7655
/// <param name="configure">An action used to configure the <see cref="AzureBlobFileSystemOptions" />.</param>
7756
/// <returns>
7857
/// The <see cref="IUmbracoBuilder" />.
7958
/// </returns>
8059
/// <exception cref="System.ArgumentNullException"><paramref name="builder" /> is <c>null</c>.</exception>
81-
internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, bool useAzureBlobImageCache, Action<OptionsBuilder<AzureBlobFileSystemOptions>>? configure = null)
60+
internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, Action<OptionsBuilder<AzureBlobFileSystemOptions>>? configure = null)
8261
{
8362
ArgumentNullException.ThrowIfNull(builder);
8463

@@ -88,12 +67,6 @@ internal static IUmbracoBuilder AddInternal(this IUmbracoBuilder builder, bool u
8867
configure?.Invoke(optionsBuilder);
8968
});
9069

91-
// ImageSharp image cache
92-
if (useAzureBlobImageCache)
93-
{
94-
builder.Services.AddUnique<IImageCache, AzureBlobFileSystemImageCache>();
95-
}
96-
9770
builder.SetMediaFileSystem(provider => provider.GetRequiredService<IAzureBlobFileSystemProvider>().GetFileSystem(AzureBlobFileSystemOptions.MediaFileSystemName));
9871

9972
return builder;

src/Umbraco.StorageProviders.AzureBlob/Umbraco.StorageProviders.AzureBlob.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
</PropertyGroup>
77
<ItemGroup>
88
<PackageReference Include="Umbraco.Cms.Web.Common" Version="[11.0.0--rc1.preview.31.ged9a26b, 12)" />
9-
<PackageReference Include="SixLabors.ImageSharp.Web.Providers.Azure" Version="2.0.1" />
109
<PackageReference Include="Azure.Storage.Blobs" Version="12.12.0" />
1110
<ProjectReference Include="..\Umbraco.StorageProviders\Umbraco.StorageProviders.csproj" />
1211
</ItemGroup>

src/Umbraco.StorageProviders.AzureBlob/packages.lock.json

Lines changed: 6 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -28,16 +28,6 @@
2828
"resolved": "3.5.113",
2929
"contentHash": "4fBSMkqhi410qlkjPm+Mxfk8iO3C7dmgdVS7ljsfVO21WEzZCHP1VCOqB6rlOPfPidR/oxX+/Do/I7meCAz+Jg=="
3030
},
31-
"SixLabors.ImageSharp.Web.Providers.Azure": {
32-
"type": "Direct",
33-
"requested": "[2.0.1, )",
34-
"resolved": "2.0.1",
35-
"contentHash": "0l5IMudWb/MX4Z6v3fcLatWMLaulGclGhThNyzh5XABSaFuo2dQPamWajc1YPElf9a4K+zitK0hBqkog4CZvnA==",
36-
"dependencies": {
37-
"Azure.Storage.Blobs": "12.10.0",
38-
"SixLabors.ImageSharp.Web": "2.0.1"
39-
}
40-
},
4131
"StyleCop.Analyzers": {
4232
"type": "Direct",
4333
"requested": "[1.2.0-beta.435, )",
@@ -748,11 +738,6 @@
748738
"resolved": "7.0.0-rc.2.22472.3",
749739
"contentHash": "XoBFPCoDP+WVF/UJ3s3OrJIsNkqbmMSu+voMXQwwUqTQW3vze7+HtEWWATaG2EPjJz+GdcpaNddVagNcVpvoKQ=="
750740
},
751-
"Microsoft.IO.RecyclableMemoryStream": {
752-
"type": "Transitive",
753-
"resolved": "2.2.0",
754-
"contentHash": "uyjY/cqomw1irT4L7lDeg4sJ36MsjHg3wKqpGrBAdzvZaxo85yMF+sAA9RIzTV92fDxuUzjqksMqA0+SNMkMgA=="
755-
},
756741
"Microsoft.NET.StringTools": {
757742
"type": "Transitive",
758743
"resolved": "1.0.0",
@@ -764,8 +749,8 @@
764749
},
765750
"Microsoft.NETCore.Platforms": {
766751
"type": "Transitive",
767-
"resolved": "5.0.0",
768-
"contentHash": "VyPlqzH2wavqquTcYpkIIAQ6WdenuKoFN0BdYBbCWsclXacSOHNQn66Gt4z5NBqEYW0FAPm5rlvki9ZiCij5xQ=="
752+
"resolved": "2.1.2",
753+
"contentHash": "mOJy3M0UN+LUG21dLGMxaWZEP6xYpQEpLuvuEQBaownaX4YuhH6NmNUlN9si+vNkAS6dwJ//N1O4DmLf2CikVg=="
769754
},
770755
"Microsoft.NETCore.Targets": {
771756
"type": "Transitive",
@@ -1141,24 +1126,6 @@
11411126
"Serilog": "2.8.0"
11421127
}
11431128
},
1144-
"SixLabors.ImageSharp": {
1145-
"type": "Transitive",
1146-
"resolved": "2.1.2",
1147-
"contentHash": "In0pC521LqJXJXZgFVHegvSzES10KkKRN31McxqA1+fKtKsNe+EShWavBFQnKRlXCdeAmfx/wDjLILbvCaq+8Q==",
1148-
"dependencies": {
1149-
"System.Runtime.CompilerServices.Unsafe": "5.0.0",
1150-
"System.Text.Encoding.CodePages": "5.0.0"
1151-
}
1152-
},
1153-
"SixLabors.ImageSharp.Web": {
1154-
"type": "Transitive",
1155-
"resolved": "2.0.1",
1156-
"contentHash": "g9MvpL04OmBmRzpozckI8KL/R9X8/EuxdEi6bkjCi3lMVYXQqjQs0AYcPC9i4TAr0+0QERR4YtbOfnoJ1bqSxQ==",
1157-
"dependencies": {
1158-
"Microsoft.IO.RecyclableMemoryStream": "2.2.0",
1159-
"SixLabors.ImageSharp": "2.1.2"
1160-
}
1161-
},
11621129
"Smidge": {
11631130
"type": "Transitive",
11641131
"resolved": "4.1.1",
@@ -2134,10 +2101,11 @@
21342101
},
21352102
"System.Text.Encoding.CodePages": {
21362103
"type": "Transitive",
2137-
"resolved": "5.0.0",
2138-
"contentHash": "NyscU59xX6Uo91qvhOs2Ccho3AR2TnZPomo1Z0K6YpyztBPM/A5VbkzOO19sy3A3i1TtEnTxA7bCe3Us+r5MWg==",
2104+
"resolved": "4.5.1",
2105+
"contentHash": "4J2JQXbftjPMppIHJ7IC+VXQ9XfEagN92vZZNoG12i+zReYlim5dMoXFC1Zzg7tsnKDM7JPo5bYfFK4Jheq44w==",
21392106
"dependencies": {
2140-
"Microsoft.NETCore.Platforms": "5.0.0"
2107+
"Microsoft.NETCore.Platforms": "2.1.2",
2108+
"System.Runtime.CompilerServices.Unsafe": "4.5.2"
21412109
}
21422110
},
21432111
"System.Text.Encoding.Extensions": {

0 commit comments

Comments
 (0)