v0.9.0
Release Date: January 2026
Breaking Changes
@abpjs/core
throwErr renamed to skipHandleError
The Rest.Config.throwErr option has been renamed to skipHandleError for clarity.
Before (v0.8.0):
restService.request({ url: '/api/test', method: 'GET' }, { throwErr: true });
After (v0.9.0):
restService.request({ url: '/api/test', method: 'GET' }, { skipHandleError: true });
@abpjs/identity
IDENTITY_ROUTES format changed
The routes constant now returns an object with a routes property instead of an array directly.
Before (v0.8.0):
import { IDENTITY_ROUTES } from '@abpjs/identity';
// IDENTITY_ROUTES was ABP.FullRoute[]
const routes = IDENTITY_ROUTES;
After (v0.9.0):
import { IDENTITY_ROUTES } from '@abpjs/identity';
// IDENTITY_ROUTES is now { routes: ABP.FullRoute[] }
const routes = IDENTITY_ROUTES.routes;
@abpjs/account
ACCOUNT_ROUTES format changed
Same as identity - now returns { routes: ABP.FullRoute[] }.
// Before: const routes = ACCOUNT_ROUTES;
// After:
const routes = ACCOUNT_ROUTES.routes;
What's New
Settings Layout Type
New eLayoutType.setting value for dedicated settings pages:
import { eLayoutType } from '@abpjs/core';
const route = {
path: '/settings',
layout: eLayoutType.setting,
};
Application Configuration
Configure your application name and logo in the environment config:
import { Config } from '@abpjs/core';
const environment: Config.Environment = {
application: {
name: 'My App',
logoUrl: '/assets/logo.png',
},
production: false,
// ... other config
};
Access via the new selector:
import { selectApplicationInfo } from '@abpjs/core';
import { useSelector } from 'react-redux';
function Header() {
const appInfo = useSelector(selectApplicationInfo);
return (
<header>
{appInfo?.logoUrl && <img src={appInfo.logoUrl} alt={appInfo?.name} />}
<h1>{appInfo?.name}</h1>
</header>
);
}
Tenant Session Management
Session state now includes tenant information with new actions and selectors:
import { setTenant, selectTenant } from '@abpjs/core';
import { useDispatch, useSelector } from 'react-redux';
function TenantSwitcher() {
const dispatch = useDispatch();
const currentTenant = useSelector(selectTenant);
const switchTenant = (tenant: { id: string; name: string }) => {
dispatch(setTenant(tenant));
};
return (
<div>
Current: {currentTenant?.name || 'Host'}
<button onClick={() => switchTenant({ id: '123', name: 'Acme Corp' })}>
Switch
</button>
</div>
);
}
Tenant information is automatically persisted to session storage.
Route Selector
Find routes by path or name with the new selectRoute selector. This is useful for checking route existence or getting route metadata:
import { selectRoute } from '@abpjs/core';
import { useSelector } from 'react-redux';
// Find by path
const usersRoute = useSelector(selectRoute('/admin/users'));
// Find by name
const identityRoute = useSelector(selectRoute(undefined, 'AbpIdentity.Users'));
// Check if route exists
if (usersRoute) {
console.log('Users route found:', usersRoute.name);
}
The selector searches recursively through nested route children.
LocalizationService Enhancement
New currentLang property for quick access to the current language:
const lang = localizationService.currentLang;
// e.g., 'en', 'tr', 'ar'
ProfileService Enhancement
The changePassword method now accepts an optional skipHandleError parameter for custom error handling:
import { ProfileService } from '@abpjs/core';
try {
await profileService.changePassword(
{ currentPassword: 'old', newPassword: 'new' },
true // Skip default error handling
);
} catch (error) {
// Handle error manually (e.g., show "incorrect password" message)
}
Modal Component Enhancements
The Modal component in @abpjs/theme-shared has new props:
import { Modal } from '@abpjs/theme-shared';
<Modal
visible={visible}
onVisibleChange={setVisible}
busy={isSaving} // Prevents closing while busy
height={500} // Fixed height
minHeight="300px" // Minimum height
onInit={() => loadData()} // Called when modal opens
>
{content}
</Modal>
| New Prop | Type | Description |
|---|---|---|
busy | boolean | Loading state - prevents closing when true |
height | number | string | Fixed height for the modal |
minHeight | number | string | Minimum height for the modal |
onInit | () => void | Called when modal opens |
See @abpjs/theme-shared release notes for full details.
New Package: @abpjs/setting-management
New package for managing application settings with a tabbed interface:
import { SettingLayout, useSettingManagement } from '@abpjs/setting-management';
function SettingsPage() {
const { addSettings } = useSettingManagement();
useEffect(() => {
addSettings([
{ name: 'Account', order: 1, url: '/settings/account' },
{ name: 'Appearance', order: 2, url: '/settings/appearance' },
]);
}, [addSettings]);
return (
<SettingLayout>
<Outlet />
</SettingLayout>
);
}
See @abpjs/setting-management documentation for full details.
New Models in @abpjs/theme-shared
SettingTab - Interface for settings management tabs:
import { SettingTab } from '@abpjs/theme-shared';
const tab: SettingTab = {
name: 'General',
order: 1,
requiredPolicy: 'Settings.General',
url: '/settings/general',
};
Statistics - Models for statistics API:
import { Statistics } from '@abpjs/theme-shared';
const filter: Statistics.Filter = {
startDate: '2026-01-01',
endDate: '2026-01-31',
};
Deprecations
@abpjs/theme-basic
ChangePassword and Profile Components Moved
The ChangePassword and Profile components have been moved to @abpjs/theme-shared.
Before (deprecated):
import { ChangePassword, Profile } from '@abpjs/theme-basic';
After (recommended):
import { ChangePassword, Profile } from '@abpjs/theme-shared';
The old imports will continue to work but are deprecated and will be removed in a future version.
Packages
| Package | Version |
|---|---|
| @abpjs/core | 0.9.0 |
| @abpjs/account | 0.9.0 |
| @abpjs/identity | 0.9.0 |
| @abpjs/feature-management | 0.9.0 |
| @abpjs/permission-management | 0.9.0 |
| @abpjs/setting-management | 0.9.0 (new) |
| @abpjs/tenant-management | 0.9.0 |
| @abpjs/theme-basic | 0.9.0 |
| @abpjs/theme-shared | 0.9.0 |
Upgrade
npm update @abpjs/core @abpjs/account @abpjs/feature-management @abpjs/identity @abpjs/permission-management @abpjs/setting-management @abpjs/tenant-management @abpjs/theme-basic @abpjs/theme-shared
Migration Guide
-
Update
throwErrtoskipHandleError: Search forthrowErrin your codebase and rename toskipHandleError. -
Update route constants usage:
IDENTITY_ROUTES,ACCOUNT_ROUTES, andTENANT_MANAGEMENT_ROUTESnow use{ routes: ABP.FullRoute[] }format. Access routes via.routesproperty. -
Update ChangePassword and Profile imports (recommended): Change imports from
@abpjs/theme-basicto@abpjs/theme-shared.