chore: migrate to Angular 20, TypeScript 5.9, and supporting packages

chore: migrate to Angular 20, TypeScript 5.9, and supporting packages

This commit migrates the Nx monorepo from Angular 19 to Angular 20
and updates all related dependencies to their compatible versions.

- @angular/core: 19.2.18 → 20.3.9
- @angular/material: 19.2.19 → 20.2.14
- @angular/cdk: 19.2.19 → 20.2.14
- @angular/material-date-fns-adapter: 19.2.19 → 20.2.14
- typescript: 5.8.3 → 5.9.3
- ng-packagr: 19.2.2 → 20.3.2

- @angular-devkit/build-angular: 19.2.19 → 20.3.16
- @angular-devkit/architect: 0.1902.19 → 0.2003.16
- @angular-devkit/core: 19.2.19 → 20.3.16
- @angular-devkit/schematics: 19.2.19 → 20.3.16
- @schematics/angular: 19.2.7 → 20.3.16

- @angular-eslint/eslint-plugin: 19.3.0 → 20.7.0
- @angular-eslint/eslint-plugin-template: 19.3.0 → 20.7.0
- @angular-eslint/template-parser: 19.3.0 → 20.7.0
- @typescript-eslint/eslint-plugin: 6.21.0 → 8.55.0
- @typescript-eslint/parser: 6.21.0 → 8.55.0
- @typescript-eslint/typescript-estree: 8.41.0 → 8.55.0
- @typescript-eslint/utils: ^8.51.0 → 8.55.0

- nx: 22.4.1 → 22.5.1
- @nx/angular: 22.1.3 → 22.5.1
- @nx/eslint-plugin: 22.3.3 → 22.5.1
- @nx/js: 22.1.3 → 22.5.1
- @nx/node: 22.1.3 → 22.5.1
- @nx/storybook: ^20.8.4 → 22.5.1
- @nx/workspace: 22.4.5 → 22.5.1
- @nx/webpack: 22.3.3 → 22.5.1

- storybook: ^10.2.0 → 10.2.8
- @storybook/angular: ^10.2.0 → 10.2.8
- @storybook/addon-themes: ^10.2.0 → 10.2.8

1. **PortalInjector Removal (Angular CDK 20)**
   - Replaced PortalInjector usage with Injector.create()
   - Updated context-menu-overlay.service.ts to use new API

2. **ESLint Configuration**
   - Removed deprecated @typescript-eslint/brace-style rule
   - This rule was removed in @typescript-eslint v8

All libraries build successfully:
-  js-api
-  extensions
-  core
-  content-services
-  process-services
-  process-services-cloud
-  insights

Dependencies were installed using npm install --legacy-peer-deps due to
peer dependency conflicts with @mat-datetimepicker/core which requires
Angular CDK ^19.0.0 but we are using 20.2.14.

- ESLint warnings about @angular-eslint/prefer-inject are expected - this
  is a new recommendation in Angular 20 to use inject() function instead
  of constructor injection. These can be addressed in a follow-up PR.

chore: migrate to Angular 20, TypeScript 5.9, and supporting packages

This commit migrates the Nx monorepo from Angular 19 to Angular 20
and updates all related dependencies to their compatible versions.

- @angular/core: 19.2.18 → 20.3.9
- @angular/material: 19.2.19 → 20.2.14
- @angular/cdk: 19.2.19 → 20.2.14
- @angular/material-date-fns-adapter: 19.2.19 → 20.2.14
- typescript: 5.8.3 → 5.9.3
- ng-packagr: 19.2.2 → 20.3.2

- @angular-devkit/build-angular: 19.2.19 → 20.3.16
- @angular-devkit/architect: 0.1902.19 → 0.2003.16
- @angular-devkit/core: 19.2.19 → 20.3.16
- @angular-devkit/schematics: 19.2.19 → 20.3.16
- @schematics/angular: 19.2.7 → 20.3.16

- @angular-eslint/eslint-plugin: 19.3.0 → 20.7.0
- @angular-eslint/eslint-plugin-template: 19.3.0 → 20.7.0
- @angular-eslint/template-parser: 19.3.0 → 20.7.0
- @typescript-eslint/eslint-plugin: 6.21.0 → 8.55.0
- @typescript-eslint/parser: 6.21.0 → 8.55.0
- @typescript-eslint/typescript-estree: 8.41.0 → 8.55.0
- @typescript-eslint/utils: ^8.51.0 → 8.55.0

