Browse Source

Merge branch 'dev' into copilot/fix-d5496b38-0efc-4016-8ab2-970b67675314

pull/23802/head
maliming 1 year ago
parent
commit
94ac0d46a1
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 257
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/POST.md
  2. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/abp-webinar.png
  3. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-06.png
  4. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-07.png
  5. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/cover-image.png
  6. 21
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/discover-abp.svg
  7. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/elsa-workflow-instances.png
  8. BIN
      docs/en/Blog-Posts/2025-10-02 v10_0_Preview/studio-switch-to-preview.png
  9. 371
      docs/en/Community-Articles/2025-09-30-Why-Do-You-Need-Distributed-Locking-In-Net-Core/article.md
  10. BIN
      docs/en/Community-Articles/2025-09-30-Why-Do-You-Need-Distributed-Locking-In-Net-Core/cover.png
  11. 108
      docs/en/Community-Articles/2025-10-03-Generating-Sequential-GUIDs/Post.md
  12. BIN
      docs/en/Community-Articles/2025-10-03-Generating-Sequential-GUIDs/cover-image.png
  13. BIN
      docs/en/Community-Articles/2025-10-03-Native-AOT/Cover.png
  14. 72
      docs/en/Community-Articles/2025-10-03-Native-AOT/Post.md
  15. 2
      docs/en/cli/new-command-samples.md
  16. 2
      docs/en/docs-nav.json
  17. 6
      docs/en/framework/ui/angular/form-validation.md
  18. 2
      docs/en/release-info/migration-guides/abp-10-0.md
  19. 12
      framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs
  20. 9
      latest-versions.json
  21. 2
      modules/openiddict/app/angular/package.json
  22. 3
      modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/SendTestEmailModal.cshtml.cs
  23. 2
      npm/lerna.json
  24. 4
      npm/ng-packs/package.json
  25. 6
      npm/ng-packs/packages/account-core/package.json
  26. 6
      npm/ng-packs/packages/account/package.json
  27. 6
      npm/ng-packs/packages/components/package.json
  28. 4
      npm/ng-packs/packages/core/package.json
  29. 14
      npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts
  30. 4
      npm/ng-packs/packages/feature-management/package.json
  31. 2
      npm/ng-packs/packages/generators/package.json
  32. 8
      npm/ng-packs/packages/identity/package.json
  33. 6
      npm/ng-packs/packages/oauth/package.json
  34. 4
      npm/ng-packs/packages/permission-management/package.json
  35. 2
      npm/ng-packs/packages/schematics/package.json
  36. 6
      npm/ng-packs/packages/setting-management/package.json
  37. 6
      npm/ng-packs/packages/tenant-management/package.json
  38. 6
      npm/ng-packs/packages/theme-basic/package.json
  39. 4
      npm/ng-packs/packages/theme-shared/package.json
  40. 4
      npm/packs/anchor-js/package.json
  41. 4
      npm/packs/aspnetcore.components.server.basictheme/package.json
  42. 6
      npm/packs/aspnetcore.components.server.theming/package.json
  43. 4
      npm/packs/aspnetcore.mvc.ui.theme.basic/package.json
  44. 32
      npm/packs/aspnetcore.mvc.ui.theme.shared/package.json
  45. 2
      npm/packs/aspnetcore.mvc.ui/package-lock.json
  46. 2
      npm/packs/aspnetcore.mvc.ui/package.json
  47. 10
      npm/packs/blogging/package.json
  48. 2
      npm/packs/bootstrap-datepicker/package.json
  49. 2
      npm/packs/bootstrap-daterangepicker/package.json
  50. 4
      npm/packs/bootstrap/package.json
  51. 2
      npm/packs/chart.js/package.json
  52. 4
      npm/packs/clipboard/package.json
  53. 14
      npm/packs/cms-kit.admin/package.json
  54. 6
      npm/packs/cms-kit.public/package.json
  55. 6
      npm/packs/cms-kit/package.json
  56. 4
      npm/packs/codemirror/package.json
  57. 4
      npm/packs/core/package.json
  58. 4
      npm/packs/cropperjs/package.json
  59. 4
      npm/packs/datatables.net-bs4/package.json
  60. 4
      npm/packs/datatables.net-bs5/package.json
  61. 4
      npm/packs/datatables.net/package.json
  62. 12
      npm/packs/docs/package.json
  63. 2
      npm/packs/flag-icon-css/package.json
  64. 2
      npm/packs/flag-icons/package.json
  65. 4
      npm/packs/font-awesome/package.json
  66. 4
      npm/packs/highlight.js/package.json
  67. 4
      npm/packs/jquery-form/package.json
  68. 4
      npm/packs/jquery-validation-unobtrusive/package.json
  69. 4
      npm/packs/jquery-validation/package.json
  70. 4
      npm/packs/jquery/package.json
  71. 4
      npm/packs/jstree/package.json
  72. 4
      npm/packs/lodash/package.json
  73. 4
      npm/packs/luxon/package.json
  74. 4
      npm/packs/malihu-custom-scrollbar-plugin/package.json
  75. 4
      npm/packs/markdown-it/package.json
  76. 2
      npm/packs/moment/package.json
  77. 4
      npm/packs/owl.carousel/package.json
  78. 4
      npm/packs/popper.js/package.json
  79. 6
      npm/packs/prismjs/package.json
  80. 4
      npm/packs/qrcode/package.json
  81. 4
      npm/packs/select2/package.json
  82. 4
      npm/packs/signalr/package.json
  83. 2
      npm/packs/slugify/package.json
  84. 4
      npm/packs/star-rating-svg/package.json
  85. 4
      npm/packs/sweetalert2/package.json
  86. 4
      npm/packs/timeago/package.json
  87. 4
      npm/packs/toastr/package.json
  88. 6
      npm/packs/tui-editor/package.json
  89. 4
      npm/packs/uppy/package.json
  90. 2
      npm/packs/utils/package.json
  91. 4
      npm/packs/vee-validate/package.json
  92. 6
      npm/packs/virtual-file-explorer/package.json
  93. 2
      npm/packs/vue/package.json
  94. 4
      npm/packs/zxcvbn/package.json
  95. BIN
      source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip
  96. BIN
      source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip
  97. BIN
      source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip
  98. BIN
      source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip
  99. BIN
      source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip
  100. BIN
      source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip

257
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/POST.md

