From 40b15689d59e1ba0dc89bf15ce7d07356ac00c00 Mon Sep 17 00:00:00 2001 From: Denys Vuika Date: Thu, 12 Feb 2026 16:28:45 +0000 Subject: [PATCH] AAE-21047 Get rid of enums (#11643) * Refactor enums to const objects and update ESLint rules - Converted several TypeScript enums to const objects for better type inference and immutability. - Updated ESLint configuration to disable 'no-redeclare' rule and added new restrictions on schema usage. - Adjusted package-lock.json to mark several dependencies as peer dependencies. * Refactor enums to const objects in site-dropdown and new-version-uploader models - Converted TypeScript enums to const objects for improved type safety and immutability in `sites-dropdown.component.ts` and `new-version-uploader.model.ts`. - Updated related types to reflect the changes in both files. - Enhanced error handling in the `DropdownSitesComponent` by using the `subscribe` method with an object for better readability. * Refactor TypeScript types and improve error handling in component tests - Updated type annotations in `upload.service.ts` and `node-actions.service.ts` for better type safety. - Enhanced error handling in various component tests by using more descriptive error messages in `task-attachment-list.component.spec.ts`, `attach-file-widget-dialog.component.spec.ts`, and `task-form.component.spec.ts`. - Removed unnecessary schemas from test configurations in several component spec files to streamline the testing setup. * Refactor TypeScript enums to const objects for improved type safety - Converted multiple TypeScript enums to const objects across various models, including `AppConfigValues`, `Status`, `ShowHeaderMode`, `WidgetTypeEnum`, and others. - Updated related type definitions to enhance type inference and immutability. - Adjusted ESLint configurations by removing the 'no-redeclare' rule to streamline code quality checks. * Refactor TypeScript types for improved type safety and consistency - Updated type annotations in `document-list.component.ts`, `document-actions.service.ts`, and `node-actions.service.ts` to use `Observable` instead of `Subject` for better reactive programming practices. - Enhanced type definitions in `search-date-range.component.ts` and related spec files to allow `inLastValue` to be either a string or a number, improving flexibility in handling date range inputs. - Adjusted test cases to reflect these type changes, ensuring consistency across the application. * Enhance type safety in ViewerComponent by specifying type for closeButtonPosition - Updated the type annotation for `closeButtonPosition` in `viewer.component.ts` to explicitly define it as `CloseButtonPosition`, improving type safety and clarity. * Enhance type safety in DataTableComponent by specifying type for showHeader - Updated the type annotation for `showHeader` in `datatable.component.ts` to explicitly define it as `ShowHeaderMode`, improving type safety and clarity. * Update PDF viewer test to accommodate varying date formats - Modified the test for the annotation popup in `pdf-viewer.component.spec.ts` to check for the presence of date components instead of a specific date format, enhancing test robustness across different locales. --- .eslintrc.js | 18 +- lib/content-services/.eslintrc.json | 1 - .../categories-management-mode.ts | 10 +- .../src/lib/common/models/file.model.ts | 23 +-- .../src/lib/common/services/upload.service.ts | 2 +- .../content-metadata.component.ts | 12 +- .../site-dropdown/sites-dropdown.component.ts | 26 +-- .../components/document-list.component.ts | 2 +- .../models/content-action.model.ts | 12 +- .../document-list/models/node-action.enum.ts | 16 +- .../services/document-actions.service.ts | 2 +- .../services/node-actions.service.ts | 38 ++-- .../models/new-version-uploader.model.ts | 19 +- ...search-date-range-tabbed.component.spec.ts | 6 +- .../search-date-range-tabbed.component.ts | 7 +- .../search-date-range/date-range-type.ts | 12 +- .../search-date-range/in-last-date-type.ts | 12 +- .../search-date-range.component.spec.ts | 9 +- .../search-date-range/search-date-range.ts | 2 +- ...rch-filter-autocomplete-chips.component.ts | 2 +- .../search-logical-filter.component.ts | 14 +- .../file-size-operator.enum.ts | 12 +- .../models/autocomplete-option.interface.ts | 12 +- .../search/models/facet-field.interface.ts | 22 ++- .../lib/tag/tags-creator/tags-creator-mode.ts | 10 +- .../lib/tree/models/tree-node.interface.ts | 10 +- lib/core/.eslintrc.json | 1 - .../src/lib/app-config/app-config.service.ts | 63 +++--- .../services/user-preferences.service.ts | 15 +- .../datatable/datatable.component.ts | 15 +- .../form/models/widget-visibility.model.ts | 13 +- .../models/notification.model.ts | 15 +- .../models/search-text-input.model.ts | 10 +- .../pdf-viewer/pdf-viewer.component.spec.ts | 6 +- .../lib/viewer/components/viewer.component.ts | 2 +- .../viewer/models/download-prompt.actions.ts | 10 +- .../src/lib/viewer/models/viewer.model.ts | 10 +- lib/extensions/.eslintrc.json | 1 - .../src/lib/config/action.extensions.ts | 17 +- .../api/hxi-connector-api/model/prediction.ts | 12 +- lib/process-services-cloud/.eslintrc.json | 1 - .../app/models/application-instance.model.ts | 10 +- .../models/form-cloud-representation.model.ts | 23 ++- .../src/lib/models/date-cloud-filter.model.ts | 25 +-- .../models/process-cloud-preferences.ts | 13 +- .../lib/services/form-fields.interfaces.ts | 74 ++++---- .../task-filters/models/filter-cloud.model.ts | 34 ++-- .../base-task-list-cloud.component.ts | 13 +- .../task-attachment-list.component.spec.ts | 13 +- ...ttach-file-widget-dialog.component.spec.ts | 7 +- .../file-viewer/file-viewer.widget.spec.ts | 4 +- ...process-instance-details.component.spec.ts | 5 +- .../task-form/task-form.component.spec.ts | 16 +- package-lock.json | 179 ++++++++++-------- 54 files changed, 503 insertions(+), 415 deletions(-) diff --git a/.eslintrc.js b/.eslintrc.js index 5b04759d09..2c6fc30c73 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -141,7 +141,8 @@ module.exports = { ], 'no-duplicate-imports': 'error', 'no-multiple-empty-lines': 'error', - 'no-redeclare': 'error', + 'no-redeclare': 'off', + '@typescript-eslint/no-redeclare': ['off', { ignoreDeclarationMerge: true }], 'no-return-await': 'error', 'rxjs/no-create': 'error', 'rxjs/no-subject-unsubscribe': 'error', @@ -176,6 +177,21 @@ module.exports = { ' * limitations under the License.', ' */' ] + ], + 'no-restricted-syntax': [ + 'error', + { + selector: "Identifier[name='CUSTOM_ELEMENTS_SCHEMA']", + message: 'The use of CUSTOM_ELEMENTS_SCHEMA is not allowed. Consider alternatives for proper schema handling.' + }, + { + selector: "Identifier[name='NO_ERRORS_SCHEMA']", + message: 'The use of NO_ERRORS_SCHEMA is not allowed. Consider alternatives for proper schema handling.' + }, + { + selector: 'TSEnumDeclaration', + message: 'Enums are not allowed. Use string literal types (e.g., type Foo = "a" | "b") or const objects instead.' + } ] } }, diff --git a/lib/content-services/.eslintrc.json b/lib/content-services/.eslintrc.json index f9cf897315..dba4be2c29 100644 --- a/lib/content-services/.eslintrc.json +++ b/lib/content-services/.eslintrc.json @@ -78,7 +78,6 @@ "no-bitwise": "off", "no-duplicate-imports": "error", "no-multiple-empty-lines": "error", - "no-redeclare": "error", "no-return-await": "error", "rxjs/no-create": "error", "rxjs/no-subject-unsubscribe": "error", diff --git a/lib/content-services/src/lib/category/categories-management/categories-management-mode.ts b/lib/content-services/src/lib/category/categories-management/categories-management-mode.ts index 949ebf2261..972aa6aae8 100644 --- a/lib/content-services/src/lib/category/categories-management/categories-management-mode.ts +++ b/lib/content-services/src/lib/category/categories-management/categories-management-mode.ts @@ -15,7 +15,9 @@ * limitations under the License. */ -export enum CategoriesManagementMode { - CRUD, - ASSIGN -} +export const CategoriesManagementMode = { + CRUD: 'CRUD', + ASSIGN: 'ASSIGN' +} as const; + +export type CategoriesManagementMode = (typeof CategoriesManagementMode)[keyof typeof CategoriesManagementMode]; diff --git a/lib/content-services/src/lib/common/models/file.model.ts b/lib/content-services/src/lib/common/models/file.model.ts index c4f9ee9c39..1366d8f818 100644 --- a/lib/content-services/src/lib/common/models/file.model.ts +++ b/lib/content-services/src/lib/common/models/file.model.ts @@ -74,17 +74,18 @@ export class FileUploadOptions { versioningEnabled?: boolean; } -// eslint-disable-next-line no-shadow -export enum FileUploadStatus { - Pending = 0, - Complete = 1, - Starting = 2, - Progress = 3, - Cancelled = 4, - Aborted = 5, - Error = 6, - Deleted = 7 -} +export const FileUploadStatus = { + Pending: 0, + Complete: 1, + Starting: 2, + Progress: 3, + Cancelled: 4, + Aborted: 5, + Error: 6, + Deleted: 7 +} as const; + +export type FileUploadStatus = (typeof FileUploadStatus)[keyof typeof FileUploadStatus]; export class FileModel { readonly name: string; diff --git a/lib/content-services/src/lib/common/services/upload.service.ts b/lib/content-services/src/lib/common/services/upload.service.ts index 341be19a10..e3c7ab4caa 100644 --- a/lib/content-services/src/lib/common/services/upload.service.ts +++ b/lib/content-services/src/lib/common/services/upload.service.ts @@ -103,7 +103,7 @@ export class UploadService { * @returns True if files in the queue are still uploading, false otherwise */ isUploading(): boolean { - const finishedFileStates = [ + const finishedFileStates: FileUploadStatus[] = [ FileUploadStatus.Complete, FileUploadStatus.Cancelled, FileUploadStatus.Aborted, diff --git a/lib/content-services/src/lib/content-metadata/components/content-metadata/content-metadata.component.ts b/lib/content-services/src/lib/content-metadata/components/content-metadata/content-metadata.component.ts index 964da9c7cf..6c05ef3548 100644 --- a/lib/content-services/src/lib/content-metadata/components/content-metadata/content-metadata.component.ts +++ b/lib/content-services/src/lib/content-metadata/components/content-metadata/content-metadata.component.ts @@ -55,11 +55,13 @@ import { CategoriesManagementComponent } from '../../../category/categories-mana const DEFAULT_SEPARATOR = ', '; -enum DefaultPanels { - PROPERTIES = 'Properties', - TAGS = 'Tags', - CATEGORIES = 'Categories' -} +const DefaultPanels = { + PROPERTIES: 'Properties', + TAGS: 'Tags', + CATEGORIES: 'Categories' +} as const; + +export type DefaultPanels = (typeof DefaultPanels)[keyof typeof DefaultPanels]; @Component({ selector: 'adf-content-metadata', diff --git a/lib/content-services/src/lib/content-node-selector/site-dropdown/sites-dropdown.component.ts b/lib/content-services/src/lib/content-node-selector/site-dropdown/sites-dropdown.component.ts index 17fe4d0386..34672293ce 100644 --- a/lib/content-services/src/lib/content-node-selector/site-dropdown/sites-dropdown.component.ts +++ b/lib/content-services/src/lib/content-node-selector/site-dropdown/sites-dropdown.component.ts @@ -28,10 +28,12 @@ import { MatFormFieldModule } from '@angular/material/form-field'; /* eslint-disable no-shadow */ /* eslint-disable @typescript-eslint/naming-convention */ -export enum Relations { - Members = 'members', - Containers = 'containers' -} +export const Relations = { + Members: 'members', + Containers: 'containers' +} as const; + +export type Relations = (typeof Relations)[keyof typeof Relations]; @Component({ selector: 'adf-sites-dropdown', @@ -124,7 +126,7 @@ export class DropdownSitesComponent implements OnInit { } private loadSiteList() { - const extendedOptions: any = { + const extendedOptions: { skipCount: number; maxItems: number; relations?: string[] } = { skipCount: this.skipCount, maxItems: InfiniteSelectScrollDirective.MAX_ITEMS }; @@ -135,8 +137,8 @@ export class DropdownSitesComponent implements OnInit { extendedOptions.relations = [this.relations]; } - this.sitesService.getSites(extendedOptions).subscribe( - (sitePaging: SitePaging) => { + this.sitesService.getSites(extendedOptions).subscribe({ + next: (sitePaging: SitePaging) => { if (!this.siteList) { this.siteList = this.relations === Relations.Members ? this.filteredResultsByMember(sitePaging) : sitePaging; @@ -163,13 +165,15 @@ export class DropdownSitesComponent implements OnInit { if (this.value && !this.selected && this.siteListHasMoreItems()) { this.loadSiteList(); } - - this.loading = false; }, - (error) => { + error: (error) => { + this.loading = false; this.error.emit(error); + }, + complete: () => { + this.loading = false; } - ); + }); } showLoading(): boolean { diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.ts b/lib/content-services/src/lib/document-list/components/document-list.component.ts index ae83800fc8..735aefe250 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.ts @@ -171,7 +171,7 @@ export class DocumentListComponent extends DataTableSchema implements OnInit, On /** Toggles the header */ @Input() - showHeader = ShowHeaderMode.Data; + showHeader: ShowHeaderMode = ShowHeaderMode.Data; /** * User interaction for folder navigation or file preview. diff --git a/lib/content-services/src/lib/document-list/models/content-action.model.ts b/lib/content-services/src/lib/document-list/models/content-action.model.ts index 5e5320ba98..6518a34858 100644 --- a/lib/content-services/src/lib/document-list/models/content-action.model.ts +++ b/lib/content-services/src/lib/document-list/models/content-action.model.ts @@ -50,10 +50,12 @@ export class ContentActionModel { } } -export enum ContentActionTarget { - Document = 'document', - Folder = 'folder', - All = 'all' -} +export const ContentActionTarget = { + Document: 'document', + Folder: 'folder', + All: 'all' +} as const; + +export type ContentActionTarget = (typeof ContentActionTarget)[keyof typeof ContentActionTarget]; export type ContentActionHandler = (obj: any, target?: any, permission?: string) => any; diff --git a/lib/content-services/src/lib/document-list/models/node-action.enum.ts b/lib/content-services/src/lib/document-list/models/node-action.enum.ts index 3975564898..687ca80877 100644 --- a/lib/content-services/src/lib/document-list/models/node-action.enum.ts +++ b/lib/content-services/src/lib/document-list/models/node-action.enum.ts @@ -18,10 +18,12 @@ /* eslint-disable no-shadow */ /* eslint-disable @typescript-eslint/naming-convention */ -export enum NodeAction { - ATTACH = 'ATTACH', - CHOOSE = 'CHOOSE', - COPY = 'COPY', - MOVE = 'MOVE', - NEXT = 'NEXT' -} +export const NodeAction = { + ATTACH: 'ATTACH', + CHOOSE: 'CHOOSE', + COPY: 'COPY', + MOVE: 'MOVE', + NEXT: 'NEXT' +} as const; + +export type NodeAction = (typeof NodeAction)[keyof typeof NodeAction]; diff --git a/lib/content-services/src/lib/document-list/services/document-actions.service.ts b/lib/content-services/src/lib/document-list/services/document-actions.service.ts index bff73f0244..f8d7c94135 100644 --- a/lib/content-services/src/lib/document-list/services/document-actions.service.ts +++ b/lib/content-services/src/lib/document-list/services/document-actions.service.ts @@ -114,7 +114,7 @@ export class DocumentActionsService { return actionObservable; } - private prepareHandlers(actionObservable: Subject): void { + private prepareHandlers(actionObservable: Observable): void { actionObservable.subscribe((fileOperationMessage) => { this.success.next(fileOperationMessage); }, this.error.next.bind(this.error)); diff --git a/lib/content-services/src/lib/document-list/services/node-actions.service.ts b/lib/content-services/src/lib/document-list/services/node-actions.service.ts index 01a29e64ee..558e274198 100644 --- a/lib/content-services/src/lib/document-list/services/node-actions.service.ts +++ b/lib/content-services/src/lib/document-list/services/node-actions.service.ts @@ -17,7 +17,8 @@ import { Injectable, Output, EventEmitter } from '@angular/core'; import { Node, NodeEntry } from '@alfresco/js-api'; -import { Subject } from 'rxjs'; +import { Observable } from 'rxjs'; +import { switchMap, map } from 'rxjs/operators'; import { DownloadService } from '@alfresco/adf-core'; import { MatDialog } from '@angular/material/dialog'; import { ContentService } from '../../common/services/content.service'; @@ -57,7 +58,7 @@ export class NodeActionsService { * @param permission permission which is needed to apply the action * @returns operation result */ - copyContent(contentEntry: Node, permission?: string): Subject { + copyContent(contentEntry: Node, permission?: string): Observable { return this.doFileOperation(NodeAction.COPY, 'content', contentEntry, permission); } @@ -68,7 +69,7 @@ export class NodeActionsService { * @param permission permission which is needed to apply the action * @returns operation result */ - copyFolder(contentEntry: Node, permission?: string): Subject { + copyFolder(contentEntry: Node, permission?: string): Observable { return this.doFileOperation(NodeAction.COPY, 'folder', contentEntry, permission); } @@ -79,7 +80,7 @@ export class NodeActionsService { * @param permission permission which is needed to apply the action * @returns operation result */ - moveContent(contentEntry: Node, permission?: string): Subject { + moveContent(contentEntry: Node, permission?: string): Observable { return this.doFileOperation(NodeAction.MOVE, 'content', contentEntry, permission); } @@ -90,7 +91,7 @@ export class NodeActionsService { * @param permission permission which is needed to apply the action * @returns operation result */ - moveFolder(contentEntry: Node, permission?: string): Subject { + moveFolder(contentEntry: Node, permission?: string): Observable { return this.doFileOperation(NodeAction.MOVE, 'folder', contentEntry, permission); } @@ -103,29 +104,14 @@ export class NodeActionsService { * @param permission permission which is needed to apply the action * @returns operation result */ - private doFileOperation( - action: NodeAction.COPY | NodeAction.MOVE, - type: 'content' | 'folder', - contentEntry: Node, - permission?: string - ): Subject { - const observable = new Subject(); - - this.contentDialogService.openCopyMoveDialog(action, contentEntry, permission).subscribe( - (selections: Node[]) => { + private doFileOperation(action: 'COPY' | 'MOVE', type: 'content' | 'folder', contentEntry: Node, permission?: string): Observable { + return this.contentDialogService.openCopyMoveDialog(action, contentEntry, permission).pipe( + switchMap((selections) => { const selection = selections[0]; - this.documentListService[`${action.toLowerCase()}Node`] + return this.documentListService[`${action.toLowerCase()}Node`] .call(this.documentListService, contentEntry.id, selection.id) - .subscribe( - observable.next.bind(observable, `OPERATION.SUCCESS.${type.toUpperCase()}.${action}`), - observable.error.bind(observable) - ); - }, - (error) => { - observable.error(error); - return observable; - } + .pipe(map(() => `OPERATION.SUCCESS.${type.toUpperCase()}.${action}`)); + }) ); - return observable; } } diff --git a/lib/content-services/src/lib/new-version-uploader/models/new-version-uploader.model.ts b/lib/content-services/src/lib/new-version-uploader/models/new-version-uploader.model.ts index 7160fc13bf..64d967fe12 100644 --- a/lib/content-services/src/lib/new-version-uploader/models/new-version-uploader.model.ts +++ b/lib/content-services/src/lib/new-version-uploader/models/new-version-uploader.model.ts @@ -33,29 +33,30 @@ export interface NewVersionUploaderDialogData { export type NewVersionUploaderData = VersionManagerUploadData | ViewVersion | RefreshData; -// eslint-disable-next-line no-shadow -export enum NewVersionUploaderDataAction { - refresh = 'refresh', - upload = 'upload', - view = 'view' -} +export const NewVersionUploaderDataAction = { + refresh: 'refresh', + upload: 'upload', + view: 'view' +} as const; + +export type NewVersionUploaderDataAction = (typeof NewVersionUploaderDataAction)[keyof typeof NewVersionUploaderDataAction]; interface BaseData { action: NewVersionUploaderDataAction; } export interface VersionManagerUploadData extends BaseData { - action: NewVersionUploaderDataAction.upload; + action: 'upload'; newVersion: NodeEntityEvent; currentVersion: NodeChildAssociation; } export interface ViewVersion extends BaseData { - action: NewVersionUploaderDataAction.view; + action: 'view'; versionId: string; } export interface RefreshData extends BaseData { - action: NewVersionUploaderDataAction.refresh; + action: 'refresh'; node: Node; } diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.spec.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.spec.ts index 2b225a4a33..4110fbf818 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.spec.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.spec.ts @@ -106,7 +106,7 @@ describe('SearchDateRangeTabbedComponent', () => { inLastMockData = { dateRangeType: DateRangeType.IN_LAST, inLastValueType: InLastDateType.WEEKS, - inLastValue: '5', + inLastValue: 5, betweenStartDate: undefined, betweenEndDate: undefined }; @@ -173,7 +173,7 @@ describe('SearchDateRangeTabbedComponent', () => { inLastMockData = { dateRangeType: DateRangeType.IN_LAST, inLastValueType: InLastDateType.DAYS, - inLastValue: '9', + inLastValue: 9, betweenStartDate: null, betweenEndDate: null }; @@ -189,7 +189,7 @@ describe('SearchDateRangeTabbedComponent', () => { inLastMockData = { dateRangeType: DateRangeType.IN_LAST, inLastValueType: InLastDateType.MONTHS, - inLastValue: '7', + inLastValue: 7, betweenStartDate: null, betweenEndDate: null }; diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.ts index e3f1e93794..ee2cc79028 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range-tabbed.component.ts @@ -155,15 +155,16 @@ export class SearchDateRangeTabbedComponent implements SearchWidget, OnInit { let endDate: Date; if (value.dateRangeType === DateRangeType.IN_LAST) { if (value.inLastValue) { + const numValue = typeof value.inLastValue === 'number' ? value.inLastValue : parseInt(value.inLastValue, 10); switch (value.inLastValueType) { case InLastDateType.DAYS: - startDate = startOfDay(subDays(new Date(), parseInt(value.inLastValue, 10))); + startDate = startOfDay(subDays(new Date(), numValue)); break; case InLastDateType.WEEKS: - startDate = startOfWeek(subWeeks(new Date(), parseInt(value.inLastValue, 10))); + startDate = startOfWeek(subWeeks(new Date(), numValue)); break; case InLastDateType.MONTHS: - startDate = startOfMonth(subMonths(new Date(), parseInt(value.inLastValue, 10))); + startDate = startOfMonth(subMonths(new Date(), numValue)); break; default: break; diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.ts index 510e8489a2..77f1502156 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/date-range-type.ts @@ -15,8 +15,10 @@ * limitations under the License. */ -export enum DateRangeType { - ANY = 'ANY', - IN_LAST = 'IN_LAST', - BETWEEN = 'BETWEEN', -} +export const DateRangeType = { + ANY: 'ANY', + IN_LAST: 'IN_LAST', + BETWEEN: 'BETWEEN' +} as const; + +export type DateRangeType = (typeof DateRangeType)[keyof typeof DateRangeType]; diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.ts index 1b3f4b8169..bdf4db7694 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/in-last-date-type.ts @@ -15,8 +15,10 @@ * limitations under the License. */ -export enum InLastDateType { - DAYS = 'DAYS', - WEEKS = 'WEEKS', - MONTHS = 'MONTHS' -} +export const InLastDateType = { + DAYS: 'DAYS', + WEEKS: 'WEEKS', + MONTHS: 'MONTHS' +} as const; + +export type InLastDateType = (typeof InLastDateType)[keyof typeof InLastDateType]; diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.spec.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.spec.ts index 1b0b9a0dc3..4ae1b71340 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.spec.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.component.spec.ts @@ -18,6 +18,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { SearchDateRangeComponent } from './search-date-range.component'; +import { SearchDateRange } from './search-date-range'; import { addDays, endOfToday, format, parse, startOfYesterday, subDays } from 'date-fns'; import { Validators } from '@angular/forms'; import { HarnessLoader } from '@angular/cdk/testing'; @@ -226,7 +227,7 @@ describe('SearchDateRangeComponent', () => { it('should not emit values when form is invalid', async () => { spyOn(component.changed, 'emit'); - let value = { + let value: Partial = { dateRangeType: component.DateRangeType.IN_LAST, inLastValueType: component.InLastDateType.WEEKS, inLastValue: '', @@ -251,8 +252,8 @@ describe('SearchDateRangeComponent', () => { dateRangeType: component.DateRangeType.BETWEEN, inLastValueType: component.InLastDateType.DAYS, inLastValue: undefined, - betweenStartDate: '', - betweenEndDate: '' + betweenStartDate: undefined, + betweenEndDate: undefined }; dateRangeTypeRadioButton = await loader.getHarness(MatRadioButtonHarness.with({ selector: '[data-automation-id="date-range-between"]' })); await dateRangeTypeRadioButton.check(); @@ -262,7 +263,7 @@ describe('SearchDateRangeComponent', () => { it('should emit values when form is valid', async () => { spyOn(component.changed, 'emit'); - let value = { + let value: Partial = { dateRangeType: component.DateRangeType.IN_LAST, inLastValueType: component.InLastDateType.WEEKS, inLastValue: 5, diff --git a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.ts b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.ts index 158f643bb0..c9c4fbf6c7 100644 --- a/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.ts +++ b/lib/content-services/src/lib/search/components/search-date-range-tabbed/search-date-range/search-date-range.ts @@ -21,7 +21,7 @@ import { InLastDateType } from './in-last-date-type'; export interface SearchDateRange { dateRangeType: DateRangeType; inLastValueType?: InLastDateType; - inLastValue?: string; + inLastValue?: string | number; betweenStartDate?: Date; betweenEndDate?: Date; } diff --git a/lib/content-services/src/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.ts b/lib/content-services/src/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.ts index 12d7ad0da2..a114f9c8e3 100644 --- a/lib/content-services/src/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.ts +++ b/lib/content-services/src/lib/search/components/search-filter-autocomplete-chips/search-filter-autocomplete-chips.component.ts @@ -136,7 +136,7 @@ export class SearchFilterAutocompleteChipsComponent implements SearchWidget, OnI private updateQuery(updateContext = true) { this.context.filterRawParams[this.id] = this.selectedOptions.length > 0 ? this.selectedOptions : undefined; this.displayValue$.next(this.selectedOptions.map((option) => option.value).join(', ')); - if (this.context && this.settings && this.settings.field) { + if (this.context && this.settings?.field) { let queryFragments; switch (this.settings.field) { case AutocompleteField.CATEGORIES: diff --git a/lib/content-services/src/lib/search/components/search-logical-filter/search-logical-filter.component.ts b/lib/content-services/src/lib/search/components/search-logical-filter/search-logical-filter.component.ts index 35a0b21135..c15916ad89 100644 --- a/lib/content-services/src/lib/search/components/search-logical-filter/search-logical-filter.component.ts +++ b/lib/content-services/src/lib/search/components/search-logical-filter/search-logical-filter.component.ts @@ -28,12 +28,14 @@ import { TranslatePipe } from '@ngx-translate/core'; import { FormsModule } from '@angular/forms'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -export enum LogicalSearchFields { - MATCH_ALL = 'matchAll', - MATCH_ANY = 'matchAny', - EXCLUDE = 'exclude', - MATCH_EXACT = 'matchExact' -} +export const LogicalSearchFields = { + MATCH_ALL: 'matchAll', + MATCH_ANY: 'matchAny', + EXCLUDE: 'exclude', + MATCH_EXACT: 'matchExact' +} as const; + +export type LogicalSearchFields = (typeof LogicalSearchFields)[keyof typeof LogicalSearchFields]; export type LogicalSearchConditionEnumValuedKeys = { [T in LogicalSearchFields]: string }; // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/lib/content-services/src/lib/search/components/search-properties/file-size-operator.enum.ts b/lib/content-services/src/lib/search/components/search-properties/file-size-operator.enum.ts index 587c2e416c..615ae91d77 100644 --- a/lib/content-services/src/lib/search/components/search-properties/file-size-operator.enum.ts +++ b/lib/content-services/src/lib/search/components/search-properties/file-size-operator.enum.ts @@ -15,8 +15,10 @@ * limitations under the License. */ -export enum FileSizeOperator { - AT_LEAST = 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.AT_LEAST', - AT_MOST = 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.AT_MOST', - EXACTLY = 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.EXACTLY' -} +export const FileSizeOperator = { + AT_LEAST: 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.AT_LEAST', + AT_MOST: 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.AT_MOST', + EXACTLY: 'SEARCH.SEARCH_PROPERTIES.FILE_SIZE_OPERATOR.EXACTLY' +} as const; + +export type FileSizeOperator = (typeof FileSizeOperator)[keyof typeof FileSizeOperator]; diff --git a/lib/content-services/src/lib/search/models/autocomplete-option.interface.ts b/lib/content-services/src/lib/search/models/autocomplete-option.interface.ts index 7918b47c3b..c99fb2afd4 100644 --- a/lib/content-services/src/lib/search/models/autocomplete-option.interface.ts +++ b/lib/content-services/src/lib/search/models/autocomplete-option.interface.ts @@ -22,8 +22,10 @@ export interface AutocompleteOption { query?: string; } -export enum AutocompleteField { - TAG = 'TAG', - CATEGORIES = 'cm:categories', - LOCATION = 'SITE' -} +export const AutocompleteField = { + TAG: 'TAG', + CATEGORIES: 'cm:categories', + LOCATION: 'SITE' +} as const; + +export type AutocompleteField = (typeof AutocompleteField)[keyof typeof AutocompleteField]; diff --git a/lib/content-services/src/lib/search/models/facet-field.interface.ts b/lib/content-services/src/lib/search/models/facet-field.interface.ts index b92ed09f69..d1d6036022 100644 --- a/lib/content-services/src/lib/search/models/facet-field.interface.ts +++ b/lib/content-services/src/lib/search/models/facet-field.interface.ts @@ -48,14 +48,16 @@ export interface FacetFieldSettings { bucketSortDirection?: FacetBucketSortDirection; } -// eslint-disable-next-line no-shadow -export enum FacetBucketSortBy { - LABEL = 'LABEL', - COUNT = 'COUNT' -} +export const FacetBucketSortBy = { + LABEL: 'LABEL', + COUNT: 'COUNT' +} as const; -// eslint-disable-next-line no-shadow -export enum FacetBucketSortDirection { - ASCENDING = 'ASCENDING', - DESCENDING = 'DESCENDING' -} +export type FacetBucketSortBy = (typeof FacetBucketSortBy)[keyof typeof FacetBucketSortBy]; + +export const FacetBucketSortDirection = { + ASCENDING: 'ASCENDING', + DESCENDING: 'DESCENDING' +} as const; + +export type FacetBucketSortDirection = (typeof FacetBucketSortDirection)[keyof typeof FacetBucketSortDirection]; diff --git a/lib/content-services/src/lib/tag/tags-creator/tags-creator-mode.ts b/lib/content-services/src/lib/tag/tags-creator/tags-creator-mode.ts index 023dc182df..2d100f6983 100644 --- a/lib/content-services/src/lib/tag/tags-creator/tags-creator-mode.ts +++ b/lib/content-services/src/lib/tag/tags-creator/tags-creator-mode.ts @@ -20,7 +20,9 @@ * Create mode allows only for creating completely new tags. * Create and Assign mode allows for both - creation of new tags and selection of existing tags. */ -export enum TagsCreatorMode { - CREATE, - CREATE_AND_ASSIGN -} +export const TagsCreatorMode = { + CREATE: 'CREATE', + CREATE_AND_ASSIGN: 'CREATE_AND_ASSIGN' +} as const; + +export type TagsCreatorMode = (typeof TagsCreatorMode)[keyof typeof TagsCreatorMode]; diff --git a/lib/content-services/src/lib/tree/models/tree-node.interface.ts b/lib/content-services/src/lib/tree/models/tree-node.interface.ts index bf4c4ae508..000f22b57e 100644 --- a/lib/content-services/src/lib/tree/models/tree-node.interface.ts +++ b/lib/content-services/src/lib/tree/models/tree-node.interface.ts @@ -15,10 +15,12 @@ * limitations under the License. */ -export enum TreeNodeType { - RegularNode, - LoadMoreNode -} +export const TreeNodeType = { + RegularNode: 'RegularNode', + LoadMoreNode: 'LoadMoreNode' +} as const; + +export type TreeNodeType = (typeof TreeNodeType)[keyof typeof TreeNodeType]; export interface TreeNode { id: string; diff --git a/lib/core/.eslintrc.json b/lib/core/.eslintrc.json index c0244ac613..a7f4f87c34 100644 --- a/lib/core/.eslintrc.json +++ b/lib/core/.eslintrc.json @@ -75,7 +75,6 @@ "no-bitwise": "off", "no-duplicate-imports": "error", "no-multiple-empty-lines": "error", - "no-redeclare": "error", "no-return-await": "error", "rxjs/no-create": "error", "rxjs/no-subject-unsubscribe": "error", diff --git a/lib/core/src/lib/app-config/app-config.service.ts b/lib/core/src/lib/app-config/app-config.service.ts index d899016fa5..56dd77fe64 100644 --- a/lib/core/src/lib/app-config/app-config.service.ts +++ b/lib/core/src/lib/app-config/app-config.service.ts @@ -27,37 +27,40 @@ import { OauthConfigModel } from '../auth/models/oauth-config.model'; /* spellchecker: disable */ // eslint-disable-next-line no-shadow -export enum AppConfigValues { - APP_CONFIG_LANGUAGES_KEY = 'languages', - PROVIDERS = 'providers', - OAUTHCONFIG = 'oauth2', - ECMHOST = 'ecmHost', - BASESHAREURL = 'baseShareUrl', - OOI_CONNECTOR_URL = 'ooiServiceUrl', - BPMHOST = 'bpmHost', - IDENTITY_HOST = 'identityHost', - AUTHTYPE = 'authType', - CONTEXTROOTECM = 'contextRootEcm', - CONTEXTROOTBPM = 'contextRootBpm', - ALFRESCO_REPOSITORY_NAME = 'alfrescoRepositoryName', - LOG_LEVEL = 'logLevel', - LOGIN_ROUTE = 'loginRoute', - DISABLECSRF = 'disableCSRF', - AUTH_WITH_CREDENTIALS = 'auth.withCredentials', - APPLICATION = 'application', - STORAGE_PREFIX = 'application.storagePrefix', - NOTIFY_DURATION = 'notificationDefaultDuration', - CONTENT_TICKET_STORAGE_LABEL = 'ticket-ECM', - PROCESS_TICKET_STORAGE_LABEL = 'ticket-BPM', - UNSAVED_CHANGES_MODAL_HIDDEN = 'unsaved_changes__modal_hidden' -} +export const AppConfigValues = { + APP_CONFIG_LANGUAGES_KEY: 'languages', + PROVIDERS: 'providers', + OAUTHCONFIG: 'oauth2', + ECMHOST: 'ecmHost', + BASESHAREURL: 'baseShareUrl', + OOI_CONNECTOR_URL: 'ooiServiceUrl', + BPMHOST: 'bpmHost', + IDENTITY_HOST: 'identityHost', + AUTHTYPE: 'authType', + CONTEXTROOTECM: 'contextRootEcm', + CONTEXTROOTBPM: 'contextRootBpm', + ALFRESCO_REPOSITORY_NAME: 'alfrescoRepositoryName', + LOG_LEVEL: 'logLevel', + LOGIN_ROUTE: 'loginRoute', + DISABLECSRF: 'disableCSRF', + AUTH_WITH_CREDENTIALS: 'auth.withCredentials', + APPLICATION: 'application', + STORAGE_PREFIX: 'application.storagePrefix', + NOTIFY_DURATION: 'notificationDefaultDuration', + CONTENT_TICKET_STORAGE_LABEL: 'ticket-ECM', + PROCESS_TICKET_STORAGE_LABEL: 'ticket-BPM', + UNSAVED_CHANGES_MODAL_HIDDEN: 'unsaved_changes__modal_hidden' +} as const; -// eslint-disable-next-line no-shadow -export enum Status { - INIT = 'init', - LOADING = 'loading', - LOADED = 'loaded' -} +export type AppConfigValues = (typeof AppConfigValues)[keyof typeof AppConfigValues]; + +export const Status = { + INIT: 'init', + LOADING: 'loading', + LOADED: 'loaded' +} as const; + +export type Status = (typeof Status)[keyof typeof Status]; /* spellchecker: enable */ diff --git a/lib/core/src/lib/common/services/user-preferences.service.ts b/lib/core/src/lib/common/services/user-preferences.service.ts index b8327ee6d4..2c5043941d 100644 --- a/lib/core/src/lib/common/services/user-preferences.service.ts +++ b/lib/core/src/lib/common/services/user-preferences.service.ts @@ -27,13 +27,14 @@ import { Directionality, Direction } from '@angular/cdk/bidi'; import { DEFAULT_LANGUAGE_LIST } from '../models/default-languages.model'; import { toSignal } from '@angular/core/rxjs-interop'; -// eslint-disable-next-line no-shadow -export enum UserPreferenceValues { - PaginationSize = 'paginationSize', - Locale = 'locale', - SupportedPageSizes = 'supportedPageSizes', - ExpandedSideNavStatus = 'expandedSidenav' -} +export const UserPreferenceValues = { + PaginationSize: 'paginationSize', + Locale: 'locale', + SupportedPageSizes: 'supportedPageSizes', + ExpandedSideNavStatus: 'expandedSidenav' +} as const; + +export type UserPreferenceValues = (typeof UserPreferenceValues)[keyof typeof UserPreferenceValues]; @Injectable({ providedIn: 'root' diff --git a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts index 5fd603d5a3..72134c7165 100644 --- a/lib/core/src/lib/datatable/components/datatable/datatable.component.ts +++ b/lib/core/src/lib/datatable/components/datatable/datatable.component.ts @@ -85,12 +85,13 @@ import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; import { IconModule } from '../../../icon/icon.module'; import { MatTooltipModule } from '@angular/material/tooltip'; -// eslint-disable-next-line no-shadow -export enum ShowHeaderMode { - Never = 'never', - Always = 'always', - Data = 'data' -} +export const ShowHeaderMode = { + Never: 'never', + Always: 'always', + Data: 'data' +} as const; + +export type ShowHeaderMode = (typeof ShowHeaderMode)[keyof typeof ShowHeaderMode]; @Component({ selector: 'adf-datatable', @@ -216,7 +217,7 @@ export class DataTableComponent implements OnInit, AfterContentInit, OnChanges, /** Toggles the header. */ @Input() - showHeader = ShowHeaderMode.Data; + showHeader: ShowHeaderMode = ShowHeaderMode.Data; /** Toggles the sticky header mode. */ @Input() diff --git a/lib/core/src/lib/form/models/widget-visibility.model.ts b/lib/core/src/lib/form/models/widget-visibility.model.ts index 2fac89e910..e8ccc1b0af 100644 --- a/lib/core/src/lib/form/models/widget-visibility.model.ts +++ b/lib/core/src/lib/form/models/widget-visibility.model.ts @@ -102,9 +102,10 @@ export class WidgetVisibilityModel { } } -// eslint-disable-next-line no-shadow -export enum WidgetTypeEnum { - field = 'field', - variable = 'variable', - value = 'value' -} +export const WidgetTypeEnum = { + field: 'field', + variable: 'variable', + value: 'value' +} as const; + +export type WidgetTypeEnum = (typeof WidgetTypeEnum)[keyof typeof WidgetTypeEnum]; diff --git a/lib/core/src/lib/notifications/models/notification.model.ts b/lib/core/src/lib/notifications/models/notification.model.ts index 174e7e1e55..34201d560d 100644 --- a/lib/core/src/lib/notifications/models/notification.model.ts +++ b/lib/core/src/lib/notifications/models/notification.model.ts @@ -15,13 +15,14 @@ * limitations under the License. */ -// eslint-disable-next-line no-shadow -export enum NOTIFICATION_TYPE { - INFO = 'info', - WARN = 'warning', - ERROR = 'error', - RECURSIVE = 'recursive' -} +export const NOTIFICATION_TYPE = { + INFO: 'info', + WARN: 'warning', + ERROR: 'error', + RECURSIVE: 'recursive' +} as const; + +export type NOTIFICATION_TYPE = (typeof NOTIFICATION_TYPE)[keyof typeof NOTIFICATION_TYPE]; export interface NotificationInitiator { key: string | symbol; diff --git a/lib/core/src/lib/search-text/models/search-text-input.model.ts b/lib/core/src/lib/search-text/models/search-text-input.model.ts index 4924c939f6..bd33aa0a95 100644 --- a/lib/core/src/lib/search-text/models/search-text-input.model.ts +++ b/lib/core/src/lib/search-text/models/search-text-input.model.ts @@ -15,11 +15,11 @@ * limitations under the License. */ -// eslint-disable-next-line no-shadow -export enum SearchTextStateEnum { - expanded = 'expanded', - collapsed = 'collapsed' -} +export const SearchTextStateEnum = { + expanded: 'expanded', + collapsed: 'collapsed' +} as const; +export type SearchTextStateEnum = (typeof SearchTextStateEnum)[keyof typeof SearchTextStateEnum]; export interface SearchAnimationState { value: string; diff --git a/lib/core/src/lib/viewer/components/pdf-viewer/pdf-viewer.component.spec.ts b/lib/core/src/lib/viewer/components/pdf-viewer/pdf-viewer.component.spec.ts index 0586ee56c5..4280919d2a 100644 --- a/lib/core/src/lib/viewer/components/pdf-viewer/pdf-viewer.component.spec.ts +++ b/lib/core/src/lib/viewer/components/pdf-viewer/pdf-viewer.component.spec.ts @@ -660,7 +660,11 @@ describe('Test PdfViewer - User interaction', () => { it('should have corrected content in annotation popup', fakeAsync(() => { dispatchAnnotationLayerRenderedEvent(); expect(annotationElement.querySelector('.title').textContent).toBe('Annotation title'); - expect(annotationElement.querySelector('.popupDate').textContent).toBe('2/2/2026, 10:41:06 AM'); + // Date format can vary by locale, so we just check it contains the expected date components + const dateText = annotationElement.querySelector('.popupDate').textContent; + expect(dateText).toContain('2026'); + expect(dateText).toContain('02'); + expect(dateText).toContain('10:41:06'); expect(annotationElement.querySelector('.popupContent').textContent).toBe('Annotation contents'); expect(getAnnotationPopupElement()).toBeDefined(); })); diff --git a/lib/core/src/lib/viewer/components/viewer.component.ts b/lib/core/src/lib/viewer/components/viewer.component.ts index f500e39415..950f37de60 100644 --- a/lib/core/src/lib/viewer/components/viewer.component.ts +++ b/lib/core/src/lib/viewer/components/viewer.component.ts @@ -230,7 +230,7 @@ export class ViewerComponent implements OnDestroy, OnInit, OnChanges { * Change the close button position Right/Left. */ @Input() - closeButtonPosition = CloseButtonPosition.Left; + closeButtonPosition: CloseButtonPosition = CloseButtonPosition.Left; /** Toggles the 'Info Button' */ @Input() diff --git a/lib/core/src/lib/viewer/models/download-prompt.actions.ts b/lib/core/src/lib/viewer/models/download-prompt.actions.ts index 375727cc8d..4cd1f8d060 100644 --- a/lib/core/src/lib/viewer/models/download-prompt.actions.ts +++ b/lib/core/src/lib/viewer/models/download-prompt.actions.ts @@ -16,7 +16,9 @@ */ /* Enum listing the allowed actions that can be emitted from the NonResponsivePreview dialog component */ -export enum DownloadPromptActions { - 'WAIT', - 'DOWNLOAD' -} +export const DownloadPromptActions = { + WAIT: 'WAIT', + DOWNLOAD: 'DOWNLOAD' +} as const; + +export type DownloadPromptActions = (typeof DownloadPromptActions)[keyof typeof DownloadPromptActions]; diff --git a/lib/core/src/lib/viewer/models/viewer.model.ts b/lib/core/src/lib/viewer/models/viewer.model.ts index ed2b217ece..5d76e8bca8 100644 --- a/lib/core/src/lib/viewer/models/viewer.model.ts +++ b/lib/core/src/lib/viewer/models/viewer.model.ts @@ -15,10 +15,12 @@ * limitations under the License. */ -export enum CloseButtonPosition { - Right = 'right', - Left = 'left' -} +export const CloseButtonPosition = { + Right: 'right', + Left: 'left' +} as const; + +export type CloseButtonPosition = (typeof CloseButtonPosition)[keyof typeof CloseButtonPosition]; export interface Track { src: string; diff --git a/lib/extensions/.eslintrc.json b/lib/extensions/.eslintrc.json index fda8ffc448..5bbf5a27a3 100644 --- a/lib/extensions/.eslintrc.json +++ b/lib/extensions/.eslintrc.json @@ -56,7 +56,6 @@ "no-bitwise": "off", "no-duplicate-imports": "error", "no-multiple-empty-lines": "error", - "no-redeclare": "error", "no-return-await": "error", "rxjs/no-create": "error", "rxjs/no-subject-unsubscribe": "error", diff --git a/lib/extensions/src/lib/config/action.extensions.ts b/lib/extensions/src/lib/config/action.extensions.ts index a1b697b63b..832efd0f2e 100644 --- a/lib/extensions/src/lib/config/action.extensions.ts +++ b/lib/extensions/src/lib/config/action.extensions.ts @@ -17,14 +17,15 @@ import { ExtensionElement } from './extension-element'; -// eslint-disable-next-line no-shadow -export enum ContentActionType { - default = 'default', - button = 'button', - separator = 'separator', - menu = 'menu', - custom = 'custom' -} +export const ContentActionType = { + default: 'default', + button: 'button', + separator: 'separator', + menu: 'menu', + custom: 'custom' +} as const; + +export type ContentActionType = (typeof ContentActionType)[keyof typeof ContentActionType]; export interface ContentActionRef extends ExtensionElement { type: ContentActionType; diff --git a/lib/js-api/src/api/hxi-connector-api/model/prediction.ts b/lib/js-api/src/api/hxi-connector-api/model/prediction.ts index c968acfe49..a49993c511 100644 --- a/lib/js-api/src/api/hxi-connector-api/model/prediction.ts +++ b/lib/js-api/src/api/hxi-connector-api/model/prediction.ts @@ -38,8 +38,10 @@ export class Prediction { export type UpdateType = 'AUTOFILL' | 'AUTOCORRECT'; -export enum ReviewStatus { - UNREVIEWED = 'UNREVIEWED', - CONFIRMED = 'CONFIRMED', - REJECTED = 'REJECTED' -} +export const ReviewStatus = { + UNREVIEWED: 'UNREVIEWED', + CONFIRMED: 'CONFIRMED', + REJECTED: 'REJECTED' +} as const; + +export type ReviewStatus = (typeof ReviewStatus)[keyof typeof ReviewStatus]; diff --git a/lib/process-services-cloud/.eslintrc.json b/lib/process-services-cloud/.eslintrc.json index 8959afd373..22948638f4 100644 --- a/lib/process-services-cloud/.eslintrc.json +++ b/lib/process-services-cloud/.eslintrc.json @@ -74,7 +74,6 @@ "no-bitwise": "off", "no-duplicate-imports": "error", "no-multiple-empty-lines": "error", - "no-redeclare": "error", "no-return-await": "error", "rxjs/no-create": "error", "rxjs/no-subject-unsubscribe": "error", diff --git a/lib/process-services-cloud/src/lib/app/models/application-instance.model.ts b/lib/process-services-cloud/src/lib/app/models/application-instance.model.ts index db6f4cf34a..df79122ad8 100644 --- a/lib/process-services-cloud/src/lib/app/models/application-instance.model.ts +++ b/lib/process-services-cloud/src/lib/app/models/application-instance.model.ts @@ -48,10 +48,12 @@ export interface Descriptor { customUIAuthFlowType?: DescriptorCustomUIAuthFlowType; } -export enum DescriptorCustomUIAuthFlowType { - CODE = 'CODE', - IMPLICIT = 'IMPLICIT' -} +export const DescriptorCustomUIAuthFlowType = { + CODE: 'CODE', + IMPLICIT: 'IMPLICIT' +} as const; + +export type DescriptorCustomUIAuthFlowType = (typeof DescriptorCustomUIAuthFlowType)[keyof typeof DescriptorCustomUIAuthFlowType]; export interface DescriptorSecurity { role: string; diff --git a/lib/process-services-cloud/src/lib/form/models/form-cloud-representation.model.ts b/lib/process-services-cloud/src/lib/form/models/form-cloud-representation.model.ts index e20f512457..32a03f4431 100644 --- a/lib/process-services-cloud/src/lib/form/models/form-cloud-representation.model.ts +++ b/lib/process-services-cloud/src/lib/form/models/form-cloud-representation.model.ts @@ -18,7 +18,6 @@ /* eslint-disable no-shadow */ /* eslint-disable @typescript-eslint/naming-convention */ export class FormCloudRepresentation { - id?: string; name?: string; description?: string; @@ -57,13 +56,17 @@ export interface DestinationFolderPathModel { path: string; } -export enum FileSourceTypes { - ALL_FILE_SOURCES_SERVICE_ID = 'all-file-sources', - ALFRESCO_CONTENT_SOURCES_SERVICE_ID = 'alfresco-content' -} +export const FileSourceTypes = { + ALL_FILE_SOURCES_SERVICE_ID: 'all-file-sources', + ALFRESCO_CONTENT_SOURCES_SERVICE_ID: 'alfresco-content' +} as const; -export enum DestinationFolderPathType { - STATIC_TYPE = 'value', - STRING_TYPE = 'string', - FOLDER_TYPE = 'folder' -} +export type FileSourceTypes = (typeof FileSourceTypes)[keyof typeof FileSourceTypes]; + +export const DestinationFolderPathType = { + STATIC_TYPE: 'value', + STRING_TYPE: 'string', + FOLDER_TYPE: 'folder' +} as const; + +export type DestinationFolderPathType = (typeof DestinationFolderPathType)[keyof typeof DestinationFolderPathType]; diff --git a/lib/process-services-cloud/src/lib/models/date-cloud-filter.model.ts b/lib/process-services-cloud/src/lib/models/date-cloud-filter.model.ts index d50e205040..882cd0ea68 100644 --- a/lib/process-services-cloud/src/lib/models/date-cloud-filter.model.ts +++ b/lib/process-services-cloud/src/lib/models/date-cloud-filter.model.ts @@ -17,18 +17,19 @@ /* eslint-disable @typescript-eslint/naming-convention */ -// eslint-disable-next-line no-shadow -export enum DateCloudFilterType { - NO_DATE = 'NO_DATE', - TODAY = 'TODAY', - TOMORROW = 'TOMORROW', - NEXT_7_DAYS = 'NEXT_7_DAYS', - WEEK = 'WEEK', - MONTH = 'MONTH', - QUARTER = 'QUARTER', - YEAR = 'YEAR', - RANGE = 'RANGE' -} +export const DateCloudFilterType = { + NO_DATE: 'NO_DATE', + TODAY: 'TODAY', + TOMORROW: 'TOMORROW', + NEXT_7_DAYS: 'NEXT_7_DAYS', + WEEK: 'WEEK', + MONTH: 'MONTH', + QUARTER: 'QUARTER', + YEAR: 'YEAR', + RANGE: 'RANGE' +} as const; + +export type DateCloudFilterType = (typeof DateCloudFilterType)[keyof typeof DateCloudFilterType]; export interface DateRangeFilter { startDate: string; diff --git a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts index 471b69a407..c4d5266c20 100644 --- a/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts +++ b/lib/process-services-cloud/src/lib/process/process-list/models/process-cloud-preferences.ts @@ -15,9 +15,10 @@ * limitations under the License. */ -// eslint-disable-next-line no-shadow -export enum ProcessListCloudPreferences { - columnOrder = 'processes-cloud-list-columns-order', - columnsVisibility = 'processes-cloud-columns-visibility', - columnsWidths = 'processes-cloud-columns-widths' -} +export const ProcessListCloudPreferences = { + columnOrder: 'processes-cloud-list-columns-order', + columnsVisibility: 'processes-cloud-columns-visibility', + columnsWidths: 'processes-cloud-columns-widths' +} as const; + +export type ProcessListCloudPreferences = (typeof ProcessListCloudPreferences)[keyof typeof ProcessListCloudPreferences]; diff --git a/lib/process-services-cloud/src/lib/services/form-fields.interfaces.ts b/lib/process-services-cloud/src/lib/services/form-fields.interfaces.ts index b37d09c3a0..1134492584 100644 --- a/lib/process-services-cloud/src/lib/services/form-fields.interfaces.ts +++ b/lib/process-services-cloud/src/lib/services/form-fields.interfaces.ts @@ -225,42 +225,43 @@ export interface TextField extends FormField { placeholder: string | null; } -// eslint-disable-next-line no-shadow -export enum PeopleModeOptions { - single = 'single', - multiple = 'multiple' -} +export const PeopleModeOptions = { + single: 'single', + multiple: 'multiple' +} as const; + +export type PeopleModeOptions = (typeof PeopleModeOptions)[keyof typeof PeopleModeOptions]; export interface PeopleField extends FormField { required: boolean; optionType: PeopleModeOptions; } -// eslint-disable-next-line no-shadow -export enum FormFieldType { - text = 'text', - multiline = 'multi-line-text', - // eslint-disable-next-line id-blacklist - number = 'integer', - checkbox = 'boolean', - date = 'date', - datetime = 'datetime', - dropdown = 'dropdown', - typeahead = 'typeahead', - amount = 'amount', - radio = 'radio-buttons', - people = 'people', - groupOfPeople = 'functional-group', - dynamicTable = 'dynamicTable', - hyperlink = 'hyperlink', - header = 'group', - uploadFile = 'upload', - uploadFolder = 'uploadFolder', - displayValue = 'readonly', - displayText = 'readonly-text', - fileViewer = 'file-viewer', - button = 'button' -} +export const FormFieldType = { + text: 'text', + multiline: 'multi-line-text', + number: 'integer', + checkbox: 'boolean', + date: 'date', + datetime: 'datetime', + dropdown: 'dropdown', + typeahead: 'typeahead', + amount: 'amount', + radio: 'radio-buttons', + people: 'people', + groupOfPeople: 'functional-group', + dynamicTable: 'dynamicTable', + hyperlink: 'hyperlink', + header: 'group', + uploadFile: 'upload', + uploadFolder: 'uploadFolder', + displayValue: 'readonly', + displayText: 'readonly-text', + fileViewer: 'file-viewer', + button: 'button' +} as const; + +export type FormFieldType = (typeof FormFieldType)[keyof typeof FormFieldType]; export interface FormCloudDisplayModeConfigurationOptions { onCompleteTask(id?: string): void; @@ -280,12 +281,13 @@ export interface FormCloudDisplayModeConfiguration { default?: boolean; } -// eslint-disable-next-line no-shadow -export enum FormCloudDisplayMode { - inline = 'inline', - fullScreen = 'fullScreen', - standalone = 'standalone' -} +export const FormCloudDisplayMode = { + inline: 'inline', + fullScreen: 'fullScreen', + standalone: 'standalone' +} as const; + +export type FormCloudDisplayMode = (typeof FormCloudDisplayMode)[keyof typeof FormCloudDisplayMode]; export interface FormCloudDisplayModeChange { displayMode: string; diff --git a/lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts b/lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts index 858d94b85a..d03bb19ce0 100644 --- a/lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts +++ b/lib/process-services-cloud/src/lib/task/task-filters/models/filter-cloud.model.ts @@ -322,22 +322,26 @@ export interface FilterOptions { value?: string; } -export enum AssignmentType { - CURRENT_USER = 'CURRENT_USER', - UNASSIGNED = 'UNASSIGNED', - NONE = 'NONE', - CANDIDATE_GROUPS = 'CANDIDATE_GROUPS', - ASSIGNED_TO = 'ASSIGNED_TO' -} +export const AssignmentType = { + CURRENT_USER: 'CURRENT_USER', + UNASSIGNED: 'UNASSIGNED', + NONE: 'NONE', + CANDIDATE_GROUPS: 'CANDIDATE_GROUPS', + ASSIGNED_TO: 'ASSIGNED_TO' +} as const; -export enum TaskStatusFilter { - ALL = '', - CREATED = 'CREATED', - ASSIGNED = 'ASSIGNED', - SUSPENDED = 'SUSPENDED', - CANCELLED = 'CANCELLED', - COMPLETED = 'COMPLETED' -} +export type AssignmentType = (typeof AssignmentType)[keyof typeof AssignmentType]; + +export const TaskStatusFilter = { + ALL: '', + CREATED: 'CREATED', + ASSIGNED: 'ASSIGNED', + SUSPENDED: 'SUSPENDED', + CANCELLED: 'CANCELLED', + COMPLETED: 'COMPLETED' +} as const; + +export type TaskStatusFilter = (typeof TaskStatusFilter)[keyof typeof TaskStatusFilter]; export interface TaskFilterProperties { label?: string; diff --git a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts index 436f73486c..5d438f48aa 100644 --- a/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts +++ b/lib/process-services-cloud/src/lib/task/task-list/components/base-task-list-cloud.component.ts @@ -51,12 +51,13 @@ import { TaskCloudService } from '../../services/task-cloud.service'; import { PreferenceCloudServiceInterface } from '../../../services/preference-cloud.interface'; import { takeUntilDestroyed } from '@angular/core/rxjs-interop'; -// eslint-disable-next-line no-shadow -export enum TasksListCloudPreferences { - columnOrder = 'tasks-list-cloud-columns-order', - columnsVisibility = 'tasks-list-cloud-columns-visibility', - columnsWidths = 'tasks-list-cloud-columns-widths' -} +export const TasksListCloudPreferences = { + columnOrder: 'tasks-list-cloud-columns-order', + columnsVisibility: 'tasks-list-cloud-columns-visibility', + columnsWidths: 'tasks-list-cloud-columns-widths' +} as const; + +export type TasksListCloudPreferences = (typeof TasksListCloudPreferences)[keyof typeof TasksListCloudPreferences]; const taskPresetsCloudDefaultModel = { default: [ diff --git a/lib/process-services/src/lib/attachment/task-attachment-list/task-attachment-list.component.spec.ts b/lib/process-services/src/lib/attachment/task-attachment-list/task-attachment-list.component.spec.ts index dc0aaf3dab..79862a8a5b 100644 --- a/lib/process-services/src/lib/attachment/task-attachment-list/task-attachment-list.component.spec.ts +++ b/lib/process-services/src/lib/attachment/task-attachment-list/task-attachment-list.component.spec.ts @@ -15,10 +15,10 @@ * limitations under the License. */ -import { SimpleChange, Component, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { SimpleChange, Component, DebugElement } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { of, throwError } from 'rxjs'; +import { of, Subscription, throwError } from 'rxjs'; import { TaskAttachmentListComponent } from './task-attachment-list.component'; import { mockEmittedTaskAttachments, mockTaskAttachments } from '../../testing/mock/task/task-attachments.mock'; import { ProcessContentService } from '../../form/services/process-content.service'; @@ -34,7 +34,7 @@ describe('TaskAttachmentList', () => { let deleteContentSpy: jasmine.Spy; let getFileRawContentSpy: jasmine.Spy; let getContentPreviewSpy: jasmine.Spy; - let disposableSuccess: any; + let disposableSuccess: Subscription; let loader: HarnessLoader; beforeEach(() => { @@ -76,7 +76,7 @@ describe('TaskAttachmentList', () => { it('should emit an error when an error occurs loading attachments', () => { const emitSpy = spyOn(component.error, 'emit'); - getTaskRelatedContentSpy.and.returnValue(throwError({})); + getTaskRelatedContentSpy.and.returnValue(throwError(() => new Error('Error loading attachments'))); const change = new SimpleChange(null, '123', true); component.ngOnChanges({ taskId: change }); expect(emitSpy).toHaveBeenCalled(); @@ -296,8 +296,7 @@ describe('Custom CustomEmptyTemplateComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - declarations: [CustomEmptyTemplateComponent], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + declarations: [CustomEmptyTemplateComponent] }); fixture = TestBed.createComponent(CustomEmptyTemplateComponent); fixture.detectChanges(); @@ -311,7 +310,7 @@ describe('Custom CustomEmptyTemplateComponent', () => { fixture.detectChanges(); await fixture.whenStable(); - const title: any = fixture.debugElement.queryAll(By.css('[adf-empty-list-header]')); + const title: DebugElement[] = fixture.debugElement.queryAll(By.css('[adf-empty-list-header]')); expect(title.length).toBe(1); expect(title[0].nativeElement.innerText).toBe('Custom header'); }); diff --git a/lib/process-services/src/lib/form/widgets/content-widget/attach-file-widget-dialog.component.spec.ts b/lib/process-services/src/lib/form/widgets/content-widget/attach-file-widget-dialog.component.spec.ts index 15fc35fcb3..b38360ec1a 100644 --- a/lib/process-services/src/lib/form/widgets/content-widget/attach-file-widget-dialog.component.spec.ts +++ b/lib/process-services/src/lib/form/widgets/content-widget/attach-file-widget-dialog.component.spec.ts @@ -18,7 +18,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { ContentNodeSelectorPanelComponent, DocumentListService, SitesService, NodesApiService } from '@alfresco/adf-content-services'; -import { EventEmitter, NO_ERRORS_SCHEMA } from '@angular/core'; +import { EventEmitter } from '@angular/core'; import { AttachFileWidgetDialogComponent } from './attach-file-widget-dialog.component'; import { AuthenticationService, NoopAuthModule } from '@alfresco/adf-core'; import { AttachFileWidgetDialogComponentData } from './attach-file-widget-dialog-component.interface'; @@ -53,8 +53,7 @@ describe('AttachFileWidgetDialogComponent', () => { providers: [ { provide: MAT_DIALOG_DATA, useValue: data }, { provide: MatDialogRef, useValue: { close: () => of() } } - ], - schemas: [NO_ERRORS_SCHEMA] + ] }); fixture = TestBed.createComponent(AttachFileWidgetDialogComponent); widget = fixture.componentInstance; @@ -71,7 +70,7 @@ describe('AttachFileWidgetDialogComponent', () => { authService.onLogin = new Subject(); spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: { path: { elements: [] } } } as NodeEntry)); - spyOn(documentListService, 'getFolder').and.returnValue(throwError('No results for test')); + spyOn(documentListService, 'getFolder').and.returnValue(throwError(() => new Error('No results for test'))); spyOn(nodeService, 'getNode').and.returnValue( of(new Node({ id: 'fake-node', path: { elements: [{ nodeType: 'st:site', name: 'fake-site' }] } })) ); diff --git a/lib/process-services/src/lib/form/widgets/file-viewer/file-viewer.widget.spec.ts b/lib/process-services/src/lib/form/widgets/file-viewer/file-viewer.widget.spec.ts index 12c1e26a33..75d8fc9af8 100644 --- a/lib/process-services/src/lib/form/widgets/file-viewer/file-viewer.widget.spec.ts +++ b/lib/process-services/src/lib/form/widgets/file-viewer/file-viewer.widget.spec.ts @@ -18,7 +18,6 @@ import { FileViewerWidgetComponent } from './file-viewer.widget'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { FormModel, FormService, FormFieldModel, RedirectAuthService } from '@alfresco/adf-core'; -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { EMPTY, of } from 'rxjs'; describe('FileViewerWidgetComponent', () => { @@ -48,8 +47,7 @@ describe('FileViewerWidgetComponent', () => { providers: [ { provide: FormService, useValue: formServiceStub }, { provide: RedirectAuthService, useValue: { onLogin: EMPTY, onTokenReceived: of() } } - ], - schemas: [CUSTOM_ELEMENTS_SCHEMA] + ] }); formServiceStub = TestBed.inject(FormService); diff --git a/lib/process-services/src/lib/process-list/components/process-instance-details/process-instance-details.component.spec.ts b/lib/process-services/src/lib/process-list/components/process-instance-details/process-instance-details.component.spec.ts index 3dca6d3212..fbd1e148d1 100644 --- a/lib/process-services/src/lib/process-list/components/process-instance-details/process-instance-details.component.spec.ts +++ b/lib/process-services/src/lib/process-list/components/process-instance-details/process-instance-details.component.spec.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { NO_ERRORS_SCHEMA, SimpleChange } from '@angular/core'; +import { SimpleChange } from '@angular/core'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { of } from 'rxjs'; @@ -39,8 +39,7 @@ describe('ProcessInstanceDetailsComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ imports: [ProcessInstanceDetailsComponent], - providers: [{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }], - schemas: [NO_ERRORS_SCHEMA] + providers: [{ provide: AlfrescoApiService, useClass: AlfrescoApiServiceMock }] }); fixture = TestBed.createComponent(ProcessInstanceDetailsComponent); component = fixture.componentInstance; diff --git a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts index a875af89d9..634f44b0ca 100644 --- a/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts +++ b/lib/process-services/src/lib/task-list/components/task-form/task-form.component.spec.ts @@ -20,7 +20,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { TaskFormComponent } from './task-form.component'; import { FormModel, FormOutcomeEvent, FormOutcomeModel } from '@alfresco/adf-core'; import { TaskListService } from '../../services/tasklist.service'; -import { NO_ERRORS_SCHEMA, SimpleChange } from '@angular/core'; +import { SimpleChange } from '@angular/core'; import { of, throwError } from 'rxjs'; import { claimableTaskDetailsMock, @@ -45,7 +45,7 @@ import { By } from '@angular/platform-browser'; import { TaskFormService } from '../../../form/services/task-form.service'; import { TaskService } from '../../../form/services/task.service'; import { PeopleProcessService } from '../../../services/people-process.service'; -import { TaskRepresentation } from '@alfresco/js-api'; +import { TaskRepresentation, UserRepresentation } from '@alfresco/js-api'; describe('TaskFormComponent', () => { let component: TaskFormComponent; @@ -61,7 +61,7 @@ describe('TaskFormComponent', () => { beforeEach(() => { TestBed.configureTestingModule({ - schemas: [NO_ERRORS_SCHEMA] + imports: [TaskFormComponent] }); fixture = TestBed.createComponent(TaskFormComponent); component = fixture.componentInstance; @@ -77,7 +77,7 @@ describe('TaskFormComponent', () => { taskDetailsMock.processDefinitionId = null; spyOn(taskService, 'getTask').and.returnValue(of(taskDetailsMock)); peopleProcessService = TestBed.inject(PeopleProcessService); - getBpmLoggedUserSpy = spyOn(peopleProcessService, 'getCurrentUserInfo').and.returnValue(of(fakeUser as any)); + getBpmLoggedUserSpy = spyOn(peopleProcessService, 'getCurrentUserInfo').and.returnValue(of(fakeUser as UserRepresentation)); }); afterEach(async () => { @@ -754,12 +754,12 @@ describe('TaskFormComponent', () => { it('should emit error event in case claim task api fails', (done) => { const mockError = { message: 'Api Failed' }; - spyOn(taskListService, 'claimTask').and.returnValue(throwError(mockError)); + spyOn(taskListService, 'claimTask').and.returnValue(throwError(() => mockError)); getTaskDetailsSpy.and.returnValue(of(claimableTaskDetailsMock)); component.taskId = 'mock-task-id'; - component.error.subscribe((error) => { + component.error.subscribe((error: unknown) => { expect(error).toEqual(mockError); done(); }); @@ -792,13 +792,13 @@ describe('TaskFormComponent', () => { it('should emit error event in case unclaim task api fails', (done) => { const mockError = { message: 'Api Failed' }; - spyOn(taskListService, 'unclaimTask').and.returnValue(throwError(mockError)); + spyOn(taskListService, 'unclaimTask').and.returnValue(throwError(() => mockError)); getBpmLoggedUserSpy.and.returnValue(of(claimedTaskDetailsMock.assignee)); getTaskDetailsSpy.and.returnValue(of(claimedTaskDetailsMock)); component.taskId = 'mock-task-id'; - component.error.subscribe((error: any) => { + component.error.subscribe((error: unknown) => { expect(error).toEqual(mockError); done(); }); diff --git a/package-lock.json b/package-lock.json index bf8fd737c9..3101739c54 100644 --- a/package-lock.json +++ b/package-lock.json @@ -201,6 +201,7 @@ "integrity": "sha512-uIxi6Vzss6+ycljVhkyPUPWa20w8qxJL9lEn0h6+sX/fhM8Djt0FHIuTQjoX58EoMaQ/1jrXaRaGimkbaFcG9A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1902.19", @@ -408,6 +409,7 @@ "integrity": "sha512-JbLL+4IMLMBgjLZlnPG4lYDfz4zGrJ/s6Aoon321NJKuw1Kb1k5KpFu9dUY0BqLIe8xPQ2UJBpI+xXdK5MXMHQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ajv": "8.17.1", "ajv-formats": "3.0.1", @@ -546,6 +548,7 @@ "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-19.2.18.tgz", "integrity": "sha512-c76x1t+OiSstPsvJdHmV8Q4taF+8SxWKqiY750fOjpd01it4jJbU6YQqIroC6Xie7154zZIxOTHH2uTj+nm5qA==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -563,6 +566,7 @@ "integrity": "sha512-SFzQ1bRkNFiOVu+aaz+9INmts7tDUrsHLEr9HmARXr9qk5UmR8prlw39p2u+Bvi6/lCiJ18TZMQQl9mGyr63lg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "2.3.0", "@angular-devkit/architect": "0.1902.19", @@ -648,6 +652,7 @@ "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-19.2.19.tgz", "integrity": "sha512-PCpJagurPBqciqcq4Z8+3OtKLb7rSl4w/qBJoIMua8CgnrjvA1i+SWawhdtfI1zlY8FSwhzLwXV0CmWWfFzQPg==", "license": "MIT", + "peer": true, "dependencies": { "parse5": "^7.1.2", "tslib": "^2.3.0" @@ -663,6 +668,7 @@ "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.18.tgz", "integrity": "sha512-CrV02Omzw/QtfjlEVXVPJVXipdx83NuA+qSASZYrxrhKFusUZyK3P/Zznqg+wiAeNDbedQwMUVqoAARHf0xQrw==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -679,6 +685,7 @@ "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.18.tgz", "integrity": "sha512-3MscvODxRVxc3Cs0ZlHI5Pk5rEvE80otfvxZTMksOZuPlv1B+S8MjWfc3X3jk9SbyUEzODBEH55iCaBHD48V3g==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -692,6 +699,7 @@ "integrity": "sha512-N4TMtLfImJIoMaRL6mx7885UBeQidywptHH6ACZj71Ar6++DBc1mMlcwuvbeJCd3r3y8MQ5nLv5PZSN/tHr13w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@babel/core": "7.26.9", "@jridgewell/sourcemap-codec": "^1.4.14", @@ -768,6 +776,7 @@ "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.18.tgz", "integrity": "sha512-+QRrf0Igt8ccUWXHA+7doK5W6ODyhHdqVyblSlcQ8OciwkzIIGGEYNZom5OZyWMh+oI54lcSeyV2O3xaDepSrQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -784,6 +793,7 @@ "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.18.tgz", "integrity": "sha512-pe40934jWhoS7DyGl7jyZdoj1gvBgur2t1zrJD+csEkTitYnW14+La2Pv6SW1pNX5nIzFsgsS9Nex1KcH5S6Tw==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -802,6 +812,7 @@ "resolved": "https://registry.npmjs.org/@angular/material/-/material-19.2.19.tgz", "integrity": "sha512-auIE6JUzTIA3LyYklh9J/T7u64crmphxUBgAa0zcOMDog6SYfwbNe9YeLQqua5ek4OUAOdK/BHHfVl5W5iaUoQ==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -833,6 +844,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.18.tgz", "integrity": "sha512-eahtsHPyXTYLARs9YOlXhnXGgzw0wcyOcDkBvNWK/3lA0NHIgIHmQgXAmBo+cJ+g9skiEQTD2OmSrrwbFKWJkw==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -855,6 +867,7 @@ "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-19.2.18.tgz", "integrity": "sha512-wqDtK2yVN5VDqVeOSOfqELdu40fyoIDknBGSxA27CEXzFVdMWJyIpuvUi+GMa+9eGjlS+1uVVBaRwxmnuvHj+A==", "license": "MIT", + "peer": true, "dependencies": { "tslib": "^2.3.0" }, @@ -891,6 +904,7 @@ "resolved": "https://registry.npmjs.org/@apollo/client/-/client-3.13.1.tgz", "integrity": "sha512-HaAt62h3jNUXpJ1v5HNgUiCzPP1c5zc2Q/FeTb2cTk/v09YlhoqKKHQFJI7St50VCJ5q8JVIc03I5bRcBrQxsg==", "license": "MIT", + "peer": true, "dependencies": { "@graphql-typed-document-node/core": "^3.1.1", "@wry/caches": "^1.0.0", @@ -1011,6 +1025,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.10.tgz", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -2945,6 +2960,7 @@ "integrity": "sha512-CYDD3SOtsHtyXeEORYRx2qBtpDJFjRTGXUtmNEMGyzYOKj1TE3tycdlho7kA1Ufx9OYWZzg52QFBGALTirzDSw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@keyv/serialize": "^1.1.1" } @@ -3165,7 +3181,8 @@ "version": "4.0.19", "resolved": "https://registry.npmjs.org/@cspell/dict-css/-/dict-css-4.0.19.tgz", "integrity": "sha512-VYHtPnZt/Zd/ATbW3rtexWpBnHUohUrQOHff/2JBhsVgxOrksAxJnLAO43Q1ayLJBJUUwNVo+RU0sx0aaysZfg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-dart": { "version": "2.3.2", @@ -3285,13 +3302,15 @@ "version": "4.0.14", "resolved": "https://registry.npmjs.org/@cspell/dict-html/-/dict-html-4.0.14.tgz", "integrity": "sha512-2bf7n+kS92g+cMKV0wr9o/Oq9n8JzU7CcrB96gIh2GHgnF+0xDOqO2W/1KeFAqOfqosoOVE48t+4dnEMkkoJ2Q==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-html-symbol-entities": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/@cspell/dict-html-symbol-entities/-/dict-html-symbol-entities-4.0.5.tgz", "integrity": "sha512-429alTD4cE0FIwpMucvSN35Ld87HCyuM8mF731KU5Rm4Je2SG6hmVx7nkBsLyrmH3sQukTcr1GaiZsiEg8svPA==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-java": { "version": "5.0.12", @@ -3462,7 +3481,8 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/@cspell/dict-typescript/-/dict-typescript-3.2.3.tgz", "integrity": "sha512-zXh1wYsNljQZfWWdSPYwQhpwiuW0KPW1dSd8idjMRvSD0aSvWWHoWlrMsmZeRl4qM4QCEAjua8+cjflm41cQBg==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@cspell/dict-vue": { "version": "3.0.5", @@ -3646,6 +3666,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" }, @@ -3689,6 +3710,7 @@ } ], "license": "MIT", + "peer": true, "engines": { "node": ">=18" } @@ -6938,6 +6960,7 @@ "integrity": "sha512-8PFQxtmXc6ukBC4CqGIoc96M2Ly9WVwCPu4Ffvt+K/SB6rGbeFeZoYAwREV1zGNMJ5v5ly6+AHIEOBxNuSnzSg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/bridge-react-webpack-plugin": "0.21.6", "@module-federation/cli": "0.21.6", @@ -7274,6 +7297,7 @@ "integrity": "sha512-GzqNytPPnQVejl78XFFvtLyj3XNgPu6rSac2EbQkCxV3uzAD3kFQ7SW0VuwXWbQeRTUgt/4Nl/o+BrJXy14lsw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "0.22.1", "@module-federation/webpack-bundler-runtime": "0.22.1" @@ -7427,6 +7451,7 @@ "integrity": "sha512-fnP+ZOZTFeBGiTAnxve+axGmiYn2D60h86nUISXjXClK3LUY1krUfPgf6MaD4YDJ4i51OGXZWPekeMe16pkd8Q==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime": "0.21.6", "@module-federation/webpack-bundler-runtime": "0.21.6" @@ -9201,8 +9226,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-darwin-x64": { "version": "21.6.10", @@ -9216,8 +9240,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-freebsd-x64": { "version": "21.6.10", @@ -9231,8 +9254,7 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm-gnueabihf": { "version": "21.6.10", @@ -9246,8 +9268,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm64-gnu": { "version": "21.6.10", @@ -9261,8 +9282,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-linux-arm64-musl": { "version": "21.6.10", @@ -9276,8 +9296,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-linux-x64-gnu": { "version": "21.6.10", @@ -9291,8 +9310,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-linux-x64-musl": { "version": "21.6.10", @@ -9306,8 +9324,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-win32-arm64-msvc": { "version": "21.6.10", @@ -9321,8 +9338,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/nx-win32-x64-msvc": { "version": "21.6.10", @@ -9336,8 +9352,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@nx/cypress/node_modules/@nx/workspace": { "version": "20.8.4", @@ -9751,7 +9766,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -9824,7 +9838,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -9882,7 +9895,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -9898,7 +9910,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -9911,8 +9922,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@nx/cypress/node_modules/restore-cursor": { "version": "3.1.0", @@ -10507,6 +10517,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -11848,8 +11859,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-darwin-x64": { "version": "21.6.10", @@ -11863,8 +11873,7 @@ "optional": true, "os": [ "darwin" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-freebsd-x64": { "version": "21.6.10", @@ -11878,8 +11887,7 @@ "optional": true, "os": [ "freebsd" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm-gnueabihf": { "version": "21.6.10", @@ -11893,8 +11901,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm64-gnu": { "version": "21.6.10", @@ -11908,8 +11915,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-linux-arm64-musl": { "version": "21.6.10", @@ -11923,8 +11929,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-linux-x64-gnu": { "version": "21.6.10", @@ -11938,8 +11943,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-linux-x64-musl": { "version": "21.6.10", @@ -11953,8 +11957,7 @@ "optional": true, "os": [ "linux" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-win32-arm64-msvc": { "version": "21.6.10", @@ -11968,8 +11971,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/nx-win32-x64-msvc": { "version": "21.6.10", @@ -11983,8 +11985,7 @@ "optional": true, "os": [ "win32" - ], - "peer": true + ] }, "node_modules/@nx/storybook/node_modules/@nx/workspace": { "version": "20.8.4", @@ -12398,7 +12399,6 @@ "dev": true, "hasInstallScript": true, "license": "MIT", - "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -12471,7 +12471,6 @@ "integrity": "sha512-dQHFo3Pt4/NLlG5z4PxZ/3yZTZ1C7s9hveiOj+GCN+uT109NC2QgsoVZsVOAvbJ3RgKkvyLGXZV9+piDpWbm6A==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/diff-sequences": "30.0.1", "@jest/get-type": "30.1.0", @@ -12529,7 +12528,6 @@ "integrity": "sha512-9uBdv/B4EefsuAL+pWqueZyZS2Ba+LxfFeQ9DN14HU4bN8bhaxKdkpjpB6fs9+pSjIBu+FXQHImEg8j/Lw0+vA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@jest/schemas": "30.0.5", "ansi-styles": "^5.2.0", @@ -12545,7 +12543,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -12558,8 +12555,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@nx/storybook/node_modules/restore-cursor": { "version": "3.1.0", @@ -13231,6 +13227,7 @@ "integrity": "sha512-pOxtKWUfvf0oD8Geqs8D89Q2xpstRTaSY+F6Ut/Wd0GnEjUjO32SS1ymAM6WggGPHDZN4qpNrd5cfIxQmAbRLg==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -13888,6 +13885,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -15068,6 +15066,7 @@ "integrity": "sha512-GUiTRTz6+gbfM2g3ixXqrvPSeHmyAFu/qHEZZjbYFeDtZhpy1gVaVAHiZfaaIIm+vRlNi7JmULWFZQFKwpQB9Q==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@module-federation/runtime-tools": "0.22.0", "@rspack/binding": "1.7.3", @@ -15306,6 +15305,7 @@ "integrity": "sha512-q1xbQYLG/JR0P0/jma3sUUWubw/6859WC5Y/+l2xGEvIqtoMKBYBzN4Nrud8rdLVEFfIDNEIbKQ4Rwr/JemO3g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@angular-devkit/core": "19.2.7", "@angular-devkit/schematics": "19.2.7", @@ -15527,6 +15527,7 @@ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -15785,7 +15786,6 @@ "integrity": "sha512-o4PXJQidqJl82ckFaXUeoAW+XysPLauYI43Abki5hABd853iMhitooc6znOnczgbTYmEP6U6/y1ZyKAIsvMKGg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.10.4", "@babel/runtime": "^7.12.5", @@ -15806,7 +15806,6 @@ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -15817,7 +15816,6 @@ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=10" }, @@ -15831,7 +15829,6 @@ "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "dequal": "^2.0.3" } @@ -15842,7 +15839,6 @@ "integrity": "sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "ansi-regex": "^5.0.1", "ansi-styles": "^5.0.0", @@ -15857,8 +15853,7 @@ "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", "integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@testing-library/jest-dom": { "version": "6.9.1", @@ -15963,8 +15958,7 @@ "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", "integrity": "sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/babel__core": { "version": "7.20.5", @@ -16096,6 +16090,7 @@ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "license": "MIT", + "peer": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -16122,6 +16117,7 @@ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.25.tgz", "integrity": "sha512-dVd04UKsfpINUnK0yBoYHDF3xu7xVH4BuDotC/xGuycx4CgbP48X/KF/586bcObxT0HENHXEU8Nqtu6NR+eKhw==", "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -16268,6 +16264,7 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.130.tgz", "integrity": "sha512-GRaXQx6jGfL8sKfaIDD6OupbIHBr9jv7Jnaml9tB7l4v068PAOXqfcujMMo5PhbIs6ggR1XODELqahT2R8v0fg==", "license": "MIT", + "peer": true, "dependencies": { "undici-types": "~5.26.4" } @@ -16777,6 +16774,7 @@ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "6.21.0", "@typescript-eslint/types": "6.21.0", @@ -17116,6 +17114,7 @@ "integrity": "sha512-jr/swrr2aRmUAUjW5/zQHbMaui//vQlsZcJKijZf3M26bnmLj8LyZUpj8/Rd6uzaek06OWsqdofN/Thenm5O8A==", "dev": true, "license": "MIT", + "peer": true, "engines": { "node": "^18.18.0 || ^20.9.0 || >=21.1.0" }, @@ -17233,6 +17232,7 @@ "integrity": "sha512-c4bMvGVWW4hv6JmDUEG7fSYlWOl3II2I4ylt0NM+seinYQlZMQIaKaXIIVJWt9Ofh6whrpM+EdDQXKXjNovvrg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.9.1", "@typescript-eslint/scope-manager": "8.53.1", @@ -18107,6 +18107,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -18222,6 +18223,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19206,6 +19208,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.9.0", "caniuse-lite": "^1.0.30001759", @@ -19527,6 +19530,7 @@ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.4.tgz", "integrity": "sha512-emICKGBABnxhMjUjlYRR12PmOXhJ2eJjEHL2/dZlWjxRAZT1D8xplLFq5M0tMQK8ja+wBS/tuVEJB5C6r7VxJA==", "license": "MIT", + "peer": true, "dependencies": { "@kurkle/color": "^0.3.0" }, @@ -19549,6 +19553,7 @@ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", "license": "MIT", + "peer": true, "dependencies": { "readdirp": "^4.0.1" }, @@ -21751,6 +21756,7 @@ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.21.0" }, @@ -21996,7 +22002,6 @@ "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=6" } @@ -22132,8 +22137,7 @@ "resolved": "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz", "integrity": "sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/dom-converter": { "version": "0.2.0", @@ -22354,6 +22358,7 @@ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "iconv-lite": "^0.6.2" } @@ -22801,6 +22806,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -22857,6 +22863,7 @@ "integrity": "sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==", "dev": true, "license": "MIT", + "peer": true, "bin": { "eslint-config-prettier": "bin/cli.js" }, @@ -24333,6 +24340,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -25058,6 +25066,7 @@ "resolved": "https://registry.npmjs.org/graphql/-/graphql-16.12.0.tgz", "integrity": "sha512-DKKrynuQRne0PNpEbzuEdHlYOMksHSUI8Zc9Unei5gTsMNA2/vMpoMz/yKba50pejK56qj98qM0SjYxAKi13gQ==", "license": "MIT", + "peer": true, "engines": { "node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0" } @@ -25082,6 +25091,7 @@ "resolved": "https://registry.npmjs.org/graphql-ws/-/graphql-ws-6.0.6.tgz", "integrity": "sha512-zgfER9s+ftkGKUZgc0xbx8T7/HMO4AV5/YuYiFc+AtgcO5T0v8AxYYNQ+ltzuzDZgNkYJaFspm5MMYLjQzrkmw==", "license": "MIT", + "peer": true, "engines": { "node": ">=20" }, @@ -25437,6 +25447,7 @@ "integrity": "sha512-bLjW01UTrvoWTJQL5LsMRo1SypHW80FTm12OJRSnr3v6YHNhfe+1r0MYUZJMACxnCHURVnBWRwAsWs2yPU9Ezw==", "devOptional": true, "license": "MIT", + "peer": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -26755,7 +26766,8 @@ "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-5.13.0.tgz", "integrity": "sha512-vsYjfh7lyqvZX5QgqKc4YH8phs7g96Z8bsdIFNEU3VqXhlHaq+vov/Fgn/sr6MiUczdZkyXRC3TX369Ll4Nzbw==", "dev": true, - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/jasmine-reporters": { "version": "2.5.2", @@ -26784,6 +26796,7 @@ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^29.7.0", "@jest/types": "^29.6.3", @@ -28526,6 +28539,7 @@ "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/environment": "^29.7.0", "@jest/fake-timers": "^29.7.0", @@ -31386,6 +31400,7 @@ "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@colors/colors": "1.5.0", "body-parser": "^1.19.0", @@ -32171,6 +32186,7 @@ "resolved": "https://registry.npmjs.org/less/-/less-4.2.2.tgz", "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "license": "Apache-2.0", + "peer": true, "dependencies": { "copy-anything": "^2.0.1", "parse-node-version": "^1.0.1", @@ -33163,7 +33179,6 @@ "integrity": "sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "lz-string": "bin/bin.js" } @@ -33836,6 +33851,7 @@ "integrity": "sha512-dFuwFsDJMBSd1YtmLLcX5bNNUCQUlRqgf34aXA+79PmkOP+0eF8GP2949wq3+jMjmFTNm80Oo8IUYiSLwklKCQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@rollup/plugin-json": "^6.1.0", "@rollup/wasm-node": "^4.24.0", @@ -34243,6 +34259,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@napi-rs/wasm-runtime": "0.2.4", "@yarnpkg/lockfile": "^1.1.0", @@ -35579,6 +35596,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.8", "picocolors": "^1.1.1", @@ -36291,6 +36309,7 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -37577,6 +37596,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -38218,8 +38238,7 @@ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.27.0.tgz", "integrity": "sha512-eNv+WrVbKu1f3vbYJT/xtiF5syA5HPIMtf9IgY/nKg0sWqzAUEvqY/xm7OcZc/qafLx/iO9FgOmeSAp4v5ti/Q==", "devOptional": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/schema-utils": { "version": "4.3.3", @@ -39047,6 +39066,7 @@ "integrity": "sha512-fIQnFtpksRRgHR1CO1onGX3djaog4qsW/c5U8arqYTkUEr2TaWpn05mIJDOBoPJFlOdqFrB4Ttv0PZJxV7avhw==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@storybook/global": "^5.0.0", "@storybook/icons": "^2.0.1", @@ -39481,6 +39501,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "@csstools/css-parser-algorithms": "^3.0.4", "@csstools/css-tokenizer": "^3.0.3", @@ -39925,6 +39946,7 @@ "integrity": "sha512-orRsuYpJVw8LdAwqqLykBj9ecS5/cRHlI5+nvTo8LcCKmzDmqVORXtOIYEEQuL9D4BxtA1lm5isAqzQZCoQ6Eg==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -40971,6 +40993,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -41113,7 +41136,8 @@ "version": "2.8.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" + "license": "0BSD", + "peer": true }, "node_modules/tsscmp": { "version": "1.0.6", @@ -41304,6 +41328,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.8.3.tgz", "integrity": "sha512-p1diW6TqL9L07nNxvRMM7hMMw4c5XOo/1ibL4aAIGmSAt9slTE1Xgw5KWuof2uTOvCg9BY7ZRi+GaF+7sfgPeQ==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -41703,6 +41728,7 @@ "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -42192,6 +42218,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.3.tgz", "integrity": "sha512-7b0dTKR3Ed//AD/6kkx/o7duS8H3f1a4w3BYpIriX4BzIhjkn4teo05cptsxvLesHFKK5KObnadmCHBwGc+51A==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -42298,6 +42325,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-5.2.2.tgz", "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.13", "@types/connect-history-api-fallback": "^1.5.4", @@ -42461,6 +42489,7 @@ "integrity": "sha512-khZGfAeJx6I8K9zKohEWWYN6KDlVw2DHownoe+6Vtwj1LP9WFgegXnVMSkZ/dBEBtXFwrkkydsaPFlB7f8wU2A==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "ansi-html-community": "0.0.8", "html-entities": "^2.1.0", @@ -42947,6 +42976,7 @@ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "license": "MIT", + "peer": true, "engines": { "node": ">=10.0.0" }, @@ -43211,7 +43241,8 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.0.tgz", "integrity": "sha512-9oxn0IIjbCZkJ67L+LkhYWRyAy7axphb3VgE2MBDlOqnmHMPWGYMxJxBYFueFq/JGY2GMwS0rU+UCLunEmy5UA==", - "license": "MIT" + "license": "MIT", + "peer": true } } }