- nx: 22.4.1 → 22.5.1
- @nx/angular: 22.1.3 → 22.5.1
- @nx/eslint-plugin: 22.3.3 → 22.5.1
- @nx/js: 22.1.3 → 22.5.1
- @nx/node: 22.1.3 → 22.5.1
- @nx/storybook: ^20.8.4 → 22.5.1
- @nx/workspace: 22.4.5 → 22.5.1
- @nx/webpack: 22.3.3 → 22.5.1

- storybook: ^10.2.0 → 10.2.8
- @storybook/angular: ^10.2.0 → 10.2.8
- @storybook/addon-themes: ^10.2.0 → 10.2.8

1. **PortalInjector Removal (Angular CDK 20)**
   - Replaced PortalInjector usage with Injector.create()
   - Updated context-menu-overlay.service.ts to use new API

2. **ESLint Configuration**
   - Removed deprecated @typescript-eslint/brace-style rule
   - This rule was removed in @typescript-eslint v8

All libraries build successfully:
-  js-api
-  extensions
-  core
-  content-services
-  process-services
-  process-services-cloud
-  insights

Dependencies were installed using npm install --legacy-peer-deps due to
peer dependency conflicts with @mat-datetimepicker/core which requires
Angular CDK ^19.0.0 but we are using 20.2.14.

- ESLint warnings about @angular-eslint/prefer-inject are expected - this
  is a new recommendation in Angular 20 to use inject() function instead
  of constructor injection. These can be addressed in a follow-up PR.

  To fix these automatically, run:
  ng generate @angular/core:inject --path=lib

fix: resolve peer dependency conflicts for CI/CD

- Update @mat-datetimepicker/core from 15.0.2 to 16.0.1 (supports Angular 20)
- Update webpack override to 5.104.1 for consistency
- Add .npmrc with legacy-peer-deps=true for npm ci compatibility
- Fixes npm ci failures in CI/CD pipeline

fix: update webpack to 5.105.0 for Storybook compatibility

- Align webpack version with @angular-devkit/build-angular bundled version
- Fixes Storybook compilation error with webpack instance mismatch
- Removes unnecessary webpack overrides

chore: finalize Angular 20 migration and improve migration prompt

- Marked all migration tasks as completed in the migration plan.
- Added a comprehensive summary of the migration process, including phases, completed tasks, and known issues.
- Introduced an improved migration prompt that addresses critical considerations and provides a detailed migration strategy for Angular 20 and related packages.

fix: update migration prompt and tests for Angular 20 breaking changes

- Enhanced migration prompt with specific instructions for handling Angular CDK Directionality API changes and removal of ng-reflect-* attributes.
- Updated unit tests to replace deprecated ng-reflect-* attribute checks with appropriate Angular testing patterns.
- Adjusted user preferences service to utilize the new directionality API method for setting text direction.

fix: enhance ImgViewerComponent to handle cleanup and prevent errors after destruction

- Added a `destroyed` flag to manage component lifecycle and prevent operations on a destroyed instance.
- Implemented `afterEach` hooks in tests to ensure proper fixture cleanup.
- Updated key event handlers and methods to check for the `destroyed` state before executing actions, improving stability and preventing errors.

feat: update ESLint configuration to include @angular-eslint/prefer-inject rule

- Added the @angular-eslint/prefer-inject rule to .eslintrc.json files in content-services, process-services, and process-services-cloud, promoting the use of the inject() function for dependency injection.
- Made minor adjustments to comments in search-logical-filter.component.ts for clarity.

chore: update ESLint configuration to include @angular-eslint/prefer-inject rule

- Added the @angular-eslint/prefer-inject rule to .eslintrc.json files in extensions, insights, and js-api, promoting the use of the inject() function for dependency injection.
- Removed unnecessary eslint-disable comments in process-list-cloud.component.ts and base-task-list-cloud.component.ts for cleaner code.

remove unnecessary changes

remove useless changes

cleanup useless changes

remove useless changes

Update package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

chore: update version of @ngx-translate/core to 17.0.0 in package.json and package-lock.json

Update package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

Update package.json

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

Update .npmrc

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>

chore: upgrade apollo-angular and jest packages to support Angular 20

- Upgrade apollo-angular from 10.0.3 to 13.0.0
- Upgrade @apollo/client from 3.13.1 to ^4.0.1
- Upgrade jest packages to v30 (jest, jest-environment-jsdom)
- Upgrade jest-preset-angular from 14.4.2 to 16.1.1
- Add overrides for Angular 20 peer dependency compatibility

