Skip to content

Conversation

@ysmoradi
Copy link
Member

@ysmoradi ysmoradi commented Oct 8, 2025

closes #11470

Summary by CodeRabbit

  • New Features

    • Added MailPit support and streamlined SMTP via a single connection string in the boilerplate.
    • Improved explicit Sqlite support in AppHost flows.
  • Refactor

    • Standardized connection string keys (sqldb, sqlite, postgresdb, mysqldb, azureblobstorage, s3, smtp).
    • Simplified Email settings to only require DefaultFromEmail.
  • Documentation

    • Updated Getting Started for .NET SDK 10 (preview), Visual Studio 2026, template version 10.0.0-pre-02, and revised links; updated LocalDb text to 2025.
  • Chores

    • CI/test runner and logger adjustments; devcontainer cleanup.
    • Dependency updates, including WebView2 and ModelContextProtocol.

@coderabbitai
Copy link

coderabbitai bot commented Oct 8, 2025

Important

Review skipped

Auto incremental reviews are disabled on this repository.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Note

Other AI code review bot(s) detected

CodeRabbit has detected other AI code review bot(s) in this pull request and will avoid duplicating their findings in the review comments. This may lead to a less comprehensive review.

Walkthrough

This PR updates CI/test configurations, renames connection-string keys, migrates tests to MSTest v4/Microsoft.Testing.Platform, adjusts devcontainer extensions, upgrades various package versions, refactors Boilerplate server configuration (new GetRequiredConnectionString, SMTP/storage parsing), and revises AppHost resource wiring. Several docs/pages are updated with new tooling versions and instructions.

Changes

Cohort / File(s) Summary of changes
Devcontainer cleanup
.devcontainer/devcontainer.json, src/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.json
Removed VS Code extension DominicVonk.vscode-resx-editor from extensions lists.
CI workflow test invocation updates
.github/workflows/bit.ci.yml, .github/workflows/bit.full.ci.yml, src/Templates/Boilerplate/Bit.Boilerplate/.github/workflows/ci.yml
Switched dotnet test to use --project paths; removed --logger where present; added cleanup step and renamed env var to ConnectionStrings__sqldb in full CI.
Dotnet test runner config
dotnet.config, src/Templates/Boilerplate/Bit.Boilerplate/dotnet.config
Added [dotnet.test.runner] with name = "Microsoft.Testing.Platform".
Test project migration
src/BlazorUI/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csproj, src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj
Moved to MSTest.Sdk v4; adjusted packages (Playwright MSTest v4), removed legacy test SDK/loggers; set TestingPlatform arguments and RollForward.
Unit test edits
src/BlazorUI/Bit.BlazorUI.Tests/Components/.../BitColorPickerTests.cs, .../Dropdown/BitDropdownTests.cs, .../NumberField/BitNumberFieldTests.cs, .../Nav/BitNavTests.cs, .../ProgressBar/BitProgressTests.cs, .../Utilities/Link/BitLinkTests.cs
Minor assertion/style tweaks; one assert updated to Assert.Throws; others are no-op/whitespace-equivalent.
Package version bumps (demo/platform)
src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj, src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj, src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj
Upgraded ModelContextProtocol to 0.4.0-preview.2; upgraded Microsoft.Web.WebView2 to 1.0.3537.50.
Boilerplate central dependency updates
src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props
Numerous dependency updates/removals/additions (Sentry v6 preview, Aspire host libs, WebView2, libphonenumber, OTEL, SemanticKernel, QRCoder, Playwright MSTest v4); removed some test/MSTest entries.
Boilerplate server configuration refactor
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Extensions/IConfigurationExtensions.cs, .../Program.Services.cs, .../ServerApiSettings.cs, .../appsettings.json
Added GetRequiredConnectionString; refactored to new key names (sqldb, sqlite, postgresdb, mysqldb, azureblobstorage, s3, smtp); introduced GetConnectionStringValue helper; reworked SMTP/storage parsing; removed several EmailOptions properties (kept DefaultFromEmail).
AppHost wiring changes
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Boilerplate.Server.AppHost.csproj, .../Program.cs, .../appsettings.Development.json, .../appsettings.json
Upgraded Aspire.AppHost.Sdk; added MailPit and Sqlite hosting libs; simplified DB/storage resources and references; added MailPit in run mode; added Parameters to Development config; removed Parameters from default config.
Connection-string key rename (env/config)
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Properties/launchSettings.json, .../Server/Boilerplate.Server.Web/Properties/launchSettings.json, src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/.runsettings
Renamed env/config keys from ConnectionStrings__SqliteConnectionString to ConnectionStrings__sqlite.
Website template docs updates
src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor, ...Templates03GettingStartedPage.razor.cs, .../Templates05CreateProjectPage.razor
Updated .NET SDK install steps, VS versions/ids, PATH export, template version Bit.Boilerplate::10.0.0-pre-02, removed RESX editor from VSCode setup, and changed LocalDb text to 2025.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant App as Server API Startup
  participant Cfg as IConfiguration
  participant Ext as IConfigurationExtensions
  participant Svc as Services
  participant SMTP as SmtpClient
  participant FS as File/Cloud Storage
  participant DB as Database

  App->>Ext: GetRequiredConnectionString("sqlite"/"sqldb"/"postgresdb"/"mysqldb")
  Ext->>Cfg: GetConnectionString(key)
  alt missing/empty
    Ext-->>App: throw InvalidOperationException
  else found
    Ext-->>App: connectionString
  end

  App->>App: GetConnectionStringValue(conn, "Endpoint"/"User"/"Password"/...)
  App->>Svc: Configure DB context using conn
  App->>FS: Init storage (azureblobstorage/s3/local) via parsed values

  opt SMTP configured
    App->>App: Parse SMTP values via GetConnectionStringValue
    App->>SMTP: Create SmtpClient + credentials/SSL
    App->>Svc: Register mail sender with SMTP client
  end
