diff --git a/npm/ng-packs/package.json b/npm/ng-packs/package.json
index 1b6fff15c4..405e0e15d9 100644
--- a/npm/ng-packs/package.json
+++ b/npm/ng-packs/package.json
@@ -51,29 +51,29 @@
"@abp/ng.theme.lepton-x": "~5.7.0-rc.1",
"@abp/ng.schematics": "~10.7.0-rc.1",
"@abp/utils": "~10.7.0-rc.1",
- "@angular-devkit/build-angular": "~22.0.0",
- "@angular-devkit/core": "~22.0.0",
- "@angular-devkit/schematics": "~22.0.0",
- "@angular-devkit/schematics-cli": "~22.0.0",
- "@angular-eslint/eslint-plugin": "~22.0.0",
- "@angular-eslint/eslint-plugin-template": "~22.0.0",
- "@angular-eslint/template-parser": "~22.0.0",
- "@angular/animations": "~22.0.0",
- "@angular/aria": "~22.0.0",
- "@angular/build": "~22.0.0",
- "@angular/cli": "~22.0.0",
- "@angular/common": "~22.0.0",
- "@angular/compiler": "~22.0.0",
- "@angular/compiler-cli": "~22.0.0",
- "@angular/core": "~22.0.0",
- "@angular/forms": "~22.0.0",
- "@angular/language-service": "~22.0.0",
- "@angular/localize": "~22.0.0",
- "@angular/platform-browser": "~22.0.0",
- "@angular/platform-browser-dynamic": "~22.0.0",
- "@angular/platform-server": "~22.0.0",
- "@angular/router": "~22.0.0",
- "@angular/ssr": "~22.0.0",
+ "@angular-devkit/build-angular": "~22.1.0",
+ "@angular-devkit/core": "~22.1.0",
+ "@angular-devkit/schematics": "~22.1.0",
+ "@angular-devkit/schematics-cli": "~22.1.0",
+ "@angular-eslint/eslint-plugin": "~22.1.0",
+ "@angular-eslint/eslint-plugin-template": "~22.1.0",
+ "@angular-eslint/template-parser": "~22.1.0",
+ "@angular/animations": "~22.1.0",
+ "@angular/aria": "~22.1.0",
+ "@angular/build": "~22.1.0",
+ "@angular/cli": "~22.1.0",
+ "@angular/common": "~22.1.0",
+ "@angular/compiler": "~22.1.0",
+ "@angular/compiler-cli": "~22.1.0",
+ "@angular/core": "~22.1.0",
+ "@angular/forms": "~22.1.0",
+ "@angular/language-service": "~22.1.0",
+ "@angular/localize": "~22.1.0",
+ "@angular/platform-browser": "~22.1.0",
+ "@angular/platform-browser-dynamic": "~22.1.0",
+ "@angular/platform-server": "~22.1.0",
+ "@angular/router": "~22.1.0",
+ "@angular/ssr": "~22.1.0",
"@fortawesome/fontawesome-free": "^6.0.0",
"@ng-bootstrap/ng-bootstrap": "~20.0.0",
"@ngneat/spectator": "~19.6.2",
@@ -91,7 +91,7 @@
"@nx/web": "~22.7.5",
"@nx/workspace": "~22.7.5",
"@popperjs/core": "~2.11.0",
- "@schematics/angular": "~22.0.0",
+ "@schematics/angular": "~22.1.0",
"@swc-node/register": "~1.11.1",
"@swc/cli": "~0.7.10",
"@swc/core": "~1.15.8",
@@ -129,7 +129,7 @@
"just-compare": "^2.0.0",
"lerna": "^4.0.0",
"lint-staged": "^13.0.0",
- "ng-packagr": "~22.0.0",
+ "ng-packagr": "~22.1.0",
"ng-zorro-antd": "~21.1.0",
"nx": "~22.7.5",
"postcss": "^8.0.0",
diff --git a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts
index b12782288d..d9ad09c780 100644
--- a/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts
+++ b/npm/ng-packs/packages/core/src/lib/directives/permission.directive.ts
@@ -52,7 +52,9 @@ export class PermissionDirective implements OnDestroy, OnChanges, AfterViewInit
if (!this.rendered) {
this.cdrSubject.next();
} else {
- this.cdRef.detectChanges();
+ // Defer via queue — sync detectChanges during ApplicationRef.tick
+ // (e.g. post-login permission/config refresh) can contribute to NG0101.
+ this.queue.add(() => this.cdRef.detectChanges());
}
} else {
this.cdRef.markForCheck();
diff --git a/npm/ng-packs/packages/feature-management/package.json b/npm/ng-packs/packages/feature-management/package.json
index 35e67f5cbe..512561583d 100644
--- a/npm/ng-packs/packages/feature-management/package.json
+++ b/npm/ng-packs/packages/feature-management/package.json
@@ -11,7 +11,7 @@
"tslib": "^2.0.0"
},
"peerDependencies": {
- "@angular/aria": "~21.2.0"
+ "@angular/aria": "~22.1.0"
},
"publishConfig": {
"access": "public"
diff --git a/npm/ng-packs/packages/permission-management/package.json b/npm/ng-packs/packages/permission-management/package.json
index 62dec74cbc..25f90bb13f 100644
--- a/npm/ng-packs/packages/permission-management/package.json
+++ b/npm/ng-packs/packages/permission-management/package.json
@@ -11,7 +11,7 @@
"tslib": "^2.0.0"
},
"peerDependencies": {
- "@angular/aria": "~21.2.0"
+ "@angular/aria": "~22.1.0"
},
"publishConfig": {
"access": "public"
diff --git a/npm/ng-packs/packages/schematics/package.json b/npm/ng-packs/packages/schematics/package.json
index 3e87293cab..1a928c4668 100644
--- a/npm/ng-packs/packages/schematics/package.json
+++ b/npm/ng-packs/packages/schematics/package.json
@@ -4,16 +4,16 @@
"author": "",
"schematics": "./collection.json",
"dependencies": {
- "@angular-devkit/core": "~22.0.0",
- "@angular-devkit/schematics": "~22.0.0",
- "@angular/cli": "~22.0.0",
+ "@angular-devkit/core": "~22.1.0",
+ "@angular-devkit/schematics": "~22.1.0",
+ "@angular/cli": "~22.1.0",
"got": "^11.5.2",
"jsonc-parser": "^2.3.0",
"should-quote": "^1.0.0",
"typescript": "~6.0.3"
},
"devDependencies": {
- "@schematics/angular": "~22.0.0",
+ "@schematics/angular": "~22.1.0",
"@types/jest": "29.4.4",
"@types/node": "20.2.5",
"jest": "29.4.3",
diff --git a/npm/ng-packs/packages/setting-management/package.json b/npm/ng-packs/packages/setting-management/package.json
index dababae919..f166095800 100644
--- a/npm/ng-packs/packages/setting-management/package.json
+++ b/npm/ng-packs/packages/setting-management/package.json
@@ -12,7 +12,7 @@
"tslib": "^2.0.0"
},
"peerDependencies": {
- "@angular/aria": "~21.2.0"
+ "@angular/aria": "~22.1.0"
},
"publishConfig": {
"access": "public"
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.html
index b23fdc598e..1eabd84821 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.html
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.html
@@ -1 +1 @@
-
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts
index b8a86342b1..884eb9db99 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/breadcrumb/breadcrumb.component.ts
@@ -6,7 +6,7 @@ import {
SubscriptionService,
TreeNode,
} from '@abp/ng.core';
-import { ChangeDetectionStrategy, ChangeDetectorRef, Component, OnInit, inject } from '@angular/core';
+import { ChangeDetectionStrategy, Component, OnInit, inject, signal } from '@angular/core';
import { Router } from '@angular/router';
import { map, startWith } from 'rxjs/operators';
import { eThemeSharedRouteNames } from '../../enums/route-names';
@@ -20,14 +20,13 @@ import { BreadcrumbItemsComponent } from '../breadcrumb-items/breadcrumb-items.c
imports: [BreadcrumbItemsComponent],
})
export class BreadcrumbComponent implements OnInit {
- readonly cdRef = inject(ChangeDetectorRef);
private router = inject(Router);
private routes = inject(RoutesService);
private subscription = inject(SubscriptionService);
private routerEvents = inject(RouterEvents);
private routeCultureUrl = inject(RouteBasedCultureUrlService);
- segments: Partial[] = [];
+ readonly segments = signal[]>([]);
ngOnInit(): void {
this.subscription.addOne(
@@ -38,18 +37,18 @@ export class BreadcrumbComponent implements OnInit {
),
),
route => {
- this.segments = [];
+ const next: Partial[] = [];
if (route) {
let node = { parent: route } as TreeNode;
while (node.parent) {
node = node.parent;
const { parent, children, isLeaf, ...segment } = node;
- if (!isAdministration(segment)) this.segments.unshift(segment);
+ if (!isAdministration(segment)) next.unshift(segment);
}
-
- this.cdRef.detectChanges();
}
+
+ this.segments.set(next);
},
);
}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts
index b6db6e7716..f1f3a5c114 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/services/toaster.service.ts
@@ -1,4 +1,4 @@
-import { ApplicationRef, ComponentRef, inject, Injectable } from '@angular/core';
+import { ComponentRef, inject, Injectable } from '@angular/core';
import {
ContentProjectionService,
LocalizationParam,
@@ -12,7 +12,6 @@ import { Toaster } from '../models';
providedIn: 'root',
})
export class ToasterService implements ToasterContract {
- private readonly appRef = inject(ApplicationRef);
private readonly contentProjectionService = inject(ContentProjectionService);
private lastId = -1;
@@ -37,8 +36,9 @@ export class ToasterService implements ToasterContract {
}
this.containerComponentRef.instance.setToasts(this.toasts);
+ // Only refresh the projected toast host. Calling ApplicationRef.tick() here
+ // races with zone-driven CD and throws NG0101 (recursive tick).
this.containerComponentRef.changeDetectorRef.detectChanges();
- this.appRef.tick();
}
/**
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
index 6ad217d3b8..ce1463e2cf 100644
--- a/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
+++ b/npm/ng-packs/packages/theme-shared/src/lib/tests/breadcrumb.component.spec.ts
@@ -135,7 +135,7 @@ describe('BreadcrumbComponent', () => {
const breadcrumb = spectator.fixture.debugElement.query(By.directive(BreadcrumbComponent))
.componentInstance as BreadcrumbComponent;
- expect(breadcrumb.segments.map(segment => segment.path)).toEqual([
+ expect(breadcrumb.segments().map(segment => segment.path)).toEqual([
'/identity',
'/identity/users',
]);
diff --git a/templates/app-nolayers/angular/package.json b/templates/app-nolayers/angular/package.json
index c90b3cd5c0..d526be0fd6 100644
--- a/templates/app-nolayers/angular/package.json
+++ b/templates/app-nolayers/angular/package.json
@@ -21,16 +21,16 @@
"@abp/ng.tenant-management": "~10.7.0-rc.1",
"@abp/ng.theme.lepton-x": "~5.7.0-rc.1",
"@abp/ng.theme.shared": "~10.7.0-rc.1",
- "@angular/animations": "~22.0.1",
- "@angular/aria": "~22.0.0",
- "@angular/common": "~22.0.1",
- "@angular/compiler": "~22.0.1",
- "@angular/core": "~22.0.1",
- "@angular/forms": "~22.0.1",
- "@angular/localize": "~22.0.1",
- "@angular/platform-browser": "~22.0.1",
- "@angular/platform-browser-dynamic": "~22.0.1",
- "@angular/router": "~22.0.1",
+ "@angular/animations": "~22.1.0",
+ "@angular/aria": "~22.1.0",
+ "@angular/common": "~22.1.0",
+ "@angular/compiler": "~22.1.0",
+ "@angular/core": "~22.1.0",
+ "@angular/forms": "~22.1.0",
+ "@angular/localize": "~22.1.0",
+ "@angular/platform-browser": "~22.1.0",
+ "@angular/platform-browser-dynamic": "~22.1.0",
+ "@angular/router": "~22.1.0",
"bootstrap-icons": "~1.8.0",
"rxjs": "~7.8.0",
"tslib": "^2.0.0",
@@ -38,15 +38,15 @@
},
"devDependencies": {
"@abp/ng.schematics": "~10.7.0-rc.1",
- "@angular-eslint/builder": "~21.2.0",
- "@angular-eslint/eslint-plugin": "~21.2.0",
- "@angular-eslint/eslint-plugin-template": "~21.2.0",
- "@angular-eslint/schematics": "~21.2.0",
- "@angular-eslint/template-parser": "~21.2.0",
- "@angular/build": "~22.0.1",
- "@angular/cli": "~22.0.1",
- "@angular/compiler-cli": "~22.0.1",
- "@angular/language-service": "~22.0.1",
+ "@angular-eslint/builder": "~22.1.0",
+ "@angular-eslint/eslint-plugin": "~22.1.0",
+ "@angular-eslint/eslint-plugin-template": "~22.1.0",
+ "@angular-eslint/schematics": "~22.1.0",
+ "@angular-eslint/template-parser": "~22.1.0",
+ "@angular/build": "~22.1.0",
+ "@angular/cli": "~22.1.0",
+ "@angular/compiler-cli": "~22.1.0",
+ "@angular/language-service": "~22.1.0",
"@types/node": "^12.11.1",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
diff --git a/templates/app/angular/package.json b/templates/app/angular/package.json
index b7e1aa37ca..8e14c60e29 100644
--- a/templates/app/angular/package.json
+++ b/templates/app/angular/package.json
@@ -21,16 +21,16 @@
"@abp/ng.tenant-management": "~10.7.0-rc.1",
"@abp/ng.theme.lepton-x": "~5.7.0-rc.1",
"@abp/ng.theme.shared": "~10.7.0-rc.1",
- "@angular/animations": "~22.0.1",
- "@angular/aria": "~22.0.0",
- "@angular/common": "~22.0.1",
- "@angular/compiler": "~22.0.1",
- "@angular/core": "~22.0.1",
- "@angular/forms": "~22.0.1",
- "@angular/localize": "~22.0.1",
- "@angular/platform-browser": "~22.0.1",
- "@angular/platform-browser-dynamic": "~22.0.1",
- "@angular/router": "~22.0.1",
+ "@angular/animations": "~22.1.0",
+ "@angular/aria": "~22.1.0",
+ "@angular/common": "~22.1.0",
+ "@angular/compiler": "~22.1.0",
+ "@angular/core": "~22.1.0",
+ "@angular/forms": "~22.1.0",
+ "@angular/localize": "~22.1.0",
+ "@angular/platform-browser": "~22.1.0",
+ "@angular/platform-browser-dynamic": "~22.1.0",
+ "@angular/router": "~22.1.0",
"bootstrap-icons": "~1.8.0",
"rxjs": "~7.8.0",
"tslib": "^2.0.0",
@@ -38,15 +38,15 @@
},
"devDependencies": {
"@abp/ng.schematics": "~10.7.0-rc.1",
- "@angular-eslint/builder": "~21.2.0",
- "@angular-eslint/eslint-plugin": "~21.2.0",
- "@angular-eslint/eslint-plugin-template": "~21.2.0",
- "@angular-eslint/schematics": "~21.2.0",
- "@angular-eslint/template-parser": "~21.2.0",
- "@angular/build": "~22.0.1",
- "@angular/cli": "~22.0.1",
- "@angular/compiler-cli": "~22.0.1",
- "@angular/language-service": "~22.0.1",
+ "@angular-eslint/builder": "~22.1.0",
+ "@angular-eslint/eslint-plugin": "~22.1.0",
+ "@angular-eslint/eslint-plugin-template": "~22.1.0",
+ "@angular-eslint/schematics": "~22.1.0",
+ "@angular-eslint/template-parser": "~22.1.0",
+ "@angular/build": "~22.1.0",
+ "@angular/cli": "~22.1.0",
+ "@angular/compiler-cli": "~22.1.0",
+ "@angular/language-service": "~22.1.0",
"@types/node": "~20.11.0",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
diff --git a/templates/module/angular/package.json b/templates/module/angular/package.json
index 3acd4258e8..4c85fe517f 100644
--- a/templates/module/angular/package.json
+++ b/templates/module/angular/package.json
@@ -22,39 +22,39 @@
"@abp/ng.tenant-management": "~10.7.0-rc.1",
"@abp/ng.theme.basic": "~10.7.0-rc.1",
"@abp/ng.theme.shared": "~10.7.0-rc.1",
- "@angular/animations": "~22.0.0",
- "@angular/aria": "~22.0.0",
- "@angular/common": "~22.0.0",
- "@angular/compiler": "~22.0.0",
- "@angular/core": "~22.0.0",
- "@angular/forms": "~22.0.0",
- "@angular/localize": "~22.0.0",
- "@angular/platform-browser": "~22.0.0",
- "@angular/platform-browser-dynamic": "~22.0.0",
- "@angular/router": "~22.0.0",
+ "@angular/animations": "~22.1.0",
+ "@angular/aria": "~22.1.0",
+ "@angular/common": "~22.1.0",
+ "@angular/compiler": "~22.1.0",
+ "@angular/core": "~22.1.0",
+ "@angular/forms": "~22.1.0",
+ "@angular/localize": "~22.1.0",
+ "@angular/platform-browser": "~22.1.0",
+ "@angular/platform-browser-dynamic": "~22.1.0",
+ "@angular/router": "~22.1.0",
"rxjs": "~7.8.0",
"tslib": "^2.0.0",
"zone.js": "~0.15.0"
},
"devDependencies": {
"@abp/ng.schematics": "~10.7.0-rc.1",
- "@angular-eslint/builder": "~21.2.0",
- "@angular-eslint/eslint-plugin": "~21.2.0",
- "@angular-eslint/eslint-plugin-template": "~21.2.0",
- "@angular-eslint/schematics": "~21.2.0",
- "@angular-eslint/template-parser": "~21.2.0",
- "@angular/build": "~21.2.0",
- "@angular/cli": "~21.2.0",
- "@angular/compiler-cli": "~21.2.0",
- "@angular/language-service": "~21.2.0",
+ "@angular-eslint/builder": "~22.1.0",
+ "@angular-eslint/eslint-plugin": "~22.1.0",
+ "@angular-eslint/eslint-plugin-template": "~22.1.0",
+ "@angular-eslint/schematics": "~22.1.0",
+ "@angular-eslint/template-parser": "~22.1.0",
+ "@angular/build": "~22.1.0",
+ "@angular/cli": "~22.1.0",
+ "@angular/compiler-cli": "~22.1.0",
+ "@angular/language-service": "~22.1.0",
"@types/node": "^12.11.1",
"@typescript-eslint/eslint-plugin": "7.16.0",
"@typescript-eslint/parser": "7.16.0",
"eslint": "^8.0.0",
"jsdom": "^27.1.0",
- "ng-packagr": "~22.0.0",
+ "ng-packagr": "~22.1.0",
"symlink": "^2.0.0",
"typescript": "~6.0.3",
"vitest": "^4.0.0"
}
-}
\ No newline at end of file
+}
diff --git a/templates/module/angular/projects/my-project-name/package.json b/templates/module/angular/projects/my-project-name/package.json
index 1b70364a0d..823fd14f1a 100644
--- a/templates/module/angular/projects/my-project-name/package.json
+++ b/templates/module/angular/projects/my-project-name/package.json
@@ -2,8 +2,8 @@
"name": "@my-company-name/my-project-name",
"version": "0.0.1",
"peerDependencies": {
- "@angular/common": "~21.2.0",
- "@angular/core": "~21.2.0",
+ "@angular/common": "~22.1.0",
+ "@angular/core": "~22.1.0",
"@abp/ng.core": "~10.7.0-rc.1",
"@abp/ng.theme.shared": "~10.7.0-rc.1"
},
diff --git a/templates/module/angular/tsconfig.prod.json b/templates/module/angular/tsconfig.prod.json
index b8243f2066..ad47989213 100644
--- a/templates/module/angular/tsconfig.prod.json
+++ b/templates/module/angular/tsconfig.prod.json
@@ -4,13 +4,13 @@
"outDir": "./dist/out-tsc",
"sourceMap": true,
"declaration": false,
- "downlevelIteration": true,
"experimentalDecorators": true,
"moduleResolution": "bundler",
"importHelpers": true,
"target": "es2022",
"module": "ES2022",
"esModuleInterop": true,
+ "skipLibCheck": true,
"lib": [
"es2020",
"dom"