chore: downgrade @apollo/client and apollo-angular to compatible versions

chore: downgrade @apollo/client and apollo-angular to compatible versions

chore: remove unused configuration options from jest and tsconfig

chore: refactor window.location mock in oauth2 tests for improved clarity and functionality

chore: enhance oauth2Auth tests and improve hash handling logic

chore: remove @typescript-eslint/brace-style rule from ESLint configuration

chore: add prefer-optional-chain rule to ESLint configuration

chore: update ESLint rules for optional chaining and refactor type definitions

chore: refactor tests to use TestBed for dependency injection in FileViewer and ProcessFormRendering services

chore: update AttachFileWidgetComponent to ensure early return after download

chore: update AttachFileWidgetComponent to ensure early return after download

chore: update unselectFacetBucket method to use optional chaining for safer property access
This commit is contained in:
Denys Vuika
2026-02-16 15:36:58 +00:00
committed by Aleksander Sklorz
parent 74252797b7
commit fe9b69c2b5
15 changed files with 109 additions and 104 deletions

0
.npmrc Normal file
View File

View File

@@ -100,7 +100,7 @@ describe('SearchChipListComponent', () => {
});
it('should remove the entry upon remove button click', async () => {
spyOn(searchFacetFiltersService, 'unselectFacetBucket').and.callThrough();
spyOn(searchFacetFiltersService, 'unselectFacetBucket').and.stub();
searchFacetFiltersService.selectedBuckets = [
{

View File

@@ -394,7 +394,7 @@ export class SearchFacetFiltersService {
unselectFacetBucket(facetField: FacetField, bucket: FacetFieldBucket) {
if (bucket) {
bucket.checked = false;
this.queryBuilder.removeUserFacetBucket(facetField.field, bucket);
this.queryBuilder.removeUserFacetBucket(facetField?.field, bucket);
this.updateSelectedBuckets();
this.queryBuilder.update();
}

View File

@@ -135,7 +135,8 @@ export class UserPreferencesService {
this.select('textOrientation').subscribe((direction: Direction) => {
renderer.setAttribute(this.document.body, 'dir', direction);
(this.directionality as any).value = direction;
this.directionality.valueSignal.set(direction);
this.directionality.change.emit(direction);
});
}

View File

@@ -4,7 +4,6 @@ export default {
preset: '../../jest.preset.js',
testEnvironment: 'jsdom',
setupFilesAfterEnv: ['<rootDir>/src/test-setup.ts'],
collectCoverage: true,
coverageReporters: ['html', ['text-summary', { file: 'summary.txt' }], 'text-summary'],
coverageDirectory: '../../coverage/js-api',
moduleNameMapper: {

View File

@@ -437,7 +437,7 @@ export class Oauth2Auth extends AlfrescoApiClient {
if (!externalHash) {
hash = decodeURIComponent(window.location.hash);
if (!this.startWithHashRoute(hash)) {
if (hash && !this.startWithHashRoute(hash)) {
window.location.hash = '';
}
} else {

View File

@@ -15,5 +15,4 @@
* limitations under the License.
*/
// eslint-disable-next-line @typescript-eslint/prefer-optional-chain
export const isBrowser = (): boolean => typeof window !== 'undefined' && typeof window.document !== 'undefined';

View File

@@ -41,26 +41,24 @@ describe('Oauth2 test', () => {
});
alfrescoJsApi.storage.setStorage(mockStorage);
Object.defineProperty(window, 'location', {
writable: true,
value: {
ancestorOrigins: null,
hash: null,
host: 'dummy.com',
port: '80',
protocol: 'http:',
hostname: 'dummy.com',
href: 'http://localhost/',
origin: 'dummy.com',
pathname: null,
search: null,
assign: (url: string) => {
window.location.href = url;
},
reload: null,
replace: null
}
});
delete (window as any).location;
(window as any).location = {
ancestorOrigins: null,
hash: null,
host: 'dummy.com',
port: '80',
protocol: 'http:',
hostname: 'dummy.com',
href: 'http://localhost/',
origin: 'dummy.com',
pathname: null,
search: null,
assign: jest.fn((url: string) => {
window.location.href = url;
}),
reload: jest.fn(),
replace: jest.fn()
};
});
afterEach(() => {
@@ -189,7 +187,6 @@ describe('Oauth2 test', () => {
});
it('should refresh token when the login not use the implicitFlow ', (done) => {
jest.spyOn(window, 'document', 'get').mockReturnValueOnce(undefined);
oauth2Mock.get200Response();
const oauth2Auth = new Oauth2Auth(
@@ -208,6 +205,10 @@ describe('Oauth2 test', () => {
alfrescoJsApi
);
jest.spyOn(oauth2Auth as any, 'silentRefresh').mockImplementation(function (this: any) {
this.pollingRefreshToken();
});
let calls = 0;
oauth2Auth.refreshToken = () => {
calls++;
@@ -224,7 +225,6 @@ describe('Oauth2 test', () => {
});
it('should not hang the app also if the logout is missing', (done) => {
jest.spyOn(window, 'document', 'get').mockReturnValueOnce(undefined);
oauth2Mock.get200Response();
const oauth2Auth = new Oauth2Auth(
@@ -244,6 +244,10 @@ describe('Oauth2 test', () => {
alfrescoJsApi
);
jest.spyOn(oauth2Auth as any, 'silentRefresh').mockImplementation(function (this: any) {
this.pollingRefreshToken();
});
let calls = 0;
oauth2Auth.refreshToken = () => {
calls++;

View File

@@ -26,26 +26,24 @@ describe('Oauth2 Implicit flow test', () => {
alfrescoJsApi = new AlfrescoApi({
hostEcm: ''
});
Object.defineProperty(window, 'location', {
writable: true,
value: {
ancestorOrigins: null,
hash: '',
host: 'dummy.com',
port: '80',
protocol: 'http:',
hostname: 'dummy.com',
href: 'http://localhost/',
origin: 'dummy.com',
pathname: null,
search: null,
assign: (url: string) => {
window.location.href = url;
},
reload: null,
replace: null
}
});
delete (window as any).location;
(window as any).location = {
ancestorOrigins: null,
hash: '',
host: 'dummy.com',
port: '80',
protocol: 'http:',
hostname: 'dummy.com',
href: 'http://localhost/',
origin: 'dummy.com',
pathname: null,
search: null,
assign: jest.fn((url: string) => {
window.location.href = url;
}),
reload: jest.fn(),
replace: jest.fn()
};
});
it('should throw an error if redirectUri is not present', (done) => {
@@ -84,8 +82,8 @@ describe('Oauth2 Implicit flow test', () => {
alfrescoJsApi
);
oauth2Auth.on('implicit_redirect', () => {
assert.equal(window.location.href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
oauth2Auth.on('implicit_redirect', (href: string) => {
assert.equal(href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
done();
});
@@ -110,8 +108,8 @@ describe('Oauth2 Implicit flow test', () => {
let setItemCalled = false;
alfrescoJsApi.storage.setItem = () => (setItemCalled = true);
oauth2Auth.on('implicit_redirect', () => {
assert.equal(window.location.href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
oauth2Auth.on('implicit_redirect', (href: string) => {
assert.equal(href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
assert.equal(setItemCalled, true);
done();
});
@@ -168,8 +166,8 @@ describe('Oauth2 Implicit flow test', () => {
let lastValues: [string, any];
alfrescoJsApi.storage.setItem = (key, value) => (lastValues = [key, value]);
oauth2Auth.on('implicit_redirect', () => {
assert.equal(window.location.href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
oauth2Auth.on('implicit_redirect', (href: string) => {
assert.equal(href.includes('https://myOauthUrl:30081/auth/realms/springboot/protocol/openid-connect/auth?'), true);
assert.deepEqual(lastValues, ['loginFragment', '/redirect-path&session_state=eqfqwfqwf']);
done();
});

View File

@@ -17,12 +17,11 @@
import { FileViewerWidgetComponent } from './file-viewer.widget';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormFieldModel, FormModel, FormService, NoopAuthModule, NoopTranslateModule } from '@alfresco/adf-core';
import { FormFieldModel, FormModel, NoopAuthModule, NoopTranslateModule } from '@alfresco/adf-core';
describe('FileViewerWidgetComponent', () => {
const fakeForm = new FormModel();
let widget: FileViewerWidgetComponent;
let formServiceStub: Partial<FormService>;
let fixture: ComponentFixture<FileViewerWidgetComponent>;
const fakePngAnswer: any = {
@@ -42,11 +41,9 @@ describe('FileViewerWidgetComponent', () => {
beforeEach(() => {
TestBed.configureTestingModule({
imports: [NoopTranslateModule, NoopAuthModule, FileViewerWidgetComponent],
providers: [{ provide: FormService, useValue: formServiceStub }]
imports: [NoopTranslateModule, NoopAuthModule, FileViewerWidgetComponent]
});
formServiceStub = TestBed.inject(FormService);
fixture = TestBed.createComponent(FileViewerWidgetComponent);
widget = fixture.componentInstance;
});

View File

@@ -16,7 +16,7 @@
*/
import { ProcessFormRenderingService } from './process-form-rendering.service';
import { FormFieldModel, FormFieldTypes } from '@alfresco/adf-core';
import { FormFieldModel, FormFieldTypes, FormService } from '@alfresco/adf-core';
import { AttachFolderWidgetComponent } from './widgets/content-widget/attach-folder-widget.component';
import { DropdownWidgetComponent } from './widgets/dropdown/dropdown.widget';
import { DynamicTableWidgetComponent } from './widgets/dynamic-table/dynamic-table.widget';
@@ -27,13 +27,16 @@ import { TypeaheadWidgetComponent } from './widgets/typeahead/typeahead.widget';
import { DocumentWidgetComponent } from './widgets/document/document.widget';
import { AttachFileWidgetComponent } from './widgets/content-widget/attach-file-widget.component';
import { FileViewerWidgetComponent } from './widgets/file-viewer/file-viewer.widget';
import { TestBed } from '@angular/core/testing';
describe('ProcessFormRenderingService', () => {
let service: ProcessFormRenderingService;
beforeEach(() => {
service = new ProcessFormRenderingService();
TestBed.configureTestingModule({
providers: [ProcessFormRenderingService, FormService]
});
service = TestBed.inject(ProcessFormRenderingService);
});
it('should resolve Upload field as Upload widget', () => {
@@ -106,5 +109,4 @@ describe('ProcessFormRenderingService', () => {
const type = resolver(null);
expect(type).toBe(FileViewerWidgetComponent);
});
});

View File

@@ -166,6 +166,7 @@ export class AttachFileWidgetComponent extends UploadWidgetComponent implements
const nodeUrl = this.contentService.getContentUrl(nodeUploaded.id);
this.downloadService.downloadUrl(nodeUrl, file.name);
}
return;
}
if (file.sourceId) {
const sourceHost = this.findSource(file.source);

View File

@@ -18,7 +18,7 @@
import { FileViewerWidgetComponent } from './file-viewer.widget';
import { ComponentFixture, TestBed } from '@angular/core/testing';
import { FormModel, FormService, FormFieldModel, RedirectAuthService } from '@alfresco/adf-core';
import { EMPTY, of } from 'rxjs';
import { EMPTY, of, Subject } from 'rxjs';
describe('FileViewerWidgetComponent', () => {
const fakeForm = new FormModel();
@@ -42,6 +42,11 @@ describe('FileViewerWidgetComponent', () => {
};
beforeEach(() => {
formServiceStub = {
formEvents: new Subject(),
formRulesEvent: new Subject()
};
TestBed.configureTestingModule({
imports: [FileViewerWidgetComponent],
providers: [
@@ -49,8 +54,6 @@ describe('FileViewerWidgetComponent', () => {
{ provide: RedirectAuthService, useValue: { onLogin: EMPTY, onTokenReceived: of() } }
]
});
formServiceStub = TestBed.inject(FormService);
fixture = TestBed.createComponent(FileViewerWidgetComponent);
widget = fixture.componentInstance;
});

View File

@@ -38,20 +38,20 @@
"process services-cloud"
],
"dependencies": {
"@angular/animations": "19.2.20",
"@angular/cdk": "19.2.19",
"@angular/common": "19.2.20",
"@angular/compiler": "19.2.20",
"@angular/core": "19.2.20",
"@angular/forms": "19.2.20",
"@angular/material": "19.2.19",
"@angular/material-date-fns-adapter": "19.2.19",
"@angular/platform-browser": "19.2.20",
"@angular/platform-browser-dynamic": "19.2.20",
"@angular/router": "19.2.20",
"@angular/animations": "20.3.9",
"@angular/cdk": "20.2.14",
"@angular/common": "20.3.9",
"@angular/compiler": "20.3.9",
"@angular/core": "20.3.9",
"@angular/forms": "20.3.9",
"@angular/material": "20.2.14",
"@angular/material-date-fns-adapter": "20.2.14",
"@angular/platform-browser": "20.3.9",
"@angular/platform-browser-dynamic": "20.3.9",
"@angular/router": "20.3.9",
"@apollo/client": "3.13.1",
"@cspell/eslint-plugin": "9.4.0",
"@mat-datetimepicker/core": "15.0.2",
"@mat-datetimepicker/core": "16.0.1",
"@ngx-translate/core": "^17.0.0",
"angular-oauth2-oidc": "17.0.2",
"angular-oauth2-oidc-jwks": "^17.0.2",
@@ -76,24 +76,24 @@
},
"devDependencies": {
"@alfresco/eslint-plugin-eslint-angular": "file:lib/eslint-angular",
"@angular-devkit/architect": "0.1902.22",
"@angular-devkit/build-angular": "19.2.22",
"@angular-devkit/core": "19.2.22",
"@angular-devkit/schematics": "19.2.22",
"@angular-eslint/eslint-plugin": "19.8.1",
"@angular-eslint/eslint-plugin-template": "19.8.1",
"@angular-eslint/template-parser": "19.8.1",
"@angular/compiler-cli": "19.2.20",
"@angular-devkit/architect": "0.2003.16",
"@angular-devkit/build-angular": "20.3.16",
"@angular-devkit/core": "20.3.16",
"@angular-devkit/schematics": "20.3.16",
"@angular-eslint/eslint-plugin": "20.7.0",
"@angular-eslint/eslint-plugin-template": "20.7.0",
"@angular-eslint/template-parser": "20.7.0",
"@angular/compiler-cli": "20.3.9",
"@chromatic-com/storybook": "4.1.3",
"@nx/angular": "22.6.3",
"@nx/eslint-plugin": "22.6.3",
"@nx/js": "22.6.3",
"@nx/node": "22.6.3",
"@nx/storybook": "^22.6.3",
"@nx/workspace": "22.4.5",
"@schematics/angular": "19.2.22",
"@storybook/addon-themes": "^10.2.0",
"@storybook/angular": "^10.2.0",
"@nx/workspace": "22.5.1",
"@schematics/angular": "20.3.16",
"@storybook/addon-themes": "10.2.8",
"@storybook/angular": "10.2.8",
"@types/ejs": "^3.1.5",
"@types/jasmine": "4.0.3",
"@types/jasminewd2": "~2.0.2",
@@ -105,8 +105,8 @@
"@types/superagent": "^4.1.22",
"@typescript-eslint/eslint-plugin": "8.57.2",
"@typescript-eslint/parser": "8.57.2",
"@typescript-eslint/typescript-estree": "8.41.0",
"@typescript-eslint/utils": "^8.51.0",
"@typescript-eslint/typescript-estree": "8.55.0",
"@typescript-eslint/utils": "8.55.0",
"ajv": "^8.18.0",
"dotenv": "16.4.7",
"ejs": "^3.1.10",
@@ -127,9 +127,9 @@
"jasmine-core": "5.13.0",
"jasmine-reporters": "^2.5.2",
"jasmine-spec-reporter": "7.0.0",
"jest": "^29.7.0",
"jest-environment-jsdom": "^29.7.0",
"jest-preset-angular": "14.4.2",
"jest": "^30.0.0",
"jest-environment-jsdom": "^30.0.0",
"jest-preset-angular": "16.1.1",
"jsdom": "^27.4.0",
"karma": "6.4.4",
"karma-chrome-launcher": "~3.2.0",
@@ -142,25 +142,27 @@
"lint-staged": "15.5.2",
"mocha": "11.7.5",
"moment": "^2.29.4",
"ng-packagr": "19.2.2",
"ng-packagr": "20.3.2",
"nock": "13.5.5",
"nx": "22.4.1",
"nx": "22.5.1",
"prettier": "3.6.2",
"react": "^19.2.4",
"react-dom": "^19.2.4",
"rimraf": "^6.1.2",
"sass-loader": "16.0.7",
"spdx-license-list": "^6.11.0",
"storybook": "^10.2.13",
"storybook": "10.2.8",
"stylelint": "16.20.0",
"stylelint-config-standard-scss": "^13.1.0",
"ts-node": "^10.9.2",
"typescript": "5.8.3",
"typescript": "5.9.3",
"webpack": "5.105.3"
},
"overrides": {
"@storybook/angular": {
"webpack": "5.105.3"
"apollo-angular": {
"@angular/core": "^20.0.0"
},
"jest-preset-angular": {
"@angular/core": "^20.0.0",
"@angular/compiler-cli": "^20.0.0"
}
},
"license": "Apache-2.0",

View File

@@ -9,7 +9,6 @@
"sourceMap": true,
"declaration": false,
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"skipLibCheck": true,
"noUnusedLocals": true,