v3.0.0
Release Date: February 2026
This major release introduces a unified configuration system across all packages, including route providers, policy names, extensions systems, and guards. The config subpackages from Angular have been merged into the main packages for simplified imports.
Highlights
- Route Providers - New
RoutesService-based route configuration system in all packages - Policy Names - Centralized permission policy constants for all modules
- Extensions System - Customizable entity actions, toolbar actions, entity props, and form props
- Extensions Guards - Route guards for loading extensions before activation
- Config Options - Module configuration interfaces for extensibility
Breaking Changes
Route Names: Administration Key Removed
The Administration key has been removed from all package route names. Use eThemeSharedRouteNames.Administration from @abpjs/theme-shared instead.
Affected packages: @abpjs/identity, @abpjs/tenant-management, @abpjs/identity-pro, @abpjs/language-management, @abpjs/saas, @abpjs/text-template-management
// Before (v2.9.0)
import { eIdentityRouteNames } from '@abpjs/identity';
const admin = eIdentityRouteNames.Administration; // ❌ Removed
// After (v3.0.0)
import { eThemeSharedRouteNames } from '@abpjs/theme-shared';
const admin = eThemeSharedRouteNames.Administration; // ✅ Use this instead
@abpjs/core
Toaster.Statusremoved - UseConfirmation.StatusinsteadRoutesService.visibleproperty removed from route configuration
@abpjs/theme-shared
NavItem.permissionrenamed toNavItem.requiredPolicyNavItem.idis now requiredToaster.Statusremoved - UseConfirmation.Status
@abpjs/identity
eIdentityRouteNames.Administrationremoved- Route name values changed (e.g.,
Identity::Usersinstead ofAbpIdentity::Users)
@abpjs/identity-pro
eIdentityRouteNames.AdministrationremovedgetClaimTypeNames()replaced withgetRolesClaimTypes()andgetUsersClaimTypes()dispatchGetClaimTypeNames()removed fromIdentityStateService
@abpjs/language-management
eLanguageManagementRouteNames.AdministrationremovedeLanguageManagementRouteNames.Languagesvalue changedgetLanguagesTotalCount()removed fromLanguageManagementStateService
@abpjs/setting-management
selectedTabtype changed fromnulltoundefinedwhen no tab is selected
New Features
Route Providers (All Packages)
All packages now include route providers for configuring routes using RoutesService:
import { getRoutesService } from '@abpjs/core';
import { initializeIdentityRoutes } from '@abpjs/identity';
import { initializeSaasRoutes } from '@abpjs/saas';
const routes = getRoutesService();
// Initialize routes for each module
initializeIdentityRoutes(routes);
initializeSaasRoutes(routes);
Or use the configureRoutes pattern:
import { configureRoutes } from '@abpjs/identity';
const addRoutes = configureRoutes(routes);
addRoutes();
Policy Names (All Packages)
Centralized policy name constants for permission checking:
import { eIdentityPolicyNames } from '@abpjs/identity';
import { eSaasPolicyNames } from '@abpjs/saas';
// Check permissions
if (hasPolicy(eIdentityPolicyNames.Users)) {
// User has users permission
}
Extensions System
All packages now support customizable extensions:
import {
EntityAction,
ToolbarAction,
EntityProp,
FormProp,
DEFAULT_TENANTS_ENTITY_ACTIONS,
SAAS_ENTITY_ACTION_CONTRIBUTORS,
} from '@abpjs/saas';
// Add custom entity actions
const customActions: EntityAction<Saas.Tenant>[] = [
...DEFAULT_TENANTS_ENTITY_ACTIONS,
{
text: 'Custom Action',
icon: 'fa fa-star',
permission: 'Custom.Permission',
},
];
Extensions Guards
Route guards for loading extensions before route activation:
import { useSaasExtensionsGuard } from '@abpjs/saas';
function ProtectedRoute({ children }) {
const { isLoaded, loading } = useSaasExtensionsGuard();
if (loading) return <Loading />;
return children;
}
@abpjs/core
- RoutesService - Centralized route management
- SettingTabsService - Setting tabs management
- AbstractTreeService - Base class for tree data operations
- Tree utilities -
createTreeFromList(),addTreeNode(),removeTreeNode(),findTreeNode() - Array utilities -
pushIfNotExists(),removeIfExists() - Route utilities -
getNavItemFromRoute() - Generic ListService -
ListService<T, Q>for paginated data
@abpjs/theme-shared
- NavItemsService - Centralized navigation item management
- eThemeSharedRouteNames - Route name constants including
Administration - Nav Item Providers - Configure nav items via service
@abpjs/theme-basic
- CurrentUserComponent - Standalone current user display
- LanguagesComponent - Standalone language selector
- Nav Item Provider -
initializeNavItems() - Styles Provider -
initializeThemeBasicStyles()
@abpjs/account
- Route providers -
initializeAccountRoutes(),configureRoutes() - accountOptionsFactory - Configuration factory for account module
@abpjs/identity
- Policy names -
eIdentityPolicyNameswith Users, Roles constants - Route providers -
initializeIdentityRoutes(),configureRoutes() - getUserAssignableRoles() - New method for role assignment
@abpjs/permission-management
- getAssignedCount() - Get count of assigned permissions
@abpjs/setting-management
- Route providers -
initializeSettingManagementRoutes(),configureRoutes() - hideRoutes() - Hide setting management from navigation
@abpjs/tenant-management
- Policy names -
eTenantManagementPolicyNames - Route providers -
initializeTenantManagementRoutes(),configureRoutes()
@abpjs/account-pro
- Route providers -
initializeAccountRoutes(),configureRoutes() - Setting tab providers -
configureSettingTabs() - AccountConfigOptions - Module configuration interface
@abpjs/audit-logging
- Route providers -
initializeAuditLoggingRoutes(),configureRoutes() - EntityChangeModalService - Service for entity change details
- Extensions system - Full extension support
@abpjs/chat
- Route providers -
initializeChatRoutes(),configureRoutes() - Nav item providers -
initializeChatNavItems() - Policy names -
eChatPolicyNames
@abpjs/identity-pro
- Route providers -
initializeIdentityRoutes(),configureRoutes() - Setting tab providers -
configureSettingTabs() - Policy names -
eIdentityPolicyNameswith extended permissions - Setting tab names -
eIdentitySettingTabNames - Identity settings models - Settings, Password, Lockout, SignIn, User interfaces
- Extensions system - Full extension support with
IdentityExtensionsGuard
@abpjs/language-management
- Route providers -
initializeLanguageManagementRoutes(),configureRoutes() - Policy names -
eLanguageManagementPolicyNames - Extensions system - Full extension support
@abpjs/saas
- Route providers -
initializeSaasRoutes(),configureRoutes() - Policy names -
eSaasPolicyNames - Config options -
SaasConfigOptionsinterface - Extensions system - Full extension support
@abpjs/text-template-management
- Route providers -
initializeTextTemplateManagementRoutes(),configureRoutes() - Policy names -
eTextTemplateManagementPolicyNames - Config options -
TextTemplateManagementConfigOptionsinterface - Extensions system - Full extension support
Packages
| Package | Version | Changes |
|---|---|---|
| @abpjs/core | 3.0.0 | RoutesService, SettingTabsService, AbstractTreeService, tree/array/route utilities, generic ListService |
| @abpjs/theme-shared | 3.0.0 | NavItemsService, eThemeSharedRouteNames, NavItem changes (id required, permission→requiredPolicy) |
| @abpjs/theme-basic | 3.0.0 | CurrentUserComponent, LanguagesComponent, Nav Item Provider, Styles Provider |
| @abpjs/account | 3.0.0 | Route providers, accountOptionsFactory |
| @abpjs/feature-management | 3.0.0 | Version alignment |
| @abpjs/identity | 3.0.0 | Route providers, policy names, getUserAssignableRoles(), route name changes |
| @abpjs/permission-management | 3.0.0 | getAssignedCount() method |
| @abpjs/setting-management | 3.0.0 | Route providers, hideRoutes(), selectedTab type change |
| @abpjs/tenant-management | 3.0.0 | Route providers, policy names |
| @abpjs/account-pro | 3.0.0 | Route providers, setting tab providers, AccountConfigOptions |
| @abpjs/audit-logging | 3.0.0 | Route providers, EntityChangeModalService, extensions system |
| @abpjs/chat | 3.0.0 | Route providers, nav item providers, policy names |
| @abpjs/identity-pro | 3.0.0 | Route providers, setting tab providers, policy names, claim type API changes, extensions system |
| @abpjs/language-management | 3.0.0 | Route providers, policy names, extensions system, removed getLanguagesTotalCount() |
| @abpjs/saas | 3.0.0 | Route providers, policy names, config options, extensions system |
| @abpjs/text-template-management | 3.0.0 | Route providers, policy names, config options, extensions system |
Upgrade
Free Packages
npm install @abpjs/core@3.0.0 @abpjs/theme-shared@3.0.0 @abpjs/theme-basic@3.0.0 @abpjs/account@3.0.0 @abpjs/identity@3.0.0 @abpjs/feature-management@3.0.0 @abpjs/permission-management@3.0.0 @abpjs/setting-management@3.0.0 @abpjs/tenant-management@3.0.0
Pro Packages
npm install @abpjs/account-pro@3.0.0 @abpjs/audit-logging@3.0.0 @abpjs/chat@3.0.0 @abpjs/identity-pro@3.0.0 @abpjs/language-management@3.0.0 @abpjs/saas@3.0.0 @abpjs/text-template-management@3.0.0
Migration Guide
1. Update Route Name Imports
Replace Administration references:
// Before
import { eIdentityRouteNames } from '@abpjs/identity';
const admin = eIdentityRouteNames.Administration;
// After
import { eThemeSharedRouteNames } from '@abpjs/theme-shared';
const admin = eThemeSharedRouteNames.Administration;
2. Update NavItem Configuration
// Before
const navItem: NavItem = {
name: 'My Item',
permission: 'MyPermission',
};
// After
const navItem: NavItem = {
id: 'my-item', // Now required
name: 'My Item',
requiredPolicy: 'MyPermission', // Renamed from permission
};
3. Update Toaster.Status Usage
// Before
import { Toaster } from '@abpjs/theme-shared';
const status = Toaster.Status.Success;
// After
import { Confirmation } from '@abpjs/theme-shared';
const status = Confirmation.Status.Success;
4. Update Identity Pro Claim Type Calls
// Before
const claimTypes = await identityService.getClaimTypeNames();
// After
const rolesClaimTypes = await identityService.getRolesClaimTypes();
const usersClaimTypes = await identityService.getUsersClaimTypes();
5. Update Language Management State Service
// Before
const total = stateService.getLanguagesTotalCount();
// After
const languages = stateService.getLanguages();
// Access totalCount from response if needed