Siemens.AspNet.DbProvider
0.2.0-alpha.503
Prefix Reserved
dotnet add package Siemens.AspNet.DbProvider --version 0.2.0-alpha.503
NuGet\Install-Package Siemens.AspNet.DbProvider -Version 0.2.0-alpha.503
<PackageReference Include="Siemens.AspNet.DbProvider" Version="0.2.0-alpha.503" />
<PackageVersion Include="Siemens.AspNet.DbProvider" Version="0.2.0-alpha.503" />
<PackageReference Include="Siemens.AspNet.DbProvider" />
paket add Siemens.AspNet.DbProvider --version 0.2.0-alpha.503
#r "nuget: Siemens.AspNet.DbProvider, 0.2.0-alpha.503"
#:package Siemens.AspNet.DbProvider@0.2.0-alpha.503
#addin nuget:?package=Siemens.AspNet.DbProvider&version=0.2.0-alpha.503&prerelease
#tool nuget:?package=Siemens.AspNet.DbProvider&version=0.2.0-alpha.503&prerelease
Siemens.AspNet.DbProvider
A powerful, flexible database provider for .NET applications that simplifies database interactions with multiple database systems.
Features
Multi-Database Support: Works with multiple database providers including:
- MySQL/MariaDB
- Snowflake
- SingleStore (limited support)
Type-Safe Queries: Strongly-typed query results with automatic mapping between database and .NET types
Dynamic Data Operations:
- Create, read, update, and delete table data
- Dynamic table schema management
- Copy tables and data between tables
Transaction Support: Full transaction support across all database providers
Parameterized Queries: Protection against SQL injection through parameterized queries
SQL Analytics: Built-in query analytics and performance monitoring
File Import: Read data from CSV and Excel files with built-in form file readers
Data Export: Export data and schema definitions to CSV and Excel formats
Migration Support: Database migration utilities for schema evolution
Error Handling: Comprehensive error handling with detailed exception information
Installation
Prerequisites
- .NET 9.0 or higher
- Required database client libraries:
- MySQL: MySql.Data package (included as dependency)
- Snowflake: Snowflake.Data package (included as dependency)
NuGet Package
dotnet add package Siemens.AspNet.DbProvider
Getting Started
Basic Setup
Register the database provider in your Program.cs or startup class:
// Add base services
builder.Services.AddDbProvider(builder.Configuration);
// Add specific provider(s) you need
builder.Services.AddMySqlProvider(builder.Configuration);
// and/or
builder.Services.AddSnowflakeProvider(builder.Configuration);
// If using MySQL, add connection factory
builder.Services.AddMySqlConnectionFactory();
// If using dynamic data features
builder.Services.AddDatabaseService(builder.Configuration);
// If using form file readers (CSV, Excel)
builder.Services.AddFormFileReaderProvider();
// If using data export features
builder.Services.AddDataExporter();
builder.Services.AddSchemaExporter();
Connection String Configuration
In your appsettings.json file:
{
"ConnectionStrings": {
"MySqlConnection": "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;",
"SnowflakeConnection": "account=myAccount;user=myUser;password=myPassword;DB=myDatabase;SCHEMA=mySchema;"
}
}
Basic Usage
Executing Queries
public class UserRepository
{
private readonly IDbQueryProvider _dbQueryProvider;
public UserRepository(IDbQueryProvider dbQueryProvider)
{
_dbQueryProvider = dbQueryProvider;
}
public async Task<User> GetUserByIdAsync(int userId)
{
const string sql = "SELECT * FROM Users WHERE Id = @UserId";
var parameters = new { UserId = userId };
return await _dbQueryProvider.QueryFirstOrDefaultAsync<User>(sql, parameters);
}
public async Task<IEnumerable<User>> GetAllUsersAsync()
{
const string sql = "SELECT * FROM Users";
return await _dbQueryProvider.QueryAsync<User>(sql);
}
public async Task<int> CreateUserAsync(User user)
{
const string sql = "INSERT INTO Users (Name, Email) VALUES (@Name, @Email); SELECT LAST_INSERT_ID();";
var parameters = new { user.Name, user.Email };
return await _dbQueryProvider.ExecuteScalarAsync<int>(sql, parameters);
}
}
Using Transactions
public async Task TransferFundsAsync(int fromAccountId, int toAccountId, decimal amount)
{
using var transaction = await _dbQueryProvider.BeginTransactionAsync();
try
{
await _dbQueryProvider.ExecuteAsync(
"UPDATE Accounts SET Balance = Balance - @Amount WHERE Id = @FromId",
new { Amount = amount, FromId = fromAccountId },
transaction);
await _dbQueryProvider.ExecuteAsync(
"UPDATE Accounts SET Balance = Balance + @Amount WHERE Id = @ToId",
new { Amount = amount, ToId = toAccountId },
transaction);
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}
}
Dynamic Data Features
The Dynamic Data module provides powerful schema-agnostic database operations without writing SQL:
Service Registration
// Register the DatabaseService
builder.Services.AddDatabaseService(builder.Configuration);
Table Schema Management
public class SchemaService
{
private readonly IDatabaseService _databaseService;
private readonly DbConnectionInfo _dbConnectionInfo;
public SchemaService(IDatabaseService databaseService, IDbTypeProvider dbTypeProvider, IConfiguration configuration)
{
_databaseService = databaseService;
// Create connection info
var dbProvider = dbTypeProvider.GetFor(DatabaseProvider.MySql);
_dbConnectionInfo = dbProvider.ParseConnectionString(
configuration.GetConnectionString("MySqlConnection"));
}
// Create a new table with specified columns
public async Task<SimplifiedTableSchema> CreateProductTableAsync()
{
// Define columns for the table
var columns = new List<SimpleColumn>
{
new("Id", SimplifiedDbType.Integer) { IsPrimaryKey = true, IsAutoIncrement = true },
new("ProductName", SimplifiedDbType.String) { MaxLength = 100, IsNullable = false },
new("Description", SimplifiedDbType.String) { MaxLength = 500 },
new("Price", SimplifiedDbType.Decimal) { IsNullable = false },
new("CreatedAt", SimplifiedDbType.DateTime) { IsNullable = false },
new("IsActive", SimplifiedDbType.Bool) { IsNullable = false, DefaultValue = "1" }
};
// Create the table
return await _databaseService.AddTableAsync(
"Products",
columns.ToImmutableList(),
_dbConnectionInfo);
}
// Add a column to existing table
public async Task<int> AddCategoryColumnAsync()
{
// Get table schema
var tableSchema = await _databaseService.GetTableSchemaAsync(
"Products",
_dbConnectionInfo);
// Add column
return await _databaseService.AddColumnToAsync(
tableSchema,
new SimpleColumn("Category", SimplifiedDbType.String) { MaxLength = 50 });
}
// Copy table structure (with or without data)
public async Task<SimplifiedTableSchema> CreateProductsBackupTableAsync()
{
// Get existing table schema
var existingTable = await _databaseService.GetTableSchemaAsync(
"Products",
_dbConnectionInfo);
// Create copy with data
return await _databaseService.CopyTableAsync(
"Products_Backup",
existingTable,
copyData: true);
}
}
Dynamic CRUD Operations
public class ProductRepository
{
private readonly IDatabaseService _databaseService;
private readonly SimplifiedTableSchema _tableSchema;
public ProductRepository(IDatabaseService databaseService)
{
_databaseService = databaseService;
// This would be retrieved once and cached/injected in a real app
_tableSchema = databaseService.GetTableSchemaAsync("Products", connectionInfo).Result;
}
// Insert data
public async Task<InsertDataResult> AddProductsAsync(IEnumerable<Dictionary<string, object>> products)
{
// Convert to dynamic data objects
var dynamicData = new DynamicDataObjectsWithLocation(products);
// Add audit values
var auditValues = new Dictionary<string, string>
{
{ "CreatedAt", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") },
{ "IsActive", "1" }
}.ToImmutableDictionary();
// Insert data
return await _databaseService.InsertDataAsync(_tableSchema, dynamicData, auditValues);
}
// Query data with filtering
public async Task<IEnumerable<ProductDto>> GetActiveProductsAsync()
{
// Create where condition
var wherePart = new WherePart();
wherePart.AddEqualCondition("IsActive", "1");
// Define sort order
var sortOrder = new SortOrder("ProductName", ColumnSortOrder.Asc);
// Get data with specific columns
return await _databaseService.GetDataAsync<ProductDto>(
_tableSchema,
wherePart,
sortOrder,
"Id", "ProductName", "Price", "Category");
}
// Query with pagination
public async Task<PageInfo<ProductDto>> GetProductsPagedAsync(int pageNumber, int pageSize)
{
// Create pagination
var pagination = new Pagination(pageNumber, pageSize);
// Create sort order
var sortOrder = new SortOrder("ProductName", ColumnSortOrder.Asc);
// Get paginated data
return await _databaseService.GetDataPageWiseAsync<ProductDto>(
_tableSchema,
pagination,
new WherePart(),
sortOrder);
}
// Update data
public async Task<UpdateDataResult> UpdateProductPricesAsync(
IEnumerable<Dictionary<string, object>> productsWithNewPrices)
{
// Convert to dynamic data objects
var dynamicData = new DynamicDataObjectsWithLocation(productsWithNewPrices);
// Add audit values
var auditValues = new Dictionary<string, string>
{
{ "ModifiedAt", DateTime.UtcNow.ToString("yyyy-MM-dd HH:mm:ss") }
}.ToImmutableDictionary();
// Update data
return await _databaseService.UpdateDataAsync(_tableSchema, dynamicData, auditValues);
}
// Delete data by condition
public async Task<int> DeleteDiscontinuedProductsAsync(string category)
{
var wherePart = new WherePart();
wherePart.AddEqualCondition("Category", category);
wherePart.AddEqualCondition("IsActive", "0");
return await _databaseService.DeleteDataAsync(_tableSchema, wherePart);
}
}
Powerful Data Import and Export
public class DataImportExportService
{
private readonly IFormFileReaderProvider _fileReaderProvider;
private readonly IDatabaseService _databaseService;
private readonly IDbDataExporter _dataExporter;
private readonly IDbSchemaExporter _schemaExporter;
private readonly SimplifiedTableSchema _tableSchema;
public DataImportExportService(
IFormFileReaderProvider fileReaderProvider,
IDatabaseService databaseService,
IDbDataExporter dataExporter,
IDbSchemaExporter schemaExporter)
{
_fileReaderProvider = fileReaderProvider;
_databaseService = databaseService;
_dataExporter = dataExporter;
_schemaExporter = schemaExporter;
// This would be retrieved once and cached/injected in a real app
_tableSchema = databaseService.GetTableSchemaAsync("Products", connectionInfo).Result;
}
// Import products from CSV file
public async Task<InsertDataResult> ImportProductsFromCsvAsync(IFormFile csvFile)
{
// Get CSV reader
var reader = _fileReaderProvider.GetReader(FormFileReaderInfo.CsvReader);
// Read data as dynamic objects
var products = await reader.ReadAsDynamicObjectsAsync(csvFile);
// Insert into database
return await _databaseService.InsertDataAsync(_tableSchema, products);
}
// Export data to CSV file
public async Task ExportProductsToCsvAsync(string filePath)
{
// Get product data
var data = await _databaseService.GetDataAsync<Dictionary<string, object>>(
_tableSchema,
"*");
// Export to CSV
await _dataExporter.ExportAsync(
_tableSchema.TableName,
data,
filePath,
DbDataExporterInfo.CsvExporter);
}
// Export schema to Excel
public async Task ExportSchemaToExcelAsync(string filePath)
{
await _schemaExporter.ExportAsync(
_tableSchema,
filePath,
DbSchemaExporterInfo.ExcelExporter);
}
}
Advanced Features
SQL Analytics
The provider includes SQL analytics that can help you monitor and optimize your queries:
// Enable SQL analytics in your configuration
public void ConfigureServices(IServiceCollection services)
{
services.AddMySqlAnalyticsHandler(Configuration);
// ... other services
}
// Use analytics-enabled methods
public class PerformanceMonitoringService
{
private readonly IDbQueryProvider _dbQueryProvider;
public PerformanceMonitoringService(IDbQueryProvider dbQueryProvider)
{
_dbQueryProvider = dbQueryProvider;
}
public async Task<QueryPerformanceInfo> GetUserDataWithPerformanceMetrics(int userId)
{
var sql = @"
SELECT u.*, p.*
FROM Users u
JOIN UserProfiles p ON u.Id = p.UserId
WHERE u.Id = @UserId";
var (users, metrics) = await _dbQueryProvider.QueryWithAnalyticsAsync<UserWithProfile>(
sql,
new { UserId = userId });
// Return both query results and performance metrics
return new QueryPerformanceInfo
{
Data = users,
ExecutionTimeMs = metrics.ExecutionTime.TotalMilliseconds,
RowsAffected = metrics.RowCount,
SqlExecuted = metrics.FormatedSql
};
}
}
Logging and Error Handling
The provider offers comprehensive logging and error handling:
public class DataAccessService
{
private readonly IDbQueryProvider _dbQueryProvider;
private readonly ILogger<DataAccessService> _logger;
public DataAccessService(IDbQueryProvider dbQueryProvider, ILogger<DataAccessService> logger)
{
_dbQueryProvider = dbQueryProvider;
_logger = logger;
}
public async Task<IEnumerable<User>> GetUsersWithLoggingAsync()
{
const string sql = "SELECT * FROM Users";
try
{
// Execute query with logging
var (users, logs) = await _dbQueryProvider.QueryWithLogAsync<User>(sql);
// Log query information
_logger.LogInformation(
"Query executed successfully: {SqlQuery}, Rows: {RowCount}, Time: {ExecutionTimeMs}ms",
logs.FormatedSql,
logs.RowCount,
logs.ExecutionTime.TotalMilliseconds);
return users;
}
catch (Exception ex)
{
_logger.LogError(ex, "Error executing query");
throw;
}
}
}
Database Types Support
The provider supports various database types:
MySQL Types
- String types: varchar, tinytext, text, mediumtext, longtext, etc.
- Numeric types: int, tinyint, smallint, bigint, decimal, float, double
- Date/time types: datetime, date, timestamp, time, year
- Boolean type
- JSON type
Snowflake Types
- String types: varchar, string, text
- Numeric types: integer, smallint, bigint, decimal, float, double
- Date/time types: datetime, date, time, timestamp
- Boolean type
- JSON type
Simplified Database Types
For cross-database compatibility, the library provides simplified types:
// Simplified types abstract the actual database type
public enum SimplifiedDbType
{
String,
Integer,
Decimal,
Bool,
DateTime,
Date,
Json
}
// Example using simplified types to create a table
var columns = new List<SimpleColumn>
{
new("Id", SimplifiedDbType.Integer) { IsPrimaryKey = true, IsAutoIncrement = true },
new("Name", SimplifiedDbType.String) { MaxLength = 100 },
new("IsActive", SimplifiedDbType.Bool),
new("CreatedAt", SimplifiedDbType.DateTime),
new("Config", SimplifiedDbType.Json)
};
Contributing
Contributions to the Siemens.AspNet.DbProvider are welcome. Please ensure that your code adheres to the existing style and includes appropriate tests.
License
Copyright 2025 (c) Siemens AG. All rights reserved.
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0 is compatible. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net9.0
- Amazon.Lambda.AspNetCoreServer.Hosting (>= 1.9.1)
- AspNetCore.Simple.Sdk (>= 6.0.5)
- AWSSDK.Core (>= 4.0.3.12)
- EPPlus (>= 4.5.3.3)
- Extensions.Pack (>= 6.0.16)
- MySql.Data (>= 9.5.0)
- OpenTelemetry.Exporter.OpenTelemetryProtocol (>= 1.14.0)
- OpenTelemetry.Extensions.Hosting (>= 1.14.0)
- OpenTelemetry.Instrumentation.AspNetCore (>= 1.14.0)
- OpenTelemetry.Instrumentation.AWS (>= 1.14.1)
- OpenTelemetry.Instrumentation.AWSLambda (>= 1.14.1)
- OpenTelemetry.Instrumentation.Http (>= 1.14.0)
- OpenTelemetry.Instrumentation.Runtime (>= 1.14.0)
- Siemens.AspNet.DbProvider.Contracts (>= 0.2.0-alpha.503)
- Siemens.AspNet.ErrorHandling.Contracts (>= 0.2.0-alpha.503)
- Snowflake.Data (>= 5.3.0)
- System.Drawing.Common (>= 4.7.2)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.2.0-alpha.503 | 0 | 2/10/2026 |
| 0.2.0-alpha.502 | 0 | 2/10/2026 |
| 0.2.0-alpha.501 | 27 | 2/9/2026 |
| 0.2.0-alpha.500 | 506 | 2/3/2026 |
| 0.2.0-alpha.498 | 330 | 1/28/2026 |
| 0.2.0-alpha.497 | 65 | 1/28/2026 |
| 0.2.0-alpha.483 | 39 | 1/27/2026 |
| 0.2.0-alpha.482 | 45 | 1/27/2026 |
| 0.2.0-alpha.481 | 129 | 1/26/2026 |
| 0.2.0-alpha.480 | 42 | 1/26/2026 |
| 0.2.0-alpha.479 | 45 | 1/26/2026 |
| 0.2.0-alpha.464 | 426 | 1/20/2026 |
| 0.2.0-alpha.463 | 56 | 1/20/2026 |
| 0.1.0-alpha.454 | 414 | 1/15/2026 |
| 0.1.0-alpha.453 | 45 | 1/13/2026 |
| 0.1.0-alpha.452 | 360 | 1/12/2026 |
| 0.1.0-alpha.443 | 46 | 1/12/2026 |
| 0.1.0-alpha.442 | 57 | 1/12/2026 |
| 0.1.0-alpha.441 | 44 | 1/12/2026 |
| 0.1.0-alpha.439 | 46 | 1/12/2026 |
| 0.1.0-alpha.438 | 50 | 1/12/2026 |
| 0.1.0-alpha.372 | 339 | 1/5/2026 |
| 0.1.0-alpha.371 | 62 | 1/5/2026 |
| 0.1.0-alpha.370 | 49 | 1/2/2026 |
| 0.1.0-alpha.369 | 382 | 12/18/2025 |
| 0.1.0-alpha.368 | 273 | 12/16/2025 |
| 0.1.0-alpha.367 | 241 | 12/16/2025 |
| 0.1.0-alpha.365 | 251 | 12/16/2025 |
| 0.1.0-alpha.362 | 554 | 12/15/2025 |
| 0.1.0-alpha.361 | 192 | 12/15/2025 |
| 0.1.0-alpha.359 | 744 | 12/12/2025 |
| 0.1.0-alpha.358 | 375 | 12/11/2025 |
| 0.1.0-alpha.357 | 376 | 12/11/2025 |
| 0.1.0-alpha.355 | 616 | 12/10/2025 |
| 0.1.0-alpha.354 | 773 | 12/8/2025 |
| 0.1.0-alpha.353 | 629 | 12/2/2025 |
| 0.1.0-alpha.349 | 614 | 11/28/2025 |
| 0.1.0-alpha.337 | 139 | 11/27/2025 |
| 0.1.0-alpha.336 | 811 | 11/24/2025 |
| 0.1.0-alpha.335 | 123 | 11/23/2025 |
| 0.1.0-alpha.334 | 331 | 11/23/2025 |
| 0.1.0-alpha.333 | 120 | 11/23/2025 |
| 0.1.0-alpha.332 | 1,766 | 11/11/2025 |
| 0.1.0-alpha.331 | 205 | 11/10/2025 |
| 0.1.0-alpha.330 | 361 | 11/7/2025 |
| 0.1.0-alpha.329 | 136 | 11/7/2025 |
| 0.1.0-alpha.328 | 126 | 11/7/2025 |
| 0.1.0-alpha.327 | 170 | 11/6/2025 |
| 0.1.0-alpha.326 | 160 | 11/6/2025 |
| 0.1.0-alpha.314 | 156 | 11/4/2025 |
| 0.1.0-alpha.313 | 152 | 11/4/2025 |
| 0.1.0-alpha.311 | 161 | 11/3/2025 |
| 0.1.0-alpha.309 | 797 | 10/31/2025 |
| 0.1.0-alpha.307 | 224 | 10/31/2025 |
| 0.1.0-alpha.306 | 141 | 10/31/2025 |
| 0.1.0-alpha.305 | 160 | 10/27/2025 |
| 0.1.0-alpha.303 | 601 | 10/22/2025 |
| 0.1.0-alpha.302 | 145 | 10/21/2025 |
| 0.1.0-alpha.301 | 137 | 10/21/2025 |
| 0.1.0-alpha.300 | 212 | 10/20/2025 |
| 0.1.0-alpha.299 | 102 | 10/18/2025 |
| 0.1.0-alpha.298 | 85 | 10/18/2025 |
| 0.1.0-alpha.297 | 82 | 10/18/2025 |
| 0.1.0-alpha.296 | 90 | 10/18/2025 |
| 0.1.0-alpha.294 | 113 | 10/17/2025 |
| 0.1.0-alpha.293 | 245 | 10/8/2025 |
| 0.1.0-alpha.292 | 144 | 10/8/2025 |
| 0.1.0-alpha.290 | 153 | 10/8/2025 |
| 0.1.0-alpha.289 | 143 | 10/7/2025 |
| 0.1.0-alpha.284 | 171 | 10/7/2025 |
| 0.1.0-alpha.283 | 238 | 9/19/2025 |
| 0.1.0-alpha.282 | 683 | 9/19/2025 |
| 0.1.0-alpha.281 | 320 | 9/16/2025 |
| 0.1.0-alpha.280 | 280 | 9/16/2025 |
| 0.1.0-alpha.279 | 281 | 9/16/2025 |
| 0.1.0-alpha.278 | 284 | 9/16/2025 |
| 0.1.0-alpha.275 | 206 | 9/3/2025 |
| 0.1.0-alpha.274 | 393 | 9/2/2025 |
| 0.1.0-alpha.273 | 226 | 9/1/2025 |
| 0.1.0-alpha.272 | 154 | 9/1/2025 |
| 0.1.0-alpha.271 | 196 | 8/29/2025 |
| 0.1.0-alpha.270 | 187 | 8/29/2025 |
| 0.1.0-alpha.269 | 181 | 8/29/2025 |
| 0.1.0-alpha.268 | 186 | 8/29/2025 |
| 0.1.0-alpha.267 | 191 | 8/27/2025 |
| 0.1.0-alpha.266 | 221 | 8/27/2025 |
| 0.1.0-alpha.264 | 230 | 8/22/2025 |
| 0.1.0-alpha.263 | 99 | 8/22/2025 |
| 0.1.0-alpha.262 | 99 | 8/22/2025 |
| 0.1.0-alpha.261 | 115 | 8/22/2025 |
| 0.1.0-alpha.260 | 123 | 8/22/2025 |
| 0.1.0-alpha.259 | 116 | 8/22/2025 |
| 0.1.0-alpha.258 | 277 | 8/19/2025 |
| 0.1.0-alpha.257 | 220 | 8/18/2025 |
| 0.1.0-alpha.246 | 183 | 8/14/2025 |
| 0.1.0-alpha.245 | 148 | 8/14/2025 |
| 0.1.0-alpha.244 | 186 | 8/14/2025 |
| 0.1.0-alpha.243 | 157 | 8/14/2025 |
| 0.1.0-alpha.238 | 157 | 8/12/2025 |
| 0.1.0-alpha.237 | 457 | 8/6/2025 |
| 0.1.0-alpha.236 | 254 | 8/5/2025 |
| 0.1.0-alpha.235 | 223 | 8/5/2025 |
| 0.1.0-alpha.234 | 228 | 8/5/2025 |
| 0.1.0-alpha.233 | 198 | 8/4/2025 |
| 0.1.0-alpha.232 | 215 | 8/4/2025 |
| 0.1.0-alpha.231 | 107 | 8/1/2025 |
| 0.1.0-alpha.230 | 104 | 8/1/2025 |
| 0.1.0-alpha.229 | 123 | 7/31/2025 |
| 0.1.0-alpha.228 | 129 | 7/31/2025 |
| 0.1.0-alpha.227 | 131 | 7/31/2025 |
| 0.1.0-alpha.225 | 123 | 7/31/2025 |
| 0.1.0-alpha.224 | 134 | 7/30/2025 |
| 0.1.0-alpha.222 | 336 | 7/16/2025 |
| 0.1.0-alpha.219 | 190 | 7/14/2025 |
| 0.1.0-alpha.217 | 116 | 7/11/2025 |
| 0.1.0-alpha.212 | 198 | 7/8/2025 |
| 0.1.0-alpha.211 | 198 | 7/3/2025 |
| 0.1.0-alpha.207 | 143 | 7/3/2025 |
| 0.1.0-alpha.206 | 326 | 6/30/2025 |
| 0.1.0-alpha.205 | 129 | 6/27/2025 |
| 0.1.0-alpha.202 | 126 | 6/27/2025 |
| 0.1.0-alpha.200 | 126 | 6/27/2025 |
| 0.1.0-alpha.198 | 124 | 6/27/2025 |
| 0.1.0-alpha.196 | 126 | 6/27/2025 |
| 0.1.0-alpha.195 | 123 | 6/27/2025 |
| 0.1.0-alpha.194 | 123 | 6/27/2025 |
| 0.1.0-alpha.193 | 124 | 6/27/2025 |
| 0.1.0-alpha.192 | 131 | 6/27/2025 |
| 0.1.0-alpha.191 | 134 | 6/27/2025 |
| 0.1.0-alpha.189 | 160 | 6/26/2025 |
| 0.1.0-alpha.188 | 191 | 6/26/2025 |
| 0.1.0-alpha.187 | 138 | 6/26/2025 |
| 0.1.0-alpha.186 | 165 | 6/26/2025 |
| 0.1.0-alpha.185 | 147 | 6/26/2025 |
| 0.1.0-alpha.184 | 151 | 6/26/2025 |
| 0.1.0-alpha.183 | 149 | 6/26/2025 |
| 0.1.0-alpha.182 | 144 | 6/26/2025 |
| 0.1.0-alpha.181 | 157 | 6/25/2025 |
| 0.1.0-alpha.180 | 177 | 6/24/2025 |
| 0.1.0-alpha.179 | 153 | 6/23/2025 |
| 0.1.0-alpha.178 | 242 | 6/23/2025 |
| 0.1.0-alpha.176 | 144 | 6/23/2025 |
| 0.1.0-alpha.174 | 162 | 6/19/2025 |
| 0.1.0-alpha.173 | 187 | 6/19/2025 |
| 0.1.0-alpha.172 | 153 | 6/17/2025 |
| 0.1.0-alpha.171 | 195 | 6/16/2025 |
| 0.1.0-alpha.169 | 150 | 6/16/2025 |
| 0.1.0-alpha.165 | 394 | 6/13/2025 |
| 0.1.0-alpha.164 | 248 | 6/13/2025 |
| 0.1.0-alpha.163 | 257 | 6/13/2025 |
| 0.1.0-alpha.160 | 291 | 6/12/2025 |
| 0.1.0-alpha.159 | 382 | 6/11/2025 |
| 0.1.0-alpha.158 | 297 | 6/11/2025 |
| 0.1.0-alpha.143 | 291 | 6/11/2025 |
| 0.1.0-alpha.142 | 293 | 6/11/2025 |
| 0.1.0-alpha.140 | 305 | 6/11/2025 |
| 0.1.0-alpha.139 | 295 | 6/10/2025 |
| 0.1.0-alpha.138 | 273 | 6/9/2025 |
| 0.1.0-alpha.137 | 77 | 6/7/2025 |
| 0.1.0-alpha.136 | 75 | 6/7/2025 |
| 0.1.0-alpha.135 | 117 | 6/6/2025 |
| 0.1.0-alpha.134 | 109 | 6/6/2025 |
| 0.1.0-alpha.130 | 160 | 6/5/2025 |
| 0.1.0-alpha.129 | 155 | 6/4/2025 |
| 0.1.0-alpha.128 | 155 | 6/4/2025 |