From e001fa6bfcf42d487abb7ba42124634f42e1b764 Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Fri, 6 Feb 2026 21:01:59 +0100 Subject: [PATCH 01/15] feat(websites): apply recent bit Boilerplate changes to websites #12043 (#12044) --- .../Bit.BlazorUI.Demo.Server.csproj | 1 + .../Extensions/WebApplicationExtensions.cs | 61 +++++++++++++++++++ .../Startup/Middlewares.cs | 10 ++- .../Program.Middlewares.cs | 11 ++-- .../WebApplicationBuilderExtensions.cs | 2 +- ...haredResponseCacheCompatibleAntiforgery.cs | 2 +- .../ServerSharedSettings.cs | 2 - .../Program.Middlewares.cs | 9 ++- .../Bit.Websites.Careers.Server.csproj | 1 + .../Extensions/WebApplicationExtensions.cs | 61 +++++++++++++++++++ .../Services/NullAntiforgery.cs | 22 ------- .../Startup/Middlewares.cs | 9 ++- .../Startup/Services.cs | 2 - .../Bit.Websites.Platform.Server.csproj | 1 + .../Extensions/WebApplicationExtensions.cs | 61 +++++++++++++++++++ .../Services/NullAntiforgery.cs | 22 ------- .../Startup/Middlewares.cs | 9 ++- .../Startup/Services.cs | 1 - .../Bit.Websites.Sales.Server.csproj | 1 + .../Extensions/WebApplicationExtensions.cs | 61 +++++++++++++++++++ .../Services/NullAntiforgery.cs | 22 ------- .../Startup/Middlewares.cs | 9 ++- .../Startup/Services.cs | 1 - 23 files changed, 291 insertions(+), 90 deletions(-) create mode 100644 src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Extensions/WebApplicationExtensions.cs create mode 100644 src/Websites/Careers/src/Bit.Websites.Careers.Server/Extensions/WebApplicationExtensions.cs delete mode 100644 src/Websites/Careers/src/Bit.Websites.Careers.Server/Services/NullAntiforgery.cs create mode 100644 src/Websites/Platform/src/Bit.Websites.Platform.Server/Extensions/WebApplicationExtensions.cs delete mode 100644 src/Websites/Platform/src/Bit.Websites.Platform.Server/Services/NullAntiforgery.cs create mode 100644 src/Websites/Sales/src/Bit.Websites.Sales.Server/Extensions/WebApplicationExtensions.cs delete mode 100644 src/Websites/Sales/src/Bit.Websites.Sales.Server/Services/NullAntiforgery.cs diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj index 46cd1330da..f9c4e3c751 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj @@ -23,6 +23,7 @@ + diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Extensions/WebApplicationExtensions.cs b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Extensions/WebApplicationExtensions.cs new file mode 100644 index 0000000000..a0173cabb6 --- /dev/null +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Extensions/WebApplicationExtensions.cs @@ -0,0 +1,61 @@ +namespace Microsoft.AspNetCore.Builder; + +public static class WebApplicationExtensions +{ + public static WebApplication UseSecurityHeaders(this WebApplication app) + { + // NOTE: These headers represent a strong security baseline. + // Depending on your application's requirements, you might need to relax or tighten these settings further. + + // 1. Strict-Transport-Security (HSTS) + // Enforces HTTPS connections. + // TIP: For "HSTS Preload", it's easier to configure it on Cloudflare CDN + // or your web server, rather than hardcoding the preload directive here. + app.UseHsts(); + + // 2. X-Content-Type-Options + // Prevents browsers from sniffing MIME types (stops executing text/plain as scripts). + app.UseXContentTypeOptions(); + + // 3. X-XSS-Protection + // Legacy header. Enables the browser's built-in XSS filter in block mode. + app.UseXXssProtection(options => options.EnabledWithBlockMode()); + + // 4. X-Frame-Options (XFO) + // Prevents Clickjacking by ensuring the site can only be framed by itself (SameOrigin). + app.UseXfo(options => options.SameOrigin()); + + // 5. Referrer-Policy + // Protects user privacy by only sending the origin (domain) when navigating to external sites. + app.UseReferrerPolicy(opts => opts.StrictOriginWhenCrossOrigin()); + + app.Use(async (context, next) => + { + // 6. Permissions-Policy + // "Disables" sensitive hardware/API access to reduce the attack surface. + // Example: If building an E-Commerce or Delivery app, remove 'payment' or 'geolocation' from this list. + context.Response.Headers.Append("Permissions-Policy", "geolocation=(), camera=(), microphone=(), payment=(), usb=(), display-capture=()"); + + // 7. Cross-Origin-Resource-Policy (CORP) + // Set to 'cross-origin' to explicitly allow resources (images, fonts, etc.) to be loaded by + // clients on different origins/domains and Blazor Hybrid (WebView). + // NOTE: Using 'same-site' or 'same-origin' would block rendering in these multi-origin scenarios, + // but they also help prevent hotlinking and bandwidth theft from untrusted third-party sites. + // By choosing 'cross-origin', you allow *any* external site to embed your static assets, which can + // increase bandwidth costs and enable unauthorized re-use of your images/assets. + // Consider compensating controls such as CDN-level hotlink protection, WAF rules, rate limiting, + // and/or caching policies to mitigate potential abuse while still supporting hybrid/multi-origin clients. + context.Response.Headers.Append("Cross-Origin-Resource-Policy", "cross-origin"); + + // 8. Content-Security-Policy (CSP) - Mini Version + // 'object-src none': Blocks legacy plugins like Flash. + // 'frame-ancestors self': Modern replacement for X-Frame-Options. + // 'form-action self': Restricts forms to only submit to your own domain (prevents form hijacking). + context.Response.Headers.Append("Content-Security-Policy", "object-src 'none'; frame-ancestors 'self'; form-action 'self';"); + + await next(); + }); + + return app; + } +} diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Startup/Middlewares.cs b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Startup/Middlewares.cs index f40687b866..3b94445629 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Startup/Middlewares.cs +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Startup/Middlewares.cs @@ -24,6 +24,8 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati { app.UseHttpsRedirection(); app.UseResponseCompression(); + + app.UseSecurityHeaders(); } Configure_401_403_404_Pages(app); @@ -58,9 +60,11 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati app.UseExceptionHandler("/", createScopeForErrors: true); - app.UseSwagger(); - - app.UseSwaggerUI(); + if (env.IsProduction() is false) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } app.MapHub("/app-hub", options => options.AllowStatefulReconnects = true); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs index cb0aac7000..4be30154c4 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs @@ -52,10 +52,13 @@ private static void ConfigureMiddlewares(this WebApplication app) app.MapAppHealthChecks(); - app.MapOpenApi().CacheOutput("AppResponseCachePolicy"); - app.MapScalarApiReference().CacheOutput("AppResponseCachePolicy"); - app.MapGet("/", () => Results.Redirect("/scalar")).ExcludeFromDescription(); - app.MapGet("/swagger", () => Results.Redirect("/scalar")).ExcludeFromDescription(); + if (env.IsProduction() is false) + { + app.MapOpenApi().CacheOutput("AppResponseCachePolicy"); + app.MapScalarApiReference().CacheOutput("AppResponseCachePolicy"); + app.MapGet("/", () => Results.Redirect("/scalar")).ExcludeFromDescription(); + app.MapGet("/swagger", () => Results.Redirect("/scalar")).ExcludeFromDescription(); + } app.UseHangfireDashboard(options: new() { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Extensions/WebApplicationBuilderExtensions.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Extensions/WebApplicationBuilderExtensions.cs index b3fa54db57..fc007f5edf 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Extensions/WebApplicationBuilderExtensions.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Extensions/WebApplicationBuilderExtensions.cs @@ -45,7 +45,7 @@ public static TBuilder AddServerSharedServices(this TBuilder builder) var builder = policy.AddPolicy(); }, excludeDefaultPolicy: true); }); - if (settings.ResponseCaching?.SharedCachingEnabled is true) + if (settings.ResponseCaching?.EnableCdnEdgeCaching is true) { services.AddSingleton(); } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Services/SharedResponseCacheCompatibleAntiforgery.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Services/SharedResponseCacheCompatibleAntiforgery.cs index 4ba061f3c2..e8dc93154d 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Services/SharedResponseCacheCompatibleAntiforgery.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/Infrastructure/Services/SharedResponseCacheCompatibleAntiforgery.cs @@ -5,7 +5,7 @@ namespace Boilerplate.Server.Shared.Infrastructure.Services; /// /// -/// By default, the anti-forgery mechanism generates a validation cookie and sends a Set-Cookie header +/// By design, the anti-forgery mechanism generates a validation cookie and sends a Set-Cookie header /// for EVERY request, even for Anonymous (unauthenticated) users. /// /// diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/ServerSharedSettings.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/ServerSharedSettings.cs index 9acaff80cd..487f1618b4 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/ServerSharedSettings.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Shared/ServerSharedSettings.cs @@ -62,6 +62,4 @@ public class ResponseCachingOptions /// Enables CDN's edge servers caching /// public bool EnableCdnEdgeCaching { get; set; } - - public bool SharedCachingEnabled => EnableOutputCaching || EnableCdnEdgeCaching; } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs index bd33db76b5..3d63f34d50 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs @@ -106,9 +106,12 @@ public static void ConfigureMiddlewares(this WebApplication app) app.MapAppHealthChecks(); //#if (api == "Integrated") - app.MapOpenApi().CacheOutput("AppResponseCachePolicy"); - app.MapScalarApiReference().CacheOutput("AppResponseCachePolicy"); - app.MapGet("/swagger", () => Results.Redirect("/scalar")).ExcludeFromDescription(); + if (env.IsProduction() is false) + { + app.MapOpenApi().CacheOutput("AppResponseCachePolicy"); + app.MapScalarApiReference().CacheOutput("AppResponseCachePolicy"); + app.MapGet("/swagger", () => Results.Redirect("/scalar")).ExcludeFromDescription(); + } app.UseHangfireDashboard(options: new() { diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj index c34d8a3005..feb6ccbd47 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj @@ -23,6 +23,7 @@ + diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Extensions/WebApplicationExtensions.cs b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Extensions/WebApplicationExtensions.cs new file mode 100644 index 0000000000..a0173cabb6 --- /dev/null +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Extensions/WebApplicationExtensions.cs @@ -0,0 +1,61 @@ +namespace Microsoft.AspNetCore.Builder; + +public static class WebApplicationExtensions +{ + public static WebApplication UseSecurityHeaders(this WebApplication app) + { + // NOTE: These headers represent a strong security baseline. + // Depending on your application's requirements, you might need to relax or tighten these settings further. + + // 1. Strict-Transport-Security (HSTS) + // Enforces HTTPS connections. + // TIP: For "HSTS Preload", it's easier to configure it on Cloudflare CDN + // or your web server, rather than hardcoding the preload directive here. + app.UseHsts(); + + // 2. X-Content-Type-Options + // Prevents browsers from sniffing MIME types (stops executing text/plain as scripts). + app.UseXContentTypeOptions(); + + // 3. X-XSS-Protection + // Legacy header. Enables the browser's built-in XSS filter in block mode. + app.UseXXssProtection(options => options.EnabledWithBlockMode()); + + // 4. X-Frame-Options (XFO) + // Prevents Clickjacking by ensuring the site can only be framed by itself (SameOrigin). + app.UseXfo(options => options.SameOrigin()); + + // 5. Referrer-Policy + // Protects user privacy by only sending the origin (domain) when navigating to external sites. + app.UseReferrerPolicy(opts => opts.StrictOriginWhenCrossOrigin()); + + app.Use(async (context, next) => + { + // 6. Permissions-Policy + // "Disables" sensitive hardware/API access to reduce the attack surface. + // Example: If building an E-Commerce or Delivery app, remove 'payment' or 'geolocation' from this list. + context.Response.Headers.Append("Permissions-Policy", "geolocation=(), camera=(), microphone=(), payment=(), usb=(), display-capture=()"); + + // 7. Cross-Origin-Resource-Policy (CORP) + // Set to 'cross-origin' to explicitly allow resources (images, fonts, etc.) to be loaded by + // clients on different origins/domains and Blazor Hybrid (WebView). + // NOTE: Using 'same-site' or 'same-origin' would block rendering in these multi-origin scenarios, + // but they also help prevent hotlinking and bandwidth theft from untrusted third-party sites. + // By choosing 'cross-origin', you allow *any* external site to embed your static assets, which can + // increase bandwidth costs and enable unauthorized re-use of your images/assets. + // Consider compensating controls such as CDN-level hotlink protection, WAF rules, rate limiting, + // and/or caching policies to mitigate potential abuse while still supporting hybrid/multi-origin clients. + context.Response.Headers.Append("Cross-Origin-Resource-Policy", "cross-origin"); + + // 8. Content-Security-Policy (CSP) - Mini Version + // 'object-src none': Blocks legacy plugins like Flash. + // 'frame-ancestors self': Modern replacement for X-Frame-Options. + // 'form-action self': Restricts forms to only submit to your own domain (prevents form hijacking). + context.Response.Headers.Append("Content-Security-Policy", "object-src 'none'; frame-ancestors 'self'; form-action 'self';"); + + await next(); + }); + + return app; + } +} diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Services/NullAntiforgery.cs b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Services/NullAntiforgery.cs deleted file mode 100644 index 2974066f0d..0000000000 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Services/NullAntiforgery.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.AspNetCore.Antiforgery; - -namespace Bit.Websites.Careers.Server.Services; - -public class NullAntiforgery : IAntiforgery -{ - private const string AntiforgeryTokenFieldName = "__RequestVerificationToken"; - private const string AntiforgeryTokenHeaderName = "RequestVerificationToken"; - - public AntiforgeryTokenSet GetAndStoreTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public AntiforgeryTokenSet GetTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public Task IsRequestValidAsync(HttpContext httpContext) => Task.FromResult(true); - - public void SetCookieTokenAndHeader(HttpContext httpContext) - { - return; - } - - public Task ValidateRequestAsync(HttpContext httpContext) => Task.FromResult(true); -} diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Middlewares.cs b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Middlewares.cs index 7c1e312c33..4293c5453f 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Middlewares.cs +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Middlewares.cs @@ -23,6 +23,8 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati { app.UseHttpsRedirection(); app.UseResponseCompression(); + + app.UseSecurityHeaders(); } Configure_404_Page(app); @@ -53,9 +55,12 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati app.UseAntiforgery(); app.UseExceptionHandler("/", createScopeForErrors: true); - app.UseSwagger(); - app.UseSwaggerUI(); + if (env.IsProduction() is false) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } app.MapControllers(); diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Services.cs b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Services.cs index d74a8774fd..7c7b824a04 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Services.cs +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Startup/Services.cs @@ -14,8 +14,6 @@ public static void Add(IServiceCollection services, IWebHostEnvironment env, ICo var appSettings = configuration.GetSection(nameof(AppSettings)).Get()!; - services.AddTransient(); - services.AddClientSharedServices(); services.AddExceptionHandler(); diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj index 7224e55b9b..e02e57884a 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj @@ -28,6 +28,7 @@ + diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Extensions/WebApplicationExtensions.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Extensions/WebApplicationExtensions.cs new file mode 100644 index 0000000000..a0173cabb6 --- /dev/null +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Extensions/WebApplicationExtensions.cs @@ -0,0 +1,61 @@ +namespace Microsoft.AspNetCore.Builder; + +public static class WebApplicationExtensions +{ + public static WebApplication UseSecurityHeaders(this WebApplication app) + { + // NOTE: These headers represent a strong security baseline. + // Depending on your application's requirements, you might need to relax or tighten these settings further. + + // 1. Strict-Transport-Security (HSTS) + // Enforces HTTPS connections. + // TIP: For "HSTS Preload", it's easier to configure it on Cloudflare CDN + // or your web server, rather than hardcoding the preload directive here. + app.UseHsts(); + + // 2. X-Content-Type-Options + // Prevents browsers from sniffing MIME types (stops executing text/plain as scripts). + app.UseXContentTypeOptions(); + + // 3. X-XSS-Protection + // Legacy header. Enables the browser's built-in XSS filter in block mode. + app.UseXXssProtection(options => options.EnabledWithBlockMode()); + + // 4. X-Frame-Options (XFO) + // Prevents Clickjacking by ensuring the site can only be framed by itself (SameOrigin). + app.UseXfo(options => options.SameOrigin()); + + // 5. Referrer-Policy + // Protects user privacy by only sending the origin (domain) when navigating to external sites. + app.UseReferrerPolicy(opts => opts.StrictOriginWhenCrossOrigin()); + + app.Use(async (context, next) => + { + // 6. Permissions-Policy + // "Disables" sensitive hardware/API access to reduce the attack surface. + // Example: If building an E-Commerce or Delivery app, remove 'payment' or 'geolocation' from this list. + context.Response.Headers.Append("Permissions-Policy", "geolocation=(), camera=(), microphone=(), payment=(), usb=(), display-capture=()"); + + // 7. Cross-Origin-Resource-Policy (CORP) + // Set to 'cross-origin' to explicitly allow resources (images, fonts, etc.) to be loaded by + // clients on different origins/domains and Blazor Hybrid (WebView). + // NOTE: Using 'same-site' or 'same-origin' would block rendering in these multi-origin scenarios, + // but they also help prevent hotlinking and bandwidth theft from untrusted third-party sites. + // By choosing 'cross-origin', you allow *any* external site to embed your static assets, which can + // increase bandwidth costs and enable unauthorized re-use of your images/assets. + // Consider compensating controls such as CDN-level hotlink protection, WAF rules, rate limiting, + // and/or caching policies to mitigate potential abuse while still supporting hybrid/multi-origin clients. + context.Response.Headers.Append("Cross-Origin-Resource-Policy", "cross-origin"); + + // 8. Content-Security-Policy (CSP) - Mini Version + // 'object-src none': Blocks legacy plugins like Flash. + // 'frame-ancestors self': Modern replacement for X-Frame-Options. + // 'form-action self': Restricts forms to only submit to your own domain (prevents form hijacking). + context.Response.Headers.Append("Content-Security-Policy", "object-src 'none'; frame-ancestors 'self'; form-action 'self';"); + + await next(); + }); + + return app; + } +} diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Services/NullAntiforgery.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Services/NullAntiforgery.cs deleted file mode 100644 index d351d8a31a..0000000000 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Services/NullAntiforgery.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.AspNetCore.Antiforgery; - -namespace Bit.Websites.Platform.Server.Services; - -public class NullAntiforgery : IAntiforgery -{ - private const string AntiforgeryTokenFieldName = "__RequestVerificationToken"; - private const string AntiforgeryTokenHeaderName = "RequestVerificationToken"; - - public AntiforgeryTokenSet GetAndStoreTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public AntiforgeryTokenSet GetTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public Task IsRequestValidAsync(HttpContext httpContext) => Task.FromResult(true); - - public void SetCookieTokenAndHeader(HttpContext httpContext) - { - return; - } - - public Task ValidateRequestAsync(HttpContext httpContext) => Task.FromResult(true); -} diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Middlewares.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Middlewares.cs index c79b2e4bf9..047dfbfb96 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Middlewares.cs +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Middlewares.cs @@ -23,6 +23,8 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati { app.UseHttpsRedirection(); app.UseResponseCompression(); + + app.UseSecurityHeaders(); } Configure_404_Page(app); @@ -53,9 +55,12 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati app.UseAntiforgery(); app.UseExceptionHandler("/", createScopeForErrors: true); - app.UseSwagger(); - app.UseSwaggerUI(); + if (env.IsProduction() is false) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } app.MapHub("/app-hub", options => options.AllowStatefulReconnects = true); diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Services.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Services.cs index d3756bb7fa..14346e81f1 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Services.cs +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Startup/Services.cs @@ -18,7 +18,6 @@ public static void Add(IServiceCollection services, IWebHostEnvironment env, ICo configuration.GetSection(nameof(AppSettings)).Bind(appSettings); - services.AddTransient(); services.AddHttpClient(); services.AddScoped(); diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj index c93656e8bf..2e81866986 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj @@ -23,6 +23,7 @@ + diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Extensions/WebApplicationExtensions.cs b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Extensions/WebApplicationExtensions.cs new file mode 100644 index 0000000000..a0173cabb6 --- /dev/null +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Extensions/WebApplicationExtensions.cs @@ -0,0 +1,61 @@ +namespace Microsoft.AspNetCore.Builder; + +public static class WebApplicationExtensions +{ + public static WebApplication UseSecurityHeaders(this WebApplication app) + { + // NOTE: These headers represent a strong security baseline. + // Depending on your application's requirements, you might need to relax or tighten these settings further. + + // 1. Strict-Transport-Security (HSTS) + // Enforces HTTPS connections. + // TIP: For "HSTS Preload", it's easier to configure it on Cloudflare CDN + // or your web server, rather than hardcoding the preload directive here. + app.UseHsts(); + + // 2. X-Content-Type-Options + // Prevents browsers from sniffing MIME types (stops executing text/plain as scripts). + app.UseXContentTypeOptions(); + + // 3. X-XSS-Protection + // Legacy header. Enables the browser's built-in XSS filter in block mode. + app.UseXXssProtection(options => options.EnabledWithBlockMode()); + + // 4. X-Frame-Options (XFO) + // Prevents Clickjacking by ensuring the site can only be framed by itself (SameOrigin). + app.UseXfo(options => options.SameOrigin()); + + // 5. Referrer-Policy + // Protects user privacy by only sending the origin (domain) when navigating to external sites. + app.UseReferrerPolicy(opts => opts.StrictOriginWhenCrossOrigin()); + + app.Use(async (context, next) => + { + // 6. Permissions-Policy + // "Disables" sensitive hardware/API access to reduce the attack surface. + // Example: If building an E-Commerce or Delivery app, remove 'payment' or 'geolocation' from this list. + context.Response.Headers.Append("Permissions-Policy", "geolocation=(), camera=(), microphone=(), payment=(), usb=(), display-capture=()"); + + // 7. Cross-Origin-Resource-Policy (CORP) + // Set to 'cross-origin' to explicitly allow resources (images, fonts, etc.) to be loaded by + // clients on different origins/domains and Blazor Hybrid (WebView). + // NOTE: Using 'same-site' or 'same-origin' would block rendering in these multi-origin scenarios, + // but they also help prevent hotlinking and bandwidth theft from untrusted third-party sites. + // By choosing 'cross-origin', you allow *any* external site to embed your static assets, which can + // increase bandwidth costs and enable unauthorized re-use of your images/assets. + // Consider compensating controls such as CDN-level hotlink protection, WAF rules, rate limiting, + // and/or caching policies to mitigate potential abuse while still supporting hybrid/multi-origin clients. + context.Response.Headers.Append("Cross-Origin-Resource-Policy", "cross-origin"); + + // 8. Content-Security-Policy (CSP) - Mini Version + // 'object-src none': Blocks legacy plugins like Flash. + // 'frame-ancestors self': Modern replacement for X-Frame-Options. + // 'form-action self': Restricts forms to only submit to your own domain (prevents form hijacking). + context.Response.Headers.Append("Content-Security-Policy", "object-src 'none'; frame-ancestors 'self'; form-action 'self';"); + + await next(); + }); + + return app; + } +} diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Services/NullAntiforgery.cs b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Services/NullAntiforgery.cs deleted file mode 100644 index 9f69232f6f..0000000000 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Services/NullAntiforgery.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Microsoft.AspNetCore.Antiforgery; - -namespace Bit.Websites.Sales.Server.Services; - -public class NullAntiforgery : IAntiforgery -{ - private const string AntiforgeryTokenFieldName = "__RequestVerificationToken"; - private const string AntiforgeryTokenHeaderName = "RequestVerificationToken"; - - public AntiforgeryTokenSet GetAndStoreTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public AntiforgeryTokenSet GetTokens(HttpContext httpContext) => new(string.Empty, string.Empty, AntiforgeryTokenFieldName, AntiforgeryTokenHeaderName); - - public Task IsRequestValidAsync(HttpContext httpContext) => Task.FromResult(true); - - public void SetCookieTokenAndHeader(HttpContext httpContext) - { - return; - } - - public Task ValidateRequestAsync(HttpContext httpContext) => Task.FromResult(true); -} diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Middlewares.cs b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Middlewares.cs index ee201ac321..4eb90d69a2 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Middlewares.cs +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Middlewares.cs @@ -23,6 +23,8 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati { app.UseHttpsRedirection(); app.UseResponseCompression(); + + app.UseSecurityHeaders(); } Configure_404_Page(app); @@ -53,9 +55,12 @@ public static void Use(WebApplication app, IWebHostEnvironment env, IConfigurati app.UseAntiforgery(); app.UseExceptionHandler("/", createScopeForErrors: true); - app.UseSwagger(); - app.UseSwaggerUI(); + if (env.IsProduction() is false) + { + app.UseSwagger(); + app.UseSwaggerUI(); + } app.MapControllers(); diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Services.cs b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Services.cs index ae1656cc24..1b4974a52e 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Services.cs +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Startup/Services.cs @@ -14,7 +14,6 @@ public static void Add(IServiceCollection services, IWebHostEnvironment env, ICo var appSettings = configuration.GetSection(nameof(AppSettings)).Get()!; - services.AddTransient(); services.AddHttpClient(); services.AddScoped(); From 6cf854a66a0db123720954c4006cf90452330e2b Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Sat, 7 Feb 2026 22:25:02 +0100 Subject: [PATCH 02/15] feat(templates): bit Boilerplate MCP tools must have authorization by default #12045 (#12046) --- .../src/Directory.Packages.props | 2 +- .../Infrastructure/SignalR/AppChatbot.cs | 87 ++++++++++++------- .../Program.Middlewares.cs | 2 +- .../Program.Middlewares.cs | 2 +- 4 files changed, 59 insertions(+), 34 deletions(-) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index 632b03b279..4f9532ebd9 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -56,7 +56,7 @@ - + diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs index f6668a18b0..f455abee97 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs @@ -36,6 +36,7 @@ public partial class AppChatbot private string? variablesDefault; private string? supportSystemPrompt; + private string? signalRConnectionId; private List chatMessages = []; /// @@ -78,9 +79,10 @@ public async Task StartChat( variablesDefault = @$" {{{{UserCulture}}}}: ""{culture?.NativeName ?? "English"}"" {{{{DeviceInfo}}}}: ""{request.DeviceInfo ?? "Generic Device"}"" -{{{{SignalRConnectionId}}}}: ""{signalRConnectionId ?? "Unknown"}"" {{{{UserTimeZoneId}}}}: ""{request.TimeZoneId ?? "Unknown"}"" "; + + this.signalRConnectionId = signalRConnectionId; } /// @@ -113,7 +115,7 @@ public async Task ProcessNewMessage( { chatMessages.Add(new(ChatRole.User, incomingMessage)); - var chatOptions = CreateChatOptions(serverApiAddress, cancellationToken); + var chatOptions = CreateChatOptions(); // The following variables might change without SignalR connection restarts, so these should set here every time a new message is about to be processed. // For example, user can sign-in/sign-out during chat without restarting the app or SignalR connection. @@ -121,7 +123,6 @@ public async Task ProcessNewMessage( ### Variables: {variablesDefault} {{{{IsAuthenticated}}}}: ""{user.IsAuthenticated()}""}} -{{{{UserId}}}}: ""{(user.IsAuthenticated() ? user!.GetUserId().ToString() : "null")}"" {{{{UserEmail}}}}: ""{(user.IsAuthenticated() ? user!.GetEmail()?.ToString() : "null")}"" "; @@ -168,7 +169,7 @@ public async Task ProcessNewMessage( /// /// Create chat options with AI tools /// - private ChatOptions CreateChatOptions(Uri? serverApiAddress, CancellationToken cancellationToken) + private ChatOptions CreateChatOptions() { var tools = new List { @@ -246,18 +247,16 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] [Description("Navigates the user to a specific page within the application. Use this tool when the user requests to go to a particular section or feature of the app.")] [McpServerTool(Name = nameof(NavigateToPage))] private async Task NavigateToPage( - [Required, Description("Page URL to navigate to")] string pageUrl, - [Required, Description("SignalR connection id")] string signalRConnectionId) + [Required, Description("Page URL to navigate to")] string pageUrl) { - if (string.IsNullOrEmpty(signalRConnectionId)) - return "There's no access to your app on your device"; + await EnsureSignalRConnectionIdIsPresent(); await using var scope = serviceProvider.CreateAsyncScope(); try { _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.NAVIGATE_TO, pageUrl, CancellationToken.None); return "Navigation completed"; @@ -271,14 +270,16 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] [Description(@"Displays the sign-in modal to the user and waits for either successful sign-in or cancellation")] [McpServerTool(Name = nameof(ShowSignInModal))] - public async Task ShowSignInModal([Required, Description("SignalR connection id")] string signalRConnectionId) + public async Task ShowSignInModal() { await using var scope = serviceProvider.CreateAsyncScope(); try { + await EnsureSignalRConnectionIdIsPresent(); + var accessToken = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.SHOW_SIGN_IN_MODAL, CancellationToken.None); var bearerTokenProtector = bearerTokenOptions.Get(IdentityConstants.BearerScheme).BearerTokenProtector; @@ -303,11 +304,9 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] [Description("Changes the user's culture/language setting. Use this tool when the user requests to change the app language. Common LCIDs: 1033=en-US, 1065=fa-IR, 1053=sv-SE, 2057=en-GB, 1043=nl-NL, 1081=hi-IN, 2052=zh-CN, 3082=es-ES, 1036=fr-FR, 1025=ar-SA, 1031=de-DE.")] [McpServerTool(Name = nameof(SetCulture))] private async Task SetCulture( - [Required, Description("Culture LCID (e.g., 1033 for en-US, 1065 for fa-IR)")] int cultureLcid, - [Required, Description("SignalR connection id")] string signalRConnectionId) + [Required, Description("Culture LCID (e.g., 1033 for en-US, 1065 for fa-IR)")] int cultureLcid) { - if (string.IsNullOrEmpty(signalRConnectionId)) - return "There's no access to your app on your device"; + await EnsureSignalRConnectionIdIsPresent(); await using var scope = serviceProvider.CreateAsyncScope(); @@ -319,7 +318,7 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] return $"The requested culture is not supported. Available cultures: {string.Join(", ", CultureInfoManager.SupportedCultures.Select(c => c.Culture.NativeName))}"; _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.CHANGE_CULTURE, cultureLcid, CancellationToken.None); return "Culture/Language changed successfully"; @@ -337,11 +336,9 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] [Description("Changes the user's theme preference between light and dark mode. Use this tool when the user requests to change the app theme or appearance.")] [McpServerTool(Name = nameof(SetTheme))] private async Task SetTheme( - [Required, Description("Theme name: 'light' or 'dark'")] string theme, - [Required, Description("SignalR connection id")] string signalRConnectionId) + [Required, Description("Theme name: 'light' or 'dark'")] string theme) { - if (string.IsNullOrEmpty(signalRConnectionId)) - return "There's no access to your app on your device"; + await EnsureSignalRConnectionIdIsPresent(); if (theme != "light" && theme != "dark") return "Invalid theme. Use 'light' or 'dark'."; @@ -351,7 +348,7 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] try { _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.CHANGE_THEME, theme, CancellationToken.None); return $"Theme changed to {theme} successfully"; @@ -368,18 +365,16 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] /// [Description("Retrieves the last error that occurred on the user's device from the diagnostic logs. Use this tool when troubleshooting user-reported issues, investigating application crashes, or when the user mentions something isn't working.")] [McpServerTool(Name = nameof(CheckLastError))] - private async Task CheckLastError( - [Required, Description("SignalR connection id")] string signalRConnectionId) + private async Task CheckLastError() { - if (string.IsNullOrEmpty(signalRConnectionId)) - return "There's no access to your app on your device"; + await EnsureSignalRConnectionIdIsPresent(); await using var scope = serviceProvider.CreateAsyncScope(); try { var lastError = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.UPLOAD_LAST_ERROR, CancellationToken.None); if (lastError is null) @@ -399,18 +394,16 @@ private string GetCurrentDateTime([Required, Description("User's timezone id")] /// [Description("Clears application files on the user's device to fix issues.")] [McpServerTool(Name = nameof(ClearAppFiles))] - private async Task ClearAppFiles( - [Required, Description("SignalR connection id")] string signalRConnectionId) + private async Task ClearAppFiles() { - if (string.IsNullOrEmpty(signalRConnectionId)) - return "There's no access to your app on your device"; + await EnsureSignalRConnectionIdIsPresent(); await using var scope = serviceProvider.CreateAsyncScope(); try { await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId) + .Clients.Client(signalRConnectionId!) .InvokeAsync(SharedAppMessages.CLEAR_APP_FILES, CancellationToken.None); return "App files cleared successfully on the device."; @@ -502,4 +495,36 @@ Generate exactly 3 short suggested replies that the user would naturally type ne return followUpItems.Result ?? new AiChatFollowUpList(); } + + private async Task EnsureSignalRConnectionIdIsPresent() + { + // If the AIFunction tool is getting called by the IChatClient, the signalRConnectionId is already set in the AppChatbot instance using + // StartChat method, so we can return it directly without querying the database again. + + // The SignalRConnectionId gives access to the currently exposed SignalR Client methods (e.g., NavigateToPage, ShowSignInModal) + // that are essential for some of the AI tools to work properly, so it's important to ensure that we have it available when processing AI tool calls. + + // If the AIFunction tool is getting called by an external MCP client, then the signalRConnectionId won't be set, + // so we need to query the database to get the active SignalR connection id for the current user session, assuming that the external MCP client is using authentication headers. + + if (string.IsNullOrEmpty(signalRConnectionId) is false) + return; + + await using var scope = serviceProvider.CreateAsyncScope(); + var httpContextAccessor = scope.ServiceProvider.GetService(); + + if (httpContextAccessor?.HttpContext?.User?.IsAuthenticated() is false) + throw new UnauthorizedException("User must be authenticated to use this tool when calling from an external MCP client."); + // While these tools can be called internally even for unauthenticated users, + // we require authentication for external MCP clients to ensure we can associate the request with a user session and retrieve the correct SignalR connection id. + // accepting SignalR connection id from external MCP clients would not be secure as it can be easily manipulated using prompt injection in external LLM that's calling the MCP tool. + + var userSessionId = httpContextAccessor?.HttpContext?.User.GetSessionId(); + var dbContext = scope.ServiceProvider.GetRequiredService(); + + signalRConnectionId = await dbContext.UserSessions + .Where(s => s.Id == userSessionId) + .Select(s => s.SignalRConnectionId) + .FirstOrDefaultAsync() ?? throw new InvalidOperationException("There's no access to your app on your device."); + } } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs index 4be30154c4..458cc5cef8 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Middlewares.cs @@ -74,7 +74,7 @@ private static void ConfigureMiddlewares(this WebApplication app) //#if (signalR == true) app.MapHub("/app-hub", options => options.AllowStatefulReconnects = true); - app.MapMcp("/mcp")/*.RequireAuthorization()*/; // Map MCP endpoints for chatbot tool + app.MapMcp("/mcp").RequireAuthorization(); // Map MCP endpoints for chatbot tool //#endif app.MapControllers() diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs index 3d63f34d50..b03ed30be6 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Program.Middlewares.cs @@ -141,7 +141,7 @@ public static void ConfigureMiddlewares(this WebApplication app) throw new InvalidOperationException("Azure SignalR is not supported with Blazor Server and Auto"); } app.MapHub("/app-hub", options => options.AllowStatefulReconnects = true); - app.MapMcp("/mcp")/*.RequireAuthorization()*/; // Map MCP endpoints for chatbot tool + app.MapMcp("/mcp").RequireAuthorization(); // Map MCP endpoints for chatbot tool //#endif app.MapControllers() From 9e4506c4f2829f2c37b4991df02da59a3a97cdc0 Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Sat, 7 Feb 2026 22:53:24 +0100 Subject: [PATCH 03/15] feat(deps): update project dependencies #12047 (#12048) --- .../Bit.BlazorUI.Extras/package-lock.json | 216 +++++++-------- src/BlazorUI/Bit.BlazorUI.Extras/package.json | 2 +- src/BlazorUI/Bit.BlazorUI/package-lock.json | 216 +++++++-------- src/BlazorUI/Bit.BlazorUI/package.json | 2 +- .../Bit.BlazorUI.Demo.Server.csproj | 4 +- .../package-lock.json | 216 +++++++-------- .../package.json | 2 +- .../Bit.BlazorUI.Demo.Client.Maui.csproj | 4 +- .../Bit.BlazorUI.Demo.Client.Windows.csproj | 2 +- .../Bit.BlazorUI.Tests.csproj | 2 +- src/Bswup/Bit.Bswup/package-lock.json | 216 +++++++-------- src/Bswup/Bit.Bswup/package.json | 2 +- src/Butil/Bit.Butil/package-lock.json | 216 +++++++-------- src/Butil/Bit.Butil/package.json | 2 +- .../Bit.Butil.Demo.Maui.csproj | 4 +- .../Boilerplate.Client.Core/package-lock.json | 216 +++++++-------- .../Boilerplate.Client.Core/package.json | 2 +- .../src/Directory.Packages.props | 22 +- .../package-lock.json | 249 ++++++++---------- .../Bit.Websites.Careers.Client/package.json | 2 +- .../Bit.Websites.Careers.Server.csproj | 2 +- .../package-lock.json | 216 +++++++-------- .../Bit.Websites.Platform.Client/package.json | 2 +- .../Bit.Websites.Platform.Server.csproj | 4 +- .../package-lock.json | 216 +++++++-------- .../Bit.Websites.Sales.Client/package.json | 2 +- .../Bit.Websites.Sales.Server.csproj | 2 +- 27 files changed, 1001 insertions(+), 1040 deletions(-) diff --git a/src/BlazorUI/Bit.BlazorUI.Extras/package-lock.json b/src/BlazorUI/Bit.BlazorUI.Extras/package-lock.json index 2053d773b0..6508d3a5d0 100644 --- a/src/BlazorUI/Bit.BlazorUI.Extras/package-lock.json +++ b/src/BlazorUI/Bit.BlazorUI.Extras/package-lock.json @@ -5,15 +5,15 @@ "packages": { "": { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -28,9 +28,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -45,9 +45,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -62,9 +62,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -79,9 +79,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -96,9 +96,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -113,9 +113,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -130,9 +130,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -147,9 +147,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -164,9 +164,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -181,9 +181,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -198,9 +198,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -215,9 +215,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -232,9 +232,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -249,9 +249,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -266,9 +266,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -283,9 +283,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -300,9 +300,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -334,9 +334,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -351,9 +351,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -368,9 +368,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -385,9 +385,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -402,9 +402,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -419,9 +419,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -436,9 +436,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -784,9 +784,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -797,32 +797,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/fill-range": { diff --git a/src/BlazorUI/Bit.BlazorUI.Extras/package.json b/src/BlazorUI/Bit.BlazorUI.Extras/package.json index 272e232e53..5e8810bec4 100644 --- a/src/BlazorUI/Bit.BlazorUI.Extras/package.json +++ b/src/BlazorUI/Bit.BlazorUI.Extras/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } diff --git a/src/BlazorUI/Bit.BlazorUI/package-lock.json b/src/BlazorUI/Bit.BlazorUI/package-lock.json index 950ea96e0b..cbb5d3bdee 100644 --- a/src/BlazorUI/Bit.BlazorUI/package-lock.json +++ b/src/BlazorUI/Bit.BlazorUI/package-lock.json @@ -5,15 +5,15 @@ "packages": { "": { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -28,9 +28,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -45,9 +45,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -62,9 +62,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -79,9 +79,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -96,9 +96,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -113,9 +113,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -130,9 +130,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -147,9 +147,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -164,9 +164,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -181,9 +181,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -198,9 +198,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -215,9 +215,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -232,9 +232,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -249,9 +249,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -266,9 +266,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -283,9 +283,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -300,9 +300,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -334,9 +334,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -351,9 +351,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -368,9 +368,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -385,9 +385,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -402,9 +402,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -419,9 +419,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -436,9 +436,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -784,9 +784,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -797,32 +797,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/fill-range": { diff --git a/src/BlazorUI/Bit.BlazorUI/package.json b/src/BlazorUI/Bit.BlazorUI/package.json index 272e232e53..5e8810bec4 100644 --- a/src/BlazorUI/Bit.BlazorUI/package.json +++ b/src/BlazorUI/Bit.BlazorUI/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj index f9c4e3c751..1ef1985b11 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj @@ -24,7 +24,7 @@ - + @@ -33,7 +33,7 @@ - + diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package-lock.json b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package-lock.json index f13977f1f1..87627042c0 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package-lock.json +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package-lock.json @@ -5,15 +5,15 @@ "packages": { "": { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", - "integrity": "sha512-GZMB+a0mOMZs4MpDbj8RJp4cw+w1WV5NYD6xzgvzUJ5Ek2jerwfO2eADyI6ExDSUED+1X8aMbegahsJi+8mgpw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.3.tgz", + "integrity": "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg==", "cpu": [ "ppc64" ], @@ -28,9 +28,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.2.tgz", - "integrity": "sha512-DVNI8jlPa7Ujbr1yjU2PfUSRtAUZPG9I1RwW4F4xFB1Imiu2on0ADiI/c3td+KmDtVKNbi+nffGDQMfcIMkwIA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.27.3.tgz", + "integrity": "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA==", "cpu": [ "arm" ], @@ -45,9 +45,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.2.tgz", - "integrity": "sha512-pvz8ZZ7ot/RBphf8fv60ljmaoydPU12VuXHImtAs0XhLLw+EXBi2BLe3OYSBslR4rryHvweW5gmkKFwTiFy6KA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.27.3.tgz", + "integrity": "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg==", "cpu": [ "arm64" ], @@ -62,9 +62,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.2.tgz", - "integrity": "sha512-z8Ank4Byh4TJJOh4wpz8g2vDy75zFL0TlZlkUkEwYXuPSgX8yzep596n6mT7905kA9uHZsf/o2OJZubl2l3M7A==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.27.3.tgz", + "integrity": "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ==", "cpu": [ "x64" ], @@ -79,9 +79,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.2.tgz", - "integrity": "sha512-davCD2Zc80nzDVRwXTcQP/28fiJbcOwvdolL0sOiOsbwBa72kegmVU0Wrh1MYrbuCL98Omp5dVhQFWRKR2ZAlg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.27.3.tgz", + "integrity": "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg==", "cpu": [ "arm64" ], @@ -96,9 +96,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.2.tgz", - "integrity": "sha512-ZxtijOmlQCBWGwbVmwOF/UCzuGIbUkqB1faQRf5akQmxRJ1ujusWsb3CVfk/9iZKr2L5SMU5wPBi1UWbvL+VQA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.27.3.tgz", + "integrity": "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg==", "cpu": [ "x64" ], @@ -113,9 +113,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.2.tgz", - "integrity": "sha512-lS/9CN+rgqQ9czogxlMcBMGd+l8Q3Nj1MFQwBZJyoEKI50XGxwuzznYdwcav6lpOGv5BqaZXqvBSiB/kJ5op+g==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.27.3.tgz", + "integrity": "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w==", "cpu": [ "arm64" ], @@ -130,9 +130,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.2.tgz", - "integrity": "sha512-tAfqtNYb4YgPnJlEFu4c212HYjQWSO/w/h/lQaBK7RbwGIkBOuNKQI9tqWzx7Wtp7bTPaGC6MJvWI608P3wXYA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.27.3.tgz", + "integrity": "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA==", "cpu": [ "x64" ], @@ -147,9 +147,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.2.tgz", - "integrity": "sha512-vWfq4GaIMP9AIe4yj1ZUW18RDhx6EPQKjwe7n8BbIecFtCQG4CfHGaHuh7fdfq+y3LIA2vGS/o9ZBGVxIDi9hw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.27.3.tgz", + "integrity": "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw==", "cpu": [ "arm" ], @@ -164,9 +164,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.2.tgz", - "integrity": "sha512-hYxN8pr66NsCCiRFkHUAsxylNOcAQaxSSkHMMjcpx0si13t1LHFphxJZUiGwojB1a/Hd5OiPIqDdXONia6bhTw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.27.3.tgz", + "integrity": "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg==", "cpu": [ "arm64" ], @@ -181,9 +181,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.2.tgz", - "integrity": "sha512-MJt5BRRSScPDwG2hLelYhAAKh9imjHK5+NE/tvnRLbIqUWa+0E9N4WNMjmp/kXXPHZGqPLxggwVhz7QP8CTR8w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.27.3.tgz", + "integrity": "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg==", "cpu": [ "ia32" ], @@ -198,9 +198,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.2.tgz", - "integrity": "sha512-lugyF1atnAT463aO6KPshVCJK5NgRnU4yb3FUumyVz+cGvZbontBgzeGFO1nF+dPueHD367a2ZXe1NtUkAjOtg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.27.3.tgz", + "integrity": "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA==", "cpu": [ "loong64" ], @@ -215,9 +215,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.2.tgz", - "integrity": "sha512-nlP2I6ArEBewvJ2gjrrkESEZkB5mIoaTswuqNFRv/WYd+ATtUpe9Y09RnJvgvdag7he0OWgEZWhviS1OTOKixw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.27.3.tgz", + "integrity": "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw==", "cpu": [ "mips64el" ], @@ -232,9 +232,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.2.tgz", - "integrity": "sha512-C92gnpey7tUQONqg1n6dKVbx3vphKtTHJaNG2Ok9lGwbZil6DrfyecMsp9CrmXGQJmZ7iiVXvvZH6Ml5hL6XdQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.27.3.tgz", + "integrity": "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA==", "cpu": [ "ppc64" ], @@ -249,9 +249,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.2.tgz", - "integrity": "sha512-B5BOmojNtUyN8AXlK0QJyvjEZkWwy/FKvakkTDCziX95AowLZKR6aCDhG7LeF7uMCXEJqwa8Bejz5LTPYm8AvA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.27.3.tgz", + "integrity": "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ==", "cpu": [ "riscv64" ], @@ -266,9 +266,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.2.tgz", - "integrity": "sha512-p4bm9+wsPwup5Z8f4EpfN63qNagQ47Ua2znaqGH6bqLlmJ4bx97Y9JdqxgGZ6Y8xVTixUnEkoKSHcpRlDnNr5w==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.27.3.tgz", + "integrity": "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw==", "cpu": [ "s390x" ], @@ -283,9 +283,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.2.tgz", - "integrity": "sha512-uwp2Tip5aPmH+NRUwTcfLb+W32WXjpFejTIOWZFw/v7/KnpCDKG66u4DLcurQpiYTiYwQ9B7KOeMJvLCu/OvbA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.27.3.tgz", + "integrity": "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA==", "cpu": [ "x64" ], @@ -300,9 +300,9 @@ } }, "node_modules/@esbuild/netbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.2.tgz", - "integrity": "sha512-Kj6DiBlwXrPsCRDeRvGAUb/LNrBASrfqAIok+xB0LxK8CHqxZ037viF13ugfsIpePH93mX7xfJp97cyDuTZ3cw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.27.3.tgz", + "integrity": "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA==", "cpu": [ "arm64" ], @@ -317,9 +317,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.2.tgz", - "integrity": "sha512-HwGDZ0VLVBY3Y+Nw0JexZy9o/nUAWq9MlV7cahpaXKW6TOzfVno3y3/M8Ga8u8Yr7GldLOov27xiCnqRZf0tCA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.27.3.tgz", + "integrity": "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA==", "cpu": [ "x64" ], @@ -334,9 +334,9 @@ } }, "node_modules/@esbuild/openbsd-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.2.tgz", - "integrity": "sha512-DNIHH2BPQ5551A7oSHD0CKbwIA/Ox7+78/AWkbS5QoRzaqlev2uFayfSxq68EkonB+IKjiuxBFoV8ESJy8bOHA==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.27.3.tgz", + "integrity": "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw==", "cpu": [ "arm64" ], @@ -351,9 +351,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.2.tgz", - "integrity": "sha512-/it7w9Nb7+0KFIzjalNJVR5bOzA9Vay+yIPLVHfIQYG/j+j9VTH84aNB8ExGKPU4AzfaEvN9/V4HV+F+vo8OEg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.27.3.tgz", + "integrity": "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ==", "cpu": [ "x64" ], @@ -368,9 +368,9 @@ } }, "node_modules/@esbuild/openharmony-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.2.tgz", - "integrity": "sha512-LRBbCmiU51IXfeXk59csuX/aSaToeG7w48nMwA6049Y4J4+VbWALAuXcs+qcD04rHDuSCSRKdmY63sruDS5qag==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.27.3.tgz", + "integrity": "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g==", "cpu": [ "arm64" ], @@ -385,9 +385,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.2.tgz", - "integrity": "sha512-kMtx1yqJHTmqaqHPAzKCAkDaKsffmXkPHThSfRwZGyuqyIeBvf08KSsYXl+abf5HDAPMJIPnbBfXvP2ZC2TfHg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.27.3.tgz", + "integrity": "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA==", "cpu": [ "x64" ], @@ -402,9 +402,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.2.tgz", - "integrity": "sha512-Yaf78O/B3Kkh+nKABUF++bvJv5Ijoy9AN1ww904rOXZFLWVc5OLOfL56W+C8F9xn5JQZa3UX6m+IktJnIb1Jjg==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.27.3.tgz", + "integrity": "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA==", "cpu": [ "arm64" ], @@ -419,9 +419,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.2.tgz", - "integrity": "sha512-Iuws0kxo4yusk7sw70Xa2E2imZU5HoixzxfGCdxwBdhiDgt9vX9VUCBhqcwY7/uh//78A1hMkkROMJq9l27oLQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.27.3.tgz", + "integrity": "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q==", "cpu": [ "ia32" ], @@ -436,9 +436,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.2.tgz", - "integrity": "sha512-sRdU18mcKf7F+YgheI/zGf5alZatMUTKj/jNS6l744f9u3WFu4v7twcUI9vu4mknF4Y9aDlblIie0IM+5xxaqQ==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.27.3.tgz", + "integrity": "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA==", "cpu": [ "x64" ], @@ -784,9 +784,9 @@ } }, "node_modules/esbuild": { - "version": "0.27.2", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.2.tgz", - "integrity": "sha512-HyNQImnsOC7X9PMNaCIeAm4ISCQXs5a5YasTXVliKv4uuBo1dKrG0A+uQS8M5eXjVMnLg3WgXaKvprHlFJQffw==", + "version": "0.27.3", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.27.3.tgz", + "integrity": "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg==", "dev": true, "hasInstallScript": true, "license": "MIT", @@ -797,32 +797,32 @@ "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.27.2", - "@esbuild/android-arm": "0.27.2", - "@esbuild/android-arm64": "0.27.2", - "@esbuild/android-x64": "0.27.2", - "@esbuild/darwin-arm64": "0.27.2", - "@esbuild/darwin-x64": "0.27.2", - "@esbuild/freebsd-arm64": "0.27.2", - "@esbuild/freebsd-x64": "0.27.2", - "@esbuild/linux-arm": "0.27.2", - "@esbuild/linux-arm64": "0.27.2", - "@esbuild/linux-ia32": "0.27.2", - "@esbuild/linux-loong64": "0.27.2", - "@esbuild/linux-mips64el": "0.27.2", - "@esbuild/linux-ppc64": "0.27.2", - "@esbuild/linux-riscv64": "0.27.2", - "@esbuild/linux-s390x": "0.27.2", - "@esbuild/linux-x64": "0.27.2", - "@esbuild/netbsd-arm64": "0.27.2", - "@esbuild/netbsd-x64": "0.27.2", - "@esbuild/openbsd-arm64": "0.27.2", - "@esbuild/openbsd-x64": "0.27.2", - "@esbuild/openharmony-arm64": "0.27.2", - "@esbuild/sunos-x64": "0.27.2", - "@esbuild/win32-arm64": "0.27.2", - "@esbuild/win32-ia32": "0.27.2", - "@esbuild/win32-x64": "0.27.2" + "@esbuild/aix-ppc64": "0.27.3", + "@esbuild/android-arm": "0.27.3", + "@esbuild/android-arm64": "0.27.3", + "@esbuild/android-x64": "0.27.3", + "@esbuild/darwin-arm64": "0.27.3", + "@esbuild/darwin-x64": "0.27.3", + "@esbuild/freebsd-arm64": "0.27.3", + "@esbuild/freebsd-x64": "0.27.3", + "@esbuild/linux-arm": "0.27.3", + "@esbuild/linux-arm64": "0.27.3", + "@esbuild/linux-ia32": "0.27.3", + "@esbuild/linux-loong64": "0.27.3", + "@esbuild/linux-mips64el": "0.27.3", + "@esbuild/linux-ppc64": "0.27.3", + "@esbuild/linux-riscv64": "0.27.3", + "@esbuild/linux-s390x": "0.27.3", + "@esbuild/linux-x64": "0.27.3", + "@esbuild/netbsd-arm64": "0.27.3", + "@esbuild/netbsd-x64": "0.27.3", + "@esbuild/openbsd-arm64": "0.27.3", + "@esbuild/openbsd-x64": "0.27.3", + "@esbuild/openharmony-arm64": "0.27.3", + "@esbuild/sunos-x64": "0.27.3", + "@esbuild/win32-arm64": "0.27.3", + "@esbuild/win32-ia32": "0.27.3", + "@esbuild/win32-x64": "0.27.3" } }, "node_modules/fill-range": { diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package.json b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package.json index 272e232e53..5e8810bec4 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package.json +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "esbuild": "0.27.2", + "esbuild": "0.27.3", "sass": "1.97.3", "typescript": "5.9.3" } diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj index 753d1a30c2..72b026c243 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj @@ -117,8 +117,8 @@ - - + + - 10.4.1 + 10.4.2-pre-01 $(ReleaseVersion) https://github.com/bitfoundation/bitplatform/releases/tag/v-$(ReleaseVersion) $([System.String]::Copy($(ReleaseVersion)).Replace('-pre-', '.')) diff --git a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets index 4259c5ce12..829bc53eaf 100644 --- a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets +++ b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets @@ -1,13 +1,13 @@ - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) diff --git a/src/BlazorUI/Bit.BlazorUI/Info.cs b/src/BlazorUI/Bit.BlazorUI/Info.cs index 8d38825a03..7ba5e79689 100644 --- a/src/BlazorUI/Bit.BlazorUI/Info.cs +++ b/src/BlazorUI/Bit.BlazorUI/Info.cs @@ -8,5 +8,5 @@ public static class Info /// /// The current version string of bit BlazorUI. /// - public static string Version { get; } = "10.4.1"; + public static string Version { get; } = "10.4.2-pre-01"; } diff --git a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts index 25784d9681..185792cf19 100644 --- a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts +++ b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts @@ -1,4 +1,4 @@ -(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.1'; +(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.2-pre-01'; interface DotNetObject { invokeMethod(methodIdentifier: string, ...args: any[]): T; diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj index 1ef1985b11..4e695b9e91 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj @@ -10,12 +10,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj index 6e875f9d5e..8dae19c519 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj @@ -5,11 +5,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj index 53da28c866..3089d11fc5 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj @@ -16,11 +16,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj index 72b026c243..ad0badcbe0 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj @@ -98,13 +98,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj index 7a3d3331d1..0da58b9bfe 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj @@ -28,13 +28,13 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js index a6da71c8e1..80f535f9f7 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj index 09a24e2253..c80bbdaeba 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj @@ -29,12 +29,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Directory.Build.props b/src/BlazorUI/Demo/Directory.Build.props index 460d7c9e88..dd0a9db902 100644 --- a/src/BlazorUI/Demo/Directory.Build.props +++ b/src/BlazorUI/Demo/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js index 85abffc9f7..86e451b70e 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js index d0ebed346d..c5624f0b96 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js index 64180d1ccc..61711a707f 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js index e8c9fd572c..db50439fdf 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 self.assetsInclude = []; self.assetsExclude = [ diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts index cb8b81bba4..d5c7a03bd9 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts @@ -1,4 +1,4 @@ -window['bit-bswup.progress version'] = '10.4.1'; +window['bit-bswup.progress version'] = '10.4.2-pre-01'; (function () { const _config: IBswupProgressConfigs = {}; diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts index feab5e3a33..6b5756c83c 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw-cleanup version'] = '10.4.1'; +self['bit-bswup.sw-cleanup version'] = '10.4.2-pre-01'; self.addEventListener('install', e => e.waitUntil(removeBswup())); diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts index 2ff9098b6b..56069db13d 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw version'] = '10.4.1'; +self['bit-bswup.sw version'] = '10.4.2-pre-01'; interface Window { clients: any diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts index 1baee87695..18f9737017 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts @@ -1,5 +1,5 @@ var BitBswup = BitBswup || {}; -BitBswup.version = window['bit-bswup version'] = '10.4.1'; +BitBswup.version = window['bit-bswup version'] = '10.4.2-pre-01'; (function () { const bitBswupScript = document.currentScript; diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js index 38830e6686..1f661ab430 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js index 9bf04db734..47bf425044 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 self.assetsInclude = []; self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; diff --git a/src/Butil/Bit.Butil/Scripts/butil.ts b/src/Butil/Bit.Butil/Scripts/butil.ts index 1d053f67dc..e4e17d3acc 100644 --- a/src/Butil/Bit.Butil/Scripts/butil.ts +++ b/src/Butil/Bit.Butil/Scripts/butil.ts @@ -1,2 +1,2 @@ var BitButil = BitButil || {}; -BitButil.version = window['bit-butil version'] = '10.4.1'; \ No newline at end of file +BitButil.version = window['bit-butil version'] = '10.4.2-pre-01'; \ No newline at end of file diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj index 53aaf31d1d..0ca3fadec2 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj @@ -1,4 +1,4 @@ - + @@ -15,14 +15,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj index 0701583017..edab7f0f56 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj @@ -1,4 +1,4 @@ - + @@ -18,14 +18,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md index ccb8aceb14..e65cd8f7fd 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md @@ -221,7 +221,7 @@ These namespaces are **automatically imported** in every C# file, eliminating th Instead of this in each `.csproj`: ```xml - + ``` You write this in `.csproj`: @@ -231,7 +231,7 @@ You write this in `.csproj`: And the version is defined centrally in `Directory.Packages.props`: ```xml - + ``` **Benefits**: @@ -242,8 +242,8 @@ And the version is defined centrally in `Directory.Packages.props`: **Example packages included**: ```xml - - + + @@ -608,7 +608,7 @@ When you open the project in VS Code, you'll be prompted to install these extens **Example**: ````markdown -This project gets generated by bit-bp template v-10.4.1 using the following command +This project gets generated by bit-bp template v-10.4.2-pre-01 using the following command ```bash dotnet new bit-bp --name Boilerplate diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/README.md b/src/Templates/Boilerplate/Bit.Boilerplate/README.md index f1707b5b09..8eacf934f8 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/README.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/README.md @@ -2,7 +2,7 @@ Thank you for creating a new project with bit platform! We appreciate your trust in our platform and are excited to see what you'll build. -This project generated by bit-bp template v-10.4.1 using the following command: +This project generated by bit-bp template v-10.4.2-pre-01 using the following command: ```bash dotnet new bit-bp diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js index 401bc0991f..1a8550ae0b 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js @@ -1,5 +1,5 @@ //+:cnd:noEmit -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup //#if (notification == true) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index 8eac113758..59d03ebf10 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -1,16 +1,16 @@ - + - - - - - - - - - + + + + + + + + + @@ -88,7 +88,7 @@ - + diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj index be1d17a044..f6adb7e7bd 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js index da93708a76..b077739fad 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj index 00ff80e720..e022b1d989 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj index f63ac521f6..fd7e78dc74 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Directory.Build.props b/src/Websites/Careers/src/Directory.Build.props index 069102537b..40bd25cd6d 100644 --- a/src/Websites/Careers/src/Directory.Build.props +++ b/src/Websites/Careers/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj index 5eafd8db02..3d4ef73e2c 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj @@ -32,16 +32,16 @@ - - - - - - + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor index af3b7b85e0..1c9ecb1cfc 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor @@ -153,7 +153,7 @@ rm $HOME/dotnet.tar.gz
  • Install Bit Boilerplate project template
    - dotnet new install Bit.Boilerplate::10.4.1 + dotnet new install Bit.Boilerplate::10.4.2-pre-01
  • @if (showCrossPlatform && devOS is "Windows") { diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs index 724320ec44..02f65f8472 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs @@ -43,7 +43,7 @@ public partial class Templates03GettingStartedPage command:"dotnet tool install -g Aspire.Cli"), (text:@"echo 'Install the Bit.Boilerplate project template https://www.nuget.org/packages/Boilerplate.Templates';", - command:"dotnet new install Bit.Boilerplate::10.4.1;") + command:"dotnet new install Bit.Boilerplate::10.4.2-pre-01;") ]; if (enableVirtualization) diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js index f680fe45f5..4469200c68 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj index 6380c16e27..0af5a147f4 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj @@ -12,12 +12,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj index f63ac521f6..fd7e78dc74 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj @@ -6,11 +6,11 @@
    - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Directory.Build.props b/src/Websites/Platform/src/Directory.Build.props index 2d1ab28d83..c089a2ee3b 100644 --- a/src/Websites/Platform/src/Directory.Build.props +++ b/src/Websites/Platform/src/Directory.Build.props @@ -1,4 +1,4 @@ - + preview diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj index 5af8ee07d3..579ef75647 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js index 7287fa2bd4..b013818e00 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.1 +// bit version: 10.4.2-pre-01 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj index 7b34f2acdf..515bb499e9 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj index f63ac521f6..fd7e78dc74 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Directory.Build.props b/src/Websites/Sales/src/Directory.Build.props index e0d9959965..394b06cfd7 100644 --- a/src/Websites/Sales/src/Directory.Build.props +++ b/src/Websites/Sales/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 From effc1c6bfe86cda68a0bcf2bd6a7a18674b3f2c1 Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Sun, 8 Feb 2026 23:21:34 +0100 Subject: [PATCH 09/15] feat(templates): add MS.Agents.AI to bit Boilerplate #12058 (#12059) --- .../src/Directory.Packages.props | 1 + .../Boilerplate.Server.Api.csproj | 1 + .../Attachments/AttachmentController.cs | 48 ++- .../SignalR/AppChatbot.Tools.cs | 285 ++++++++++++++ .../Infrastructure/SignalR/AppChatbot.cs | 355 +++--------------- 5 files changed, 383 insertions(+), 307 deletions(-) create mode 100644 src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.Tools.cs diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index 59d03ebf10..15fbc8b07c 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -97,6 +97,7 @@ + diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj index 0989a43c7b..bc58320541 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj @@ -81,6 +81,7 @@ + diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs index ec50207bef..3dbcc2d450 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs @@ -215,6 +215,30 @@ private async Task UploadAttachment(Guid attachmentId, Attachment //#if (signalR == true || database == "PostgreSQL" || database == "SqlServer") if (serviceProvider.GetService() is IChatClient chatClient) { + var imageAnalysisAgent = chatClient.AsAIAgent( + instructions: """ + You are a Product Image Specialist Agent. Your role is to analyze product images for an e-commerce catalog. + + ANALYSIS PROCESS: + 1. First, examine the image contents carefully + 2. Determine if the primary subject is a car (vehicle) + 3. If it is a car, provide a detailed, SEO-friendly description + 4. If it is NOT a car, explain why it doesn't meet catalog requirements + + RESPONSE FORMAT: + Return ONLY a JSON object with: + - "isCar": boolean (true if image shows a car, false otherwise) + - "confidence": number between 0-1 indicating certainty of classification + - "alt": string with detailed description for accessibility and SEO + - "reasoning": string briefly explaining your analysis decision + + VALIDATION RULES: + - Image quality must be acceptable for catalog use + - Car must be clearly visible as the main subject + """, + name: "ProductImageAnalystAgent", + description: "Analyzes product images to ensure they meet catalog standards for car products"); + ChatOptions chatOptions = new() { ResponseFormat = ChatResponseFormat.Json, @@ -226,23 +250,35 @@ private async Task UploadAttachment(Guid attachmentId, Attachment configuration.GetRequiredSection("AI:ChatOptions").Bind(chatOptions); - var response = await chatClient.GetResponseAsync( + var response = await imageAnalysisAgent.RunAsync( messages: [ - new ChatMessage(ChatRole.System, "Return a JSON object with two properties: 'isCar' (boolean, true if the image contains a car, false otherwise) and 'alt' (string, describing the image content, focusing on the car). Do not include any other properties or text."), - new ChatMessage(ChatRole.User, "Analyze this image.") + new ChatMessage(ChatRole.User, + "Analyze this product image for our car catalog. Is this a valid car product image that meets our quality and content standards?") { Contents = [new DataContent(imageBytes, "image/webp")] } ], cancellationToken: cancellationToken, - options: chatOptions); + options: new Microsoft.Agents.AI.ChatClientAgentRunOptions(chatOptions)); if (response.Result.IsCar is false) { - logger.LogWarning("Unexpected AI response for Car detection: {Response}", response.Result.Alt); + logger.LogWarning( + "Image validation failed - Not a car product. Confidence: {Confidence}, Reasoning: {Reasoning}", + response.Result.Confidence, + response.Result.Reasoning); return BadRequest(Localizer[nameof(AppStrings.ImageNotCarError)].ToString()); } + if (response.Result.Confidence < 0.85) + { + logger.LogWarning( + "Image analysis low confidence ({Confidence}). Reasoning: {Reasoning}. Alt text: {AltText}", + response.Result.Confidence, + response.Result.Reasoning, + response.Result.Alt); + } + altText = response.Result.Alt; } //#endif @@ -286,6 +322,6 @@ private string GetFilePath(Guid attachmentId, AttachmentKind kind, string? fileN } //#if (signalR == true || database == "PostgreSQL" || database == "SqlServer") - public record AIImageReviewResponse(bool IsCar, string? Alt); + public record AIImageReviewResponse(bool IsCar, double Confidence, string? Alt, string? Reasoning); //#endif } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.Tools.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.Tools.cs new file mode 100644 index 0000000000..dcc7045a3a --- /dev/null +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.Tools.cs @@ -0,0 +1,285 @@ +//+:cnd:noEmit +using System.ComponentModel; +//#if (module == "Sales") +using Boilerplate.Server.Api.Features.Products; +//#endif +using ModelContextProtocol.Server; +using Microsoft.AspNetCore.SignalR; +using Boilerplate.Shared.Features.Diagnostic; +using Boilerplate.Server.Api.Features.Identity; +using Boilerplate.Shared.Features.Identity.Dtos; +using Boilerplate.Server.Api.Infrastructure.Services; + +namespace Boilerplate.Server.Api.Infrastructure.SignalR; + +[McpServerToolType] +public partial class AppChatbot +{ + /// + /// Returns the current date and time based on the user's timezone. + /// + [Description("Returns the current date and time based on the user's timezone.")] + [McpServerTool(Name = nameof(GetCurrentDateTime))] + private string GetCurrentDateTime([Required, Description("User's timezone id")] string timeZoneId) + { + try + { + var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); + + var userDateTime = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, timeZone); + + return $"Current date/time in user's timezone ({timeZoneId}) is {userDateTime:o}"; + } + catch + { + return $"Current date/time in utc is {DateTimeOffset.UtcNow:o}"; + } + } + + /// + /// Saves the user's email address and the conversation history for future reference. + /// + [Description("Saves the user's email address and the conversation history for future reference.")] + [McpServerTool(Name = nameof(SaveUserEmailAndConversationHistory))] + private async Task SaveUserEmailAndConversationHistory( + [Required, Description("User's email address")] string emailAddress, + [Required, Description("Full conversation history")] string conversationHistory) + { + try + { + await using var scope = serviceProvider.CreateAsyncScope(); + + // Ideally, store these in a CRM or app database, + // but for now, we'll log them! + scope.ServiceProvider.GetRequiredService>() + .LogError("Chat reported issue: User email: {emailAddress}, Conversation history: {conversationHistory}", emailAddress, conversationHistory); + + return "User email and conversation history saved successfully."; + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Failed to save user email and conversation history."; + } + } + + /// + /// Navigates the user to a specific page within the application. + /// + [Description("Navigates the user to a specific page within the application. Use this tool when the user requests to go to a particular section or feature of the app.")] + [McpServerTool(Name = nameof(NavigateToPage))] + private async Task NavigateToPage( + [Required, Description("Page URL to navigate to")] string pageUrl) + { + await EnsureSignalRConnectionIdIsPresent(); + + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + _ = await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.NAVIGATE_TO, pageUrl, CancellationToken.None); + + return "Navigation completed"; + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Navigation failed"; + } + } + + [Description(@"Displays the sign-in modal to the user and waits for either successful sign-in or cancellation")] + [McpServerTool(Name = nameof(ShowSignInModal))] + public async Task ShowSignInModal() + { + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + await EnsureSignalRConnectionIdIsPresent(); + + var accessToken = await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.SHOW_SIGN_IN_MODAL, CancellationToken.None); + + var bearerTokenProtector = bearerTokenOptions.Get(IdentityConstants.BearerScheme).BearerTokenProtector; + var accessTokenTicket = bearerTokenProtector.Unprotect(accessToken); + var user = accessTokenTicket!.Principal; + + return await scope.ServiceProvider.GetRequiredService() + .Users + .Project() + .FirstOrDefaultAsync(u => u.Id == user.GetUserId()); + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return null; + } + } + + /// + /// Changes the user's culture/language setting. + /// + [Description("Changes the user's culture/language setting. Use this tool when the user requests to change the app language. Common LCIDs: 1033=en-US, 1065=fa-IR, 1053=sv-SE, 2057=en-GB, 1043=nl-NL, 1081=hi-IN, 2052=zh-CN, 3082=es-ES, 1036=fr-FR, 1025=ar-SA, 1031=de-DE.")] + [McpServerTool(Name = nameof(SetCulture))] + private async Task SetCulture( + [Required, Description("Culture LCID (e.g., 1033 for en-US, 1065 for fa-IR)")] int cultureLcid) + { + await EnsureSignalRConnectionIdIsPresent(); + + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + var culture = CultureInfo.GetCultureInfo(cultureLcid); + + if (CultureInfoManager.SupportedCultures.All(c => c.Culture.LCID != cultureLcid)) + return $"The requested culture is not supported. Available cultures: {string.Join(", ", CultureInfoManager.SupportedCultures.Select(c => c.Culture.NativeName))}"; + + _ = await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.CHANGE_CULTURE, cultureLcid, CancellationToken.None); + + return "Culture/Language changed successfully"; + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Failed to change culture/language"; + } + } + + /// + /// Changes the user's theme preference between light and dark mode. + /// + [Description("Changes the user's theme preference between light and dark mode. Use this tool when the user requests to change the app theme or appearance.")] + [McpServerTool(Name = nameof(SetTheme))] + private async Task SetTheme( + [Required, Description("Theme name: 'light' or 'dark'")] string theme) + { + await EnsureSignalRConnectionIdIsPresent(); + + if (theme != "light" && theme != "dark") + return "Invalid theme. Use 'light' or 'dark'."; + + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + _ = await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.CHANGE_THEME, theme, CancellationToken.None); + + return $"Theme changed to {theme} successfully"; + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Failed to change theme"; + } + } + + /// + /// Retrieves the last error that occurred on the user's device from the diagnostic logs. + /// + [Description("Retrieves the last error that occurred on the user's device from the diagnostic logs. Use this tool when troubleshooting user-reported issues, investigating application crashes, or when the user mentions something isn't working.")] + [McpServerTool(Name = nameof(CheckLastError))] + private async Task CheckLastError() + { + await EnsureSignalRConnectionIdIsPresent(); + + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + var lastError = await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.UPLOAD_LAST_ERROR, CancellationToken.None); + + if (lastError is null) + return "No errors found in the diagnostic logs."; + + return lastError.ToString(); + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Failed to retrieve error information from the device."; + } + } + + /// + /// Clears application files on the user's device to fix issues. + /// + [Description("Clears application files on the user's device to fix issues.")] + [McpServerTool(Name = nameof(ClearAppFiles))] + private async Task ClearAppFiles() + { + await EnsureSignalRConnectionIdIsPresent(); + + await using var scope = serviceProvider.CreateAsyncScope(); + + try + { + await scope.ServiceProvider.GetRequiredService>() + .Clients.Client(signalRConnectionId!) + .InvokeAsync(SharedAppMessages.CLEAR_APP_FILES, CancellationToken.None); + + return "App files cleared successfully on the device."; + } + catch (Exception exp) + { + serviceProvider.GetRequiredService().Handle(exp); + return "Failed to clear app files on the device."; + } + } + + //#if (module == "Sales") + //#if (database == "PostgreSQL" || database == "SqlServer") + /// + /// Searches for and recommends products based on user's needs and preferences. + /// + [Description("This tool searches for and recommends products based on a detailed description of the user's needs and preferences and returns recommended products.")] + [McpServerTool(Name = nameof(GetProductRecommendations))] + private async Task GetProductRecommendations( + [Required, Description("Concise summary of user requirements")] string userNeeds, + [Description("Car manufacturer's name (Optional)")] string? manufacturer, + [Description("Car price below this value (Optional)")] decimal? maxPrice, + [Description("Car price above this value (Optional)")] decimal? minPrice) + { + await using var scope = serviceProvider.CreateAsyncScope(); + var productEmbeddingService = scope.ServiceProvider.GetRequiredService(); + var searchQuery = string.IsNullOrWhiteSpace(manufacturer) + ? userNeeds + : $"**{manufacturer}** {userNeeds}"; + + // Get serverApiAddress from current context + var httpContextAccessor = scope.ServiceProvider.GetService(); + var context = httpContextAccessor?.HttpContext; + var request = context?.Request; + Uri? serverApiAddress = request?.GetBaseUrl(); + + var recommendedProducts = await (await productEmbeddingService.SearchProducts(searchQuery, context?.RequestAborted ?? default)) + .WhereIf(maxPrice.HasValue, p => p.Price <= maxPrice!.Value) + .WhereIf(minPrice.HasValue, p => p.Price >= minPrice!.Value) + .Take(10) + .Project() + .Select(p => new + { + p.Name, + p.PageUrl, + Manufacturer = p.CategoryName, + Price = p.FormattedPrice, + Description = p.DescriptionText, + PreviewImageUrl = p.GetPrimaryMediumImageUrl(serverApiAddress!) ?? "_content/Boilerplate.Client.Core/images/car_placeholder.png" + }) + .ToArrayAsync(context?.RequestAborted ?? default); + + return recommendedProducts; + } + //#endif + //#endif +} diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs index f455abee97..325274c73e 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/SignalR/AppChatbot.cs @@ -1,18 +1,8 @@ //+:cnd:noEmit using System.Text; -using System.ComponentModel; using System.Threading.Channels; using Boilerplate.Shared.Features.Chatbot; -//#if (module == "Sales") -using Boilerplate.Server.Api.Features.Products; -//#endif -using Boilerplate.Shared.Features.Identity.Dtos; -using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.Authentication.BearerToken; -using ModelContextProtocol.Server; -using Boilerplate.Shared.Features.Diagnostic; -using Boilerplate.Server.Api.Features.Identity; -using Boilerplate.Server.Api.Infrastructure.Services; namespace Boilerplate.Server.Api.Infrastructure.SignalR; @@ -20,9 +10,14 @@ namespace Boilerplate.Server.Api.Infrastructure.SignalR; /// Service responsible for managing chatbot conversations, maintaining chat history, /// and handling AI interactions including getting user feedbacks, describing app's features and pages etc. /// This service is exposed over SignalR's AppHub.Chat.cs, so it can accept stream of user messages and return stream of AI responses using AiChatPanel.razor -/// Every tool method is decorated with [McpServerTool] attribute, so it can be also be used by other external MCP-Client if needed. +/// Every tool method is decorated with [McpServerTool] attribute, so it can be also be used by other external MCP-Client if needed (Checkout AppChatbot.Tools.cs) +/// +/// Microsoft.Agents.AI: +/// Workflows are not implemented in this project, but with AIAgent, achieving them is now easier compared to using IChatClient directly. +/// For example, it would be better to have separate Agents: one for product search, one for support, and one for app guidance. +/// A coordinator Agent could determine which specialized Agent to delegate the task to based on the user's message, +/// rather than having a single Agent with a very long System Prompt and many Tools. /// -[McpServerToolType] public partial class AppChatbot { private IChatClient? chatClient = default!; @@ -110,6 +105,11 @@ public async Task ProcessNewMessage( chatClient ??= serviceProvider.GetRequiredService(); + var supportAgent = chatClient.AsAIAgent( + instructions: supportSystemPrompt, + name: "SupportAgent", + description: "Provides user support, answers questions, and assists with app features and troubleshooting"); + StringBuilder assistantResponse = new(); try { @@ -119,6 +119,9 @@ public async Task ProcessNewMessage( // The following variables might change without SignalR connection restarts, so these should set here every time a new message is about to be processed. // For example, user can sign-in/sign-out during chat without restarting the app or SignalR connection. + // User can change these values using prompt injection, so it's important not to rely on these variables for critical logic or security decisions, + // but rather use them for providing better context to the model to generate more relevant responses. + // You can either check if user is authenticated or not at a time tools are being called, or add dedicated tool so the LLM model would call it to figure out the user's authentication state instead of relying on variables. var variablesPrompt = @$" ### Variables: {variablesDefault} @@ -126,12 +129,10 @@ public async Task ProcessNewMessage( {{{{UserEmail}}}}: ""{(user.IsAuthenticated() ? user!.GetEmail()?.ToString() : "null")}"" "; - await foreach (var response in chatClient.GetStreamingResponseAsync([ + await foreach (var response in supportAgent.RunStreamingAsync([ new (ChatRole.System, variablesPrompt), - new (ChatRole.System, supportSystemPrompt), - .. chatMessages, - new (ChatRole.User, incomingMessage) - ], options: chatOptions, cancellationToken: cancellationToken)) + .. chatMessages, + ], options: new Microsoft.Agents.AI.ChatClientAgentRunOptions(chatOptions), cancellationToken: cancellationToken)) { if (cancellationToken.IsCancellationRequested) break; @@ -193,274 +194,6 @@ private ChatOptions CreateChatOptions() return chatOptions; } - /// - /// Returns the current date and time based on the user's timezone. - /// - [Description("Returns the current date and time based on the user's timezone.")] - [McpServerTool(Name = nameof(GetCurrentDateTime))] - private string GetCurrentDateTime([Required, Description("User's timezone id")] string timeZoneId) - { - try - { - var timeZone = TimeZoneInfo.FindSystemTimeZoneById(timeZoneId); - - var userDateTime = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, timeZone); - - return $"Current date/time in user's timezone ({timeZoneId}) is {userDateTime:o}"; - } - catch - { - return $"Current date/time in utc is {DateTimeOffset.UtcNow:o}"; - } - } - - /// - /// Saves the user's email address and the conversation history for future reference. - /// - [Description("Saves the user's email address and the conversation history for future reference.")] - [McpServerTool(Name = nameof(SaveUserEmailAndConversationHistory))] - private async Task SaveUserEmailAndConversationHistory( - [Required, Description("User's email address")] string emailAddress, - [Required, Description("Full conversation history")] string conversationHistory) - { - try - { - await using var scope = serviceProvider.CreateAsyncScope(); - - // Ideally, store these in a CRM or app database, - // but for now, we'll log them! - scope.ServiceProvider.GetRequiredService>() - .LogError("Chat reported issue: User email: {emailAddress}, Conversation history: {conversationHistory}", emailAddress, conversationHistory); - - return "User email and conversation history saved successfully."; - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Failed to save user email and conversation history."; - } - } - - /// - /// Navigates the user to a specific page within the application. - /// - [Description("Navigates the user to a specific page within the application. Use this tool when the user requests to go to a particular section or feature of the app.")] - [McpServerTool(Name = nameof(NavigateToPage))] - private async Task NavigateToPage( - [Required, Description("Page URL to navigate to")] string pageUrl) - { - await EnsureSignalRConnectionIdIsPresent(); - - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.NAVIGATE_TO, pageUrl, CancellationToken.None); - - return "Navigation completed"; - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Navigation failed"; - } - } - - [Description(@"Displays the sign-in modal to the user and waits for either successful sign-in or cancellation")] - [McpServerTool(Name = nameof(ShowSignInModal))] - public async Task ShowSignInModal() - { - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - await EnsureSignalRConnectionIdIsPresent(); - - var accessToken = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.SHOW_SIGN_IN_MODAL, CancellationToken.None); - - var bearerTokenProtector = bearerTokenOptions.Get(IdentityConstants.BearerScheme).BearerTokenProtector; - var accessTokenTicket = bearerTokenProtector.Unprotect(accessToken); - var user = accessTokenTicket!.Principal; - - return await scope.ServiceProvider.GetRequiredService() - .Users - .Project() - .FirstOrDefaultAsync(u => u.Id == user.GetUserId()); - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return null; - } - } - - /// - /// Changes the user's culture/language setting. - /// - [Description("Changes the user's culture/language setting. Use this tool when the user requests to change the app language. Common LCIDs: 1033=en-US, 1065=fa-IR, 1053=sv-SE, 2057=en-GB, 1043=nl-NL, 1081=hi-IN, 2052=zh-CN, 3082=es-ES, 1036=fr-FR, 1025=ar-SA, 1031=de-DE.")] - [McpServerTool(Name = nameof(SetCulture))] - private async Task SetCulture( - [Required, Description("Culture LCID (e.g., 1033 for en-US, 1065 for fa-IR)")] int cultureLcid) - { - await EnsureSignalRConnectionIdIsPresent(); - - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - var culture = CultureInfo.GetCultureInfo(cultureLcid); - - if (CultureInfoManager.SupportedCultures.All(c => c.Culture.LCID != cultureLcid)) - return $"The requested culture is not supported. Available cultures: {string.Join(", ", CultureInfoManager.SupportedCultures.Select(c => c.Culture.NativeName))}"; - - _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.CHANGE_CULTURE, cultureLcid, CancellationToken.None); - - return "Culture/Language changed successfully"; - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Failed to change culture/language"; - } - } - - /// - /// Changes the user's theme preference between light and dark mode. - /// - [Description("Changes the user's theme preference between light and dark mode. Use this tool when the user requests to change the app theme or appearance.")] - [McpServerTool(Name = nameof(SetTheme))] - private async Task SetTheme( - [Required, Description("Theme name: 'light' or 'dark'")] string theme) - { - await EnsureSignalRConnectionIdIsPresent(); - - if (theme != "light" && theme != "dark") - return "Invalid theme. Use 'light' or 'dark'."; - - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - _ = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.CHANGE_THEME, theme, CancellationToken.None); - - return $"Theme changed to {theme} successfully"; - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Failed to change theme"; - } - } - - /// - /// Retrieves the last error that occurred on the user's device from the diagnostic logs. - /// - [Description("Retrieves the last error that occurred on the user's device from the diagnostic logs. Use this tool when troubleshooting user-reported issues, investigating application crashes, or when the user mentions something isn't working.")] - [McpServerTool(Name = nameof(CheckLastError))] - private async Task CheckLastError() - { - await EnsureSignalRConnectionIdIsPresent(); - - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - var lastError = await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.UPLOAD_LAST_ERROR, CancellationToken.None); - - if (lastError is null) - return "No errors found in the diagnostic logs."; - - return lastError.ToString(); - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Failed to retrieve error information from the device."; - } - } - - /// - /// Clears application files on the user's device to fix issues. - /// - [Description("Clears application files on the user's device to fix issues.")] - [McpServerTool(Name = nameof(ClearAppFiles))] - private async Task ClearAppFiles() - { - await EnsureSignalRConnectionIdIsPresent(); - - await using var scope = serviceProvider.CreateAsyncScope(); - - try - { - await scope.ServiceProvider.GetRequiredService>() - .Clients.Client(signalRConnectionId!) - .InvokeAsync(SharedAppMessages.CLEAR_APP_FILES, CancellationToken.None); - - return "App files cleared successfully on the device."; - } - catch (Exception exp) - { - serviceProvider.GetRequiredService().Handle(exp); - return "Failed to clear app files on the device."; - } - } - - //#if (module == "Sales") - //#if (database == "PostgreSQL" || database == "SqlServer") - /// - /// Searches for and recommends products based on user's needs and preferences. - /// - [Description("This tool searches for and recommends products based on a detailed description of the user's needs and preferences and returns recommended products.")] - [McpServerTool(Name = nameof(GetProductRecommendations))] - private async Task GetProductRecommendations( - [Required, Description("Concise summary of user requirements")] string userNeeds, - [Description("Car manufacturer's name (Optional)")] string? manufacturer, - [Description("Car price below this value (Optional)")] decimal? maxPrice, - [Description("Car price above this value (Optional)")] decimal? minPrice) - { - await using var scope = serviceProvider.CreateAsyncScope(); - var productEmbeddingService = scope.ServiceProvider.GetRequiredService(); - var searchQuery = string.IsNullOrWhiteSpace(manufacturer) - ? userNeeds - : $"**{manufacturer}** {userNeeds}"; - - // Get serverApiAddress from current context - var httpContextAccessor = scope.ServiceProvider.GetService(); - var context = httpContextAccessor?.HttpContext; - var request = context?.Request; - Uri? serverApiAddress = request?.GetBaseUrl(); - - var recommendedProducts = await (await productEmbeddingService.SearchProducts(searchQuery, context?.RequestAborted ?? default)) - .WhereIf(maxPrice.HasValue, p => p.Price <= maxPrice!.Value) - .WhereIf(minPrice.HasValue, p => p.Price >= minPrice!.Value) - .Take(10) - .Project() - .Select(p => new - { - p.Name, - p.PageUrl, - Manufacturer = p.CategoryName, - Price = p.FormattedPrice, - Description = p.DescriptionText, - PreviewImageUrl = p.GetPrimaryMediumImageUrl(serverApiAddress!) ?? "_content/Boilerplate.Client.Core/images/car_placeholder.png" - }) - .ToArrayAsync(context?.RequestAborted ?? default); - - return recommendedProducts; - } - //#endif - //#endif - /// /// Generate follow-up suggestions based on the conversation /// @@ -473,25 +206,45 @@ private async Task GenerateFollowUpSuggestions( // This would generate a list of follow-up questions/suggestions to keep the conversation going. // You could instead generate that list in previous chat completion call: // 1: Using "tools" or "functions" feature of the model, that would not consider the latest assistant response. - // 2: Returning a json object containing the response and follow-up suggestions all together, losing IAsyncEnumerable streaming capability. + // 2: Returning a json object containing the response and follow-up suggestions all together, losing IAsyncEnumerable streaming capability. + + var followUpAgent = chatClient!.AsAIAgent( + instructions: """ + You are a Follow-Up Suggestion Agent. Your role is to generate natural, contextual follow-up questions or actions for users. + + ANALYSIS PROCESS: + 1. Review the conversation context carefully + 2. Identify logical next steps or questions the user might ask + 3. Ensure suggestions are within the assistant's capabilities + 4. Make suggestions actionable and user-centric + + RESPONSE FORMAT: + Return ONLY a JSON object with: + - "FollowUpSuggestions": array of exactly 3 strings + + VALIDATION RULES: + - Only suggest follow-up actions/questions that are within the assistant's scope and knowledge + - Do not suggest questions that require access to data or functionality that is unavailable or out of scope + - Avoid suggesting questions that the assistant would not be able to answer + - Written from the user's perspective (never from the assistant) + - Direct, natural, clickable actions/questions + - Keep each suggestion concise (under 60 characters) + """, + name: "FollowUpSuggestionAgent", + description: "Generates contextual follow-up suggestions to keep conversations flowing naturally"); + chatOptions.ResponseFormat = ChatResponseFormat.Json; chatOptions.AdditionalProperties = new() { ["response_format"] = new { type = "json_object" } }; - var followUpItems = await chatClient!.GetResponseAsync([ - new(ChatRole.System, supportSystemPrompt), - new(ChatRole.User, incomingMessage), - new(ChatRole.Assistant, assistantResponse), - new(ChatRole.System, """ - Generate exactly 3 short suggested replies that the user would naturally type next. - Rules: - - Only suggest follow-up actions/questions that are within the assistant's scope and knowledge. - - Do not suggest questions that require access to data or functionality that is unavailable or out of scope for this assistant. - - Avoid suggesting questions that the assistant would not be able to answer. - - Written from the user's perspective (never from the assistant) - - Direct, natural, clickable actions/questions - - Return JSON object containing string[] named FollowUpSuggestions - """),], - chatOptions, cancellationToken: cancellationToken); + var followUpItems = await followUpAgent.RunAsync( + messages: [ + new(ChatRole.System, supportSystemPrompt), + new(ChatRole.User, incomingMessage), + new(ChatRole.Assistant, assistantResponse), + new(ChatRole.User, "Generate 3 short follow-up suggestions for what I might want to ask or do next.") + ], + cancellationToken: cancellationToken, + options: new Microsoft.Agents.AI.ChatClientAgentRunOptions(chatOptions)); return followUpItems.Result ?? new AiChatFollowUpList(); } From 77be6280175724edf3d468204630741c3102f39b Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Mon, 9 Feb 2026 10:32:44 +0100 Subject: [PATCH 10/15] feat(templates): add api versioning support to bit Boilerplate #12060 (#12061) --- .../Infrastructure/Data/AppOfflineDbContext.cs | 2 +- .../Bit.Boilerplate/src/Directory.Packages.props | 2 ++ .../Boilerplate.Server.Api.csproj | 3 +++ .../Features/Attachments/AttachmentController.cs | 3 ++- .../Features/Categories/CategoryController.cs | 3 ++- .../Features/Chatbot/ChatbotController.cs | 3 ++- .../Features/Dashboard/DashboardController.cs | 3 ++- .../Features/Diagnostic/DiagnosticController.cs | 3 ++- .../Features/Identity/IdentityController.cs | 3 ++- .../Features/Identity/RoleManagementController.cs | 3 ++- .../Features/Identity/UserController.cs | 7 +++++-- .../Features/Identity/UserManagementController.cs | 3 ++- .../Features/Products/ProductController.cs | 3 ++- .../Features/Products/ProductViewController.cs | 3 ++- .../PushNotification/PushNotificationController.cs | 3 ++- .../Features/Statistics/StatisticsController.cs | 3 ++- .../Features/Todo/TodoItemController.cs | 3 ++- .../Features/Todo/TodoItemTableController.cs | 3 ++- .../Boilerplate.Server.Api/Program.Services.cs | 14 +++++++++++++- .../Features/Attachments/IAttachmentController.cs | 2 +- .../Features/Categories/ICategoryController.cs | 2 +- .../Shared/Features/Chatbot/IChatbotController.cs | 2 +- .../Features/Dashboard/IDashboardController.cs | 2 +- .../Features/Diagnostic/IDiagnosticController.cs | 2 +- .../Features/Identity/IIdentityController.cs | 2 +- .../Features/Identity/IRoleManagementController.cs | 2 +- .../Shared/Features/Identity/IUserController.cs | 4 ++-- .../Features/Identity/IUserManagementController.cs | 2 +- .../Shared/Features/Products/IProductController.cs | 2 +- .../Features/Products/IProductViewController.cs | 2 +- .../IPushNotificationController.cs | 2 +- .../Features/Statistics/IStatisticsController.cs | 2 +- .../Shared/Features/Todo/ITodoItemController.cs | 2 +- .../Infrastructure/Extensions/TupleExtensions.cs | 8 ++++---- 34 files changed, 71 insertions(+), 37 deletions(-) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/AppOfflineDbContext.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/AppOfflineDbContext.cs index 7dc4b954cf..aaff42be08 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/AppOfflineDbContext.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Infrastructure/Data/AppOfflineDbContext.cs @@ -52,7 +52,7 @@ protected override void OnDatasyncInitialization(DatasyncOfflineOptionsBuilder o .UseHttpClientOptions(clientOptions) .Entity(options => { - options.Endpoint = new Uri("/api/TodoItemTable", UriKind.Relative); + options.Endpoint = new Uri("/api/v1/TodoItemTable", UriKind.Relative); }); } } diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index 15fbc8b07c..afcfd43cea 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -21,6 +21,8 @@ + + diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj index bc58320541..0fce461b5e 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Boilerplate.Server.Api.csproj @@ -24,6 +24,7 @@ + @@ -36,6 +37,8 @@ + + diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs index 3dbcc2d450..4415b87859 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Attachments/AttachmentController.cs @@ -13,8 +13,9 @@ namespace Boilerplate.Server.Api.Features.Attachments; -[Route("api/[controller]/[action]")] [ApiController] +[ApiVersion(1)] +[Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class AttachmentController : AppControllerBase, IAttachmentController { [AutoInject] private IBlobStorage blobStorage = default!; diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Categories/CategoryController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Categories/CategoryController.cs index caefde7d68..b162fcc4c4 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Categories/CategoryController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Categories/CategoryController.cs @@ -7,7 +7,8 @@ namespace Boilerplate.Server.Api.Features.Categories; -[ApiController, Route("api/[controller]/[action]"), +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]"), Authorize(Policy = AuthPolicies.PRIVILEGED_ACCESS), Authorize(Policy = AppFeatures.AdminPanel.ManageProductCatalog)] public partial class CategoryController : AppControllerBase, ICategoryController diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Chatbot/ChatbotController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Chatbot/ChatbotController.cs index 225f95b7fc..2ebd981a6a 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Chatbot/ChatbotController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Chatbot/ChatbotController.cs @@ -3,7 +3,8 @@ namespace Boilerplate.Server.Api.Features.Chatbot; -[ApiController, Route("api/[controller]/[action]"), +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]"), Authorize(Policy = AppFeatures.Management.ManageAiPrompt)] public partial class ChatbotController : AppControllerBase, IChatbotController { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Dashboard/DashboardController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Dashboard/DashboardController.cs index 76e28848e6..f1d04f3076 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Dashboard/DashboardController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Dashboard/DashboardController.cs @@ -2,7 +2,8 @@ namespace Boilerplate.Server.Api.Features.Dashboard; -[ApiController, Route("api/[controller]/[action]"), +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]"), Authorize(Policy = AuthPolicies.PRIVILEGED_ACCESS), Authorize(Policy = AppFeatures.AdminPanel.Dashboard)] public partial class DashboardController : AppControllerBase, IDashboardController diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Diagnostic/DiagnosticController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Diagnostic/DiagnosticController.cs index d67f52a7eb..a989133cd7 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Diagnostic/DiagnosticController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Diagnostic/DiagnosticController.cs @@ -12,8 +12,9 @@ namespace Boilerplate.Server.Api.Features.Diagnostic; +[ApiVersion(1)] [ApiController, AllowAnonymous] -[Route("api/[controller]/[action]")] +[Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class DiagnosticController : AppControllerBase, IDiagnosticController { [AutoInject] private IHostEnvironment env = default!; diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/IdentityController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/IdentityController.cs index 48e0a4bf31..08420f0ab9 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/IdentityController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/IdentityController.cs @@ -15,8 +15,9 @@ namespace Boilerplate.Server.Api.Features.Identity; +[ApiVersion(1)] [ApiController, AllowAnonymous] -[Route("api/[controller]/[action]")] +[Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class IdentityController : AppControllerBase, IIdentityController { [AutoInject] private IUserStore userStore = default!; diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/RoleManagementController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/RoleManagementController.cs index 6ee8e3f9c7..4faa990764 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/RoleManagementController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/RoleManagementController.cs @@ -12,7 +12,8 @@ namespace Boilerplate.Server.Api.Features.Identity; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] [Authorize(Policy = AppFeatures.Management.ManageRoles)] public partial class RoleManagementController : AppControllerBase, IRoleManagementController { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserController.cs index 640bb188b0..874777289a 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserController.cs @@ -19,7 +19,8 @@ namespace Boilerplate.Server.Api.Features.Identity; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class UserController : AppControllerBase, IUserController { [AutoInject] private UrlEncoder urlEncoder = default!; @@ -350,7 +351,9 @@ public async Task Delete(CancellationToken cancellationToken) throw new ResourceValidationException(result.Errors.Select(err => new LocalizedString(err.Code, err.Description)).ToArray()); } - [HttpPost, Route("~/api/[controller]/2fa")] +#pragma warning disable ASP0018 + [HttpPost, Route("~/api/v{v:apiVersion}/[controller]/2fa")] +#pragma warning restore ASP0018 public async Task TwoFactorAuth(TwoFactorAuthRequestDto request, CancellationToken cancellationToken) { var userId = User.GetUserId(); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserManagementController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserManagementController.cs index e028cd4e8a..7e15ceea68 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserManagementController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Identity/UserManagementController.cs @@ -9,7 +9,8 @@ namespace Boilerplate.Server.Api.Features.Identity; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] [Authorize(Policy = AppFeatures.Management.ManageUsers)] public partial class UserManagementController : AppControllerBase, IUserManagementController { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductController.cs index d659bf8db9..e8255c0532 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductController.cs @@ -9,7 +9,8 @@ namespace Boilerplate.Server.Api.Features.Products; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] [Authorize(Policy = AuthPolicies.PRIVILEGED_ACCESS)] [Authorize(Policy = AppFeatures.AdminPanel.ManageProductCatalog)] public partial class ProductController : AppControllerBase, IProductController diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductViewController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductViewController.cs index b0e491b05e..5944edaead 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductViewController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Products/ProductViewController.cs @@ -2,8 +2,9 @@ namespace Boilerplate.Server.Api.Features.Products; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] [AllowAnonymous] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class ProductViewController : AppControllerBase, IProductViewController { [HttpGet, EnableQuery, AppResponseCache(MaxAge = 60 * 5, SharedMaxAge = 0, UserAgnostic = true)] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/PushNotification/PushNotificationController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/PushNotification/PushNotificationController.cs index e653a4f0f7..dc1d7ac630 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/PushNotification/PushNotificationController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/PushNotification/PushNotificationController.cs @@ -3,7 +3,8 @@ namespace Boilerplate.Server.Api.Features.PushNotification; -[Route("api/[controller]/[action]")] +[ApiVersion(1)] +[Route("api/v{v:apiVersion}/[controller]/[action]")] [ApiController, AllowAnonymous] public partial class PushNotificationController : AppControllerBase, IPushNotificationController { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Statistics/StatisticsController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Statistics/StatisticsController.cs index dcf5ec3c20..a0c86d4b6c 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Statistics/StatisticsController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Statistics/StatisticsController.cs @@ -2,7 +2,8 @@ namespace Boilerplate.Server.Api.Features.Statistics; -[ApiController, Route("api/[controller]/[action]")] +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]")] public partial class StatisticsController : AppControllerBase, IStatisticsController { [AutoInject] private NugetStatisticsService nugetHttpClient = default!; diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemController.cs index 39f9bc642a..2844b49829 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemController.cs @@ -8,7 +8,8 @@ namespace Boilerplate.Server.Api.Features.Todo; // The controller that works with the offline database is implemented in TodoItemTableController.cs //#endif -[ApiController, Route("api/[controller]/[action]"), +[ApiVersion(1)] +[ApiController, Route("api/v{v:apiVersion}/[controller]/[action]"), Authorize(Policy = AuthPolicies.PRIVILEGED_ACCESS), Authorize(Policy = AppFeatures.Todo.ManageTodo)] public partial class TodoItemController : AppControllerBase, ITodoItemController diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemTableController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemTableController.cs index 6fc0b465c2..4f61e836c7 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemTableController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Features/Todo/TodoItemTableController.cs @@ -8,7 +8,8 @@ namespace Boilerplate.Server.Api.Features.Todo; /// Leverages CommunityToolkit.Datasync.Server to provide a TableController for TodoItem entities, /// that provides standard CRUD operations for Client Offline Database Sync. /// -[Route("api/[controller]/"), +[ApiVersion(1)] +[Route("api/v{v:apiVersion}/[controller]/"), Authorize(Policy = AuthPolicies.PRIVILEGED_ACCESS), Authorize(Policy = AppFeatures.Todo.ManageTodo)] public class TodoItemTableController : TableController diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs index 448dfe4df7..694fe69da3 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs @@ -253,6 +253,18 @@ CorsPolicyBuilder ApplyPolicyDefaults(CorsPolicyBuilder policy) }; }); + services.AddApiVersioning(options => + { + options.ReportApiVersions = true; + options.ApiVersionReader = new UrlSegmentApiVersionReader(); + }) + .AddMvc() // For API Controllers + .AddApiExplorer(options => + { + options.GroupNameFormat = "'v'V"; + options.SubstituteApiVersionInUrl = true; + }); + //#if (signalR == true) var signalRBuilder = services.AddSignalR(options => { @@ -292,7 +304,7 @@ CorsPolicyBuilder ApplyPolicyDefaults(CorsPolicyBuilder policy) services.AddDbContextPool(AddDbContext); void AddDbContext(DbContextOptionsBuilder options) - { + { options.EnableSensitiveDataLogging(env.IsDevelopment()) .EnableDetailedErrors(env.IsDevelopment()); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Attachments/IAttachmentController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Attachments/IAttachmentController.cs index c3184598ac..b8cff581ba 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Attachments/IAttachmentController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Attachments/IAttachmentController.cs @@ -1,7 +1,7 @@ //+:cnd:noEmit namespace Boilerplate.Shared.Features.Attachments; -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface IAttachmentController : IAppController { [HttpDelete] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Categories/ICategoryController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Categories/ICategoryController.cs index 517490719f..dde7a9d181 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Categories/ICategoryController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Categories/ICategoryController.cs @@ -1,7 +1,7 @@ //+:cnd:noEmit namespace Boilerplate.Shared.Features.Categories; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] //#if(module == "Admin") [AuthorizedApi] //#endif diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Chatbot/IChatbotController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Chatbot/IChatbotController.cs index aa4aad46ba..afba365056 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Chatbot/IChatbotController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Chatbot/IChatbotController.cs @@ -1,7 +1,7 @@ namespace Boilerplate.Shared.Features.Chatbot; [AuthorizedApi] -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IChatbotController : IAppController { [HttpGet] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Dashboard/IDashboardController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Dashboard/IDashboardController.cs index b99ddd154a..12a4d5096f 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Dashboard/IDashboardController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Dashboard/IDashboardController.cs @@ -1,6 +1,6 @@ namespace Boilerplate.Shared.Features.Dashboard; -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface IDashboardController : IAppController { [HttpGet] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Diagnostic/IDiagnosticController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Diagnostic/IDiagnosticController.cs index 4256ba70f4..4f99e5403d 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Diagnostic/IDiagnosticController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Diagnostic/IDiagnosticController.cs @@ -1,6 +1,6 @@ namespace Boilerplate.Shared.Features.Diagnostic; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IDiagnosticController : IAppController { [HttpGet("{?signalRConnectionId,pushNotificationSubscriptionDeviceId}")] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs index 72c7b2dba8..021e29b9fc 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs @@ -3,7 +3,7 @@ namespace Boilerplate.Shared.Features.Identity; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IIdentityController : IAppController { [HttpPost] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IRoleManagementController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IRoleManagementController.cs index 776d82b288..bc8daf3893 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IRoleManagementController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IRoleManagementController.cs @@ -3,7 +3,7 @@ namespace Boilerplate.Shared.Features.Identity; -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface IRoleManagementController : IAppController { [HttpGet] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserController.cs index aa6ab0e2e0..0002add7fe 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserController.cs @@ -2,7 +2,7 @@ namespace Boilerplate.Shared.Features.Identity; -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface IUserController : IAppController { [HttpGet] @@ -45,7 +45,7 @@ public interface IUserController : IAppController Task Delete(CancellationToken cancellationToken); [HttpPost] - [Route("~/api/[controller]/2fa")] + [Route("~/api/v1/[controller]/2fa")] Task TwoFactorAuth(TwoFactorAuthRequestDto request, CancellationToken cancellationToken) => default!; [HttpPost] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserManagementController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserManagementController.cs index 60b71f32e4..8cca94301b 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserManagementController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IUserManagementController.cs @@ -3,7 +3,7 @@ namespace Boilerplate.Shared.Features.Identity; -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface IUserManagementController : IAppController { [HttpGet] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductController.cs index e004b75933..91baf1645f 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductController.cs @@ -1,7 +1,7 @@ //+:cnd:noEmit namespace Boilerplate.Shared.Features.Products; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] [AuthorizedApi] public interface IProductController : IAppController { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductViewController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductViewController.cs index a879089b96..fff9d557ed 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductViewController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/IProductViewController.cs @@ -1,6 +1,6 @@ namespace Boilerplate.Shared.Features.Products; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IProductViewController : IAppController { [HttpGet] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/PushNotification/IPushNotificationController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/PushNotification/IPushNotificationController.cs index 01e2b0c56c..54bf9d2705 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/PushNotification/IPushNotificationController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/PushNotification/IPushNotificationController.cs @@ -1,6 +1,6 @@ namespace Boilerplate.Shared.Features.PushNotification; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IPushNotificationController : IAppController { [HttpPost] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Statistics/IStatisticsController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Statistics/IStatisticsController.cs index 56ef1fce84..e1b0a2e638 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Statistics/IStatisticsController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Statistics/IStatisticsController.cs @@ -1,6 +1,6 @@ namespace Boilerplate.Shared.Features.Statistics; -[Route("api/[controller]/[action]/")] +[Route("api/v1/[controller]/[action]/")] public interface IStatisticsController : IAppController { [HttpGet("{packageId}")] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Todo/ITodoItemController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Todo/ITodoItemController.cs index 3ead95f6ed..d0e9b5956d 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Todo/ITodoItemController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Todo/ITodoItemController.cs @@ -6,7 +6,7 @@ namespace Boilerplate.Shared.Features.Todo; // The controller that works with the offline database is implemented in TodoItemTableController.cs //#endif -[Route("api/[controller]/[action]/"), AuthorizedApi] +[Route("api/v1/[controller]/[action]/"), AuthorizedApi] public interface ITodoItemController : IAppController { [HttpGet("{id}")] diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Infrastructure/Extensions/TupleExtensions.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Infrastructure/Extensions/TupleExtensions.cs index 5ffdb46808..4d2b9491a5 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Infrastructure/Extensions/TupleExtensions.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Infrastructure/Extensions/TupleExtensions.cs @@ -1,4 +1,4 @@ -using System.Runtime.CompilerServices; +using System.Runtime.CompilerServices; namespace System.Threading.Tasks; @@ -16,8 +16,8 @@ namespace System.Threading.Tasks; /// ProductDto[] products; /// protected override async Task OnInitAsync() /// { -/// categories = await HttpClient.GetJsonAsync("api/categories"); // Took 150ms -/// products = await HttpClient.GetJsonAsync("api/products"); // Took 150ms +/// categories = await HttpClient.GetJsonAsync("api/v1/categories"); // Took 150ms +/// products = await HttpClient.GetJsonAsync("api/v1/products"); // Took 150ms /// // The total time is 300ms 😖 /// } /// } @@ -29,7 +29,7 @@ namespace System.Threading.Tasks; /// ProductDto[] products; /// protected override async Task OnInitAsync() /// { -/// (categories, products) = await (HttpClient.GetJsonAsync("api/categories"), HttpClient.GetJsonAsync("api/products")); // Took 150ms +/// (categories, products) = await (HttpClient.GetJsonAsync("api/v1/categories"), HttpClient.GetJsonAsync("api/v1/products")); // Took 150ms /// // The total time is 150ms 👍 /// } /// } From 893ca905a37472e4c6da467a3671721e427c15d5 Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Mon, 9 Feb 2026 15:43:29 +0100 Subject: [PATCH 11/15] feat(templates): apply bit Boilerplate api versioning on non source-generator based http api calls #12062 (#12063) --- .../Components/Pages/Products/AddOrEditProductPage.razor.cs | 2 +- .../Components/Pages/Settings/ProfileSection.razor.cs | 2 +- .../Infrastructure/Services/ResponseCacheService.cs | 2 +- .../src/Shared/Features/Identity/Dtos/UserDto.cs | 2 +- .../src/Shared/Features/Identity/IIdentityController.cs | 2 +- .../Bit.Boilerplate/src/Shared/Features/Products/ProductDto.cs | 2 +- .../Boilerplate/Bit.Boilerplate/src/Shared/Features/Readme.md | 2 +- 7 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Products/AddOrEditProductPage.razor.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Products/AddOrEditProductPage.razor.cs index b7134effd2..4bc7db4261 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Products/AddOrEditProductPage.razor.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Products/AddOrEditProductPage.razor.cs @@ -123,7 +123,7 @@ private async Task RemoveProductImage() private async Task GetUploadUrl() { - var uploadUrl = new Uri(AbsoluteServerAddress, $"/api/Attachment/UploadProductPrimaryImage/{Id ?? product.Id}").ToString(); + var uploadUrl = new Uri(AbsoluteServerAddress, $"/api/v1/Attachment/UploadProductPrimaryImage/{Id ?? product.Id}").ToString(); if (CultureInfoManager.InvariantGlobalization is false) { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Settings/ProfileSection.razor.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Settings/ProfileSection.razor.cs index de0134589f..54ce39b1f9 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Settings/ProfileSection.razor.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Core/Components/Pages/Settings/ProfileSection.razor.cs @@ -116,7 +116,7 @@ private void PublishUserDataUpdated() private async Task GetUploadUrl() { - var uploadUrl = new Uri(AbsoluteServerAddress, $"/api/Attachment/UploadUserProfilePicture").ToString(); + var uploadUrl = new Uri(AbsoluteServerAddress, $"/api/v1/Attachment/UploadUserProfilePicture").ToString(); if (CultureInfoManager.InvariantGlobalization is false) { diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/ResponseCacheService.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/ResponseCacheService.cs index 6a21473f47..1aceca30c9 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/ResponseCacheService.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Infrastructure/Services/ResponseCacheService.cs @@ -41,7 +41,7 @@ public async Task PurgeCache(params string[] relativePaths) //#if (module == "Sales" || module == "Admin") public async Task PurgeProductCache(int shortId) { - await PurgeCache("/", $"/product/{shortId}", $"/api/ProductView/Get/{shortId}"); + await PurgeCache("/", $"/product/{shortId}", $"/api/v1/ProductView/Get/{shortId}"); } //#endif diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/Dtos/UserDto.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/Dtos/UserDto.cs index 5ab9a221c8..cd8a0b1e11 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/Dtos/UserDto.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/Dtos/UserDto.cs @@ -44,7 +44,7 @@ public partial class UserDto : IValidatableObject { return HasProfilePicture is false ? null - : new Uri(absoluteServerAddress, $"/api/Attachment/GetAttachment/{Id}/{AttachmentKind.UserProfileImageSmall}?v={Version}").ToString(); + : new Uri(absoluteServerAddress, $"/api/v1/Attachment/GetAttachment/{Id}/{AttachmentKind.UserProfileImageSmall}?v={Version}").ToString(); } public IEnumerable Validate(ValidationContext validationContext) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs index 021e29b9fc..e445bd6865 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Identity/IIdentityController.cs @@ -24,7 +24,7 @@ public interface IIdentityController : IAppController [HttpPost] Task ResetPassword(ResetPasswordRequestDto request, CancellationToken cancellationToken); - public const string RefreshUri = "api/Identity/Refresh"; + public const string RefreshUri = "api/v1/Identity/Refresh"; [HttpPost] Task Refresh(RefreshTokenRequestDto request, CancellationToken cancellationToken) => default!; diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/ProductDto.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/ProductDto.cs index e12f8a20c5..5fd04aa0cc 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/ProductDto.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Products/ProductDto.cs @@ -49,7 +49,7 @@ public partial class ProductDto { return HasPrimaryImage is false ? null - : new Uri(absoluteServerAddress, $"/api/Attachment/GetAttachment/{Id}/{AttachmentKind.ProductPrimaryImageMedium}?v={Version}").ToString(); + : new Uri(absoluteServerAddress, $"/api/v1/Attachment/GetAttachment/{Id}/{AttachmentKind.ProductPrimaryImageMedium}?v={Version}").ToString(); } public string FormattedPrice => FormatPrice(); diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Readme.md b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Readme.md index 9ba173677f..f7fb9bed0e 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Readme.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Shared/Features/Readme.md @@ -40,7 +40,7 @@ Task Refresh(RefreshRequestDto body); **Convention Over Configuration:** -While following the Convention over Configuration principle, methods like `GetCurrentUser` in `IUserController` send requests to `api/User/GetCurrentUser`, +While following the Convention over Configuration principle, methods like `GetCurrentUser` in `IUserController` send requests to `api/v1/User/GetCurrentUser`, you are not bound by this convention. Use any `RoutePrefix` you prefer, as long as your API is accepting/returning json you're all set! **Important**: IAppControllers support pre-render state internally using `IPrerenderStateService`, so you don't need to handle it manually using `PersistentComponentState` or `[PersistentState]`. From 7b9dd22f5cba63b238539dfdc38010342d4a8029 Mon Sep 17 00:00:00 2001 From: Yas Moradi Date: Mon, 9 Feb 2026 16:52:01 +0100 Subject: [PATCH 12/15] feat(templates): use isolated hangfire job storages for concurrent integration tests #12064 (#12065) --- .../Program.Services.cs | 33 ++++++++++--------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs index 694fe69da3..f4919370fc 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs @@ -573,22 +573,7 @@ void AddDbContext(DbContextOptionsBuilder options) // Configure Hangfire to use Redis for persistent background job storage builder.Services.AddHangfire((sp, hangfireConfiguration) => { - if (appSettings.Hangfire?.UseIsolatedStorage is true) - { - hangfireConfiguration.UseEFCoreStorage(optionsBuilder => - { - var connectionString = "Data Source=BoilerplateJobs.db;Mode=Memory;Cache=Shared;"; - var connection = new Microsoft.Data.Sqlite.SqliteConnection(connectionString); - connection.Open(); - AppContext.SetData("ReferenceTheKeepTheInMemorySQLiteDatabaseAlive", connection); - optionsBuilder.UseSqlite(connectionString); - }, new() - { - Schema = "jobs", - QueuePollInterval = new TimeSpan(0, 0, 1) - }).UseDatabaseCreator(); - } - else + if (appSettings.Hangfire?.UseIsolatedStorage is not true) { //#if (redis == true) hangfireConfiguration.UseRedisStorage(sp.GetRequiredService(), new RedisStorageOptions @@ -611,6 +596,22 @@ void AddDbContext(DbContextOptionsBuilder options) hangfireConfiguration.SetDataCompatibilityLevel(CompatibilityLevel.Version_180); }); + if (appSettings.Hangfire?.UseIsolatedStorage is true) + { + services.AddSingleton(sp => new EFCoreStorage(optionsBuilder => + { + var connectionString = "Data Source=BoilerplateJobs.db;Mode=Memory;Cache=Shared;"; + var connection = new Microsoft.Data.Sqlite.SqliteConnection(connectionString); + connection.Open(); + AppContext.SetData("ReferenceTheKeepTheInMemorySQLiteDatabaseAlive", connection); + optionsBuilder.UseSqlite(connectionString); + }, new() + { + Schema = "jobs", + QueuePollInterval = new TimeSpan(0, 0, 1) + })); + } + builder.Services.AddHangfireServer(options => { options.SchedulePollingInterval = TimeSpan.FromSeconds(5); From 313b22d97398f81b3f4849f47e1c880c8d5de895 Mon Sep 17 00:00:00 2001 From: Saleh Yusefnejad Date: Tue, 10 Feb 2026 10:49:44 +0330 Subject: [PATCH 13/15] feat(blazorui): add RowTemplate parameter to BitDataGrid #12066 (#12068) --- .../Components/DataGrid/BitDataGrid.razor | 20 +- .../Components/DataGrid/BitDataGrid.razor.cs | 6 + .../DataGrid/BitDataGridRowTemplateArgs.cs | 24 +++ .../Extras/DataGrid/BitDataGridDemo.razor | 49 ++++- .../Extras/DataGrid/BitDataGridDemo.razor.cs | 54 +++++- .../DataGrid/BitDataGridDemo.razor.samples.cs | 173 +++++++++++++++++- .../DataGrid/BitDataGridDemo.razor.scss | 14 +- 7 files changed, 330 insertions(+), 10 deletions(-) create mode 100644 src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGridRowTemplateArgs.cs diff --git a/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor index 43f8c2d2dc..a3e59460a4 100644 --- a/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor +++ b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor @@ -26,7 +26,7 @@ TItem="(int RowIndex, TGridItem Data)" ItemsProvider="@ProvideVirtualizedItems" ItemContent="@(item => builder => RenderRow(builder, item.RowIndex, item.Data))" - Placeholder="@(placeholderContext => builder => RenderPlaceholderRow(builder, placeholderContext))" /> + Placeholder="@(placeholderContext => builder => RenderPlaceholderRow(builder, placeholderContext))" /> } else { @@ -71,6 +71,24 @@ } private void RenderRow(RenderTreeBuilder __builder, int rowIndex, TGridItem item) + { + if (RowTemplate is null) + { + RenderOriginalRow(__builder, rowIndex, item); + } + else + { + var args = new BitDataGridRowTemplateArgs + { + RowIndex = rowIndex, + RowItem = item, + OriginalRow = (builder) => RenderOriginalRow(builder, rowIndex, item) + }; + __builder.AddContent(0, RowTemplate(args)); + } + } + + private void RenderOriginalRow(RenderTreeBuilder __builder, int rowIndex, TGridItem item) { @foreach (var col in _columns) diff --git a/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor.cs b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor.cs index 47ba97a8de..64ba6a6192 100644 --- a/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor.cs +++ b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGrid.razor.cs @@ -173,6 +173,12 @@ public BitDataGrid() /// [Parameter] public Func? RowStyleSelector { get; set; } + /// + /// Optional template to customize row rendering. Receives with + /// set to the default row content; call it to render the original cells or replace with custom content. + /// + [Parameter] public RenderFragment>? RowTemplate { get; set; } + /// /// A theme name, with default value "default". This affects which styling rules match the table. /// diff --git a/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGridRowTemplateArgs.cs b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGridRowTemplateArgs.cs new file mode 100644 index 0000000000..724790881d --- /dev/null +++ b/src/BlazorUI/Bit.BlazorUI.Extras/Components/DataGrid/BitDataGridRowTemplateArgs.cs @@ -0,0 +1,24 @@ +namespace Bit.BlazorUI; + +/// +/// Arguments passed to the render fragment. +/// +/// The type of data represented by each row in the grid. +public class BitDataGridRowTemplateArgs +{ + /// + /// A render fragment that produces the original row markup (the default <tr> with all column cells). + /// Render this in your custom template to include the default row, or omit it to replace entirely. + /// + public required RenderFragment OriginalRow { get; set; } + + /// + /// The 1-based row index used for accessibility (e.g. aria-rowindex). + /// + public int RowIndex { get; set; } + + /// + /// The data item for this row. + /// + public T RowItem { get; set; } = default!; +} diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor index a2bd78a17f..8bafb04bfa 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor @@ -1,4 +1,4 @@ -@page "/components/datagrid" +@page "/components/datagrid" @page "/components/data-grid" @inherits AppComponentBase @using Demo.Shared.Dtos.DataGridDemo @@ -135,8 +135,11 @@
    The BitDataGrid does not have the Responsive feature built-in, - but you can achieve some level of responsiveness like what we did in this sample:
    + but you can achieve some level of responsiveness like what we did in this sample: + +
    +
    @@ -149,5 +152,47 @@
    + +
    See the RowTemplate parameter in action:
    + +
    + +
    + + + + + + + + + + + + + @args.OriginalRow + @if (expandedRowTemplateCodes.Contains(args.RowItem.Code)) + { + + +
    + Additional data: + Code: [@args.RowItem.Code] — + Gold: [@args.RowItem.Medals.Gold], + Silver: [@args.RowItem.Medals.Silver], + Bronze: [@args.RowItem.Medals.Bronze] + (Total: @args.RowItem.Medals.Total) +
    + + + } +
    +
    + +
    +
    + diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.cs b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.cs index 34dd91bbb9..90210e52fe 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.cs +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.cs @@ -84,6 +84,8 @@ or an EntityFramework DataSet or an IQueryable derived from it. causing the grid to fetch and render only the current page of data. This is normally used in conjunction with a Paginator component or some other UI logic that displays and updates the supplied BitDataGridPaginationState instance.", + LinkType = LinkType.Link, + Href = "#pagination-state", }, new() { @@ -122,6 +124,16 @@ This is normally used in conjunction with a Paginator component or some other UI Description = @"The function to generate the CSS style of each row of the data grid.", }, new() + { + Name = "RowTemplate", + Type = "RenderFragment>?", + DefaultValue = "null", + Description = @"Optional template to customize row rendering. Receives BitDataGridRowTemplateArgs with OriginalRow + set to the default row content; render it to include the original row, or omit to replace entirely.", + LinkType = LinkType.Link, + Href = "#row-template-args", + }, + new() { Name = "Theme", Type = "string?", @@ -142,7 +154,7 @@ scrolling and causes the grid to fetch and render only the data around the curre private readonly List componentSubClasses = [ new() - { + { Id = "BitDataGridColumnBase", Title = "BitDataGridColumnBase", Description = "BitDataGrid has two built-in column types, BitDataGridPropertyColumn and BitDataGridTemplateColumn. You can also create your own column types by subclassing ColumnBase he BitDataGridColumnBase type, which all column must derive from, offers some common parameters", @@ -385,6 +397,36 @@ UI will be included in the header cell by default. ], }, + new() + { + Id = "row-template-args", + Title = "BitDataGridRowTemplateArgs", + Description = "Arguments passed to the RowTemplate render fragment.", + Parameters = + [ + new() + { + Name = "OriginalRow", + Type = "RenderFragment?", + DefaultValue = "null", + Description = "A render fragment that produces the original row markup (the default with all column cells). Render this to include the default row, or omit to replace entirely.", + }, + new() + { + Name = "RowIndex", + Type = "int", + DefaultValue = "0", + Description = "The 1-based row index used for accessibility (e.g. aria-rowindex).", + }, + new() + { + Name = "RowItem", + Type = "TGridItem", + DefaultValue = "", + Description = "The data item for this row.", + }, + ], + }, ]; private readonly List componentSubEnums = @@ -518,6 +560,16 @@ UI will be included in the header cell by default. private BitDataGridPaginationState pagination2 = new() { ItemsPerPage = 7 }; private BitDataGridPaginationState pagination3 = new() { ItemsPerPage = 7 }; private BitDataGridPaginationState pagination6 = new() { ItemsPerPage = 7 }; + private BitDataGridPaginationState pagination7 = new() { ItemsPerPage = 7 }; + + private HashSet expandedRowTemplateCodes = []; + + private void ToggleRowRendererExpand(string code) + { + if (expandedRowTemplateCodes.Remove(code)) return; + + expandedRowTemplateCodes.Add(code); + } private IQueryable? FilteredItems1 => allCountries?.Where(x => x.Name.Contains(typicalSampleNameFilter1 ?? string.Empty, StringComparison.CurrentCultureIgnoreCase)); private IQueryable? FilteredItems2 => allCountries?.Where(x => x.Name.Contains(typicalSampleNameFilter2 ?? string.Empty, StringComparison.CurrentCultureIgnoreCase)); diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.samples.cs b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.samples.cs index d9b22c5ca0..09c8c0c0e6 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.samples.cs +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.samples.cs @@ -951,22 +951,20 @@ protected override async Task OnInitializedAsync() } } +
    - + c.Name)"" /> c.Medals.Gold)"" /> c.Medals.Silver)"" /> c.Medals.Bronze)"" /> c.Medals.Total)"" /> - +
    "; private readonly string example6CsharpCode = @" private IQueryable allCountries; -private string typicalSampleNameFilter = string.Empty; private BitDataGridPaginationState pagination = new() { ItemsPerPage = 7 }; -private IQueryable FilteredItems => - allCountries?.Where(x => x.Name.Contains(typicalSampleNameFilter ?? string.Empty, StringComparison.CurrentCultureIgnoreCase)); protected override async Task OnInitializedAsync() { @@ -1066,6 +1064,171 @@ public class CountryModel public MedalsModel Medals { get; set; } } +public class MedalsModel +{ + public int Gold { get; set; } + public int Silver { get; set; } + public int Bronze { get; set; } + public int Total => Gold + Silver + Bronze; +}"; + + private readonly string example7RazorCode = @" + + +
    + + + + ToggleRowRendererExpand(context.Code))"" /> + + c.Name)"" /> + c.Medals.Gold)"" /> + c.Medals.Silver)"" /> + c.Medals.Bronze)"" /> + c.Medals.Total)"" /> + + + @args.OriginalRow + @if (expandedRowTemplateCodes.Contains(args.RowItem.Code)) + { + + +
    + Additional data: + Code: [@args.RowItem.Code] — + Gold: [@args.RowItem.Medals.Gold], + Silver: [@args.RowItem.Medals.Silver], + Bronze: [@args.RowItem.Medals.Bronze] + (Total: @args.RowItem.Medals.Total) +
    + + + } +
    +
    + +
    "; + private readonly string example7CsharpCode = @" +private IQueryable allCountries; +private BitDataGridPaginationState pagination = new() { ItemsPerPage = 7 }; + +protected override async Task OnInitializedAsync() +{ + allCountries = _countries.AsQueryable(); +} + +private HashSet expandedRowTemplateCodes = []; + +private void ToggleRowRendererExpand(string code) +{ + if (expandedRowTemplateCodes.Remove(code)) return; + + expandedRowTemplateCodes.Add(code); +} + +private static readonly CountryModel[] _countries = +[ + new CountryModel { Code = ""AR"", Name = ""Argentina"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 2 } }, + new CountryModel { Code = ""AM"", Name = ""Armenia"", Medals = new MedalsModel { Gold = 0, Silver = 2, Bronze = 2 } }, + new CountryModel { Code = ""AU"", Name = ""Australia"", Medals = new MedalsModel { Gold = 17, Silver = 7, Bronze = 22 } }, + new CountryModel { Code = ""AT"", Name = ""Austria"", Medals = new MedalsModel { Gold = 1, Silver = 1, Bronze = 5 } }, + new CountryModel { Code = ""AZ"", Name = ""Azerbaijan"", Medals = new MedalsModel { Gold = 0, Silver = 3, Bronze = 4 } }, + new CountryModel { Code = ""BS"", Name = ""Bahamas"", Medals = new MedalsModel { Gold = 2, Silver = 0, Bronze = 0 } }, + new CountryModel { Code = ""BH"", Name = ""Bahrain"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""BY"", Name = ""Belarus"", Medals = new MedalsModel { Gold = 1, Silver = 3, Bronze = 3 } }, + new CountryModel { Code = ""BE"", Name = ""Belgium"", Medals = new MedalsModel { Gold = 3, Silver = 1, Bronze = 3 } }, + new CountryModel { Code = ""BM"", Name = ""Bermuda"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 0 } }, + new CountryModel { Code = ""BW"", Name = ""Botswana"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""BR"", Name = ""Brazil"", Medals = new MedalsModel { Gold = 7, Silver = 6, Bronze = 8 } }, + new CountryModel { Code = ""BF"", Name = ""Burkina Faso"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""CA"", Name = ""Canada"", Medals = new MedalsModel { Gold = 7, Silver = 6, Bronze = 11 } }, + new CountryModel { Code = ""TW"", Name = ""Chinese Taipei"", Medals = new MedalsModel { Gold = 2, Silver = 4, Bronze = 6 } }, + new CountryModel { Code = ""CO"", Name = ""Colombia"", Medals = new MedalsModel { Gold = 0, Silver = 4, Bronze = 1 } }, + new CountryModel { Code = ""CI"", Name = ""Côte d'Ivoire"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""HR"", Name = ""Croatia"", Medals = new MedalsModel { Gold = 3, Silver = 3, Bronze = 2 } }, + new CountryModel { Code = ""CU"", Name = ""Cuba"", Medals = new MedalsModel { Gold = 7, Silver = 3, Bronze = 5 } }, + new CountryModel { Code = ""CZ"", Name = ""Czech Republic"", Medals = new MedalsModel { Gold = 4, Silver = 4, Bronze = 3 } }, + new CountryModel { Code = ""DK"", Name = ""Denmark"", Medals = new MedalsModel { Gold = 3, Silver = 4, Bronze = 4 } }, + new CountryModel { Code = ""DO"", Name = ""Dominican Republic"", Medals = new MedalsModel { Gold = 0, Silver = 3, Bronze = 2 } }, + new CountryModel { Code = ""EC"", Name = ""Ecuador"", Medals = new MedalsModel { Gold = 2, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""EE"", Name = ""Estonia"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""ET"", Name = ""Ethiopia"", Medals = new MedalsModel { Gold = 1, Silver = 1, Bronze = 2 } }, + new CountryModel { Code = ""FJ"", Name = ""Fiji"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""FI"", Name = ""Finland"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 2 } }, + new CountryModel { Code = ""FR"", Name = ""France"", Medals = new MedalsModel { Gold = 10, Silver = 12, Bronze = 11 } }, + new CountryModel { Code = ""GE"", Name = ""Georgia"", Medals = new MedalsModel { Gold = 2, Silver = 5, Bronze = 1 } }, + new CountryModel { Code = ""DE"", Name = ""Germany"", Medals = new MedalsModel { Gold = 10, Silver = 11, Bronze = 16 } }, + new CountryModel { Code = ""GH"", Name = ""Ghana"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""GB"", Name = ""Great Britain"", Medals = new MedalsModel { Gold = 22, Silver = 21, Bronze = 22 } }, + new CountryModel { Code = ""GR"", Name = ""Greece"", Medals = new MedalsModel { Gold = 2, Silver = 1, Bronze = 1 } }, + new CountryModel { Code = ""GD"", Name = ""Grenada"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""HK"", Name = ""Hong Kong, China"", Medals = new MedalsModel { Gold = 1, Silver = 2, Bronze = 3 } }, + new CountryModel { Code = ""HU"", Name = ""Hungary"", Medals = new MedalsModel { Gold = 6, Silver = 7, Bronze = 7 } }, + new CountryModel { Code = ""ID"", Name = ""Indonesia"", Medals = new MedalsModel { Gold = 1, Silver = 1, Bronze = 3 } }, + new CountryModel { Code = ""IE"", Name = ""Ireland"", Medals = new MedalsModel { Gold = 2, Silver = 0, Bronze = 2 } }, + new CountryModel { Code = ""IR"", Name = ""Iran"", Medals = new MedalsModel { Gold = 3, Silver = 2, Bronze = 2 } }, + new CountryModel { Code = ""IL"", Name = ""Israel"", Medals = new MedalsModel { Gold = 2, Silver = 0, Bronze = 2 } }, + new CountryModel { Code = ""IT"", Name = ""Italy"", Medals = new MedalsModel { Gold = 10, Silver = 10, Bronze = 20 } }, + new CountryModel { Code = ""JM"", Name = ""Jamaica"", Medals = new MedalsModel { Gold = 4, Silver = 1, Bronze = 4 } }, + new CountryModel { Code = ""JO"", Name = ""Jordan"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 1 } }, + new CountryModel { Code = ""KZ"", Name = ""Kazakhstan"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 8 } }, + new CountryModel { Code = ""KE"", Name = ""Kenya"", Medals = new MedalsModel { Gold = 4, Silver = 4, Bronze = 2 } }, + new CountryModel { Code = ""XK"", Name = ""Kosovo"", Medals = new MedalsModel { Gold = 2, Silver = 0, Bronze = 0 } }, + new CountryModel { Code = ""KW"", Name = ""Kuwait"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""LV"", Name = ""Latvia"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""LT"", Name = ""Lithuania"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""MY"", Name = ""Malaysia"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 1 } }, + new CountryModel { Code = ""MX"", Name = ""Mexico"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 4 } }, + new CountryModel { Code = ""MA"", Name = ""Morocco"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 0 } }, + new CountryModel { Code = ""NA"", Name = ""Namibia"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""NL"", Name = ""Netherlands"", Medals = new MedalsModel { Gold = 10, Silver = 12, Bronze = 14 } }, + new CountryModel { Code = ""NZ"", Name = ""New Zealand"", Medals = new MedalsModel { Gold = 7, Silver = 6, Bronze = 7 } }, + new CountryModel { Code = ""MK"", Name = ""North Macedonia"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""NO"", Name = ""Norway"", Medals = new MedalsModel { Gold = 4, Silver = 2, Bronze = 2 } }, + new CountryModel { Code = ""PH"", Name = ""Philippines"", Medals = new MedalsModel { Gold = 1, Silver = 2, Bronze = 1 } }, + new CountryModel { Code = ""PL"", Name = ""Poland"", Medals = new MedalsModel { Gold = 4, Silver = 5, Bronze = 5 } }, + new CountryModel { Code = ""PT"", Name = ""Portugal"", Medals = new MedalsModel { Gold = 1, Silver = 1, Bronze = 2 } }, + new CountryModel { Code = ""PR"", Name = ""Puerto Rico"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 0 } }, + new CountryModel { Code = ""QA"", Name = ""Qatar"", Medals = new MedalsModel { Gold = 2, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""KR"", Name = ""Republic of Korea"", Medals = new MedalsModel { Gold = 6, Silver = 4, Bronze = 10 } }, + new CountryModel { Code = ""MD"", Name = ""Republic of Moldova"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""RO"", Name = ""Romania"", Medals = new MedalsModel { Gold = 1, Silver = 3, Bronze = 0 } }, + new CountryModel { Code = ""SM"", Name = ""San Marino"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 2 } }, + new CountryModel { Code = ""SA"", Name = ""Saudi Arabia"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""RS"", Name = ""Serbia"", Medals = new MedalsModel { Gold = 3, Silver = 1, Bronze = 5 } }, + new CountryModel { Code = ""SK"", Name = ""Slovakia"", Medals = new MedalsModel { Gold = 1, Silver = 2, Bronze = 1 } }, + new CountryModel { Code = ""SI"", Name = ""Slovenia"", Medals = new MedalsModel { Gold = 3, Silver = 1, Bronze = 1 } }, + new CountryModel { Code = ""ZA"", Name = ""South Africa"", Medals = new MedalsModel { Gold = 1, Silver = 2, Bronze = 0 } }, + new CountryModel { Code = ""ES"", Name = ""Spain"", Medals = new MedalsModel { Gold = 3, Silver = 8, Bronze = 6 } }, + new CountryModel { Code = ""SE"", Name = ""Sweden"", Medals = new MedalsModel { Gold = 3, Silver = 6, Bronze = 0 } }, + new CountryModel { Code = ""CH"", Name = ""Switzerland"", Medals = new MedalsModel { Gold = 3, Silver = 4, Bronze = 6 } }, + new CountryModel { Code = ""SY"", Name = ""Syrian Arab Republic"", Medals = new MedalsModel { Gold = 0, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""TH"", Name = ""Thailand"", Medals = new MedalsModel { Gold = 1, Silver = 0, Bronze = 1 } }, + new CountryModel { Code = ""TR"", Name = ""Turkey"", Medals = new MedalsModel { Gold = 2, Silver = 2, Bronze = 9 } }, + new CountryModel { Code = ""TM"", Name = ""Turkmenistan"", Medals = new MedalsModel { Gold = 0, Silver = 1, Bronze = 0 } }, + new CountryModel { Code = ""UA"", Name = ""Ukraine"", Medals = new MedalsModel { Gold = 1, Silver = 6, Bronze = 12 } }, + new CountryModel { Code = ""US"", Name = ""United States of America"", Medals = new MedalsModel { Gold = 39, Silver = 41, Bronze = 33 } }, + new CountryModel { Code = ""UZ"", Name = ""Uzbekistan"", Medals = new MedalsModel { Gold = 3, Silver = 0, Bronze = 2 } }, + new CountryModel { Code = ""VE"", Name = ""Venezuela"", Medals = new MedalsModel { Gold = 1, Silver = 3, Bronze = 0 } }, +]; + +public class CountryModel +{ + public string Code { get; set; } + public string Name { get; set; } + public MedalsModel Medals { get; set; } +} + public class MedalsModel { public int Gold { get; set; } diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.scss b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.scss index 0cdee9fa7c..c77b87df9d 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.scss +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Pages/Components/Extras/DataGrid/BitDataGridDemo.razor.scss @@ -1,4 +1,4 @@ -.custom-grid { +.custom-grid { border: 1px solid; .container { @@ -117,3 +117,15 @@ } } } + +.row-template-grid { + ::deep { + .row-template-expand-col { + width: 2rem; + } + + .row-template-detail { + padding: 0.5rem; + } + } +} From 0c809e94f2b236dfb1a81c7ae9239d0ceb264492 Mon Sep 17 00:00:00 2001 From: Saleh Yusefnejad Date: Tue, 10 Feb 2026 11:50:46 +0330 Subject: [PATCH 14/15] feat(prerelease): v-10.4.2-pre-02 #12067 (#12069) --- src/Besql/Bit.Besql/wwwroot/bit-besql.js | 2 +- src/Bit.Build.props | 2 +- .../buildTransitive/Bit.BlazorES2019.targets | 8 +++---- src/BlazorUI/Bit.BlazorUI/Info.cs | 2 +- src/BlazorUI/Bit.BlazorUI/Scripts/general.ts | 2 +- .../Bit.BlazorUI.Demo.Server.csproj | 6 ++--- .../Bit.BlazorUI.Demo.Shared.csproj | 4 ++-- .../Bit.BlazorUI.Demo.Client.Core.csproj | 4 ++-- .../Bit.BlazorUI.Demo.Client.Maui.csproj | 6 ++--- .../Bit.BlazorUI.Demo.Client.Web.csproj | 6 ++--- .../wwwroot/service-worker.published.js | 2 +- .../Bit.BlazorUI.Demo.Client.Windows.csproj | 6 ++--- src/BlazorUI/Demo/Directory.Build.props | 2 +- .../Bit.Bswup.Demo/wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Bswup/Scripts/bit-bswup.progress.ts | 2 +- .../Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts | 2 +- src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts | 2 +- src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts | 2 +- .../FullDemo/Client/wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- src/Butil/Bit.Butil/Scripts/butil.ts | 2 +- .../BlazorEmpty.Client.csproj | 8 +++---- .../BlazorEmpty/BlazorEmpty.csproj | 8 +++---- .../.docs/19- Project Miscellaneous Files.md | 10 ++++----- .../Boilerplate/Bit.Boilerplate/README.md | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../src/Directory.Packages.props | 22 +++++++++---------- .../Bit.Websites.Careers.Client.csproj | 12 +++++----- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Careers.Server.csproj | 6 ++--- .../Bit.Websites.Careers.Shared.csproj | 4 ++-- .../Careers/src/Directory.Build.props | 2 +- .../Bit.Websites.Platform.Client.csproj | 14 ++++++------ .../Templates03GettingStartedPage.razor | 2 +- .../Templates03GettingStartedPage.razor.cs | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Platform.Server.csproj | 6 ++--- .../Bit.Websites.Platform.Shared.csproj | 4 ++-- .../Platform/src/Directory.Build.props | 2 +- .../Bit.Websites.Sales.Client.csproj | 12 +++++----- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Sales.Server.csproj | 6 ++--- .../Bit.Websites.Sales.Shared.csproj | 4 ++-- src/Websites/Sales/src/Directory.Build.props | 2 +- 47 files changed, 105 insertions(+), 105 deletions(-) diff --git a/src/Besql/Bit.Besql/wwwroot/bit-besql.js b/src/Besql/Bit.Besql/wwwroot/bit-besql.js index 6f76a12a97..3462d32cb0 100644 --- a/src/Besql/Bit.Besql/wwwroot/bit-besql.js +++ b/src/Besql/Bit.Besql/wwwroot/bit-besql.js @@ -1,5 +1,5 @@ var BitBesql = window.BitBesql || {}; -BitBesql.version = window['bit-besql version'] = '10.4.2-pre-01'; +BitBesql.version = window['bit-besql version'] = '10.4.2-pre-02'; BitBesql.persist = async function besqlPersist(fileName) { diff --git a/src/Bit.Build.props b/src/Bit.Build.props index d0dec94679..9947d05a48 100644 --- a/src/Bit.Build.props +++ b/src/Bit.Build.props @@ -27,7 +27,7 @@ https://github.com/bitfoundation/bitplatform - 10.4.2-pre-01 + 10.4.2-pre-02 $(ReleaseVersion) https://github.com/bitfoundation/bitplatform/releases/tag/v-$(ReleaseVersion) $([System.String]::Copy($(ReleaseVersion)).Replace('-pre-', '.')) diff --git a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets index 829bc53eaf..b0e443bc29 100644 --- a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets +++ b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets @@ -1,13 +1,13 @@ - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) diff --git a/src/BlazorUI/Bit.BlazorUI/Info.cs b/src/BlazorUI/Bit.BlazorUI/Info.cs index 7ba5e79689..1a0dfd5327 100644 --- a/src/BlazorUI/Bit.BlazorUI/Info.cs +++ b/src/BlazorUI/Bit.BlazorUI/Info.cs @@ -8,5 +8,5 @@ public static class Info /// /// The current version string of bit BlazorUI. /// - public static string Version { get; } = "10.4.2-pre-01"; + public static string Version { get; } = "10.4.2-pre-02"; } diff --git a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts index 185792cf19..52e600442c 100644 --- a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts +++ b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts @@ -1,4 +1,4 @@ -(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.2-pre-01'; +(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.2-pre-02'; interface DotNetObject { invokeMethod(methodIdentifier: string, ...args: any[]): T; diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj index 4e695b9e91..c636376b90 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj @@ -10,12 +10,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj index 8dae19c519..32defe4a65 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj @@ -5,11 +5,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj index 3089d11fc5..44cb411772 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj @@ -16,11 +16,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj index ad0badcbe0..16a2e8bec6 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj @@ -98,13 +98,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj index 0da58b9bfe..f5f657fdc7 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj @@ -28,13 +28,13 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js index 80f535f9f7..eb1ef9b49b 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj index c80bbdaeba..5bbdd6972c 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj @@ -29,12 +29,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Directory.Build.props b/src/BlazorUI/Demo/Directory.Build.props index dd0a9db902..96bf718336 100644 --- a/src/BlazorUI/Demo/Directory.Build.props +++ b/src/BlazorUI/Demo/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js index 86e451b70e..a9e5fe7c01 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js index c5624f0b96..2052f5cfcb 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js index 61711a707f..6e40466cec 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js index db50439fdf..adb6ef0323 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 self.assetsInclude = []; self.assetsExclude = [ diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts index d5c7a03bd9..d398a92463 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts @@ -1,4 +1,4 @@ -window['bit-bswup.progress version'] = '10.4.2-pre-01'; +window['bit-bswup.progress version'] = '10.4.2-pre-02'; (function () { const _config: IBswupProgressConfigs = {}; diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts index 6b5756c83c..ebb84a1d82 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw-cleanup version'] = '10.4.2-pre-01'; +self['bit-bswup.sw-cleanup version'] = '10.4.2-pre-02'; self.addEventListener('install', e => e.waitUntil(removeBswup())); diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts index 56069db13d..fe21ca0eea 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw version'] = '10.4.2-pre-01'; +self['bit-bswup.sw version'] = '10.4.2-pre-02'; interface Window { clients: any diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts index 18f9737017..c3a6a85575 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts @@ -1,5 +1,5 @@ var BitBswup = BitBswup || {}; -BitBswup.version = window['bit-bswup version'] = '10.4.2-pre-01'; +BitBswup.version = window['bit-bswup version'] = '10.4.2-pre-02'; (function () { const bitBswupScript = document.currentScript; diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js index 1f661ab430..d05db092ae 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js index 47bf425044..3b44914fb7 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 self.assetsInclude = []; self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; diff --git a/src/Butil/Bit.Butil/Scripts/butil.ts b/src/Butil/Bit.Butil/Scripts/butil.ts index e4e17d3acc..4f422e5fde 100644 --- a/src/Butil/Bit.Butil/Scripts/butil.ts +++ b/src/Butil/Bit.Butil/Scripts/butil.ts @@ -1,2 +1,2 @@ var BitButil = BitButil || {}; -BitButil.version = window['bit-butil version'] = '10.4.2-pre-01'; \ No newline at end of file +BitButil.version = window['bit-butil version'] = '10.4.2-pre-02'; \ No newline at end of file diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj index 0ca3fadec2..3dafe6bcee 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj @@ -1,4 +1,4 @@ - + @@ -15,14 +15,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj index edab7f0f56..8e96c9ef4e 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj @@ -1,4 +1,4 @@ - + @@ -18,14 +18,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md index e65cd8f7fd..91d5c12861 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md @@ -221,7 +221,7 @@ These namespaces are **automatically imported** in every C# file, eliminating th Instead of this in each `.csproj`: ```xml - + ``` You write this in `.csproj`: @@ -231,7 +231,7 @@ You write this in `.csproj`: And the version is defined centrally in `Directory.Packages.props`: ```xml - + ``` **Benefits**: @@ -242,8 +242,8 @@ And the version is defined centrally in `Directory.Packages.props`: **Example packages included**: ```xml - - + + @@ -608,7 +608,7 @@ When you open the project in VS Code, you'll be prompted to install these extens **Example**: ````markdown -This project gets generated by bit-bp template v-10.4.2-pre-01 using the following command +This project gets generated by bit-bp template v-10.4.2-pre-02 using the following command ```bash dotnet new bit-bp --name Boilerplate diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/README.md b/src/Templates/Boilerplate/Bit.Boilerplate/README.md index 8eacf934f8..9e807df053 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/README.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/README.md @@ -2,7 +2,7 @@ Thank you for creating a new project with bit platform! We appreciate your trust in our platform and are excited to see what you'll build. -This project generated by bit-bp template v-10.4.2-pre-01 using the following command: +This project generated by bit-bp template v-10.4.2-pre-02 using the following command: ```bash dotnet new bit-bp diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js index 1a8550ae0b..43a8e114c8 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js @@ -1,5 +1,5 @@ //+:cnd:noEmit -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup //#if (notification == true) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index afcfd43cea..e4eade58b1 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -1,16 +1,16 @@ - + - - - - - - - - - + + + + + + + + + @@ -90,7 +90,7 @@ - + diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj index f6adb7e7bd..3938ba137c 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js index b077739fad..1c3b1bb535 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj index e022b1d989..895ce457f8 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj index fd7e78dc74..db03d5c669 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Directory.Build.props b/src/Websites/Careers/src/Directory.Build.props index 40bd25cd6d..ae7392879a 100644 --- a/src/Websites/Careers/src/Directory.Build.props +++ b/src/Websites/Careers/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj index 3d4ef73e2c..41880fd303 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj @@ -32,16 +32,16 @@ - - - - - - + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor index 1c9ecb1cfc..9704fef28e 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor @@ -153,7 +153,7 @@ rm $HOME/dotnet.tar.gz
  • Install Bit Boilerplate project template
    - dotnet new install Bit.Boilerplate::10.4.2-pre-01 + dotnet new install Bit.Boilerplate::10.4.2-pre-02
  • @if (showCrossPlatform && devOS is "Windows") { diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs index 02f65f8472..39b66e47b4 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs @@ -43,7 +43,7 @@ public partial class Templates03GettingStartedPage command:"dotnet tool install -g Aspire.Cli"), (text:@"echo 'Install the Bit.Boilerplate project template https://www.nuget.org/packages/Boilerplate.Templates';", - command:"dotnet new install Bit.Boilerplate::10.4.2-pre-01;") + command:"dotnet new install Bit.Boilerplate::10.4.2-pre-02;") ]; if (enableVirtualization) diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js index 4469200c68..942c82beec 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj index 0af5a147f4..8d60358c5b 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj @@ -12,12 +12,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj index fd7e78dc74..db03d5c669 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj @@ -6,11 +6,11 @@
    - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Directory.Build.props b/src/Websites/Platform/src/Directory.Build.props index c089a2ee3b..2d87e0f489 100644 --- a/src/Websites/Platform/src/Directory.Build.props +++ b/src/Websites/Platform/src/Directory.Build.props @@ -1,4 +1,4 @@ - + preview diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj index 579ef75647..c137307a18 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js index b013818e00..bb05319ab1 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-01 +// bit version: 10.4.2-pre-02 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj index 515bb499e9..1316c5f28e 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj index fd7e78dc74..db03d5c669 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Directory.Build.props b/src/Websites/Sales/src/Directory.Build.props index 394b06cfd7..1f7c603fdf 100644 --- a/src/Websites/Sales/src/Directory.Build.props +++ b/src/Websites/Sales/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 From 912f9f906ab9a70960a75c2a0237664e54f95abe Mon Sep 17 00:00:00 2001 From: Saleh Yusefnejad Date: Tue, 10 Feb 2026 17:13:04 +0330 Subject: [PATCH 15/15] feat(release): v-10.4.2 #12074 (#12072) --- src/Besql/Bit.Besql/wwwroot/bit-besql.js | 2 +- src/Bit.Build.props | 2 +- .../buildTransitive/Bit.BlazorES2019.targets | 8 +++---- src/BlazorUI/Bit.BlazorUI/Info.cs | 2 +- src/BlazorUI/Bit.BlazorUI/Scripts/general.ts | 2 +- .../Bit.BlazorUI.Demo.Server.csproj | 6 ++--- .../Bit.BlazorUI.Demo.Shared.csproj | 4 ++-- .../Bit.BlazorUI.Demo.Client.Core.csproj | 4 ++-- .../Bit.BlazorUI.Demo.Client.Maui.csproj | 6 ++--- .../Bit.BlazorUI.Demo.Client.Web.csproj | 6 ++--- .../wwwroot/service-worker.published.js | 2 +- .../Bit.BlazorUI.Demo.Client.Windows.csproj | 6 ++--- src/BlazorUI/Demo/Directory.Build.props | 2 +- .../Bit.Bswup.Demo/wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Bswup/Scripts/bit-bswup.progress.ts | 2 +- .../Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts | 2 +- src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts | 2 +- src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts | 2 +- .../FullDemo/Client/wwwroot/service-worker.js | 2 +- .../wwwroot/service-worker.published.js | 2 +- src/Butil/Bit.Butil/Scripts/butil.ts | 2 +- .../BlazorEmpty.Client.csproj | 8 +++---- .../BlazorEmpty/BlazorEmpty.csproj | 8 +++---- .../.docs/19- Project Miscellaneous Files.md | 10 ++++----- .../Boilerplate/Bit.Boilerplate/README.md | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../src/Directory.Packages.props | 22 +++++++++---------- .../Bit.Websites.Careers.Client.csproj | 12 +++++----- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Careers.Server.csproj | 6 ++--- .../Bit.Websites.Careers.Shared.csproj | 4 ++-- .../Careers/src/Directory.Build.props | 2 +- .../Bit.Websites.Platform.Client.csproj | 14 ++++++------ .../Templates03GettingStartedPage.razor | 2 +- .../Templates03GettingStartedPage.razor.cs | 2 +- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Platform.Server.csproj | 6 ++--- .../Bit.Websites.Platform.Shared.csproj | 4 ++-- .../Platform/src/Directory.Build.props | 2 +- .../Bit.Websites.Sales.Client.csproj | 12 +++++----- .../wwwroot/service-worker.published.js | 2 +- .../Bit.Websites.Sales.Server.csproj | 6 ++--- .../Bit.Websites.Sales.Shared.csproj | 4 ++-- src/Websites/Sales/src/Directory.Build.props | 2 +- 47 files changed, 105 insertions(+), 105 deletions(-) diff --git a/src/Besql/Bit.Besql/wwwroot/bit-besql.js b/src/Besql/Bit.Besql/wwwroot/bit-besql.js index 3462d32cb0..4bcc3d7bc6 100644 --- a/src/Besql/Bit.Besql/wwwroot/bit-besql.js +++ b/src/Besql/Bit.Besql/wwwroot/bit-besql.js @@ -1,5 +1,5 @@ var BitBesql = window.BitBesql || {}; -BitBesql.version = window['bit-besql version'] = '10.4.2-pre-02'; +BitBesql.version = window['bit-besql version'] = '10.4.2'; BitBesql.persist = async function besqlPersist(fileName) { diff --git a/src/Bit.Build.props b/src/Bit.Build.props index 9947d05a48..1a06617a3b 100644 --- a/src/Bit.Build.props +++ b/src/Bit.Build.props @@ -27,7 +27,7 @@ https://github.com/bitfoundation/bitplatform - 10.4.2-pre-02 + 10.4.2 $(ReleaseVersion) https://github.com/bitfoundation/bitplatform/releases/tag/v-$(ReleaseVersion) $([System.String]::Copy($(ReleaseVersion)).Replace('-pre-', '.')) diff --git a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets index b0e443bc29..a5f4c51749 100644 --- a/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets +++ b/src/BlazorES2019/Bit.BlazorES2019/buildTransitive/Bit.BlazorES2019.targets @@ -1,13 +1,13 @@ - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) - - + + PreserveNewest PreserveNewest wwwroot\_framework\%(Filename)%(Extension) diff --git a/src/BlazorUI/Bit.BlazorUI/Info.cs b/src/BlazorUI/Bit.BlazorUI/Info.cs index 1a0dfd5327..37d234742a 100644 --- a/src/BlazorUI/Bit.BlazorUI/Info.cs +++ b/src/BlazorUI/Bit.BlazorUI/Info.cs @@ -8,5 +8,5 @@ public static class Info /// /// The current version string of bit BlazorUI. /// - public static string Version { get; } = "10.4.2-pre-02"; + public static string Version { get; } = "10.4.2"; } diff --git a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts index 52e600442c..45fa0fd46f 100644 --- a/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts +++ b/src/BlazorUI/Bit.BlazorUI/Scripts/general.ts @@ -1,4 +1,4 @@ -(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.2-pre-02'; +(BitBlazorUI as any).version = (window as any)['bit-blazorui version'] = '10.4.2'; interface DotNetObject { invokeMethod(methodIdentifier: string, ...args: any[]): T; diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj index c636376b90..e2bb419dd5 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj @@ -10,12 +10,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj index 32defe4a65..54f6a7f05b 100644 --- a/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj +++ b/src/BlazorUI/Demo/Bit.BlazorUI.Demo.Shared/Bit.BlazorUI.Demo.Shared.csproj @@ -5,11 +5,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj index 44cb411772..95f80042b1 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Core/Bit.BlazorUI.Demo.Client.Core.csproj @@ -16,11 +16,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj index 16a2e8bec6..3d36f486cd 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Maui/Bit.BlazorUI.Demo.Client.Maui.csproj @@ -98,13 +98,13 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj index f5f657fdc7..ceb81b7de6 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/Bit.BlazorUI.Demo.Client.Web.csproj @@ -28,13 +28,13 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js index eb1ef9b49b..cf21282c09 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Web/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj index 5bbdd6972c..4cee85072c 100644 --- a/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj +++ b/src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj @@ -29,12 +29,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/BlazorUI/Demo/Directory.Build.props b/src/BlazorUI/Demo/Directory.Build.props index 96bf718336..9160774a72 100644 --- a/src/BlazorUI/Demo/Directory.Build.props +++ b/src/BlazorUI/Demo/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js index a9e5fe7c01..ed267ea846 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js index 2052f5cfcb..d1e6453736 100644 --- a/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.Demo/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; self.caseInsensitiveUrl = true; diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js index 6e40466cec..493ca3eeef 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js index adb6ef0323..2978b502d9 100644 --- a/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js +++ b/src/Bswup/Bit.Bswup.NewDemo/Bit.Bswup.NewDemo.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 self.assetsInclude = []; self.assetsExclude = [ diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts index d398a92463..867ed80ac4 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.progress.ts @@ -1,4 +1,4 @@ -window['bit-bswup.progress version'] = '10.4.2-pre-02'; +window['bit-bswup.progress version'] = '10.4.2'; (function () { const _config: IBswupProgressConfigs = {}; diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts index ebb84a1d82..818d237e75 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw-cleanup.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw-cleanup version'] = '10.4.2-pre-02'; +self['bit-bswup.sw-cleanup version'] = '10.4.2'; self.addEventListener('install', e => e.waitUntil(removeBswup())); diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts index fe21ca0eea..02bfbb0c0e 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.sw.ts @@ -1,4 +1,4 @@ -self['bit-bswup.sw version'] = '10.4.2-pre-02'; +self['bit-bswup.sw version'] = '10.4.2'; interface Window { clients: any diff --git a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts index c3a6a85575..50a49a6103 100644 --- a/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts +++ b/src/Bswup/Bit.Bswup/Scripts/bit-bswup.ts @@ -1,5 +1,5 @@ var BitBswup = BitBswup || {}; -BitBswup.version = window['bit-bswup version'] = '10.4.2-pre-02'; +BitBswup.version = window['bit-bswup version'] = '10.4.2'; (function () { const bitBswupScript = document.currentScript; diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js index d05db092ae..9b8397b6f8 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // In development, always fetch from the network and do not enable offline support. // This is because caching would make development more difficult (changes would not diff --git a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js index 3b44914fb7..1fefe90667 100644 --- a/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js +++ b/src/Bswup/FullDemo/Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 self.assetsInclude = []; self.assetsExclude = [/\.scp\.css$/, /weather\.json$/]; diff --git a/src/Butil/Bit.Butil/Scripts/butil.ts b/src/Butil/Bit.Butil/Scripts/butil.ts index 4f422e5fde..26c3e44a68 100644 --- a/src/Butil/Bit.Butil/Scripts/butil.ts +++ b/src/Butil/Bit.Butil/Scripts/butil.ts @@ -1,2 +1,2 @@ var BitButil = BitButil || {}; -BitButil.version = window['bit-butil version'] = '10.4.2-pre-02'; \ No newline at end of file +BitButil.version = window['bit-butil version'] = '10.4.2'; \ No newline at end of file diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj index 3dafe6bcee..b528ed0f13 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty.Client/BlazorEmpty.Client.csproj @@ -1,4 +1,4 @@ - + @@ -15,14 +15,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj index 8e96c9ef4e..b99a722180 100644 --- a/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj +++ b/src/Templates/BlazorEmpty/Bit.BlazorEmpty/BlazorEmpty/BlazorEmpty.csproj @@ -1,4 +1,4 @@ - + @@ -18,14 +18,14 @@ - + - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md index 91d5c12861..76b5fb6616 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/.docs/19- Project Miscellaneous Files.md @@ -221,7 +221,7 @@ These namespaces are **automatically imported** in every C# file, eliminating th Instead of this in each `.csproj`: ```xml - + ``` You write this in `.csproj`: @@ -231,7 +231,7 @@ You write this in `.csproj`: And the version is defined centrally in `Directory.Packages.props`: ```xml - + ``` **Benefits**: @@ -242,8 +242,8 @@ And the version is defined centrally in `Directory.Packages.props`: **Example packages included**: ```xml - - + + @@ -608,7 +608,7 @@ When you open the project in VS Code, you'll be prompted to install these extens **Example**: ````markdown -This project gets generated by bit-bp template v-10.4.2-pre-02 using the following command +This project gets generated by bit-bp template v-10.4.2 using the following command ```bash dotnet new bit-bp --name Boilerplate diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/README.md b/src/Templates/Boilerplate/Bit.Boilerplate/README.md index 9e807df053..b5ca1438c4 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/README.md +++ b/src/Templates/Boilerplate/Bit.Boilerplate/README.md @@ -2,7 +2,7 @@ Thank you for creating a new project with bit platform! We appreciate your trust in our platform and are excited to see what you'll build. -This project generated by bit-bp template v-10.4.2-pre-02 using the following command: +This project generated by bit-bp template v-10.4.2 using the following command: ```bash dotnet new bit-bp diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js index 43a8e114c8..b17e18f156 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/wwwroot/service-worker.published.js @@ -1,5 +1,5 @@ //+:cnd:noEmit -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup //#if (notification == true) diff --git a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props index e4eade58b1..5307eebeda 100644 --- a/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props +++ b/src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props @@ -1,16 +1,16 @@ - + - - - - - - - - - + + + + + + + + + @@ -90,7 +90,7 @@ - + diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj index 3938ba137c..21438e2cb7 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/Bit.Websites.Careers.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js index 1c3b1bb535..a7edd1254e 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj index 895ce457f8..958380bbdd 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Server/Bit.Websites.Careers.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj index db03d5c669..c4702d1294 100644 --- a/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj +++ b/src/Websites/Careers/src/Bit.Websites.Careers.Shared/Bit.Websites.Careers.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Careers/src/Directory.Build.props b/src/Websites/Careers/src/Directory.Build.props index ae7392879a..d70d70447e 100644 --- a/src/Websites/Careers/src/Directory.Build.props +++ b/src/Websites/Careers/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0 diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj index 41880fd303..4505c77d9a 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Bit.Websites.Platform.Client.csproj @@ -32,16 +32,16 @@ - - - - - - + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor index 9704fef28e..9bd50023ad 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor @@ -153,7 +153,7 @@ rm $HOME/dotnet.tar.gz
  • Install Bit Boilerplate project template
    - dotnet new install Bit.Boilerplate::10.4.2-pre-02 + dotnet new install Bit.Boilerplate::10.4.2
  • @if (showCrossPlatform && devOS is "Windows") { diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs index 39b66e47b4..92b183f838 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs @@ -43,7 +43,7 @@ public partial class Templates03GettingStartedPage command:"dotnet tool install -g Aspire.Cli"), (text:@"echo 'Install the Bit.Boilerplate project template https://www.nuget.org/packages/Boilerplate.Templates';", - command:"dotnet new install Bit.Boilerplate::10.4.2-pre-02;") + command:"dotnet new install Bit.Boilerplate::10.4.2;") ]; if (enableVirtualization) diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js index 942c82beec..f413d8a0ce 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj index 8d60358c5b..ee6cbed402 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj @@ -12,12 +12,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj index db03d5c669..c4702d1294 100644 --- a/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj +++ b/src/Websites/Platform/src/Bit.Websites.Platform.Shared/Bit.Websites.Platform.Shared.csproj @@ -6,11 +6,11 @@
    - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Platform/src/Directory.Build.props b/src/Websites/Platform/src/Directory.Build.props index 2d87e0f489..9c75fd074f 100644 --- a/src/Websites/Platform/src/Directory.Build.props +++ b/src/Websites/Platform/src/Directory.Build.props @@ -1,4 +1,4 @@ - + preview diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj index c137307a18..4499d38421 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/Bit.Websites.Sales.Client.csproj @@ -29,15 +29,15 @@ - - - - - + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js index bb05319ab1..eb106e2455 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Client/wwwroot/service-worker.published.js @@ -1,4 +1,4 @@ -// bit version: 10.4.2-pre-02 +// bit version: 10.4.2 // https://github.com/bitfoundation/bitplatform/tree/develop/src/Bswup self.assetsInclude = []; diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj index 1316c5f28e..7aa9301c7c 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Server/Bit.Websites.Sales.Server.csproj @@ -11,12 +11,12 @@ - - + + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj index db03d5c669..c4702d1294 100644 --- a/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj +++ b/src/Websites/Sales/src/Bit.Websites.Sales.Shared/Bit.Websites.Sales.Shared.csproj @@ -6,11 +6,11 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Websites/Sales/src/Directory.Build.props b/src/Websites/Sales/src/Directory.Build.props index 1f7c603fdf..8761876588 100644 --- a/src/Websites/Sales/src/Directory.Build.props +++ b/src/Websites/Sales/src/Directory.Build.props @@ -1,4 +1,4 @@ - + 14.0