Release Notes
v2.9.0
February 2026
- Version alignment with @abpjs/core
v2.7.0
February 2026
New Features
Route Names
New constants for SaaS route names (localization keys):
import { eSaasRouteNames } from '@abpjs/saas';
// Available route names:
// eSaasRouteNames.Administration = 'AbpUiNavigation::Menu:Administration'
// eSaasRouteNames.Saas = 'Saas::Menu:Saas'
// eSaasRouteNames.Tenants = 'Saas::Tenants'
// eSaasRouteNames.Editions = 'Saas::Editions'
API Changes
-
eSaasComponents- Changed from TypeScriptenumtoconstobject for better tree-shaking and type inference:// Before (v2.4.0)
enum eSaasComponents {
Editions = 'Saas.EditionsComponent',
// ...
}
// After (v2.7.0)
const eSaasComponents = {
Editions: 'Saas.EditionsComponent',
// ...
} as const;
New Exports
eSaasRouteNames- Constants for route names (localization keys)SaasRouteNameKey- Type for SaaS route name valuesSaasComponentKey- Type for SaaS component key values
v2.4.0
February 2026
New Features
-
SaasService.apiNameproperty - New property for REST API configuration. Defaults to'default'. -
eSaasComponentsenum - New enum for component identifiers, useful for component registration and customization:import { eSaasComponents } from '@abpjs/saas';
// Available components:
// eSaasComponents.Editions = 'Saas.EditionsComponent'
// eSaasComponents.Tenants = 'Saas.TenantsComponent'
Breaking Changes
-
CreateTenantRequestinterface -adminEmailAddressandadminPasswordare now required fields (previously optional):// Before (v2.2.0)
interface CreateTenantRequest {
name: string;
editionId?: string;
adminEmailAddress?: string; // optional
adminPassword?: string; // optional
}
// After (v2.4.0)
interface CreateTenantRequest {
adminEmailAddress: string; // required
adminPassword: string; // required
name: string;
editionId?: string;
} -
UpdateTenantRequesttype - Now usesOmit<Tenant, 'editionName'>pattern, which includes allTenantfields excepteditionName:// Before (v2.2.0)
interface UpdateTenantRequest {
id?: string;
name: string;
editionId?: string;
concurrencyStamp?: string;
}
// After (v2.4.0)
type UpdateTenantRequest = Omit<Tenant, 'editionName'>;
// Includes: id, name, editionId, concurrencyStamp, activationState, activationEndDate, etc.
v2.2.0
February 2026
New Features
- Features Modal Management - Added built-in state management for features modal in both hooks:
useEditionshook:visibleFeatures,featuresProviderKey,onVisibleFeaturesChange(),openFeaturesModal()useTenantshook:visibleFeatures,featuresProviderKey,onVisibleFeaturesChange(),openFeaturesModal()
v2.1.1
February 2026
- Version alignment with @abpjs/core
v2.0.0
January 2026
New Features
-
SaasStateService- New state service for programmatic SaaS operations:Tenant Operations:
dispatchGetTenants(params?)- Fetch tenants and update internal statedispatchGetTenantById(id)- Fetch a single tenant by IDdispatchCreateTenant(body)- Create a new tenantdispatchUpdateTenant(body)- Update an existing tenantdispatchDeleteTenant(id)- Delete a tenantdispatchGetLatestTenants()- Fetch latest tenants (for dashboard widget)
Edition Operations:
dispatchGetEditions(params?)- Fetch editions and update internal statedispatchGetEditionById(id)- Fetch a single edition by IDdispatchCreateEdition(body)- Create a new editiondispatchUpdateEdition(body)- Update an existing editiondispatchDeleteEdition(id)- Delete an edition
Statistics Operations:
dispatchGetUsageStatistics()- Fetch usage statistics
State Getter Methods:
getTenants()/getTenantsTotalCount()- Access cached tenantsgetLatestTenants()- Access cached latest tenantsgetEditions()/getEditionsTotalCount()- Access cached editionsgetUsageStatistics()- Access cached usage statistics
Example
import { SaasStateService } from '@abpjs/saas';
import { RestService } from '@abpjs/core';
const restService = new RestService();
const stateService = new SaasStateService(restService);
// Fetch tenants
await stateService.dispatchGetTenants({ maxResultCount: 10 });
const tenants = stateService.getTenants();
console.log(`Found ${stateService.getTenantsTotalCount()} tenants`);
// Create a new tenant
await stateService.dispatchCreateTenant({
name: 'NewTenant',
adminEmailAddress: 'admin@newtenant.com',
adminPassword: 'Password123!',
editionId: 'edition-id',
});
// Fetch editions
await stateService.dispatchGetEditions();
const editions = stateService.getEditions();
// Get usage statistics
await stateService.dispatchGetUsageStatistics();
const stats = stateService.getUsageStatistics();
v1.0.0
January 2026
- Version alignment with @abpjs/core v1.0.0
v0.7.2 (Initial Release)
Components
-
TenantsComponent - Full tenant management UI with:
- Paginated list with search and sorting
- Create tenant with admin credentials
- Edit tenant with edition assignment
- Delete tenant with confirmation
- Connection string management (shared or separate database)
-
EditionsComponent - Edition management UI with:
- Paginated list with sorting
- Create/edit edition modal
- Delete edition with confirmation
- Usage statistics display
Hooks
-
useTenants - State management for tenants with:
fetchTenants()- Get paginated tenants with edition namescreateTenant()- Create tenant with admin credentialsupdateTenant()- Update tenantdeleteTenant()- Delete tenantgetDefaultConnectionString()- Get tenant's connection stringupdateDefaultConnectionString()- Set separate databasedeleteDefaultConnectionString()- Revert to shared database
-
useEditions - State management for editions with:
fetchEditions()- Get paginated editionscreateEdition()- Create editionupdateEdition()- Update editiondeleteEdition()- Delete editionfetchUsageStatistics()- Get edition usage counts
Services
- SaasService with methods for:
- Tenant CRUD operations
- Edition CRUD operations
- Connection string management
- Usage statistics
Constants
- SAAS_ROUTES - Pre-configured route definitions with policies
TypeScript
- Saas namespace with all types:
Tenant,TenantsResponse,TenantsQueryParamsCreateTenantRequest,UpdateTenantRequestEdition,EditionsResponse,EditionsQueryParamsCreateEditionRequest,UpdateEditionRequestDefaultConnectionStringRequestUsageStatisticsResponseStateinterface for state management