-
-
Notifications
You must be signed in to change notification settings - Fork 254
Refactor aspire configuration in bit Boilerplate (#11470) #11471
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Important Review skippedAuto incremental reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the You can disable this status message by setting the Note Other AI code review bot(s) detectedCodeRabbit 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. WalkthroughThis 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
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
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)
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Poem
Pre-merge checks and finishing touches❌ Failed checks (2 warnings)
✅ Passed checks (3 passed)
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. Comment |
There was a problem hiding this 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 |
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
Show resolved
Hide resolved
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
Outdated
Show resolved
Hide resolved
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
Outdated
Show resolved
Hide resolved
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
Outdated
Show resolved
Hide resolved
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.AppHost/Program.cs
Outdated
Show resolved
Hide resolved
src/BlazorUI/Bit.BlazorUI.Tests/Components/Utilities/Link/BitLinkTests.cs
Show resolved
Hide resolved
There was a problem hiding this 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:
- Whitespace around keys or values
- Escaped semicolons in values
- Quoted values
- 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 templatesEthereal 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 valuePlacing 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 PrivateKeyPublicKey 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.ThrowsExceptionTo 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 populatedSince 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/TestResultssrc/Templates/Boilerplate/Bit.Boilerplate/.azure-devops/workflows/ci.yml (1)
43-49: Stabilize test results collectionTo 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 deterministicSet 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/TestResultsAlso applies to: 95-96
src/Templates/Boilerplate/Bit.Boilerplate/src/Tests/Boilerplate.Tests.csproj (1)
1-8: MSTest v4 migration looks good; check runsettings duplicationYou 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 v4Replace 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
📒 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__SqliteConnectionStringtoConnectionStrings__sqlitealigns 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
GetRequiredConnectionStringextension 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
GetRequiredConnectionStringfor validation andGetConnectionStringValueto 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
GetRequiredConnectionStringfor all database providers, ensuring configuration validation at startup.
626-629: LGTM! Development-time HTTPS requirement disabled.Setting
RequireHttpsMetadatato 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 LGTMURL switched to d3v.one. No runtime impact.
src/Templates/Boilerplate/Bit.Boilerplate/src/Server/Boilerplate.Server.Api/appsettings.json (3)
96-97: DefaultFromEmail update LGTMLooks 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 — verifiedAll 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.PlatformThis 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 alignmentPackage 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 configurationSetting 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 oldSqlServerConnectionStringwere found, but I also didn’t see any calls toConfiguration.GetConnectionString("sqldb")or references in your templates. Please confirm your startup (e.g. AddDbContext/UseSqlServer) and all generated template files are updated to useConnectionStrings__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.ThrowsExceptiontoAssert.Throwsaligns 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.ThrowsExceptiontoAssert.Throwsmaintain 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
--projectflag 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.0modernizes 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=Majorfor framework version flexibilityThis 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 theAddDevTunnel/WithAnonymousAccesscalls in Program.cs.
Locations: Directory.Packages.props (line 54), Program.cs (lines 123–130)
closes #11470
Summary by CodeRabbit
New Features
Refactor
Documentation
Chores