Loading
sequenceDiagram
  autonumber
  participant Host as AppHost
  participant Proj as Projects.*
  participant Res as Resources (DB/Storage/MailPit)
  participant Web as Server.Web
  participant Api as Server.Api
  participant Cli as Client.* 

  Host->>Proj: AddProject<Api/Web/Cli...>
  Host->>Res: Add database (SqlServer/Postgres/MySql/Sqlite)
  Host->>Res: Add storage (AzureBlob/MinIO) + MailPit (run)
  Api->>Res: WithReference(...).WaitFor(...)
  Web->>Res: WithReference(...).WaitFor(...)
  Web->>Api: WithReference(Api)
  Cli->>Api: WithReference(Api) (as applicable)
Loading

Estimated code review effort

🎯 4 (Complex) | ⏱️ ~60 minutes

Poem

In burrows of yml and csproj light,
I nibble keys to make them right—
sqldb, sqlite, neat and tight,
Tests hop to MSTest’s v4 flight,
MailPit squeaks, AppHost in sight—
Carrot-commit: configs ignite! 🥕✨

Pre-merge checks and finishing touches

❌ Failed checks (2 warnings)
Check name Status Explanation Resolution
Out of Scope Changes Check ⚠️ Warning The pull request includes extensive modifications outside the Bit Boilerplate template such as VSCode devcontainer settings, CI workflows, BlazorUI tests, demo projects, and website pages, which are unrelated to the objective of updating the Boilerplate template to use Aspire client libraries. Please isolate or remove changes unrelated to the Boilerplate template’s Aspire integration, focusing this PR solely on updating the template to use Aspire client libraries.
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (3 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title Check ✅ Passed The title succinctly captures the primary goal of refactoring Aspire configuration within the Bit Boilerplate template and refers directly to the main change set, avoiding unrelated details or generic phrasing.
Linked Issues Check ✅ Passed The changes to the Bit Boilerplate template’s Directory.Packages.props and Server AppHost project update and add Aspire packages and integrate the Aspire hosting SDK usage per the linked issue’s requirement to use Aspire client libraries within the template.

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

This PR refactors Aspire configuration in the bit Boilerplate to modernize the testing infrastructure and improve the development experience. The changes focus on updating testing frameworks, connection string naming conventions, and package versions while adding new features like Sqlite support and improved email configuration.

Key changes include:

  • Migration from traditional MSTest to MSTest.Sdk v4 for better testing experience
  • Standardization of connection string naming conventions across all database providers
  • Addition of Sqlite database support with Aspire integration
  • Simplification of email configuration by removing local folder storage and integrating SMTP directly

Reviewed Changes

Copilot reviewed 37 out of 37 changed files in this pull request and generated 6 comments.

Show a summary per file
File Description
src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj Migrated to MSTest.Sdk v4 and updated Playwright package
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs Added Sqlite support, simplified connection strings, and integrated MailPit for development
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs Refactored connection string handling and simplified email configuration
src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props Updated package versions and added new Aspire/testing packages
src/BlazorUI/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csproj Migrated BlazorUI tests to MSTest.Sdk v4
src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/ Updated installation instructions to reflect .NET 10 and Visual Studio 2026

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 6

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (4)
src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj (1)

1-10: Define or import InstallNodejsDependencies in Bit.BlazorUI.Demo.Server.csproj
CI invokes InstallNodejsDependencies for all projects, but this server project doesn’t define or import it, causing the build to fail. Add a stub target in src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj or import the shared targets:

<Target Name="InstallNodejsDependencies" Condition="'$(CI)'=='true'">
  <Message Importance="high" Text="Skip Node.js install on server project."/>
</Target>
src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates05CreateProjectPage.razor (2)

81-81: Minor copy fixes (typos/casing).

  • Line 81: “MySql” → “MySQL”
  • Line 122: “noteable” → “notable”
  • Line 148: “Github” → “GitHub”, also “CI/ CD” → “CI/CD”
  • Line 153: “Azure Devops” → “Azure DevOps”
  • Line 181: “api” → “API”
  • Line 262: “Androiod” → “Android”

Also applies to: 122-122, 148-148, 153-153, 181-181, 262-262


64-68: Replace LocalDB “2025” with SQL Server Express LocalDB 2022 and link official docs

-                        You can use Sql Server LocalDb 2025 for development purposes.
+                        You can use SQL Server Express LocalDB 2022 for development purposes.

Update or replace the direct MSI link with the official Microsoft Docs guidance for SQL Server Express LocalDB installation & usage.

src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj (1)

1-1: Add missing InstallNodejsDependencies target to Windows client project
The Bit.BlazorUI.Demo.Client.Windows.csproj is missing the <CallTarget Targets="InstallNodejsDependencies"/> and its corresponding <Target Name="InstallNodejsDependencies" …> (see Bit.BlazorUI.Demo.Client.Core.csproj lines 76–82 for reference). Add those entries so CI can locate and run the Node.js dependency installation step.

🧹 Nitpick comments (13)
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs (2)

277-277: Consider caching the MySql connection string.

The connection string for MySql is retrieved twice on the same line. While not incorrect, caching it would be slightly more efficient.

Apply this diff to cache the connection string:

-            options.UseMySql(configuration.GetRequiredConnectionString("mysqldb"), ServerVersion.AutoDetect(configuration.GetRequiredConnectionString("mysqldb")), dbOptions =>
+            var mysqlConnectionString = configuration.GetRequiredConnectionString("mysqldb");
+            options.UseMySql(mysqlConnectionString, ServerVersion.AutoDetect(mysqlConnectionString), dbOptions =>

673-682: Enhance connection string parsing for edge cases.

The current implementation works for simple connection strings but may fail with:

  1. Whitespace around keys or values
  2. Escaped semicolons in values
  3. Quoted values
  4. Case-sensitive key matching

Consider these improvements for production robustness.

Apply this diff to improve the parser:

 private static string GetConnectionStringValue(string connectionString, string key, string? defaultValue = null)
 {
     var parts = connectionString.Split(';');
     foreach (var part in parts)
     {
-        if (part.StartsWith($"{key}="))
-            return part[$"{key}=".Length..];
+        var trimmedPart = part.Trim();
+        if (trimmedPart.StartsWith($"{key}=", StringComparison.OrdinalIgnoreCase))
+        {
+            var value = trimmedPart[$"{key}=".Length..].Trim();
+            // Remove surrounding quotes if present
+            if (value.StartsWith('"') && value.EndsWith('"') && value.Length >= 2)
+                value = value[1..^1];
+            return value;
+        }
     }
     return defaultValue ?? throw new ArgumentException($"Invalid connection string: '{key}' not found.");
 }
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/appsettings.json (3)

21-23: Avoid embedding live-looking SMTP creds in templates

Ethereal is for testing, but shipping a username/password may trigger secret scanners. Prefer explicit placeholders to reduce noise and accidental check-ins.

- "smtp": "Endpoint=smtp://smtp.ethereal.email:587;UserName=madisen7@ethereal.email;Password=QYcYfjBXjqxMAZfZya",
- "smtp_Comment": "You can also use https://ethereal.email/create for testing purposes.",
+ "smtp": "Endpoint=smtp://smtp.ethereal.email:587;UserName=your-inbox@ethereal.email;Password=REPLACE_ME",
+ "smtp_Comment": "Use https://ethereal.email/create to generate disposable test creds. Replace UserName/Password at run-time via env vars.",

Optionally encourage env-var overrides in docs.


24-28: Cloudflare R2 note as a connection string value

Placing a human note as the value (“Not supported yet: …”) under ConnectionStrings is unconventional. Consider moving to a comment key to keep ConnectionStrings machine-parseable.

- "s3__CloudflareR2Sample": "Not supported yet: https://github.com/robinrodricks/FluentStorage/issues/114",
+ "s3__CloudflareR2Sample": null,
+ "s3__CloudflareR2Sample_Comment": "Not supported yet: https://github.com/robinrodricks/FluentStorage/issues/114",

112-123: VAPID keys: prefer placeholders or prod guard for PrivateKey

PublicKey doc link updated—good. The template includes a concrete PrivateKey. To avoid accidental prod use and secret-scanner noise, set it to null/placeholder and add a comment. Optionally add a server-side validation to block default keys in non-Development.

- "PrivateKey": "dMIR1ICj-lDWYZ-ZYCwXKyC2ShYayYYkEL-oOPnpq9c"
+ "PrivateKey": null,
+ "PrivateKey_Comment": "Set your own VAPID private key via secrets or env vars in non-development environments."

If a validation layer exists (e.g., during startup), add a check similar to the client’s PublicKey guard for both keys when not Development.

I can draft the guard code if desired.

src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/Dropdown/BitDropdownTests.cs (1)

67-68: Prefer MSTest idiom: Assert.ThrowsException

To align with MSTest v4 style and avoid ambiguity with custom helpers, consider replacing Assert.Throws with Assert.ThrowsException. Example:

-Assert.Throws<ElementNotFoundException>(() => component.Find(".bit-drp-rlc > label"));
+Assert.ThrowsException<ElementNotFoundException>(() => component.Find(".bit-drp-rlc > label"));

Also applies to: 87-88, 115-116, 169-170, 392-393

src/Templates/Boilerplate/Bit.Boilerplate/.github/workflows/ci.yml (1)

41-44: Ensure test artifacts path is populated

Since you upload ./src/Tests/TestResults on failure, consider setting an explicit results directory to avoid empty artifacts:

- dotnet test --project src/Tests/Boilerplate.Tests.csproj
+ dotnet test --project src/Tests/Boilerplate.Tests.csproj --results-directory src/Tests/TestResults
src/Templates/Boilerplate/Bit.Boilerplate/.azure-devops/workflows/ci.yml (1)

43-49: Stabilize test results collection

To ensure PublishPipelineArtifact finds results, set a results directory:

- script: 'dotnet test --project src/Tests/Boilerplate.Tests.csproj'
+ script: 'dotnet test --project src/Tests/Boilerplate.Tests.csproj --results-directory src/Tests/TestResults'
.github/workflows/bit.full.ci.yml (1)

54-67: Make test results path deterministic

Set an explicit results directory so artifacts exist on failure:

- dotnet test
+ dotnet test --results-directory ./SimpleTest/src/Tests/TestResults
- dotnet test
+ dotnet test --results-directory ./TestSqlServer/src/Tests/TestResults

Also applies to: 95-96

src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj (1)

1-8: MSTest v4 migration looks good; check runsettings duplication

You set both RunSettingsFilePath and TestingPlatformCommandLineArguments to pass .runsettings. One is sufficient; keeping both is redundant and can confuse future maintenance. Recommend keeping TestingPlatformCommandLineArguments only.

src/BlazorUI/Bit.BlazorUI.Tests/Components/Progress/ProgressBar/BitProgressTests.cs (1)

104-109: Use Assert.ThrowsException with MSTest v4

Replace Assert.Throws with Assert.ThrowsException for consistency with MSTest:

-Assert.Throws<ElementNotFoundException>(() => component.Find(".bit-prb-lbl"));
+Assert.ThrowsException<ElementNotFoundException>(() => component.Find(".bit-prb-lbl"));
-Assert.Throws<ElementNotFoundException>(() => component.Find(".bit-prb-des"));
+Assert.ThrowsException<ElementNotFoundException>(() => component.Find(".bit-prb-des"));
-Assert.Throws<ElementNotFoundException>(() => component.Find(".bit-prb-pct"));
+Assert.ThrowsException<ElementNotFoundException>(() => component.Find(".bit-prb-pct"));

Also applies to: 129-134, 182-184

src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props (1)

72-74: Avoid prerelease Sentry by default in templates.
These conditions enable prerelease Sentry packages by default (condition includes ''). Consider requiring explicit opt‑in:

-<PackageVersion Condition=" '$(sentry)' == 'true' OR '$(sentry)' == '' " Include="Sentry.AspNetCore" Version="6.0.0-preview.1-prerelease" />
-<PackageVersion Condition=" '$(sentry)' == 'true' OR '$(sentry)' == '' " Include="Sentry.Extensions.Logging" Version="6.0.0-preview.1-prerelease" />
-<PackageVersion Condition=" '$(sentry)' == 'true' OR '$(sentry)' == '' " Include="Sentry.Maui" Version="6.0.0-preview.1-prerelease" />
+<PackageVersion Condition=" '$(sentry)' == 'true' " Include="Sentry.AspNetCore" Version="6.0.0-preview.1-prerelease" />
+<PackageVersion Condition=" '$(sentry)' == 'true' " Include="Sentry.Extensions.Logging" Version="6.0.0-preview.1-prerelease" />
+<PackageVersion Condition=" '$(sentry)' == 'true' " Include="Sentry.Maui" Version="6.0.0-preview.1-prerelease" />
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs (1)

17-21: Prefer data volumes over hard‑coded container paths for admin UIs.
Use WithDataVolume for pgAdmin/phpMyAdmin to simplify and avoid path tight‑coupling.

-var postgresDatabase = builder.AddPostgres("postgresserver")
-        .WithPgAdmin(config => config.WithVolume("/var/lib/pgadmin/Boilerplate/data"))
+var postgresDatabase = builder.AddPostgres("postgresserver")
+        .WithPgAdmin(config => config.WithDataVolume())
         .WithLifetime(ContainerLifetime.Persistent)
         .WithDataVolume()
         .WithImage("pgvector/pgvector", "pg18")
         .AddDatabase("postgresdb");

-var mySqlDatabase = builder.AddMySql("mysqlserver")
-        .WithPhpMyAdmin(config => config.WithVolume("/var/lib/phpMyAdmin/Boilerplate/data"))
+var mySqlDatabase = builder.AddMySql("mysqlserver")
+        .WithPhpMyAdmin(config => config.WithDataVolume())
         .WithLifetime(ContainerLifetime.Persistent)
         .WithDataVolume()
         .AddDatabase("mysqldb");

Also applies to: 25-29

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

Knowledge base: Disabled due to Reviews -> Disable Knowledge Base setting

📥 Commits

Reviewing files that changed from the base of the PR and between 379cf3d and 63d2f7d.

📒 Files selected for processing (37)
  • .devcontainer/devcontainer.json (0 hunks)
  • .github/workflows/bit.ci.yml (2 hunks)
  • .github/workflows/bit.full.ci.yml (4 hunks)
  • dotnet.config (1 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csproj (1 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/ColorPicker/BitColorPickerTests.cs (1 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/Dropdown/BitDropdownTests.cs (5 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/NumberField/BitNumberFieldTests.cs (1 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Navs/Nav/BitNavTests.cs (2 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Progress/ProgressBar/BitProgressTests.cs (3 hunks)
  • src/BlazorUI/Bit.BlazorUI.Tests/Components/Utilities/Link/BitLinkTests.cs (1 hunks)
  • src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj (1 hunks)
  • src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/.azure-devops/workflows/ci.yml (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.json (0 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/.github/workflows/ci.yml (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/dotnet.config (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/ClientWebSettings.cs (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/appsettings.json (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props (6 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Extensions/IConfigurationExtensions.cs (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs (7 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Properties/launchSettings.json (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/ServerApiSettings.cs (0 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/appsettings.json (3 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Boilerplate.Server.AppHost.csproj (2 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs (3 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/appsettings.Development.json (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/appsettings.json (0 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Properties/launchSettings.json (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/appsettings.json (2 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/.runsettings (1 hunks)
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj (1 hunks)
  • src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor (3 hunks)
  • src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor.cs (3 hunks)
  • src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates05CreateProjectPage.razor (1 hunks)
  • src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj (1 hunks)
💤 Files with no reviewable changes (4)
  • .devcontainer/devcontainer.json
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/ServerApiSettings.cs
  • src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/appsettings.json
  • src/Templates/Boilerplate/Bit.Boilerplate/.devcontainer/devcontainer.json
🧰 Additional context used
🪛 Biome (2.1.2)
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/appsettings.Development.json

[error] 9-9: Expected a property but instead found '//#if (database == "SqlServer")'.

Expected a property here.

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 10-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 13-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-17: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 17-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 20-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/appsettings.json

[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 4-4: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 5-5: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-6: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 6-8: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-9: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 9-10: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 11-11: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-12: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 12-13: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-14: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 14-15: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-16: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 16-18: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-19: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 19-20: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 21-21: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 22-22: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 23-23: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 24-24: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 25-25: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 26-26: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 27-27: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)


[error] 28-28: End of file expected

Use an array for a sequence of values: [1, 2]

(parse)

🪛 GitHub Actions: bit platform CI
src/BlazorUI/Demo/Bit.BlazorUI.Demo.Server/Bit.BlazorUI.Demo.Server.csproj

[error] 1-1: The target "InstallNodejsDependencies" does not exist in the project.

src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj

[error] 1-1: MSB4057: The target "InstallNodejsDependencies" does not exist in the project.

src/BlazorUI/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csproj

[error] 1-1: The target "InstallNodejsDependencies" does not exist in the project.

⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (5)
  • GitHub Check: build and test
  • GitHub Check: build blazor hybrid (iOS-macOS)
  • GitHub Check: build blazor hybrid (android)
  • GitHub Check: deploy api + blazor
  • GitHub Check: deploy api + blazor
🔇 Additional comments (32)
src/Websites/Platform/src/Bit.Websites.Platform.Server/Bit.Websites.Platform.Server.csproj (1)

29-29: Confirm package availability and TFM support for ModelContextProtocol 0.4.0-preview.2
All references are aligned; ensure this preview version is published to your feed and targets net10.0.

src/Websites/Platform/src/Bit.Websites.Platform.Client/Pages/Templates/Templates03GettingStartedPage.razor (2)

156-156: No changes needed: Bit.Boilerplate 10.0.0-pre-02 is published on NuGet.


102-107: .NET SDK URL and version verified
Download URL returns HTTP 200 and matches the latest .NET 10 RC SDK (10.0.100-rc.1.25451.107).

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Properties/launchSettings.json (1)

29-29: LGTM! Connection string key standardization.

The rename from ConnectionStrings__SqliteConnectionString to ConnectionStrings__sqlite aligns with the broader refactoring to use generalized connection string keys.

src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/.runsettings (1)

27-27: LGTM! Test configuration updated consistently.

The connection string key rename is consistent with the broader refactoring across the boilerplate templates.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/Properties/launchSettings.json (1)

53-53: LGTM! Consistent with connection string key standardization.

The rename aligns with the broader refactoring to use generalized connection string keys across the boilerplate.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/appsettings.Development.json (1)

8-24: LGTM! Development credentials configuration.

The new Parameters section provides default credentials for development environments. The default password "P@ssw0rd" is appropriate for local development. The guidance comment about docker volumes is helpful.

Note: The static analysis errors regarding preprocessor directives (e.g., //#if (database == "SqlServer")) are false positives. These are intentional template directives used for project generation and will be processed before becoming valid JSON.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Extensions/IConfigurationExtensions.cs (1)

5-11: LGTM! Clean helper for required connection strings.

The GetRequiredConnectionString extension method provides a clean pattern for retrieving required connection strings with a clear error message when missing. This improves configuration validation at startup.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Web/appsettings.json (2)

4-10: LGTM! Connection string keys standardized for Aspire.

The generalized connection string keys (sqldb, sqlite, postgresdb, mysqldb, azureblobstorage, smtp, s3) align with the Aspire client libraries approach and improve consistency across the template.


60-60: LGTM! Email configuration simplified.

The Email section now contains only DefaultFromEmail, with SMTP connection details moved to the connection string. This aligns with the broader refactoring to use connection strings for all external service configurations.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/Program.Services.cs (3)

90-111: LGTM! Storage initialization refactored with connection string parsing.

The storage initialization now uses GetRequiredConnectionString for validation and GetConnectionStringValue to parse individual connection string components. The default values (Region: "us-east-1", BucketName: "files") are sensible.


249-283: LGTM! Database configuration updated with required connection strings.

The database context setup now uses GetRequiredConnectionString for all database providers, ensuring configuration validation at startup.


626-629: LGTM! Development-time HTTPS requirement disabled.

Setting RequireHttpsMetadata to false in development environments is appropriate and allows for easier local testing with HTTP endpoints.

src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/appsettings.json (1)

5-5: New VAPID key generator URL is reachable
Verified that https://d3v.one/vapid-key-generator/ returns HTTP 200 OK.

src/Templates/Boilerplate/Bit.Boilerplate/src/Client/Boilerplate.Client.Web/ClientWebSettings.cs (1)

39-40: Doc link update LGTM

URL switched to d3v.one. No runtime impact.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/appsettings.json (3)

96-97: DefaultFromEmail update LGTM

Looks consistent with the new SMTP guidance.


4-6: Unable to parse biome.json for ignore/exclude patterns—please manually confirm that templated appsettings.json files (with //#if directives) are excluded from Biome linting.


9-17: Connection string key renames — verified

All configuration.GetRequiredConnectionString(...) calls use the new keys (sqldb / sqlite / postgresdb / mysqldb); appsettings.json entries updated; no leftover references to the old names found. Note: TestsInitializer.cs and Besql/DatabaseFacadeExtensions.cs still call DbContext.Database.GetConnectionString() (reads the context's active connection string) — expected.

src/Templates/Boilerplate/Bit.Boilerplate/dotnet.config (1)

1-2: LGTM: runner set to Microsoft.Testing.Platform

This matches the MSTest v4 migration and should standardize test execution in templates.

src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj (1)

16-18: Playwright MSTest v4 package/using alignment

Package moved to Microsoft.Playwright.MSTest.v4 while usings still reference Microsoft.Playwright.MSTest. This is likely correct (namespace unchanged), but please confirm the tests compile without needing namespace changes.

Also applies to: 33-36

dotnet.config (1)

1-2: LGTM: standard test runner configuration

Setting the test runner to Microsoft.Testing.Platform is consistent with the repo’s MSTest v4 adoption.

.github/workflows/bit.full.ci.yml (1)

6-8: Verify connection string key rename
No instances of the old SqlServerConnectionString were found, but I also didn’t see any calls to Configuration.GetConnectionString("sqldb") or references in your templates. Please confirm your startup (e.g. AddDbContext/UseSqlServer) and all generated template files are updated to use ConnectionStrings__sqldb.

src/BlazorUI/Bit.BlazorUI.Tests/Components/Utilities/Link/BitLinkTests.cs (1)

50-50: LGTM: Assertion API updated for MSTest v4.

The change from Assert.ThrowsException to Assert.Throws aligns with MSTest v4 conventions while maintaining identical functional behavior.

src/BlazorUI/Bit.BlazorUI.Tests/Components/Navs/Nav/BitNavTests.cs (1)

109-109: LGTM: Assertion style updated for MSTest v4.

The changes from Assert.ThrowsException to Assert.Throws maintain identical behavior while adopting MSTest v4 conventions.

Also applies to: 183-183

src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/NumberField/BitNumberFieldTests.cs (1)

49-49: LGTM: Assertion API modernized.

The assertion method update aligns with MSTest v4 while preserving test semantics.

.github/workflows/bit.ci.yml (1)

55-55: LGTM: Explicit test project targeting added.

The --project flag ensures the correct test project is executed, which aligns with the MSTest.Sdk migration in the test project configuration.

Also applies to: 102-102

src/BlazorUI/Bit.BlazorUI.Tests/Bit.BlazorUI.Tests.csproj (1)

1-11: LGTM: Test SDK successfully migrated to MSTest v4.

The migration to MSTest.Sdk/4.0.0 modernizes the test infrastructure by:

  • Bundling test tooling (runner, adapter, framework) within the SDK
  • Removing individual test package dependencies (Microsoft.NET.Test.Sdk, MSTest.TestAdapter, MSTest.TestFramework, coverlet.collector)
  • Retaining the Razor SDK explicitly for Blazor component testing
  • Adding RollForward=Major for framework version flexibility

This aligns with the broader MSTest.Sdk adoption pattern and coordinates with the CI workflow updates and assertion API changes in the test files.

Note: The pipeline failure regarding "InstallNodejsDependencies" target appears unrelated to this test SDK migration, as it concerns build targets rather than test infrastructure.

src/BlazorUI/Bit.BlazorUI.Tests/Components/Inputs/ColorPicker/BitColorPickerTests.cs (1)

39-40: LGTM: Assertion API updated consistently.

The assertion method changes complete the MSTest v4 migration across the test suite, maintaining identical verification behavior.

src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Boilerplate.Server.AppHost.csproj (2)

3-3: Aspire SDK bump to 9.5.1 looks good.


17-18: MailPit + conditional Sqlite references align with AppHost wiring.
Central package versions are defined in Directory.Packages.props; no issues spotted.

src/BlazorUI/Demo/Client/Bit.BlazorUI.Demo.Client.Windows/Bit.BlazorUI.Demo.Client.Windows.csproj (1)

44-44: WebView2 bump to 1.0.3537.50 looks good.

src/Templates/Boilerplate/Bit.Boilerplate/src/Directory.Packages.props (1)

53-62: Align DevTunnels package version
DevTunnels is at 9.5.1-preview.1.25502.11 while other Aspire.Hosting packages use 9.5.1. Confirm this preview build is required and compatible with the AddDevTunnel/WithAnonymousAccess calls in Program.cs.
Locations: Directory.Packages.props (line 54), Program.cs (lines 123–130)

@ysmoradi ysmoradi merged commit fd9309a into bitfoundation:develop Oct 12, 2025
3 checks passed
@ysmoradi ysmoradi deleted the 11470 branch October 12, 2025 13:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

bit Boilerplate project template aspire needs refactor

1 participant