@ -0,0 +1,257 @@
# ABP Platform 10.0 RC Has Been Released
We are happy to release [ABP](https://abp.io) version **10.0 RC** (Release Candidate). This blog post introduces the new features and important changes in this new version.
Try this version and provide feedback for a more stable version of ABP v10.0! Thanks to you in advance.
## Get Started with the 10.0 RC
You can check the [Get Started page](https://abp.io/get-started) to see how to get started with ABP. You can either download [ABP Studio](https://abp.io/get-started#abp-studio-tab) (**recommended**, if you prefer a user-friendly GUI application - desktop application) or use the [ABP CLI](https://abp.io/docs/latest/cli).
By default, ABP Studio uses stable versions to create solutions. Therefore, if you want to create a solution with a preview version, first you need to create a solution and then switch your solution to the preview version from the ABP Studio UI:
![studio-switch-to-preview.png](studio-switch-to-preview.png)
## Migration Guide
There are a few breaking changes in this version that may affect your application. Please read the migration guide carefully, if you are upgrading from v9.3 or earlier: [ABP Version 10.0 Migration Guide](https://abp.io/docs/10.0/release-info/migration-guides/abp-10-0).
## What's New with ABP v10.0?
In this section, I will introduce some major features released in this version.
Here is a brief list of titles explained in the next sections:
* Upgraded to .NET 10.0
* Upgraded to Blazorise 1.8.2
* New Module: **Workflow (Elsa)**
* New Object Mapper: **Mapperly**
* Localization: Nested object support in JSON files
* Support EF Core Shared Entity Types on Repositories
* Add failure retry policy to InboxProcessor
* Migrate to New Esbuild-based Angular Builder
* Angular SSR support
### Upgraded to .NET 10.0
We've upgraded ABP to .NET 10.0, so you need to move your solutions to .NET 10.0 if you want to use ABP 10.0.
> Since the stable version of .NET 10 hasn't been released yet, we upgraded ABP to .NET v10.0-rc.1. Stable NET 10 is scheduled to launch as a **Long-Term Support (LTS)** release during .NET Conf 2025, which takes place November 11-13, 2025. We'll update the ABP Platform to the .NET 10 as soon as possible official .NET 10 release is completed.
### Upgraded to Blazorise v1.8.2
Upgraded the [Blazorise](https://blazorise.com/) library to v1.8.2 for Blazor UI. If you are upgrading your project to v10.0 RC, please ensure that all the Blazorise-related packages are using v1.8.2 in your application. Otherwise, you might get errors due to incompatible versions.
> See [#23717](https://github.com/abpframework/abp/issues/23717) for the updated NuGet packages.
### New Module: **Workflow (Elsa)**
ABP now ships a Workflow module that integrates [Elsa Workflows](https://github.com/elsa-workflows/elsa-core) to build visual, long-running, event-driven workflows in your ABP solutions (monolith or microservices). It provides seamless integration with ABP authentication/authorization, distributed event bus, persistence, background processing and includes support for hybrid UIs via Elsa Studio.
For a hands-on reference showcasing an end-to-end order/payment workflow across services, see the sample: [Elsa Workflows - Sample Workflow Demo](https://abp.io/docs/10.0/samples/elsa-workflows-demo). For capabilities, installation and configuration details (activities, storage, hosting, dashboard), see the module docs: [Workflow (Elsa) module](https://abp.io/docs/10.0/modules/elsa-pro).
![Workflow (Elsa) module](./elsa-workflow-instances.png)
### New Object Mapper: **Mapperly**
ABP modules now use Mapperly as the default object-to-object mapper. Mapperly is a compile-time, source generator–based mapper that removes runtime reflection and offers better performance with simpler maintenance. For background and implementation details, see the planning issue and the PR: [Switch to another object mapping library](https://github.com/abpframework/abp/issues/23243) and [Use Mapperly to replace AutoMapper in all modules](https://github.com/abpframework/abp/pull/23277).
The `Volo.Abp.AutoMapper` package remains available for backward compatibility. You can keep using AutoMapper in your solutions, but you are responsible for obtaining and managing its license if needed. For upgrade guidance and practical steps, follow the migration guide: [AutoMapper to Mapperly](https://abp.io/docs/10.0/release-info/migration-guides/AutoMapper-To-Mapperly).
### Localization: Nested object support in JSON files
ABP now supports nested objects (and arrays) in JSON localization files, allowing you to organize translations hierarchically and access them using the double underscore (`__`) separator. This improves maintainability for larger resource files and aligns lookups with familiar key paths.
> See the PR for details: [feat(l8n): add support for nested objects in localization files](https://github.com/abpframework/abp/pull/23701).
**Declaration (nested objects)**:
```json
{
"culture": "en",
"texts": {
"MyNestedTranslation": {
"SomeKey": "Some nested value",
"SomeOtherKey": "Some other nested value"
}
}
}
```
**Usage**:
```csharp
L["MyNestedTranslation__SomeKey"];
L["MyNestedTranslation__SomeOtherKey"];
```
**Declaration (arrays)**:
```json
{
"culture": "en",
"texts": {
"Menu": {
"Items": ["Home", "About", "Contact"]
}
}
}
```
**Usage**:
```csharp
L["Menu__Items__0"]; // Home
L["Menu__Items__2"]; // Contact
```
### Support EF Core Shared Entity Types on Repositories
ABP repositories now support EF Core **shared-type entity** types by allowing a custom entity name to be set on a repository before performing operations. Internally, this uses EF Core's `DbContext.Set<T>(string name)` to target the correct `DbSet`/table for the same CLR type, enabling scenarios like per-tenant tables, archives, or partitioning, and you can switch the target at runtime. See the PR: [Support EF Core Shared Entity Types on Repositories](https://github.com/abpframework/abp/pull/23588) and the EF Core documentation on [shared-type entity types](https://learn.microsoft.com/en-us/ef/core/modeling/entity-types?tabs=data-annotations#shared-type-entity-types).
**Example**:
```csharp
// Set the shared entity name so repository operations target that table
var repo = serviceProvider.GetRequiredService<IRepository<MyEntity, Guid>>();
repo.SetCustomEntityName("MyEntity_TenantA");
var list = await repo.GetListAsync();
// Switch to another shared name later on the same instance
repo.SetCustomEntityName("MyEntity_Archive");
await repo.InsertAsync(new MyEntity { /* ... */ });
```
### Add failure retry policy to InboxProcessor
`InboxProcessor` now supports configurable failure handling strategies per event: **Retry** (default; reprocess in the next cycle), **RetryLater** (skip the failing event and retry it later with exponential backoff; the backoff factor and maximum retries are configurable), and **Discard** (drop the failing event). This prevents a single failing handler from blocking subsequent events and improves resiliency.
> **Note**: This is a breaking change because `IncomingEvent` entity properties were updated. See the PR for details: [Add failure retry policy to InboxProcessor](https://github.com/abpframework/abp/pull/23563).
### Migrate to New Esbuild-based Angular Builder
We've migrated ABP Angular templates and packages to Angular's new esbuild-based build system (introduced in Angular 17+ and fully supported in Angular 20) to deliver faster builds, modern ESM support, built-in SSR/prerender capabilities, and a better development experience. This change is non-breaking for existing apps. See the tracking issue and PR: [Angular - Migrate to New Esbuild-based Angular Builder](https://github.com/abpframework/abp/issues/23242), [feat: Update Angular templates to Angular 20 new build system](https://github.com/abpframework/abp/pull/23363).
**Key updates in templates/config**:
- Builder switched from `@angular-devkit/build-angular:browser` to `@angular-devkit/build-angular:application`.
- `main` option replaced by `browser`; `polyfills` moved to array form.
- TypeScript updated to `es2020` with `esModuleInterop: true`; module target `esnext`.
**More Angular updates**:
- Unit tests have been updated for the new builder and configuration: [#23460](https://github.com/abpframework/abp/pull/23460).
**Warnings**:
- Constructor injections migrated to Angular's `inject()` function. If you extend a class and previously called `super(...)` with injected params, remove those parameters. See: [Angular inject() migration](https://angular.dev/reference/migrations/inject-function).
- `provideLogo` and `withEnvironmentOptions` have moved from LeptonX packages to `@abp/ng.theme-shared`.
- If you use the new application builder and have `tsconfig.json` path mappings that point into `node_modules`, remove those mappings and prefer symlinks instead. See a symlink reference: [Creating symbolic links](https://hostman.com/tutorials/creating-symbolic-links-in-linux/).
### Angular SSR support
ABP Angular templates now support Server-Side Rendering (SSR) with the Angular Application Builder, enabling hybrid rendering (SSR + CSR) for improved first paint, SEO and perceived performance. This includes SSR-safe platform checks (no direct `window`/`location`/`localStorage`), OIDC auth compatibility via cookie-backed storage, and `TransferState` to prevent duplicate HTTP GETs during hydration. For implementation highlights and usage (including how to run the SSR dev server and the `transferStateInterceptor`), see the issue and PR: [Angular SSR](https://github.com/abpframework/abp/issues/23055), [Hybrid Rendering & Application Builder](https://github.com/abpframework/abp/pull/23416).
> See Angular's official guide for details on hybrid rendering (prerender + SSR + CSR): [Angular SSR](https://angular.dev/guide/ssr) and on the builder migration: [Angular build system migration](https://angular.dev/tools/cli/build-system-migration).
## Community News
### Recent Events
We recently hosted two sessions of ABP Community Talks:
#### Community Talks 2025.06: Microservices with ABP Template
The Easiest Way to Get Started with Microservices on .NET Using ABP Microservice Solution Template: a deep dive into ABP’s microservice template, showing how ABP Studio streamlines creating, running, and scaling distributed systems. See the event page: [Community Talks: Microservices with ABP Template](https://abp.io/community/events/community-talks/the-easiest-way-to-get-started-with-microservices-on-.net-using-abp-microservice-solution-template-fd2comfn).
<img src="./community-talk-2025-06.png" alt="ABP Community Talks: Microservices with ABP Template" width="360">
#### Community Talks 2025.07: Developer-Friendly CMS for .NET
Beyond WordPress: A Developer-Friendly CMS for .NET: an overview of building custom web apps with ABP CMS Kit, integrating content management with your application code. Learn more: [Community Talks: Developer-Friendly CMS for .NET](https://abp.io/community/events/community-talks/beyond-wordpress-a-developerfriendly-cms-for-.net-mubtips6).
<img src="./community-talk-2025-07.png" alt="ABP Community Talks: Developer-Friendly CMS for .NET" width="360">
### Weekly Webinar: Discover ABP Platform
We’ve started a **weekly live webinar series** designed for developers who want to get the most out of the **ABP Platform**. This event is designed for those new to ABP to help you understand its core features, capabilities, and licensing models.
![ABP Weekly Webinar - Discover ABP Platform](./abp-webinar.png)
Every webinar features live coding demos, practical examples, and an open Q&A segment where you can get your questions answered directly by the ABP team. Whether you’re just starting with ABP or looking to explore advanced scenarios, these sessions will help you build better apps faster.
[👉 Register here to join an upcoming session!](https://abp.io/webinars/discover-abp-platform)
### New ABP Community Articles
There are exciting articles contributed by the ABP community as always. I will highlight some of them here:
- [Alper Ebiçoğlu](https://abp.io/community/members/alper):
- [High-Performance .NET Libraries You Didn’t Know You Needed](https://abp.io/community/articles/high-performance-net-libraries-you-did-not-know-nu5t88sz)
- [.NET 10: What You Need to Know (LTS Release, Coming November 2025)](https://abp.io/community/articles/net-10-preview-features-breaking-changes-enhancements-xennnnky)
- [Best Free Alternatives to AutoMapper in .NET — Why We Moved to Mapperly](https://abp.io/community/articles/best-free-alternatives-to-automapper-in-net-l9f5ii8s)
- [Liming Ma](https://abp.io/community/members/maliming):
- [Keep Track of Your Users in an ASP.NET Core Application](https://abp.io/community/articles/keep-track-of-your-users-in-an-asp.net-core-application-jlt1fxvb)
- [App Services vs Domain Services](https://abp.io/community/articles/app-services-vs-domain-services-4dvau41u)
- [Using Hangfire Dashboard in ABP API Website](https://abp.io/community/articles/using-hangfire-dashboard-in-abp-api-website--r32ox497)
- [Fahri Gedik](https://abp.io/community/members/fahrigedik):
- [Backward‑Compatible REST APIs in .NET Microservices](https://abp.io/community/articles/backward-compatible-rest-apis-dotnet-microservices-9rzlb4q6)
- [Best Practices for Designing Backward‑Compatible REST APIs in a Microservice Solution for .NET Developers](https://abp.io/community/articles/best-practices-for-designing-backward‑compatible-rest-apis-in-a-microservice-solution-for-.net-developers-t1m4kzfa)
- [Stepbystep AWS Secrets Manager Integration in ABP](https://abp.io/community/articles/stepbystep-aws-secrets-manager-integration-in-abp-3dcblyix)
- [Engincan Veske](https://abp.io/community/members/engincanv):
- [Building a Permission-Based Authorization System for ASP.NET Core](https://abp.io/community/articles/building-a-permission-based-authorization-system-for-asp-net-owyszy0b)
- [Where and How to Store Your Blob Objects in .NET](https://abp.io/community/articles/where-and-how-to-store-your-blob-objects-in-dotnet-r2r1vjjd)
- [Salih Özkara](https://abp.io/community/members/salih):
- [Truly Layering a .NET Application Based on DDD Principles](https://abp.io/community/articles/truly-layering-a-net-application-based-on-ddd-principles-428jhn3a)
- [Kori Francis](https://abp.io/community/members/kfrancis@clinicalsupportsystems.com):
- [ABP Postmark Email Integration, Templated Emails](https://abp.io/community/articles/abp-postmark-email-integration-templated-emails-gvgc6pfj)
- [Universal Redis Configuration in ABP Aspire Deployment](https://abp.io/community/articles/universal-redis-configuration-abp-aspire-deployment-qp90c7u4)
- [Sajankumar Vijayan](https://abp.io/community/members/connect):
- [Multi-tenant SaaS apps, Cloudflare DNS](https://abp.io/community/articles/multi-tenant%20SaaS%20apps,%20Cloudflare%20DNs-dar977al)
- [Selman Koc](https://abp.io/community/members/selmankoc):
- [Azure DevOps, CI/CD pipelines, Azure DevOps best practices](https://abp.io/community/articles/Azure%20DevOps,%20CI%2FCD%20pipelines,%20Azure%20DevOps%20best%20practices,-wiguy1ew)
- [Sümeyye Kurtuluş](https://abp.io/community/members/sumeyye.kurtulus):
- [ABP Now Supports Angular Standalone Applications](https://abp.io/community/articles/abp-now-supports-angular-standalone-applications-zzi2rr2z)
- [Supercharge your Angular app: A developer's guide to unlock](https://abp.io/community/articles/supercharge-your-angular-app-a-developers-guide-to-unlock-0dmu7tkr)
- [Mansur Besleney](https://abp.io/community/members/mansur.besleney):
- [Demystified Aggregates in DDD & .NET: From Theory to Practice](https://abp.io/community/articles/demystified-aggregates-in-ddd-and-dotnet-2becl93q)
- [How to Build Persistent Background Jobs with ABP Framework and Quartz](https://abp.io/community/articles/how-to-build-persistent-background-jobs-with-abp-framework-n9aloh93)
- [Angular Application Builder: Transitioning from Webpack to Esbuild](https://abp.io/community/articles/angular-application-builder-transitioning-from-webpack-to-3yzhzfl0)
- [Muhammet Ali Özkaya](https://abp.io/community/members/m.aliozkaya):
- [Implementing Unit of Work with ASP.NET Core](https://abp.io/community/articles/implementing-unit-of-work-with-asp.net-core-lv4v2tyf)
- [Enis Necipoğlu](https://abp.io/community/members/enisn):
- [Integration Services Explained: What They Are & When to Use](https://abp.io/community/articles/integration-services-explained-what-they-are-when-to-use-lienmsy8)
- [Berkan Şaşmaz](https://abp.io/community/members/berkansasmaz):
- [How to Dynamically Set the Connection String in EF Core](https://abp.io/community/articles/how-to-dynamically-set-the-connection-string-in-ef-core-30k87fpj)
- [Emre Kara](https://abp.io/community/members/emre.kara):
- [A Developer's Guide to Distributed Event Buses in .NET](https://abp.io/community/articles/a-developers-guide-to-distributed-event-buses-in-.net-oehl23kb)
- [Oğuzhan Ağır](https://abp.io/community/members/oguzhan.agir):
- [In-Memory Background Job Queue in ASP.NET Core](https://abp.io/community/articles/in-memory-background-job-queue-aspnet-core-pai2zmtr)
- [Alperen Samurlu](https://abp.io/community/members/alperen.samurlu):
- [How Can We Apply the DRY Principle in a Better Way?](https://abp.io/community/articles/how-can-we-apply-the-dry-principle-in-a-better-way-pmc4eao2)
- [Ahmet Çelik](https://abp.io/community/members/ahmet.celik):
- [Best Practices Guide for REST API Design](https://abp.io/community/articles/best-practices-guide-for-rest-api-design-oexc1euj)
- [Elanur Oğuz](https://abp.io/community/members/s.elanuroguz):
- [Web Design Basics for Graphic Designers Who Don't Code](https://abp.io/community/articles/web-design-basics-for-graphic-designers-who-dont-code-0c2jgt2v)
- [Seda Şen](https://abp.io/community/members/seda.sen):
- [Color Psychology in Web Design](https://abp.io/community/articles/color-psychology-in-web-design-z383jph8)
- [Halime Karayay](https://abp.io/community/members/halimekarayay):
- [10 Modern HTML CSS Techniques Every Designer Should Know](https://abp.io/community/articles/10-modern-html-css-techniques-every-designer-should-know-zxnwilf4)
- [Anto Subash](https://abp.io/community/members/antosubash):
- [ABP React CMS Module: Building Dynamic Pages with Puck](https://abp.io/community/articles/abp-react-cms-module-building-dynamic-pages-with-puck-auxvrwgf)
- [Yağmur Çelik](https://abp.io/community/members/yagmur.celik):
- [Integration Testing Best Practices for Building a Robust API](https://abp.io/community/articles/integration-testing-best-practices-for-building-a-robust-udcwef71)
- [Suhaib Mousa](https://abp.io/community/members/suhaib-mousa):
- [Visual Studio 2026 - What's New and Why I'm Excited About It](https://abp.io/community/articles/visual-studio-2026-e4s5hed7)
- [Alex Maiereanu](https://abp.io/community/members/alex.maiereanu@3sstudio.com):
- [ABP-Hangfire-AzurePostgreSQL](https://abp.io/community/articles/abphangfireazurepostgresql-s1jnf3yg)
- [Jack Fistelmann](https://abp.io/community/members/jfistelmann):
- [ABP and maildev](https://abp.io/community/articles/abp-and-maildev-gy13cr1p)
- Tarık Özdemir:
- [AI-First Architecture for .NET Projects: A Modern Blueprint](https://abp.io/community/articles/AI-First%20Architecture%20for%20.NET%20Projects%3A%20A%20Modern%20Blueprint-h2wgcoq3)
- [Prabhjot Singh](https://abp.io/community/members/prabhjot):
- [Switching from Project References to Package References](https://abp.io/community/articles/switching-from-project-references-to-package-references-ql16qwx0)
- [Yunus Emre Kalkan](https://abp.io/community/members/yekalkan):
- [New in ABP Studio: Docker Container Management](https://abp.io/community/articles/abp-studio-docker-container-management-ex7r27y8)
- [Burak Demir](https://abp.io/community/members/burakdemir):
- [Solving MongoDB GUID Issues After an ABP Framework Upgrade](https://abp.io/community/articles/solving-mongodb-guid-issues-after-an-abp-framework-upgrade-tv8waw1n)
Thanks to the ABP Community for all the content they have published. You can also [post your ABP-related (text or video) content](https://abp.io/community/posts/create) to the ABP Community.
## Conclusion
This version comes with some new features and a lot of enhancements to the existing features. You can see the [Road Map](https://abp.io/docs/10.0/release-info/road-map) documentation to learn about the release schedule and planned features for the next releases. Please try ABP v10.0 RC and provide feedback to help us release a more stable version.
Thanks for being a part of this community!

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/abp-webinar.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-06.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 85 KiB

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/community-talk-2025-07.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 79 KiB

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

21
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/discover-abp.svg

@ -0,0 +1,21 @@
<svg width="120" height="112" viewBox="0 0 120 112" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_12211_9057)">
<g clip-path="url(#clip1_12211_9057)">
<path d="M74.7008 22.1601C74.2178 22.9077 62.3268 40.7101 47.4689 36.131C38.223 33.2807 31.852 36.1777 29 38V10.1984C33.692 9.70778 42.5929 9.73115 50.1139 15.0812C60.8318 22.6974 72.6998 19.5201 72.8148 19.4968C73.5048 19.2865 74.2638 19.5668 74.6778 20.1509C75.0918 20.7583 75.1148 21.5527 74.7008 22.1601Z" fill="#00B1AE"/>
<path d="M29 3.5V80.5C29 82.425 26.75 84 24 84C21.25 84 19 82.425 19 80.5V3.5C19 1.575 21.25 0 24 0C26.75 0 29 1.575 29 3.5Z" fill="#1E2127"/>
</g>
<path d="M60.2326 118.596C65.6914 118.596 70.1165 114.171 70.1165 108.711C70.1165 103.252 65.6914 98.8262 60.2326 98.8262C54.7738 98.8262 50.3484 103.252 50.3484 108.711C50.3484 114.171 54.7738 118.596 60.2326 118.596Z" fill="#E83090"/>
<path d="M60.5475 50C51.696 49.9916 42.9588 52.0332 35 55.9698V68.7186C42.0908 64.1195 50.2569 61.5163 58.6629 61.1752C67.0686 60.834 75.4129 62.7672 82.8422 66.777C90.2714 70.7868 96.5193 76.7293 100.947 83.9968C105.374 91.2644 107.822 99.5962 108.041 108.141V144C114.308 135.126 118.044 124.668 118.84 113.776C119.635 102.885 117.459 91.9808 112.549 82.2643C107.64 72.5479 100.189 64.3953 91.0142 58.703C81.8394 53.0107 71.2974 49.9993 60.5475 50Z" fill="#1E2127"/>
<path d="M60.683 156.922C48.2118 156.921 36.2196 152.145 27.1943 143.583C18.1694 135.022 12.8039 123.332 12.2118 110.94H12.1556V74C3.42838 86.1326 -0.391425 101.086 1.45431 115.892C3.30006 130.697 10.6766 144.27 22.1189 153.914C33.5611 163.558 48.2314 168.568 63.2155 167.949C78.2001 167.329 92.4018 161.126 103 150.57V132.286C98.7811 139.76 92.6369 145.982 85.1997 150.312C77.7625 154.641 69.3004 156.923 60.683 156.922Z" fill="#1E2127"/>
<path d="M60.2369 124.479C56.6556 124.482 53.1769 123.283 50.3581 121.074V132.407C55.4969 134.521 61.179 134.927 66.5662 133.566C71.9538 132.204 76.7607 129.147 80.2785 124.846C83.7964 120.544 85.8386 115.225 86.104 109.674C86.3695 104.123 84.8441 98.6341 81.7528 94.0161C78.6615 89.3981 74.1682 85.8963 68.9354 84.0269C63.7026 82.1572 58.0075 82.0192 52.6901 83.6331C47.3731 85.2467 42.7153 88.5272 39.4041 92.9898C36.0925 97.4527 34.303 102.862 34.2993 108.419V141.744C37.3127 144.117 40.6366 146.066 44.1785 147.537V108.404C44.1785 105.227 45.1202 102.122 46.8847 99.4809C48.6494 96.8399 51.1574 94.7813 54.0915 93.5658C57.026 92.3503 60.2547 92.0323 63.3697 92.6518C66.4847 93.2716 69.3463 94.801 71.5921 97.0472C73.8379 99.2933 75.3673 102.155 75.9868 105.27C76.6066 108.386 76.2883 111.615 75.0732 114.549C73.8576 117.484 71.7994 119.992 69.1584 121.757C66.5178 123.522 63.4131 124.464 60.2369 124.464V124.479Z" fill="#1E2127"/>
<path d="M28.8975 135.261V108.575C28.9005 101.893 31.0473 95.3828 35.0306 89.9775C39.014 84.5722 44.629 80.5486 51.0723 78.4832C57.5152 76.4177 64.4559 76.4163 70.8998 78.4791C77.3441 80.542 82.9608 84.5633 86.9465 89.967C90.9318 95.3706 93.0816 101.88 93.0873 108.562C93.0933 115.245 90.9552 121.758 86.9792 127.168C83.0032 132.579 77.3935 136.61 70.9533 138.684C64.513 140.758 57.5724 140.768 51.1255 138.714V148.837C58.3953 150.573 66.003 150.363 73.1622 148.227C80.3217 146.092 86.773 142.109 91.8489 136.69C96.9252 131.272 100.442 124.615 102.036 117.407C103.63 110.198 103.242 102.701 100.915 95.69C98.5867 88.6791 94.4025 82.4084 88.7944 77.5266C83.1867 72.6449 76.3584 69.3291 69.0161 67.9221C61.6737 66.5151 54.0837 67.068 47.0308 69.5236C39.9776 71.9792 33.7175 76.2484 28.8975 81.8897V68.359V60C25.3219 62.2709 22.0037 64.9137 19 67.8829V109.818C19.2804 119.161 22.7701 128.131 28.8975 135.261Z" fill="#1E2127"/>
</g>
<defs>
<clipPath id="clip0_12211_9057">
<rect width="120" height="112" fill="white"/>
</clipPath>
<clipPath id="clip1_12211_9057">
<rect width="76" height="76" fill="white" transform="translate(19)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/elsa-workflow-instances.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 165 KiB

BIN
docs/en/Blog-Posts/2025-10-02 v10_0_Preview/studio-switch-to-preview.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

371
docs/en/Community-Articles/2025-09-30-Why-Do-You-Need-Distributed-Locking-In-Net-Core/article.md

@ -0,0 +1,371 @@
# Why Do You Need Distributed Locking in ASP.NET Core
## Introduction
In modern distributed systems, synchronizing access to common resources among numerous instances is a critical problem. Whenever lots of servers or processes concurrently attempt to update the same resource simultaneously, race conditions can lead to data corruption, redundant work, and inconsistent state. Throughout the implementation of the ABP framework, we encountered and overcame this exact same problem with assistance from a stable distributed locking mechanism. In this post, we will present our experience and learnings when implementing this solution, so you can understand when and why you would need distributed locking in your ASP.NET Core applications.
## Problem
Suppose you are running an e-commerce application deployed on multiple servers for high availability. A customer places an order, which kicks off a background job that reserves inventory and charges payment. If not properly synchronized, the following is what can happen:
### Race Conditions in Multi-Instance Deployments
When your ASP.NET Core application is scaled horizontally with multiple instances, each instance works independently. If two instances simultaneously perform the same operation—like deducting inventory, generating invoice numbers, or processing a refund—you can end up with:
- **Duplicate operations**: The same payment processed twice
- **Data inconsistency**: Inventory count becomes negative or incorrect
- **Lost updates**: One instance's changes overwrite another's
- **Sequential ID conflicts**: Two instances generate the same invoice number
### Background Job Processing
Background work libraries like Quartz.NET or Hangfire usually run on multiple workers. Without distributed locking:
- Multiple workers can choose the same task
- Long-running processes can be executed parallel when they should be executed in a sequence
- Jobs that depend on exclusive resource access can corrupt shared data
### Cache Invalidation and Refresh
When distributed caching is employed, there can be multiple instances that simultaneously identify a cache miss and attempt to rebuild the cache, leading to:
- High database load owing to concurrent rebuild cache requests
- Race conditions under which older data overrides newer data
- wasted computational resources
### Rate Limiting and Throttling
Enforcing rate limits across multiple instances of the application requires coordination. If there is no distributed locking, each instance has its own limits, and global rate limits cannot be enforced properly.
The root issue is simple: **the default C# locking APIs (lock, SemaphoreSlim, Monitor) work within a process in isolation**. They will not assist with distributed cases where coordination must take place across servers, containers, or cloud instances.
## Solutions
Several approaches exist for implementing distributed locking in ASP.NET Core applications. Let's explore the most common solutions, their trade-offs, and why we chose our approach for ABP.
### 1. Database-Based Locking
Using your existing database to place locks by inserting or updating rows with distinctive values.
**Pros:**
- No additional infrastructure required
- Works with any relational database
- Transactions provide ACID guarantees
**Cons:**
- Database round-trip performance overhead
- Can lead to database contention under high load
- Must be controlled to prevent orphaned locks
- Not suited for high-frequency locking scenarios
**When to use:** Small-scale applications where you do not wish to add additional infrastructure, and lock operations are low frequency.
### 2. Redis-Based Locking
Redis has atomic operations that make it excellent at distributed locking, using commands such as `SET NX` (set if not exists) with expiration.
**Pros:**
- Low latency and high performance
- Expiration prevents lost locks built-in
- Well-established with tested patterns (Redlock algorithm)
- Works well for high-throughput use cases
**Cons:**
- Requires Redis infrastructure
- Network partitions might be an issue
- One Redis instance is a single point of failure (although Redis Cluster reduces it)
**Resources:**
- [Redis Distributed Locks Documentation](https://redis.io/docs/manual/patterns/distributed-locks/)
- [Redlock Algorithm](https://redis.io/topics/distlock)
**When to use:** Production applications with multiple instances where performance is critical, especially if you are already using Redis as a caching layer.
### 3. Azure Blob Storage Leases
Azure Blob Storage offers lease functionality which can be utilized for distributed locks.
**Pros:**
- Part of Azure, no extra infrastructure
- Lease expiration automatically
- Low-frequency locks are economically viable
**Cons:**
- Azure-specific, not portable
- Latency greater than Redis
- Azure cloud-only projects
**When to use:** Azure-native applications with low-locking frequency where you need to minimize moving parts.
### 4. etcd or ZooKeeper
Distributed coordination services designed from scratch to accommodate consensus and locking.
**Pros:**
- Designed for distributed coordination
- Strong consistency guaranteed
- Robust against network partitions
**Cons:**
- Difficulty in setting up the infrastructure
- Excess baggage for most applications
- Steep learning curve
**Use when:** Large distributed systems with complex coordination require more than basic locking.
### Our Choice: Abstraction with Multiple Implementations
For ABP, we chose to use an **abstraction layer** with support for multibackend. This provides flexibility to the developers so that they can choose the best implementation depending on their infrastructure. Our default implementations include support for:
- **Redis** (recommended for most scenarios)
- **Database-based locking** (for less complicated configurations)
- In-memory single-instance and development locks
We started with Redis because it offers the best tradeoff between ease of operation, reliability, and performance for distributed cases. But abstraction prevents applications from becoming technology-dependent, and it's easier to start simple and expand as needed.
## Implementation
Let's implement a simplified distributed locking mechanism using Redis and StackExchange.Redis. This example shows the core concepts without ABP's framework complexity.
First, install the required package:
```bash
dotnet add package StackExchange.Redis
```
Here's a basic distributed lock implementation:
```csharp
public interface IDistributedLock
{
Task<IDisposable?> TryAcquireAsync(
string resource,
TimeSpan expirationTime,
CancellationToken cancellationToken = default);
}
public class RedisDistributedLock : IDistributedLock
{
private readonly IConnectionMultiplexer _redis;
private readonly ILogger<RedisDistributedLock> _logger;
public RedisDistributedLock(
IConnectionMultiplexer redis,
ILogger<RedisDistributedLock> logger)
{
_redis = redis;
_logger = logger;
}
public async Task<IDisposable?> TryAcquireAsync(
string resource,
TimeSpan expirationTime,
CancellationToken cancellationToken = default)
{
var db = _redis.GetDatabase();
var lockKey = $"lock:{resource}";
var lockValue = Guid.NewGuid().ToString();
// Try to acquire the lock using SET NX with expiration
var acquired = await db.StringSetAsync(
lockKey,
lockValue,
expirationTime,
When.NotExists);
if (!acquired)
{
_logger.LogDebug(
"Failed to acquire lock for resource: {Resource}",
resource);
return null;
}
_logger.LogDebug(
"Lock acquired for resource: {Resource}",
resource);
return new RedisLockHandle(db, lockKey, lockValue, _logger);
}
private class RedisLockHandle : IDisposable
{
private readonly IDatabase _db;
private readonly string _lockKey;
private readonly string _lockValue;
private readonly ILogger _logger;
private bool _disposed;
public RedisLockHandle(
IDatabase db,
string lockKey,
string lockValue,
ILogger logger)
{
_db = db;
_lockKey = lockKey;
_lockValue = lockValue;
_logger = logger;
}
public void Dispose()
{
if (_disposed) return;
try
{
// Only delete if we still own the lock
var script = @"
if redis.call('get', KEYS[1]) == ARGV[1] then
return redis.call('del', KEYS[1])
else
return 0
end";
_db.ScriptEvaluate(
script,
new RedisKey[] { _lockKey },
new RedisValue[] { _lockValue });
_logger.LogDebug("Lock released for key: {LockKey}", _lockKey);
}
catch (Exception ex)
{
_logger.LogError(
ex,
"Error releasing lock for key: {LockKey}",
_lockKey);
}
finally
{
_disposed = true;
}
}
}
}
```
Register the service in your `Program.cs`:
```csharp
builder.Services.AddSingleton<IConnectionMultiplexer>(sp =>
{
var configuration = ConfigurationOptions.Parse("localhost:6379");
return ConnectionMultiplexer.Connect(configuration);
});
builder.Services.AddSingleton<IDistributedLock, RedisDistributedLock>();
```
Now you can use distributed locking in your services:
```csharp
public class OrderService
{
private readonly IDistributedLock _distributedLock;
private readonly ILogger<OrderService> _logger;
public OrderService(
IDistributedLock distributedLock,
ILogger<OrderService> logger)
{
_distributedLock = distributedLock;
_logger = logger;
}
public async Task ProcessOrderAsync(string orderId)
{
var lockResource = $"order:{orderId}";
// Try to acquire the lock with 30-second expiration
await using var lockHandle = await _distributedLock.TryAcquireAsync(
lockResource,
TimeSpan.FromSeconds(30));
if (lockHandle == null)
{
_logger.LogWarning(
"Could not acquire lock for order {OrderId}. " +
"Another process might be processing it.",
orderId);
return;
}
// Critical section - only one instance will execute this
_logger.LogInformation("Processing order {OrderId}", orderId);
// Your order processing logic here
await Task.Delay(1000); // Simulating work
_logger.LogInformation(
"Order {OrderId} processed successfully",
orderId);
// Lock is automatically released when lockHandle is disposed
}
}
```
### Key Implementation Details
**Lock Key Uniqueness**: Use hierarchical, descriptive keys (`order:12345`, `inventory:product-456`) to avoid collisions.
**Lock Value**: We use a single distinct GUID as the lock value. This ensures only the lock owner can release it, excluding unintentional deletion by expired locks or other operations.
**Automatic Expiration**: Always provide an expiration time to prevent deadlocks when a process halts with an outstanding lock.
**Lua Script for Release**: Releasing uses a Lua script to atomically check ownership and delete the key. This prevents releasing a lock that has already timed out and is reacquired by another process.
**Disposal Pattern**: With `IDisposable` and `await using`, one ensures that the lock is released regardless of the exception that occurs.
### Handling Lock Acquisition Failures
Depending on your use case, you have several options when lock acquisition fails:
```csharp
// Option 1: Return early (shown above)
if (lockHandle == null)
{
return;
}
// Option 2: Retry with timeout
var retryCount = 0;
var maxRetries = 3;
IDisposable? lockHandle = null;
while (lockHandle == null && retryCount < maxRetries)
{
lockHandle = await _distributedLock.TryAcquireAsync(
lockResource,
TimeSpan.FromSeconds(30));
if (lockHandle == null)
{
retryCount++;
await Task.Delay(TimeSpan.FromMilliseconds(100 * retryCount));
}
}
if (lockHandle == null)
{
throw new InvalidOperationException("Could not acquire lock after retries");
}
// Option 3: Queue for later processing
if (lockHandle == null)
{
await _queueService.EnqueueForLaterAsync(orderId);
return;
}
```
This is a good foundation for distributed locking in ASP.NET Core applications. It addresses the most common scenarios and edge cases, but production can call for more sophisticated features like lock re-renewal for long-running operations or more sophisticated retry logic.
## Conclusion
Distributed locking is a necessity for data consistency and prevention of race conditions in new, scalable ASP.NET Core applications. As we've discussed, the problem becomes unavoidable as soon as you move beyond single-instance deployments to horizontally scaled multi-server, container, or background job worker deployments.
We examined several of them, from database-level locks to Redis, Azure Blob Storage leases, and coordination services. Each has its place, but Redis-based locking offers the best balance of performance, reliability, and ease in most situations. The example implementation we provided shows how to implement a well-crafted distributed locking mechanism with minimal dependence on other libraries.
Whether you implement your own solution or utilize a framework like ABP, familiarity with the concepts of distributed locking will help you build more stable and scalable applications. We hope by sharing our experience, we can keep you from falling into typical pitfalls and have distributed locking properly implemented on your own projects.

BIN
docs/en/Community-Articles/2025-09-30-Why-Do-You-Need-Distributed-Locking-In-Net-Core/cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 382 KiB

108
docs/en/Community-Articles/2025-10-03-Generating-Sequential-GUIDs/Post.md

@ -0,0 +1,108 @@
# You May Have Trouble with GUIDs: Generating Sequential GUIDs in .NET
If you’ve ever shoved a bunch of `Guid.NewGuid()` values into a SQL Server table with a clustered index on the PK, you’ve probably felt the pain: **Index fragmentation so bad you could use it as modern art.** Inserts slow down, page splits go wild, and your DBA starts sending you passive-aggressive Slack messages.
And yet… we keep doing it. Why? Because GUIDs are _easy_. They’re globally unique, they don’t need a round trip to the DB, and they make distributed systems happy. But here’s the catch: **random GUIDs are absolute chaos for ordered indexes**.
## The Problem with Vanilla GUIDs
* **Randomness kills order** — clustered indexes thrive on sequential inserts; random GUIDs force constant reordering.
* **Performance hit** — every insert can trigger page splits and index reshuffling.
* **Storage bloat** — fragmentation means wasted space and slower reads.
Sure, you could switch to int or long identity columns, but then you lose the distributed generation magic and security benefits (predictable IDs are guessable).
## Sequential GUIDs to the Rescue
Sequential GUIDs keep the uniqueness but add a predictable ordering component, usually by embedding a timestamp in part of the GUID. This means:
* Inserts happen at the “end” of the index, not all over the place.
* Fragmentation drops dramatically.
* You still get globally unique IDs without DB trips.
Think of it as **GUIDs with manners**.
## ABP Framework’s Secret Sauce
Here’s where ABP Framework flexes: it **uses sequential GUIDs by default** for entity IDs. No ceremony, no “remember to call this helper method”, it’s baked in.
Under the hood:
* ABP ships with IGuidGenerator (default: SequentialGuidGenerator).
* It picks the right sequential strategy for your DB provider:
* **SequentialAtEnd** → SQL Server
* **SequentialAsString** → MySQL/PostgreSQL
* **SequentialAsBinary** → Oracle
* EF Core integration packages auto-configure this, so you rarely need to touch it.
Example in ABP:
```csharp
public class MyProductService : ITransientDependency
{
private readonly IRepository<Product, Guid> _productRepository;
private readonly IGuidGenerator _guidGenerator;
public MyProductService(
IRepository<Product, Guid> productRepository,
IGuidGenerator guidGenerator)
{
_productRepository = productRepository;
_guidGenerator = guidGenerator;
}
public async Task CreateAsync(string productName)
{
var product = new Product(_guidGenerator.Create(), productName);
await _productRepository.InsertAsync(product);
}
}
```
No `Guid.NewGuid()` here, `_guidGenerator.Create()` gives you a sequential GUID every time.
## Benefits of Sequential GUIDs
Let’s say you’re inserting 1M rows into a table with a clustered primary key:
* **Random GUIDs** → fragmentation ~99%, insert throughput tanks.
* **Sequential GUIDs** → fragmentation stays low, inserts fly.
In high-volume systems, this difference is **not** academic, it’s the difference between smooth scaling and spending weekends rebuilding indexes.
## When to Use Sequential GUIDs
* **Distributed systems** that still want DB-friendly inserts.
* **High-write workloads** with clustered indexes on GUID PKs.
* **Multi-tenant apps** where IDs need to be unique across tenants.
## When Random GUIDs Still Make Sense
* Security through obscurity, if you don’t want IDs to hint at creation order.
* Non-indexed identifiers, fragmentation isn’t a concern.
## The Final Take
ABP’s default sequential GUID generation is one of those “**small but huge**” features. It’s the kind of thing you don’t notice until you benchmark, and then you wonder why you ever lived without it.
## Links
You may want to check the following references to learn more about sequential GUIDs:
- [ABP Framework Documentation: Sequential GUIDs](https://docs.abp.io/en/abp/latest/Guid-Generation)

BIN
docs/en/Community-Articles/2025-10-03-Generating-Sequential-GUIDs/cover-image.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 205 KiB

BIN
docs/en/Community-Articles/2025-10-03-Native-AOT/Cover.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 531 KiB

72
docs/en/Community-Articles/2025-10-03-Native-AOT/Post.md

@ -0,0 +1,72 @@
# Native AOT: How to Fasten Startup Time and Memory Footprint
So since .NET 8 there's been one feature that’s quietly a game-changer for performance nerds is **Native AOT** (Ahead-of-Time compilation). If you’ve ever fought with sluggish cold starts (especially in containerized or serverless environments), or dealt with memory pressure from bloated apps, Native AOT might just be your new best friend.
------
## What is Native AOT?
Normally, .NET apps ship as IL (*Intermediate Language*) and JIT-compile at runtime. That’s flexible, but it takes longer startup time and memory.
Native AOT flips the script: your app gets compiled straight into a platform-specific binary *before it ever runs*.
As a result;
- No JIT overhead at startup.
- Smaller memory footprint (no JIT engine or IL sitting around).
- Faster startup (especially noticeable in microservices, functions, or CLI tools).
------
## Advantages of AOT
- **Broader support** → More workloads and libraries now play nice witt.h AOT.
- **Smaller output sizes** → Trimmed down runtime dependencies.
- **Better diagnostics** → Easier to figure out why your build blew up (because yes, AOT can be picky).
- **ASP.NET Core AOT** → Minimal APIs and gRPC services actually *benefit massively* here. Cold starts are crazy fast.
------
## Why you should care
If you’re building:
- **Serverless apps (AWS Lambda, Azure Functions, GCP Cloud Run)** → Startup time matters a LOT.
- **Microservices** → Lightweight services scale better when they use less memory per pod.
- **CLI tools** → No one likes waiting half a second for a tool to boot. AOT makes them feel “native” (because they literally are).
And yeah, you *can* get Go-like startup performance in .NET now.
------
## The trade-offs (because nothing’s free)
Native AOT isn’t a silver bullet:
- Build times are longer (the compiler does all the heavy lifting upfront).
- Less runtime flexibility (no reflection-based magic, dynamic codegen, or IL rewriting).
- Debugging can be trickier.
Basically: if you rely heavily on reflection-heavy libs or dynamic runtime stuff, expect pain.
------
## Quick demo (conceptual)
```bash
# Regular publish
dotnet publish -c Release
# Native AOT publish
dotnet publish -c Release -r win-x64 -p:PublishAot=true
```
Boom. You get a native executable. On Linux, drop it into a container and watch that startup time drop like a rock.
------
### Conclusion
- Native AOT in .NET 8 = faster cold starts + lower memory usage.
- Perfect for microservices, serverless, and CLI apps.
- Comes with trade-offs (longer builds, less dynamic flexibility).
- If performance is critical, it’s absolutely worth testing.

2
docs/en/cli/new-command-samples.md

@ -164,7 +164,7 @@ It's a template of a basic .NET console application with ABP module architecture
* This project consists of the following files: `Acme.BookStore.csproj`, `appsettings.json`, `BookStoreHostedService.cs`, `BookStoreModule.cs`, `HelloWorldService.cs` and `Program.cs`.
```bash
abp new Acme.BookStore -t console -csf
abp new Acme.BookStore -t console -csf --old
```
## Module

2
docs/en/docs-nav.json

@ -2661,7 +2661,7 @@
"path": "samples/easy-crm.md"
},
{
"text": "ElsaWorkflows",
"text": "Elsa Workflows Demo",
"path": "samples/elsa-workflows-demo.md"
}
]

6
docs/en/framework/ui/angular/form-validation.md

@ -232,7 +232,7 @@ buildForm() {
```html
<abp-modal [(visible)]="isModalVisible" [busy]="modalBusy">
<ng-template #abpHeader>
<h3>{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewUser') | abpLocalization }}</h3>
<h3>{%{{ (selected?.id ? 'AbpIdentity::Edit' : 'AbpIdentity::NewUser') | abpLocalization }}%}</h3>
</ng-template>
<ng-template #abpBody>
@ -240,7 +240,7 @@ buildForm() {
<form [formGroup]="form" (ngSubmit)="save()">
<ul ngbNav #nav="ngbNav" class="nav-tabs">
<li ngbNavItem>
<a ngbNavLink>{{ 'AbpIdentity::UserInformations' | abpLocalization }}</a>
<a ngbNavLink>{%{{ 'AbpIdentity::UserInformations' | abpLocalization }}%}</a>
<ng-template ngbNavContent>
<!-- Automatically displays all entity fields and their validation -->
<abp-extensible-form [selectedRecord]="selected"></abp-extensible-form>
@ -248,7 +248,7 @@ buildForm() {
</li>
<li ngbNavItem>
<a ngbNavLink>{{ 'AbpIdentity::Roles' | abpLocalization }}</a>
<a ngbNavLink>{%{{ 'AbpIdentity::Roles' | abpLocalization }}%}</a>
<ng-template ngbNavContent>
<!-- Dynamic roles list: nested FormArray and FormGroup -->
@for (roleGroup of roleGroups; track $index; let i = $index) {

2
docs/en/release-info/migration-guides/abp-10-0.md

@ -81,7 +81,7 @@ OpenIddict 7.X changed the `OpenIddictToken` entity, you must create a new datab
The AutoMapper library is no longer free for commercial use. For more details, you can refer to this [announcement post](https://www.jimmybogard.com/automapper-and-mediatr-going-commercial/).
In this version, all ABP modules use Mapperly instead of AutoMapper. ABP Framework provides both AutoMapper and Mapperly integrations. If your project currently uses AutoMapper and you don't have a commercial license, you can follow the [Migrating from AutoMapper to Mapperly](https://github.com/abpframework/abp/blob/dev/docs/en/release-info/migration-guides/AutoMapper-To-Mapperly.md) document to migrate to Mapperly.
In this version, all ABP modules use Mapperly instead of AutoMapper. ABP Framework provides both AutoMapper and Mapperly integrations. If your project currently uses AutoMapper and you don't have a commercial license, you can follow the [Migrating from AutoMapper to Mapperly](./AutoMapper-To-Mapperly.md) document to migrate to Mapperly.
### Failure Retry Policy for InboxProcessor

12
framework/src/Volo.Abp.Cli.Core/Volo/Abp/Cli/ServiceProxying/CSharp/CSharpServiceProxyGenerator.cs

@ -9,6 +9,7 @@ using Volo.Abp.Cli.Commands;
using Volo.Abp.Cli.Http;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Http.Modeling;
using Volo.Abp.IO;
using Volo.Abp.Json;
namespace Volo.Abp.Cli.ServiceProxying.CSharp;
@ -162,7 +163,10 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
private async Task CreateJsonFile(GenerateProxyArgs args, ApplicationApiDescriptionModel applicationApiDescriptionModel)
{
var folder = args.Folder.IsNullOrWhiteSpace() ? ProxyDirectory : args.Folder;
var filePath = Path.Combine(args.WorkDirectory, folder, $"{args.Module}-generate-proxy.json");
var directory = Path.Combine(args.WorkDirectory, folder);
DirectoryHelper.CreateIfNotExists(directory);
var filePath = Path.Combine(directory, $"{args.Module}-generate-proxy.json");
using (var writer = new StreamWriter(filePath))
{
await writer.WriteAsync(JsonSerializer.Serialize(applicationApiDescriptionModel, indented: true));
@ -187,7 +191,7 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
classTemplateEmptyPart.Replace(NamespacePlaceholder, rootNamespace);
var filePath = Path.Combine(args.WorkDirectory, folder, $"{clientProxyName}.cs");
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)!);
if (!File.Exists(filePath))
{
using (var writer = new StreamWriter(filePath))
@ -223,7 +227,7 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
classTemplate.Replace($"{Environment.NewLine}{Environment.NewLine} {MethodPlaceholder}", string.Empty).Replace(MethodPlaceholder, string.Empty);
filePath = Path.Combine(args.WorkDirectory, folder, $"{clientProxyName}.Generated.cs");
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)!);
using (var writer = new StreamWriter(filePath))
{
await writer.WriteAsync(classTemplate.ToString());
@ -253,7 +257,7 @@ public class CSharpServiceProxyGenerator : ServiceProxyGeneratorBase<CSharpServi
interfaceTemplate.Replace(NamespacePlaceholder, rootNamespace);
filePath = Path.Combine(args.WorkDirectory, folder, $"{appServiceTypeName}.cs");
Directory.CreateDirectory(Path.GetDirectoryName(filePath));
DirectoryHelper.CreateIfNotExists(Path.GetDirectoryName(filePath)!);
using (var writer = new StreamWriter(filePath))
{
await writer.WriteAsync(interfaceTemplate.ToString());

9
latest-versions.json

@ -1,4 +1,13 @@
[
{
"version": "9.3.5",
"releaseDate": "",
"type": "stable",
"message": "",
"leptonx": {
"version": "4.3.5"
}
},
{
"version": "9.3.4",
"releaseDate": "",

2
modules/openiddict/app/angular/package.json

@ -20,7 +20,7 @@
"@abp/ng.setting-management": "~9.3.5",
"@abp/ng.tenant-management": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.theme.lepton-x": "~4.3.5",
"@abp/ng.theme.lepton-x": "~5.0.0-rc.1",
"@angular/animations": "^15.0.1",
"@angular/common": "^15.0.1",
"@angular/compiler": "^15.0.1",

3
modules/setting-management/src/Volo.Abp.SettingManagement.Web/Pages/SettingManagement/Components/EmailSettingGroup/SendTestEmailModal.cshtml.cs

@ -20,6 +20,7 @@ public class SendTestEmailModal : AbpPageModel
{
LocalizationResourceType = typeof(AbpSettingManagementResource);
EmailSettingsAppService = emailSettingsAppService;
ObjectMapperContext = typeof(AbpSettingManagementWebModule);
}
public async Task OnGetAsync()
@ -56,4 +57,4 @@ public class SendTestEmailModal : AbpPageModel
public string Body { get; set; }
}
}
}

2
npm/lerna.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"packages": [
"packs/*"
],

4
npm/ng-packs/package.json

@ -46,8 +46,8 @@
},
"private": true,
"devDependencies": {
"@abp/ng.theme.lepton-x": "~4.3.5",
"@abp/utils": "~9.3.5",
"@abp/ng.theme.lepton-x": "~5.0.0-rc.1",
"@abp/utils": "~10.0.0-rc.1",
"@angular-devkit/build-angular": "~20.0.0",
"@angular-devkit/core": "~20.0.0",
"@angular-devkit/schematics": "~20.0.0",

6
npm/ng-packs/packages/account-core/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.account.core",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.core": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.core": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

6
npm/ng-packs/packages/account/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.account",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.account.core": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.account.core": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

6
npm/ng-packs/packages/components/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.components",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"peerDependencies": {
"@abp/ng.core": ">=9.3.5",
"@abp/ng.theme.shared": ">=9.3.5"
"@abp/ng.core": ">=10.0.0-rc.1",
"@abp/ng.theme.shared": ">=10.0.0-rc.1"
},
"dependencies": {
"chart.js": "^3.5.1",

4
npm/ng-packs/packages/core/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.core",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/utils": "~9.3.5",
"@abp/utils": "~10.0.0-rc.1",
"just-clone": "^6.0.0",
"just-compare": "^2.0.0",
"ts-toolbelt": "^9.0.0",

14
npm/ng-packs/packages/core/src/lib/components/dynamic-layout.component.ts

@ -1,4 +1,13 @@
import { Component, inject, isDevMode, Type } from '@angular/core';
import {
Component,
inject,
input,
isDevMode,
OnInit,
Optional,
SkipSelf,
Type,
} from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { eLayoutType } from '../enums/common';
import { ABP } from '../models';
@ -30,6 +39,7 @@ export class DynamicLayoutComponent {
layoutKey?: eLayoutType;
readonly layouts = inject(DYNAMIC_LAYOUTS_TOKEN);
isLayoutVisible = true;
readonly defaultLayout = input<eLayoutType>(undefined);
protected readonly router = inject(Router);
protected readonly route = inject(ActivatedRoute);
@ -89,7 +99,7 @@ export class DynamicLayoutComponent {
break;
}
}
return expectedLayout;
return expectedLayout ?? this.defaultLayout();
}
showLayoutNotFoundError(layoutName: string) {

4
npm/ng-packs/packages/feature-management/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.feature-management",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

2
npm/ng-packs/packages/generators/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/nx.generators",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"generators": "./generators.json",
"type": "commonjs",

8
npm/ng-packs/packages/identity/package.json

@ -1,15 +1,15 @@
{
"name": "@abp/ng.identity",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.components": "~9.3.5",
"@abp/ng.permission-management": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.components": "~10.0.0-rc.1",
"@abp/ng.permission-management": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

6
npm/ng-packs/packages/oauth/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.oauth",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.core": "~9.3.5",
"@abp/utils": "~9.3.5",
"@abp/ng.core": "~10.0.0-rc.1",
"@abp/utils": "~10.0.0-rc.1",
"angular-oauth2-oidc": "^20.0.0",
"just-clone": "^6.0.0",
"just-compare": "^2.0.0",

4
npm/ng-packs/packages/permission-management/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.permission-management",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

2
npm/ng-packs/packages/schematics/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/ng.schematics",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"author": "",
"schematics": "./collection.json",
"dependencies": {

6
npm/ng-packs/packages/setting-management/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.setting-management",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.components": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.components": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

6
npm/ng-packs/packages/tenant-management/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.tenant-management",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.feature-management": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.feature-management": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

6
npm/ng-packs/packages/theme-basic/package.json

@ -1,14 +1,14 @@
{
"name": "@abp/ng.theme.basic",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.account.core": "~9.3.5",
"@abp/ng.theme.shared": "~9.3.5",
"@abp/ng.account.core": "~10.0.0-rc.1",
"@abp/ng.theme.shared": "~10.0.0-rc.1",
"tslib": "^2.0.0"
},
"publishConfig": {

4
npm/ng-packs/packages/theme-shared/package.json

@ -1,13 +1,13 @@
{
"name": "@abp/ng.theme.shared",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"homepage": "https://abp.io",
"repository": {
"type": "git",
"url": "https://github.com/abpframework/abp.git"
},
"dependencies": {
"@abp/ng.core": "~9.3.5",
"@abp/ng.core": "~10.0.0-rc.1",
"@fortawesome/fontawesome-free": "^6.0.0",
"@ng-bootstrap/ng-bootstrap": "~19.0.0",
"@ngx-validate/core": "^0.2.0",

4
npm/packs/anchor-js/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/anchor-js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"anchor-js": "^5.0.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/aspnetcore.components.server.basictheme/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/aspnetcore.components.server.basictheme",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.components.server.theming": "~9.3.5"
"@abp/aspnetcore.components.server.theming": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

6
npm/packs/aspnetcore.components.server.theming/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/aspnetcore.components.server.theming",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/bootstrap": "~9.3.5",
"@abp/font-awesome": "~9.3.5"
"@abp/bootstrap": "~10.0.0-rc.1",
"@abp/font-awesome": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

4
npm/packs/aspnetcore.mvc.ui.theme.basic/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/aspnetcore.mvc.ui.theme.basic",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "~9.3.5"
"@abp/aspnetcore.mvc.ui.theme.shared": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

32
npm/packs/aspnetcore.mvc.ui.theme.shared/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/aspnetcore.mvc.ui.theme.shared",
"repository": {
"type": "git",
@ -10,21 +10,21 @@
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui": "~9.3.5",
"@abp/bootstrap": "~9.3.5",
"@abp/bootstrap-datepicker": "~9.3.5",
"@abp/bootstrap-daterangepicker": "~9.3.5",
"@abp/datatables.net-bs5": "~9.3.5",
"@abp/font-awesome": "~9.3.5",
"@abp/jquery-form": "~9.3.5",
"@abp/jquery-validation-unobtrusive": "~9.3.5",
"@abp/lodash": "~9.3.5",
"@abp/luxon": "~9.3.5",
"@abp/malihu-custom-scrollbar-plugin": "~9.3.5",
"@abp/moment": "~9.3.5",
"@abp/select2": "~9.3.5",
"@abp/sweetalert2": "~9.3.5",
"@abp/timeago": "~9.3.5"
"@abp/aspnetcore.mvc.ui": "~10.0.0-rc.1",
"@abp/bootstrap": "~10.0.0-rc.1",
"@abp/bootstrap-datepicker": "~10.0.0-rc.1",
"@abp/bootstrap-daterangepicker": "~10.0.0-rc.1",
"@abp/datatables.net-bs5": "~10.0.0-rc.1",
"@abp/font-awesome": "~10.0.0-rc.1",
"@abp/jquery-form": "~10.0.0-rc.1",
"@abp/jquery-validation-unobtrusive": "~10.0.0-rc.1",
"@abp/lodash": "~10.0.0-rc.1",
"@abp/luxon": "~10.0.0-rc.1",
"@abp/malihu-custom-scrollbar-plugin": "~10.0.0-rc.1",
"@abp/moment": "~10.0.0-rc.1",
"@abp/select2": "~10.0.0-rc.1",
"@abp/sweetalert2": "~10.0.0-rc.1",
"@abp/timeago": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

2
npm/packs/aspnetcore.mvc.ui/package-lock.json

@ -1,6 +1,6 @@
{
"name": "@abp/aspnetcore.mvc.ui",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"lockfileVersion": 1,
"requires": true,
"packages": {

2
npm/packs/aspnetcore.mvc.ui/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/aspnetcore.mvc.ui",
"repository": {
"type": "git",

10
npm/packs/blogging/package.json

@ -1,14 +1,14 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/blogging",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/aspnetcore.mvc.ui.theme.shared": "~9.3.5",
"@abp/owl.carousel": "~9.3.5",
"@abp/prismjs": "~9.3.5",
"@abp/tui-editor": "~9.3.5"
"@abp/aspnetcore.mvc.ui.theme.shared": "~10.0.0-rc.1",
"@abp/owl.carousel": "~10.0.0-rc.1",
"@abp/prismjs": "~10.0.0-rc.1",
"@abp/tui-editor": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

2
npm/packs/bootstrap-datepicker/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/bootstrap-datepicker",
"repository": {
"type": "git",

2
npm/packs/bootstrap-daterangepicker/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/bootstrap-daterangepicker",
"repository": {
"type": "git",

4
npm/packs/bootstrap/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/bootstrap",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"bootstrap": "^5.3.8"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

2
npm/packs/chart.js/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/chart.js",
"publishConfig": {
"access": "public"

4
npm/packs/clipboard/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/clipboard",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"clipboard": "^2.0.11"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

14
npm/packs/cms-kit.admin/package.json

@ -1,16 +1,16 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/cms-kit.admin",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/codemirror": "~9.3.5",
"@abp/jstree": "~9.3.5",
"@abp/markdown-it": "~9.3.5",
"@abp/slugify": "~9.3.5",
"@abp/tui-editor": "~9.3.5",
"@abp/uppy": "~9.3.5"
"@abp/codemirror": "~10.0.0-rc.1",
"@abp/jstree": "~10.0.0-rc.1",
"@abp/markdown-it": "~10.0.0-rc.1",
"@abp/slugify": "~10.0.0-rc.1",
"@abp/tui-editor": "~10.0.0-rc.1",
"@abp/uppy": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

6
npm/packs/cms-kit.public/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/cms-kit.public",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/highlight.js": "~9.3.5",
"@abp/star-rating-svg": "~9.3.5"
"@abp/highlight.js": "~10.0.0-rc.1",
"@abp/star-rating-svg": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

6
npm/packs/cms-kit/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/cms-kit",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/cms-kit.admin": "~9.3.5",
"@abp/cms-kit.public": "~9.3.5"
"@abp/cms-kit.admin": "~10.0.0-rc.1",
"@abp/cms-kit.public": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

4
npm/packs/codemirror/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/codemirror",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"codemirror": "^6.0.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/core/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/core",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/utils": "~9.3.5"
"@abp/utils": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

4
npm/packs/cropperjs/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/cropperjs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"cropperjs": "^2.0.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/datatables.net-bs4/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/datatables.net-bs4",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/datatables.net": "~9.3.4",
"@abp/datatables.net": "~10.0.0-rc.1",
"datatables.net-bs4": "^2.3.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/datatables.net-bs5/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/datatables.net-bs5",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/datatables.net": "~9.3.4",
"@abp/datatables.net": "~10.0.0-rc.1",
"datatables.net-bs5": "^2.3.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/datatables.net/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/datatables.net",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.4",
"@abp/jquery": "~10.0.0-rc.1",
"datatables.net": "^2.3.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

12
npm/packs/docs/package.json

@ -1,15 +1,15 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/docs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/anchor-js": "~9.3.5",
"@abp/clipboard": "~9.3.5",
"@abp/malihu-custom-scrollbar-plugin": "~9.3.5",
"@abp/popper.js": "~9.3.5",
"@abp/prismjs": "~9.3.5"
"@abp/anchor-js": "~10.0.0-rc.1",
"@abp/clipboard": "~10.0.0-rc.1",
"@abp/malihu-custom-scrollbar-plugin": "~10.0.0-rc.1",
"@abp/popper.js": "~10.0.0-rc.1",
"@abp/prismjs": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

2
npm/packs/flag-icon-css/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/flag-icon-css",
"publishConfig": {
"access": "public"

2
npm/packs/flag-icons/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/flag-icons",
"publishConfig": {
"access": "public"

4
npm/packs/font-awesome/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/font-awesome",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"@fortawesome/fontawesome-free": "^7.0.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/highlight.js/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/highlight.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"@highlightjs/cdn-assets": "~11.11.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/jquery-form/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/jquery-form",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"jquery-form": "^4.3.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/jquery-validation-unobtrusive/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/jquery-validation-unobtrusive",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery-validation": "~9.3.5",
"@abp/jquery-validation": "~10.0.0-rc.1",
"jquery-validation-unobtrusive": "^4.0.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/jquery-validation/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/jquery-validation",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"jquery-validation": "^1.21.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/jquery/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/jquery",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"jquery": "~3.7.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/jstree/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/jstree",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"jstree": "^3.3.17"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/lodash/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/lodash",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"lodash": "^4.17.21"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/luxon/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/luxon",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"luxon": "^3.7.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/malihu-custom-scrollbar-plugin/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/malihu-custom-scrollbar-plugin",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"malihu-custom-scrollbar-plugin": "^3.1.5"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/markdown-it/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/markdown-it",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"markdown-it": "^14.1.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

2
npm/packs/moment/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/moment",
"repository": {
"type": "git",

4
npm/packs/owl.carousel/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/owl.carousel",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"owl.carousel": "^2.3.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/popper.js/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/popper.js",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"@popperjs/core": "^2.11.8"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

6
npm/packs/prismjs/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/prismjs",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/clipboard": "~9.3.4",
"@abp/core": "~9.3.4",
"@abp/clipboard": "~10.0.0-rc.1",
"@abp/core": "~10.0.0-rc.1",
"prismjs": "^1.30.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/qrcode/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/qrcode",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5"
"@abp/core": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

4
npm/packs/select2/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/select2",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"select2": "^4.0.13"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/signalr/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/signalr",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"@microsoft/signalr": "~9.0.6"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

2
npm/packs/slugify/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/slugify",
"publishConfig": {
"access": "public"

4
npm/packs/star-rating-svg/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/star-rating-svg",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"star-rating-svg": "^3.5.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/sweetalert2/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/sweetalert2",
"publishConfig": {
"access": "public"
@ -10,7 +10,7 @@
"directory": "npm/packs/sweetalert2"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"sweetalert2": "^11.23.0"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/timeago/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/timeago",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"timeago": "^1.6.7"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

4
npm/packs/toastr/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/toastr",
"repository": {
"type": "git",
@ -10,7 +10,7 @@
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/jquery": "~10.0.0-rc.1",
"toastr": "^2.1.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

6
npm/packs/tui-editor/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/tui-editor",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/jquery": "~9.3.5",
"@abp/prismjs": "~9.3.5"
"@abp/jquery": "~10.0.0-rc.1",
"@abp/prismjs": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

4
npm/packs/uppy/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/uppy",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.4",
"@abp/core": "~10.0.0-rc.1",
"uppy": "^5.1.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

2
npm/packs/utils/package.json

@ -1,6 +1,6 @@
{
"name": "@abp/utils",
"version": "9.3.5",
"version": "10.0.0-rc.1",
"scripts": {
"prepublishOnly": "yarn install --ignore-scripts && node prepublish.js",
"ng": "ng",

4
npm/packs/vee-validate/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/vee-validate",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/vue": "~9.3.5",
"@abp/vue": "~10.0.0-rc.1",
"vee-validate": "~3.4.4"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

6
npm/packs/virtual-file-explorer/package.json

@ -1,12 +1,12 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/virtual-file-explorer",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/clipboard": "~9.3.5",
"@abp/prismjs": "~9.3.5"
"@abp/clipboard": "~10.0.0-rc.1",
"@abp/prismjs": "~10.0.0-rc.1"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",
"homepage": "https://abp.io",

2
npm/packs/vue/package.json

@ -1,5 +1,5 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/vue",
"publishConfig": {
"access": "public"

4
npm/packs/zxcvbn/package.json

@ -1,11 +1,11 @@
{
"version": "9.3.5",
"version": "10.0.0-rc.1",
"name": "@abp/zxcvbn",
"publishConfig": {
"access": "public"
},
"dependencies": {
"@abp/core": "~9.3.5",
"@abp/core": "~10.0.0-rc.1",
"zxcvbn": "^4.4.2"
},
"gitHead": "bb4ea17d5996f01889134c138d00b6c8f858a431",

BIN
source-code/Volo.Abp.Account.SourceCode/Volo.Abp.Account.SourceCode.zip

Binary file not shown.

BIN
source-code/Volo.Abp.AuditLogging.SourceCode/Volo.Abp.AuditLogging.SourceCode.zip

Binary file not shown.

BIN
source-code/Volo.Abp.BackgroundJobs.SourceCode/Volo.Abp.BackgroundJobs.SourceCode.zip

Binary file not shown.

BIN
source-code/Volo.Abp.BlobStoring.Database.SourceCode/Volo.Abp.BlobStoring.Database.SourceCode.zip

Binary file not shown.

BIN
source-code/Volo.Abp.FeatureManagement.SourceCode/Volo.Abp.FeatureManagement.SourceCode.zip

Binary file not shown.

BIN
source-code/Volo.Abp.Identity.SourceCode/Volo.Abp.Identity.SourceCode.zip

Binary file not shown.

Some files were not shown because too many files changed in this diff

Loading…
Cancel
Save