From 11c3602048d7a04c979fbdb79bab8800141c6c06 Mon Sep 17 00:00:00 2001 From: Oleksii Holub <1935960+Tyrrrz@users.noreply.github.com> Date: Thu, 30 May 2024 18:36:11 +0300 Subject: [PATCH] Add AOT and trim analyzers (#130) --- .../IdentityBuilderExtensions.cs | 20 +++++++++++++++++++ .../Passwordless.AspNetCore.csproj | 3 ++- ...rdlessApiEndpointRouteBuilderExtensions.cs | 17 ++++++++++++---- src/Passwordless/Passwordless.csproj | 2 ++ .../ServiceCollectionExtensions.cs | 14 ++++++++++++- 5 files changed, 50 insertions(+), 6 deletions(-) diff --git a/src/Passwordless.AspNetCore/IdentityBuilderExtensions.cs b/src/Passwordless.AspNetCore/IdentityBuilderExtensions.cs index 6798974..3c8b237 100644 --- a/src/Passwordless.AspNetCore/IdentityBuilderExtensions.cs +++ b/src/Passwordless.AspNetCore/IdentityBuilderExtensions.cs @@ -24,6 +24,8 @@ public static class IdentityBuilderExtensions /// The . /// Configures the . /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IServiceCollection AddPasswordless(this IServiceCollection services, Action configure) where TUser : class, new() { @@ -36,12 +38,16 @@ public static IServiceCollection AddPasswordless(this IServiceCollection /// The current instance. /// Configures the . /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IdentityBuilder AddPasswordless(this IdentityBuilder builder, Action configure) { builder.Services.AddPasswordlessCore(builder.UserType, configure, IdentityConstants.ApplicationScheme); return builder; } + [RequiresDynamicCode("Calls Microsoft.Extensions.DependencyInjection.IdentityBuilderExtensions.AddShared(Type, OptionsBuilder, String)")] + [RequiresUnreferencedCode("Calls Microsoft.Extensions.DependencyInjection.IdentityBuilderExtensions.AddShared(Type, OptionsBuilder, String)")] private static IServiceCollection AddPasswordlessCore(this IServiceCollection services, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type userType, Action configure, @@ -71,6 +77,8 @@ private static IServiceCollection AddPasswordlessCore(this IServiceCollection se /// The current instance. /// The to use to bind to . Generally it's own section. /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IServiceCollection AddPasswordless(this IdentityBuilder builder, IConfiguration configuration) { return builder.AddPasswordless(configuration, builder.UserType, IdentityConstants.ApplicationScheme); @@ -82,11 +90,15 @@ public static IServiceCollection AddPasswordless(this IdentityBuilder builder, I /// The current instance. /// The to use to bind to . Generally it's own section. /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IServiceCollection AddPasswordless(this IdentityBuilder builder, IConfiguration configuration) { return builder.AddPasswordless(configuration, typeof(TUserType), null); } + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] private static IServiceCollection AddPasswordless(this IdentityBuilder builder, IConfiguration configuration, Type? userType, string? defaultScheme) { var optionsBuilder = builder.Services @@ -104,6 +116,8 @@ private static IServiceCollection AddPasswordless(this IdentityBuilder builder, /// The current instance. /// The configuration path to use to bind to . /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IServiceCollection AddPasswordless(this IdentityBuilder builder, string path) { return builder.AddPasswordless(path, builder.UserType, IdentityConstants.ApplicationScheme); @@ -115,11 +129,15 @@ public static IServiceCollection AddPasswordless(this IdentityBuilder builder, s /// The current instance. /// The configuration path to use to bind to . /// The . + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static IServiceCollection AddPasswordless(this IdentityBuilder builder, string path) { return builder.AddPasswordless(path, typeof(TUserType), null); } + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] private static IServiceCollection AddPasswordless(this IdentityBuilder builder, string path, Type userType, string? defaultScheme) { var optionsBuilder = builder.Services @@ -131,6 +149,8 @@ private static IServiceCollection AddPasswordless(this IdentityBuilder builder, return builder.Services.AddShared(userType ?? builder.UserType, optionsBuilder, IdentityConstants.ApplicationScheme); } + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] private static IServiceCollection AddShared(this IServiceCollection services, [DynamicallyAccessedMembers(DynamicallyAccessedMemberTypes.PublicConstructors)] Type userType, diff --git a/src/Passwordless.AspNetCore/Passwordless.AspNetCore.csproj b/src/Passwordless.AspNetCore/Passwordless.AspNetCore.csproj index 0b4d8fb..67b152c 100644 --- a/src/Passwordless.AspNetCore/Passwordless.AspNetCore.csproj +++ b/src/Passwordless.AspNetCore/Passwordless.AspNetCore.csproj @@ -3,7 +3,8 @@ net7.0 true - true + true + true diff --git a/src/Passwordless.AspNetCore/PasswordlessApiEndpointRouteBuilderExtensions.cs b/src/Passwordless.AspNetCore/PasswordlessApiEndpointRouteBuilderExtensions.cs index ff470ed..8f988ce 100644 --- a/src/Passwordless.AspNetCore/PasswordlessApiEndpointRouteBuilderExtensions.cs +++ b/src/Passwordless.AspNetCore/PasswordlessApiEndpointRouteBuilderExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using System.Security.Claims; using System.Threading; using System.Threading.Tasks; @@ -15,8 +16,10 @@ namespace Passwordless.AspNetCore; public static class PasswordlessApiEndpointRouteBuilderExtensions { /// - /// + /// /// + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static PasswordlessEndpointConventionBuilder MapPasswordless(this IEndpointRouteBuilder endpoints, bool enableRegisterEndpoint = false) { // TODO: When a custom register body isn't passed in, we can make a reasonable assumption @@ -26,24 +29,30 @@ public static PasswordlessEndpointConventionBuilder MapPasswordless(this IEndpoi } /// - /// + /// /// + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static PasswordlessEndpointConventionBuilder MapPasswordless(this IEndpointRouteBuilder endpoints, PasswordlessEndpointOptions endpointOptions) { return endpoints.MapPasswordless(endpointOptions); } /// - /// + /// /// + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static PasswordlessEndpointConventionBuilder MapPasswordless(this IEndpointRouteBuilder endpoints) { return endpoints.MapPasswordless(new PasswordlessEndpointOptions(enableRegisterEndpoint: true)); } /// - /// + /// /// + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] public static PasswordlessEndpointConventionBuilder MapPasswordless(this IEndpointRouteBuilder endpoints, PasswordlessEndpointOptions endpointOptions) { var routeGroup = endpoints diff --git a/src/Passwordless/Passwordless.csproj b/src/Passwordless/Passwordless.csproj index 153d3d3..596810c 100644 --- a/src/Passwordless/Passwordless.csproj +++ b/src/Passwordless/Passwordless.csproj @@ -3,6 +3,8 @@ net462;net6.0;net7.0;netstandard2.0 true + true + true diff --git a/src/Passwordless/ServiceCollectionExtensions.cs b/src/Passwordless/ServiceCollectionExtensions.cs index 98f139b..8a11e76 100644 --- a/src/Passwordless/ServiceCollectionExtensions.cs +++ b/src/Passwordless/ServiceCollectionExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Diagnostics.CodeAnalysis; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Options; using Passwordless; @@ -31,6 +32,12 @@ public static IServiceCollection AddPasswordlessSdk( /// /// Adds and configures Passwordless-related services. /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] +#endif +#if NET7_0_OR_GREATER + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] +#endif public static IServiceCollection AddPasswordlessSdk( this IServiceCollection services, IConfiguration configuration) @@ -44,13 +51,18 @@ public static IServiceCollection AddPasswordlessSdk( return services; } - /// /// Adds and configures Passwordless-related services. /// /// /// /// +#if NET6_0_OR_GREATER + [RequiresUnreferencedCode("This method is incompatible with assembly trimming.")] +#endif +#if NET7_0_OR_GREATER + [RequiresDynamicCode("This method is incompatible with native AOT compilation.")] +#endif public static IServiceCollection AddPasswordlessSdk( this IServiceCollection services, string section)