diff --git a/.github/workflows/blazor.yml b/.github/workflows/blazor.yml index 5836b5d1e..a374d6d58 100644 --- a/.github/workflows/blazor.yml +++ b/.github/workflows/blazor.yml @@ -27,7 +27,7 @@ jobs: - name: setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.108 + dotnet-version: 9.x - name: restore dependencies run: dotnet restore ./src/apps/blazor/client/Client.csproj - name: build diff --git a/.github/workflows/webapi.yml b/.github/workflows/webapi.yml index a783360ae..d09354737 100644 --- a/.github/workflows/webapi.yml +++ b/.github/workflows/webapi.yml @@ -25,7 +25,7 @@ jobs: - name: setup dotnet uses: actions/setup-dotnet@v4 with: - dotnet-version: 8.0.108 + dotnet-version: 9.x - name: restore dependencies run: dotnet restore ./src/api/server/Server.csproj - name: build diff --git a/.template.config/template.json b/.template.config/template.json index 8a57730de..a5415e836 100644 --- a/.template.config/template.json +++ b/.template.config/template.json @@ -16,7 +16,7 @@ }, "identity": "FullStackHero.NET.StarterKit", "name": "FullStackHero .NET Starter Kit", - "description": "The best way to start a full-stack .NET 8 Web App.", + "description": "The best way to start a full-stack .NET 9 Web App.", "shortName": "fsh", "sourceName": "FSH.Starter", "preferNameDirectory": true, diff --git a/FSH.StarterKit.nuspec b/FSH.StarterKit.nuspec index d1db1f3fe..314edc0f1 100644 --- a/FSH.StarterKit.nuspec +++ b/FSH.StarterKit.nuspec @@ -3,9 +3,9 @@ FullStackHero.NET.StarterKit FullStackHero .NET Starter Kit - 2.0.2-rc + 2.0.3-rc Mukesh Murugan - The best way to start a full-stack Multi-tenant .NET 8 Web App. + The best way to start a full-stack Multi-tenant .NET 9 Web App. en-US ./content/LICENSE 2024 diff --git a/README.md b/README.md index 5ca4fdd9f..7682ba133 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ -# FullStackHero .NET 8 Starter Kit 🚀 +# FullStackHero .NET 9 Starter Kit 🚀 > With ASP.NET Core Web API & Blazor Client -FullStackHero .NET Starter Kit is a starting point for your next `.NET 8 Clean Architecture` Solution that incorporates the most essential packages and features your projects will ever need including out-of-the-box Multi-Tenancy support. This project can save well over 200+ hours of development time for your team. +FullStackHero .NET Starter Kit is a starting point for your next `.NET 9 Clean Architecture` Solution that incorporates the most essential packages and features your projects will ever need including out-of-the-box Multi-Tenancy support. This project can save well over 200+ hours of development time for your team. ![FullStackHero .NET Starter Kit](./assets/fullstackhero-dotnet-starter-kit.png) @@ -16,7 +16,7 @@ As the project is still in beta, the NuGet packages are not yet available. You c Prerequisites: -- .NET 8 SDK installed. +- .NET 9 SDK installed. - Visual Studio IDE. - Docker Desktop. - PostgreSQL instance running on your machine or docker container. @@ -38,8 +38,8 @@ Please follow the below instructions. # ✨ Technologies -- ASP.NET Core 8 -- Entity Framework Core 8 +- .NET 9 +- Entity Framework Core 9 - Blazor - MediatR - PostgreSQL diff --git a/assets/fullstackhero-dotnet-starter-kit.png b/assets/fullstackhero-dotnet-starter-kit.png index 47168d0f0..d5ac1f26f 100644 Binary files a/assets/fullstackhero-dotnet-starter-kit.png and b/assets/fullstackhero-dotnet-starter-kit.png differ diff --git a/src/Directory.Build.props b/src/Directory.Build.props index 8bb69daaf..0c6a4b342 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - net8.0 + net9.0 false false true diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 095e903f9..52e83b4b5 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -13,52 +13,53 @@ - - - - + + + + - - - - - - - - - + + + + + + + + + + - - - + + + - - - + + + - - - + + + - - + + - - - + + + - - + + @@ -66,7 +67,7 @@ - + @@ -77,12 +78,13 @@ - - - - + + + + + - + diff --git a/src/Dockerfile.Blazor b/src/Dockerfile.Blazor index 7e227212e..2438ffea6 100644 --- a/src/Dockerfile.Blazor +++ b/src/Dockerfile.Blazor @@ -1,4 +1,4 @@ -FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build-env +FROM mcr.microsoft.com/dotnet/sdk:9.0 AS build-env WORKDIR /app COPY . ./ diff --git a/src/Shared/Authorization/AppConstants.cs b/src/Shared/Authorization/AppConstants.cs index f11401220..5334ee902 100644 --- a/src/Shared/Authorization/AppConstants.cs +++ b/src/Shared/Authorization/AppConstants.cs @@ -3,12 +3,12 @@ namespace FSH.Starter.Shared.Authorization; public static class AppConstants { - public static readonly Collection SupportedImageFormats = new() - { + public static readonly Collection SupportedImageFormats = + [ ".jpeg", ".jpg", ".png" - }; + ]; public static readonly string StandardImageFormat = "image/jpeg"; public static readonly int MaxImageWidth = 1500; public static readonly int MaxImageHeight = 1500; diff --git a/src/Shared/Authorization/FshPermissions.cs b/src/Shared/Authorization/FshPermissions.cs index e18c1b500..fad6676ee 100644 --- a/src/Shared/Authorization/FshPermissions.cs +++ b/src/Shared/Authorization/FshPermissions.cs @@ -4,8 +4,8 @@ namespace FSH.Starter.Shared.Authorization; public static class FshPermissions { - private static readonly FshPermission[] allPermissions = - { + private static readonly FshPermission[] AllPermissions = + [ //tenants new("View Tenants", FshActions.View, FshResources.Tenants, IsRoot: true), new("Create Tenants", FshActions.Create, FshResources.Tenants, IsRoot: true), @@ -57,12 +57,12 @@ public static class FshPermissions //audit new("View Audit Trails", FshActions.View, FshResources.AuditTrails), - }; + ]; - public static IReadOnlyList All { get; } = new ReadOnlyCollection(allPermissions); - public static IReadOnlyList Root { get; } = new ReadOnlyCollection(allPermissions.Where(p => p.IsRoot).ToArray()); - public static IReadOnlyList Admin { get; } = new ReadOnlyCollection(allPermissions.Where(p => !p.IsRoot).ToArray()); - public static IReadOnlyList Basic { get; } = new ReadOnlyCollection(allPermissions.Where(p => p.IsBasic).ToArray()); + public static IReadOnlyList All { get; } = new ReadOnlyCollection(AllPermissions); + public static IReadOnlyList Root { get; } = new ReadOnlyCollection(AllPermissions.Where(p => p.IsRoot).ToArray()); + public static IReadOnlyList Admin { get; } = new ReadOnlyCollection(AllPermissions.Where(p => !p.IsRoot).ToArray()); + public static IReadOnlyList Basic { get; } = new ReadOnlyCollection(AllPermissions.Where(p => p.IsBasic).ToArray()); } public record FshPermission(string Description, string Action, string Resource, bool IsBasic = false, bool IsRoot = false) diff --git a/src/Shared/Shared.csproj b/src/Shared/Shared.csproj index fa71b7ae6..125f4c93b 100644 --- a/src/Shared/Shared.csproj +++ b/src/Shared/Shared.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable diff --git a/src/api/framework/Core/Audit/TrailDto.cs b/src/api/framework/Core/Audit/TrailDto.cs index d848e5b2a..8268e4b17 100644 --- a/src/api/framework/Core/Audit/TrailDto.cs +++ b/src/api/framework/Core/Audit/TrailDto.cs @@ -7,14 +7,14 @@ public class TrailDto() public Guid Id { get; set; } public DateTimeOffset DateTime { get; set; } public Guid UserId { get; set; } - public Dictionary KeyValues { get; } = new(); - public Dictionary OldValues { get; } = new(); - public Dictionary NewValues { get; } = new(); - public Collection ModifiedProperties { get; } = new(); + public Dictionary KeyValues { get; } = []; + public Dictionary OldValues { get; } = []; + public Dictionary NewValues { get; } = []; + public Collection ModifiedProperties { get; } = []; public TrailType Type { get; set; } public string? TableName { get; set; } - private static readonly JsonSerializerOptions serializerOptions = new() + private static readonly JsonSerializerOptions SerializerOptions = new() { WriteIndented = false, }; @@ -28,10 +28,10 @@ public AuditTrail ToAuditTrail() Operation = Type.ToString(), Entity = TableName, DateTime = DateTime, - PrimaryKey = JsonSerializer.Serialize(KeyValues, serializerOptions), - PreviousValues = OldValues.Count == 0 ? null : JsonSerializer.Serialize(OldValues, serializerOptions), - NewValues = NewValues.Count == 0 ? null : JsonSerializer.Serialize(NewValues, serializerOptions), - ModifiedProperties = ModifiedProperties.Count == 0 ? null : JsonSerializer.Serialize(ModifiedProperties, serializerOptions) + PrimaryKey = JsonSerializer.Serialize(KeyValues, SerializerOptions), + PreviousValues = OldValues.Count == 0 ? null : JsonSerializer.Serialize(OldValues, SerializerOptions), + NewValues = NewValues.Count == 0 ? null : JsonSerializer.Serialize(NewValues, SerializerOptions), + ModifiedProperties = ModifiedProperties.Count == 0 ? null : JsonSerializer.Serialize(ModifiedProperties, SerializerOptions) }; } } diff --git a/src/api/framework/Core/Auth/Jwt/JwtOptions.cs b/src/api/framework/Core/Auth/Jwt/JwtOptions.cs index 79638b5a5..5d99d6702 100644 --- a/src/api/framework/Core/Auth/Jwt/JwtOptions.cs +++ b/src/api/framework/Core/Auth/Jwt/JwtOptions.cs @@ -13,7 +13,7 @@ public IEnumerable Validate(ValidationContext validationContex { if (string.IsNullOrEmpty(Key)) { - yield return new ValidationResult("No Key defined in JwtSettings config", new[] { nameof(Key) }); + yield return new ValidationResult("No Key defined in JwtSettings config", [nameof(Key)]); } } } diff --git a/src/api/framework/Core/Exceptions/ForbiddenException.cs b/src/api/framework/Core/Exceptions/ForbiddenException.cs index ed752c0ea..fdafead90 100644 --- a/src/api/framework/Core/Exceptions/ForbiddenException.cs +++ b/src/api/framework/Core/Exceptions/ForbiddenException.cs @@ -1,15 +1,14 @@ -using System.Collections.ObjectModel; -using System.Net; +using System.Net; namespace FSH.Framework.Core.Exceptions; public class ForbiddenException : FshException { public ForbiddenException() - : base("unauthorized", new Collection(), HttpStatusCode.Forbidden) + : base("unauthorized", [], HttpStatusCode.Forbidden) { } public ForbiddenException(string message) - : base(message, new Collection(), HttpStatusCode.Forbidden) + : base(message, [], HttpStatusCode.Forbidden) { } } diff --git a/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs b/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs index f895571d7..7d8ea168c 100644 --- a/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs +++ b/src/api/framework/Infrastructure/SecurityHeaders/Extensions.cs @@ -13,11 +13,11 @@ internal static IServiceCollection ConfigureSecurityHeaders(this IServiceCollect return services; } - + internal static IApplicationBuilder UseSecurityHeaders(this IApplicationBuilder app) { var options = app.ApplicationServices.GetRequiredService>().Value; - + if (options.Enable) { app.Use(async (context, next) => @@ -48,22 +48,22 @@ internal static IApplicationBuilder UseSecurityHeaders(this IApplicationBuilder { context.Response.Headers.XXSSProtection = options.Headers.XXSSProtection; } - + if (!string.IsNullOrWhiteSpace(options.Headers.ContentSecurityPolicy)) { context.Response.Headers.ContentSecurityPolicy = options.Headers.ContentSecurityPolicy; } - + if (!string.IsNullOrWhiteSpace(options.Headers.StrictTransportSecurity)) { context.Response.Headers.StrictTransportSecurity = options.Headers.StrictTransportSecurity; } } - + await next.Invoke(); }); } - + return app; } } diff --git a/src/api/framework/Infrastructure/Tenant/Extensions.cs b/src/api/framework/Infrastructure/Tenant/Extensions.cs index 4f561fe90..fe71056c9 100644 --- a/src/api/framework/Infrastructure/Tenant/Extensions.cs +++ b/src/api/framework/Infrastructure/Tenant/Extensions.cs @@ -27,16 +27,16 @@ public static IServiceCollection ConfigureMultitenancy(this IServiceCollection s { // to save database calls to resolve tenant // this was happening for every request earlier, leading to ineffeciency - config.Events.OnTenantResolved = async (context) => + config.Events.OnTenantResolveCompleted = async (context) => { - if (context.StoreType != typeof(DistributedCacheStore)) + if (context.MultiTenantContext.StoreInfo!.StoreType != typeof(DistributedCacheStore)) { var sp = ((HttpContext)context.Context!).RequestServices; var distributedCacheStore = sp .GetService>>()! .FirstOrDefault(s => s.GetType() == typeof(DistributedCacheStore)); - await distributedCacheStore!.TryAddAsync((FshTenantInfo)context.TenantInfo!); + await distributedCacheStore!.TryAddAsync(context.MultiTenantContext.TenantInfo!); } await Task.FromResult(0); }; diff --git a/src/api/migrations/PostgreSQL/Identity/20240601095842_Add Identity Schema.cs b/src/api/migrations/PostgreSQL/Identity/20240601095842_Add Identity Schema.cs index 457a653f6..768f80ac3 100644 --- a/src/api/migrations/PostgreSQL/Identity/20240601095842_Add Identity Schema.cs +++ b/src/api/migrations/PostgreSQL/Identity/20240601095842_Add Identity Schema.cs @@ -199,7 +199,7 @@ protected override void Up(MigrationBuilder migrationBuilder) name: "RoleNameIndex", schema: "identity", table: "Roles", - columns: new[] { "NormalizedName", "TenantId" }, + columns: ["NormalizedName", "TenantId"], unique: true); migrationBuilder.CreateIndex( diff --git a/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs b/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs index 960a3a7aa..d9ad5479e 100644 --- a/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs +++ b/src/api/modules/Todo/Features/GetList/v1/GetTodoListHandler.cs @@ -15,11 +15,11 @@ public async Task> Handle(GetTodoListRequest request, Cancell { ArgumentNullException.ThrowIfNull(request); - var spec = new EntitiesByPaginationFilterSpec(request.filter); + var spec = new EntitiesByPaginationFilterSpec(request.Filter); var items = await repository.ListAsync(spec, cancellationToken).ConfigureAwait(false); var totalCount = await repository.CountAsync(spec, cancellationToken).ConfigureAwait(false); - return new PagedList(items, request.filter.PageNumber, request.filter.PageSize, totalCount); + return new PagedList(items, request.Filter.PageNumber, request.Filter.PageSize, totalCount); } } diff --git a/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs b/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs index 84bd7b679..349fb44a8 100644 --- a/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs +++ b/src/api/modules/Todo/Features/GetList/v1/GetTodoListRequest.cs @@ -2,4 +2,4 @@ using MediatR; namespace FSH.Starter.WebApi.Todo.Features.GetList.v1; -public record GetTodoListRequest(PaginationFilter filter) : IRequest>; +public record GetTodoListRequest(PaginationFilter Filter) : IRequest>; diff --git a/src/api/modules/Todo/Persistence/TodoDbInitializer.cs b/src/api/modules/Todo/Persistence/TodoDbInitializer.cs index eefcc5e27..77f37affb 100644 --- a/src/api/modules/Todo/Persistence/TodoDbInitializer.cs +++ b/src/api/modules/Todo/Persistence/TodoDbInitializer.cs @@ -19,11 +19,11 @@ public async Task MigrateAsync(CancellationToken cancellationToken) public async Task SeedAsync(CancellationToken cancellationToken) { - const string Title = "Hello World!"; - const string Note = "This is your first task"; - if (await context.Todos.FirstOrDefaultAsync(t => t.Title == Title, cancellationToken).ConfigureAwait(false) is null) + const string title = "Hello World!"; + const string note = "This is your first task"; + if (await context.Todos.FirstOrDefaultAsync(t => t.Title == title, cancellationToken).ConfigureAwait(false) is null) { - var todo = TodoItem.Create(Title, Note); + var todo = TodoItem.Create(title, note); await context.Todos.AddAsync(todo, cancellationToken); await context.SaveChangesAsync(cancellationToken).ConfigureAwait(false); logger.LogInformation("[{Tenant}] seeding default todo data", context.TenantInfo!.Identifier); diff --git a/src/api/server/Server.csproj b/src/api/server/Server.csproj index d98578232..11c255c90 100644 --- a/src/api/server/Server.csproj +++ b/src/api/server/Server.csproj @@ -9,6 +9,7 @@ DefaultContainer + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/apps/blazor/client/Client.csproj b/src/apps/blazor/client/Client.csproj index 6225bb79c..9b732733b 100644 --- a/src/apps/blazor/client/Client.csproj +++ b/src/apps/blazor/client/Client.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable FSH.Starter.Blazor.Client diff --git a/src/apps/blazor/client/Directory.Packages.props b/src/apps/blazor/client/Directory.Packages.props index d7e68a594..d288f2a0f 100644 --- a/src/apps/blazor/client/Directory.Packages.props +++ b/src/apps/blazor/client/Directory.Packages.props @@ -11,12 +11,12 @@ - - - + + + - - - + + + \ No newline at end of file diff --git a/src/apps/blazor/client/Pages/Home.razor b/src/apps/blazor/client/Pages/Home.razor index dd86be31f..4ab0981f4 100644 --- a/src/apps/blazor/client/Pages/Home.razor +++ b/src/apps/blazor/client/Pages/Home.razor @@ -9,12 +9,12 @@ - The best way to start a fullstack .NET 8 Web App. + The best way to start a fullstack .NET 9 Web App. fullstackhero's - .NET 8 Starter Kit + .NET 9 Starter Kit diff --git a/src/apps/blazor/infrastructure/Auth/Extensions.cs b/src/apps/blazor/infrastructure/Auth/Extensions.cs index cb366b4fd..730ef26e7 100644 --- a/src/apps/blazor/infrastructure/Auth/Extensions.cs +++ b/src/apps/blazor/infrastructure/Auth/Extensions.cs @@ -1,11 +1,11 @@ using FSH.Starter.Blazor.Infrastructure.Auth.Jwt; +using FSH.Starter.Shared.Authorization; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Components.Authorization; using Microsoft.AspNetCore.Components.WebAssembly.Authentication; using Microsoft.AspNetCore.Components.WebAssembly.Authentication.Internal; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using FSH.Starter.Shared.Authorization; namespace FSH.Starter.Blazor.Infrastructure.Auth; public static class Extensions @@ -26,9 +26,9 @@ public static IServiceCollection AddAuthentication(this IServiceCollection servi private static void RegisterPermissionClaims(AuthorizationOptions options) { - foreach (var permission in FshPermissions.All) + foreach (var permission in FshPermissions.All.Select(p => p.Name)) { - options.AddPolicy(permission.Name, policy => policy.RequireClaim(FshClaims.Permission, permission.Name)); + options.AddPolicy(permission, policy => policy.RequireClaim(FshClaims.Permission, permission)); } } } diff --git a/src/apps/blazor/infrastructure/Directory.Packages.props b/src/apps/blazor/infrastructure/Directory.Packages.props index 8f0da76cb..ab41fcaea 100644 --- a/src/apps/blazor/infrastructure/Directory.Packages.props +++ b/src/apps/blazor/infrastructure/Directory.Packages.props @@ -11,12 +11,12 @@ - - - + + + - - - + + + \ No newline at end of file diff --git a/src/apps/blazor/infrastructure/Infrastructure.csproj b/src/apps/blazor/infrastructure/Infrastructure.csproj index 35d2d2332..d53d6be85 100644 --- a/src/apps/blazor/infrastructure/Infrastructure.csproj +++ b/src/apps/blazor/infrastructure/Infrastructure.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable FSH.Starter.Blazor.Infrastructure diff --git a/src/apps/blazor/infrastructure/Themes/CustomTypography.cs b/src/apps/blazor/infrastructure/Themes/CustomTypography.cs index 1c3c2368e..094a37859 100644 --- a/src/apps/blazor/infrastructure/Themes/CustomTypography.cs +++ b/src/apps/blazor/infrastructure/Themes/CustomTypography.cs @@ -8,7 +8,7 @@ public static class CustomTypography { Default = new Default() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = ".875rem", FontWeight = 400, LineHeight = 1.43, @@ -16,7 +16,7 @@ public static class CustomTypography }, H1 = new H1() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "3rem", FontWeight = 300, LineHeight = 1.167, @@ -24,7 +24,7 @@ public static class CustomTypography }, H2 = new H2() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "2.75rem", FontWeight = 300, LineHeight = 1.2, @@ -32,7 +32,7 @@ public static class CustomTypography }, H3 = new H3() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "2rem", FontWeight = 400, LineHeight = 1.167, @@ -40,7 +40,7 @@ public static class CustomTypography }, H4 = new H4() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "1.75rem", FontWeight = 400, LineHeight = 1.235, @@ -48,7 +48,7 @@ public static class CustomTypography }, H5 = new H5() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "1.5rem", FontWeight = 400, LineHeight = 1.334, @@ -56,7 +56,7 @@ public static class CustomTypography }, H6 = new H6() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "1.25rem", FontWeight = 400, LineHeight = 1.6, @@ -64,7 +64,7 @@ public static class CustomTypography }, Button = new Button() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = ".875rem", FontWeight = 400, LineHeight = 1.75, @@ -72,7 +72,7 @@ public static class CustomTypography }, Body1 = new Body1() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "1rem", FontWeight = 400, LineHeight = 1.5, @@ -80,7 +80,7 @@ public static class CustomTypography }, Body2 = new Body2() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = ".875rem", FontWeight = 400, LineHeight = 1.43, @@ -88,7 +88,7 @@ public static class CustomTypography }, Caption = new Caption() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = ".75rem", FontWeight = 200, LineHeight = 1.66, @@ -96,7 +96,7 @@ public static class CustomTypography }, Subtitle1 = new Subtitle1() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = "1rem", FontWeight = 400, LineHeight = 1.57, @@ -104,7 +104,7 @@ public static class CustomTypography }, Subtitle2 = new Subtitle2() { - FontFamily = new[] { "Montserrat", "Helvetica", "Arial", "sans-serif" }, + FontFamily = ["Montserrat", "Helvetica", "Arial", "sans-serif"], FontSize = ".875rem", FontWeight = 400, LineHeight = 1.57, diff --git a/src/apps/blazor/shared/Shared.csproj b/src/apps/blazor/shared/Shared.csproj index aade0e586..16aa766ee 100644 --- a/src/apps/blazor/shared/Shared.csproj +++ b/src/apps/blazor/shared/Shared.csproj @@ -1,7 +1,7 @@  - net8.0 + net9.0 enable enable FSH.Starter.Blazor.Shared diff --git a/src/aspire/Host/Host.csproj b/src/aspire/Host/Host.csproj index 55c802fd5..ee7279af8 100644 --- a/src/aspire/Host/Host.csproj +++ b/src/aspire/Host/Host.csproj @@ -1,10 +1,10 @@ - + FSH.Starter.Aspire FSH.Starter.Aspire Exe - net8.0 + net9.0 enable enable true diff --git a/src/aspire/service-defaults/ServiceDefaults.csproj b/src/aspire/service-defaults/ServiceDefaults.csproj index 534fcdd03..26553c1c7 100644 --- a/src/aspire/service-defaults/ServiceDefaults.csproj +++ b/src/aspire/service-defaults/ServiceDefaults.csproj @@ -3,7 +3,7 @@ FSH.Starter.Aspire.ServiceDefaults FSH.Starter.Aspire.ServiceDefaults - net8.0 + net9.0 enable enable true diff --git a/src/global.json b/src/global.json index 24a370521..d5bf446d0 100644 --- a/src/global.json +++ b/src/global.json @@ -1,6 +1,6 @@ { "sdk": { - "version": "8.0.108", + "version": "9.0.100", "rollForward": "latestFeature" } } \ No newline at end of file