From f67deefa3f07be06f83ddee3a796832b02fd4b9a Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Tue, 12 Dec 2023 08:54:05 -0800 Subject: [PATCH 01/98] fix manual topic editing issues https://ucsc-cgl.atlassian.net/browse/SEAB-6062 --- cypress/e2e/group2/sharedWorkflows.ts | 6 +++--- cypress/e2e/group3/githubAppTools.ts | 4 ++-- .../workflow/info-tab/info-tab.component.html | 21 +++++++------------ 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/cypress/e2e/group2/sharedWorkflows.ts b/cypress/e2e/group2/sharedWorkflows.ts index 66704964a2..b84acdf2d4 100644 --- a/cypress/e2e/group2/sharedWorkflows.ts +++ b/cypress/e2e/group2/sharedWorkflows.ts @@ -223,7 +223,7 @@ describe('Shared with me workflow test from my-workflows', () => { goToTab('Versions'); clickFirstActionsButtonPrivate(); cy.contains('View').should('be.visible'); - cy.contains('Edit').should('not.exist'); + cy.contains('Edit Info').should('not.exist'); cy.contains('Delete').should('not.exist'); cancelMatMenu(); goToTab('Files'); @@ -239,7 +239,7 @@ describe('Shared with me workflow test from my-workflows', () => { goToTab('Versions'); clickFirstActionsButtonPrivate(); cy.contains('View').should('not.exist'); - cy.contains('Edit').should('be.visible'); + cy.contains('Edit Info').should('be.visible'); cy.contains('Delete').should('be.visible'); cancelMatMenu(); goToTab('Files'); @@ -255,7 +255,7 @@ describe('Shared with me workflow test from my-workflows', () => { goToTab('Versions'); clickFirstActionsButtonPrivate(); cy.contains('View').should('not.exist'); - cy.contains('Edit').should('be.visible'); + cy.contains('Edit Info').should('be.visible'); cy.contains('Delete').should('be.visible'); cancelMatMenu(); goToTab('Files'); diff --git a/cypress/e2e/group3/githubAppTools.ts b/cypress/e2e/group3/githubAppTools.ts index 5035e413d9..39d12c1bf5 100644 --- a/cypress/e2e/group3/githubAppTools.ts +++ b/cypress/e2e/group3/githubAppTools.ts @@ -170,7 +170,7 @@ describe('GitHub App Tools', () => { cy.contains('button', 'Refresh Version').should('be.disabled'); // Fix hiding a version. You have to refresh the page to see that it was hidden in the table - cy.contains('Edit').click(); + cy.contains('Edit Info').click(); cy.contains('Edit Tool'); cy.contains('Tool Path'); cy.get('[type="checkbox"]').check(); @@ -178,7 +178,7 @@ describe('GitHub App Tools', () => { cy.get('[data-cy=valid').should('exist'); cy.get('[data-cy=hidden').should('exist'); cy.contains('button', 'Actions').should('be.visible').click(); - cy.contains('Edit').click(); + cy.contains('Edit Info').click(); cy.get('[type="checkbox"]').uncheck(); cy.get('[data-cy=save-version]').click(); cy.get('[data-cy=hidden').should('not.exist'); diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index 17bf94998b..6ab12580e9 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -243,26 +243,19 @@ CancelCancel - diff --git a/src/app/shared/register-github-app/register-github-app.component.spec.ts b/src/app/shared/register-github-app/register-github-app.component.spec.ts index 659e8afc1b..8c32596848 100644 --- a/src/app/shared/register-github-app/register-github-app.component.spec.ts +++ b/src/app/shared/register-github-app/register-github-app.component.spec.ts @@ -1,8 +1,10 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCommonModule } from '@angular/material/legacy-core'; import { RegisterGithubAppComponent } from './register-github-app.component'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; describe('RegisterGithubAppComponent', () => { let component: RegisterGithubAppComponent; @@ -11,7 +13,7 @@ describe('RegisterGithubAppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [RegisterGithubAppComponent], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, MatIconModule], providers: [ { provide: MatDialogRef, diff --git a/src/app/shared/register-github-app/register-github-app.component.ts b/src/app/shared/register-github-app/register-github-app.component.ts index 38d5ce827b..7687d31680 100644 --- a/src/app/shared/register-github-app/register-github-app.component.ts +++ b/src/app/shared/register-github-app/register-github-app.component.ts @@ -1,4 +1,6 @@ -import { Component, Input } from '@angular/core'; +import { Component, Input, OnInit } from '@angular/core'; +import { takeUntil } from 'rxjs/operators'; +import { Base } from '../base'; import { Dockstore } from '../dockstore.model'; import { SessionQuery } from '../session/session.query'; import { UserQuery } from '../user/user.query'; @@ -7,11 +9,24 @@ import { UserQuery } from '../user/user.query'; selector: 'app-register-github-app', templateUrl: './register-github-app.component.html', }) -export class RegisterGithubAppComponent { +export class RegisterGithubAppComponent extends Base implements OnInit { public Dockstore = Dockstore; public gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLandingPageLink$; public isUsernameChangeRequired$ = this.userQuery.isUsernameChangeRequired$; @Input() public entryType: string; + private gitHubAppInstallationLink: string; - constructor(private sessionQuery: SessionQuery, private userQuery: UserQuery) {} + constructor(private sessionQuery: SessionQuery, private userQuery: UserQuery) { + super(); + } + + ngOnInit(): void { + this.gitHubAppInstallationLink$ + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((gitHubAppInstallationLink) => (this.gitHubAppInstallationLink = gitHubAppInstallationLink)); + } + + public openGitHubApp() { + window.open(this.gitHubAppInstallationLink, '_blank', 'noopener,noreferrer'); + } } diff --git a/src/app/shared/snackbar.directive.ts b/src/app/shared/snackbar.directive.ts index 73485148d0..e56620ba8d 100644 --- a/src/app/shared/snackbar.directive.ts +++ b/src/app/shared/snackbar.directive.ts @@ -1,5 +1,5 @@ import { Directive, HostListener } from '@angular/core'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; @Directive({ selector: '[appSnackbar]', diff --git a/src/app/shared/tool-lister.ts b/src/app/shared/tool-lister.ts index 2b4883620a..14a95a28ce 100644 --- a/src/app/shared/tool-lister.ts +++ b/src/app/shared/tool-lister.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { AfterViewInit, Directive, ElementRef, OnDestroy, ViewChild } from '@angular/core'; -import { MatPaginator } from '@angular/material/paginator'; +import { MatLegacyPaginator as MatPaginator } from '@angular/material/legacy-paginator'; import { MatSort } from '@angular/material/sort'; import { fromEvent, merge, Observable, Subject } from 'rxjs'; import { debounceTime, distinctUntilChanged, takeUntil, tap } from 'rxjs/operators'; diff --git a/src/app/source-file-tabs/source-file-tabs.component.spec.ts b/src/app/source-file-tabs/source-file-tabs.component.spec.ts index 31c35ea5d1..db707231e5 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.spec.ts @@ -7,7 +7,7 @@ import { FileService } from 'app/shared/file.service'; import { FileStubService, SourceFileTabsStubService } from 'app/test/service-stubs'; import { SourceFileTabsComponent } from './source-file-tabs.component'; import { SourceFileTabsService } from './source-file-tabs.service'; -import { MatDialogModule } from '@angular/material/dialog'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; describe('SourceFileTabsComponent', () => { diff --git a/src/app/source-file-tabs/source-file-tabs.component.ts b/src/app/source-file-tabs/source-file-tabs.component.ts index c5ce601828..626622430f 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.ts @@ -1,8 +1,8 @@ import { KeyValue } from '@angular/common'; import { Component, Input, OnChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; -import { MatSelectChange } from '@angular/material/select'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; import { FileTreeComponent } from 'app/file-tree/file-tree.component'; import { bootstrap4largeModalSize } from 'app/shared/constants'; import { FileService } from 'app/shared/file.service'; diff --git a/src/app/stargazers/stargazers.component.spec.ts b/src/app/stargazers/stargazers.component.spec.ts index 2007f582d9..fbc2625fce 100644 --- a/src/app/stargazers/stargazers.component.spec.ts +++ b/src/app/stargazers/stargazers.component.spec.ts @@ -15,7 +15,7 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatCardModule } from '@angular/material/card'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; import { MatIconModule } from '@angular/material/icon'; import { StarentryService } from '../shared/starentry.service'; import { UserService } from '../shared/user/user.service'; diff --git a/src/app/starredentries/starredentries.component.ts b/src/app/starredentries/starredentries.component.ts index c4edb00327..c9b2b69af2 100644 --- a/src/app/starredentries/starredentries.component.ts +++ b/src/app/starredentries/starredentries.component.ts @@ -5,7 +5,7 @@ import { ProviderService } from '../shared/provider.service'; import { DockstoreTool, Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; import { UserQuery } from '../shared/user/user.query'; import { UsersService } from './../shared/openapi/api/users.service'; -import { MatTabChangeEvent } from '@angular/material/tabs'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; import { UntypedFormControl } from '@angular/forms'; import { ExtendedDockstoreTool } from 'app/shared/models/ExtendedDockstoreTool'; import { ExtendedWorkflow } from 'app/shared/models/ExtendedWorkflow'; diff --git a/src/app/starring/starring.component.spec.ts b/src/app/starring/starring.component.spec.ts index 834844bed8..81bc27bb3b 100644 --- a/src/app/starring/starring.component.spec.ts +++ b/src/app/starring/starring.component.spec.ts @@ -15,7 +15,8 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; import { ContainerService } from '../shared/container.service'; import { StarentryService } from '../shared/starentry.service'; @@ -39,7 +40,7 @@ describe('StarringComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [StarringComponent], - imports: [MatIconModule, MatSnackBarModule], + imports: [MatIconModule, MatSnackBarModule, MatLegacyTooltipModule], providers: [ { provide: StarringService, useClass: StarringStubService }, { provide: TrackLoginService, useClass: TrackLoginStubService }, diff --git a/src/app/starring/starring.module.ts b/src/app/starring/starring.module.ts index 0644fd9e66..90c6a46ee3 100644 --- a/src/app/starring/starring.module.ts +++ b/src/app/starring/starring.module.ts @@ -16,7 +16,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { MatIconModule } from '@angular/material/icon'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { StarentryService } from '../shared/starentry.service'; import { StarringComponent } from './starring.component'; diff --git a/src/app/user-page/user-page.component.ts b/src/app/user-page/user-page.component.ts index c77164e26c..d0a7907c6d 100644 --- a/src/app/user-page/user-page.component.ts +++ b/src/app/user-page/user-page.component.ts @@ -9,7 +9,7 @@ import { HttpErrorResponse } from '@angular/common/http'; import { AlertService } from '../shared/alert/state/alert.service'; import { GithubAppsLogsComponent } from '../myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component'; import { accountInfo, bootstrap4extraLargeModalSize } from '../shared/constants'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { UserQuery } from '../shared/user/user.query'; import { Base } from '../shared/base'; import { AccountInfo } from '../loginComponents/accounts/external/accounts.component'; diff --git a/src/app/workflow/dag/dag.module.ts b/src/app/workflow/dag/dag.module.ts index 8b6942f761..15a519a14d 100644 --- a/src/app/workflow/dag/dag.module.ts +++ b/src/app/workflow/dag/dag.module.ts @@ -19,8 +19,8 @@ import { NgModule } from '@angular/core'; import { FlexLayoutModule } from '@angular/flex-layout'; import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; -import { MatProgressBarModule } from '@angular/material/progress-bar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { RefreshAlertModule } from 'app/shared/alert/alert.module'; import { CustomMaterialModule } from './../../shared/modules/material.module'; import { CwlViewerComponent } from './cwl-viewer/cwl-viewer.component'; diff --git a/src/app/workflow/executions/executions-tab.component.ts b/src/app/workflow/executions/executions-tab.component.ts index 3ac088ec05..3714a87615 100644 --- a/src/app/workflow/executions/executions-tab.component.ts +++ b/src/app/workflow/executions/executions-tab.component.ts @@ -32,7 +32,7 @@ import { SessionQuery } from '../../shared/session/session.query'; import { takeUntil } from 'rxjs/operators'; import PartnerEnum = CloudInstance.PartnerEnum; import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; -import { MatSelectChange } from '@angular/material/select'; +import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; import { AlertService } from '../../shared/alert/state/alert.service'; interface ExecutionMetricsTableObject { diff --git a/src/app/workflow/info-tab/info-tab.component.ts b/src/app/workflow/info-tab/info-tab.component.ts index 23d398961b..fa04b4ea4b 100644 --- a/src/app/workflow/info-tab/info-tab.component.ts +++ b/src/app/workflow/info-tab/info-tab.component.ts @@ -15,7 +15,7 @@ */ import { HttpResponse } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatRadioChange } from '@angular/material/radio'; +import { MatLegacyRadioChange as MatRadioChange } from '@angular/material/legacy-radio'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { EntryType } from 'app/shared/enum/entry-type'; import { FileService } from 'app/shared/file.service'; diff --git a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts index 2e438fec1b..19e61dd54e 100644 --- a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts +++ b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSnackBar } from '@angular/material/snack-bar'; +import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Dockstore } from '../../../shared/dockstore.model'; import { DockstoreTool, Entry, Workflow } from '../../../shared/openapi'; diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index 1fc39f9732..150c17a69c 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -1,6 +1,6 @@ import { HttpUrlEncodingCodec } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { combineLatest, Observable } from 'rxjs'; import { map, shareReplay, takeUntil } from 'rxjs/operators'; diff --git a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts index eee27891b7..9073a9e8e0 100644 --- a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts +++ b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts @@ -1,6 +1,6 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { MatMenuTrigger } from '@angular/material/menu'; +import { MatLegacyMenuTrigger as MatMenuTrigger } from '@angular/material/legacy-menu'; import { AlertService } from '../../../shared/alert/state/alert.service'; import { Base } from '../../../shared/base'; import { CloudInstance, Language, User, UsersService } from '../../../shared/openapi'; diff --git a/src/app/workflow/permissions/permissions.component.ts b/src/app/workflow/permissions/permissions.component.ts index 6bb07781be..31b3f20783 100644 --- a/src/app/workflow/permissions/permissions.component.ts +++ b/src/app/workflow/permissions/permissions.component.ts @@ -1,7 +1,7 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, Input, OnInit } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; +import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts index 9e5042544e..6df3167fa8 100644 --- a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts +++ b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts @@ -15,12 +15,12 @@ */ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { DateService } from '../../shared/date.service'; import { ExtendedDockstoreToolService } from '../../shared/extended-dockstoreTool/extended-dockstoreTool.service'; import { ProviderService } from '../../shared/provider.service'; diff --git a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts index 41e5d690d3..89d3bdb4b9 100644 --- a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts +++ b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts @@ -21,7 +21,7 @@ import { Observable } from 'rxjs'; import { AlertQuery } from '../../../shared/alert/state/alert.query'; import { Dockstore } from '../../../shared/dockstore.model'; import { RegisterWorkflowModalService } from '../register-workflow-modal.service'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { EntryType } from 'app/shared/enum/entry-type'; @Component({ diff --git a/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts b/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts index 31742e6c15..90eaf342db 100644 --- a/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts +++ b/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts @@ -15,8 +15,8 @@ */ import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { NgForm } from '@angular/forms'; -import { MatDialogRef } from '@angular/material/dialog'; -import { MatRadioChange } from '@angular/material/radio'; +import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacyRadioChange as MatRadioChange } from '@angular/material/legacy-radio'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { SessionQuery } from 'app/shared/session/session.query'; import { UserQuery } from 'app/shared/user/user.query'; diff --git a/src/app/workflow/register-workflow-modal/register-workflow-modal.service.spec.ts b/src/app/workflow/register-workflow-modal/register-workflow-modal.service.spec.ts index 6cd4ca5a57..8dd13de3ff 100644 --- a/src/app/workflow/register-workflow-modal/register-workflow-modal.service.spec.ts +++ b/src/app/workflow/register-workflow-modal/register-workflow-modal.service.spec.ts @@ -16,7 +16,7 @@ import { inject, TestBed } from '@angular/core/testing'; import { RouterTestingModule } from '@angular/router/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { WorkflowService } from '../../shared/state/workflow.service'; import { ToolDescriptor } from '../../shared/openapi'; diff --git a/src/app/workflow/register-workflow-modal/register-workflow-modal.service.ts b/src/app/workflow/register-workflow-modal/register-workflow-modal.service.ts index ccddd6317a..860538d365 100644 --- a/src/app/workflow/register-workflow-modal/register-workflow-modal.service.ts +++ b/src/app/workflow/register-workflow-modal/register-workflow-modal.service.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { MatDialogRef } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { Router } from '@angular/router'; import { BehaviorSubject, Observable } from 'rxjs'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts index dfbc83c36f..74f2aae97b 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts @@ -1,7 +1,10 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatIconTestingModule } from '@angular/material/icon/testing'; +import { MatLegacyCommonModule } from '@angular/material/legacy-core'; +import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; @@ -19,7 +22,7 @@ describe('SnapshotDoiOrcidComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ declarations: [SnaphotExporterModalComponent], - imports: [MatSnackBarModule, HttpClientTestingModule, RouterTestingModule], + imports: [MatSnackBarModule, HttpClientTestingModule, RouterTestingModule, MatIconModule], providers: [ { provide: MAT_DIALOG_DATA, diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts index 6fce1ffb7b..ee1689fe6f 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts @@ -1,5 +1,5 @@ import { Component, Inject } from '@angular/core'; -import { MatDialogRef, MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { Router } from '@angular/router'; import { faOrcid } from '@fortawesome/free-brands-svg-icons'; import { concat, Observable, of as observableOf, throwError } from 'rxjs'; diff --git a/src/app/workflow/snapshot-exporter-modal/snapshot-exporter-modal.service.spec.ts b/src/app/workflow/snapshot-exporter-modal/snapshot-exporter-modal.service.spec.ts index 15b3d29425..8f214f7874 100644 --- a/src/app/workflow/snapshot-exporter-modal/snapshot-exporter-modal.service.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/snapshot-exporter-modal.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { DateService } from '../../shared/date.service'; import { ProviderService } from '../../shared/provider.service'; diff --git a/src/app/workflow/version-modal/version-modal.component.ts b/src/app/workflow/version-modal/version-modal.component.ts index 61d71d8ef0..2a2d68283e 100644 --- a/src/app/workflow/version-modal/version-modal.component.ts +++ b/src/app/workflow/version-modal/version-modal.component.ts @@ -15,7 +15,7 @@ */ import { AfterViewChecked, Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; import { NgForm } from '@angular/forms'; -import { MAT_DIALOG_DATA } from '@angular/material/dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { Service } from 'app/shared/openapi/model/service'; import { Notebook } from 'app/shared/openapi/model/notebook'; import { Observable, Subject } from 'rxjs'; diff --git a/src/app/workflow/version-modal/version-modal.service.spec.ts b/src/app/workflow/version-modal/version-modal.service.spec.ts index 19ccc11566..a84e26efe6 100644 --- a/src/app/workflow/version-modal/version-modal.service.spec.ts +++ b/src/app/workflow/version-modal/version-modal.service.spec.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { inject, TestBed } from '@angular/core/testing'; -import { MatDialogModule } from '@angular/material/dialog'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; +import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { RefreshService } from '../../shared/refresh.service'; diff --git a/src/app/workflow/version-modal/version-modal.service.ts b/src/app/workflow/version-modal/version-modal.service.ts index a6a1ecfbd7..1b329522ab 100644 --- a/src/app/workflow/version-modal/version-modal.service.ts +++ b/src/app/workflow/version-modal/version-modal.service.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { BehaviorSubject, Observable, of as observableOf, Subject } from 'rxjs'; import { concatMap } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/workflow/versions/versions.component.ts b/src/app/workflow/versions/versions.component.ts index 7e4760b0c9..f9750e58ed 100644 --- a/src/app/workflow/versions/versions.component.ts +++ b/src/app/workflow/versions/versions.component.ts @@ -15,7 +15,7 @@ */ import { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core'; import { MatSort } from '@angular/material/sort'; -import { MatTableDataSource } from '@angular/material/table'; +import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; import { faCodeBranch, faTag } from '@fortawesome/free-solid-svg-icons'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; diff --git a/src/app/workflow/view/view.component.ts b/src/app/workflow/view/view.component.ts index 802127a5d7..1f022ceeeb 100644 --- a/src/app/workflow/view/view.component.ts +++ b/src/app/workflow/view/view.component.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Input, OnInit } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { EntryType } from 'app/shared/enum/entry-type'; import { RefreshService } from 'app/shared/refresh.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; diff --git a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts index 16a8155af3..a002372f49 100644 --- a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts +++ b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts @@ -2,15 +2,15 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { HttpClientModule } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatButtonModule } from '@angular/material/button'; -import { MatCardModule } from '@angular/material/card'; -import { MatFormFieldModule } from '@angular/material/form-field'; +import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; +import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; import { MatIconModule } from '@angular/material/icon'; -import { MatInputModule } from '@angular/material/input'; -import { MatSnackBarModule } from '@angular/material/snack-bar'; -import { MatTabsModule } from '@angular/material/tabs'; +import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; +import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatTooltipModule } from '@angular/material/tooltip'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { SourceFile } from '../../shared/openapi'; diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 7e63546330..3fa97dd054 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -16,8 +16,8 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { Location } from '@angular/common'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; -import { MatChipInputEvent } from '@angular/material/chips'; -import { MatDialog } from '@angular/material/dialog'; +import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; +import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; diff --git a/src/material.scss b/src/material.scss index eeaee3591f..03cfbef679 100644 --- a/src/material.scss +++ b/src/material.scss @@ -20,9 +20,18 @@ // Include the common styles for Angular Material. We include this here so that you only // have to load a single css file for Angular Material in your app. // Be sure that you only ever include this mixin once! -@include mat.core(); +// As of v15 mat.legacy-core no longer includes default typography styles. +// The following line adds: +// 1. Default typography styles for all components +// 2. Styles for typography hierarchy classes (e.g. .mat-headline-1) +// If you specify typography styles for the components you use elsewhere, you should delete this line. +// If you don't need the default component typographies but still want the hierarchy styles, +// you can delete this line and instead use: +// `@include mat.legacy-typography-hierarchy(mat.define-legacy-typography-config());` +@include mat.all-legacy-component-typographies(); +@include mat.legacy-core(); // Include theme styles for core and each component used in your app. // Alternatively, you can import and @include the theme mixins for each component // that you are using. -@include mat.all-component-themes($dockstore-app-theme); +@include mat.all-legacy-component-themes($dockstore-app-theme); diff --git a/src/test.ts b/src/test.ts index d77de9c296..c15fcefff3 100644 --- a/src/test.ts +++ b/src/test.ts @@ -6,7 +6,6 @@ import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; // Unfortunately there's no typing for the `__karma__` variable. Just declare it as any. declare var __karma__: any; -declare var require: any; // Prevent Karma from running prematurely. __karma__.loaded = function () {}; @@ -15,9 +14,5 @@ __karma__.loaded = function () {}; getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting(), { teardown: { destroyAfterEach: false }, }); -// Then we find all the tests. -const context = require.context('./', true, /\.spec\.ts$/); -// And load the modules. -context.keys().map(context); // Finally, start Karma to run the tests. __karma__.start(); diff --git a/src/tsconfig.spec.json b/src/tsconfig.spec.json index 2cea88361a..c7bf5a2549 100644 --- a/src/tsconfig.spec.json +++ b/src/tsconfig.spec.json @@ -5,6 +5,5 @@ "baseUrl": "./", "types": ["jasmine", "node"] }, - "files": ["test.ts", "polyfills.ts"], "include": ["**/*.spec.ts", "**/*.d.ts"] } diff --git a/tsconfig.json b/tsconfig.json index 4f2c17478f..aa5a1095ae 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "moduleResolution": "node", "emitDecoratorMetadata": true, "experimentalDecorators": true, - "target": "es2020", + "target": "ES2020", "typeRoots": [ "node_modules/@types" ], @@ -22,7 +22,8 @@ "jszip": [ "../node_modules/jszip/dist/jszip.min.js" ] - } + }, + "useDefineForClassFields": false }, "angularCompilerOptions": { "skipTemplateCodegen": false, From f9fa7d81e9ef7cb50db476d6c967de26eb6e01e9 Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Thu, 22 Feb 2024 12:52:53 -0800 Subject: [PATCH 17/98] ChromeDriver Fix (#1937) SEAB-6272 --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 21bf1d81f5..c952195df3 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ orbs: aws-s3: circleci/aws-s3@3.0.0 aws-cli: circleci/aws-cli@3.1.1 slack: circleci/slack@4.4.4 - browser-tools: circleci/browser-tools@1.4.6 + browser-tools: circleci/browser-tools@1.4.7 executors: integration_test_exec: # declares a reusable executor docker: From cf53e8c36c21bbe0d40a94ae46e3c1bc1382d545 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Thu, 29 Feb 2024 13:44:49 -0500 Subject: [PATCH 18/98] DOCK-2484: Keep original URL on Page Not Found (#1932) * keep original url during 404 error (organizations, collections, user pages) * fix double domain url bug in decodeURL * update entry path getter * keep original url during 404, remove getPageIndex * extend 404 condition to all base routes (ex. /notebooks, /services, /apptools) * test page not found from different routes * remove regex variables from error condition * simplify decodeURL * pr feedback * url resolver: make public, include in unit tests * revert test error * remove comment of deleted function --- .../e2e/immutableDatabaseTests/notfound.ts | 32 +++++++++++++++++++ src/app/container/container.component.ts | 22 +------------ ...e-organization-description.service.spec.ts | 8 ++++- .../state/collections.service.spec.ts | 3 +- .../state/collections.service.ts | 6 ++-- .../state/organization.service.spec.ts | 3 +- .../state/organization.service.ts | 6 ++-- .../register-organization.service.spec.ts | 2 ++ src/app/shared/entry.ts | 20 +++--------- src/app/shared/url-resolver.service.ts | 4 +++ src/app/user-page/user-page.component.ts | 7 ++-- src/app/workflow/workflow.component.ts | 18 ++--------- 12 files changed, 70 insertions(+), 61 deletions(-) diff --git a/cypress/e2e/immutableDatabaseTests/notfound.ts b/cypress/e2e/immutableDatabaseTests/notfound.ts index f226c6b15c..99671e2b4a 100644 --- a/cypress/e2e/immutableDatabaseTests/notfound.ts +++ b/cypress/e2e/immutableDatabaseTests/notfound.ts @@ -22,5 +22,37 @@ describe('Dockstore not found page', () => { cy.visit('/bewareoftheleopard'); cy.contains("Don't panic."); cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/bewareoftheleopard'); + + cy.visit('/workflows/asdf'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/workflows/asdf'); + + cy.visit('/organizations/abcdefg'); + cy.url().should('eq', Cypress.config().baseUrl + '/organizations/abcdefg'); + + cy.visit('/users/notarealuser'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/users/notarealuser'); + + cy.visit('/notebooks/github.con/entrywithtypo'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/notebooks/github.con/entrywithtypo'); + + cy.visit('/services/github.com/invalidentrypath'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/services/github.com/invalidentrypath'); + + cy.visit('/apptools/ghjkl'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/apptools/ghjkl'); + + cy.visit('/containers/thistooldoesnotexist'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/containers/thistooldoesnotexist'); + + cy.visit('/tools/lmnop'); + cy.contains('Page Not Found'); + cy.url().should('eq', Cypress.config().baseUrl + '/tools/lmnop'); }); }); diff --git a/src/app/container/container.component.ts b/src/app/container/container.component.ts index d6a7c0ee56..81f99b6d2e 100644 --- a/src/app/container/container.component.ts +++ b/src/app/container/container.component.ts @@ -261,7 +261,7 @@ export class ContainerComponent extends Entry implements AfterViewInit, OnI }, (error) => { if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); @@ -351,26 +351,6 @@ export class ContainerComponent extends Entry implements AfterViewInit, OnI } } - /** - * Will change the /tools in the current URL with /containers - * @return {void} - */ - switchToolsToContainers(): void { - const url = window.location.href.replace('/tools', '/containers'); - const toolsIndex = window.location.href.indexOf('/tools'); - const newPath = url.substring(toolsIndex); - this.location.go(newPath); - } - - getPageIndex(): number { - let pageIndex = this.getIndexInURL('/containers'); - if (pageIndex === -1) { - pageIndex = this.getIndexInURL('/tools'); - this.switchToolsToContainers(); - } - return pageIndex; - } - addToLabels(event: MatChipInputEvent): void { const input = event.input; const value = event.value; diff --git a/src/app/organizations/organization/state/update-organization-description.service.spec.ts b/src/app/organizations/organization/state/update-organization-description.service.spec.ts index ba7145b6f5..ec6fbc0b7b 100644 --- a/src/app/organizations/organization/state/update-organization-description.service.spec.ts +++ b/src/app/organizations/organization/state/update-organization-description.service.spec.ts @@ -6,13 +6,19 @@ import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/ import { RouterTestingModule } from '@angular/router/testing'; import { UpdateOrganizationOrCollectionDescriptionService } from './update-organization-description.service'; import { UpdateOrganizationOrCollectionDescriptionStore } from './update-organization-description.store'; +import { UrlResolverService } from '../../../shared/url-resolver.service'; describe('UpdateOrganizationOrcolelctionDescriptionService', () => { let updateOrganizationOrCollectionDescriptionService: UpdateOrganizationOrCollectionDescriptionService; beforeEach(() => { TestBed.configureTestingModule({ - providers: [UpdateOrganizationOrCollectionDescriptionService, UpdateOrganizationOrCollectionDescriptionStore, UntypedFormBuilder], + providers: [ + UpdateOrganizationOrCollectionDescriptionService, + UpdateOrganizationOrCollectionDescriptionStore, + UntypedFormBuilder, + UrlResolverService, + ], imports: [HttpClientTestingModule, RouterTestingModule, MatDialogModule, MatSnackBarModule], }); diff --git a/src/app/organizations/state/collections.service.spec.ts b/src/app/organizations/state/collections.service.spec.ts index 64afe1f784..f487d7d87a 100644 --- a/src/app/organizations/state/collections.service.spec.ts +++ b/src/app/organizations/state/collections.service.spec.ts @@ -5,13 +5,14 @@ import { RouterTestingModule } from '@angular/router/testing'; import { CustomMaterialModule } from '../../shared/modules/material.module'; import { CollectionsService } from './collections.service'; import { CollectionsStore } from './collections.store'; +import { UrlResolverService } from '../../shared/url-resolver.service'; describe('CollectionsService', () => { let collectionsService: CollectionsService; beforeEach(() => { TestBed.configureTestingModule({ - providers: [CollectionsService, CollectionsStore], + providers: [CollectionsService, CollectionsStore, UrlResolverService], imports: [HttpClientTestingModule, CustomMaterialModule, RouterTestingModule], }); diff --git a/src/app/organizations/state/collections.service.ts b/src/app/organizations/state/collections.service.ts index ee1d2bb898..70d8b3e162 100644 --- a/src/app/organizations/state/collections.service.ts +++ b/src/app/organizations/state/collections.service.ts @@ -25,6 +25,7 @@ import { CollectionsQuery } from './collections.query'; import { CollectionsStore } from './collections.store'; import { OrganizationQuery } from './organization.query'; import { OrganizationService } from './organization.service'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Injectable({ providedIn: 'root' }) export class CollectionsService { @@ -36,7 +37,8 @@ export class CollectionsService { private organizationStore: OrganizationQuery, private collectionsQuery: CollectionsQuery, private matDialog: MatDialog, - private router: Router + private router: Router, + public urlResolverService: UrlResolverService ) {} clearState() { @@ -102,7 +104,7 @@ export class CollectionsService { (error: HttpErrorResponse) => { this.collectionsStore.setError(true); if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); diff --git a/src/app/organizations/state/organization.service.spec.ts b/src/app/organizations/state/organization.service.spec.ts index 9b27d1cf18..d20ed5ca3b 100644 --- a/src/app/organizations/state/organization.service.spec.ts +++ b/src/app/organizations/state/organization.service.spec.ts @@ -21,6 +21,7 @@ import { Routes } from '@angular/router'; import { RouterTestingModule } from '@angular/router/testing'; import { OrganizationService } from './organization.service'; import { OrganizationStore } from './organization.store'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Component({ template: ` `, @@ -34,7 +35,7 @@ describe('OrganizationService', () => { beforeEach(() => { TestBed.configureTestingModule({ declarations: [OrganizationsComponent], - providers: [OrganizationService, OrganizationStore], + providers: [OrganizationService, OrganizationStore, UrlResolverService], imports: [HttpClientTestingModule, MatSnackBarModule, RouterTestingModule.withRoutes(MOCK_ORGANIZATIONS_ROUTES)], }); diff --git a/src/app/organizations/state/organization.service.ts b/src/app/organizations/state/organization.service.ts index c8b4be009a..1532a4936e 100644 --- a/src/app/organizations/state/organization.service.ts +++ b/src/app/organizations/state/organization.service.ts @@ -21,6 +21,7 @@ import { OrganizationMembersService } from './organization-members.service'; import { OrganizationStore } from './organization.store'; import { Router } from '@angular/router'; import { HttpHeaderResponse } from '@angular/common/http'; +import { UrlResolverService } from '../../shared/url-resolver.service'; @Injectable({ providedIn: 'root' }) export class OrganizationService { @@ -28,7 +29,8 @@ export class OrganizationService { private organizationStore: OrganizationStore, private organizationsService: OrganizationsService, private organizationMembersService: OrganizationMembersService, - private router: Router + private router: Router, + public urlResolverService: UrlResolverService ) {} clearState(): void { @@ -84,7 +86,7 @@ export class OrganizationService { (error: HttpHeaderResponse) => { this.organizationStore.setError(true); if (error.status === 404) { - this.router.navigate(['page-not-found']); + this.urlResolverService.showPageNotFound(); } } ); diff --git a/src/app/organizations/state/register-organization.service.spec.ts b/src/app/organizations/state/register-organization.service.spec.ts index 4076c3257b..ff79609c35 100644 --- a/src/app/organizations/state/register-organization.service.spec.ts +++ b/src/app/organizations/state/register-organization.service.spec.ts @@ -9,6 +9,7 @@ import { of as observableOf, throwError } from 'rxjs'; import { UntypedFormBuilder } from '@angular/forms'; import { OrganizationsService } from '../../shared/openapi'; import { RegisterOrganizationService } from './register-organization.service'; +import { UrlResolverService } from '../../shared/url-resolver.service'; let organizationsServiceSpy: jasmine.SpyObj; let matDialogSpy: jasmine.SpyObj; @@ -23,6 +24,7 @@ describe('RegisterOrganizationService', () => { providers: [ RegisterOrganizationService, UntypedFormBuilder, + UrlResolverService, { provide: OrganizationsService, useValue: organizationsServiceStub }, { provide: MatDialog, useValue: matDialogStub }, ], diff --git a/src/app/shared/entry.ts b/src/app/shared/entry.ts index 2975ebadce..fc2bf80b3e 100644 --- a/src/app/shared/entry.ts +++ b/src/app/shared/entry.ts @@ -412,11 +412,9 @@ export abstract class Entry implements OnDestro * Will decode the URL * @return {void} */ - decodeURL(type: string): void { - const url = decodeURIComponent(window.location.href); - const containersIndex = this.getIndexInURL('/' + type); - const newPath = url.substring(containersIndex); - this.location.replaceState(newPath); + decodeURL(): void { + const url = decodeURIComponent(window.location.pathname); + this.location.replaceState(url); } /** @@ -442,11 +440,7 @@ export abstract class Entry implements OnDestro redirectToCanonicalURL(myPage: string): void { if (this.getIndexInURL(myPage) === -1) { // Decode the URL - this.decodeURL(this._toolType); - - // Get index of /containers or /workflows - // TODO: Not sure why getPageIndex() returns anything, but does need to get called to change URL. - this.getPageIndex(); + this.decodeURL(); } } @@ -484,12 +478,6 @@ export abstract class Entry implements OnDestro })(); } - /** - * Gets the index of /containers or /workflows from the URL - * @return {number} - */ - abstract getPageIndex(): number; - /** * Go to the search page with a query preloaded * @param {string} searchValue Value to search for diff --git a/src/app/shared/url-resolver.service.ts b/src/app/shared/url-resolver.service.ts index e1a9b1bca5..3fee55b299 100644 --- a/src/app/shared/url-resolver.service.ts +++ b/src/app/shared/url-resolver.service.ts @@ -74,6 +74,10 @@ export class UrlResolverService { } } + public showPageNotFound(): void { + this.router.navigate(['page-not-found'], { skipLocationChange: true }); + } + private isEncoded(uri: string): boolean { if (uri) { return uri !== decodeURIComponent(uri); diff --git a/src/app/user-page/user-page.component.ts b/src/app/user-page/user-page.component.ts index d0a7907c6d..a73bfd93c3 100644 --- a/src/app/user-page/user-page.component.ts +++ b/src/app/user-page/user-page.component.ts @@ -13,6 +13,7 @@ import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { UserQuery } from '../shared/user/user.query'; import { Base } from '../shared/base'; import { AccountInfo } from '../loginComponents/accounts/external/accounts.component'; +import { UrlResolverService } from '../shared/url-resolver.service'; @Component({ selector: 'app-user-page', @@ -37,7 +38,8 @@ export class UserPageComponent extends Base implements OnInit { private activatedRoute: ActivatedRoute, private router: Router, private alertService: AlertService, - private userQuery: UserQuery + private userQuery: UserQuery, + public urlResolverService: UrlResolverService ) { super(); } @@ -67,7 +69,8 @@ export class UserPageComponent extends Base implements OnInit { }, (error: HttpErrorResponse) => { this.alertService.detailedError(error); - this.router.navigateByUrl('/page-not-found'); //redirects to Page Not Found if user doesn't exist or another error occurs; + // Redirects to Page Not Found if user doesn't exist or another error occurs + this.urlResolverService.showPageNotFound(); } ); } diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 3fa97dd054..1e9d888fce 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -398,15 +398,8 @@ export class WorkflowComponent extends Entry implements AfterVi this.updateWorkflowUrl(this.workflow); }, (error) => { - const workflowOrgRegex = /\/workflows\/.+/; - const workflowRegex = /\/workflows\/(github.com)|(gitlab.com)|(bitbucket.org)\/.+/; - const gitHubAppToolRegex = /\/containers\/(github.com)\/.+/; - if ( - workflowOrgRegex.test(this.resourcePath) || - workflowRegex.test(this.resourcePath) || - gitHubAppToolRegex.test(this.resourcePath) - ) { - this.router.navigate(['page-not-found']); + if (!this.workflow) { + this.urlResolverService.showPageNotFound(); } else { this.showRedirect = true; // Retrieve the workflow path from the URL @@ -434,7 +427,7 @@ export class WorkflowComponent extends Entry implements AfterVi const entryPath = workflow.full_workflow_path; if (this.entryType === EntryType.BioWorkflow) { this.updateUrl(entryPath, myBioWorkflowsURLSegment, 'workflows', this.selectedVersion); - } else if (this.entryType === EntryType.Tool) { + } else if (this.entryType === EntryType.Tool || this.entryType === EntryType.AppTool) { this.updateUrl(entryPath, myToolsURLSegment, 'containers', this.selectedVersion); } else if (this.entryType === EntryType.Notebook) { this.updateUrl(entryPath, myNotebooksURLSegment, 'notebooks', this.selectedVersion); @@ -524,11 +517,6 @@ export class WorkflowComponent extends Entry implements AfterVi this.updateWorkflowUrl(this.workflow); } - getPageIndex(): number { - const pageIndex = this.getIndexInURL('/workflows'); - return pageIndex; - } - addToLabels(event: MatChipInputEvent): void { const input = event.input; const value = event.value; From 8a1faa120c58863192dfb7c0c2d4e181e0d296a3 Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Fri, 1 Mar 2024 09:19:37 -0500 Subject: [PATCH 19/98] Dynamic landing page & some tweaks (#1935) https://ucsc-cgl.atlassian.net/browse/SEAB-6109 * Dynamic landing page https://github.com/dockstore/dockstore/issues/5801 https://ucsc-cgl.atlassian.net/browse/DOCK-2509 * Landing page tweaks --- .../register-tool.component.html | 2 +- .../register-tool/register-tool.component.ts | 4 +- .../tool-file-editor.component.html | 6 +- .../tool-file-editor.component.ts | 3 +- .../github-callback.service.ts | 7 +- .../github-landing-page.component.html | 149 +++++++++--------- .../github-landing-page.component.scss | 28 ---- .../github-landing-page.component.ts | 24 ++- .../my-workflow/my-workflow.component.ts | 2 - src/app/myworkflows/myworkflows.service.ts | 21 ++- .../code-editor-list.component.ts | 4 +- .../code-editor/code-editor.component.ts | 24 ++- .../modules/register-github-app.module.ts | 2 + .../register-github-app.component.html | 12 +- .../register-github-app.component.spec.ts | 6 +- .../register-github-app.component.ts | 36 ++++- src/app/shared/session/session.query.ts | 23 --- .../register-github-app-modal.component.html | 2 +- .../register-github-app-modal.component.ts | 8 +- .../register-workflow-modal.component.html | 2 +- .../register-workflow-modal.component.ts | 5 +- .../workflow-file-editor.component.html | 4 +- .../workflow-file-editor.component.ts | 3 +- src/assets/text/sample-notebook-dockstore.yml | 11 ++ src/assets/text/sample-service-dockstore.yml | 22 +++ src/assets/text/sample-tool-dockstore.yml | 10 ++ src/assets/text/sample-workflow-dockstore.yml | 10 ++ 27 files changed, 249 insertions(+), 181 deletions(-) create mode 100644 src/assets/text/sample-notebook-dockstore.yml create mode 100644 src/assets/text/sample-service-dockstore.yml create mode 100644 src/assets/text/sample-tool-dockstore.yml create mode 100644 src/assets/text/sample-workflow-dockstore.yml diff --git a/src/app/container/register-tool/register-tool.component.html b/src/app/container/register-tool/register-tool.component.html index ebde07d712..7d585e3730 100644 --- a/src/app/container/register-tool/register-tool.component.html +++ b/src/app/container/register-tool/register-tool.component.html @@ -57,7 +57,7 @@

Register Tool

- +
; public isRefreshing$: Observable; - public gitHubAppInstallationLink$: Observable; public hostedTool: HostedTool = { path: '', registry: 'quay.io', @@ -166,7 +167,6 @@ export class RegisterToolComponent implements OnInit, AfterViewChecked, OnDestro ngOnInit() { this.loading$ = this.sessionQuery.loadingDialog$; - this.gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLandingPageLink$; this.registerToolService.toolRegisterError .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((toolRegisterError) => (this.toolRegisterError = toolRegisterError)); diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.html b/src/app/container/tool-file-editor/tool-file-editor.component.html index 9e776d3704..7d2cd394be 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.html +++ b/src/app/container/tool-file-editor/tool-file-editor.component.html @@ -22,7 +22,7 @@ [editing]="editing" [fileType]="'dockerfile'" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > @@ -42,7 +42,7 @@ [fileType]="'descriptor'" [descriptorType]="selectedDescriptorType" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > @@ -62,7 +62,7 @@ [fileType]="'testParam'" [descriptorType]="selectedDescriptorType" [selectedVersion]="currentVersion" - [entryType]="'tool'" + [entryType]="EntryType.TOOL" [entrypath]="entrypath" > diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.ts b/src/app/container/tool-file-editor/tool-file-editor.component.ts index 62e3702416..8e91564b93 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.ts @@ -16,7 +16,7 @@ import { Component, Input } from '@angular/core'; import { AlertService } from '../../shared/alert/state/alert.service'; import { FileEditing } from '../../shared/file-editing'; -import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor } from '../../shared/openapi'; +import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor, EntryType } from '../../shared/openapi'; import { ContainerService } from './../../shared/container.service'; import { HostedService } from './../../shared/openapi/api/hosted.service'; import { Tag } from './../../shared/openapi/model/tag'; @@ -27,6 +27,7 @@ import { Tag } from './../../shared/openapi/model/tag'; styleUrls: ['./tool-file-editor.component.scss'], }) export class ToolFileEditorComponent extends FileEditing { + public EntryType = EntryType; dockerFile: Array = []; descriptorFiles: Array = []; testParameterFiles: Array = []; diff --git a/src/app/github-callback/github-callback.service.ts b/src/app/github-callback/github-callback.service.ts index a504aba6f2..0dc2fe26f2 100644 --- a/src/app/github-callback/github-callback.service.ts +++ b/src/app/github-callback/github-callback.service.ts @@ -1,5 +1,6 @@ import { Injectable } from '@angular/core'; import { Params, Router } from '@angular/router'; +import { EntryType } from 'app/shared/enum/entry-type'; @Injectable({ providedIn: 'root', @@ -8,10 +9,10 @@ export class GithubCallbackService { constructor(private router: Router) {} public resolveQueryParam(queryParams: Params | null): void { if (queryParams) { - const state: string | null = queryParams.state; - this.router.navigateByUrl(state); + const entryTypeValue: EntryType | null = queryParams.state; + this.router.navigate(['/github-landing-page'], { queryParams: { entryType: entryTypeValue } }); } else { - this.router.navigateByUrl('/'); + this.router.navigateByUrl('/github-landing-page'); } } } diff --git a/src/app/github-landing-page/github-landing-page.component.html b/src/app/github-landing-page/github-landing-page.component.html index 0e59b3ca61..45fc1f31d4 100644 --- a/src/app/github-landing-page/github-landing-page.component.html +++ b/src/app/github-landing-page/github-landing-page.component.html @@ -14,82 +14,85 @@ ~ limitations under the License. --> -
-
-
-

Please wait while your GitHub repository installation is being processed. This may take a few minutes.

-
-
-

You can close this tab and return to Dockstore on the original tab.

+

+ Your GitHub repository installation is being processed. It may take a few minutes to register your {{ entryTypeMetadata.termPlural }}. +

+
+
+

You can close this tab and return to Dockstore on the original tab.

-
- - - Do you have a .dockstore.yml file in your repository? - - - -
- If you haven’t already, please create a .dockstore.yml file in your repository. This way, your workflows will be - kept up-to-date automatically.
+
+ + + Do you have a .dockstore.yml file in your repository? + + + +

+ If you haven’t already, please create a .dockstore.yml file in your repository. This way, your + {{ entryTypeMetadata.termPlural }} will be kept up-to-date automatically. +

+

Here is a .dockstore.yml template:

+
+ +
+

+ View more .dockstore.yml templates for {{ entryTypeMetadata.termPlural }} + here. +

+
+
- Here is the .dockstore.yml template: -
+ + + Tips and Tricks + -
-    version: 1.2
-    workflows:
-        - subclass: <CWL | WDL | NFL | GALAXY>
-          primaryDescriptorPath: <String>  # absolute path
-          testParameterFiles: <String Array>  # absolute path
-          readMePath: <String> # absolute path
-          authors:
-              - name: <String>
-                email: <String>
-          
+ -
- Note: the first line of this file references the version of .dockstore.yml syntax being used, not the version/tag - of the workflow/tool/service/notebook it describes -
- -
- - - - Tips and Tricks - - - - - -
    -
  • - Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml -
  • -
  • Put the .dockstore.yml file in the top of your repository or inside the .github/ directory
  • -
  • - The Dockstore Yaml Command Line Validator Tool can be used with the following command - in the Dockstore CLI, -
    dockstore yaml validate --path directory/of/.dockstore.yml
    -
  • -
  • - You can use a single .dockstore.yml file to register multiple tools, workflows, and notebooks, provided they are - all in the same repository as the .dockstore.yml file. If you do so, each one needs a unique name, it is - recommended to give each one a unique readMePath too. -
  • -
-
-
-
- + +
    +
  • + Make sure your file is saved as .dockstore.yml, not dockstore.yml nor .dockstore.yaml. +
  • +
  • Put the .dockstore.yml file in the top of your repository.
  • +
  • + The Dockstore Yaml Command Line Validator Tool can be used to validate the + .dockstore.yml. +
    dockstore yaml validate --path directory/of/.dockstore.yml
    +
  • +
  • + You can use a single .dockstore.yml file to register multiple {{ entryTypeMetadata.termPlural }}, provided they are + all in the same repository as the .dockstore.yml file. If you do so, each {{ entryTypeMetadata.term }} needs a + unique name. +
  • +
+

+ View more + Tips And Tricks + and + FAQs. +

+
+
+
diff --git a/src/app/github-landing-page/github-landing-page.component.scss b/src/app/github-landing-page/github-landing-page.component.scss index 873043df8f..6a8d7d32fc 100644 --- a/src/app/github-landing-page/github-landing-page.component.scss +++ b/src/app/github-landing-page/github-landing-page.component.scss @@ -1,37 +1,9 @@ -.cards-container { - padding: 2% 0; -} - -.landing-page-card { - margin-bottom: 2%; -} - -.header-container { - text-align: center; - position: relative; -} - -.back-button { - position: absolute; - bottom: 0.1em; - right: 10em; -} - mat-divider { position: relative !important; } -.landing-page-card-content { - width: 90%; - margin: auto; -} - .docs-link-text { text-align: center; font-size: 16px; color: black; } - -.landing-page-container { - align-items: center; -} diff --git a/src/app/github-landing-page/github-landing-page.component.ts b/src/app/github-landing-page/github-landing-page.component.ts index c1f8f55df9..bf1fdc26e2 100644 --- a/src/app/github-landing-page/github-landing-page.component.ts +++ b/src/app/github-landing-page/github-landing-page.component.ts @@ -1,11 +1,31 @@ -import { Component } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { ActivatedRoute, Params } from '@angular/router'; +import { takeUntil } from 'rxjs/operators'; +import { Base } from 'app/shared/base'; +import { EntryType, EntryTypeMetadata } from 'app/shared/openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; @Component({ selector: 'app-github-landing-page', templateUrl: './github-landing-page.component.html', styleUrls: ['./github-landing-page.component.scss'], }) -export class GithubLandingPageComponent { +export class GithubLandingPageComponent extends Base implements OnInit { Dockstore = Dockstore; + entryType: EntryType; + entryTypeMetadata: EntryTypeMetadata; + templateUrl: string; + + constructor(private activatedRoute: ActivatedRoute, private entryTypeMetadataService: EntryTypeMetadataService) { + super(); + } + + ngOnInit() { + this.activatedRoute.queryParams.pipe(takeUntil(this.ngUnsubscribe)).subscribe((params: Params) => { + this.entryType = params.entryType ? params.entryType : EntryType.WORKFLOW; + this.entryTypeMetadata = this.entryTypeMetadataService.get(this.entryType); + this.templateUrl = `${Dockstore.DOCUMENTATION_URL}/assets/templates/${this.entryTypeMetadata.termPlural}/${this.entryTypeMetadata.termPlural}.html`; + }); + } } diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts index 74050ba21a..6218093668 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts @@ -82,7 +82,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { public isRefreshing$: Observable; public showSidebar = true; hasSourceControlToken$: Observable; - public gitHubAppInstallationLink$: Observable; public groupEntriesObject$: Observable>>; public groupSharedEntriesObject$: Observable>>; public hasGroupSharedEntriesObject$: Observable; @@ -130,7 +129,6 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { ngOnInit() { this.myWorkflowsService.clearPartialState(); - this.gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLink$; this.tokenService.getGitHubOrganizations(); this.isRefreshing$ = this.alertQuery.showInfo$; /** diff --git a/src/app/myworkflows/myworkflows.service.ts b/src/app/myworkflows/myworkflows.service.ts index a13f13899f..2ceda97fca 100644 --- a/src/app/myworkflows/myworkflows.service.ts +++ b/src/app/myworkflows/myworkflows.service.ts @@ -22,22 +22,28 @@ import { AlertService } from 'app/shared/alert/state/alert.service'; import { includesAuthors, includesValidation, bootstrap4largeModalSize, includesMetrics } from 'app/shared/constants'; import { EntryType } from 'app/shared/enum/entry-type'; import { MyEntriesService } from 'app/shared/myentries.service'; -import { SessionQuery } from 'app/shared/session/session.query'; import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; import { WorkflowService } from 'app/shared/state/workflow.service'; -import { BioWorkflow, DockstoreTool, SharedWorkflows, UsersService, Workflow, WorkflowsService } from 'app/shared/openapi'; +import { + BioWorkflow, + DockstoreTool, + EntryType as OpenApiEntryType, + SharedWorkflows, + UsersService, + Workflow, + WorkflowsService, +} from 'app/shared/openapi'; import { UrlResolverService } from 'app/shared/url-resolver.service'; import { UserQuery } from 'app/shared/user/user.query'; import { RegisterWorkflowModalComponent } from 'app/workflow/register-workflow-modal/register-workflow-modal.component'; import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component'; -import { forkJoin, Observable, of as observableOf } from 'rxjs'; +import { forkJoin, of as observableOf } from 'rxjs'; import { catchError, finalize } from 'rxjs/operators'; import { OrgWorkflowObject } from './my-workflow/my-workflow.component'; import { Location } from '@angular/common'; @Injectable() export class MyWorkflowsService extends MyEntriesService> { - gitHubAppInstallationLink$: Observable; constructor( protected userQuery: UserQuery, protected alertService: AlertService, @@ -45,13 +51,11 @@ export class MyWorkflowsService extends MyEntriesService { if (reloadEntries) { const user = this.userQuery.getValue().user; diff --git a/src/app/shared/code-editor-list/code-editor-list.component.ts b/src/app/shared/code-editor-list/code-editor-list.component.ts index 22eb2c90af..8ca9f0c543 100644 --- a/src/app/shared/code-editor-list/code-editor-list.component.ts +++ b/src/app/shared/code-editor-list/code-editor-list.component.ts @@ -2,7 +2,7 @@ import { Component, Input } from '@angular/core'; import { Observable } from 'rxjs'; import { WorkflowQuery } from '../state/workflow.query'; -import { SourceFile } from '../openapi'; +import { EntryType, SourceFile } from '../openapi'; import { ToolDescriptor } from './../../shared/openapi/model/toolDescriptor'; import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; import { CodeEditorListService } from './code-editor-list.service'; @@ -20,7 +20,7 @@ export class CodeEditorListComponent { @Input() editing: boolean; @Input() fileType: FileCategory; @Input() descriptorType: ToolDescriptor.TypeEnum; - @Input() entryType: 'tool' | 'workflow'; + @Input() entryType: EntryType; @Input() entrypath: string; @Input() selectedVersion: WorkflowVersion; protected published$: Observable; diff --git a/src/app/shared/code-editor/code-editor.component.ts b/src/app/shared/code-editor/code-editor.component.ts index 56eff64963..f185c0726e 100644 --- a/src/app/shared/code-editor/code-editor.component.ts +++ b/src/app/shared/code-editor/code-editor.component.ts @@ -1,6 +1,8 @@ import { HttpClient } from '@angular/common/http'; import { AfterViewInit, Component, EventEmitter, Input, Output } from '@angular/core'; + import { ace } from './../grammars/custom-grammars.js'; +import { EntryType } from '../openapi/model/entryType'; let ACE_EDITOR_INSTANCE = 0; @@ -16,7 +18,7 @@ export class CodeEditorComponent implements AfterViewInit { editorFilepath: string; aceId: string; readOnly = true; - @Input() entryType: 'tool' | 'workflow'; + @Input() entryType: EntryType; @Input() set editing(value: boolean) { if (value !== undefined) { this.toggleReadOnly(!value); @@ -72,7 +74,9 @@ export class CodeEditorComponent implements AfterViewInit { this.editor.setValue(this.editorContent, cursorPos); } - this.editor.focus(); + if (!this.readOnly) { + this.editor.focus(); + } }; let sampleCodeUrl = ''; @@ -80,9 +84,9 @@ export class CodeEditorComponent implements AfterViewInit { // Load sample code by default when editing empty CWL/WDL/Nextflow files if (!this.editorContent) { if (this.mode === 'cwl') { - if (this.entryType === 'tool') { + if (this.entryType === EntryType.TOOL) { sampleCodeUrl = '../assets/text/sample-tool.cwl'; - } else if (this.entryType === 'workflow') { + } else if (this.entryType === EntryType.WORKFLOW) { sampleCodeUrl = '../assets/text/sample-workflow.cwl'; } } else if (this.mode === 'wdl') { @@ -91,11 +95,21 @@ export class CodeEditorComponent implements AfterViewInit { sampleCodeUrl = '../assets/text/sample.nf'; } else if (this.editorFilepath === '/nextflow.config') { sampleCodeUrl = '../assets/text/nextflow.config'; + } else if (this.mode === 'yaml') { + if (this.entryType === EntryType.WORKFLOW) { + sampleCodeUrl = '../assets/text/sample-workflow-dockstore.yml'; + } else if (this.entryType === EntryType.APPTOOL) { + sampleCodeUrl = '../assets/text/sample-tool-dockstore.yml'; + } else if (this.entryType === EntryType.NOTEBOOK) { + sampleCodeUrl = '../assets/text/sample-notebook-dockstore.yml'; + } else if (this.entryType === EntryType.SERVICE) { + sampleCodeUrl = '../assets/text/sample-service-dockstore.yml'; + } } } if (sampleCodeUrl) { const httpOptions: Object = { responseType: 'text' }; - this.httpClient.get(sampleCodeUrl, httpOptions).subscribe(setContent); + this.httpClient.get(sampleCodeUrl, httpOptions).subscribe((content: string) => setContent(content, this.readOnly ? -1 : 0)); } else { setContent(this.editorContent, -1); } diff --git a/src/app/shared/modules/register-github-app.module.ts b/src/app/shared/modules/register-github-app.module.ts index baa01204d7..4668b1e510 100644 --- a/src/app/shared/modules/register-github-app.module.ts +++ b/src/app/shared/modules/register-github-app.module.ts @@ -14,6 +14,7 @@ import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/materia import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; import { MatLegacyOptionModule as MatOptionModule } from '@angular/material/legacy-core'; import { ReactiveFormsModule } from '@angular/forms'; +import { EntryModule } from '../entry/entry.module'; @NgModule({ declarations: [RegisterGithubAppComponent, GithubLandingPageComponent], @@ -32,6 +33,7 @@ import { ReactiveFormsModule } from '@angular/forms'; MatInputModule, MatOptionModule, ReactiveFormsModule, + EntryModule, ], }) export class RegisterGithubAppModule {} diff --git a/src/app/shared/register-github-app/register-github-app.component.html b/src/app/shared/register-github-app/register-github-app.component.html index e568ba2a98..e06e53da0d 100644 --- a/src/app/shared/register-github-app/register-github-app.component.html +++ b/src/app/shared/register-github-app/register-github-app.component.html @@ -2,21 +2,21 @@
  1. Click the "Manage..." button below to install Dockstore's App on your GitHub repositories that contain {{ entryType }}s. The App - notifies Dockstore whenever the repositories change.Click the "Manage..." button below to install Dockstore's App on your GitHub repositories that contain + {{ entryTypeMetadata.term }}s. The App notifies Dockstore whenever the repositories change.
  2. - Describe your {{ entryType }}s by adding a + Describe your {{ entryTypeMetadata.term }}s by adding a .dockstore.yml to the root directory of the repositories where you installed the App.
  3. -
  4. Push your changes and wait two minutes for Dockstore to read your {{ entryType }}s.
  5. +
  6. Push your changes and wait two minutes for Dockstore to read your {{ entryTypeMetadata.term }}s.
  7. - Refresh your Dockstore dashboard to see your {{ entryType }}s. If they don't appear, click the dashboard's "{{ - entryType | titlecase + Refresh your Dockstore dashboard to see your {{ entryTypeMetadata.term }}s. If they don't appear, click the dashboard's "{{ + entryTypeMetadata.term | titlecase }}s" tile and click on the organization's "Apps Logs" button to see what went wrong.
diff --git a/src/app/shared/register-github-app/register-github-app.component.spec.ts b/src/app/shared/register-github-app/register-github-app.component.spec.ts index 8c32596848..46835f1c10 100644 --- a/src/app/shared/register-github-app/register-github-app.component.spec.ts +++ b/src/app/shared/register-github-app/register-github-app.component.spec.ts @@ -1,10 +1,12 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyCommonModule } from '@angular/material/legacy-core'; import { RegisterGithubAppComponent } from './register-github-app.component'; import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { EntryType } from '../openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { EntryTypeMetadataStubService } from 'app/test/service-stubs'; describe('RegisterGithubAppComponent', () => { let component: RegisterGithubAppComponent; @@ -19,11 +21,13 @@ describe('RegisterGithubAppComponent', () => { provide: MatDialogRef, useValue: {}, }, + { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, ], }).compileComponents(); fixture = TestBed.createComponent(RegisterGithubAppComponent); component = fixture.componentInstance; + component.entryType = EntryType.WORKFLOW; fixture.detectChanges(); }); diff --git a/src/app/shared/register-github-app/register-github-app.component.ts b/src/app/shared/register-github-app/register-github-app.component.ts index 7687d31680..146abdc4c2 100644 --- a/src/app/shared/register-github-app/register-github-app.component.ts +++ b/src/app/shared/register-github-app/register-github-app.component.ts @@ -1,9 +1,10 @@ import { Component, Input, OnInit } from '@angular/core'; -import { takeUntil } from 'rxjs/operators'; import { Base } from '../base'; import { Dockstore } from '../dockstore.model'; -import { SessionQuery } from '../session/session.query'; import { UserQuery } from '../user/user.query'; +import { HttpParams } from '@angular/common/http'; +import { EntryType, EntryTypeMetadata } from '../openapi'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; @Component({ selector: 'app-register-github-app', @@ -11,22 +12,41 @@ import { UserQuery } from '../user/user.query'; }) export class RegisterGithubAppComponent extends Base implements OnInit { public Dockstore = Dockstore; - public gitHubAppInstallationLink$ = this.sessionQuery.gitHubAppInstallationLandingPageLink$; public isUsernameChangeRequired$ = this.userQuery.isUsernameChangeRequired$; - @Input() public entryType: string; + public entryTypeMetadata: EntryTypeMetadata; + @Input() public entryType: EntryType; private gitHubAppInstallationLink: string; - constructor(private sessionQuery: SessionQuery, private userQuery: UserQuery) { + constructor(private userQuery: UserQuery, private entryTypeMetadataService: EntryTypeMetadataService) { super(); } ngOnInit(): void { - this.gitHubAppInstallationLink$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((gitHubAppInstallationLink) => (this.gitHubAppInstallationLink = gitHubAppInstallationLink)); + this.gitHubAppInstallationLink = this.generateGitHubAppInstallationUrl(this.entryType); + this.entryTypeMetadata = this.entryTypeMetadataService.get(this.entryType); } public openGitHubApp() { window.open(this.gitHubAppInstallationLink, '_blank', 'noopener,noreferrer'); } + + /** + * Generates a GitHub App installation URL that has a 'state' query parameter containing an entryType. + * + * The GitHub App installation link allows a 'state' query parameter that preserves the state of the application page + * and return users back to that state after they install the GitHub App. + * More details here https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app. + * + * The entryType is used as the 'state' so that users are redirected to the GitHub App landing page for the entryType they were registering. + * + * @param entryType Entry type to use as the 'state' query parameter in the installation URL + * @returns + */ + generateGitHubAppInstallationUrl(entryType: EntryType): string { + let queryParams = new HttpParams(); + // Can only provide a state query parameter + // https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app + queryParams = queryParams.set('state', entryType); + return Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new?' + queryParams.toString(); + } } diff --git a/src/app/shared/session/session.query.ts b/src/app/shared/session/session.query.ts index 340acbbfda..4efe29e96d 100644 --- a/src/app/shared/session/session.query.ts +++ b/src/app/shared/session/session.query.ts @@ -13,13 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { HttpParams } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { Query } from '@datorama/akita'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; -import { Dockstore } from '../dockstore.model'; import { EntryType } from '../enum/entry-type'; import { EntryType as OpenApiEntryType, EntryTypeMetadata } from 'app/shared/openapi'; import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; @@ -47,29 +45,8 @@ export class SessionQuery extends Query { isService$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Service)); isNotebook$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Notebook)); isTool$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Tool)); - gitHubAppInstallationLink$: Observable = this.entryType$.pipe( - map((entryType: EntryType) => (entryType ? this.generateGitHubAppInstallationUrl(this.route.url) : null)) - ); - gitHubAppInstallationLandingPageLink$: Observable = this.entryType$.pipe( - map((entryType: EntryType) => (entryType ? this.generateGitHubAppInstallationUrl('/github-landing-page') : null)) - ); loadingDialog$: Observable = this.select((session) => session.loadingDialog); constructor(protected store: SessionStore, private route: Router, private entryTypeMetadataService: EntryTypeMetadataService) { super(store); } - - /** - * Generate the general GitHub App installation URL - * - * @param {string} redirectPath The page to redirect to after installation is complete - * @returns {string} - * @memberof WorkflowQuery - */ - generateGitHubAppInstallationUrl(redirectPath: string): string { - let queryParams = new HttpParams(); - // Can only provide a state query parameter - // https://docs.github.com/en/apps/sharing-github-apps/sharing-your-github-app - queryParams = queryParams.set('state', redirectPath); - return Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new?' + queryParams.toString(); - } } diff --git a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html index cc689f7c2f..db7dc9eaa7 100644 --- a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html +++ b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.html @@ -1,5 +1,5 @@

Register {{ entryType | titlecase }}

- + Select an Execution Status @@ -59,7 +59,17 @@ > Metric - {{ executionMetric.metric }} + + {{ executionMetric.metric }} + info_outline + diff --git a/src/app/workflow/executions/executions-tab.component.ts b/src/app/workflow/executions/executions-tab.component.ts index 3714a87615..3c3af07918 100644 --- a/src/app/workflow/executions/executions-tab.component.ts +++ b/src/app/workflow/executions/executions-tab.component.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Component, Input, OnChanges } from '@angular/core'; +import { Component, Input, OnChanges, OnInit } from '@angular/core'; import { EntryTab } from '../../shared/entry/entry-tab'; import { CloudInstance, @@ -34,6 +34,8 @@ import PartnerEnum = CloudInstance.PartnerEnum; import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; import { AlertService } from '../../shared/alert/state/alert.service'; +import { UserQuery } from 'app/shared/user/user.query'; +import { combineLatest } from 'rxjs'; interface ExecutionMetricsTableObject { metric: string; // Name of the execution metric @@ -47,7 +49,7 @@ interface ExecutionMetricsTableObject { selector: 'app-executions-tab', templateUrl: './executions-tab.component.html', }) -export class ExecutionsTabComponent extends EntryTab implements OnChanges { +export class ExecutionsTabComponent extends EntryTab implements OnInit, OnChanges { metrics: Map; trsID: string; currentPartner: PartnerEnum; @@ -80,6 +82,7 @@ export class ExecutionsTabComponent extends EntryTab implements OnChanges { currentValidatorTool: string; validatorTools: string[]; validatorToolMetricsExist: boolean; + isAdminCuratorOrPlatformPartner: boolean; @Input() entry: BioWorkflow | Service | Notebook; @Input() version: WorkflowVersion; @@ -87,11 +90,20 @@ export class ExecutionsTabComponent extends EntryTab implements OnChanges { constructor( private extendedGA4GHService: ExtendedGA4GHService, private alertService: AlertService, + private userQuery: UserQuery, protected sessionQuery: SessionQuery ) { super(); } + ngOnInit(): void { + combineLatest([this.userQuery.isAdminOrCurator$, this.userQuery.isPlatformPartner$]) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe(([isAdminOrCurator, isPlatformPartner]) => { + this.isAdminCuratorOrPlatformPartner = isAdminOrCurator || isPlatformPartner; + }); + } + ngOnChanges() { this.resetMetricsData(); if (this.version) { From afaff1f3853f955d51562a11f5ad0296a608d5ce Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 11 Mar 2024 14:11:05 -0400 Subject: [PATCH 21/98] Bump browserify-sign from 4.2.1 to 4.2.2 (#1862) Bumps [browserify-sign](https://github.com/crypto-browserify/browserify-sign) from 4.2.1 to 4.2.2. - [Changelog](https://github.com/browserify/browserify-sign/blob/main/CHANGELOG.md) - [Commits](https://github.com/crypto-browserify/browserify-sign/compare/v4.2.1...v4.2.2) --- updated-dependencies: - dependency-name: browserify-sign dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 51 +++++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 24 deletions(-) diff --git a/package-lock.json b/package-lock.json index 03127ccace..62ca0a9dc1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8216,20 +8216,23 @@ } }, "node_modules/browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "dependencies": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" + }, + "engines": { + "node": ">= 4" } }, "node_modules/browserify-sign/node_modules/safe-buffer": { @@ -18905,9 +18908,9 @@ } }, "node_modules/readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "dependencies": { "inherits": "^2.0.3", @@ -29695,20 +29698,20 @@ } }, "browserify-sign": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.1.tgz", - "integrity": "sha512-/vrA5fguVAKKAVTNJjgSm1tRQDHUU6DbwO9IROu/0WAzC8PKhucDSh18J0RMvVeHAn5puMd+QHC2erPRNf8lmg==", + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.2.2.tgz", + "integrity": "sha512-1rudGyeYY42Dk6texmv7c4VcQ0EsvVbLwZkA+AQB7SxvXxmcD93jcHie8bzecJ+ChDlmAm2Qyu0+Ccg5uhZXCg==", "dev": true, "requires": { - "bn.js": "^5.1.1", - "browserify-rsa": "^4.0.1", + "bn.js": "^5.2.1", + "browserify-rsa": "^4.1.0", "create-hash": "^1.2.0", "create-hmac": "^1.1.7", - "elliptic": "^6.5.3", + "elliptic": "^6.5.4", "inherits": "^2.0.4", - "parse-asn1": "^5.1.5", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "parse-asn1": "^5.1.6", + "readable-stream": "^3.6.2", + "safe-buffer": "^5.2.1" }, "dependencies": { "safe-buffer": { @@ -37917,9 +37920,9 @@ } }, "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", + "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", "dev": true, "requires": { "inherits": "^2.0.3", From ee3090d90bc6ff62544aa55851e3e6f990cb520b Mon Sep 17 00:00:00 2001 From: Nayeon Hyun <61166764+hyunnaye@users.noreply.github.com> Date: Wed, 13 Mar 2024 12:12:53 -0400 Subject: [PATCH 22/98] SEAB-5910: Allow AI topics to be shown in UI search page and entry page (#1939) * ai topic sentence ui initial * figuring out test [skip ci] * figuring out test [skip ci] * figuring out test [skip ci] * ai test * tool badge * fixed search * get new index * fixing unit test issue * tooltip message edit * svg * pr review * moved bubble to a new component * pr review' * pr review' * pr review' * copyright --- cypress/e2e/group2/myworkflows.ts | 13 ++ cypress/fixtures/workflowWithTopicAI.json | 156 ++++++++++++++++++ .../info-tab/info-tab.component.html | 13 +- src/app/search/query-builder.service.ts | 1 + .../search-notebook-table.component.html | 5 +- .../search-notebook-table.component.ts | 5 +- .../search-tool-table.component.html | 10 +- .../search-tool-table.component.ts | 2 + .../search-workflow-table.component.html | 10 +- .../search-workflow-table.component.ts | 2 + src/app/search/search.module.ts | 4 + .../shared/ai-bubble/ai-bubble.component.html | 15 ++ .../shared/ai-bubble/ai-bubble.component.ts | 39 +++++ src/app/shared/ai-bubble/ai-bubble.module.ts | 14 ++ src/app/shared/modules/container.module.ts | 2 + src/app/shared/modules/workflow.module.ts | 2 + .../workflow/info-tab/info-tab.component.html | 20 ++- src/assets/svg/ai-icon.svg | 1 + src/styles.scss | 10 ++ 19 files changed, 303 insertions(+), 21 deletions(-) create mode 100644 cypress/fixtures/workflowWithTopicAI.json create mode 100644 src/app/shared/ai-bubble/ai-bubble.component.html create mode 100644 src/app/shared/ai-bubble/ai-bubble.component.ts create mode 100644 src/app/shared/ai-bubble/ai-bubble.module.ts create mode 100644 src/assets/svg/ai-icon.svg diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 28829b2e9c..56ee22a45e 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -611,6 +611,19 @@ describe('Version Dropdown should have search capabilities', () => { cy.get('mat-option').should('not.contain', 'master'); cy.get('mat-option').should('contain', 'test').should('be.visible'); }); + it('Test AI topic sentences', () => { + cy.fixture('workflowWithTopicAI.json').then((json) => { + cy.intercept('GET', '/api/workflows/11*', { + body: json, + statusCode: 200, + }).as('request'); + }); + + cy.visit('/my-workflows'); + cy.get('[data-cy=topic-ai-selection-button]').should('be.visible'); + cy.get('[data-cy=topicAI-text]').should('contain.text', 'test AI topic sentence'); + cy.get('[data-cy=ai-bubble]').should('be.visible'); + }); }); describe('Should handle no workflows correctly', () => { resetDB(); diff --git a/cypress/fixtures/workflowWithTopicAI.json b/cypress/fixtures/workflowWithTopicAI.json new file mode 100644 index 0000000000..7023a81b02 --- /dev/null +++ b/cypress/fixtures/workflowWithTopicAI.json @@ -0,0 +1,156 @@ +{ + "type": "BioWorkflow", + "descriptorType": "CWL", + "aliases": {}, + "author": null, + "checker_id": null, + "conceptDoi": null, + "dbCreateDate": 1465419996000, + "dbUpdateDate": 1465419996000, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "description": null, + "descriptorTypeSubclass": "NOT_APPLICABLE", + "email": null, + "full_workflow_path": "github.com/A/l", + "gitUrl": "git@github.com:A/l.git", + "has_checker": false, + "id": 11, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1480374057688, + "last_modified": null, + "last_modified_date": null, + "mode": "FULL", + "organization": "A", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/A/l", + "repository": "l", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topicId": 1234, + "topicAutomatic": null, + "topicManual": null, + "topicAI": "test AI topic sentence", + "topicSelection": "AI", + "users": [ + { + "avatarUrl": null, + "curator": true, + "id": 1, + "isAdmin": true, + "name": "user_A", + "orcid": null, + "privacyPolicyVersion": "PRIVACY_POLICY_VERSION_2_5", + "privacyPolicyVersionAcceptanceDate": null, + "setupComplete": false, + "tosacceptanceDate": null, + "tosversion": "TOS_VERSION_1", + "userProfiles": null, + "username": "user_A" + } + ], + "workflowName": null, + "workflowVersions": [ + { + "aliases": null, + "author": null, + "commitID": null, + "dbUpdateDate": 1480374119003, + "description": null, + "descriptionSource": null, + "dirtyBit": false, + "doiStatus": "NOT_REQUESTED", + "doiURL": null, + "email": null, + "frozen": false, + "hidden": false, + "id": 13, + "images": null, + "input_file_formats": [], + "last_modified": 1480374117003, + "legacyVersion": true, + "name": "master", + "output_file_formats": [], + "reference": "master", + "referenceType": "UNSET", + "sourceFiles": [ + { + "absolutePath": "/1st-workflow.cwl", + "checksums": null, + "content": "cwlVersion: v1.0\nclass: Workflow\ninputs:\n inp: File\n ex: string\n\noutputs:\n classout:\n type: File\n outputSource: compile/classfile\n\nsteps:\n untar:\n run: tar-param.cwl\n in:\n tarfile: inp\n extractfile: ex\n out: [example_out]\n\n compile:\n run: arguments.cwl\n in:\n src: untar/example_out\n out: [classfile]\n\n wrkflow:\n run: grep-and-count.cwl\n in:\n infiles: inp\n pattern: \"hello\"\n out: [outfile]\n", + "frozen": false, + "id": 28, + "path": "/1st-workflow.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + }, + { + "absolutePath": "/arguments.cwl", + "checksums": null, + "content": "cwlVersion: v1.0\nclass: CommandLineTool\nlabel: Example trivial wrapper for Java 7 compiler\nbaseCommand: javac\nhints:\n - DockerRequirement:\n dockerPull: java:7\nbaseCommand: javac\narguments: [\"-d\", $(runtime.outdir)]\ninputs:\n src:\n type: File\n inputBinding:\n position: 1\noutputs:\n classfile:\n type: File\n outputBinding:\nglob: \"*.class\"\n", + "frozen": false, + "id": 31, + "path": "arguments.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + }, + { + "absolutePath": "/grep-and-count.cwl", + "checksums": null, + "content": "class: Workflow\ncwlVersion: v1.0\n\nrequirements:\n - class: ScatterFeatureRequirement\n - class: DockerRequirement\n dockerPull: java:7\n\ninputs:\n pattern: string\n infiles: File[]\n\noutputs:\n outfile:\n type: File\n outputSource: wc/outfile\n\nsteps:\n grep:\n run: grep.cwl\n in:\n pattern: pattern\n infile: infiles\n scatter: infile\n out: [outfile]\n\n wc:\n run: wc.cwl\n in:\n infiles: grep/outfile\nout: [outfile]\n", + "frozen": false, + "id": 27, + "path": "grep-and-count.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + }, + { + "absolutePath": "/grep.cwl", + "checksums": null, + "content": "#!/usr/bin/env cwl-runner\nclass: CommandLineTool\ncwlVersion: v1.0\n\ninputs:\n pattern:\n type: string\n inputBinding: {position: 0}\n infile:\n type: File\n inputBinding: {position: 1}\n\noutputs:\n outfile:\n type: stdout\n\nbaseCommand: grep\n", + "frozen": false, + "id": 29, + "path": "grep.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + }, + { + "absolutePath": "/tar-param.cwl", + "checksums": null, + "content": "cwlVersion: v1.0\nclass: CommandLineTool\nbaseCommand: [tar, xf]\ninputs:\n tarfile:\n type: File\n inputBinding:\n position: 1\n extractfile:\n type: string\n inputBinding:\n position: 2\noutputs:\n example_out:\n type: File\n outputBinding:\nglob: $(inputs.extractfile)\n", + "frozen": false, + "id": 32, + "path": "tar-param.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + }, + { + "absolutePath": "/wc.cwl", + "checksums": null, + "content": "#!/usr/bin/env cwl-runner\nclass: CommandLineTool\ncwlVersion: v1.0\n\ninputs:\n infiles:\n type: File[]\n inputBinding: {position: 1}\n\noutputs:\n outfile:\n type: stdout\n\nbaseCommand: [wc, -l]\n", + "frozen": false, + "id": 30, + "path": "wc.cwl", + "type": "DOCKSTORE_CWL", + "verifiedBySource": {} + } + ], + "subClass": null, + "userIdToOrcidPutCode": {}, + "valid": true, + "validations": null, + "verified": false, + "verifiedSource": null, + "verifiedSources": [], + "versionEditor": null, + "workflow_path": "/1st-workflow.cwl", + "workingDirectory": "" + } + ], + "workflow_path": "/1st-workflow.cwl" +} diff --git a/src/app/container/info-tab/info-tab.component.html b/src/app/container/info-tab/info-tab.component.html index 87a2f99f16..d81ba31cea 100644 --- a/src/app/container/info-tab/info-tab.component.html +++ b/src/app/container/info-tab/info-tab.component.html @@ -267,7 +267,12 @@
  • Topic - {{ tool?.topicSelection === TopicSelectionEnum.AUTOMATIC ? tool?.topicAutomatic : tool?.topicManual }} + {{ tool?.topicAutomatic }} + {{ tool?.topicManual }} + + {{ tool?.topicAI }} + +
  • @@ -275,6 +280,11 @@ Topic Automatic {{ tool?.topicAutomatic }} +
  • + AI Generated Topic + {{ tool?.topicAI }} + +
  • @@ -333,6 +343,7 @@ > Automatic Manual + AI Generated
  • diff --git a/src/app/search/query-builder.service.ts b/src/app/search/query-builder.service.ts index e08d65bd83..a6f0ddcbd4 100644 --- a/src/app/search/query-builder.service.ts +++ b/src/app/search/query-builder.service.ts @@ -92,6 +92,7 @@ export class QueryBuilderService { 'toolname', 'tool_path', 'topicAutomatic', + 'topicSelection', 'verified', 'workflowName', ]); diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index c0197c2f5a..21884e9a10 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -13,8 +13,9 @@ notebook?.source.repository + (notebook?.source.workflowName ? '/' + notebook?.source.workflowName : '') }} -
    - {{ notebook.source.topicAutomatic }} +
    + {{ notebook?.source.topicAutomatic }} +
    diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.ts b/src/app/search/search-notebook-table/search-notebook-table.component.ts index 805c425647..4b6ece0c8e 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.ts @@ -17,10 +17,11 @@ import { Component, OnInit } from '@angular/core'; import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; -import { Notebook } from '../../shared/openapi'; +import { Notebook, Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** * this component refers to search page not notebook listing search @@ -42,4 +43,6 @@ export class SearchNotebookTableComponent extends SearchEntryTable implements On privateNgOnInit(): Observable>> { return this.searchQuery.notebooks$; } + + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 1918c03968..4799add298 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -44,13 +44,9 @@ tool?.source.namespace + '/' + tool?.source.name + (tool?.source.toolname ? '/' + tool?.source.toolname : '') }} -
    - {{ tool.source.topicAutomatic }} +
    + {{ tool?.source.topicAutomatic }} +
    diff --git a/src/app/search/search-tool-table/search-tool-table.component.ts b/src/app/search/search-tool-table/search-tool-table.component.ts index c04236b3ea..c24b05fe07 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.ts +++ b/src/app/search/search-tool-table/search-tool-table.component.ts @@ -6,6 +6,7 @@ import { AppTool, DockstoreTool } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import TopicSelectionEnum = DockstoreTool.TopicSelectionEnum; /** * this component refers to search page not tool listing search @@ -26,4 +27,5 @@ export class SearchToolTableComponent extends SearchEntryTable implements OnInit privateNgOnInit(): Observable>> { return this.searchQuery.tools$; } + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index a494fde3fc..e849dff30a 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -18,13 +18,9 @@ (workflow?.source.workflowName ? '/' + workflow?.source.workflowName : '') }} -
    - {{ workflow.source.topicAutomatic }} +
    + {{ workflow?.source.topicAutomatic }} +
    diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.ts b/src/app/search/search-workflow-table/search-workflow-table.component.ts index 5b0e9149c9..0115b5f121 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.ts +++ b/src/app/search/search-workflow-table/search-workflow-table.component.ts @@ -21,6 +21,7 @@ import { Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** * this component refers to search page not workflow listing search @@ -41,4 +42,5 @@ export class SearchWorkflowTableComponent extends SearchEntryTable implements On privateNgOnInit(): Observable>> { return this.searchQuery.workflows$; } + protected readonly TopicSelectionEnum = TopicSelectionEnum; } diff --git a/src/app/search/search.module.ts b/src/app/search/search.module.ts index d2cd344866..c47c3b1c0a 100644 --- a/src/app/search/search.module.ts +++ b/src/app/search/search.module.ts @@ -43,6 +43,9 @@ import { SearchService } from './state/search.service'; import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; import { JoinWithEllipsesPipe } from './join-with-ellipses.pipe'; +import { AiBubbleComponent } from '../shared/ai-bubble/ai-bubble.component'; +import { AppModule } from '../app.module'; +import { AiBubbleModule } from '../shared/ai-bubble/ai-bubble.module'; @NgModule({ declarations: [ @@ -73,6 +76,7 @@ import { JoinWithEllipsesPipe } from './join-with-ellipses.pipe'; SnackbarModule, TagCloudComponent, PreviewWarningModule, + AiBubbleModule, ], providers: [SearchService, QueryBuilderService, SearchAuthorsHtmlPipe, JoinWithEllipsesPipe], exports: [SearchComponent, IsAppToolPipe], diff --git a/src/app/shared/ai-bubble/ai-bubble.component.html b/src/app/shared/ai-bubble/ai-bubble.component.html new file mode 100644 index 0000000000..d27b99aafa --- /dev/null +++ b/src/app/shared/ai-bubble/ai-bubble.component.html @@ -0,0 +1,15 @@ + + AI generation icon + AI + diff --git a/src/app/shared/ai-bubble/ai-bubble.component.ts b/src/app/shared/ai-bubble/ai-bubble.component.ts new file mode 100644 index 0000000000..fce9fce6af --- /dev/null +++ b/src/app/shared/ai-bubble/ai-bubble.component.ts @@ -0,0 +1,39 @@ +/* + * Copyright 2024 OICR, UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { Component, Input, OnInit } from '@angular/core'; +import { Dockstore } from '../dockstore.model'; + +/** + * Component for the AI generated indicator. + * + * @export + * @class AiBubbleComponent + * @implements {OnInit} + */ +@Component({ + selector: 'app-ai-bubble', + templateUrl: './ai-bubble.component.html', +}) +export class AiBubbleComponent implements OnInit { + constructor() {} + + ngOnInit() {} + + protected readonly Dockstore = Dockstore; + + @Input() + isPublic: boolean; +} diff --git a/src/app/shared/ai-bubble/ai-bubble.module.ts b/src/app/shared/ai-bubble/ai-bubble.module.ts new file mode 100644 index 0000000000..95f1ae362c --- /dev/null +++ b/src/app/shared/ai-bubble/ai-bubble.module.ts @@ -0,0 +1,14 @@ +import { NgModule } from '@angular/core'; +import { CommonModule } from '@angular/common'; +import { FlexModule } from '@angular/flex-layout'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { AiBubbleComponent } from './ai-bubble.component'; + +@NgModule({ + declarations: [AiBubbleComponent], + exports: [AiBubbleComponent], + imports: [CommonModule, FlexModule, MatIconModule, MatTooltipModule, RouterLink], +}) +export class AiBubbleModule {} diff --git a/src/app/shared/modules/container.module.ts b/src/app/shared/modules/container.module.ts index 66e3af9408..081e912e70 100644 --- a/src/app/shared/modules/container.module.ts +++ b/src/app/shared/modules/container.module.ts @@ -60,6 +60,7 @@ import { SelectModule } from './select.module'; import { SnackbarModule } from './snackbar.module'; import { CategoryButtonModule } from './../../categories/button/category-button.module'; import { WorkflowModule } from './workflow.module'; +import { AiBubbleModule } from '../ai-bubble/ai-bubble.module'; @NgModule({ declarations: [ @@ -99,6 +100,7 @@ import { WorkflowModule } from './workflow.module'; SnackbarModule, CategoryButtonModule, WorkflowModule, + AiBubbleModule, ], providers: [ EmailService, diff --git a/src/app/shared/modules/workflow.module.ts b/src/app/shared/modules/workflow.module.ts index 6f9d3ac257..b4aa57ab9f 100644 --- a/src/app/shared/modules/workflow.module.ts +++ b/src/app/shared/modules/workflow.module.ts @@ -68,6 +68,7 @@ import { MySidebarModule } from '../modules/my-sidebar.module'; import { SourceFileTabsService } from '../../source-file-tabs/source-file-tabs.service'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { PreviewWarningModule } from './preview-warning.module'; +import { AiBubbleModule } from '../ai-bubble/ai-bubble.module'; @NgModule({ declarations: [ @@ -117,6 +118,7 @@ import { PreviewWarningModule } from './preview-warning.module'; MySidebarModule, NgxMatSelectSearchModule, PreviewWarningModule, + AiBubbleModule, ], providers: [ DateService, diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index 6ab12580e9..94d612af2d 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -195,9 +195,12 @@
    Topic - {{ - workflow?.topicSelection === TopicSelectionEnum.AUTOMATIC ? workflow?.topicAutomatic : workflow?.topicManual - }} + {{ workflow?.topicAutomatic }} + {{ workflow?.topicManual }} + + {{ workflow?.topicAI }} + +
    {{ workflow?.topicAutomatic }}
    +
    + AI Generated Topic + {{ workflow?.topicAI }} + +
    Automatic Manual + AI Generated
    diff --git a/src/assets/svg/ai-icon.svg b/src/assets/svg/ai-icon.svg new file mode 100644 index 0000000000..12f3023f25 --- /dev/null +++ b/src/assets/svg/ai-icon.svg @@ -0,0 +1 @@ + diff --git a/src/styles.scss b/src/styles.scss index 2267a5e820..c93b6a4bf0 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1420,3 +1420,13 @@ div.mat-menu-panel { align-items: center; justify-content: space-between; } + +.ai-bubble { + align-items: center; + justify-content: center; + margin: 0 1%; +} + +.ai-bubble:hover { + background-color: mat.get-color-from-palette($dockstore-app-gray, 6); +} From 86cbdd7c6a51ed92f23e1b705cadeab5213a7a67 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Wed, 13 Mar 2024 15:40:59 -0400 Subject: [PATCH 23/98] SEAB-4703: Parameterize version numbers in CircleCI configuration (#1944) * parameterize postgres/python versions * try postgres 13.13 * revert postgres to 13.3 --- .circleci/config.yml | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index c952195df3..faccc14acc 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -13,7 +13,7 @@ executors: password: $DOCKERHUB_PASSWORD environment: JAVA_TOOL_OPTIONS: -Xmx2g # Java can read cgroup. Sadly the cgroup in CircleCI is wrong. Have to manually set. Using 1/2 memory as heap. - - image: cimg/postgres:13.3 + - image: cimg/postgres:<< pipeline.parameters.postgres-tag >> command: postgres -c max_connections=200 -c jit=off auth: username: dockstoretestuser @@ -211,7 +211,7 @@ jobs: auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD - - image: cimg/python:3.11 + - image: cimg/python:<< pipeline.parameters.python-tag >> auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD @@ -256,7 +256,7 @@ jobs: auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD - - image: cimg/python:3.11 + - image: cimg/python:<< pipeline.parameters.python-tag >> auth: username: dockstoretestuser password: $DOCKERHUB_PASSWORD @@ -278,6 +278,12 @@ parameters: java-tag: type: string default: "17.0.4-browsers" + postgres-tag: + type: string + default: "13.3" + python-tag: + type: string + default: "3.11" workflows: version: 2 From 10824de23d4b72b15bbeac869af0b1759ce9bd87 Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Thu, 14 Mar 2024 09:36:15 -0400 Subject: [PATCH 24/98] Add Galaxy planemo information to launch-with page (#1940) * Show param download only if available --- src/app/descriptor-languages/Galaxy.ts | 2 +- src/app/shared/launch.service.ts | 30 +++++++ src/app/shared/state/workflow.query.ts | 3 + src/app/workflow/launch/launch.component.html | 31 +++++++- src/app/workflow/launch/launch.component.ts | 78 ++++++++++++++----- 5 files changed, 122 insertions(+), 22 deletions(-) diff --git a/src/app/descriptor-languages/Galaxy.ts b/src/app/descriptor-languages/Galaxy.ts index 30ed242d46..91105ad135 100644 --- a/src/app/descriptor-languages/Galaxy.ts +++ b/src/app/descriptor-languages/Galaxy.ts @@ -18,7 +18,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = { rowIdentifier: 'tool\xa0ID', workflowStepHeader: 'Tool Excerpt', }, - workflowLaunchSupport: false, + workflowLaunchSupport: true, testParameterFileType: SourceFile.TypeEnum.GXFORMAT2TESTFILE, fileTabs: [ { diff --git a/src/app/shared/launch.service.ts b/src/app/shared/launch.service.ts index 5e671ff5b8..b68386356f 100644 --- a/src/app/shared/launch.service.ts +++ b/src/app/shared/launch.service.ts @@ -77,6 +77,36 @@ export abstract class LaunchService { return `nextflow run https://${workflowPath} -r ${versionName}`; } + getSharedZipString(workflowPath: string, versionName: string) { + return `wget -O temp.zip ${Dockstore.API_URI}${ga4ghPath}/tools/${encodeURIComponent( + '#workflow/' + workflowPath + )}/versions/${encodeURIComponent(versionName)}/GALAXY/files?format=zip +unzip temp.zip`; + } + + /** + * This creates the planemo local init command + * @param path The GA4GH Tool's path + * @param versionName The ToolVersion's name + */ + getPlanemoLocalInitString(workflowPath: string, versionName: string, primaryDescriptorPath: string, testParameterPath: string) { + return ( + this.getSharedZipString(workflowPath, versionName) + `\nplanemo workflow_job_init ${primaryDescriptorPath} -o ${testParameterPath}` + ); + } + + /** + * This creates the planemo local launch commands + * @param path The GA4GH Tool's path + * @param versionName The ToolVersion's name + */ + getPlanemoLocalLaunchString(workflowPath: string, versionName: string, primaryDescriptorPath: string, testParameterPath: string) { + return ( + this.getSharedZipString(workflowPath, versionName) + + `\nplanemo run ${primaryDescriptorPath} ${testParameterPath} --download_outputs --output_directory . --output_json output.json --engine docker_galaxy` + ); + } + /** * Gets local launch command */ diff --git a/src/app/shared/state/workflow.query.ts b/src/app/shared/state/workflow.query.ts index 952430f4a1..33cd3f0454 100644 --- a/src/app/shared/state/workflow.query.ts +++ b/src/app/shared/state/workflow.query.ts @@ -39,6 +39,9 @@ export class WorkflowQuery extends QueryEntity = this.descriptorType$.pipe( map((descriptorType: ToolDescriptor.TypeEnum) => descriptorType === ToolDescriptor.TypeEnum.WDL) ); + public isGalaxy$: Observable = this.descriptorType$.pipe( + map((descriptorType: ToolDescriptor.TypeEnum) => descriptorType === ToolDescriptor.TypeEnum.GALAXY) + ); constructor( protected store: WorkflowStore, private descriptorTypeCompatService: DescriptorTypeCompatService, diff --git a/src/app/workflow/launch/launch.component.html b/src/app/workflow/launch/launch.component.html index da4913ed95..abbf621265 100644 --- a/src/app/workflow/launch/launch.component.html +++ b/src/app/workflow/launch/launch.component.html @@ -30,7 +30,10 @@ info GitHub App Tools are launched in workflow mode with the Dockstore CLI - + Make a runtime JSON template and fill in desired inputs, outputs, and other parameters +
    {{ planemoLocalInitString }}
    + + or grab one that the workflow author has provided (if applicable) + +
    {{ wgetTestJsonDescription }}
    +
    +
    Run locally with the Dockstore CLI @@ -71,6 +88,16 @@ + +
    + Run with Planemo + +
    {{ planemoLocalLaunchString }}
    +
    +
    +
    Download the workflow files diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index 5ec3ee162c..54dfd3b8d7 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; -import { takeUntil } from 'rxjs/operators'; +import { combineLatest, forkJoin, Observable, Subject } from 'rxjs'; +import { take, takeUntil } from 'rxjs/operators'; import { ga4ghWorkflowIdPrefix } from '../../shared/constants'; import { EntryTab } from '../../shared/entry/entry-tab'; @@ -59,13 +59,17 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang nextflowNativeLaunchDescription: string; nextflowLocalLaunchDescription: string; nextflowDownloadFileDescription: string; + planemoLocalInitString: string; + planemoLocalLaunchString: string; descriptors: Array; cwlrunnerDescription = this.launchService.cwlrunnerDescription; cwlrunnerTooltip = this.launchService.cwlrunnerTooltip; cwltoolTooltip = this.launchService.cwltoolTooltip; + primaryDescriptorPath: string; testParameterPath: string; descriptorType$: Observable; isNFL$: Observable; + isGalaxy$: Observable; ToolDescriptor = ToolDescriptor; EntryType = EntryType; protected published$: Observable; @@ -86,10 +90,12 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang ngOnInit(): void { this.published$ = this.workflowQuery.workflowIsPublished$; this.descriptorType$ = this.workflowQuery.descriptorType$; - this.descriptorType$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((descriptorType: ToolDescriptor.TypeEnum) => (this.currentDescriptor = descriptorType)); + this.descriptorType$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((descriptorType: ToolDescriptor.TypeEnum) => { + this.currentDescriptor = descriptorType; + this.reactToDescriptor(); + }); this.isNFL$ = this.workflowQuery.isNFL$; + this.isGalaxy$ = this.workflowQuery.isGalaxy$; } ngOnChanges(changes: SimpleChanges): void { @@ -101,6 +107,9 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang this.changeMessages(this.basePath, this.path, this._selectedVersion.name, this.currentDescriptor); } private changeMessages(basePath: string, workflowPath: string, versionName: string, descriptorType: ToolDescriptor.TypeEnum) { + if (descriptorType === undefined) { + return; + } this.params = this.launchService.getParamsString(workflowPath, versionName, descriptorType); this.cli = this.launchService.getCliString(workflowPath, versionName, descriptorType); this.cwl = this.launchService.getCwlString(workflowPath, versionName, encodeURIComponent(this._selectedVersion.workflow_path)); @@ -126,20 +135,51 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang * @param versionName */ updateWgetTestJsonString(workflowPath: string, versionName: string, descriptorType: ToolDescriptor.TypeEnum): void { - let toolFiles$: Observable>; - toolFiles$ = this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.TESTFILE]); - toolFiles$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((toolFiles: Array) => { - if (toolFiles && toolFiles.length > 0) { - this.testParameterPath = toolFiles[0].path; - } else { - this.testParameterPath = null; + combineLatest([ + this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.TESTFILE]), + this.gA4GHFilesQuery.getToolFiles(descriptorType, [ToolFile.FileTypeEnum.PRIMARYDESCRIPTOR]), + ]).subscribe( + ([toolFiles, descriptorFiles]) => { + // test parameter file is optional ... + if (toolFiles !== undefined) { + if (toolFiles.length > 0) { + this.testParameterPath = toolFiles[0].path; + } else { + this.testParameterPath = undefined; + } + this.wgetTestJsonDescription = this.launchService.getTestJsonString( + ga4ghWorkflowIdPrefix + workflowPath, + versionName, + descriptorType, + this.testParameterPath + ); + } else { + this.testParameterPath = undefined; + } + if (descriptorFiles?.length > 0) { + // ... but primary descriptor is mandatory + this.primaryDescriptorPath = descriptorFiles[0].path; + this.planemoLocalInitString = this.launchService.getPlanemoLocalInitString( + workflowPath, + versionName, + this.primaryDescriptorPath, + this.testParameterPath === undefined ? 'example-parameter-file.yml' : this.testParameterPath + ); + this.planemoLocalLaunchString = this.launchService.getPlanemoLocalLaunchString( + workflowPath, + versionName, + this.primaryDescriptorPath, + this.testParameterPath === undefined ? 'example-parameter-file.yml' : this.testParameterPath + ); + } else { + this.primaryDescriptorPath = undefined; + this.planemoLocalInitString = undefined; + this.planemoLocalLaunchString = undefined; + } + }, + (err) => { + console.log(err); } - this.wgetTestJsonDescription = this.launchService.getTestJsonString( - ga4ghWorkflowIdPrefix + workflowPath, - versionName, - descriptorType, - this.testParameterPath - ); - }); + ); } } From 9c9cec2376d9fbb337507f44169087f16c33f8b1 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Tue, 19 Mar 2024 13:57:01 -0400 Subject: [PATCH 25/98] SEAB-5992: Remove Twitter from smoke tests (#1947) --- cypress/e2e/group1/dashboard.ts | 4 ++-- cypress/e2e/immutableDatabaseTests/app-spec.ts | 4 ++-- cypress/e2e/smokeTests/sharedTests/basic-enduser.ts | 4 ++-- cypress/support/commands.ts | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) diff --git a/cypress/e2e/group1/dashboard.ts b/cypress/e2e/group1/dashboard.ts index 6c8c4badf1..234d65e71b 100644 --- a/cypress/e2e/group1/dashboard.ts +++ b/cypress/e2e/group1/dashboard.ts @@ -20,7 +20,7 @@ import { verifyGithubLinkDashboard, checkFeaturedContent, checkNewsAndUpdates, - checkMastodonFeedOrTwitterFeed, + checkMastodonFeed, } from '../../support/commands'; describe('Dockstore dashboard', () => { @@ -71,7 +71,7 @@ describe('Dockstore dashboard', () => { it('mastodon feed should be visible', () => { cy.visit('/dashboard'); - checkMastodonFeedOrTwitterFeed(); + checkMastodonFeed(); }); }); diff --git a/cypress/e2e/immutableDatabaseTests/app-spec.ts b/cypress/e2e/immutableDatabaseTests/app-spec.ts index ed834ccf79..646c9eb37c 100644 --- a/cypress/e2e/immutableDatabaseTests/app-spec.ts +++ b/cypress/e2e/immutableDatabaseTests/app-spec.ts @@ -27,9 +27,9 @@ describe('Logged in Dockstore Home', () => { // expect(browser.getLocationAbsUrl()).toMatch("/"); }); - it('should have the mastodon or twitter timeline', () => { + it('should have the mastodon timeline', () => { cy.scrollTo('bottom'); - cy.get('[data-cy=mt-toot],.twitter-timeline').should('be.visible'); + cy.get('[data-cy=mt-toot]').should('be.visible'); }); function starColumn(url: string, type: string) { diff --git a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts index 55875522fe..1a025226b7 100644 --- a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts +++ b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts @@ -1,6 +1,6 @@ import { ga4ghPath } from '../../../../src/app/shared/constants'; import { ToolDescriptor } from '../../../../src/app/shared/openapi'; -import { goToTab, checkFeaturedContent, checkNewsAndUpdates, checkMastodonFeedOrTwitterFeed } from '../../../support/commands'; +import { goToTab, checkFeaturedContent, checkNewsAndUpdates, checkMastodonFeed } from '../../../support/commands'; // Test an entry, these should be ambiguous between tools, workflows, and notebooks. describe('run stochastic smoke test', () => { @@ -374,7 +374,7 @@ describe('Check extra content', () => { it('mastodon feed should be visible', () => { cy.visit('/'); - checkMastodonFeedOrTwitterFeed(); + checkMastodonFeed(); }); }); diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index a7acfff1c2..714bd0aa78 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -276,6 +276,6 @@ export function checkNewsAndUpdates() { }); } -export function checkMastodonFeedOrTwitterFeed() { - cy.get('[data-cy=mt-toot],.twitter-timeline').should('exist'); +export function checkMastodonFeed() { + cy.get('[data-cy=mt-toot]').should('exist'); } From 621efdd2c351c25509fb0b857ecc964cdddf5940 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 19 Mar 2024 14:21:41 -0400 Subject: [PATCH 26/98] Bump follow-redirects from 1.15.4 to 1.15.6 (#1946) Bumps [follow-redirects](https://github.com/follow-redirects/follow-redirects) from 1.15.4 to 1.15.6. - [Release notes](https://github.com/follow-redirects/follow-redirects/releases) - [Commits](https://github.com/follow-redirects/follow-redirects/compare/v1.15.4...v1.15.6) --- updated-dependencies: - dependency-name: follow-redirects dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 62ca0a9dc1..6a9127c2b4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12503,9 +12503,9 @@ } }, "node_modules/follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true, "funding": [ { @@ -33029,9 +33029,9 @@ } }, "follow-redirects": { - "version": "1.15.4", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz", - "integrity": "sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw==", + "version": "1.15.6", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.6.tgz", + "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, "for-each": { From b92c34990fd30d0ee7316071f7b27c888a1a2a3b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 22 Mar 2024 13:29:56 -0400 Subject: [PATCH 27/98] Bump webpack-dev-middleware from 5.3.3 to 5.3.4 (#1948) Bumps [webpack-dev-middleware](https://github.com/webpack/webpack-dev-middleware) from 5.3.3 to 5.3.4. - [Release notes](https://github.com/webpack/webpack-dev-middleware/releases) - [Changelog](https://github.com/webpack/webpack-dev-middleware/blob/v5.3.4/CHANGELOG.md) - [Commits](https://github.com/webpack/webpack-dev-middleware/compare/v5.3.3...v5.3.4) --- updated-dependencies: - dependency-name: webpack-dev-middleware dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 6a9127c2b4..3a1d15ade9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22980,9 +22980,9 @@ } }, "node_modules/webpack-dev-server/node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -41170,9 +41170,9 @@ } }, "webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", "dev": true, "requires": { "colorette": "^2.0.10", From a0a1c4c597ec7ee04f45d9b17aa4b5ccc36c2f22 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Tue, 26 Mar 2024 09:12:13 -0400 Subject: [PATCH 28/98] SEAB-6207: Fix flaky platform partner test (#1949) --- cypress/e2e/immutableDatabaseTests/platform-partner.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/cypress/e2e/immutableDatabaseTests/platform-partner.ts b/cypress/e2e/immutableDatabaseTests/platform-partner.ts index 0d47708209..f092702289 100644 --- a/cypress/e2e/immutableDatabaseTests/platform-partner.ts +++ b/cypress/e2e/immutableDatabaseTests/platform-partner.ts @@ -19,15 +19,14 @@ import { setTokenUserViewPortPlatformPartner, setPlatformPartnerRole } from '../ describe('Platform Partner UI', () => { setTokenUserViewPortPlatformPartner(); beforeEach(() => { + setPlatformPartnerRole(); cy.visit(''); - // Select dropdown cy.get('[data-cy=dropdown-main]:visible').click(); }); describe('Profile', () => { it('Platform Partner status indicated on profile page', () => { - setPlatformPartnerRole(); cy.get('#dropdown-accounts').click(); cy.get('[data-cy=account-is-platform-partner]').should('exist'); }); From 8defc797470863bb39c0de554af677ab115b0f3e Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 26 Mar 2024 11:35:38 -0400 Subject: [PATCH 29/98] Bump express from 4.18.2 to 4.19.2 (#1952) Bumps [express](https://github.com/expressjs/express) from 4.18.2 to 4.19.2. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/master/History.md) - [Commits](https://github.com/expressjs/express/compare/4.18.2...4.19.2) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 76 +++++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/package-lock.json b/package-lock.json index 3a1d15ade9..ff305209ee 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8044,13 +8044,13 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -8058,7 +8058,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -9387,9 +9387,9 @@ ] }, "node_modules/content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, "engines": { "node": ">= 0.6" @@ -11996,17 +11996,17 @@ "dev": true }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -12038,9 +12038,9 @@ } }, "node_modules/express/node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true, "engines": { "node": ">= 0.6" @@ -18824,9 +18824,9 @@ } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -29543,13 +29543,13 @@ "dev": true }, "body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", "dev": true, "requires": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", @@ -29557,7 +29557,7 @@ "iconv-lite": "0.4.24", "on-finished": "2.4.1", "qs": "6.11.0", - "raw-body": "2.5.1", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -30579,9 +30579,9 @@ } }, "content-type": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", + "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true }, "convert-source-map": { @@ -32615,17 +32615,17 @@ "dev": true }, "express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -32654,9 +32654,9 @@ }, "dependencies": { "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", "dev": true }, "debug": { @@ -37849,9 +37849,9 @@ "dev": true }, "raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, "requires": { "bytes": "3.1.2", From bdb833bbfd98207a17b38af7a8165edf2cc4389b Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Tue, 26 Mar 2024 16:13:34 -0400 Subject: [PATCH 30/98] DOCK-2505: Rename "Actions" column in public Versions table (#1954) * rename actions column to overview * try reverting to actions in allColumns * try reverting all (monitor sharedWorkflows test) * add conditional column titles --- src/app/container/versions/versions.component.html | 2 +- src/app/workflow/versions/versions.component.html | 10 +++++++++- 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/app/container/versions/versions.component.html b/src/app/container/versions/versions.component.html index d518987d52..7edabb1ff8 100644 --- a/src/app/container/versions/versions.component.html +++ b/src/app/container/versions/versions.component.html @@ -134,7 +134,7 @@ - Actions + {{ this.publicPage ? 'Overview' : 'Actions' }} diff --git a/src/app/workflow/versions/versions.component.html b/src/app/workflow/versions/versions.component.html index f7f61f7b8c..7ea05986f9 100644 --- a/src/app/workflow/versions/versions.component.html +++ b/src/app/workflow/versions/versions.component.html @@ -238,7 +238,15 @@ - Actions + + {{ this.publicPage ? 'Overview' : 'Actions' }} + Date: Wed, 27 Mar 2024 10:35:24 -0400 Subject: [PATCH 31/98] SEAB-6014: UI link checks (#1941) * try initial link check test * try adding error logs, removing wait * restore wait, add chaining * tweak formatting, try original wait time * add documentation url * feedback (change argument name, create Page type) * try tracking visited links * add workarounds for twitter, avatar image * see if assertion helps with flaky images * feedback (add arrays for links to skip, update pages to visit) * fix Advanced Features link --- .../e2e/immutableDatabaseTests/linkCheck.ts | 121 ++++++++++++++++++ src/app/sitemap/sitemap.component.html | 2 +- test/web.yml | 2 + 3 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 cypress/e2e/immutableDatabaseTests/linkCheck.ts diff --git a/cypress/e2e/immutableDatabaseTests/linkCheck.ts b/cypress/e2e/immutableDatabaseTests/linkCheck.ts new file mode 100644 index 0000000000..1158b5e21b --- /dev/null +++ b/cypress/e2e/immutableDatabaseTests/linkCheck.ts @@ -0,0 +1,121 @@ +import { setTokenUserViewPort } from '../../support/commands'; + +// Formats paths to be displayed in an error log +function formatPaths(paths: string[]): string { + let formattedPaths = ''; + paths.forEach((path) => { + formattedPaths += '\n- ' + path; + }); + return formattedPaths; +} + +describe('Find broken anchor links', () => { + setTokenUserViewPort(); + + // These links should be intentionally skipped + const skippedUrls: string[] = [ + 'https://twitter.com/DockstoreOrg', // Test only fails because it redirects to login page if not logged in + ]; + + let visitedUrls: string[] = []; + + function isDynamicUrl(url: string): boolean { + return url.includes('/my-workflows/') || url.includes('/my-tools/') || url.includes('/my-notebooks/'); + } + + function checkUrls(path: string) { + let brokenUrls = []; + cy.visit(path).wait(500); // Temporary solution to ensure the page loads entirely + cy.get('a') + .each((anchor) => { + cy.get(anchor).then((anchor) => { + const href = anchor.prop('href'); + // Send requests to non-dynamic URLs that haven't yet been visited and shouldn't be skipped + if (href && !skippedUrls.includes(href) && !visitedUrls.includes(href) && !isDynamicUrl(href)) { + cy.request({ + url: href, + failOnStatusCode: false, + }).then((result) => { + if (result.status != 200) { + brokenUrls.push(href); + cy.log(`${result.status}: ${href}`); + } else { + visitedUrls.push(href); // Add successful links to visitedUrls so that they won't be visited again + } + }); + } + }); + }) + .then(() => { + if (brokenUrls.length) { + throw new Error(`Broken links at "${path}":` + formatPaths(brokenUrls)); + } + }); + } + + const urlPages: string = ['/', '/sitemap', '/about', '/funding', '/docs', '/dashboard', '/quick-start']; + + urlPages.forEach((urlPage) => { + it(`anchor links at "${urlPage}" should work`, () => { + checkUrls(urlPage); + }); + }); +}); + +describe('Find broken image links', () => { + setTokenUserViewPort(); + + const skippedImages: string = [ + 'http://localhost:4200/', // Failing stock avatar image in navbar + ]; + + let visitedImages: string = []; + + function checkImages(path: string, selector: string) { + let brokenImages = []; + cy.visit(path).wait(500); + cy.get('app-root').should('be.visible'); + cy.get('img') + .each((image) => { + cy.get(image).then((image) => { + const src = image.prop('src'); + if (!skippedImages.includes(src) && !visitedImages.includes(src)) { + if (image.prop('naturalWidth') === 0) { + brokenImages.push(src); + cy.log(`image not visible: ${src}`); + } else { + visitedImages.push(src); + } + } + }); + }) + .then(() => { + if (brokenImages.length) { + throw new Error(`Broken images at "${path}":` + formatPaths(brokenImages)); + } + }); + } + + const imagePages: string = [ + '/', + '/about', + '/funding', + '/docs', + '/dashboard', + '/workflows', + '/notebooks', + '/services', + '/apptools', + '/search-workflows', + '/tools', + '/containers', + '/search-containers', + '/accounts', + ]; + + imagePages.forEach((imagePage) => { + it(`images at "${imagePage}" should work`, () => { + checkImages(imagePage); + }); + }); +}); diff --git a/src/app/sitemap/sitemap.component.html b/src/app/sitemap/sitemap.component.html index 7e4ab9db6e..2e48062f63 100644 --- a/src/app/sitemap/sitemap.component.html +++ b/src/app/sitemap/sitemap.component.html @@ -43,7 +43,7 @@

    Using Dockstore

    News and Events
  • - + Advanced Features
  • diff --git a/test/web.yml b/test/web.yml index 4d1890aeb4..efca30755e 100644 --- a/test/web.yml +++ b/test/web.yml @@ -113,3 +113,5 @@ uiConfig: featuredContentUrl: https://content.dockstore.org/develop/feat-content.html featuredNewsUrl: https://content.dockstore.org/develop/news.html + + documentationUrl: https://docs.dockstore.org/en/latest From 5f298a0d4bc6b53495b4f557fc11fcc3e9ed4ead Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Thu, 28 Mar 2024 09:05:32 -0700 Subject: [PATCH 32/98] add UNINSTALL->Uninstall mapping to MapFriendlyValuesPipe https://ucsc-cgl.atlassian.net/browse/SEAB-6000 --- src/app/search/map-friendly-values.pipe.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/search/map-friendly-values.pipe.ts b/src/app/search/map-friendly-values.pipe.ts index 06fa8a0033..9250dcec0d 100644 --- a/src/app/search/map-friendly-values.pipe.ts +++ b/src/app/search/map-friendly-values.pipe.ts @@ -118,6 +118,7 @@ export class MapFriendlyValuesPipe implements PipeTransform { ['PUSH', 'Push'], ['DELETE', 'Delete'], ['INSTALL', 'Install'], + ['UNINSTALL', 'Uninstall'], ['PUBLISH', 'Publish'], ]), ], From 72336f86b6fb63ae6899e9076a86bf95ec96caaf Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Thu, 28 Mar 2024 12:20:52 -0400 Subject: [PATCH 33/98] Increase manual topic max length to 250 & move ai bubble on search page (#1950) https://ucsc-cgl.atlassian.net/browse/SEAB-6007 * Increase topic max length to 250 * Move ai bubble to beginning of sentence for search table * update ai icon image src to relative path --- src/app/container/info-tab/info-tab.component.html | 2 +- .../search-notebook-table.component.html | 6 ++++-- .../search-tool-table/search-tool-table.component.html | 6 ++++-- .../search-workflow-table.component.html | 6 ++++-- src/app/shared/ai-bubble/ai-bubble.component.html | 2 +- src/app/shared/styles/entry-table.scss | 5 +++++ src/app/workflow/info-tab/info-tab.component.html | 2 +- src/styles.scss | 8 +++----- 8 files changed, 23 insertions(+), 14 deletions(-) diff --git a/src/app/container/info-tab/info-tab.component.html b/src/app/container/info-tab/info-tab.component.html index d81ba31cea..760c14c7a9 100644 --- a/src/app/container/info-tab/info-tab.component.html +++ b/src/app/container/info-tab/info-tab.component.html @@ -293,7 +293,7 @@ -
    - {{ notebook?.source.topicAutomatic }} +
    + {{ + notebook?.source.topicAutomatic + }}
    diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 4799add298..278890cf14 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -44,9 +44,11 @@ tool?.source.namespace + '/' + tool?.source.name + (tool?.source.toolname ? '/' + tool?.source.toolname : '') }} -
    - {{ tool?.source.topicAutomatic }} +
    + {{ + tool?.source.topicAutomatic + }}
    diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index e849dff30a..36a2710fba 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -18,9 +18,11 @@ (workflow?.source.workflowName ? '/' + workflow?.source.workflowName : '') }} -
    - {{ workflow?.source.topicAutomatic }} +
    + {{ + workflow?.source.topicAutomatic + }}
    diff --git a/src/app/shared/ai-bubble/ai-bubble.component.html b/src/app/shared/ai-bubble/ai-bubble.component.html index d27b99aafa..925be1f3ce 100644 --- a/src/app/shared/ai-bubble/ai-bubble.component.html +++ b/src/app/shared/ai-bubble/ai-bubble.component.html @@ -10,6 +10,6 @@ : 'This topic sentence was AI generated. AI topic sentences are only generated for published entries.' }}" > - AI generation icon + AI generation icon AI diff --git a/src/app/shared/styles/entry-table.scss b/src/app/shared/styles/entry-table.scss index 04aadda48e..ad72810089 100644 --- a/src/app/shared/styles/entry-table.scss +++ b/src/app/shared/styles/entry-table.scss @@ -48,3 +48,8 @@ th { white-space: nowrap; vertical-align: top; } + +// Align AI bubble all the way to the left +app-ai-bubble { + margin-left: 0; +} diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index 94d612af2d..0cc5fa2230 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -234,7 +234,7 @@ Date: Tue, 9 Apr 2024 13:32:21 -0400 Subject: [PATCH 34/98] Update develop artifacts (#1960) * Update develop artifacts * Fix build errors --- package.json | 4 ++-- src/app/container/paramfiles/paramfiles.service.ts | 2 +- .../launch-third-party/launch-third-party.component.ts | 4 ++-- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 18da16a554..15e508de16 100644 --- a/package.json +++ b/package.json @@ -5,8 +5,8 @@ "config": { "webservice_version": "1.15.0-rc.2", "use_circle": true, - "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/10974/workflows/5e5f2c59-e91b-4de1-adb3-7a66f3d2d742/jobs/41479/artifacts", - "circle_build_id": "41479" + "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/11118/workflows/fd1cfead-4230-49d5-8109-8ea9b46b918f/jobs/42553/artifacts", + "circle_build_id": "42553" }, "scripts": { "ng": "npx ng", diff --git a/src/app/container/paramfiles/paramfiles.service.ts b/src/app/container/paramfiles/paramfiles.service.ts index 9755972adf..5079295317 100644 --- a/src/app/container/paramfiles/paramfiles.service.ts +++ b/src/app/container/paramfiles/paramfiles.service.ts @@ -41,7 +41,7 @@ export class ParamfilesService { return this.workflowsService.getTestParameterFiles1(id, versionName); } else { if (descriptor === 'CWL' || descriptor === 'WDL') { - return this.containersService.getTestParameterFiles(id, versionName, descriptor); + return this.containersService.getTestParameterFiles(id, descriptor, versionName); } } } diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index 150c17a69c..ab587ad382 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -276,11 +276,11 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit this.descriptorLanguageService.workflowDescriptorTypeEnumToExtendedDescriptorLanguageBean( descriptorType ).descriptorLanguageEnum; - this.workflowsService.primaryDescriptor1(this.workflow.id, this.selectedVersion.name, descriptorType).subscribe((sourceFile) => { + this.workflowsService.primaryDescriptor1(this.workflow.id, descriptorType, this.selectedVersion.name).subscribe((sourceFile) => { this.descriptorsService.updatePrimaryDescriptor(sourceFile); if (fileDescriptors.some((file) => file.file_type === FileTypeEnum.SECONDARYDESCRIPTOR)) { this.workflowsService - .secondaryDescriptors1(this.workflow.id, this.selectedVersion.name, descriptorLanguageEnum) + .secondaryDescriptors1(this.workflow.id, descriptorLanguageEnum, this.selectedVersion.name) .subscribe((sourceFiles: Array) => { this.descriptorsService.updateSecondaryDescriptors(sourceFiles); }); From dc2794f99a6ae0d11be1ac427b97233042b682da Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Wed, 10 Apr 2024 10:16:10 -0400 Subject: [PATCH 35/98] make zsh compatible and hardcode parameter file name (#1958) * make mac compatible and force note * simplify and hardcode test param file * change extension and clean-u * pr feedback --- src/app/shared/launch.service.ts | 27 ++++++++++--------- src/app/workflow/launch/launch.component.html | 8 +++++- src/app/workflow/launch/launch.component.ts | 12 +++------ 3 files changed, 25 insertions(+), 22 deletions(-) diff --git a/src/app/shared/launch.service.ts b/src/app/shared/launch.service.ts index b68386356f..b3843766e8 100644 --- a/src/app/shared/launch.service.ts +++ b/src/app/shared/launch.service.ts @@ -28,6 +28,8 @@ export abstract class LaunchService { public readonly cwltoolTooltip = 'Commands for launching tools/workflows through CWLtool: the CWL reference implementation. ' + this.nonStrict; public readonly wesTooltip = 'Commands for provisioning files and launching a workflow against AWS AGC infrastructure.'; + private readonly galaxyParamFileName = 'galaxy_job.yml'; + constructor(protected descriptorTypeCompatService: DescriptorTypeCompatService) {} abstract getParamsString(path: string, versionName: string, currentDescriptor: string): string; abstract getCliString(path: string, versionName: string, currentDescriptor: string): string; @@ -78,9 +80,9 @@ export abstract class LaunchService { } getSharedZipString(workflowPath: string, versionName: string) { - return `wget -O temp.zip ${Dockstore.API_URI}${ga4ghPath}/tools/${encodeURIComponent( + return `wget -O temp.zip '${Dockstore.API_URI}${ga4ghPath}/tools/${encodeURIComponent( '#workflow/' + workflowPath - )}/versions/${encodeURIComponent(versionName)}/GALAXY/files?format=zip + )}/versions/${encodeURIComponent(versionName)}/GALAXY/files?format=zip' unzip temp.zip`; } @@ -89,10 +91,8 @@ unzip temp.zip`; * @param path The GA4GH Tool's path * @param versionName The ToolVersion's name */ - getPlanemoLocalInitString(workflowPath: string, versionName: string, primaryDescriptorPath: string, testParameterPath: string) { - return ( - this.getSharedZipString(workflowPath, versionName) + `\nplanemo workflow_job_init ${primaryDescriptorPath} -o ${testParameterPath}` - ); + getPlanemoLocalInitString(workflowPath: string, versionName: string, primaryDescriptorPath: string) { + return `planemo workflow_job_init ${primaryDescriptorPath} -o ${this.galaxyParamFileName}`; } /** @@ -100,11 +100,8 @@ unzip temp.zip`; * @param path The GA4GH Tool's path * @param versionName The ToolVersion's name */ - getPlanemoLocalLaunchString(workflowPath: string, versionName: string, primaryDescriptorPath: string, testParameterPath: string) { - return ( - this.getSharedZipString(workflowPath, versionName) + - `\nplanemo run ${primaryDescriptorPath} ${testParameterPath} --download_outputs --output_directory . --output_json output.json --engine docker_galaxy` - ); + getPlanemoLocalLaunchString(workflowPath: string, versionName: string, primaryDescriptorPath: string) { + return `planemo run ${primaryDescriptorPath} ${this.galaxyParamFileName} --download_outputs --output_directory . --output_json output.json --engine docker_galaxy`; } /** @@ -129,7 +126,7 @@ unzip temp.zip`; * @param {string} entryPath The entry path * @param {string} versionName The workflow version * @param {ToolDescriptor.TypeEnum} descriptorType The descriptor type (cwl, wdl, nfl) - * @param {string} filePath Relative file path of the the test parameter file + * @param {string} filePath Relative file path of the test parameter file * @returns {string} The wget command * @memberof LaunchService */ @@ -157,7 +154,11 @@ unzip temp.zip`; } const prefix = `wget --header='Accept: text/plain`; - const outputFile = `-O Dockstore.json`; + + let outputFile = `-O Dockstore.json`; + if (descriptorType === ToolDescriptor.TypeEnum.GALAXY) { + outputFile = '-O ' + this.galaxyParamFileName; + } const id = encodeURIComponent(entryPath); const versionId = encodeURIComponent(versionName); diff --git a/src/app/workflow/launch/launch.component.html b/src/app/workflow/launch/launch.component.html index abbf621265..93b1a4dda3 100644 --- a/src/app/workflow/launch/launch.component.html +++ b/src/app/workflow/launch/launch.component.html @@ -48,7 +48,13 @@ - Make a runtime JSON template with Planemo and fill in desired inputs, outputs, and other parameters + Download the workflow and other included files (such as example parameter files) + +
    {{ planemoSharedZipString }}
    + + Then, create a runtime parameter template with Planemo and fill in desired inputs, outputs, and other parameters diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index 54dfd3b8d7..d19c34bfa0 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -59,6 +59,7 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang nextflowNativeLaunchDescription: string; nextflowLocalLaunchDescription: string; nextflowDownloadFileDescription: string; + planemoSharedZipString: string; planemoLocalInitString: string; planemoLocalLaunchString: string; descriptors: Array; @@ -159,17 +160,12 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang if (descriptorFiles?.length > 0) { // ... but primary descriptor is mandatory this.primaryDescriptorPath = descriptorFiles[0].path; - this.planemoLocalInitString = this.launchService.getPlanemoLocalInitString( - workflowPath, - versionName, - this.primaryDescriptorPath, - this.testParameterPath === undefined ? 'example-parameter-file.yml' : this.testParameterPath - ); + this.planemoSharedZipString = this.launchService.getSharedZipString(workflowPath, versionName); + this.planemoLocalInitString = this.launchService.getPlanemoLocalInitString(workflowPath, versionName, this.primaryDescriptorPath); this.planemoLocalLaunchString = this.launchService.getPlanemoLocalLaunchString( workflowPath, versionName, - this.primaryDescriptorPath, - this.testParameterPath === undefined ? 'example-parameter-file.yml' : this.testParameterPath + this.primaryDescriptorPath ); } else { this.primaryDescriptorPath = undefined; From 30d4692c5b6ee264fe2e147da5517a953be8cdb9 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Wed, 10 Apr 2024 16:09:09 -0400 Subject: [PATCH 36/98] DOCK-2507: Add "Discover Existing Tools/Notebooks" (#1955) * enable/fix discover existing tools/notebooks * fix unit test imports * fix myworkflows test (stub get request for workflows) * add tests for tools/notebooks, add waits for requests * include notebooks in discover existing alert, alert button tooltip * add comment about ignoring workflows response --- cypress/e2e/group2/myworkflows.ts | 9 +- cypress/e2e/group2/notebooks.ts | 23 ++ cypress/e2e/group3/mytools.ts | 20 +- cypress/fixtures/myNotebooks.json | 82 +++++ cypress/fixtures/myTools.json | 282 ++++++++++++++++++ .../mytools/my-tool/my-tool.component.html | 27 ++ src/app/mytools/my-tool/my-tool.component.ts | 2 +- .../my-workflow/my-workflow.component.html | 15 +- .../my-workflow/my-workflow.component.spec.ts | 5 + .../my-workflow/my-workflow.component.ts | 2 +- src/app/shared/user/user.service.ts | 16 +- 11 files changed, 466 insertions(+), 17 deletions(-) create mode 100644 cypress/fixtures/myNotebooks.json create mode 100644 cypress/fixtures/myTools.json diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 56ee22a45e..b5cb241bba 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -42,7 +42,7 @@ describe('Dockstore my workflows', () => { cy.contains('No matching workflows'); }); - it('have action buttons which work', () => { + it('should have discover existing workflows button', () => { cy.fixture('myWorkflows.json').then((json) => { cy.intercept('PATCH', '/api/users/1/workflows', { body: json, @@ -52,8 +52,15 @@ describe('Dockstore my workflows', () => { cy.visit('/my-workflows'); cy.get('[data-cy=myWorkflowsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myWorkflows.json').then((json) => { + cy.intercept('GET', '/api/users/1/workflows', { + body: json, + statusCode: 200, + }).as('getWorkflows'); + }); cy.get('[data-cy=addToExistingWorkflows]').should('be.visible').click(); + cy.wait('@getWorkflows'); cy.contains('addedthisworkflowviasync'); }); diff --git a/cypress/e2e/group2/notebooks.ts b/cypress/e2e/group2/notebooks.ts index 36fac82a9d..ed05a74998 100644 --- a/cypress/e2e/group2/notebooks.ts +++ b/cypress/e2e/group2/notebooks.ts @@ -131,6 +131,29 @@ describe('Dockstore notebooks', () => { cy.get('td').contains('Actions').click(); snapshot(); }); + + it('should have discover existing notebooks button', () => { + cy.fixture('myWorkflows.json').then((json) => { + cy.intercept('PATCH', '/api/users/1/workflows', { + body: json, + statusCode: 200, + }); + }); + + cy.visit('/my-notebooks'); + cy.get('[data-cy=myWorkflowsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myNotebooks.json').then((json) => { + cy.intercept('GET', '/api/users/1/notebooks', { + body: json, + statusCode: 200, + }).as('getNotebooks'); + }); + cy.get('[data-cy=addToExistingWorkflows]').should('be.visible').click(); + + cy.wait('@getNotebooks'); + cy.contains('addedthisnotebookviasync'); + }); + it('should have Preview tab with highlighted syntax', () => { substituteNotebookContent(['{ "cell_type": "code", "source": [ "import xyz;" ] }']); cy.visit('/notebooks/' + name); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 9a8311f52d..10788f4264 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -49,10 +49,7 @@ describe('Dockstore my tools', () => { }); }); - // The "discover existing tools" functionality was removed in: - // https://github.com/dockstore/dockstore-ui2/pull/1919 - // TODO Unskip this test when we add it back. - it.skip('Should have discover existing tools button', () => { + it('Should have discover existing tools button', () => { cy.fixture('myWorkflows.json').then((json) => { cy.intercept('PATCH', '/api/users/1/workflows', { body: json, @@ -61,8 +58,21 @@ describe('Dockstore my tools', () => { }); cy.get('[data-cy=myToolsMoreActionButtons]').should('be.visible').click(); + cy.fixture('myTools.json').then((json) => { + cy.intercept('GET', '/api/users/1/containers', { + body: json, + statusCode: 200, + }).as('getContainers'); + }); + cy.intercept('GET', '/api/users/1/appTools', { + body: {}, + statusCode: 200, + }).as('getAppTools'); cy.get('[data-cy=addToExistingTools]').should('be.visible').click(); - cy.contains('addedthisworkflowviasync'); + + cy.wait('@getContainers'); + cy.wait('@getAppTools'); + cy.contains('addedthistoolviasync'); }); describe('Should contain extended DockstoreTool properties', () => { diff --git a/cypress/fixtures/myNotebooks.json b/cypress/fixtures/myNotebooks.json new file mode 100644 index 0000000000..4d795dcfbc --- /dev/null +++ b/cypress/fixtures/myNotebooks.json @@ -0,0 +1,82 @@ +[ + { + "type": "Notebook", + "descriptorType": "jupyter", + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "description": null, + "descriptorTypeSubclass": "Python", + "email": null, + "full_workflow_path": "github.com/dockstore-testing/addedthisnotebooksviasync", + "gitUrl": "git@github.com:dockstore-testing/addedthisnotebookviasync", + "has_checker": false, + "id": 15, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1480363257688, + "last_modified": null, + "last_modified_date": null, + "mode": "FULL", + "organization": "dockstore-testing", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/dockstore-testing/addedthisnotebookviasync", + "repository":"addedthisnotebookviasync", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topicId": null, + "users": null, + "workflowName": null, + "workflowVersions": [], + "workflow_path": "/Dockstore.yml" + }, + { + "type": "Notebook", + "descriptorType": "Jupyter", + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "dbCreateDate": 1678999094926, + "dbUpdateDate": 1678999094994, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "description": null, + "descriptorTypeSubclass": "Python", + "email": null, + "full_workflow_path": "github.com/dockstore-testing/simple-notebook", + "gitUrl": "git@github.com:dockstore-testing/simple-notebook.git", + "has_checker": false, + "id": 1000, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1678999093800, + "last_modified": 1366549560, + "last_modified_date": 1676403795000, + "mode": "DOCKSTORE_YML", + "organization": "dockstore-testing", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/dockstore-testing/simple-notebook", + "repository": "simple-notebook", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topicId": null, + "users": null, + "workflowName": null, + "workflowVersions": [], + "workflow_path": "/Dockstore.cwl" + } +] diff --git a/cypress/fixtures/myTools.json b/cypress/fixtures/myTools.json new file mode 100644 index 0000000000..6c85ba1091 --- /dev/null +++ b/cypress/fixtures/myTools.json @@ -0,0 +1,282 @@ +[ + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/addedthistoolviasync.git", + "has_checker": false, + "id": 18, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363257688, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "addedthistoolviasync", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/addedthistoolviasync", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/addedthistoolviasync", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b1.git", + "has_checker": false, + "id": 2, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b1", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b1", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b1", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/a.git", + "has_checker": false, + "id": 5, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "a", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/a", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/a", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["WDL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b3.git", + "has_checker": false, + "id": 4, + "input_file_formats": [], + "is_published": true, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b3", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b3", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b3", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "amazon.dkr.ecr.test.amazonaws.com", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL","WDL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A/a.git", + "has_checker": false, + "id": 1, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "MANUAL_IMAGE_PATH", + "name": "a", + "namespace": "A", + "output_file_formats": [], + "path": "amazon.dkr.ecr.test.amazonaws.com/A/a", + "registry": "AMAZON_ECR", + "registry_string": "amazon.dkr.ecr.test.amazonaws.com", + "starredUsers": [], + "tool_path": "amazon.dkr.ecr.test.amazonaws.com/A/a", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/testDir/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@github.com:A2/b2.git", + "has_checker": false, + "id": 3, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363368557, + "last_modified": null, + "last_modified_date": null, + "mode": "AUTO_DETECT_QUAY_TAGS_AUTOMATED_BUILDS", + "name": "b2", + "namespace": "A2", + "output_file_formats": [], + "path": "quay.io/A2/b2", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/A2/b2", + "topicId": null, + "users": null, + "workflowVersions": [] + }, + { + "aliases": null, + "author": null, + "checker_id": null, + "conceptDoi": null, + "custom_docker_registry_path": "quay.io", + "dbCreateDate": 1465409196000, + "dbUpdateDate": 1465409196000, + "defaultCWLTestParameterFile": "/test.json", + "defaultVersion": null, + "defaultWDLTestParameterFile": "/test.json", + "default_cwl_path": "/Dockstore.cwl", + "default_dockerfile_path": "/Dockerfile", + "default_wdl_path": "/Dockstore.wdl", + "description": null, + "descriptorType": ["CWL"], + "entryType": "TOOL", + "email": null, + "gitUrl": "git@dockstore.org:quay.io/hosted-tool/ht.git", + "has_checker": false, + "id": 100, + "input_file_formats": [], + "is_published": false, + "labels": [], + "lastUpdated": 1480363243873, + "last_modified": null, + "last_modified_date": null, + "mode": "HOSTED", + "name": "ht", + "namespace": "hosted-tool", + "output_file_formats": [], + "path": "quay.io/hosted-tool/ht", + "registry": "QUAY_IO", + "registry_string": "quay.io", + "starredUsers": [], + "tool_path": "quay.io/hosted-tool/ht", + "topicId": null, + "users": null, + "workflowVersions": [] + } +] diff --git a/src/app/mytools/my-tool/my-tool.component.html b/src/app/mytools/my-tool/my-tool.component.html index 4a0545736d..0cfc5ceaf3 100644 --- a/src/app/mytools/my-tool/my-tool.component.html +++ b/src/app/mytools/my-tool/my-tool.component.html @@ -56,6 +56,33 @@ Register a tool Register a Tool + + + +

    You have not registered any tools diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index d0cd840487..356437c77e 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -222,7 +222,7 @@ export class MyToolComponent extends MyEntry implements OnInit { addToExistingTools(): void { if (this.user) { - this.userService.addUserToWorkflows(this.user.id); + this.userService.addUserToWorkflows(this.user.id, EntryType.Tool); } } diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.html b/src/app/myworkflows/my-workflow/my-workflow.component.html index c3cabefc96..1df6d79448 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.html +++ b/src/app/myworkflows/my-workflow/my-workflow.component.html @@ -62,7 +62,7 @@ Register a {{ entryType | titlecase }} @@ -158,9 +158,10 @@

    Shared with me

    Register a {{ entryType$ | async | titlecase }} - +
  • - If there are already workflows on Dockstore added by other users that you have access to, press the button below. + If there are already {{ entryType$ | async }}s on Dockstore added by other users that you have access to, press the + button below.
  • diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts index c0e669b901..bf6df897a6 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts @@ -27,6 +27,7 @@ import { MyEntriesModule } from '../../shared/modules/my-entries.module'; import { RefreshService } from '../../shared/refresh.service'; import { TokenQuery } from '../../shared/state/token.query'; import { WorkflowService } from '../../shared/state/workflow.service'; +import { ContainerService } from '../../shared/container.service'; import { UsersService } from '../../shared/openapi/api/users.service'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { Configuration } from '../../shared/openapi/configuration'; @@ -46,9 +47,11 @@ import { UsersStubService, WorkflowsStubService, WorkflowStubService, + ContainerStubService, } from '../../test/service-stubs'; import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service'; import { MyWorkflowsService } from '../myworkflows.service'; +import { MytoolsService } from '../../mytools/mytools.service'; import { MyWorkflowComponent } from './my-workflow.component'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { MetadataService } from '../../shared/openapi'; @@ -71,9 +74,11 @@ describe('MyWorkflowsComponent', () => { { provide: UsersService, useClass: UsersStubService }, { provide: AuthService, useClass: AuthStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, + { provide: ContainerService, useClass: ContainerStubService }, { provide: RefreshService, useClass: RefreshStubService }, { provide: RegisterWorkflowModalService, useClass: RegisterWorkflowModalStubService }, MyWorkflowsService, + MytoolsService, TokenQuery, { provide: AccountsService, useClass: AccountsStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts index 6218093668..38468ce7c4 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts @@ -227,7 +227,7 @@ export class MyWorkflowComponent extends MyEntry implements OnInit { addToExistingWorkflows(): void { if (this.user) { - this.userService.addUserToWorkflows(this.user.id); + this.userService.addUserToWorkflows(this.user.id, this.entryType); } } diff --git a/src/app/shared/user/user.service.ts b/src/app/shared/user/user.service.ts index a9022a25fa..094a27d0d6 100644 --- a/src/app/shared/user/user.service.ts +++ b/src/app/shared/user/user.service.ts @@ -6,12 +6,16 @@ import { GravatarService } from '../../gravatar/gravatar.service'; import { AlertService } from '../alert/state/alert.service'; import { TokenService } from '../state/token.service'; import { WorkflowService } from '../state/workflow.service'; +import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { MytoolsService } from '../../mytools/mytools.service'; +import { EntryType } from '../enum/entry-type'; import { Configuration, ExtendedUserData, User, UsersService, Workflow } from '../openapi'; import { TrackLoginService } from '../track-login.service'; import { UserStore } from './user.store'; @Injectable({ providedIn: 'root' }) export class UserService { + EntryType = EntryType; constructor( private userStore: UserStore, private authService: AuthService, @@ -20,6 +24,8 @@ export class UserService { private tokenService: TokenService, private alertService: AlertService, private workflowService: WorkflowService, + private myWorkflowsService: MyWorkflowsService, + private mytoolsService: MytoolsService, private trackLoginService: TrackLoginService, private router: Router, private gravatarService: GravatarService @@ -50,12 +56,18 @@ export class UserService { * * @param userId */ - addUserToWorkflows(userId: number): void { + addUserToWorkflows(userId: number, entryType: EntryType): void { this.alertService.start('Adding user to existing workflows and tools on Dockstore'); this.usersService.addUserToDockstoreWorkflows(userId).subscribe( (workflows: Array) => { this.alertService.detailedSuccess(); - this.workflowService.setWorkflows(workflows); + // This endpoint currently only returns the user's BioWorkflows, and not workflows of all types. + // For consistency, ignoring the workflows response and re-requesting entries of the desired type. + if (entryType === EntryType.Tool) { + this.mytoolsService.getMyEntries(userId, entryType); + } else { + this.myWorkflowsService.getMyEntries(userId, entryType); + } }, (error) => this.alertService.detailedError(error) ); From d6824aea23a2c58f12ccccebd00aab0511dc90a3 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 16 Apr 2024 11:04:04 -0400 Subject: [PATCH 37/98] Bump katex from 0.16.4 to 0.16.10 (#1951) * Bump katex from 0.16.4 to 0.16.10 Bumps [katex](https://github.com/KaTeX/KaTeX) from 0.16.4 to 0.16.10. - [Release notes](https://github.com/KaTeX/KaTeX/releases) - [Changelog](https://github.com/KaTeX/KaTeX/blob/main/CHANGELOG.md) - [Commits](https://github.com/KaTeX/KaTeX/compare/v0.16.4...v0.16.10) --- updated-dependencies: - dependency-name: katex dependency-type: indirect ... Signed-off-by: dependabot[bot] * Update license file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- THIRD-PARTY-LICENSES.csv | 2 +- package-lock.json | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 8d66a916fc..8eed995ee8 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -191,7 +191,7 @@ "json-parse-better-errors@1.0.2","MIT","https://github.com/zkat/json-parse-better-errors" "json-schema-traverse@0.4.1","MIT","https://github.com/epoberezkin/json-schema-traverse" "jsonparse@1.3.1","MIT","https://github.com/creationix/jsonparse" -"katex@0.16.4","MIT","https://github.com/KaTeX/KaTeX" +"katex@0.16.10","MIT","https://github.com/KaTeX/KaTeX" "khroma@2.0.0","MIT*","https://github.com/fabiospampinato/khroma" "lodash-es@4.17.21","MIT","https://github.com/lodash/lodash" "lodash.debounce@4.0.8","MIT","https://github.com/lodash/lodash" diff --git a/package-lock.json b/package-lock.json index ff305209ee..e5bdc4dc15 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14998,16 +14998,16 @@ } }, "node_modules/katex": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", - "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", "funding": [ "https://opencollective.com/katex", "https://github.com/sponsors/katex" ], "optional": true, "dependencies": { - "commander": "^8.0.0" + "commander": "^8.3.0" }, "bin": { "katex": "cli.js" @@ -34894,12 +34894,12 @@ } }, "katex": { - "version": "0.16.4", - "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.4.tgz", - "integrity": "sha512-WudRKUj8yyBeVDI4aYMNxhx5Vhh2PjpzQw1GRu/LVGqL4m1AxwD1GcUp0IMbdJaf5zsjtj8ghP0DOQRYhroNkw==", + "version": "0.16.10", + "resolved": "https://registry.npmjs.org/katex/-/katex-0.16.10.tgz", + "integrity": "sha512-ZiqaC04tp2O5utMsl2TEZTXxa6WSC4yo0fv5ML++D3QZv/vx2Mct0mTlRx3O+uUkjfuAgOkzsCmq5MiUEsDDdA==", "optional": true, "requires": { - "commander": "^8.0.0" + "commander": "^8.3.0" }, "dependencies": { "commander": { From da180a880bfb19d5cf96c7113fc31ba30b49ef63 Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Tue, 16 Apr 2024 13:26:59 -0400 Subject: [PATCH 38/98] Bump postgres version to 16.1 (#1963) https://ucsc-cgl.atlassian.net/browse/SEAB-6334 * Bump postgres version * Update postgres version for accessibility test --- .circleci/config.yml | 2 +- .github/workflows/accessibility_test.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index faccc14acc..327257c41c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -280,7 +280,7 @@ parameters: default: "17.0.4-browsers" postgres-tag: type: string - default: "13.3" + default: "16.1" python-tag: type: string default: "3.11" diff --git a/.github/workflows/accessibility_test.yml b/.github/workflows/accessibility_test.yml index af4b361d76..e2f7b0bc7c 100644 --- a/.github/workflows/accessibility_test.yml +++ b/.github/workflows/accessibility_test.yml @@ -16,7 +16,7 @@ jobs: runs-on: ubuntu-20.04 services: postgres: - image: postgres:13.3 + image: postgres:16.1 env: POSTGRES_USER: postgres POSTGRES_DB: postgres From 87af0845c8f27400e7a975e119d9b6d2cce73d67 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Tue, 23 Apr 2024 15:45:41 -0700 Subject: [PATCH 39/98] add warning to Entry page that GitHub App might be uninstalled https://ucsc-cgl.atlassian.net/browse/DOCK-2312 dockstore/dockstore#5331 --- cypress/e2e/group2/myworkflows.ts | 23 +++++++++++++++++++++++ package.json | 8 ++++---- src/app/workflow/workflow.component.html | 20 ++++++++++++++++++++ src/app/workflow/workflow.component.ts | 13 +++++++++++++ 4 files changed, 60 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index b5cb241bba..ff5381f2a7 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -17,6 +17,7 @@ import { Repository } from '../../../src/app/shared/openapi/model/repository'; import { goToTab, insertAuthors, + invokeSql, isActiveTab, resetDB, setTokenUserViewPort, @@ -645,3 +646,25 @@ describe('Should handle no workflows correctly', () => { cy.contains('Register a Workflow'); }); }); +describe('GitHub App installation', () => { + resetDB(); + setTokenUserViewPort(); + it('Should display a warning when the GitHub app is not installed', () => { + invokeSql("update workflow set mode='DOCKSTORE_YML'"); + // Warning should not appear on private page if not uninstalled + cy.intercept('GET', '/api/entries/*/syncStatus', { + body: { gitHubAppInstalled: true }, + }); + cy.visit('/my-workflows/github.com/A/l'); + cy.get('mat-card').should('not.contain', 'uninstalled'); + // Warning should appear on private page if uninstalled + cy.intercept('GET', '/api/entries/*/syncStatus', { + body: { gitHubAppInstalled: false }, + }); + cy.reload(); + cy.get('mat-card').should('contain', 'uninstalled'); + // Warning should not appear on public page + cy.visit('/workflows/github.com/A/l'); + cy.get('mat-card').should('not.contain', 'uninstalled'); + }); +}); diff --git a/package.json b/package.json index 15e508de16..a3534b5ef4 100644 --- a/package.json +++ b/package.json @@ -1,12 +1,12 @@ { "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "license": "Apache License 2.0", "config": { - "webservice_version": "1.15.0-rc.2", + "webservice_version": "1.16.0", "use_circle": true, - "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/11118/workflows/fd1cfead-4230-49d5-8109-8ea9b46b918f/jobs/42553/artifacts", - "circle_build_id": "42553" + "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/11135/workflows/fa998d0e-13c1-4ba2-8f6c-c535d4731e7d/jobs/42660/artifacts", + "circle_build_id": "42660" }, "scripts": { "ng": "npx ng", diff --git a/src/app/workflow/workflow.component.html b/src/app/workflow/workflow.component.html index 4fee318494..e304b2f1c5 100644 --- a/src/app/workflow/workflow.component.html +++ b/src/app/workflow/workflow.component.html @@ -47,6 +47,26 @@

    The workflow linked to could not be found!

    This {{ workflow.entryTypeMetadata.term }} was archived on {{ workflow.dbUpdateDate | date: 'yyyy-MM-dd' }}. It is now read-only.
    +
    + + warning This {{ workflow.entryTypeMetadata.term }} may not be automatically updating + because the Dockstore GitHub App was uninstalled from the {{ workflow.entryTypeMetadata.term }}'s repository. If you are an owner or + admin of the repository, click the button below to reinstall the Dockstore GitHub App. +

    + +

    +
    diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 1e9d888fce..5f4442958a 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -42,6 +42,7 @@ import { import { DateService } from '../shared/date.service'; import { DescriptorTypeCompatService } from '../shared/descriptor-type-compat.service'; import { DockstoreService } from '../shared/dockstore.service'; +import { Dockstore } from '../shared/dockstore.model'; import { Entry } from '../shared/entry'; import { EntryType } from '../shared/enum/entry-type'; import { GA4GHFilesService } from '../shared/ga4gh-files/ga4gh-files.service'; @@ -53,6 +54,7 @@ import { ExtendedWorkflowQuery } from '../shared/state/extended-workflow.query'; import { WorkflowQuery } from '../shared/state/workflow.query'; import { WorkflowService } from '../shared/state/workflow.service'; import { Permission, ToolDescriptor, WorkflowsService, EntriesService, WorkflowSubClass } from '../shared/openapi'; +import { SyncStatus } from '../shared/openapi/model/syncStatus'; import { Tag } from '../shared/openapi/model/tag'; import { Workflow } from '../shared/openapi/model/workflow'; import { WorkflowVersion } from '../shared/openapi/model/workflowVersion'; @@ -77,6 +79,7 @@ export class WorkflowComponent extends Entry implements AfterVi public sortedVersions: Array = []; private resourcePath: string; public showRedirect = false; + public gitHubAppInstalled: boolean | null; public githubPath = 'github.com/'; public gitlabPath = 'gitlab.com/'; public bitbucketPath = 'bitbucket.org/'; @@ -297,6 +300,12 @@ export class WorkflowComponent extends Entry implements AfterVi }); } }); + this.entryService + .syncStatus(this.workflow.id) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((syncStatus: SyncStatus) => { + this.gitHubAppInstalled = syncStatus.gitHubAppInstalled; + }); } this.updateVerifiedPlatforms(this.workflow.id); this.updateCategories(this.workflow.id, this.workflow.is_published); @@ -537,4 +546,8 @@ export class WorkflowComponent extends Entry implements AfterVi this.workflowEditData.labels.splice(index, 1); } } + + openGitHubApp(): void { + window.open(Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new', '_blank', 'noopener,noreferrer'); + } } From d8aba8a02016a72102f8fe8233bdd1985bc262c3 Mon Sep 17 00:00:00 2001 From: Lucia Zhang <122565245+ll5zh@users.noreply.github.com> Date: Fri, 26 Apr 2024 13:49:00 -0400 Subject: [PATCH 40/98] Upgrade to Cypress 13 (#1966) * try cypress 13 upgrade * update license * fix mytools test's input failure * see if experimentalMemoryManagement resolves crashes * will the newest version help performance? * try fixing organizations test (remove entry from collection) * try fixing mytools (get buttons by data-cy) * try intercepting tool's unpublish request * try fixing checker flake (add visit, add visibility assertion) * fix some flakes/errors - mytools: scrollIntoView might help with typing in modals - checkerWorkflowFromWorkflow: apply same visibility assertion as tool version * fix goodTopic flake * add assertions to fix searchTable flake * try longer wait time in linkCheck * fix link in download cli client (handled in hotfix, but fix here to pass linkCheck) * hopefully handle occasional flakes - myworkflows: visibility assertion to fix typing - starErrorMessage: assert starred state * myworkflows fix didn't work - try scrollIntoView? * try scrolling into modal * mat-horizontal-stepper errored more * add wait for redirect, observe decode * try moving intercept to beforeEach --- THIRD-PARTY-LICENSES.csv | 2 +- cypress.config.ts | 1 + .../e2e/group1/checkerWorkflowFromTools.ts | 8 +- .../e2e/group1/checkerWorkflowFromWorkflow.ts | 4 +- cypress/e2e/group2/myworkflows.ts | 6 +- cypress/e2e/group2/organizations.ts | 2 +- cypress/e2e/group3/mytools.ts | 10 +- cypress/e2e/group3/starErrorMessage.ts | 1 + .../e2e/immutableDatabaseTests/linkCheck.ts | 4 +- .../e2e/immutableDatabaseTests/searchTable.ts | 14 +- .../e2e/immutableDatabaseTests/services.ts | 15 +- package-lock.json | 242 +++++++++--------- package.json | 2 +- .../downloadcliclient.component.ts | 2 +- 14 files changed, 164 insertions(+), 149 deletions(-) diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 8eed995ee8..e7e2c81b7b 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -207,7 +207,7 @@ "mathjax@3.2.2","Apache-2.0","https://github.com/mathjax/MathJax" "mermaid@9.3.0","MIT","https://github.com/mermaid-js/mermaid" "minimatch@3.1.2","ISC","https://github.com/isaacs/minimatch" -"minimist@1.2.6","MIT","https://github.com/substack/minimist" +"minimist@1.2.8","MIT","https://github.com/minimistjs/minimist" "minipass@2.9.0","ISC","https://github.com/isaacs/minipass" "minizlib@1.3.3","MIT","https://github.com/isaacs/minizlib" "mississippi@3.0.0","BSD-2-Clause","https://github.com/maxogden/mississippi" diff --git a/cypress.config.ts b/cypress.config.ts index c9cea186bd..c26c4d4535 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -6,6 +6,7 @@ export default defineConfig({ viewportWidth: 1440, defaultCommandTimeout: 30000, requestTimeout: 30000, + experimentalMemoryManagement: true, retries: { runMode: 3, openMode: 0, diff --git a/cypress/e2e/group1/checkerWorkflowFromTools.ts b/cypress/e2e/group1/checkerWorkflowFromTools.ts index ad89bea71a..9e9c718a24 100644 --- a/cypress/e2e/group1/checkerWorkflowFromTools.ts +++ b/cypress/e2e/group1/checkerWorkflowFromTools.ts @@ -19,6 +19,7 @@ describe('Checker workflow test from my-tools', () => { resetDB(); setTokenUserViewPort(); beforeEach(() => { + cy.intercept('api/containers/*?include=validations').as('getTool'); // Visit my-tools page cy.visit('/my-tools'); }); @@ -34,7 +35,6 @@ describe('Checker workflow test from my-tools', () => { describe('Should be able to register and publish a checker workflow from a tool', () => { it('visit a tool and have the correct buttons and be able to register a checker workflow', () => { - cy.intercept('api/containers/*?include=validations').as('getTool'); cy.wait('@getTool'); goToB3(); @@ -43,9 +43,9 @@ describe('Checker workflow test from my-tools', () => { cy.get('#launchCheckerWorkflow').should('not.exist'); cy.get('#addCheckerWorkflowButton').should('be.visible').click(); - cy.get('#checkerWorkflowPath').type('/Dockstore.cwl'); + cy.get('#checkerWorkflowPath').should('be.visible').type('/Dockstore.cwl'); - cy.get('#checkerWorkflowTestParameterFilePath').type('/test.json'); + cy.get('#checkerWorkflowTestParameterFilePath').should('be.visible').type('/test.json'); cy.get('#submitButton').click(); @@ -89,12 +89,14 @@ describe('Checker workflow test from my-tools', () => { }); it('visit the tool and have its publish/unpublish reflected in the checker workflow', () => { cy.intercept('api/containers/*?include=validations').as('getTool'); + cy.intercept('api/containers/4/publish').as('unpublishTool'); cy.wait('@getTool'); goToB3(); // In the parent tool right now // Didn't change the tool path upon entry or select // cy.url().should('eq','/my-tools/quay.io/A2/b3') cy.get('#publishToolButton').should('be.visible').should('contain', 'Unpublish').click(); + cy.wait('@unpublishTool'); goToTab('Versions'); cy.contains('button', 'Actions').should('be.visible').click(); diff --git a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts index a20344e021..b508c05224 100644 --- a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts +++ b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts @@ -46,8 +46,8 @@ describe('Checker workflow test from my-workflows', () => { cy.get('#launchCheckerWorkflow').should('not.exist'); goToTab('Info'); cy.get('#addCheckerWorkflowButton').should('be.visible').click(); - cy.get('#checkerWorkflowPath').type('/Dockstore.cwl'); - cy.get('#checkerWorkflowTestParameterFilePath').type('/test.json'); + cy.get('#checkerWorkflowPath').should('be.visible').type('/Dockstore.cwl'); + cy.get('#checkerWorkflowTestParameterFilePath').should('be.visible').type('/test.json'); cy.fixture('refreshedChecker').then((json) => { cy.intercept('GET', '/api/workflows/*/refresh', { body: json, diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index ff5381f2a7..f0b1c3373e 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -229,7 +229,7 @@ describe('Dockstore my workflows', () => { cy.contains('goodTopic').should('not.exist'); cy.visit(privateEntryURI); - cy.get('.mat-radio-label').contains('Manual').click(); + cy.contains('mat-radio-button', 'Manual').find('input').should('not.be.disabled').click({ force: true }); cy.visit(privateEntryURI); cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); cy.contains('goodTopic').should('exist'); @@ -529,9 +529,9 @@ describe('Dockstore my workflows part 3', () => { // Untouched form should not have errors but is disabled cy.get('#submitButton').should('be.disabled'); notHaveAlert(); - cy.get('#sourceCodeRepositoryInput').clear().type('beef/stew'); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').clear().type('beef/stew'); cy.get('#submitButton').should('be.disabled'); - cy.get('#sourceCodeRepositoryWorkflowPathInput').clear().type('/Dockstore.cwl'); + cy.get('#sourceCodeRepositoryWorkflowPathInput').scrollIntoView().should('be.visible').clear().type('/Dockstore.cwl'); notHaveAlert(); // Apparently the actual radio button inside Angular material buttons is hidden, so doing it this way cy.get('#descriptorTypeRadioButtons').contains(cwlDescriptorType).find('.mat-radio-container').click(); diff --git a/cypress/e2e/group2/organizations.ts b/cypress/e2e/group2/organizations.ts index e605ef31e5..deddba8abf 100644 --- a/cypress/e2e/group2/organizations.ts +++ b/cypress/e2e/group2/organizations.ts @@ -280,6 +280,7 @@ describe('Dockstore Organizations', () => { cy.url().should('include', url); cy.get('[data-cy=cancel-remove-entry-from-org]').click(); cy.url().should('include', url); + cy.get('app-collection-entry-confirm-remove').should('not.exist'); cy.get('#removeEntryButton').click(); cy.url().should('include', url); cy.get('[data-cy=accept-remove-entry-from-org]').click(); @@ -293,7 +294,6 @@ describe('Dockstore Organizations', () => { cy.contains('This collection has no associated entries'); cy.visit('/organizations/Potatoe'); cy.contains('Members').should('be.visible'); - approvePotatoOrganization(); for (const url of ['/organizations', '/organizations/Potatoe', '/organizations/Potatoe/collections/veryFakeCollectionName']) { cy.visit(url); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 10788f4264..45dc6458a0 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -144,7 +144,7 @@ describe('Dockstore my tools', () => { selectTool('b1'); cy.contains('Versions').click(); cy.contains('button', 'Actions').should('be.visible').click(); - cy.contains('button:visible', 'Edit').should('be.visible').click(); + cy.get('[data-cy=editTagButton]').should('be.visible').click(); // For some unknown reason, Cypress likes to type '/test.wdl.json' in the wrong place cy.wait(5000); cy.get('input[data-cy=addWDLField]').should('be.visible').should('have.value', '').type('/test.wdl.json'); @@ -152,7 +152,7 @@ describe('Dockstore my tools', () => { cy.get('#saveVersionModal').click(); cy.get('#saveVersionModal').should('not.exist'); cy.contains('button', 'Actions').should('be.visible').click(); - cy.contains('button:visible', 'Edit').should('be.visible').click(); + cy.get('[data-cy=editTagButton]').should('be.visible').click(); cy.get('#removeCWLTestParameterFileButton').click(); cy.get('#removeWDLTestParameterFileButton').click(); cy.get('#saveVersionModal').click(); @@ -278,7 +278,7 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname').wait(1000); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('Amazon ECR').click(); @@ -342,7 +342,7 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname').wait(1000); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('Amazon ECR').click(); @@ -448,7 +448,7 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname').wait(1000); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('mat-option', 'Seven Bridges').click(); diff --git a/cypress/e2e/group3/starErrorMessage.ts b/cypress/e2e/group3/starErrorMessage.ts index 48ed4e6df7..acd93a7e48 100644 --- a/cypress/e2e/group3/starErrorMessage.ts +++ b/cypress/e2e/group3/starErrorMessage.ts @@ -39,6 +39,7 @@ describe('Tool and workflow starring error messages', () => { cy.visit(url); cy.get('#starringButtonIcon').click(); + cy.get('#starCountButton').should('contain', 1); cy.intercept('PUT', routePath, { body: 'You cannot unstar the ' + type + ' ' + name + ' because you have not starred it.', diff --git a/cypress/e2e/immutableDatabaseTests/linkCheck.ts b/cypress/e2e/immutableDatabaseTests/linkCheck.ts index 1158b5e21b..7b36c7e8f3 100644 --- a/cypress/e2e/immutableDatabaseTests/linkCheck.ts +++ b/cypress/e2e/immutableDatabaseTests/linkCheck.ts @@ -25,7 +25,7 @@ describe('Find broken anchor links', () => { function checkUrls(path: string) { let brokenUrls = []; - cy.visit(path).wait(500); // Temporary solution to ensure the page loads entirely + cy.visit(path).wait(1000); // Temporary solution to ensure the page loads entirely cy.get('a') .each((anchor) => { cy.get(anchor).then((anchor) => { @@ -73,7 +73,7 @@ describe('Find broken image links', () => { function checkImages(path: string, selector: string) { let brokenImages = []; - cy.visit(path).wait(500); + cy.visit(path).wait(1000); cy.get('app-root').should('be.visible'); cy.get('img') .each((image) => { diff --git a/cypress/e2e/immutableDatabaseTests/searchTable.ts b/cypress/e2e/immutableDatabaseTests/searchTable.ts index 8b7ca4d8bc..e71196d1ef 100644 --- a/cypress/e2e/immutableDatabaseTests/searchTable.ts +++ b/cypress/e2e/immutableDatabaseTests/searchTable.ts @@ -394,28 +394,32 @@ describe('search table items per page', () => { cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=file_select').should('not.exist'); - cy.get('[data-cy=desc_select').should('be.visible').click(); + cy.get('[data-cy=file_select]').should('not.exist'); + cy.get('[data-cy=desc_select]').should('be.visible').click(); cy.get('[data-cy=NOTFilter]').click().type('garyluu'); cy.get('[data-cy=confirm-search]').click(); + // Check that the advanced search dialog box has been closed + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=clear-advanced-search]').click(); + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=desc_select').should('be.visible').click(); + cy.get('[data-cy=desc_select]').should('be.visible').click(); cy.get('[data-cy=dropdown]').click(); - cy.get('[data-cy=desc_select').should('not.exist'); - cy.get('[data-cy=file_select').should('be.visible').click(); + cy.get('[data-cy=desc_select]').should('not.exist'); + cy.get('[data-cy=file_select]').should('be.visible').click(); cy.get('[data-cy=ANDNoSplitFilter]').click().type('gary'); cy.get('[data-cy=ORFilter]').click().type('A2'); cy.get('[data-cy=NOTFilter]').click().type('b3'); cy.get('[data-cy=confirm-search]').click(); + cy.get('app-advancedsearch').should('not.exist'); cy.get('[data-cy=advanced-search]').click(); cy.get('[data-cy=clear-advanced-search]').click(); diff --git a/cypress/e2e/immutableDatabaseTests/services.ts b/cypress/e2e/immutableDatabaseTests/services.ts index b4b4851258..705f62b6d7 100644 --- a/cypress/e2e/immutableDatabaseTests/services.ts +++ b/cypress/e2e/immutableDatabaseTests/services.ts @@ -27,21 +27,28 @@ import { describe('Dockstore Home', () => { describe('GitHub App Callback Routing', () => { setTokenUserViewPort(); + beforeEach(() => { + cy.intercept('GET', '/api/metadata/entryTypeMetadataList').as('getMetadata'); + }); it('Redirects to my-tools', () => { cy.visit('/githubCallback?state=/my-tools/quay.io/A2/b1'); - cy.url().should('contain', '/my-tools/quay.io/A2/b1'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fmy-tools%2Fquay.io%2FA2%2Fb1'); }); it('Redirects to my-workflows', () => { cy.visit('/githubCallback?state=/my-workflows/github.com/A/l'); - cy.url().should('contain', '/my-workflows/github.com/A/l'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fmy-workflows%2Fgithub.com%2FA%2Fl'); }); it('Redirects to my-services', () => { cy.visit('/githubCallback?state=/services/github.com/garyluu/another-test-service'); - cy.url().should('contain', '/services/github.com/garyluu/another-test-service'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fservices%2Fgithub.com%2Fgaryluu%2Fanother-test-service'); }); it('Redirects to dashboard', () => { cy.visit('githubCallback?state=/dashboard'); - cy.url().should('contain', '/dashboard'); + cy.wait('@getMetadata'); + cy.url().should('contain', '%2Fdashboard'); }); }); diff --git a/package-lock.json b/package-lock.json index e5bdc4dc15..49e4edbfc2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -72,7 +72,7 @@ "@types/node": "^15.12.2", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", - "cypress": "^12.3.0", + "cypress": "^13.7.2", "eslint": "^8.2.0", "husky": "^7.0.0", "jasmine-core": "^3.7.1", @@ -2902,9 +2902,9 @@ } }, "node_modules/@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "dependencies": { "aws-sign2": "~0.7.0", @@ -2920,7 +2920,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "6.10.4", "safe-buffer": "^5.1.2", "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", @@ -7627,7 +7627,7 @@ "node_modules/assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true, "engines": { "node": ">=0.8" @@ -7688,7 +7688,7 @@ "node_modules/asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "node_modules/at-least-node": { @@ -7760,16 +7760,16 @@ "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true, "engines": { "node": "*" } }, "node_modules/aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "node_modules/axe-core": { @@ -7966,7 +7966,7 @@ "node_modules/bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "dependencies": { "tweetnacl": "^0.14.3" @@ -8541,7 +8541,7 @@ "node_modules/caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "node_modules/chalk": { @@ -9173,9 +9173,9 @@ } }, "node_modules/commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true, "engines": { "node": ">= 6" @@ -9947,30 +9947,29 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "node_modules/cypress": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.3.0.tgz", - "integrity": "sha512-ZQNebibi6NBt51TRxRMYKeFvIiQZ01t50HSy7z/JMgRVqBUey3cdjog5MYEbzG6Ktti5ckDt1tfcC47lmFwXkw==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.2.tgz", + "integrity": "sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==", "dev": true, "hasInstallScript": true, "dependencies": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", @@ -9979,18 +9978,19 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", @@ -10000,15 +10000,9 @@ "cypress": "bin/cypress" }, "engines": { - "node": "^14.0.0 || ^16.0.0 || >=18.0.0" + "node": "^16.0.0 || ^18.0.0 || >=20.0.0" } }, - "node_modules/cypress/node_modules/@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", - "dev": true - }, "node_modules/cypress/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -10079,6 +10073,21 @@ "node": ">=8" } }, + "node_modules/cypress/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cypress/node_modules/supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -10575,7 +10584,7 @@ "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -10809,7 +10818,7 @@ "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true, "engines": { "node": ">=0.4.0" @@ -11079,7 +11088,7 @@ "node_modules/ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "dependencies": { "jsbn": "~0.1.0", @@ -12255,7 +12264,7 @@ "node_modules/extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true, "engines": [ "node >=0.6.0" @@ -12571,7 +12580,7 @@ "node_modules/forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true, "engines": { "node": "*" @@ -12900,7 +12909,7 @@ "node_modules/getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "dependencies": { "assert-plus": "^1.0.0" @@ -14402,7 +14411,7 @@ "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "node_modules/is-unicode-supported": { @@ -14500,7 +14509,7 @@ "node_modules/isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "node_modules/istanbul-lib-coverage": { @@ -14674,7 +14683,7 @@ "node_modules/jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "node_modules/jsesc": { @@ -14720,7 +14729,7 @@ "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "node_modules/json5": { @@ -16226,9 +16235,12 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "4.2.8", @@ -17727,15 +17739,6 @@ "lodash": "^4.17.14" } }, - "node_modules/pa11y-ci/node_modules/commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true, - "engines": { - "node": ">= 6" - } - }, "node_modules/pa11y-ci/node_modules/globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -18217,7 +18220,7 @@ "node_modules/performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "node_modules/picocolors": { @@ -20602,9 +20605,9 @@ "dev": true }, "node_modules/sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "dependencies": { "asn1": "~0.2.3", @@ -21919,7 +21922,7 @@ "node_modules/tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "dependencies": { "safe-buffer": "^5.0.1" @@ -21931,7 +21934,7 @@ "node_modules/tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "node_modules/type-check": { @@ -22369,7 +22372,7 @@ "node_modules/verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "engines": [ "node >=0.6.0" @@ -25387,9 +25390,9 @@ } }, "@cypress/request": { - "version": "2.88.12", - "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.12.tgz", - "integrity": "sha512-tOn+0mDZxASFM+cuAP9szGUGPI1HwWVSvdzm7V4cCsPdFTx6qMj29CwaQmRAMIEhORIUBFBsYROYJcveK4uOjA==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-3.0.1.tgz", + "integrity": "sha512-TWivJlJi8ZDx2wGOw1dbLuHJKUYX7bWySw377nlnGOW3hP9/MUKIsEdXT/YngWxVdgNCHRBmFlBipE+5/2ZZlQ==", "dev": true, "requires": { "aws-sign2": "~0.7.0", @@ -25405,7 +25408,7 @@ "json-stringify-safe": "~5.0.1", "mime-types": "~2.1.19", "performance-now": "^2.1.0", - "qs": "~6.10.3", + "qs": "6.10.4", "safe-buffer": "^5.1.2", "tough-cookie": "^4.1.3", "tunnel-agent": "^0.6.0", @@ -29247,7 +29250,7 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", "dev": true }, "assign-symbols": { @@ -29278,7 +29281,7 @@ "asynckit": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", "dev": true }, "at-least-node": { @@ -29316,13 +29319,13 @@ "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==", "dev": true }, "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "version": "1.12.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.12.0.tgz", + "integrity": "sha512-NmWvPnx0F1SfrQbYwOi7OeaNGokp9XhzNioJ/CSBs8Qa4vxug81mhJEAVZwxXuBmYB5KDRfMq/F3RR0BIU7sWg==", "dev": true }, "axe-core": { @@ -29474,7 +29477,7 @@ "bcrypt-pbkdf": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", "dev": true, "requires": { "tweetnacl": "^0.14.3" @@ -29921,7 +29924,7 @@ "caseless": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", "dev": true }, "chalk": { @@ -30398,9 +30401,9 @@ } }, "commander": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", - "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", + "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, "common-tags": { @@ -31006,29 +31009,28 @@ "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" }, "cypress": { - "version": "12.3.0", - "resolved": "https://registry.npmjs.org/cypress/-/cypress-12.3.0.tgz", - "integrity": "sha512-ZQNebibi6NBt51TRxRMYKeFvIiQZ01t50HSy7z/JMgRVqBUey3cdjog5MYEbzG6Ktti5ckDt1tfcC47lmFwXkw==", + "version": "13.7.2", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-13.7.2.tgz", + "integrity": "sha512-FF5hFI5wlRIHY8urLZjJjj/YvfCBrRpglbZCLr/cYcL9MdDe0+5usa8kTIrDHthlEc9lwihbkb5dmwqBDNS2yw==", "dev": true, "requires": { - "@cypress/request": "^2.88.10", + "@cypress/request": "^3.0.0", "@cypress/xvfb": "^1.2.4", - "@types/node": "^14.14.31", "@types/sinonjs__fake-timers": "8.1.1", "@types/sizzle": "^2.3.2", "arch": "^2.2.0", "blob-util": "^2.0.2", "bluebird": "^3.7.2", - "buffer": "^5.6.0", + "buffer": "^5.7.1", "cachedir": "^2.3.0", "chalk": "^4.1.0", "check-more-types": "^2.24.0", "cli-cursor": "^3.1.0", "cli-table3": "~0.6.1", - "commander": "^5.1.0", + "commander": "^6.2.1", "common-tags": "^1.8.0", "dayjs": "^1.10.4", - "debug": "^4.3.2", + "debug": "^4.3.4", "enquirer": "^2.3.6", "eventemitter2": "6.4.7", "execa": "4.1.0", @@ -31037,30 +31039,25 @@ "figures": "^3.2.0", "fs-extra": "^9.1.0", "getos": "^3.2.1", - "is-ci": "^3.0.0", + "is-ci": "^3.0.1", "is-installed-globally": "~0.4.0", "lazy-ass": "^1.6.0", "listr2": "^3.8.3", "lodash": "^4.17.21", "log-symbols": "^4.0.0", - "minimist": "^1.2.6", + "minimist": "^1.2.8", "ospath": "^1.2.2", "pretty-bytes": "^5.6.0", + "process": "^0.11.10", "proxy-from-env": "1.0.0", "request-progress": "^3.0.0", - "semver": "^7.3.2", + "semver": "^7.5.3", "supports-color": "^8.1.1", "tmp": "~0.2.1", "untildify": "^4.0.0", "yauzl": "^2.10.0" }, "dependencies": { - "@types/node": { - "version": "14.18.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.10.tgz", - "integrity": "sha512-6iihJ/Pp5fsFJ/aEDGyvT4pHGmCpq7ToQ/yf4bl5SbVAvwpspYJ+v3jO7n8UyjhQVHTy+KNszOozDdv+O6sovQ==", - "dev": true - }, "ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -31112,6 +31109,15 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", @@ -31484,7 +31490,7 @@ "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -31663,7 +31669,7 @@ "delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", "dev": true }, "delegate": { @@ -31890,7 +31896,7 @@ "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", "dev": true, "requires": { "jsbn": "~0.1.0", @@ -32816,7 +32822,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", "dev": true }, "fast-deep-equal": { @@ -33070,7 +33076,7 @@ "forever-agent": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", "dev": true }, "form-data": { @@ -33334,7 +33340,7 @@ "getpass": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", "dev": true, "requires": { "assert-plus": "^1.0.0" @@ -34429,7 +34435,7 @@ "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", "dev": true }, "is-unicode-supported": { @@ -34500,7 +34506,7 @@ "isstream": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", "dev": true }, "istanbul-lib-coverage": { @@ -34636,7 +34642,7 @@ "jsbn": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, "jsesc": { @@ -34676,7 +34682,7 @@ "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", "dev": true }, "json5": { @@ -35836,9 +35842,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "4.2.8", @@ -37025,12 +37031,6 @@ "lodash": "^4.17.14" } }, - "commander": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.1.tgz", - "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", - "dev": true - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -37411,7 +37411,7 @@ "performance-now": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", "dev": true }, "picocolors": { @@ -39282,9 +39282,9 @@ "dev": true }, "sshpk": { - "version": "1.17.0", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", - "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "version": "1.18.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.18.0.tgz", + "integrity": "sha512-2p2KJZTSqQ/I3+HX42EpYOa2l3f8Erv8MWKsy2I9uf4wA7yFIkXRffYdsx86y6z4vHtV8u7g+pPlr8/4ouAxsQ==", "dev": true, "requires": { "asn1": "~0.2.3", @@ -40322,7 +40322,7 @@ "tunnel-agent": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", "dev": true, "requires": { "safe-buffer": "^5.0.1" @@ -40331,7 +40331,7 @@ "tweetnacl": { "version": "0.14.5", "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", "dev": true }, "type-check": { @@ -40665,7 +40665,7 @@ "verror": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", "dev": true, "requires": { "assert-plus": "^1.0.0", diff --git a/package.json b/package.json index a3534b5ef4..48ce38f1a9 100644 --- a/package.json +++ b/package.json @@ -104,7 +104,7 @@ "@types/node": "^15.12.2", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", - "cypress": "^12.3.0", + "cypress": "^13.7.2", "eslint": "^8.2.0", "husky": "^7.0.0", "jasmine-core": "^3.7.1", diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index 67f7ef0eb2..b194c86815 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -81,7 +81,7 @@ export class DownloadCLIClientComponent extends Base implements OnInit { ### Setup Command Line Interface ------------------------------ Set up our Dockstore CLI application in order to test workflows from the command line for [local development](${Dockstore.DOCUMENTATION_URL}/launch-with/launch.html#dockstore-cli), [validate .dockstore.yml files](${Dockstore.DOCUMENTATION_URL}/advanced-topics/dockstore-cli/yaml-command-line-validator-tool.html) for registering tools and workflows, -run scripts or interact programmatically against Dockstore APIs, and [run workflows via the GA4GH WES standard](${Dockstore.DOCUMENTATION_URL}/advanced-topics/wes/wes-agc-tutorial.html) in platforms such as Amazon Genomics CLI. +run scripts or interact programmatically against Dockstore APIs, and [run workflows via the GA4GH WES standard](${Dockstore.DOCUMENTATION_URL}/advanced-topics/wes/cli-wes-tutorial.html) in platforms such as Amazon Genomics CLI. #### Requirements 1. Linux/Ubuntu (Recommended - Tested on 22.04 LTS) or Mac OS X machine From 98d079ab6877602b5fb4c2e6133d95c44b4f430e Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Wed, 1 May 2024 11:25:16 -0700 Subject: [PATCH 41/98] Update Mac OS Quickstart (#1964) See PR comments. --- .../downloadcliclient.component.ts | 87 +++++++++++-------- .../onboarding/onboarding.component.html | 2 +- 2 files changed, 54 insertions(+), 35 deletions(-) diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index b194c86815..39c2ea7baa 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -78,9 +78,9 @@ export class DownloadCLIClientComponent extends Base implements OnInit { } generateMarkdown(): void { this.textDataRequirements = ` -### Setup Command Line Interface +### Set Up Command Line Interface ------------------------------ -Set up our Dockstore CLI application in order to test workflows from the command line for [local development](${Dockstore.DOCUMENTATION_URL}/launch-with/launch.html#dockstore-cli), [validate .dockstore.yml files](${Dockstore.DOCUMENTATION_URL}/advanced-topics/dockstore-cli/yaml-command-line-validator-tool.html) for registering tools and workflows, +You can search for workflows or launch them with our cloud partners using the Dockstore website, but we also provide a command-line tool to make developing and launching workflows more convenient. Set up our Dockstore CLI application in order to test workflows from the command line for [local development](${Dockstore.DOCUMENTATION_URL}/launch-with/launch.html#dockstore-cli), [validate .dockstore.yml files](${Dockstore.DOCUMENTATION_URL}/advanced-topics/dockstore-cli/yaml-command-line-validator-tool.html) for registering tools and workflows, run scripts or interact programmatically against Dockstore APIs, and [run workflows via the GA4GH WES standard](${Dockstore.DOCUMENTATION_URL}/advanced-topics/wes/cli-wes-tutorial.html) in platforms such as Amazon Genomics CLI. #### Requirements @@ -90,14 +90,17 @@ run scripts or interact programmatically against Dockstore APIs, and [run workfl `; this.textDataUbuntuLinux = ` -#### Part 1 - Install dependencies -1. Install Java 17 (This example installs OpenJDK 17) +#### Part 1 - Install Java +Install Java 17 (This example installs OpenJDK 17) \`\`\` sudo apt-get update -q \ && sudo apt install -y openjdk-17-jdk \`\`\` -2. Install Docker Engine following the instructions on [Docker's website](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository). You should have at least version 19.03.1 installed. Ensure that you install Docker Engine. Docker Desktop does not run containers natively and the Dockstore CLI is not currently compatible with Docker Desktop's use of a VM. -3. Ensure that you are able to run Docker without using sudo directly with the + +#### Part 2 - Install Docker +Install Docker Engine following the instructions on [Docker's website](https://docs.docker.com/engine/install/ubuntu/#install-using-the-repository). You should have at least version 19.03.1 installed. Ensure that you install Docker Engine. The Ubuntu version of Docker Desktop does not run containers natively, so it is not compatible with the Dockstore CLI. + +Ensure that you are able to run Docker without using sudo directly with the [post install instructions](https://docs.docker.com/engine/installation/linux/linux-postinstall/#manage-docker-as-a-non-root-user). \`\`\` sudo usermod -aG docker $USER @@ -106,15 +109,28 @@ exec newgrp docker `; this.textDataMacOs = ` -#### Part 1a - Install Java dependencies -We'll cover two ways to install Java 11. +#### Part 1 - Install Java +There are two ways to install Java on Mac OS. -1. The first way is to download OpenJDK for Mac OS from [here](https://jdk.java.net/archive/), and execute the following commands. First, unpack the downloaded tar archive, then move the resulting JDK directory to its standard location. Then check the Java version: +##### Option A: Install Java manually +You can OpenJDK 17.0.2 for Mac OS from [here](https://jdk.java.net/archive/). If your Mac uses Apple Silicon, you need to download and unpack the Mac/AArch64 version: +\`\`\` +tar -xf openjdk-17.0.2_macos-aarch64_bin.tar.gz +\`\`\` +If your Mac uses Intel hardware, you need the Mac/x64 version instead: +\`\`\` +tar -xf openjdk-17.0.2_macos-x64_bin.tar.gz +\`\`\` +Move the resulting JDK directory to its standard location: +\`\`\` +sudo mv jdk-17.0.2.jdk /Library/Java/JavaVirtualMachines/ +\`\`\` +Then check the Java version: \`\`\` -sudo mv jdk-11.0.2.jdk /Library/Java/JavaVirtualMachines/ java -version \`\`\` -If the reported version is JDK 11, you've correctly installed Java! If not, check the list of the JDKs that are installed; you should see version 11: +Some versions of Mac OS will pop up a window saying that the program cannot be run as it is from an unidentified developer. [See this help page from Apple](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac) on how to fix this. +If the reported version is JDK 17, you've correctly installed Java! If not, check the list of the JDKs that are installed; you should see version 17: \`\`\` /usr/libexec/java_home -V \`\`\` @@ -122,35 +138,37 @@ Next, set the \`JAVA_HOME\` environment variable to the correct JDK system path and confirm the Java version: \`\`\` unset JAVA_HOME -export JAVA_HOME=\`/usr/libexec/java_home -v 11\` +export JAVA_HOME=\`/usr/libexec/java_home -v 17\` java -version \`\`\` -Add the above export line to your \`.bashrc\` or \`.bash_profile\` to set \`JAVA_HOME\` properly every time you invoke a shell. +If you are using Bash, add the above export line to your \`.bashrc\` or \`.bash_profile\` to set \`JAVA_HOME\` properly every time you invoke a shell. Newer versions of Mac OS default to using zsh instead of bash, in which case, add this line to \`.zshrc\` instead. -2. Alternatively, to install Java 11 using Homebrew, execute the following commands: +##### Option B: Install Java with Homebrew +2. Alternatively, to install Java 17 using Homebrew, execute the following commands: \`\`\` brew update -brew install openjdk@11 +brew install openjdk@17 \`\`\` For the system Java wrappers to be able to use this JDK, symlink with the command: \`\`\` -sudo ln -sfn $(brew --prefix)/opt/openjdk@11/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-11.jdk +sudo ln -sfn $(brew --prefix)/opt/openjdk@17/libexec/openjdk.jdk /Library/Java/JavaVirtualMachines/openjdk-17.jdk \`\`\` Next, set the \`JAVA_HOME\` environment variable to the correct JDK system path, and confirm the Java version is correct: \`\`\` unset JAVA_HOME -export JAVA_HOME=\`/usr/libexec/java_home -v 11\` +export JAVA_HOME=\`/usr/libexec/java_home -v 17\` java -version \`\`\` +As with option A, you may have to [follow these directions](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unidentified-developer-mh40616/mac) if your computer gives you a warning about an unidentified developer. -#### Part 1b - Install Docker dependencies -Install Docker following the instructions on [Docker's website](https://docs.docker.com/docker-for-mac/install/). You should have at least version 2.0.0.3 installed. +#### Part 2 - Install Docker +Install Docker following the instructions on [Docker's website](https://docs.docker.com/docker-for-mac/install/). You should have at least version 4.3.0 installed. Make sure to install the correct version for your hardware. `; this.textDataInstallCLI = ` -#### Part 2 - Install Dockstore CLI -1. Install the dockstore command-line program and add it to the path. +#### Part 3 - Install Dockstore CLI +Install the dockstore command-line program and add it to the path. (If you are using zsh, change the last two lines to use ~/.zshrc instead of ~/.bashrc) \`\`\` mkdir -p ~/bin curl -L -o ~/bin/dockstore ${this.downloadCli} @@ -158,21 +176,21 @@ chmod +x ~/bin/dockstore echo 'export PATH=~/bin:$PATH' >> ~/.bashrc source ~/.bashrc \`\`\` -2. Alternatively, click here to download and configure the CLI yourself. +As an alternative, click here to download and configure the CLI manually. `; this.textDataCLIConfig = ` -#### Part 3 - Setup Dockstore CLI Config -1. Create the folder \`~/.dockstore\` and create a configuration file \`~/.dockstore/config\`: +#### Part 4 - Set up Dockstore CLI Config +Create the folder \`~/.dockstore\` and create a configuration file \`~/.dockstore/config\`: \`\`\` mkdir -p ~/.dockstore printf "token: ${this.dsToken}\\nserver-url: ${this.dsServerURI}\\n" > ~/.dockstore/config \`\`\` -2. Alternatively, copy this content to your config file directly. +Alternatively, copy this content to your config file directly. `; this.textDataConfirmInstallation = ` -#### Part 4 - Confirm installation -1. Run our dependencies to verify that they have been installed properly. +#### Part 5 - Confirm installation +Run our dependencies to verify that they have been installed properly. (Note that the precise version of openjdk may vary depending on how you installed it.) \`\`\` $ java -version openjdk 17.0.5 2022-10-18 @@ -185,20 +203,21 @@ Hello from Docker! ... \`\`\` -#### Part 5 - Install cwltool (Optional) -Dockstore relies on [cwltool](https://github.com/common-workflow-language/cwltool) -a reference implementation of CWL- for local execution of tools and workflows described with CWL. +At this point, you now have the Dockstore CLI set up for interacting with the Dockstore website, as well as executing WDL workflows. If you wish to run CWL or Nextflow workflows, you will need two more dependencies. + +#### Part 6 - Install cwltool (Optional) +Dockstore relies on [cwltool](https://github.com/common-workflow-language/cwltool) - a reference implementation of CWL - for local execution of tools and workflows described with CWL. You'll need to have Python 3 and [pip3](https://pip.pypa.io/en/latest/installing/) to be installed on your machine. -**Note:** cwltool must be available on your PATH. +**Note:** cwltool must be available on your PATH for the Dockstore CLI to find it. You can install the version of cwltool that we've tested for use with Dockstore using the following commands: -1. Run this to verify that pip has been installed \`pip3 --version\` -2. Run these commands to install cwltool +1. Install cwltool \`\`\` curl -o requirements.txt "${this.dsServerURI}/metadata/runner_dependencies?client_version=${this.dockstoreVersion}&python_version=3" pip3 install -r requirements.txt \`\`\` -3. Verify using \`pip3 list\` that the installed pip packages match the ones specified in the downloaded requirements.txt. Confirm cwltool installation by checking the version. +2. Verify using \`pip3 list\` that the installed pip packages match the ones specified in the downloaded requirements.txt. Confirm cwltool installation by checking the version. \`\`\` $ cwltool --version /usr/local/bin/cwltool ${this.cwltoolVersion} @@ -206,7 +225,7 @@ $ cwltool --version Although Dockstore has only been tested with the above cwltool version, if you have issues installing cwltool please try running \`pip3 install cwltool\`. This will install the latest released version from PyPi that is compatible with your Python version. -#### Part 6 - Install Nextflow (Optional) +#### Part 7 - Install Nextflow (Optional) The Dockstore CLI does not run Nextflow workflows. Users can run them directly by using the Nextflow command line tool. For installation instructions, follow [Nextflow's documentation](https://github.com/nextflow-io/nextflow#download-the-package) `; } diff --git a/src/app/loginComponents/onboarding/onboarding.component.html b/src/app/loginComponents/onboarding/onboarding.component.html index 41ae3e4e90..5c4f14b569 100644 --- a/src/app/loginComponents/onboarding/onboarding.component.html +++ b/src/app/loginComponents/onboarding/onboarding.component.html @@ -75,7 +75,7 @@
    Dockstore External Services
    - Setup Dockstore CLI + Set Up Dockstore CLI From df22a33535e2f02f4f72c496b057d2e118a83dd7 Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Wed, 8 May 2024 13:01:05 -0400 Subject: [PATCH 42/98] ui2 - run against webservice develop (#1967) --- .circleci/config.yml | 37 +++++++++++++++++++++++++++++++------ package.json | 6 +++--- 2 files changed, 34 insertions(+), 9 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 327257c41c..7740e73b50 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -131,6 +131,16 @@ jobs: command: | bash -i -c 'npm run circle-ci-license-test-file' bash scripts/detect-package-json-changes.sh + # Override the webservice version in package.json to instead build against develop webservice + - when: + condition: << pipeline.parameters.sanity-check-against-develop >> + steps: + - run: + name: set webservice to develop + command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' + - run: + name: set use_circle to false (openapi.yaml from github) + command: bash -i -c 'npm config set dockstore-ui2:use_circle false' - build_ui - run: name: Install codecov @@ -261,12 +271,24 @@ jobs: username: dockstoretestuser password: $DOCKERHUB_PASSWORD steps: - - get_workspace - # Override the webservice version in package.json to instead build against develop webservice - - run: - name: set webservice to develop - command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' - - build_ui + - run: # should not need this, but circle ci does not like it when a condition wipes out a whole job https://discuss.circleci.com/t/pipeline-parameters-in-steps-when-conditions-seems-to-have-no-value-using-dynamic-configuration/50524/2 + name: Java/Maven/Python versions + command: | + java -version + npm --version + - when: + condition: + not: << pipeline.parameters.sanity-check-against-develop >> + steps: + - get_workspace + # Override the webservice version in package.json to instead build against develop webservice + - run: + name: set webservice to develop + command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' + - run: + name: set use_circle to false (openapi.yaml from github) + command: bash -i -c 'npm config set dockstore-ui2:use_circle false' + - build_ui parameters: run_nightly_auth: @@ -284,6 +306,9 @@ parameters: python-tag: type: string default: "3.11" + sanity-check-against-develop: + type: boolean + default: false workflows: version: 2 diff --git a/package.json b/package.json index 48ce38f1a9..32c65420cc 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,10 @@ "version": "2.13.0", "license": "Apache License 2.0", "config": { - "webservice_version": "1.16.0", + "webservice_version": "1.16.0-alpha.10", "use_circle": true, - "circle_ci_source": "https://app.circleci.com/pipelines/github/dockstore/dockstore/11135/workflows/fa998d0e-13c1-4ba2-8f6c-c535d4731e7d/jobs/42660/artifacts", - "circle_build_id": "42660" + "circle_ci_source": "https://app.circleci.com/pipelines/gh/dockstore/dockstore/11187/workflows/06dcae07-dc91-4fc3-ae1f-2007a49f7535/jobs/43090/artifacts", + "circle_build_id": "43090" }, "scripts": { "ng": "npx ng", From faf25ab41ab781af09ce7abd9a0c2b4509e1703c Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Fri, 10 May 2024 09:34:24 -0700 Subject: [PATCH 43/98] link to individual source files https://ucsc-cgl.atlassian.net/browse/DOCK-2403 dockstore/dockstore#5523 --- .../e2e/immutableDatabaseTests/toolDetails.ts | 8 +- .../immutableDatabaseTests/workflowDetails.ts | 31 ++++++- .../source-file-tabs.component.html | 7 +- .../source-file-tabs.component.spec.ts | 3 +- .../source-file-tabs.component.ts | 81 +++++++++++++++++-- 5 files changed, 112 insertions(+), 18 deletions(-) diff --git a/cypress/e2e/immutableDatabaseTests/toolDetails.ts b/cypress/e2e/immutableDatabaseTests/toolDetails.ts index e53908723d..befd544b78 100644 --- a/cypress/e2e/immutableDatabaseTests/toolDetails.ts +++ b/cypress/e2e/immutableDatabaseTests/toolDetails.ts @@ -35,15 +35,15 @@ describe('Variations of URL', () => { }); it('Should redirect to canonical url (tab)', () => { cy.visit('/containers/quay.io/A2/a?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should redirect to canonical url (tab + version)', () => { cy.visit('/containers/quay.io/A2/a:latest?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should redirect to canonical url (tools + encoding + tab + version)', () => { cy.visit('/tools/quay.io%2FA2%2Fa:latest?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); }); @@ -74,7 +74,7 @@ describe('Dockstore Tool Details of quay.io/A2/a', () => { describe('Change tab to files', () => { beforeEach(() => { goToTab('Files'); - cy.url().should('eq', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/containers/quay.io/A2/a:latest?tab=files'); }); it('Should have Dockerfile tab selected', () => { diff --git a/cypress/e2e/immutableDatabaseTests/workflowDetails.ts b/cypress/e2e/immutableDatabaseTests/workflowDetails.ts index bb3fe5e26a..398189bcf3 100644 --- a/cypress/e2e/immutableDatabaseTests/workflowDetails.ts +++ b/cypress/e2e/immutableDatabaseTests/workflowDetails.ts @@ -27,15 +27,15 @@ describe('Variations of URL', () => { }); it('Should redirect to canonical url (tab)', () => { cy.visit('/workflows/github.com/A/l?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should redirect to canonical url (version + tab)', () => { cy.visit('/workflows/github.com/A/l:master?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should redirect to canonical url (encoding + version + tab)', () => { cy.visit('/workflows/github.com%2FA%2Fl:master?tab=files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); }); @@ -74,7 +74,7 @@ describe('Dockstore Workflow Details', () => { describe('Change tab to files', () => { beforeEach(() => { goToTab('Files'); - cy.url().should('eq', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); + cy.url().should('contain', Cypress.config().baseUrl + '/workflows/github.com/A/l:master?tab=files'); }); it('Should have Descriptor files tab selected', () => { @@ -168,3 +168,26 @@ describe('Test engine versions', () => { cy.get('[data-cy=engine-versions]').should('be.visible'); }); }); + +describe('Test sourcefile links', () => { + it('Should change the Dockstore URL to include the source file path', () => { + cy.visit('/workflows/github.com/A/l?tab=files'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + goToTab('Configuration'); + cy.url().should('not.contain', 'file='); + }); + + it('Should be able to reference a specific source file in a Dockstore URL', () => { + cy.visit('/workflows/github.com/A/l?tab=files&file=%2Fnonexistent.txt'); + cy.contains('Could not find the specified file'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + cy.visit('/workflows/github.com/A/l?tab=files&file=%2F1st-workflow.cwl'); + cy.contains('1st-workflow.cwl'); + cy.contains('Workflow'); + cy.url().should('contain', 'file=%2F1st-workflow.cwl'); + cy.visit('/workflows/github.com/A/l?tab=files&file=%2Farguments.cwl'); + cy.contains('arguments.cwl'); + cy.contains('CommandLineTool'); + cy.url().should('contain', 'file=%2Farguments.cwl'); + }); +}); diff --git a/src/app/source-file-tabs/source-file-tabs.component.html b/src/app/source-file-tabs/source-file-tabs.component.html index bcbc518aa1..b2aec3ba1a 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.html +++ b/src/app/source-file-tabs/source-file-tabs.component.html @@ -21,7 +21,12 @@ page.
    - +
    + + warningCould not find the specified file.
    Other files are displayed below. +
    +
    +
    diff --git a/src/app/source-file-tabs/source-file-tabs.component.spec.ts b/src/app/source-file-tabs/source-file-tabs.component.spec.ts index db707231e5..8240385d20 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.spec.ts @@ -1,6 +1,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { RouterTestingModule } from '@angular/router/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { MapFriendlyValuesPipe } from 'app/search/map-friendly-values.pipe'; import { FileService } from 'app/shared/file.service'; @@ -18,7 +19,7 @@ describe('SourceFileTabsComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ declarations: [SourceFileTabsComponent, MapFriendlyValuesPipe], - imports: [HttpClientTestingModule, MatDialogModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, MatDialogModule, RouterTestingModule], providers: [ { provide: SourceFileTabsService, useClass: SourceFileTabsStubService }, { provide: FileService, useClass: FileStubService }, diff --git a/src/app/source-file-tabs/source-file-tabs.component.ts b/src/app/source-file-tabs/source-file-tabs.component.ts index 626622430f..027e4c2311 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.ts @@ -1,5 +1,6 @@ -import { KeyValue } from '@angular/common'; +import { KeyValue, Location } from '@angular/common'; import { Component, Input, OnChanges } from '@angular/core'; +import { ActivatedRoute } from '@angular/router'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; @@ -22,7 +23,9 @@ export class SourceFileTabsComponent implements OnChanges { private fileService: FileService, private sourceFileTabsService: SourceFileTabsService, private matDialog: MatDialog, - private workflowQuery: WorkflowQuery + private workflowQuery: WorkflowQuery, + private activatedRoute: ActivatedRoute, + private location: Location ) { this.isPublished$ = this.workflowQuery.workflowIsPublished$; this.primaryDescriptors = []; @@ -34,12 +37,14 @@ export class SourceFileTabsComponent implements OnChanges { @Input() version: WorkflowVersion; loading = true; displayError = false; + notFoundError = false; currentFile: SourceFile | null; validationMessage: Map; fileName: string; relativePath: string; downloadFilePath: string; fileTabs: Map; + selectedTabIndex: number = 0; primaryDescriptors: SourceFile[] | null; primaryDescriptorPath: string; isCurrentFilePrimary: boolean | null; @@ -55,6 +60,12 @@ export class SourceFileTabsComponent implements OnChanges { this.setupVersionFileTabs(); } + ngOnInit() { + this.activatedRoute.queryParams.subscribe((params) => { + this.findFile(); + }); + } + setupVersionFileTabs() { this.loading = true; this.displayError = false; @@ -72,15 +83,13 @@ export class SourceFileTabsComponent implements OnChanges { this.version.workflow_path, this.descriptorType ); - if (this.fileTabs.size > 0) { - this.changeFileType(this.fileTabs.values().next().value); - } sourceFiles.forEach((sourceFile) => { if (this.isPrimaryDescriptor(sourceFile.path)) { this.primaryDescriptors.push(sourceFile); this.primaryDescriptorPath = sourceFile.path; } }); + this.findFile(); }, () => { this.displayError = true; @@ -88,12 +97,43 @@ export class SourceFileTabsComponent implements OnChanges { ); } + findFile() { + const queryFilePath = this.activatedRoute.snapshot.queryParams['file']; + if (this.fileTabs?.size > 0) { + // Attempt to find the file that is indicated by the 'file' query parameter. + // If we are successful, select the file, change the tab, and return. + if (queryFilePath) { + for (let tabIndex = 0; tabIndex < this.fileTabs.size; tabIndex++) { + const sourceFiles = Array.from(this.fileTabs.values())[tabIndex]; + for (let sourceFile of sourceFiles) { + if (sourceFile.absolutePath === queryFilePath) { + this.selectFile(sourceFile); + this.changeTab(tabIndex); + return; + } + } + } + } + // Otherwise, select the first file in the first tab. + const files = this.fileTabs.values().next().value; + this.selectFile(files[0]); + this.changeTab(0); + } + // If there was a 'file' query parameter and we've gotten to this point, we couldn't find a matching file. + if (queryFilePath) { + this.notFoundError = true; + } + } + + changeTab(tabIndex: number) { + this.selectedTabIndex = tabIndex; + } + /** * Sets the validation message and new default selected file * @param fileType */ changeFileType(files: SourceFile[]) { - this.selectFile(files[0]); this.validationMessage = this.sourceFileTabsService.getValidationMessage(files, this.version); } @@ -107,17 +147,42 @@ export class SourceFileTabsComponent implements OnChanges { this.version.name, this.relativePath ); + this.isCurrentFilePrimary = this.isPrimaryDescriptor(file.path); } else { this.fileName = null; this.relativePath = null; this.downloadFilePath = null; + this.isCurrentFilePrimary = false; } this.currentFile = file; - this.isCurrentFilePrimary = this.isPrimaryDescriptor(this.currentFile.path); + this.setFilePathInLocation(file); + this.notFoundError = false; + } + + setFilePathInLocation(file: SourceFile) { + const url = this.location.path(); + const root = url.split('?')[0]; + const params = new URLSearchParams(url.split('?')[1] ?? ''); + // Don't modify the URL if it's not tracking the current tab. + if (!params.has('tab')) { + return; + } + // Add the sourcefile's absolute path as the 'file' query parameter. + if (file) { + params.set('file', file.absolutePath); + } else { + params.delete('file'); + } + this.location.replaceState(root, params.toString()); } matTabChange(event: MatTabChangeEvent) { - this.changeFileType(this.fileTabs.get(event.tab.textLabel)); + const files = this.fileTabs.get(event.tab.textLabel); + // If the new tab has files, select the first one. + if (files.indexOf(this.currentFile) < 0) { + this.selectFile(files[0]); + } + this.changeFileType(files); } matSelectChange(event: MatSelectChange) { From f08847f2716d8a0d764fb388a5b4d2922c9dcb89 Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Thu, 16 May 2024 10:02:24 -0400 Subject: [PATCH 44/98] redirect artifacts from circle ci to artifactory (#1970) --- .circleci/config.yml | 21 +++++++------------ .github/snapshot-mvn-settings.xml | 31 ++++++++++++++++++++++++++++ README.md | 26 +++++++++++++++++++++++ package.json | 5 ++--- scripts/generate-openapi-script.sh | 7 +++++-- scripts/get-circleci-artifact-url.sh | 19 ----------------- scripts/run-webservice-script.sh | 10 ++++++--- 7 files changed, 78 insertions(+), 41 deletions(-) create mode 100644 .github/snapshot-mvn-settings.xml delete mode 100755 scripts/get-circleci-artifact-url.sh diff --git a/.circleci/config.yml b/.circleci/config.yml index 7740e73b50..7fbac9691d 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -131,16 +131,13 @@ jobs: command: | bash -i -c 'npm run circle-ci-license-test-file' bash scripts/detect-package-json-changes.sh - # Override the webservice version in package.json to instead build against develop webservice + # Override the use_snapshot in package.json to instead build against develop webservice - when: condition: << pipeline.parameters.sanity-check-against-develop >> steps: - run: - name: set webservice to develop - command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' - - run: - name: set use_circle to false (openapi.yaml from github) - command: bash -i -c 'npm config set dockstore-ui2:use_circle false' + name: set use_snapshot to true (grab snapshot artifacts) + command: bash -i -c 'npm config set dockstore-ui2:use_snapshot true' - build_ui - run: name: Install codecov @@ -278,16 +275,12 @@ jobs: npm --version - when: condition: - not: << pipeline.parameters.sanity-check-against-develop >> - steps: + not: << pipeline.parameters.sanity-check-against-develop >> + steps: - get_workspace - # Override the webservice version in package.json to instead build against develop webservice - - run: - name: set webservice to develop - command: bash -i -c 'npm config set dockstore-ui2:webservice_version develop' - run: - name: set use_circle to false (openapi.yaml from github) - command: bash -i -c 'npm config set dockstore-ui2:use_circle false' + name: set use_snapshot to true + command: bash -i -c 'npm config set dockstore-ui2:use_snapshot true' - build_ui parameters: diff --git a/.github/snapshot-mvn-settings.xml b/.github/snapshot-mvn-settings.xml new file mode 100644 index 0000000000..dae0332e48 --- /dev/null +++ b/.github/snapshot-mvn-settings.xml @@ -0,0 +1,31 @@ + + + + + github-packages + DockstoreTestUser + ${env.GITHUB_TOKEN} + + + + + + github-packages + + + + + github-packages + + + github-packages + https://maven.pkg.github.com/dockstore/dockstore + + true + + + + + + + diff --git a/README.md b/README.md index 994c3498f8..bed4f6c06e 100644 --- a/README.md +++ b/README.md @@ -139,7 +139,33 @@ Run `ng g component component-name` to generate a new component. You can also us ## Build +When building against artifactory, the build should use the latest SNAPSHOT. In this scenario, the package.json will look like +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "1.16.0-alpha.10", + "use_snapshot": true +``` + Optionally override the webservice version using `npm config set dockstore-ui2:webservice_version ${WEBSERVICE_VERSION}` + +For example, to build against a specific branch, edit the package.json with +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "feature/seab-6420/modify-endpoint-description-for-new-health-checks", + "use_snapshot": false + }, +``` +For example, to build against a specific commit, edit the package.json with +``` + "config": { + "webservice_version_prefix": "1.16.0", + "webservice_version": "1550b549c45b2f4ba7f205e2f64502d523417dcd", + "use_snapshot": false + }, +``` + Run `npm run build` to build the project. The build artifacts will be stored in the `dist/` directory. ### Angular Production Build diff --git a/package.json b/package.json index 32c65420cc..d998dbd790 100644 --- a/package.json +++ b/package.json @@ -3,10 +3,9 @@ "version": "2.13.0", "license": "Apache License 2.0", "config": { + "webservice_version_prefix": "1.16.0", "webservice_version": "1.16.0-alpha.10", - "use_circle": true, - "circle_ci_source": "https://app.circleci.com/pipelines/gh/dockstore/dockstore/11187/workflows/06dcae07-dc91-4fc3-ae1f-2007a49f7535/jobs/43090/artifacts", - "circle_build_id": "43090" + "use_snapshot": true }, "scripts": { "ng": "npx ng", diff --git a/scripts/generate-openapi-script.sh b/scripts/generate-openapi-script.sh index 029a0d9be3..786a383e64 100755 --- a/scripts/generate-openapi-script.sh +++ b/scripts/generate-openapi-script.sh @@ -14,9 +14,12 @@ BASE_PATH="https://raw.githubusercontent.com/dockstore/dockstore/$npm_package_co wget --no-verbose https://repo.maven.apache.org/maven2/org/openapitools/openapi-generator-cli/${GENERATOR_VERSION}/openapi-generator-cli-${GENERATOR_VERSION}.jar -O openapi-generator-cli.jar rm -Rf src/app/shared/openapi -if [ "$npm_package_config_use_circle" = true ] +if [ "$npm_package_config_use_snapshot" = true ] then - OPENAPI_PATH=$(./scripts/get-circleci-artifact-url.sh "$npm_package_config_circle_build_id" openapi.yaml) + # note that -DremoteRepositories=github-packages:https://maven.pkg.github.com/dockstore/dockstore also works with the right credentials, loaded as -s .github/snapshot-mvn-settings.xml + mvn dependency:get -DremoteRepositories="https://artifacts.oicr.on.ca/artifactory/collab-snapshot" -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT:openapi.yaml:dist" -Dtransitive=false --batch-mode -ntp + mvn dependency:copy -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT:openapi.yaml:dist" -DoutputDirectory=. -Dmdep.useBaseVersion=true -batch-mode -ntp + OPENAPI_PATH=dockstore-webservice-${npm_package_config_webservice_version_prefix}-SNAPSHOT-dist.openapi.yaml else OPENAPI_PATH="${BASE_PATH}""/dockstore-webservice/src/main/resources/openapi3/openapi.yaml" fi diff --git a/scripts/get-circleci-artifact-url.sh b/scripts/get-circleci-artifact-url.sh deleted file mode 100755 index 5caebe2186..0000000000 --- a/scripts/get-circleci-artifact-url.sh +++ /dev/null @@ -1,19 +0,0 @@ -#!/bin/bash -set -o errexit -set -o pipefail -set -o nounset -set -o xtrace - -if [[ -z ${1} || -z ${2} ]]; then - echo "Usage: $0 " - exit 1 -fi - -# This script gets the URL for a CircleCI artifact. -# It looks at all of the artifacts for a CircleCI build with and returns the URL of the artifact with a path that contains . - -CIRCLECI_BUILD_ID=${1} -ARTIFACT_NAME=${2} -ARTIFACT_URL=$(curl "https://circleci.com/api/v2/project/gh/dockstore/dockstore/${CIRCLECI_BUILD_ID}/artifacts" -H "Accept: application/json" | jq -r --arg ARTIFACT_NAME "${ARTIFACT_NAME}" '[.items[] | select( .path | contains($ARTIFACT_NAME) ) | .url] | first ') - -echo "${ARTIFACT_URL}" diff --git a/scripts/run-webservice-script.sh b/scripts/run-webservice-script.sh index a2ac49a093..bc9b7cceb0 100755 --- a/scripts/run-webservice-script.sh +++ b/scripts/run-webservice-script.sh @@ -3,14 +3,18 @@ set -o errexit set -o pipefail set -o nounset set -o xtrace -if [ "$npm_package_config_use_circle" = true ] +if [ "$npm_package_config_use_snapshot" = true ] then - JAR_PATH=$(./scripts/get-circleci-artifact-url.sh "$npm_package_config_circle_build_id" dockstore-webservice) + # note that -DremoteRepositories=github-packages:https://maven.pkg.github.com/dockstore/dockstore also works with the right credentials, loaded as -s .github/snapshot-mvn-settings.xml + mvn dependency:get -DremoteRepositories="https://artifacts.oicr.on.ca/artifactory/collab-snapshot" -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT" -Dtransitive=false --batch-mode -ntp + mvn dependency:copy -Dartifact="io.dockstore:dockstore-webservice:${npm_package_config_webservice_version_prefix}-SNAPSHOT" -DoutputDirectory=. -Dmdep.useBaseVersion=true -batch-mode -ntp + JAR_PATH=dockstore-webservice-${npm_package_config_webservice_version_prefix}-SNAPSHOT.jar + mv "$JAR_PATH" dockstore-webservice.jar else JAR_PATH="https://artifacts.oicr.on.ca/artifactory/collab-release/io/dockstore/dockstore-webservice/${npm_package_config_webservice_version}/dockstore-webservice-${npm_package_config_webservice_version}.jar" + wget -O dockstore-webservice.jar --no-verbose --tries=10 ${JAR_PATH} fi -wget -O dockstore-webservice.jar --no-verbose --tries=10 ${JAR_PATH} chmod u+x dockstore-webservice.jar psql -h localhost -c "create user dockstore with password 'dockstore' createdb;" -U postgres psql -h localhost -c "ALTER USER dockstore WITH superuser;" -U postgres From e8f0293254878bd2b6f8a529873116db3b33363b Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Thu, 16 May 2024 16:12:49 -0700 Subject: [PATCH 45/98] Replace @angular/flex-layout (#1971) SEAB-6278 --- THIRD-PARTY-LICENSES.csv | 2 +- package-lock.json | 53 +++++++++---------- package.json | 2 +- src/app/aliases/aliases.module.ts | 2 +- src/app/app.module.ts | 2 +- src/app/container/refresh-wizard.module.ts | 2 +- src/app/entry/current-collections.module.ts | 2 +- src/app/home-page/home-page.module.ts | 2 +- .../recent-events/recent-events.module.ts | 2 +- .../account-sidebar.component.spec.ts | 2 +- .../account-sidebar/account-sidebar.module.ts | 2 +- .../change-username/change-username.module.ts | 2 +- src/app/loginComponents/requests.module.ts | 2 +- .../github-apps-logs.module.ts | 2 +- .../collection/add-entry.module.ts | 2 +- src/app/organizations/collections.module.ts | 2 +- .../collections/create-collection.module.ts | 2 +- src/app/organizations/events.module.ts | 2 +- .../organization-members.module.ts | 2 +- src/app/organizations/organization.module.ts | 2 +- .../organization-stargazers.module.ts | 2 +- .../update-organization-description.module.ts | 2 +- src/app/organizations/organizations.module.ts | 2 +- .../register-organization.module.ts | 2 +- .../upsert-organization-member.module.ts | 2 +- src/app/search/search.module.ts | 2 +- src/app/shared/ai-bubble/ai-bubble.module.ts | 2 +- src/app/shared/available-logs.module.ts | 2 +- src/app/shared/entry/entry.module.ts | 2 +- src/app/shared/modules/container.module.ts | 2 +- .../modules/register-github-app.module.ts | 2 +- src/app/shared/modules/workflow.module.ts | 2 +- src/app/stargazers/stargazers.module.ts | 2 +- src/app/user-page/user-page.module.ts | 2 +- src/app/workflow/dag/dag.module.ts | 2 +- 35 files changed, 60 insertions(+), 61 deletions(-) diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index e7e2c81b7b..15cac87589 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -6,7 +6,6 @@ "@angular/common@15.2.10","MIT","https://github.com/angular/angular" "@angular/compiler@15.2.10","MIT","https://github.com/angular/angular" "@angular/core@15.2.10","MIT","https://github.com/angular/angular" -"@angular/flex-layout@15.0.0-beta.42","MIT","https://github.com/angular/flex-layout" "@angular/forms@15.2.10","MIT","https://github.com/angular/angular" "@angular/material@15.2.9","MIT","https://github.com/angular/components" "@angular/platform-browser-dynamic@15.2.10","MIT","https://github.com/angular/angular" @@ -70,6 +69,7 @@ "@material/top-app-bar@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" "@material/touch-target@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" "@material/typography@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" +"@ngbracket/ngx-layout@15.1.3","MIT","https://github.com/ngbracket/ngx-layout" "@ngneat/forms-manager@2.5.0","MIT","" "@popperjs/core@2.11.2","MIT","https://github.com/popperjs/popper-core" "@schematics/angular@8.3.29","MIT","https://github.com/angular/angular-cli" diff --git a/package-lock.json b/package-lock.json index 49e4edbfc2..4aa4ab14a9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "dockstore-ui2", - "version": "2.10.0", + "version": "2.13.0", "hasInstallScript": true, "license": "Apache License 2.0", "dependencies": { @@ -15,7 +15,6 @@ "@angular/common": "^15.2.10", "@angular/compiler": "^15.2.10", "@angular/core": "^15.2.10", - "@angular/flex-layout": "^15.0.0-beta.42", "@angular/forms": "^15.2.10", "@angular/material": "^15.2.9", "@angular/platform-browser": "^15.2.10", @@ -26,6 +25,7 @@ "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", + "@ngbracket/ngx-layout": "^15.1.3", "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", @@ -817,22 +817,6 @@ "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" } }, - "node_modules/@angular/flex-layout": { - "version": "15.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-15.0.0-beta.42.tgz", - "integrity": "sha512-cTAPVMMxnyIFwpZwdq0PL5mdP9Qh+R8MB7ZBezVaN3Rz2fRrkagzKpLvPX3TFzepXrvHBdpKsU4b8u+NxEC/6g==", - "deprecated": "This package has been deprecated. Please see https://blog.angular.io/modern-css-in-angular-layouts-4a259dca9127", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/cdk": ">=15.0.0", - "@angular/common": ">=15.0.2", - "@angular/core": ">=15.0.2", - "@angular/platform-browser": ">=15.0.2", - "rxjs": "^6.5.3 || ^7.4.0" - } - }, "node_modules/@angular/forms": { "version": "15.2.10", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.10.tgz", @@ -5228,6 +5212,21 @@ "tslib": "^2.1.0" } }, + "node_modules/@ngbracket/ngx-layout": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@ngbracket/ngx-layout/-/ngx-layout-15.1.3.tgz", + "integrity": "sha512-0fPiJ/DLNEWfyn/71IHuJ3SWpNFGLKMrEE79AIBczWStQ9I1t2IrOANKYi3r+7gcojisHbdfUc4q/6vjVfKt8w==", + "dependencies": { + "tslib": "^2.5.0" + }, + "peerDependencies": { + "@angular/cdk": ">=15.0.0", + "@angular/common": ">=15.0.2", + "@angular/core": ">=15.0.2", + "@angular/platform-browser": ">=15.0.2", + "rxjs": "^6.5.3 || ^7.8.0" + } + }, "node_modules/@ngneat/forms-manager": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@ngneat/forms-manager/-/forms-manager-2.5.0.tgz", @@ -23932,14 +23931,6 @@ "tslib": "^2.3.0" } }, - "@angular/flex-layout": { - "version": "15.0.0-beta.42", - "resolved": "https://registry.npmjs.org/@angular/flex-layout/-/flex-layout-15.0.0-beta.42.tgz", - "integrity": "sha512-cTAPVMMxnyIFwpZwdq0PL5mdP9Qh+R8MB7ZBezVaN3Rz2fRrkagzKpLvPX3TFzepXrvHBdpKsU4b8u+NxEC/6g==", - "requires": { - "tslib": "^2.3.0" - } - }, "@angular/forms": { "version": "15.2.10", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.10.tgz", @@ -27289,6 +27280,14 @@ "tslib": "^2.1.0" } }, + "@ngbracket/ngx-layout": { + "version": "15.1.3", + "resolved": "https://registry.npmjs.org/@ngbracket/ngx-layout/-/ngx-layout-15.1.3.tgz", + "integrity": "sha512-0fPiJ/DLNEWfyn/71IHuJ3SWpNFGLKMrEE79AIBczWStQ9I1t2IrOANKYi3r+7gcojisHbdfUc4q/6vjVfKt8w==", + "requires": { + "tslib": "^2.5.0" + } + }, "@ngneat/forms-manager": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@ngneat/forms-manager/-/forms-manager-2.5.0.tgz", diff --git a/package.json b/package.json index d998dbd790..c4f20af4d9 100644 --- a/package.json +++ b/package.json @@ -46,7 +46,6 @@ "@angular/common": "^15.2.10", "@angular/compiler": "^15.2.10", "@angular/core": "^15.2.10", - "@angular/flex-layout": "^15.0.0-beta.42", "@angular/forms": "^15.2.10", "@angular/material": "^15.2.9", "@angular/platform-browser": "^15.2.10", @@ -57,6 +56,7 @@ "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", + "@ngbracket/ngx-layout": "^15.1.3", "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", diff --git a/src/app/aliases/aliases.module.ts b/src/app/aliases/aliases.module.ts index 24b96941d2..93c605ec4e 100644 --- a/src/app/aliases/aliases.module.ts +++ b/src/app/aliases/aliases.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RefreshAlertModule } from '../shared/alert/alert.module'; import { HeaderModule } from '../shared/modules/header.module'; import { CustomMaterialModule } from '../shared/modules/material.module'; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 9af931f002..32b226885d 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -16,7 +16,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http'; import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MAT_LEGACY_SNACK_BAR_DEFAULT_OPTIONS as MAT_SNACK_BAR_DEFAULT_OPTIONS, diff --git a/src/app/container/refresh-wizard.module.ts b/src/app/container/refresh-wizard.module.ts index 3705a2a609..68176282e8 100644 --- a/src/app/container/refresh-wizard.module.ts +++ b/src/app/container/refresh-wizard.module.ts @@ -3,7 +3,7 @@ import { NgModule } from '@angular/core'; import { RefreshAlertModule } from 'app/shared/alert/alert.module'; import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RefreshWizardComponent } from './refresh-wizard/refresh-wizard.component'; @NgModule({ diff --git a/src/app/entry/current-collections.module.ts b/src/app/entry/current-collections.module.ts index 117ad54d87..8e5ab12768 100644 --- a/src/app/entry/current-collections.module.ts +++ b/src/app/entry/current-collections.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; import { CustomMaterialModule } from '../shared/modules/material.module'; diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts index 3eb37173c7..b197fc9ed0 100644 --- a/src/app/home-page/home-page.module.ts +++ b/src/app/home-page/home-page.module.ts @@ -1,7 +1,7 @@ import { CommonModule } from '@angular/common'; import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; diff --git a/src/app/home-page/recent-events/recent-events.module.ts b/src/app/home-page/recent-events/recent-events.module.ts index 0827b52683..e62002d93b 100644 --- a/src/app/home-page/recent-events/recent-events.module.ts +++ b/src/app/home-page/recent-events/recent-events.module.ts @@ -4,7 +4,7 @@ import { RefreshAlertModule } from '../../shared/alert/alert.module'; import { CommonModule } from '@angular/common'; import { EntryToDisplayNamePipe } from 'app/shared/entry-to-display-name.pipe'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { MatDividerModule } from '@angular/material/divider'; import { RouterModule } from '@angular/router'; import { MatIconModule } from '@angular/material/icon'; diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts index b54df28326..199910aa50 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts @@ -4,7 +4,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { AccountSidebarComponent } from './account-sidebar.component'; import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table'; import { UsersService } from '../../../shared/openapi/api/users.service'; diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts index 6141587033..16a0cc91bf 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts @@ -17,7 +17,7 @@ import { NgModule } from '@angular/core'; import { AccountSidebarComponent } from './account-sidebar.component'; import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; import { RouterModule } from '@angular/router'; import { ChangeUsernameModule } from '../internal/change-username/change-username.module'; diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts index 968766ab54..db9d5aa694 100644 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts +++ b/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts @@ -16,7 +16,7 @@ import { NgModule } from '@angular/core'; import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; import { ChangeUsernameComponent } from './change-username.component'; import { ReactiveFormsModule } from '@angular/forms'; diff --git a/src/app/loginComponents/requests.module.ts b/src/app/loginComponents/requests.module.ts index 2f5d201a6c..8b0c149047 100644 --- a/src/app/loginComponents/requests.module.ts +++ b/src/app/loginComponents/requests.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { CustomMaterialModule } from './../shared/modules/material.module'; import { diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts index 8cd1b84078..6c6d6f0633 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts @@ -18,7 +18,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { RouterModule } from '@angular/router'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RefreshAlertModule } from 'app/shared/alert/alert.module'; import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { PipeModule } from '../../../shared/pipe/pipe.module'; diff --git a/src/app/organizations/collection/add-entry.module.ts b/src/app/organizations/collection/add-entry.module.ts index 76137efe2b..53eda4aaf8 100644 --- a/src/app/organizations/collection/add-entry.module.ts +++ b/src/app/organizations/collection/add-entry.module.ts @@ -15,7 +15,7 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CurrentCollectionsModule } from '../../entry/current-collections.module'; import { RefreshAlertModule } from '../../shared/alert/alert.module'; import { CustomMaterialModule } from '../../shared/modules/material.module'; diff --git a/src/app/organizations/collections.module.ts b/src/app/organizations/collections.module.ts index e15f113700..b4c567efff 100644 --- a/src/app/organizations/collections.module.ts +++ b/src/app/organizations/collections.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { MarkdownModule } from 'ngx-markdown'; diff --git a/src/app/organizations/collections/create-collection.module.ts b/src/app/organizations/collections/create-collection.module.ts index 6e01441ee3..2e83bef608 100644 --- a/src/app/organizations/collections/create-collection.module.ts +++ b/src/app/organizations/collections/create-collection.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { ReactiveFormsModule } from '@angular/forms'; import { RefreshAlertModule } from '../../shared/alert/alert.module'; diff --git a/src/app/organizations/events.module.ts b/src/app/organizations/events.module.ts index 6d8ccc76ee..a9dce469a5 100644 --- a/src/app/organizations/events.module.ts +++ b/src/app/organizations/events.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { RefreshAlertModule } from '../shared/alert/alert.module'; diff --git a/src/app/organizations/organization-members.module.ts b/src/app/organizations/organization-members.module.ts index 4c77114926..1daa55e4cb 100644 --- a/src/app/organizations/organization-members.module.ts +++ b/src/app/organizations/organization-members.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { RefreshAlertModule } from '../shared/alert/alert.module'; diff --git a/src/app/organizations/organization.module.ts b/src/app/organizations/organization.module.ts index 2e1f638727..733b734ee6 100644 --- a/src/app/organizations/organization.module.ts +++ b/src/app/organizations/organization.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; import { MarkdownModule } from 'ngx-markdown'; import { RefreshAlertModule } from '../shared/alert/alert.module'; diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts index 8f79fafc17..ca58626ea5 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts @@ -15,7 +15,7 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CustomMaterialModule } from '../../../shared/modules/material.module'; import { RouterModule } from '@angular/router'; diff --git a/src/app/organizations/organization/update-organization-description.module.ts b/src/app/organizations/organization/update-organization-description.module.ts index a5870c1512..341d59ad78 100644 --- a/src/app/organizations/organization/update-organization-description.module.ts +++ b/src/app/organizations/organization/update-organization-description.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { ReactiveFormsModule } from '@angular/forms'; import { MarkdownModule } from 'ngx-markdown'; import { RefreshAlertModule } from '../../shared/alert/alert.module'; diff --git a/src/app/organizations/organizations.module.ts b/src/app/organizations/organizations.module.ts index 69a6b42d2f..c3d5dbe322 100644 --- a/src/app/organizations/organizations.module.ts +++ b/src/app/organizations/organizations.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { ReactiveFormsModule } from '@angular/forms'; import { HeaderModule } from '../shared/modules/header.module'; diff --git a/src/app/organizations/register-organization.module.ts b/src/app/organizations/register-organization.module.ts index 1954a1a802..d78c6fffe3 100644 --- a/src/app/organizations/register-organization.module.ts +++ b/src/app/organizations/register-organization.module.ts @@ -8,7 +8,7 @@ import { CustomMaterialModule } from '../shared/modules/material.module'; import { RegisterOrganizationComponent } from './registerOrganization/register-organization.component'; import { RouterModule } from '@angular/router'; import { RequireAccountsModalComponent } from './registerOrganization/requireAccountsModal/require-accounts-modal.component'; -import { FlexModule } from '@angular/flex-layout'; +import { FlexModule } from '@ngbracket/ngx-layout'; @NgModule({ imports: [CommonModule, FormsModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule, RouterModule, FlexModule], diff --git a/src/app/organizations/upsert-organization-member.module.ts b/src/app/organizations/upsert-organization-member.module.ts index 6de2592f01..bd01e83b17 100644 --- a/src/app/organizations/upsert-organization-member.module.ts +++ b/src/app/organizations/upsert-organization-member.module.ts @@ -1,6 +1,6 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { ReactiveFormsModule } from '@angular/forms'; import { RefreshAlertModule } from '../shared/alert/alert.module'; diff --git a/src/app/search/search.module.ts b/src/app/search/search.module.ts index c47c3b1c0a..5c9bf943e2 100644 --- a/src/app/search/search.module.ts +++ b/src/app/search/search.module.ts @@ -17,7 +17,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { HttpClientModule } from '@angular/common/http'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; diff --git a/src/app/shared/ai-bubble/ai-bubble.module.ts b/src/app/shared/ai-bubble/ai-bubble.module.ts index 95f1ae362c..1a5e726da9 100644 --- a/src/app/shared/ai-bubble/ai-bubble.module.ts +++ b/src/app/shared/ai-bubble/ai-bubble.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { FlexModule } from '@angular/flex-layout'; +import { FlexModule } from '@ngbracket/ngx-layout'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; import { RouterLink } from '@angular/router'; diff --git a/src/app/shared/available-logs.module.ts b/src/app/shared/available-logs.module.ts index 81900304c7..f8ddc9ff2a 100644 --- a/src/app/shared/available-logs.module.ts +++ b/src/app/shared/available-logs.module.ts @@ -15,7 +15,7 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RefreshAlertModule } from './alert/alert.module'; import { AvailableLogsComponent } from './available-logs/available-logs.component'; import { RemoveExtensionPipe } from './available-logs/remove-extension.pipe'; diff --git a/src/app/shared/entry/entry.module.ts b/src/app/shared/entry/entry.module.ts index 4e6745c35e..be0fa5162a 100644 --- a/src/app/shared/entry/entry.module.ts +++ b/src/app/shared/entry/entry.module.ts @@ -16,7 +16,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { RouterModule } from '@angular/router'; diff --git a/src/app/shared/modules/container.module.ts b/src/app/shared/modules/container.module.ts index 081e912e70..3dda0418a9 100644 --- a/src/app/shared/modules/container.module.ts +++ b/src/app/shared/modules/container.module.ts @@ -16,7 +16,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule } from '@angular/forms'; import { MarkdownModule } from 'ngx-markdown'; diff --git a/src/app/shared/modules/register-github-app.module.ts b/src/app/shared/modules/register-github-app.module.ts index 4668b1e510..97f46c043f 100644 --- a/src/app/shared/modules/register-github-app.module.ts +++ b/src/app/shared/modules/register-github-app.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; -import { FlexModule } from '@angular/flex-layout'; +import { FlexModule } from '@ngbracket/ngx-layout'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; diff --git a/src/app/shared/modules/workflow.module.ts b/src/app/shared/modules/workflow.module.ts index b4aa57ab9f..f36461933d 100644 --- a/src/app/shared/modules/workflow.module.ts +++ b/src/app/shared/modules/workflow.module.ts @@ -16,7 +16,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule } from '@angular/forms'; import { MarkdownModule } from 'ngx-markdown'; diff --git a/src/app/stargazers/stargazers.module.ts b/src/app/stargazers/stargazers.module.ts index eb2d1dd75e..cb90879293 100644 --- a/src/app/stargazers/stargazers.module.ts +++ b/src/app/stargazers/stargazers.module.ts @@ -15,7 +15,7 @@ */ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { MatIconModule } from '@angular/material/icon'; import { RouterModule } from '@angular/router'; diff --git a/src/app/user-page/user-page.module.ts b/src/app/user-page/user-page.module.ts index 4c69c3f517..208bd26e37 100644 --- a/src/app/user-page/user-page.module.ts +++ b/src/app/user-page/user-page.module.ts @@ -1,7 +1,7 @@ import { NgModule } from '@angular/core'; import { UserPageComponent } from './user-page.component'; import { RecentEventsModule } from '../home-page/recent-events/recent-events.module'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; import { CustomMaterialModule } from '../shared/modules/material.module'; import { HeaderModule } from '../shared/modules/header.module'; diff --git a/src/app/workflow/dag/dag.module.ts b/src/app/workflow/dag/dag.module.ts index 15a519a14d..19367899f9 100644 --- a/src/app/workflow/dag/dag.module.ts +++ b/src/app/workflow/dag/dag.module.ts @@ -16,7 +16,7 @@ import { FullscreenOverlayContainer, OverlayContainer } from '@angular/cdk/overlay'; import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@angular/flex-layout'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; From 6a4ee281ce5a18e7daf1ff7ca8b40130ae4a52c6 Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Thu, 23 May 2024 10:06:49 -0400 Subject: [PATCH 46/98] remove old references (#1972) --- cypress/e2e/immutableDatabaseTests/jsonld.ts | 2 +- src/app/home-page/home-logged-out/home.component.html | 9 +-------- src/app/home-page/home-page.service.ts | 2 +- src/app/login/login.component.html | 2 +- src/index.html | 2 +- 5 files changed, 5 insertions(+), 12 deletions(-) diff --git a/cypress/e2e/immutableDatabaseTests/jsonld.ts b/cypress/e2e/immutableDatabaseTests/jsonld.ts index 1eb6bd02f8..8d32975016 100644 --- a/cypress/e2e/immutableDatabaseTests/jsonld.ts +++ b/cypress/e2e/immutableDatabaseTests/jsonld.ts @@ -22,7 +22,7 @@ describe('JSON-LD', () => { cy.visit(''); // Two json-lds cy.get('[type="application/ld+json"]').should('have.length', 2); - cy.get('[type="application/ld+json"]').should('contain.text', '"description": "Dockstore, developed'); + cy.get('[type="application/ld+json"]').should('contain.text', '"description": "Dockstore is an open platform'); cy.get('[type="application/ld+json"]').should('contain.text', '"audience": "Bioinformaticians"'); }); }); diff --git a/src/app/home-page/home-logged-out/home.component.html b/src/app/home-page/home-logged-out/home.component.html index 05ca887a4e..5a4fd4fd6e 100644 --- a/src/app/home-page/home-logged-out/home.component.html +++ b/src/app/home-page/home-logged-out/home.component.html @@ -28,14 +28,7 @@ >

    An app store for bioinformatics

    - Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows. It’s developed by - the - Cancer Genome Collaboratory - and used by the GA4GH. + Dockstore is a free and open source platform for sharing reusable and scalable analytical tools and workflows.
    - DOI: + Concept DOI + help + :
    - DOI: + Version DOI: Date: Thu, 6 Jun 2024 11:37:05 -0400 Subject: [PATCH 49/98] oops (#1978) --- src/app/workflow/info-tab/info-tab.component.css | 3 --- src/app/workflow/info-tab/info-tab.component.html | 4 ++-- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/src/app/workflow/info-tab/info-tab.component.css b/src/app/workflow/info-tab/info-tab.component.css index d53c480910..efe631b0b2 100644 --- a/src/app/workflow/info-tab/info-tab.component.css +++ b/src/app/workflow/info-tab/info-tab.component.css @@ -43,6 +43,3 @@ background-color: white; filter: opacity(0.3); } -.doi-help-icon { - padding-left: 0.5rem; -} diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index 67cf6fbdd1..c33827b346 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -418,10 +418,10 @@
    Concept DOI help : Date: Tue, 11 Jun 2024 16:32:03 -0700 Subject: [PATCH 50/98] Use standalone Angular (#1977) SEAB-6150. See PR for details. --- cypress/e2e/group2/myworkflows.ts | 8 +- cypress/e2e/group3/mytools.ts | 16 +- .../e2e/smokeTests/sharedTests/auth-tests.ts | 8 +- src/app/about/about.component.ts | 22 ++ src/app/aliases/aliases.component.ts | 7 + src/app/aliases/aliases.module.ts | 16 -- src/app/aliases/aliases.routing.ts | 4 +- src/app/app.component.spec.ts | 99 ++++++-- src/app/app.component.ts | 23 +- src/app/app.module.ts | 234 +----------------- src/app/app.routing.ts | 40 +-- src/app/banner/banner.component.spec.ts | 2 +- src/app/banner/banner.component.ts | 3 + .../button/category-button.component.ts | 6 + .../button/category-button.module.ts | 28 --- .../changeUsernameBanner.component.ts | 3 + .../confirmation-dialog.component.ts | 11 +- .../container/add-tag/add-tag.component.ts | 27 +- src/app/container/container.component.html | 8 +- src/app/container/container.component.ts | 72 +++++- .../deregister-modal.component.ts | 4 + .../descriptors/descriptors.component.spec.ts | 3 +- .../descriptors/descriptors.component.ts | 28 +++ .../dockerfile/dockerfile.component.spec.ts | 2 +- .../dockerfile/dockerfile.component.ts | 19 ++ src/app/container/files/files.component.ts | 9 + .../container/info-tab/info-tab.component.ts | 46 +++- src/app/container/launch/launch.component.ts | 25 +- .../paramfiles/paramfiles.component.ts | 28 +++ ...efresh-tool-organization.component.spec.ts | 3 +- .../refresh-tool-organization.component.ts | 4 + src/app/container/refresh-wizard.module.ts | 14 -- .../refresh-wizard.component.ts | 29 +++ .../register-tool/register-tool.component.ts | 42 +++- .../tool-file-editor.component.spec.ts | 6 +- .../tool-file-editor.component.ts | 17 ++ .../version-modal.component.spec.ts | 3 +- .../version-modal/version-modal.component.ts | 29 ++- .../container/versions/versions.component.ts | 33 ++- src/app/container/view/view.component.ts | 5 + src/app/containers/containers.component.ts | 8 +- src/app/containers/containers.module.ts | 32 --- src/app/containers/containers.routing.ts | 4 +- src/app/containers/list/list.component.ts | 34 +++ src/app/containers/search/search.component.ts | 3 + src/app/docs/docs.component.spec.ts | 6 +- src/app/docs/docs.component.ts | 3 + src/app/docs/docs.module.ts | 3 +- src/app/docs/docs.routing.ts | 4 +- .../archive-entry-dialog.component.spec.ts | 5 +- .../dialog/archive-entry-dialog.component.ts | 12 +- src/app/entry/current-collections.module.ts | 6 +- .../current-collections.component.ts | 27 ++ .../delete-entry-dialog.component.spec.ts | 5 +- .../dialog/delete-entry-dialog.component.ts | 12 +- src/app/entry/file-path.pipe.ts | 5 +- src/app/entry/router-link.pipe.ts | 1 + src/app/file-tree/file-tree.component.spec.ts | 2 +- src/app/file-tree/file-tree.component.ts | 23 +- src/app/footer/footer.component.spec.ts | 3 +- src/app/footer/footer.component.ts | 10 + src/app/footer/git-tag.pipe.ts | 1 + src/app/funding/funding.component.spec.ts | 6 +- src/app/funding/funding.component.ts | 8 + .../github-callback.component.ts | 4 + .../github-landing-page.component.ts | 8 +- src/app/gravatar/gravatar.pipe.ts | 1 + src/app/header/header.component.spec.ts | 4 +- src/app/header/header.component.ts | 3 + .../dashboard/dashboard.component.spec.ts | 37 ++- .../dashboard/dashboard.component.ts | 23 ++ .../home-logged-out/home.component.spec.ts | 13 +- .../home-logged-out/home.component.ts | 41 +++ src/app/home-page/home-page.module.ts | 89 ------- .../recent-events/recent-events.component.ts | 29 ++- .../recent-events/recent-events.module.ts | 8 +- .../entry-box/entry-box.component.spec.ts | 2 +- .../widget/entry-box/entry-box.component.ts | 33 ++- .../featured-content.component.ts | 1 + .../news-and-updates.component.ts | 1 + .../getting-started.component.spec.ts | 11 +- .../getting-started.component.ts | 5 + .../news-box/news-box.component.spec.ts | 6 +- .../widget/news-box/news-box.component.ts | 6 + .../news-notifications.component.spec.ts | 3 +- .../news-notifications.component.ts | 8 + .../my-organizations-dialog.component.ts | 11 +- .../organization-box.component.ts | 23 +- .../starred-box/starred-box.component.ts | 9 + .../information-dialog.component.ts | 11 +- src/app/login/login.component.spec.ts | 7 +- src/app/login/login.component.ts | 21 ++ .../account-sidebar.component.spec.ts | 15 +- .../account-sidebar.component.ts | 8 + .../account-sidebar/account-sidebar.module.ts | 31 --- .../accounts/accounts.component.ts | 20 +- .../controls/controls.component.spec.ts | 4 +- .../accounts/controls/controls.component.ts | 6 + .../delete-account-dialog.component.spec.ts | 5 +- .../delete-account-dialog.component.ts | 31 ++- .../accounts/external/accounts.component.ts | 34 ++- .../external/getTokenUsername.pipe.ts | 1 + .../revoke-token-dialog.component.ts | 33 ++- .../change-username.component.spec.ts | 2 +- .../change-username.component.ts | 24 +- .../change-username/change-username.module.ts | 30 --- .../auth/auth.component.spec.ts | 3 +- .../loginComponents/auth/auth.component.ts | 1 + .../downloadcliclient.component.spec.ts | 3 +- .../downloadcliclient.component.ts | 20 ++ .../onboarding/onboarding.component.ts | 25 ++ .../onboarding/quickstart.component.ts | 6 + src/app/loginComponents/requests.module.ts | 16 -- .../requests/requests.component.ts | 28 +++ src/app/logout/logout.component.spec.ts | 4 +- src/app/logout/logout.component.ts | 4 + .../maintenance/maintenance.component.spec.ts | 3 +- src/app/maintenance/maintenance.component.ts | 4 + src/app/my-notebooks/my-notebooks.module.ts | 8 - src/app/my-notebooks/my-notebooks.routing.ts | 4 +- src/app/my-services/my-services.module.ts | 8 - src/app/my-services/my-services.routing.ts | 4 +- .../my-sidebar/my-sidebar.component.spec.ts | 9 +- src/app/my-sidebar/my-sidebar.component.ts | 5 + src/app/mytools/my-tool/my-tool.component.ts | 33 +++ src/app/mytools/mytools.component.ts | 3 + src/app/mytools/mytools.module.ts | 56 ----- src/app/mytools/mytools.routing.ts | 17 +- src/app/mytools/mytools.service.spec.ts | 23 +- .../sidebar-accordion.component.spec.ts | 4 +- .../sidebar-accordion.component.ts | 27 +- .../my-workflow/my-workflow.component.spec.ts | 48 +++- .../my-workflow/my-workflow.component.ts | 31 +++ src/app/myworkflows/myworkflows.module.ts | 24 -- src/app/myworkflows/myworkflows.routing.ts | 4 +- .../myworkflows/myworkflows.service.spec.ts | 23 +- src/app/myworkflows/myworkflows.service.ts | 4 +- .../github-apps-logs.component.ts | 47 +++- .../github-apps-logs.module.ts | 41 --- .../sidebar-accordion.component.spec.ts | 15 +- .../sidebar-accordion.component.ts | 31 ++- src/app/navbar/navbar.component.spec.ts | 2 +- src/app/navbar/navbar.component.ts | 26 +- .../notebook/notebook-markdown.component.ts | 3 + .../notebook-mime-bundle-output.component.ts | 3 + src/app/notebook/notebook-source.component.ts | 3 + .../notebook-stream-output.component.ts | 3 + src/app/notebook/notebook.component.spec.ts | 4 +- src/app/notebook/notebook.component.ts | 14 ++ .../sitewide-notifications.component.ts | 7 + .../state/notifications.service.spec.ts | 2 + .../collection/add-entry.module.ts | 6 +- .../add-entry/add-entry.component.ts | 30 ++- .../collection/collection.component.ts | 50 +++- .../state/add-entry.service.spec.ts | 4 +- src/app/organizations/collections.module.ts | 41 --- .../collections/collections.component.ts | 24 +- .../collections/create-collection.module.ts | 14 -- .../create-collection.component.ts | 26 +- .../remove-collection.component.ts | 9 +- src/app/organizations/events.module.ts | 15 -- .../organizations/events/events.component.ts | 20 ++ .../organization-members.module.ts | 16 -- .../organization-members.component.ts | 25 ++ src/app/organizations/organization.module.ts | 44 ---- .../organization-stargazers.component.spec.ts | 3 +- .../organization-stargazers.component.ts | 7 + .../organization-stargazers.module.ts | 5 +- .../organization-starring.component.spec.ts | 3 +- .../organization-starring.component.ts | 5 + .../organization-starring.module.ts | 3 +- .../organization/organization.component.ts | 44 ++++ .../organization/time-ago-msg.pipe.ts | 1 + .../update-organization-description.module.ts | 31 --- ...date-organization-description.component.ts | 26 +- src/app/organizations/organizations.module.ts | 32 --- .../organizations/organizations.routing.ts | 12 +- .../organizations/organizations.component.ts | 42 +++- .../register-organization.module.ts | 18 -- .../register-organization.component.ts | 24 +- .../require-accounts-modal.component.ts | 8 +- .../state/collections.service.spec.ts | 8 +- .../state/organization.service.spec.ts | 10 +- .../upsert-organization-member.module.ts | 14 -- .../upsert-organization-member.component.ts | 30 ++- .../pagenotfound/pagenotfound.component.ts | 4 + .../preview-warning.component.ts | 4 + .../advancedsearch.component.ts | 20 +- .../basic-search.component.spec.ts | 5 +- .../basic-search/basic-search.component.ts | 27 +- .../facet-search/facet-search-update.pipe.ts | 1 + .../search/facet-search/facet-search.pipe.ts | 1 + src/app/search/get-histogram-style.pipe.ts | 1 + src/app/search/is-app-tool.pipe.ts | 1 + src/app/search/join-with-ellipses.pipe.ts | 1 + src/app/search/map-friendly-values.pipe.ts | 1 + src/app/search/search-authors-html.pipe.ts | 1 + .../search-notebook-table.component.spec.ts | 8 +- .../search-notebook-table.component.ts | 34 ++- .../search-results.component.spec.ts | 8 +- .../search-results.component.ts | 21 +- .../search-tool-table.component.spec.ts | 8 +- .../search-tool-table.component.ts | 39 ++- .../search-workflow-table.component.spec.ts | 8 +- .../search-workflow-table.component.ts | 34 ++- src/app/search/search.component.spec.ts | 26 +- src/app/search/search.component.ts | 59 ++++- src/app/search/search.module.ts | 84 ------- src/app/search/search.routing.ts | 6 +- src/app/search/state/search.service.spec.ts | 4 +- src/app/select/select.component.spec.ts | 3 +- src/app/select/select.component.ts | 7 + .../session-expired.component.ts | 4 + ...ared-workflow-services-notebooks.module.ts | 72 ------ .../shared/ai-bubble/ai-bubble.component.ts | 3 + src/app/shared/ai-bubble/ai-bubble.module.ts | 14 -- src/app/shared/alert/alert.component.spec.ts | 3 +- src/app/shared/alert/alert.component.ts | 6 + src/app/shared/alert/alert.module.ts | 16 -- src/app/shared/available-logs.module.ts | 31 --- .../available-logs.component.ts | 26 +- .../available-logs/remove-extension.pipe.ts | 1 + .../available-logs/tool-tester-log.pipe.ts | 1 + .../code-editor-list.component.spec.ts | 5 +- .../code-editor-list.component.ts | 33 +++ .../code-editor/code-editor.component.spec.ts | 3 +- .../code-editor/code-editor.component.ts | 1 + .../entry-actions.service.spec.ts | 10 +- .../entry-actions/tool-actions.component.ts | 8 + .../workflow-actions.component.ts | 7 + src/app/shared/entry-to-display-name.pipe.ts | 1 + src/app/shared/entry-wizard.module.ts | 12 - .../entry-wizard/entry-wizard.component.ts | 22 +- src/app/shared/entry/base-url.pipe.ts | 1 + src/app/shared/entry/commit-url.pipe.ts | 1 + .../descriptor-language-versions.pipe.ts | 1 + .../shared/entry/descriptor-language.pipe.ts | 1 + src/app/shared/entry/entry.module.ts | 18 +- src/app/shared/entry/execution-status.pipe.ts | 1 + ...ab-checker-workflow-path.component.spec.ts | 8 +- ...nfo-tab-checker-workflow-path.component.ts | 9 + .../launch-checker-workflow.component.spec.ts | 3 +- .../launch-checker-workflow.component.ts | 18 ++ src/app/shared/entry/platform-partner.pipe.ts | 1 + .../shared/entry/private-file-path.pipe.ts | 1 + .../shared/entry/public-file-download.pipe.ts | 1 + src/app/shared/entry/recent-events.pipe.ts | 1 + ...egister-checker-workflow.component.spec.ts | 4 +- .../register-checker-workflow.component.ts | 26 +- src/app/shared/entry/select-tab.pipe.ts | 1 + src/app/shared/entry/url-deconstruct.pipe.ts | 1 + .../verified-by/verified-by.component.spec.ts | 4 +- .../verified-by/verified-by.component.ts | 9 +- .../verified-display.component.spec.ts | 4 +- .../verified-display.component.ts | 6 +- .../shared/entry/verified-platforms.pipe.ts | 1 + .../shared/entry/versionProviderUrl.pipe.ts | 1 + src/app/shared/img-fallback.directive.spec.ts | 6 +- src/app/shared/img-fallback.directive.ts | 1 + .../shared/json-ld/json-ld.component.spec.ts | 2 +- src/app/shared/json-ld/json-ld.component.ts | 1 + .../shared/loading/loading.component.spec.ts | 3 +- src/app/shared/loading/loading.component.ts | 4 + .../markdown-wrapper.component.spec.ts | 3 +- .../markdown-wrapper.component.ts | 1 + src/app/shared/mastodon/mastodon.component.ts | 6 + src/app/shared/modules/container.module.ts | 119 --------- src/app/shared/modules/header.module.ts | 27 -- src/app/shared/modules/img-fallback.module.ts | 8 - src/app/shared/modules/json-ld.module.ts | 27 -- .../shared/modules/list-containers.module.ts | 35 --- .../shared/modules/list-workflows.module.ts | 32 --- .../shared/modules/markdown-wrapper.module.ts | 28 --- src/app/shared/modules/material.module.ts | 83 ------- src/app/shared/modules/my-entries.module.ts | 17 -- src/app/shared/modules/my-sidebar.module.ts | 29 --- src/app/shared/modules/orderby.module.ts | 26 -- .../shared/modules/preview-warning.module.ts | 26 -- .../modules/register-github-app.module.ts | 39 --- src/app/shared/modules/select.module.ts | 30 --- src/app/shared/modules/snackbar.module.ts | 8 - src/app/shared/modules/workflow.module.ts | 145 ----------- .../shared/modules/workflowsPage.module.ts | 28 --- src/app/shared/orderBy.ts | 6 +- src/app/shared/pipe/pipe.module.ts | 3 +- .../private-icon/private-icon.component.ts | 4 + .../private-icon/private-icon.module.ts | 13 - .../register-github-app.component.spec.ts | 3 +- .../register-github-app.component.ts | 7 + src/app/shared/snackbar.directive.ts | 1 + src/app/sitemap/sitemap.component.spec.ts | 3 +- src/app/sitemap/sitemap.component.ts | 4 + .../source-file-tabs.component.spec.ts | 3 +- .../source-file-tabs.component.ts | 37 ++- .../source-file-tabs.service.spec.ts | 3 +- .../stargazers/stargazers.component.spec.ts | 3 +- src/app/stargazers/stargazers.component.ts | 7 + src/app/stargazers/stargazers.module.ts | 5 +- .../starredentries.component.spec.ts | 43 +++- .../starredentries.component.ts | 55 +++- src/app/starring/starring.component.spec.ts | 3 +- src/app/starring/starring.component.ts | 5 + src/app/starring/starring.module.ts | 3 +- src/app/tosBanner/tos-banner.component.ts | 6 + src/app/user-page/user-page.component.ts | 28 +++ src/app/user-page/user-page.module.ts | 16 -- src/app/user-page/user-page.routing.ts | 4 +- .../cwl-viewer/cwl-viewer.component.spec.ts | 3 +- .../dag/cwl-viewer/cwl-viewer.component.ts | 6 + src/app/workflow/dag/dag.component.spec.ts | 3 +- src/app/workflow/dag/dag.component.ts | 25 ++ src/app/workflow/dag/dag.module.ts | 8 +- .../executions-tab.component.spec.ts | 13 +- .../executions/executions-tab.component.ts | 37 ++- .../seconds-to-hours-minutes-seconds.pipe.ts | 1 + .../workflow/info-tab/info-tab.component.ts | 49 +++- .../info-tab/info-tab.service.spec.ts | 6 +- .../launch-to-codespace-dialog.component.ts | 12 +- .../filterCloudInstances.pipe.ts | 1 + .../launch-third-party.component.spec.ts | 11 +- .../launch-third-party.component.ts | 21 +- .../multi-cloud-launch.component.spec.ts | 5 +- .../multi-cloud-launch.component.ts | 26 +- .../workflow/launch/launch.component.spec.ts | 3 +- src/app/workflow/launch/launch.component.ts | 22 ++ .../permissions/permissions.component.spec.ts | 5 +- .../permissions/permissions.component.ts | 8 +- ...sh-workflow-organization.component.spec.ts | 11 +- ...refresh-workflow-organization.component.ts | 4 + .../register-github-app-modal.component.ts | 7 +- .../register-workflow-modal.component.ts | 42 +++- .../exporter-step.component.spec.ts | 2 +- .../exporter-step/exporter-step.component.ts | 9 +- .../snaphot-exporter-modal.component.spec.ts | 9 +- .../snaphot-exporter-modal.component.ts | 35 ++- .../snapshot-exporter-modal/step.state.ts | 25 ++ .../tool-tab/tool-tab.component.spec.ts | 5 +- .../workflow/tool-tab/tool-tab.component.ts | 7 + .../version-modal/version-modal.component.ts | 30 ++- .../versions/versions.component.spec.ts | 14 +- .../workflow/versions/versions.component.ts | 34 ++- src/app/workflow/view/view.component.spec.ts | 6 +- src/app/workflow/view/view.component.ts | 6 + .../workflow-file-editor.component.spec.ts | 12 +- .../workflow-file-editor.component.ts | 8 + src/app/workflow/workflow.component.ts | 98 +++++++- src/app/workflows/apptools/apptools.module.ts | 9 - .../workflows/apptools/apptools.routing.ts | 2 +- src/app/workflows/list/list.component.ts | 35 +++ .../workflows/notebooks/notebooks.module.ts | 8 - .../workflows/notebooks/notebooks.routing.ts | 4 +- src/app/workflows/search/search.component.ts | 3 + src/app/workflows/services/services.module.ts | 8 - .../workflows/services/services.routing.ts | 4 +- src/app/workflows/workflows.component.ts | 8 +- src/app/workflows/workflows.module.ts | 26 -- src/app/workflows/workflows.routing.ts | 4 +- src/main.ts | 168 ++++++++++++- 358 files changed, 3556 insertions(+), 2342 deletions(-) delete mode 100644 src/app/aliases/aliases.module.ts delete mode 100644 src/app/categories/button/category-button.module.ts delete mode 100644 src/app/container/refresh-wizard.module.ts delete mode 100644 src/app/containers/containers.module.ts delete mode 100644 src/app/home-page/home-page.module.ts delete mode 100644 src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts delete mode 100644 src/app/loginComponents/accounts/internal/change-username/change-username.module.ts delete mode 100644 src/app/loginComponents/requests.module.ts delete mode 100644 src/app/my-notebooks/my-notebooks.module.ts delete mode 100644 src/app/my-services/my-services.module.ts delete mode 100644 src/app/mytools/mytools.module.ts delete mode 100644 src/app/myworkflows/myworkflows.module.ts delete mode 100644 src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts delete mode 100644 src/app/organizations/collections.module.ts delete mode 100644 src/app/organizations/collections/create-collection.module.ts delete mode 100644 src/app/organizations/events.module.ts delete mode 100644 src/app/organizations/organization-members.module.ts delete mode 100644 src/app/organizations/organization.module.ts delete mode 100644 src/app/organizations/organization/update-organization-description.module.ts delete mode 100644 src/app/organizations/organizations.module.ts delete mode 100644 src/app/organizations/register-organization.module.ts delete mode 100644 src/app/organizations/upsert-organization-member.module.ts delete mode 100644 src/app/search/search.module.ts delete mode 100644 src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts delete mode 100644 src/app/shared/ai-bubble/ai-bubble.module.ts delete mode 100644 src/app/shared/alert/alert.module.ts delete mode 100644 src/app/shared/available-logs.module.ts delete mode 100644 src/app/shared/entry-wizard.module.ts delete mode 100644 src/app/shared/modules/container.module.ts delete mode 100644 src/app/shared/modules/header.module.ts delete mode 100644 src/app/shared/modules/img-fallback.module.ts delete mode 100644 src/app/shared/modules/json-ld.module.ts delete mode 100644 src/app/shared/modules/list-containers.module.ts delete mode 100644 src/app/shared/modules/list-workflows.module.ts delete mode 100644 src/app/shared/modules/markdown-wrapper.module.ts delete mode 100644 src/app/shared/modules/material.module.ts delete mode 100644 src/app/shared/modules/my-entries.module.ts delete mode 100644 src/app/shared/modules/my-sidebar.module.ts delete mode 100644 src/app/shared/modules/orderby.module.ts delete mode 100644 src/app/shared/modules/preview-warning.module.ts delete mode 100644 src/app/shared/modules/register-github-app.module.ts delete mode 100644 src/app/shared/modules/select.module.ts delete mode 100644 src/app/shared/modules/snackbar.module.ts delete mode 100644 src/app/shared/modules/workflow.module.ts delete mode 100644 src/app/shared/modules/workflowsPage.module.ts delete mode 100644 src/app/shared/private-icon/private-icon.module.ts delete mode 100644 src/app/user-page/user-page.module.ts create mode 100644 src/app/workflow/snapshot-exporter-modal/step.state.ts delete mode 100644 src/app/workflows/apptools/apptools.module.ts delete mode 100644 src/app/workflows/notebooks/notebooks.module.ts delete mode 100644 src/app/workflows/services/services.module.ts delete mode 100644 src/app/workflows/workflows.module.ts diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 27bcb2e72e..7c41e946ec 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -545,9 +545,13 @@ describe('Dockstore my workflows part 3', () => { // Untouched form should not have errors but is disabled cy.get('#submitButton').should('be.disabled'); notHaveAlert(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').clear().type('beef/stew'); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); + cy.get('#sourceCodeRepositoryInput').clear(); + cy.get('#sourceCodeRepositoryInput').type('beef/stew'); cy.get('#submitButton').should('be.disabled'); - cy.get('#sourceCodeRepositoryWorkflowPathInput').scrollIntoView().should('be.visible').clear().type('/Dockstore.cwl'); + cy.get('#sourceCodeRepositoryWorkflowPathInput').scrollIntoView().should('be.visible'); + cy.get('#sourceCodeRepositoryWorkflowPathInput').clear(); + cy.get('#sourceCodeRepositoryWorkflowPathInput').type('/Dockstore.cwl'); notHaveAlert(); // Apparently the actual radio button inside Angular material buttons is hidden, so doing it this way cy.get('#descriptorTypeRadioButtons').contains(cwlDescriptorType).find('.mat-radio-container').click(); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 45dc6458a0..1924298e66 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -278,7 +278,9 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); + cy.get('#sourceCodeRepositoryInput').click(); + cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('Amazon ECR').click(); @@ -342,7 +344,9 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); + cy.get('#sourceCodeRepositoryInput').click(); + cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('Amazon ECR').click(); @@ -448,7 +452,9 @@ describe('Dockstore my tools', () => { cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible').click().type('testnamespace/testname'); + cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); + cy.get('#sourceCodeRepositoryInput').click(); + cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); cy.contains('mat-option', 'Seven Bridges').click(); @@ -458,6 +464,7 @@ describe('Dockstore my tools', () => { cy.get('#imageRegistryInput').type('testnamespace/testname'); + cy.get('#submitButton').scrollIntoView().should('be.enabled'); cy.get('#submitButton').click(); // TODO: This is temporarily disabled @@ -532,7 +539,8 @@ describe('Dockstore my tools', () => { cy.visit('/containers/quay.io/A2/a'); goToTab('Versions'); cy.get('[data-cy=actionsButton]').should('be.visible').first().click(); - cy.get('[data-cy=ok-dialog-close-button]').scrollIntoView().should('be.visible').click(); + cy.get('[data-cy=ok-dialog-close-button]').scrollIntoView().should('be.visible'); + cy.get('[data-cy=ok-dialog-close-button]').click(); }); }); }); diff --git a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts index 786e25458c..3eea3bd3c9 100644 --- a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts +++ b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts @@ -179,7 +179,9 @@ function toggleHiddenToolVersion() { } function toggleHiddenWorkflowVersion() { - cy.get('[data-cy=versionRow]').last().scrollIntoView().contains('button', 'Actions').should('be.visible').click(); + cy.get('[data-cy=versionRow]').last().scrollIntoView().contains('button', 'Actions').should('be.visible'); + cy.get('[data-cy=versionRow]').last().contains('button', 'Actions').click(); + cy.contains('button', 'Edit').scrollIntoView(); cy.contains('button', 'Edit').click(); // TODO: Use [data-cy=hiddenCheck] -- do after 1.14 deployed cy.contains('div', 'Hidden:').within(() => { @@ -266,7 +268,9 @@ function testWorkflow(registry: string, repo: string, name: string) { goToTab('Info'); cy.contains('button', 'Restub').click(); - cy.contains('button', 'Publish').should('be.disabled'); + // This fails because DOI is auto issued when published, and restub fails. + // See https://ucsc-gi.slack.com/archives/C05EZH3RVNY/p1718128426265779 + // cy.contains('button', 'Publish').should('be.disabled'); cy.get('[data-cy=refreshButton]').click(); goToTab('Versions'); diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts index 0e1f9cbf96..8a0753f74d 100644 --- a/src/app/about/about.component.ts +++ b/src/app/about/about.component.ts @@ -6,12 +6,34 @@ import { map } from 'rxjs/operators'; import { Funder, FundingComponent } from '../funding/funding.component'; import { Dockstore } from '../shared/dockstore.model'; import { Sponsor } from '../sponsors/sponsor.model'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgStyle, NgFor, AsyncPipe, SlicePipe } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-about', templateUrl: './about.component.html', styleUrls: ['./about.component.scss'], providers: [FundingComponent], + standalone: true, + imports: [ + FlexModule, + MatLegacyButtonModule, + MatIconModule, + NgStyle, + ExtendedModule, + MatLegacyTabsModule, + MatLegacyCardModule, + RouterLink, + NgFor, + AsyncPipe, + SlicePipe, + ], }) export class AboutComponent implements OnInit { Dockstore = Dockstore; diff --git a/src/app/aliases/aliases.component.ts b/src/app/aliases/aliases.component.ts index 52fda38c76..0675341b0b 100644 --- a/src/app/aliases/aliases.component.ts +++ b/src/app/aliases/aliases.component.ts @@ -7,11 +7,18 @@ import { ActivatedRoute, Router } from '../test'; import { AliasesQuery } from './state/aliases.query'; import { AliasesService } from './state/aliases.service'; import { EntryTypeMetadataService } from '../entry/type-metadata/entry-type-metadata.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-aliases', templateUrl: './aliases.component.html', styleUrls: ['./aliases.component.scss'], + standalone: true, + imports: [HeaderComponent, NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule, AsyncPipe], }) export class AliasesComponent extends Base implements OnInit { loading$: Observable; diff --git a/src/app/aliases/aliases.module.ts b/src/app/aliases/aliases.module.ts deleted file mode 100644 index 93c605ec4e..0000000000 --- a/src/app/aliases/aliases.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { AliasesComponent } from './aliases.component'; -import { AliasesRouting } from './aliases.routing'; - -@NgModule({ - imports: [CommonModule, HeaderModule, AliasesRouting, CustomMaterialModule, RefreshAlertModule, FlexLayoutModule, PipeModule], - declarations: [AliasesComponent], - exports: [AliasesComponent], -}) -export class AliasesModule {} diff --git a/src/app/aliases/aliases.routing.ts b/src/app/aliases/aliases.routing.ts index a4872a4565..e6bfef40c7 100644 --- a/src/app/aliases/aliases.routing.ts +++ b/src/app/aliases/aliases.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { AliasesComponent } from './aliases.component'; const ALIASES_ROUTES: Routes = [ @@ -25,4 +25,4 @@ const ALIASES_ROUTES: Routes = [ }, ]; -export const AliasesRouting = RouterModule.forChild(ALIASES_ROUTES); +export const AliasesRouting = ALIASES_ROUTES; diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index c2950a3f5b..860f9060a4 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -1,47 +1,118 @@ -import { TestBed, waitForAsync } from '@angular/core/testing'; -import { RouterTestingModule } from '@angular/router/testing'; -import { RouterLinkStubDirective, RouterOutletStubComponent } from './test/router-stubs'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { Component } from '@angular/core'; +import { TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { RouterTestingModule } from '@angular/router/testing'; +import { AuthService } from 'ng2-ui-auth'; import { AppComponent } from './app.component'; +import { MytoolsService } from './mytools/mytools.service'; +import { MyWorkflowsService } from './myworkflows/myworkflows.service'; +import { ServiceInfoService } from './service-info/service-info.service'; +import { ContainerService } from './shared/container.service'; +import { DateService } from './shared/date.service'; +import { DescriptorLanguageService } from './shared/entry/descriptor-language.service'; +import { LogoutService } from './shared/logout.service'; +import { Configuration, UsersService } from './shared/openapi'; +import { PagenumberService } from './shared/pagenumber.service'; +import { ProviderService } from './shared/provider.service'; +import { MyEntriesStateService } from './shared/state/my-entries.service'; +import { MyEntriesStore } from './shared/state/my-entries.store'; import { TrackLoginService } from './shared/track-login.service'; -import { TosBannerStubService, TrackLoginStubService } from './test/service-stubs'; +import { UrlResolverService } from './shared/url-resolver.service'; +import { RouterLinkStubDirective, RouterOutletStubComponent } from './test/router-stubs'; +import { + AuthStubService, + ConfigurationStub, + ContainerStubService, + DateStubService, + DescriptorLanguageStubService, + GA4GHV20StubService, + LogoutStubService, + ProviderStubService, + TosBannerStubService, + TrackLoginStubService, + UrlResolverStubService, + UsersStubService, +} from './test/service-stubs'; import { TosBannerService } from './tosBanner/state/tos-banner.service'; -@Component({ selector: 'app-banner', template: '' }) +@Component({ + selector: 'app-banner', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class BannerStubComponent {} -@Component({ selector: 'app-navbar', template: '' }) +@Component({ + selector: 'app-navbar', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class NavbarStubComponent {} -@Component({ selector: 'app-footer', template: '' }) +@Component({ + selector: 'app-footer', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class FooterStubComponent {} -@Component({ selector: 'app-tos-banner', template: '' }) +@Component({ + selector: 'app-tos-banner', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class TosBannerStubComponent {} -@Component({ selector: 'app-sitewide-notifications', template: '' }) +@Component({ + selector: 'app-sitewide-notifications', + template: '', + standalone: true, + imports: [RouterTestingModule, MatSnackBarModule], +}) class NotificationStubComponent {} describe('AppComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ - AppComponent, + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], + imports: [ + RouterTestingModule, + MatLegacyDialogModule, + MatSnackBarModule, + HttpClientTestingModule, NavbarStubComponent, FooterStubComponent, BannerStubComponent, - RouterLinkStubDirective, - RouterOutletStubComponent, TosBannerStubComponent, NotificationStubComponent, + AppComponent, ], - imports: [RouterTestingModule, MatSnackBarModule], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: TosBannerService, useClass: TosBannerStubService }, + { provide: AuthService, useClass: AuthStubService }, + { provide: Configuration, useClass: ConfigurationStub }, + { provide: ContainerService, useClass: ContainerStubService }, + { provide: ServiceInfoService, useClass: GA4GHV20StubService }, + { provide: DateService, useClass: DateStubService }, + { provide: ProviderService, useClass: ProviderStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: UsersService, useClass: UsersStubService }, + { provide: LogoutService, useClass: LogoutStubService }, + MyEntriesStateService, + MyEntriesStore, + MytoolsService, + MyWorkflowsService, + PagenumberService, ], }).compileComponents(); }) diff --git a/src/app/app.component.ts b/src/app/app.component.ts index dd1603bdcb..eedd6ae340 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -1,21 +1,40 @@ +import { AsyncPipe, NgIf } from '@angular/common'; import { Component, OnDestroy, OnInit } from '@angular/core'; import { Title } from '@angular/platform-browser'; -import { ActivatedRoute, NavigationEnd, Router } from '@angular/router'; +import { ActivatedRoute, NavigationEnd, Router, RouterOutlet } from '@angular/router'; import { Observable, Subject } from 'rxjs'; import { filter, map, mergeMap, takeUntil } from 'rxjs/operators'; +import { BannerComponent } from './banner/banner.component'; +import { ChangeUsernameBannerComponent } from './changeUsernameBanner/changeUsernameBanner.component'; +import { FooterComponent } from './footer/footer.component'; +import { NavbarComponent } from './navbar/navbar.component'; +import { SitewideNotificationsComponent } from './notifications/sitewide-notifications.component'; import { AlertService } from './shared/alert/state/alert.service'; import { currentPrivacyPolicyVersion, currentTOSVersion } from './shared/constants'; import { Dockstore } from './shared/dockstore.model'; import { User } from './shared/openapi/model/user'; import { TrackLoginService } from './shared/track-login.service'; -import { TosBannerQuery } from './tosBanner/state/tos-banner.query'; import { UserQuery } from './shared/user/user.query'; +import { TosBannerQuery } from './tosBanner/state/tos-banner.query'; import { TosBannerService } from './tosBanner/state/tos-banner.service'; +import { TosBannerComponent } from './tosBanner/tos-banner.component'; @Component({ selector: 'app-root', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], + standalone: true, + imports: [ + NgIf, + TosBannerComponent, + ChangeUsernameBannerComponent, + SitewideNotificationsComponent, + BannerComponent, + NavbarComponent, + RouterOutlet, + FooterComponent, + AsyncPipe, + ], }) export class AppComponent implements OnInit, OnDestroy { public isLoggedIn$: Observable; diff --git a/src/app/app.module.ts b/src/app/app.module.ts index 32b226885d..eb921167de 100644 --- a/src/app/app.module.ts +++ b/src/app/app.module.ts @@ -13,117 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { HTTP_INTERCEPTORS, HttpClient, HttpClientModule } from '@angular/common/http'; -import { APP_INITIALIZER, NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { - MAT_LEGACY_SNACK_BAR_DEFAULT_OPTIONS as MAT_SNACK_BAR_DEFAULT_OPTIONS, - MatLegacySnackBarConfig as MatSnackBarConfig, -} from '@angular/material/legacy-snack-bar'; -import { - MAT_LEGACY_TOOLTIP_DEFAULT_OPTIONS as MAT_TOOLTIP_DEFAULT_OPTIONS, - MatLegacyTooltipDefaultOptions as MatTooltipDefaultOptions, -} from '@angular/material/legacy-tooltip'; -import { BrowserModule, Title } from '@angular/platform-browser'; -import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { AuthService, Ng2UiAuthModule } from 'ng2-ui-auth'; -import { MarkdownModule } from 'ngx-markdown'; -import { environment } from '../environments/environment'; -import { AboutComponent } from './about/about.component'; -import { AppComponent } from './app.component'; -import { CLIENT_ROUTER_PROVIDERS, routing } from './app.routing'; -import { BannerComponent } from './banner/banner.component'; -import { ChangeUsernameBannerComponent } from './changeUsernameBanner/changeUsernameBanner.component'; +import { MatLegacySnackBarConfig as MatSnackBarConfig } from '@angular/material/legacy-snack-bar'; +import { MatLegacyTooltipDefaultOptions as MatTooltipDefaultOptions } from '@angular/material/legacy-tooltip'; import { ConfigurationService } from './configuration.service'; import { EntryTypeMetadataService } from './entry/type-metadata/entry-type-metadata.service'; -import { ConfirmationDialogComponent } from './confirmation-dialog/confirmation-dialog.component'; -import { FileTreeComponent } from './file-tree/file-tree.component'; -import { FooterComponent } from './footer/footer.component'; -import { GitTagPipe } from './footer/git-tag.pipe'; -import { FundingComponent } from './funding/funding.component'; -import { GithubCallbackComponent } from './github-callback/github-callback.component'; -import { YoutubeComponent } from './home-page/home-logged-out/home.component'; -import { HomePageModule } from './home-page/home-page.module'; -import { InformationDialogComponent } from './information-dialog/information-dialog.component'; -import { CustomHeaderInterceptor } from './interceptors/custom-header.interceptor'; -import { WorkflowVersionsInterceptor } from './interceptors/workflow-versions.interceptor'; -import { LoginComponent } from './login/login.component'; -import { LoginService } from './login/login.service'; -import { AccountSidebarModule } from './loginComponents/accounts/account-sidebar/account-sidebar.module'; -import { AccountsComponent } from './loginComponents/accounts/accounts.component'; -import { ControlsComponent } from './loginComponents/accounts/controls/controls.component'; -import { DeleteAccountDialogComponent } from './loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component'; -import { DeleteEntryDialogComponent } from './entry/delete/dialog/delete-entry-dialog.component'; -import { ArchiveEntryDialogComponent } from './entry/archive/dialog/archive-entry-dialog.component'; -import { RevokeTokenDialogComponent } from './loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component'; -import { AccountsExternalComponent } from './loginComponents/accounts/external/accounts.component'; -import { AccountsService } from './loginComponents/accounts/external/accounts.service'; -import { GetTokenUsernamePipe } from './loginComponents/accounts/external/getTokenUsername.pipe'; -import { ChangeUsernameModule } from './loginComponents/accounts/internal/change-username/change-username.module'; -import { AuthComponent } from './loginComponents/auth/auth.component'; -import { DownloadCLIClientComponent } from './loginComponents/onboarding/downloadcliclient/downloadcliclient.component'; -import { OnboardingComponent } from './loginComponents/onboarding/onboarding.component'; -import { QuickStartComponent } from './loginComponents/onboarding/quickstart.component'; -import { RequestsModule } from './loginComponents/requests.module'; -import { LogoutComponent } from './logout/logout.component'; -import { MaintenanceComponent } from './maintenance/maintenance.component'; -import { ServiceInfoService } from './service-info/service-info.service'; -import { NavbarComponent } from './navbar/navbar.component'; -import { SitewideNotificationsComponent } from './notifications/sitewide-notifications.component'; -import { OrganizationStargazersModule } from './organizations/organization/organization-stargazers/organization-stargazers.module'; -import { OrganizationStarringModule } from './organizations/organization/organization-starring/organization-starring.module'; -import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; -import { RegisterService } from './register/register.service'; -import { SessionExpiredComponent } from './session-expired/session-expired.component'; -import { RefreshAlertModule } from './shared/alert/alert.module'; -import { AuthConfig } from './shared/auth.model'; -import { ContainerService } from './shared/container.service'; -import { DateService } from './shared/date.service'; -import { DescriptorLanguageService } from './shared/entry/descriptor-language.service'; -import { RegisterCheckerWorkflowService } from './shared/entry/register-checker-workflow/register-checker-workflow.service'; -import { ExtendedToolsService } from './shared/extended-tools.service'; -import { ExtendedWorkflowsService } from './shared/extended-workflows.service'; -import { ImageProviderService } from './shared/image-provider.service'; -import { ListService } from './shared/list.service'; -import { LogoutService } from './shared/logout.service'; -import { HeaderModule } from './shared/modules/header.module'; -import { ImgFallbackModule } from './shared/modules/img-fallback.module'; -import { ListContainersModule } from './shared/modules/list-containers.module'; -import { ListWorkflowsModule } from './shared/modules/list-workflows.module'; -import { MarkdownWrapperModule } from './shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from './shared/modules/material.module'; -import { MySidebarModule } from './shared/modules/my-sidebar.module'; -import { OrderByModule } from './shared/modules/orderby.module'; -import { SnackbarModule } from './shared/modules/snackbar.module'; -import { ApiModule as ApiModule2 } from './shared/openapi/api.module'; -import { GA4GHV20Service } from './shared/openapi/api/gA4GHV20.service'; -import { OrgLogoService } from './shared/org-logo.service'; -import { PagenumberService } from './shared/pagenumber.service'; -import { PipeModule } from './shared/pipe/pipe.module'; -import { ProviderService } from './shared/provider.service'; -import { RefreshService } from './shared/refresh.service'; -import { ApiModule } from './shared/openapi/api.module'; import { Configuration } from './shared/openapi/configuration'; -import { TrackLoginService } from './shared/track-login.service'; -import { UrlResolverService } from './shared/url-resolver.service'; -import { VerifiedByService } from './shared/verified-by.service'; -import { SitemapComponent } from './sitemap/sitemap.component'; -import { StargazersModule } from './stargazers/stargazers.module'; -import { StarredEntriesComponent } from './starredentries/starredentries.component'; -import { StarringModule } from './starring/starring.module'; -import { TosBannerService } from './tosBanner/state/tos-banner.service'; -import { TosBannerComponent } from './tosBanner/tos-banner.component'; -import { ExporterStepComponent } from './workflow/snapshot-exporter-modal/exporter-step/exporter-step.component'; -import { SnaphotExporterModalComponent } from './workflow/snapshot-exporter-modal/snaphot-exporter-modal.component'; -import { ViewService } from './workflow/view/view.service'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { PreviewWarningModule } from './shared/modules/preview-warning.module'; -import { MyOrganizationsDialogComponent } from './home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component'; -import { LaunchToCodespaceDialogComponent } from './workflow/launch-third-party/dialog/launch-to-codespace-dialog.component'; export const myCustomTooltipDefaults: MatTooltipDefaultOptions = { showDelay: 500, @@ -144,130 +38,6 @@ export function initializerFactory( return () => Promise.all([configurationService.load(), entryTypeMetadataService.load()]); } -@NgModule({ - declarations: [ - AppComponent, - ControlsComponent, - DeleteAccountDialogComponent, - DeleteEntryDialogComponent, - ArchiveEntryDialogComponent, - NavbarComponent, - FooterComponent, - SitewideNotificationsComponent, - LoginComponent, - OnboardingComponent, - QuickStartComponent, - AccountsComponent, - AccountsExternalComponent, - AuthComponent, - GetTokenUsernamePipe, - StarredEntriesComponent, - DownloadCLIClientComponent, - MaintenanceComponent, - FundingComponent, - BannerComponent, - YoutubeComponent, - SitemapComponent, - GithubCallbackComponent, - ConfirmationDialogComponent, - InformationDialogComponent, - SessionExpiredComponent, - TosBannerComponent, - LogoutComponent, - GitTagPipe, - AboutComponent, - PageNotFoundComponent, - SnaphotExporterModalComponent, - ExporterStepComponent, - FileTreeComponent, - ChangeUsernameBannerComponent, - RevokeTokenDialogComponent, - MyOrganizationsDialogComponent, - LaunchToCodespaceDialogComponent, - ], - imports: [ - environment.production ? [] : AkitaNgDevtools.forRoot(), - FontAwesomeModule, - BrowserModule, - BrowserAnimationsModule, - FormsModule, - Ng2UiAuthModule.forRoot(AuthConfig), - HeaderModule, - ListContainersModule, - ListWorkflowsModule, - ClipboardModule, - OrderByModule, - FlexLayoutModule, - StarringModule, - OrganizationStarringModule, - OrganizationStargazersModule, - NgxMatSelectSearchModule, - routing, - StargazersModule, - MarkdownModule.forRoot(), - MarkdownWrapperModule, - ReactiveFormsModule, - ApiModule.forRoot(getApiConfig), - ApiModule2.forRoot(getApiConfig), - CustomMaterialModule, - RefreshAlertModule, - RequestsModule, - HomePageModule, - HttpClientModule, - SnackbarModule, - ImgFallbackModule, - PipeModule, - MySidebarModule, - AccountSidebarModule, - ChangeUsernameModule, - PreviewWarningModule, - ], - providers: [ - AccountsService, - AuthService, - LoginService, - RegisterService, - LogoutService, - DateService, - TrackLoginService, - ListService, - ProviderService, - ContainerService, - ImageProviderService, - HttpClient, - CLIENT_ROUTER_PROVIDERS, - RegisterCheckerWorkflowService, - RefreshService, - PagenumberService, - GA4GHV20Service, - DescriptorLanguageService, - UrlResolverService, - ServiceInfoService, - ExtendedWorkflowsService, - ExtendedToolsService, - VerifiedByService, - Title, - ViewService, - TosBannerService, - ConfigurationService, - EntryTypeMetadataService, - OrgLogoService, - { - provide: APP_INITIALIZER, - useFactory: initializerFactory, - deps: [ConfigurationService, EntryTypeMetadataService], - multi: true, - }, - { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: myCustomTooltipDefaults }, - { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: myCustomSnackbarDefaults }, - { provide: HTTP_INTERCEPTORS, useClass: WorkflowVersionsInterceptor, multi: true }, - { provide: HTTP_INTERCEPTORS, useClass: CustomHeaderInterceptor, multi: true }, - { provide: Window, useValue: window }, - ], - bootstrap: [AppComponent], -}) -export class AppModule {} - export const apiConfig = new Configuration({ apiKeys: {}, basePath: window.location.protocol + '//' + window.location.host + '/api', diff --git a/src/app/app.routing.ts b/src/app/app.routing.ts index eb86ba35d3..d94f9d7e0a 100644 --- a/src/app/app.routing.ts +++ b/src/app/app.routing.ts @@ -17,6 +17,8 @@ import { RouterModule, Routes } from '@angular/router'; import { AboutComponent } from './about/about.component'; import { FundingComponent } from './funding/funding.component'; import { GithubCallbackComponent } from './github-callback/github-callback.component'; +import { GithubLandingPageComponent } from './github-landing-page/github-landing-page.component'; +import { DashboardComponent } from './home-page/dashboard/dashboard.component'; import { HomeComponent } from './home-page/home-logged-out/home.component'; import { LoginComponent } from './login/login.component'; import { AccountsComponent } from './loginComponents/accounts/accounts.component'; @@ -25,13 +27,11 @@ import { OnboardingComponent } from './loginComponents/onboarding/onboarding.com import { QuickStartComponent } from './loginComponents/onboarding/quickstart.component'; import { LogoutComponent } from './logout/logout.component'; import { MaintenanceComponent } from './maintenance/maintenance.component'; -import { DashboardComponent } from './home-page/dashboard/dashboard.component'; +import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; import { SessionExpiredComponent } from './session-expired/session-expired.component'; import { AuthGuard } from './shared/auth.guard'; import { SitemapComponent } from './sitemap/sitemap.component'; import { StarredEntriesComponent } from './starredentries/starredentries.component'; -import { PageNotFoundComponent } from './pagenotfound/pagenotfound.component'; -import { GithubLandingPageComponent } from './github-landing-page/github-landing-page.component'; export const CLIENT_ROUTER_PROVIDERS = [AuthGuard]; @@ -45,78 +45,78 @@ const APP_ROUTES: Routes = [ }, { path: 'docs', - loadChildren: () => import('app/docs/docs.module').then((m) => m.DocsModule), + loadChildren: () => import('app/docs/docs.routing').then((m) => m.docsRouting), data: { title: 'Dockstore | Documentation' }, }, { path: 'search-containers', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'containers', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'tools', - loadChildren: () => import('app/containers/containers.module').then((m) => m.ContainersModule), + loadChildren: () => import('app/containers/containers.routing').then((m) => m.containersRouting), data: { title: 'Dockstore | Tools' }, }, { path: 'workflows', - loadChildren: () => import('app/workflows/workflows.module').then((m) => m.WorkflowsModule), + loadChildren: () => import('app/workflows/workflows.routing').then((m) => m.workflowsRouting), data: { title: 'Dockstore | Workflows' }, }, { path: 'services', - loadChildren: () => import('app/workflows/services/services.module').then((m) => m.ServicesModule), + loadChildren: () => import('app/workflows/services/services.routing').then((m) => m.ServicesRoutes), data: { title: 'Dockstore | Services' }, }, { path: 'apptools', - loadChildren: () => import('app/workflows/apptools/apptools.module').then((m) => m.AppToolsModule), + loadChildren: () => import('app/workflows/apptools/apptools.routing').then((m) => m.AppToolsRoutes), data: { title: 'Dockstore | App Tools' }, }, { path: 'notebooks', - loadChildren: () => import('app/workflows/notebooks/notebooks.module').then((m) => m.NotebooksModule), + loadChildren: () => import('app/workflows/notebooks/notebooks.routing').then((m) => m.NotebooksRoutes), data: { title: 'Dockstore | Notebooks' }, }, { path: 'search-workflows', - loadChildren: () => import('app/workflows/workflows.module').then((m) => m.WorkflowsModule), + loadChildren: () => import('app/workflows/workflows.routing').then((m) => m.workflowsRouting), data: { title: 'Dockstore | Workflows' }, }, - { path: 'organizations', loadChildren: () => import('app/organizations/organizations.module').then((m) => m.OrganizationsModule) }, + { path: 'organizations', loadChildren: () => import('app/organizations/organizations.routing').then((m) => m.OrganizationsRouting) }, { path: 'my-tools', - loadChildren: () => import('app/mytools/mytools.module').then((m) => m.MyToolsModule), + loadChildren: () => import('app/mytools/mytools.routing').then((m) => m.mytoolsRouting), canActivate: [AuthGuard], data: { title: 'Dockstore | My Tools' }, }, { path: 'my-workflows', - loadChildren: () => import('app/myworkflows/myworkflows.module').then((m) => m.MyWorkflowsModule), + loadChildren: () => import('app/myworkflows/myworkflows.routing').then((m) => m.myworkflowRouting), canActivate: [AuthGuard], data: { title: 'Dockstore | My Workflows' }, }, { path: 'my-services', - loadChildren: () => import('app/my-services/my-services.module').then((m) => m.MyServicesModule), + loadChildren: () => import('app/my-services/my-services.routing').then((m) => m.MyServicesRoutes), canActivate: [AuthGuard], data: { title: 'Dockstore | My Services' }, }, { path: 'my-notebooks', - loadChildren: () => import('app/my-notebooks/my-notebooks.module').then((m) => m.MyNotebooksModule), + loadChildren: () => import('app/my-notebooks/my-notebooks.routing').then((m) => m.MyNotebooksRoutes), canActivate: [AuthGuard], data: { title: 'Dockstore | My Notebooks' }, }, { path: 'githubCallback', component: GithubCallbackComponent }, { path: 'aliases', - loadChildren: () => import('app/aliases/aliases.module').then((m) => m.AliasesModule), + loadChildren: () => import('app/aliases/aliases.routing').then((m) => m.AliasesRouting), data: { title: 'Dockstore | Aliases' }, }, { @@ -126,7 +126,7 @@ const APP_ROUTES: Routes = [ }, { path: 'search', - loadChildren: () => import('app/search/search.module').then((m) => m.SearchModule), + loadChildren: () => import('app/search/search.routing').then((m) => m.searchRouting), data: { title: 'Dockstore | Search' }, }, { path: 'register', component: LoginComponent, data: { title: 'Dockstore | Register' } }, @@ -147,7 +147,7 @@ const APP_ROUTES: Routes = [ { path: 'funding', component: FundingComponent, data: { title: 'Dockstore | Funding' } }, { path: 'sitemap', component: SitemapComponent, data: { title: 'Dockstore | Sitemap' } }, { path: 'github-landing-page', component: GithubLandingPageComponent, data: { title: 'Dockstore | GitHub Apps Landing Page' } }, - { path: 'users', loadChildren: () => import('app/user-page/user-page.module').then((m) => m.UserPageModule) }, + { path: 'users', loadChildren: () => import('app/user-page/user-page.routing').then((m) => m.UserPageRouting) }, { path: '**', component: PageNotFoundComponent, diff --git a/src/app/banner/banner.component.spec.ts b/src/app/banner/banner.component.spec.ts index 84e63d3f9e..abed3ca562 100644 --- a/src/app/banner/banner.component.spec.ts +++ b/src/app/banner/banner.component.spec.ts @@ -11,7 +11,7 @@ describe('BannerComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [BannerComponent], + imports: [BannerComponent], providers: [ServiceInfoService, { provide: GA4GHV20Service, useClass: GA4GHV20StubService }], }).compileComponents(); }) diff --git a/src/app/banner/banner.component.ts b/src/app/banner/banner.component.ts index 15bf72fcf6..6d667cd8c8 100644 --- a/src/app/banner/banner.component.ts +++ b/src/app/banner/banner.component.ts @@ -7,11 +7,14 @@ import { versions } from '../footer/versions'; import { ServiceInfoService } from '../service-info/service-info.service'; import { Base } from '../shared/base'; import { TRSService } from 'app/shared/openapi'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-banner', templateUrl: './banner.component.html', styleUrls: ['./banner.component.scss'], + standalone: true, + imports: [NgIf], }) export class BannerComponent extends Base implements OnInit { showBanner: boolean; diff --git a/src/app/categories/button/category-button.component.ts b/src/app/categories/button/category-button.component.ts index 70758a49fd..cac45358e4 100644 --- a/src/app/categories/button/category-button.component.ts +++ b/src/app/categories/button/category-button.component.ts @@ -15,11 +15,17 @@ */ import { Component, OnChanges, Input } from '@angular/core'; import { Category, CategorySummary } from '../../shared/openapi'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { NgClass } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; @Component({ selector: 'app-category-button', templateUrl: './category-button.component.html', styleUrls: ['./category-button.component.scss'], + standalone: true, + imports: [MatLegacyChipsModule, RouterLink, NgClass, MatLegacyTooltipModule], }) export class CategoryButtonComponent implements OnChanges { @Input() category: Category | CategorySummary; diff --git a/src/app/categories/button/category-button.module.ts b/src/app/categories/button/category-button.module.ts deleted file mode 100644 index c1175ec2ff..0000000000 --- a/src/app/categories/button/category-button.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2021 OICR and UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; - -import { CategoryButtonComponent } from './category-button.component'; - -@NgModule({ - declarations: [CategoryButtonComponent], - imports: [CommonModule, RouterModule, CustomMaterialModule], - exports: [CategoryButtonComponent], -}) -export class CategoryButtonModule {} diff --git a/src/app/changeUsernameBanner/changeUsernameBanner.component.ts b/src/app/changeUsernameBanner/changeUsernameBanner.component.ts index d8e9338cb5..8dab256841 100644 --- a/src/app/changeUsernameBanner/changeUsernameBanner.component.ts +++ b/src/app/changeUsernameBanner/changeUsernameBanner.component.ts @@ -14,9 +14,12 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-change-username-banner', templateUrl: './changeUsernameBanner.component.html', + standalone: true, + imports: [FlexModule], }) export class ChangeUsernameBannerComponent {} diff --git a/src/app/confirmation-dialog/confirmation-dialog.component.ts b/src/app/confirmation-dialog/confirmation-dialog.component.ts index 0e28178ef5..a820caa373 100644 --- a/src/app/confirmation-dialog/confirmation-dialog.component.ts +++ b/src/app/confirmation-dialog/confirmation-dialog.component.ts @@ -1,5 +1,12 @@ import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf } from '@angular/common'; export class ConfirmationDialogData { message?: string; @@ -12,6 +19,8 @@ export class ConfirmationDialogData { selector: 'app-confirmation-dialog', templateUrl: './confirmation-dialog.component.html', styleUrls: ['./confirmation-dialog.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyDialogModule, FlexModule, MatLegacyButtonModule], }) export class ConfirmationDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: ConfirmationDialogData) {} diff --git a/src/app/container/add-tag/add-tag.component.ts b/src/app/container/add-tag/add-tag.component.ts index 0ee4db8a87..ea24373a99 100644 --- a/src/app/container/add-tag/add-tag.component.ts +++ b/src/app/container/add-tag/add-tag.component.ts @@ -15,8 +15,8 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { AfterViewChecked, Component, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { forkJoin, Observable } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -29,11 +29,34 @@ import { Tag } from '../../shared/openapi/model/tag'; import { ToolDescriptor } from '../../shared/openapi/model/toolDescriptor'; import { ToolQuery } from '../../shared/tool/tool.query'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../shared/validationMessages.model'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, NgClass } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../shared/alert/alert.component'; @Component({ selector: 'app-add-tag', templateUrl: './add-tag.component.html', styleUrls: ['./add-tag.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + NgFor, + NgClass, + ExtendedModule, + MatIconModule, + MatLegacyCheckboxModule, + MatLegacyButtonModule, + ], }) export class AddTagComponent extends Base implements OnInit, AfterViewChecked { addTagForm: NgForm; diff --git a/src/app/container/container.component.html b/src/app/container/container.component.html index 3d722ac53b..cd8fef4368 100644 --- a/src/app/container/container.component.html +++ b/src/app/container/container.component.html @@ -200,15 +200,15 @@

    mat-stretch-tabs > - + > - [toolname]="tool?.toolname" [mode]="tool?.mode" [versionsFileTypes]="versionsFileTypes" - > + >
    diff --git a/src/app/container/container.component.ts b/src/app/container/container.component.ts index 81f99b6d2e..9b7dc692bf 100644 --- a/src/app/container/container.component.ts +++ b/src/app/container/container.component.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Location } from '@angular/common'; +import { Location, NgIf, NgFor, NgClass, AsyncPipe, DatePipe } from '@angular/common'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; -import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Title } from '@angular/platform-browser'; import { ActivatedRoute, Router } from '@angular/router'; @@ -49,11 +49,79 @@ import { UrlResolverService } from './../shared/url-resolver.service'; import { AddTagComponent } from './add-tag/add-tag.component'; import { EmailService } from './email.service'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; +import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; +import { VerifiedByComponent } from '../shared/entry/verified-by/verified-by.component'; +import { CurrentCollectionsComponent } from '../entry/current-collections/current-collections.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatDividerModule } from '@angular/material/divider'; +import { ToolFileEditorComponent } from './tool-file-editor/tool-file-editor.component'; +import { FilesContainerComponent } from './files/files.component'; +import { VersionsContainerComponent } from './versions/versions.component'; +import { LaunchComponent } from './launch/launch.component'; +import { InfoTabComponent } from './info-tab/info-tab.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { CategoryButtonComponent } from '../categories/button/category-button.component'; +import { ToolActionsComponent } from '../shared/entry-actions/tool-actions.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { StarringComponent } from '../starring/starring.component'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { PrivateIconComponent } from '../shared/private-icon/private-icon.component'; +import { JsonLdComponent } from '../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { WorkflowComponent } from '../workflow/workflow.component'; @Component({ selector: 'app-container', templateUrl: './container.component.html', styleUrls: ['../shared/styles/workflow-container.component.scss'], + standalone: true, + imports: [ + NgIf, + WorkflowComponent, + MatLegacyCardModule, + MatIconModule, + FlexModule, + JsonLdComponent, + PrivateIconComponent, + ExtendedModule, + MatLegacyChipsModule, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + StarringComponent, + MatLegacyButtonModule, + ToolActionsComponent, + CategoryButtonComponent, + FormsModule, + ReactiveFormsModule, + StargazersComponent, + NgClass, + MatLegacyTabsModule, + InfoTabComponent, + LaunchComponent, + VersionsContainerComponent, + FilesContainerComponent, + ToolFileEditorComponent, + MatDividerModule, + SnackbarDirective, + ClipboardModule, + CurrentCollectionsComponent, + VerifiedByComponent, + ShareButtonsModule, + AsyncPipe, + DatePipe, + ], }) export class ContainerComponent extends Entry implements AfterViewInit, OnInit { dockerPullCmd: string; diff --git a/src/app/container/deregister-modal/deregister-modal.component.ts b/src/app/container/deregister-modal/deregister-modal.component.ts index efe98ea836..a6b1486b9f 100644 --- a/src/app/container/deregister-modal/deregister-modal.component.ts +++ b/src/app/container/deregister-modal/deregister-modal.component.ts @@ -20,11 +20,15 @@ import { ConfirmationDialogData } from '../../confirmation-dialog/confirmation-d import { ConfirmationDialogService } from '../../confirmation-dialog/confirmation-dialog.service'; import { bootstrap4mediumModalSize } from '../../shared/constants'; import { RegisterToolService } from './../register-tool/register-tool.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-deregister-modal', templateUrl: './deregister-modal.component.html', styleUrls: ['./deregister-modal.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, MatLegacyTooltipModule], }) export class ModalComponent { @Input() refreshMessage: boolean; diff --git a/src/app/container/descriptors/descriptors.component.spec.ts b/src/app/container/descriptors/descriptors.component.spec.ts index d278f42f4f..b21451caec 100644 --- a/src/app/container/descriptors/descriptors.component.spec.ts +++ b/src/app/container/descriptors/descriptors.component.spec.ts @@ -41,8 +41,7 @@ describe('DescriptorsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DescriptorsComponent], - imports: [HttpClientModule, MatSnackBarModule, HttpClientTestingModule], + imports: [HttpClientModule, MatSnackBarModule, HttpClientTestingModule, DescriptorsComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ DescriptorService, diff --git a/src/app/container/descriptors/descriptors.component.ts b/src/app/container/descriptors/descriptors.component.ts index a48466f7eb..1b59aa09b0 100644 --- a/src/app/container/descriptors/descriptors.component.ts +++ b/src/app/container/descriptors/descriptors.component.ts @@ -26,11 +26,39 @@ import { Tag } from '../../shared/openapi/model/tag'; import { ToolQuery } from '../../shared/tool/tool.query'; import { FilesQuery } from '../../workflow/files/state/files.query'; import { FilesService } from '../../workflow/files/state/files.service'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { SelectComponent } from '../../select/select.component'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; @Component({ selector: 'app-descriptors-container', templateUrl: './descriptors.component.html', styleUrls: ['./descriptors.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyProgressBarModule, + SelectComponent, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class DescriptorsComponent extends EntryFileSelector implements OnChanges { @Input() id: number; diff --git a/src/app/container/dockerfile/dockerfile.component.spec.ts b/src/app/container/dockerfile/dockerfile.component.spec.ts index ca349ba7fd..1850b201e6 100644 --- a/src/app/container/dockerfile/dockerfile.component.spec.ts +++ b/src/app/container/dockerfile/dockerfile.component.spec.ts @@ -29,7 +29,7 @@ describe('DockerfileComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DockerfileComponent], + imports: [DockerfileComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: FileService, useClass: FileStubService }, diff --git a/src/app/container/dockerfile/dockerfile.component.ts b/src/app/container/dockerfile/dockerfile.component.ts index e0b74ce4db..ac2b7ef77c 100644 --- a/src/app/container/dockerfile/dockerfile.component.ts +++ b/src/app/container/dockerfile/dockerfile.component.ts @@ -21,11 +21,30 @@ import { FileService } from '../../shared/file.service'; import { ContainersService } from '../../shared/openapi'; import { Tag } from '../../shared/openapi/model/tag'; import { ToolQuery } from '../../shared/tool/tool.query'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-dockerfile', templateUrl: './dockerfile.component.html', styleUrls: ['./dockerfile.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyProgressBarModule, + MatToolbarModule, + MatLegacyButtonModule, + ClipboardModule, + CodeEditorComponent, + ], }) export class DockerfileComponent { @Input() id: number; diff --git a/src/app/container/files/files.component.ts b/src/app/container/files/files.component.ts index 6b6120a02d..794bc560dc 100644 --- a/src/app/container/files/files.component.ts +++ b/src/app/container/files/files.component.ts @@ -19,10 +19,19 @@ import { Files } from '../../shared/files'; import { GA4GHFilesService } from '../../shared/ga4gh-files/ga4gh-files.service'; import { SourceFile } from '../../shared/openapi'; import { Tag } from '../../shared/openapi/model/tag'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; +import { ParamfilesComponent } from '../paramfiles/paramfiles.component'; +import { DescriptorsComponent } from '../descriptors/descriptors.component'; +import { DockerfileComponent } from '../dockerfile/dockerfile.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; @Component({ selector: 'app-files-container', templateUrl: './files.component.html', + standalone: true, + imports: [MatLegacyTabsModule, DockerfileComponent, DescriptorsComponent, ParamfilesComponent, NgIf, MatLegacyCardModule, MatIconModule], }) export class FilesContainerComponent extends Files implements OnChanges { @Input() selectedVersion: Tag; diff --git a/src/app/container/info-tab/info-tab.component.ts b/src/app/container/info-tab/info-tab.component.ts index a8589b933c..9b05ecbcbd 100644 --- a/src/app/container/info-tab/info-tab.component.ts +++ b/src/app/container/info-tab/info-tab.component.ts @@ -27,13 +27,57 @@ import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool'; import { Tag } from '../../shared/openapi/model/tag'; import { exampleDescriptorPatterns, validationDescriptorPatterns } from '../../shared/validationMessages.model'; import { InfoTabService } from './info-tab.service'; +import { BaseUrlPipe } from '../../shared/entry/base-url.pipe'; +import { MapFriendlyValuesPipe } from '../../search/map-friendly-values.pipe'; +import { UrlDeconstructPipe } from '../../shared/entry/url-deconstruct.pipe'; +import { VersionProviderUrlPipe } from '../../shared/entry/versionProviderUrl.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { InfoTabCheckerWorkflowPathComponent } from '../../shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { FormsModule } from '@angular/forms'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgClass } from '@angular/common'; import DescriptorTypeEnum = ToolVersion.DescriptorTypeEnum; @Component({ - selector: 'app-info-tab', + selector: 'app-info-tab-container', templateUrl: './info-tab.component.html', styleUrls: ['./info-tab.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatDividerModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + FormsModule, + FlexModule, + AiBubbleComponent, + MatLegacyRadioModule, + InfoTabCheckerWorkflowPathComponent, + MatLegacyTableModule, + ExtendedModule, + NgClass, + MarkdownWrapperComponent, + VersionProviderUrlPipe, + UrlDeconstructPipe, + MapFriendlyValuesPipe, + BaseUrlPipe, + ], }) export class InfoTabComponent extends Base implements OnInit, OnChanges { currentVersion: Tag; diff --git a/src/app/container/launch/launch.component.ts b/src/app/container/launch/launch.component.ts index 6850039f52..defcf94510 100644 --- a/src/app/container/launch/launch.component.ts +++ b/src/app/container/launch/launch.component.ts @@ -24,12 +24,35 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { DescriptorLanguageService } from './../../shared/entry/descriptor-language.service'; import { Tag } from './../../shared/openapi/model/tag'; import { ToolLaunchService } from './tool-launch.service'; +import { LaunchCheckerWorkflowComponent } from '../../shared/entry/launch-checker-workflow/launch-checker-workflow.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; import DescriptorTypeEnum = Workflow.DescriptorTypeEnum; @Component({ - selector: 'app-launch', + selector: 'app-container-launch', templateUrl: './launch.component.html', styleUrls: ['./launch.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + FlexModule, + MatLegacyTooltipModule, + LaunchCheckerWorkflowComponent, + AsyncPipe, + ], }) export class LaunchComponent extends Base implements OnInit, OnChanges { @Input() basePath: string; diff --git a/src/app/container/paramfiles/paramfiles.component.ts b/src/app/container/paramfiles/paramfiles.component.ts index d491cc34b5..781e159481 100644 --- a/src/app/container/paramfiles/paramfiles.component.ts +++ b/src/app/container/paramfiles/paramfiles.component.ts @@ -26,11 +26,39 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { FilesQuery } from '../../workflow/files/state/files.query'; import { FilesService } from '../../workflow/files/state/files.service'; import { ParamfilesService } from './paramfiles.service'; +import { CodeEditorComponent } from '../../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { SelectComponent } from '../../select/select.component'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; @Component({ selector: 'app-paramfiles-container', templateUrl: './paramfiles.component.html', styleUrls: ['./paramfiles.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyProgressBarModule, + SelectComponent, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class ParamfilesComponent extends EntryFileSelector implements OnChanges { @Input() id: number; diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts index 537c1e57f5..ddf9207660 100644 --- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts +++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.spec.ts @@ -41,8 +41,7 @@ describe('RefreshToolOrganizationComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RefreshToolOrganizationComponent], - imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule], + imports: [MatSnackBarModule, MatIconModule, MatButtonModule, MatTooltipModule, RefreshToolOrganizationComponent], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: RefreshService, useClass: RefreshStubService }, diff --git a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts index 7fe32a8463..a1d0ff60be 100644 --- a/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts +++ b/src/app/container/refresh-tool-organization/refresh-tool-organization.component.ts @@ -25,12 +25,16 @@ import { AlertService } from '../../shared/alert/state/alert.service'; import { RefreshOrganizationComponent } from '../../shared/refresh-organization/refresh-organization.component'; import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool'; import { UserQuery } from '../../shared/user/user.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-refresh-tool-organization', // Note that the template and style is actually from the shared one (used by both my-workflows and my-tools) templateUrl: './../../shared/refresh-organization/refresh-organization.component.html', styleUrls: ['./../../shared/refresh-organization/refresh-organization.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, AsyncPipe], }) export class RefreshToolOrganizationComponent extends RefreshOrganizationComponent implements OnInit { @Input() protected orgToolObject: OrgToolObject; diff --git a/src/app/container/refresh-wizard.module.ts b/src/app/container/refresh-wizard.module.ts deleted file mode 100644 index 68176282e8..0000000000 --- a/src/app/container/refresh-wizard.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; - -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RefreshWizardComponent } from './refresh-wizard/refresh-wizard.component'; - -@NgModule({ - imports: [CommonModule, RefreshAlertModule, CustomMaterialModule, FlexLayoutModule], - declarations: [RefreshWizardComponent], - exports: [RefreshWizardComponent], -}) -export class RefreshWizardModule {} diff --git a/src/app/container/refresh-wizard/refresh-wizard.component.ts b/src/app/container/refresh-wizard/refresh-wizard.component.ts index 89083d0b96..235e683bea 100644 --- a/src/app/container/refresh-wizard/refresh-wizard.component.ts +++ b/src/app/container/refresh-wizard/refresh-wizard.component.ts @@ -6,12 +6,41 @@ import { Observable } from 'rxjs'; import { RefreshWizardQuery } from '../state/refresh-wizard.query'; import { RefreshWizardService } from '../state/refresh-wizard.service'; import { RefreshWizardStore } from '../state/refresh-wizard.store'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatStepperModule } from '@angular/material/stepper'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; @Component({ selector: 'app-refresh-wizard', templateUrl: './refresh-wizard.component.html', styleUrls: ['./refresh-wizard.component.scss'], providers: [RefreshWizardQuery, RefreshWizardStore, RefreshWizardService], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FlexModule, + MatStepperModule, + MatLegacyDialogModule, + AsyncPipe, + ], }) export class RefreshWizardComponent implements OnInit { loading$: Observable; diff --git a/src/app/container/register-tool/register-tool.component.ts b/src/app/container/register-tool/register-tool.component.ts index ffbe19dea2..21e3df1988 100644 --- a/src/app/container/register-tool/register-tool.component.ts +++ b/src/app/container/register-tool/register-tool.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; +import { NgForm, FormsModule } from '@angular/forms'; import { SessionQuery } from 'app/shared/session/session.query'; import { Observable, Subject } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; @@ -25,6 +25,23 @@ import { formErrors, validationDescriptorPatterns, validationMessages } from '.. import { RegisterToolService } from './register-tool.service'; import { Dockstore } from '../../shared/dockstore.model'; import { EntryType } from 'app/shared/openapi'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { RegisterGithubAppComponent } from '../../shared/register-github-app/register-github-app.component'; +import { RefreshWizardComponent } from '../refresh-wizard/refresh-wizard.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { MatIconModule } from '@angular/material/icon'; +import { MatStepperModule } from '@angular/material/stepper'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { AlertComponent } from '../../shared/alert/alert.component'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; interface HostedTool { path: string; @@ -44,6 +61,29 @@ enum OptionChoice { selector: 'app-register-tool', templateUrl: './register-tool.component.html', styleUrls: ['./register-tool.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + NgIf, + MatLegacyProgressBarModule, + MatStepperModule, + MatIconModule, + MatLegacyRadioModule, + FormsModule, + NgFor, + MatLegacyButtonModule, + RefreshWizardComponent, + RegisterGithubAppComponent, + FlexModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + MatLegacyInputModule, + MatLegacyTooltipModule, + MatLegacyCheckboxModule, + AsyncPipe, + ], }) export class RegisterToolComponent implements OnInit, AfterViewChecked, OnDestroy { public EntryType = EntryType; diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts index 28c47c27e9..33bb8c9835 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts @@ -35,7 +35,6 @@ describe('ToolFileEditorComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ToolFileEditorComponent, CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe], imports: [ MatButtonModule, MatTabsModule, @@ -51,6 +50,11 @@ describe('ToolFileEditorComponent', () => { ClipboardModule, HttpClientModule, HttpClientTestingModule, + ToolFileEditorComponent, + CodeEditorListComponent, + CodeEditorComponent, + PublicFileDownloadPipe, + PrivateFilePathPipe, ], providers: [ { provide: HostedService, useClass: HostedStubService }, diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.ts b/src/app/container/tool-file-editor/tool-file-editor.component.ts index 8e91564b93..cb4c6a5bd3 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.ts @@ -20,11 +20,28 @@ import { ContainertagsService, SourceFile, DockstoreTool, ToolDescriptor, EntryT import { ContainerService } from './../../shared/container.service'; import { HostedService } from './../../shared/openapi/api/hosted.service'; import { Tag } from './../../shared/openapi/model/tag'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { CodeEditorListComponent } from '../../shared/code-editor-list/code-editor-list.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; @Component({ selector: 'app-tool-file-editor', templateUrl: './tool-file-editor.component.html', styleUrls: ['./tool-file-editor.component.scss'], + standalone: true, + imports: [ + MatLegacyTabsModule, + CodeEditorListComponent, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + NgIf, + MatLegacyButtonModule, + ], }) export class ToolFileEditorComponent extends FileEditing { public EntryType = EntryType; diff --git a/src/app/container/version-modal/version-modal.component.spec.ts b/src/app/container/version-modal/version-modal.component.spec.ts index d7ef74855b..695fe34ffc 100644 --- a/src/app/container/version-modal/version-modal.component.spec.ts +++ b/src/app/container/version-modal/version-modal.component.spec.ts @@ -32,8 +32,7 @@ describe('VersionModalComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ schemas: [NO_ERRORS_SCHEMA], - declarations: [VersionModalComponent], - imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule], + imports: [FormsModule, ClipboardModule, MatSnackBarModule, MatDialogModule, VersionModalComponent], providers: [ { provide: ParamfilesService, useClass: ParamFilesStubService }, { provide: VersionModalService, useClass: VersionModalStubService }, diff --git a/src/app/container/version-modal/version-modal.component.ts b/src/app/container/version-modal/version-modal.component.ts index 5475ee1a3d..d0c517597e 100644 --- a/src/app/container/version-modal/version-modal.component.ts +++ b/src/app/container/version-modal/version-modal.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { Base } from 'app/shared/base'; import { forkJoin } from 'rxjs'; import { debounceTime, finalize, takeUntil } from 'rxjs/operators'; @@ -35,11 +35,36 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../shared/validationMessages.model'; import { ParamfilesService } from '../paramfiles/paramfiles.service'; import { VersionModalService } from './version-modal.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, NgClass } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { AlertComponent } from '../../shared/alert/alert.component'; @Component({ selector: 'app-version-modal', templateUrl: './version-modal.component.html', styleUrls: ['./version-modal.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + LoadingComponent, + NgIf, + FormsModule, + NgFor, + NgClass, + ExtendedModule, + MatIconModule, + MatLegacyCardModule, + SnackbarDirective, + ClipboardModule, + MatLegacyButtonModule, + ], }) export class VersionModalComponent extends Base implements OnInit, AfterViewChecked, OnDestroy { public TagEditorMode = TagEditorMode; diff --git a/src/app/container/versions/versions.component.ts b/src/app/container/versions/versions.component.ts index 512082023b..1fb4abf7a9 100644 --- a/src/app/container/versions/versions.component.ts +++ b/src/app/container/versions/versions.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { faCodeBranch, faTag } from '@fortawesome/free-solid-svg-icons'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -28,11 +28,40 @@ import { VersionVerifiedPlatform, Tag } from '../../shared/openapi'; import { SessionQuery } from '../../shared/session/session.query'; import { DockstoreTool } from '../../shared/openapi/model/dockstoreTool'; import { Versions } from '../../shared/versions'; +import { DescriptorLanguageVersionsPipe } from '../../shared/entry/descriptor-language-versions.pipe'; +import { VerifiedPlatformsPipe } from '../../shared/entry/verified-platforms.pipe'; +import { CommitUrlPipe } from '../../shared/entry/commit-url.pipe'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { ViewContainerComponent } from '../view/view.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { NgIf, NgClass, DatePipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; @Component({ selector: 'app-versions-container', templateUrl: './versions.component.html', styleUrls: ['./../../workflow/versions/versions.component.scss'], + standalone: true, + imports: [ + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + NgIf, + MatIconModule, + FlexModule, + MatLegacyChipsModule, + FontAwesomeModule, + ViewContainerComponent, + NgClass, + ExtendedModule, + DatePipe, + CommitUrlPipe, + VerifiedPlatformsPipe, + DescriptorLanguageVersionsPipe, + ], }) export class VersionsContainerComponent extends Versions implements OnInit, OnChanges, AfterViewInit { faTag = faTag; diff --git a/src/app/container/view/view.component.ts b/src/app/container/view/view.component.ts index 2c86a41b49..7eb1a03749 100644 --- a/src/app/container/view/view.component.ts +++ b/src/app/container/view/view.component.ts @@ -33,11 +33,16 @@ import { ToolQuery } from '../../shared/tool/tool.query'; import { View } from '../../shared/view'; import { VersionModalComponent } from '../version-modal/version-modal.component'; import { VersionModalService } from '../version-modal/version-modal.service'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-view-container', templateUrl: './view.component.html', styleUrls: ['./view.component.css'], + standalone: true, + imports: [NgIf, MatLegacyButtonModule, MatLegacyMenuModule, AsyncPipe], }) // This is actually the actions dropdown for tags export class ViewContainerComponent extends View implements OnInit { diff --git a/src/app/containers/containers.component.ts b/src/app/containers/containers.component.ts index be2728f8c8..90f58478ff 100644 --- a/src/app/containers/containers.component.ts +++ b/src/app/containers/containers.component.ts @@ -15,15 +15,21 @@ */ import { Component } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterLink, RouterOutlet } from '@angular/router'; import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { Observable } from 'rxjs'; import { UrlResolverService } from '../shared/url-resolver.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-containers', templateUrl: './containers.component.html', + standalone: true, + imports: [HeaderComponent, NgIf, FlexModule, RouterLink, ExtendedModule, RouterOutlet, AsyncPipe, TitleCasePipe], }) export class ContainersComponent { public entryName: string = ''; diff --git a/src/app/containers/containers.module.ts b/src/app/containers/containers.module.ts deleted file mode 100644 index f15885f252..0000000000 --- a/src/app/containers/containers.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MarkdownModule } from 'ngx-markdown'; - -import { ContainerModule } from '../shared/modules/container.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { ListContainersModule } from '../shared/modules/list-containers.module'; -import { SelectModule } from '../shared/modules/select.module'; -import { ContainersComponent } from './containers.component'; -import { containersRouting } from './containers.routing'; -import { SearchContainersComponent } from './search/search.component'; - -@NgModule({ - declarations: [ContainersComponent, SearchContainersComponent], - imports: [CommonModule, HeaderModule, SelectModule, ListContainersModule, ContainerModule, containersRouting, MarkdownModule], -}) -export class ContainersModule {} diff --git a/src/app/containers/containers.routing.ts b/src/app/containers/containers.routing.ts index 83b2078ac6..796689d95a 100644 --- a/src/app/containers/containers.routing.ts +++ b/src/app/containers/containers.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { ContainerComponent } from '../container/container.component'; import { ContainersComponent } from './containers.component'; @@ -32,4 +32,4 @@ const CONTAINERS_ROUTES: Routes = [ }, ]; -export const containersRouting = RouterModule.forChild(CONTAINERS_ROUTES); +export const containersRouting = CONTAINERS_ROUTES; diff --git a/src/app/containers/list/list.component.ts b/src/app/containers/list/list.component.ts index 2d2ea2beb6..f8342c4b9f 100644 --- a/src/app/containers/list/list.component.ts +++ b/src/app/containers/list/list.component.ts @@ -25,11 +25,45 @@ import { PaginatorService } from '../../shared/state/paginator.service'; import { ContainersService, DockstoreTool } from '../../shared/openapi'; import { ToolLister } from '../../shared/tool-lister'; import { PublishedToolsDataSource } from './published-tools.datasource'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterLink } from '@angular/router'; +import { PrivateIconComponent } from '../../shared/private-icon/private-icon.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, AsyncPipe, UpperCasePipe } from '@angular/common'; @Component({ selector: 'app-list-containers', templateUrl: './list.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + ExtendedModule, + PrivateIconComponent, + RouterLink, + MatIconModule, + MatLegacyTooltipModule, + NgFor, + FontAwesomeModule, + MatLegacyButtonModule, + MatLegacyPaginatorModule, + AsyncPipe, + UpperCasePipe, + ], }) export class ListContainersComponent extends ToolLister implements OnInit { @Input() previewMode: boolean; diff --git a/src/app/containers/search/search.component.ts b/src/app/containers/search/search.component.ts index 9df41d1c18..9b14f51e2b 100644 --- a/src/app/containers/search/search.component.ts +++ b/src/app/containers/search/search.component.ts @@ -15,10 +15,13 @@ */ import { Component } from '@angular/core'; +import { ListContainersComponent } from '../list/list.component'; @Component({ selector: 'app-search-containers', templateUrl: './search.component.html', styleUrls: ['./search.component.css'], + standalone: true, + imports: [ListContainersComponent], }) export class SearchContainersComponent {} diff --git a/src/app/docs/docs.component.spec.ts b/src/app/docs/docs.component.spec.ts index 97e7aab838..29f827ffb5 100644 --- a/src/app/docs/docs.component.spec.ts +++ b/src/app/docs/docs.component.spec.ts @@ -15,7 +15,7 @@ */ import { TestBed, waitForAsync } from '@angular/core/testing'; -import { HeaderModule } from './../shared/modules/header.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterLinkStubDirective, RouterOutletStubComponent } from './../test/router-stubs'; import { DocsComponent } from './docs.component'; @@ -30,8 +30,8 @@ describe('DocsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DocsComponent, RouterLinkStubDirective, RouterOutletStubComponent], - imports: [HeaderModule], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], + imports: [DocsComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); diff --git a/src/app/docs/docs.component.ts b/src/app/docs/docs.component.ts index 2a1d956085..4972692973 100644 --- a/src/app/docs/docs.component.ts +++ b/src/app/docs/docs.component.ts @@ -16,6 +16,7 @@ import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { HeaderComponent } from '../header/header.component'; interface DocObject { existingPath: string; @@ -25,6 +26,8 @@ interface DocObject { @Component({ selector: 'app-docs', templateUrl: './docs.component.html', + standalone: true, + imports: [HeaderComponent], }) export class DocsComponent implements OnInit { // Array of doc objects, where existingPath is the path on Dockstore, and newPath is the new path on the docs page diff --git a/src/app/docs/docs.module.ts b/src/app/docs/docs.module.ts index 8ed8b6cc10..a8008aafa4 100644 --- a/src/app/docs/docs.module.ts +++ b/src/app/docs/docs.module.ts @@ -22,8 +22,7 @@ import { docsRouting } from './docs.routing'; import { DocsComponent } from './docs.component'; @NgModule({ - declarations: [DocsComponent], - imports: [CommonModule, docsRouting, HeaderModule], + imports: [CommonModule, docsRouting, HeaderModule, DocsComponent], providers: [], }) export class DocsModule {} diff --git a/src/app/docs/docs.routing.ts b/src/app/docs/docs.routing.ts index 7bedf18653..996783caef 100644 --- a/src/app/docs/docs.routing.ts +++ b/src/app/docs/docs.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { DocsComponent } from './docs.component'; @@ -25,4 +25,4 @@ const DOC_ROUTES: Routes = [ }, ]; -export const docsRouting = RouterModule.forChild(DOC_ROUTES); +export const docsRouting = DOC_ROUTES; diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts index 8254148c12..a88ab4c7c8 100644 --- a/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts +++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { EntriesService } from '../../../shared/openapi'; import { EntriesStubService } from '../../../test/service-stubs'; import { ArchiveEntryDialogComponent } from './archive-entry-dialog.component'; @@ -14,9 +14,8 @@ describe('ArchiveEntryDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ArchiveEntryDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule], + imports: [ArchiveEntryDialogComponent, MatLegacySnackBarModule], providers: [ { provide: EntriesService, useClass: EntriesStubService }, { diff --git a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts index fe733b0ab9..a8bdcbbefd 100644 --- a/src/app/entry/archive/dialog/archive-entry-dialog.component.ts +++ b/src/app/entry/archive/dialog/archive-entry-dialog.component.ts @@ -15,16 +15,26 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Entry, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi'; import { AlertService } from '../../../shared/alert/state/alert.service'; +import { TitleCasePipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-archive-entry-dialog', templateUrl: './archive-entry-dialog.component.html', styleUrls: ['./archive-entry-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class ArchiveEntryDialogComponent { clicked: boolean; diff --git a/src/app/entry/current-collections.module.ts b/src/app/entry/current-collections.module.ts index 8e5ab12768..ae2b370e88 100644 --- a/src/app/entry/current-collections.module.ts +++ b/src/app/entry/current-collections.module.ts @@ -2,14 +2,12 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { RouterModule } from '@angular/router'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; + import { PipeModule } from '../shared/pipe/pipe.module'; import { CurrentCollectionsComponent } from './current-collections/current-collections.component'; @NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RouterModule, ImgFallbackModule, PipeModule], - declarations: [CurrentCollectionsComponent], + imports: [CommonModule, FlexLayoutModule, RouterModule, PipeModule, CurrentCollectionsComponent], exports: [CurrentCollectionsComponent], }) export class CurrentCollectionsModule {} diff --git a/src/app/entry/current-collections/current-collections.component.ts b/src/app/entry/current-collections/current-collections.component.ts index 570d5a5439..bacd085e38 100644 --- a/src/app/entry/current-collections/current-collections.component.ts +++ b/src/app/entry/current-collections/current-collections.component.ts @@ -8,11 +8,38 @@ import { TrackLoginService } from '../../shared/track-login.service'; import { CurrentCollectionsQuery } from '../state/current-collections.query'; import { CurrentCollectionsService } from '../state/current-collections.service'; import { OrgLogoService } from '../../shared/org-logo.service'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { RouterLinkActive, RouterLink } from '@angular/router'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatDividerModule } from '@angular/material/divider'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgTemplateOutlet, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-current-collections', templateUrl: './current-collections.component.html', styleUrls: ['./current-collections.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + ExtendedModule, + MatDividerModule, + NgFor, + ImgFallbackDirective, + NgTemplateOutlet, + RouterLinkActive, + RouterLink, + AsyncPipe, + GravatarPipe, + ], }) export class CurrentCollectionsComponent implements OnInit, OnChanges { @Input() id: number; diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts index c5fe3bf12a..e4345731ae 100644 --- a/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts +++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.spec.ts @@ -2,7 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { EntriesService } from '../../../shared/openapi'; import { EntriesStubService } from '../../../test/service-stubs'; import { DeleteEntryDialogComponent } from './delete-entry-dialog.component'; @@ -14,9 +14,8 @@ describe('DeleteEntryDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DeleteEntryDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule], + imports: [DeleteEntryDialogComponent, MatLegacySnackBarModule], providers: [ { provide: EntriesService, useClass: EntriesStubService }, { diff --git a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts index 1e67b51003..4ffa06bcb9 100644 --- a/src/app/entry/delete/dialog/delete-entry-dialog.component.ts +++ b/src/app/entry/delete/dialog/delete-entry-dialog.component.ts @@ -15,16 +15,26 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Entry, EntryType, EntriesService, DockstoreTool, Workflow } from '../../../shared/openapi'; import { AlertService } from '../../../shared/alert/state/alert.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, TitleCasePipe } from '@angular/common'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-delete-entry-dialog', templateUrl: './delete-entry-dialog.component.html', styleUrls: ['./delete-entry-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, NgIf, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class DeleteEntryDialogComponent { clicked: boolean; diff --git a/src/app/entry/file-path.pipe.ts b/src/app/entry/file-path.pipe.ts index 5877d90f1a..961c086bd5 100644 --- a/src/app/entry/file-path.pipe.ts +++ b/src/app/entry/file-path.pipe.ts @@ -3,7 +3,10 @@ import { Pipe, PipeTransform } from '@angular/core'; * File paths are show relative to the primary descriptor, but the .dockstore.yml file can only ever be in one place * so only display it as /.dockstore.yml */ -@Pipe({ name: 'filePathPipe' }) +@Pipe({ + name: 'filePathPipe', + standalone: true, +}) export class FilePathPipe implements PipeTransform { transform(filePath: string): string { if (filePath.endsWith('.dockstore.yml')) { diff --git a/src/app/entry/router-link.pipe.ts b/src/app/entry/router-link.pipe.ts index e5bcf68345..a12f2bc261 100644 --- a/src/app/entry/router-link.pipe.ts +++ b/src/app/entry/router-link.pipe.ts @@ -4,6 +4,7 @@ import { EntryTypeMetadataService } from './type-metadata/entry-type-metadata.se @Pipe({ name: 'routerLink', + standalone: true, }) export class RouterLinkPipe implements PipeTransform { constructor(private entryTypeMetadataService: EntryTypeMetadataService) {} diff --git a/src/app/file-tree/file-tree.component.spec.ts b/src/app/file-tree/file-tree.component.spec.ts index 6022109adb..8a2a128887 100644 --- a/src/app/file-tree/file-tree.component.spec.ts +++ b/src/app/file-tree/file-tree.component.spec.ts @@ -25,7 +25,6 @@ describe('FileTreeComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FileTreeComponent], imports: [ MatButtonModule, MatIconModule, @@ -34,6 +33,7 @@ describe('FileTreeComponent', () => { HttpClientTestingModule, MatLegacyInputModule, BrowserAnimationsModule, + FileTreeComponent, ], providers: [ { provide: MatDialogRef, useValue: {} }, diff --git a/src/app/file-tree/file-tree.component.ts b/src/app/file-tree/file-tree.component.ts index b50afcebad..0f5d8e8f00 100644 --- a/src/app/file-tree/file-tree.component.ts +++ b/src/app/file-tree/file-tree.component.ts @@ -1,8 +1,17 @@ import { Component, Inject } from '@angular/core'; -import { MatTreeFlatDataSource, MatTreeFlattener } from '@angular/material/tree'; +import { MatTreeFlatDataSource, MatTreeFlattener, MatTreeModule } from '@angular/material/tree'; import { FlatTreeControl } from '@angular/cdk/tree'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { EntryType, SourceFile, ToolDescriptor } from 'app/shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; /** File node data with possible child nodes. */ export interface FileNode { @@ -34,6 +43,16 @@ export interface FlatTreeNode { @Component({ selector: 'app-file-tree', templateUrl: './file-tree.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatTreeModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + ], }) export class FileTreeComponent { /** The TreeControl controls the expand/collapse state of tree nodes. */ diff --git a/src/app/footer/footer.component.spec.ts b/src/app/footer/footer.component.spec.ts index 0029af27b1..162aaad1b6 100644 --- a/src/app/footer/footer.component.spec.ts +++ b/src/app/footer/footer.component.spec.ts @@ -33,8 +33,7 @@ describe('FooterComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [FooterComponent, GitTagPipe], - imports: [RouterTestingModule, MatIconModule, MatSnackBarModule, ClipboardModule], + imports: [RouterTestingModule, MatIconModule, MatSnackBarModule, ClipboardModule, FooterComponent, GitTagPipe], providers: [ServiceInfoService, { provide: GA4GHV20Service, useClass: GA4GHV20StubService }], }).compileComponents(); }) diff --git a/src/app/footer/footer.component.ts b/src/app/footer/footer.component.ts index 1eb0861d91..3c9f35db27 100644 --- a/src/app/footer/footer.component.ts +++ b/src/app/footer/footer.component.ts @@ -24,11 +24,21 @@ import { Dockstore } from './../shared/dockstore.model'; import { TRSService } from 'app/shared/openapi'; import { FooterService } from './footer.service'; import { versions } from './versions'; +import { GitTagPipe } from './git-tag.pipe'; +import { NgFor } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-footer', templateUrl: './footer.component.html', styleUrls: ['./footer.component.scss'], + standalone: true, + imports: [FlexModule, RouterLink, MatLegacyButtonModule, SnackbarDirective, ClipboardModule, MatIconModule, NgFor, GitTagPipe], }) export class FooterComponent extends Base implements OnInit { domain: string; diff --git a/src/app/footer/git-tag.pipe.ts b/src/app/footer/git-tag.pipe.ts index d0e071d9fa..cd01d06309 100644 --- a/src/app/footer/git-tag.pipe.ts +++ b/src/app/footer/git-tag.pipe.ts @@ -10,6 +10,7 @@ import { Pipe, PipeTransform } from '@angular/core'; */ @Pipe({ name: 'gitTag', + standalone: true, }) export class GitTagPipe implements PipeTransform { /** diff --git a/src/app/funding/funding.component.spec.ts b/src/app/funding/funding.component.spec.ts index 1b70b9e7b3..e2e2d8a609 100644 --- a/src/app/funding/funding.component.spec.ts +++ b/src/app/funding/funding.component.spec.ts @@ -2,8 +2,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatDividerModule } from '@angular/material/divider'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; -import { HeaderComponent } from '../header/header.component'; -import { HeaderModule } from '../shared/modules/header.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { FundingComponent } from './funding.component'; @@ -14,8 +13,7 @@ describe('FundingComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [HeaderModule, MatDividerModule, MatLegacyCardModule], - declarations: [FundingComponent], + imports: [MatDividerModule, MatLegacyCardModule, FundingComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); diff --git a/src/app/funding/funding.component.ts b/src/app/funding/funding.component.ts index 277b19463e..e71abe64ee 100644 --- a/src/app/funding/funding.component.ts +++ b/src/app/funding/funding.component.ts @@ -1,4 +1,10 @@ import { Component, Injectable } from '@angular/core'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatDividerModule } from '@angular/material/divider'; +import { NgFor } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; export interface Funder { title: string; @@ -17,6 +23,8 @@ export interface FundingSections { selector: 'app-funding', templateUrl: './funding.component.html', styleUrls: ['./funding.component.scss'], + standalone: true, + imports: [HeaderComponent, NgFor, MatDividerModule, FlexModule, MatLegacyCardModule, MatLegacyButtonModule], }) @Injectable() export class FundingComponent { diff --git a/src/app/github-callback/github-callback.component.ts b/src/app/github-callback/github-callback.component.ts index 5363f4ed61..61280dcaef 100644 --- a/src/app/github-callback/github-callback.component.ts +++ b/src/app/github-callback/github-callback.component.ts @@ -4,11 +4,15 @@ import { Base } from 'app/shared/base'; import { ActivatedRoute } from 'app/test'; import { takeUntil } from 'rxjs/operators'; import { GithubCallbackService } from './github-callback.service'; +import { MatLegacyProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-github-callback', templateUrl: './github-callback.component.html', styleUrls: ['./github-callback.component.scss'], + standalone: true, + imports: [FlexModule, MatLegacyProgressSpinnerModule], }) export class GithubCallbackComponent extends Base implements OnInit { constructor(private activatedRoute: ActivatedRoute, private router: GithubCallbackService) { diff --git a/src/app/github-landing-page/github-landing-page.component.ts b/src/app/github-landing-page/github-landing-page.component.ts index bf1fdc26e2..8fc67d8d13 100644 --- a/src/app/github-landing-page/github-landing-page.component.ts +++ b/src/app/github-landing-page/github-landing-page.component.ts @@ -1,15 +1,21 @@ import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; -import { ActivatedRoute, Params } from '@angular/router'; +import { ActivatedRoute, Params, RouterLink } from '@angular/router'; import { takeUntil } from 'rxjs/operators'; import { Base } from 'app/shared/base'; import { EntryType, EntryTypeMetadata } from 'app/shared/openapi'; import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { CodeEditorComponent } from '../shared/code-editor/code-editor.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-github-landing-page', templateUrl: './github-landing-page.component.html', styleUrls: ['./github-landing-page.component.scss'], + standalone: true, + imports: [FlexModule, MatLegacyCardModule, MatDividerModule, CodeEditorComponent, RouterLink], }) export class GithubLandingPageComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/gravatar/gravatar.pipe.ts b/src/app/gravatar/gravatar.pipe.ts index b83e0de990..d7d3767725 100644 --- a/src/app/gravatar/gravatar.pipe.ts +++ b/src/app/gravatar/gravatar.pipe.ts @@ -6,6 +6,7 @@ import { GravatarService } from './gravatar.service'; */ @Pipe({ name: 'gravatar', + standalone: true, }) export class GravatarPipe implements PipeTransform { constructor(private gravatarService: GravatarService) {} diff --git a/src/app/header/header.component.spec.ts b/src/app/header/header.component.spec.ts index 8e2eb454a6..8296ca1e2b 100644 --- a/src/app/header/header.component.spec.ts +++ b/src/app/header/header.component.spec.ts @@ -17,6 +17,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { HeaderComponent } from './header.component'; @@ -27,9 +28,8 @@ describe('HeaderComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], + imports: [RouterTestingModule, HeaderComponent, MatLegacySnackBarModule], schemas: [NO_ERRORS_SCHEMA], - declarations: [HeaderComponent], }).compileComponents(); }) ); diff --git a/src/app/header/header.component.ts b/src/app/header/header.component.ts index 68aaf80f64..204656b776 100644 --- a/src/app/header/header.component.ts +++ b/src/app/header/header.component.ts @@ -16,10 +16,13 @@ import { Component } from '@angular/core'; import { Router } from '@angular/router'; import { toExtendSite } from '../shared/helpers'; +import { AlertComponent } from '../shared/alert/alert.component'; @Component({ selector: 'app-header', templateUrl: './header.component.html', + standalone: true, + imports: [AlertComponent], }) export class HeaderComponent { isExtended = false; diff --git a/src/app/home-page/dashboard/dashboard.component.spec.ts b/src/app/home-page/dashboard/dashboard.component.spec.ts index b0eb387609..15560a9b2f 100644 --- a/src/app/home-page/dashboard/dashboard.component.spec.ts +++ b/src/app/home-page/dashboard/dashboard.component.spec.ts @@ -3,13 +3,22 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatIconModule } from '@angular/material/icon'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { DateService } from '../../shared/date.service'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; +import { OrgLogoService } from '../../shared/org-logo.service'; +import { ProviderService } from '../../shared/provider.service'; +import { MyEntriesStateService } from '../../shared/state/my-entries.service'; +import { MyEntriesStore } from '../../shared/state/my-entries.store'; +import { UrlResolverService } from '../../shared/url-resolver.service'; import { DashboardComponent } from './dashboard.component'; import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainerService } from '../../shared/container.service'; -import { ContainerStubService } from '../../test/service-stubs'; +import { ContainerStubService, DateStubService, OrgLogoStubService, UrlResolverStubService } from '../../test/service-stubs'; import { MastodonService } from '../../shared/mastodon/mastodon.service'; describe('DashboardComponent', () => { @@ -19,10 +28,30 @@ describe('DashboardComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DashboardComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule, MatButtonModule, MatIconModule, MatDialogModule, HttpClientTestingModule, MatSnackBarModule], - providers: [MastodonService, RegisterToolService, { provide: ContainerService, useClass: ContainerStubService }], + imports: [ + RouterTestingModule, + MatButtonModule, + MatIconModule, + MatDialogModule, + HttpClientTestingModule, + MatSnackBarModule, + DashboardComponent, + NoopAnimationsModule, + ], + providers: [ + MastodonService, + RegisterToolService, + MyWorkflowsService, + ProviderService, + { provide: DateService, useClass: DateStubService }, + { provide: ContainerService, useClass: ContainerStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: OrgLogoService, useClass: OrgLogoStubService }, + MyEntriesStateService, + MyEntriesStore, + ], }).compileComponents(); }) ); diff --git a/src/app/home-page/dashboard/dashboard.component.ts b/src/app/home-page/dashboard/dashboard.component.ts index 5939e33b65..669f79e0dd 100644 --- a/src/app/home-page/dashboard/dashboard.component.ts +++ b/src/app/home-page/dashboard/dashboard.component.ts @@ -8,11 +8,34 @@ import { AlertService } from 'app/shared/alert/state/alert.service'; import { Dockstore } from 'app/shared/dockstore.model'; import { bootstrap4largeModalSize } from '../../shared/constants'; import { EntryType } from '../../shared/openapi'; +import { FeaturedContentComponent } from '../widget/featured-content/featured-content.component'; +import { MastodonComponent } from '../../shared/mastodon/mastodon.component'; +import { NewsBoxComponent } from '../widget/news-box/news-box.component'; +import { StarredBoxComponent } from '../widget/starred-box/starred-box.component'; +import { OrganizationBoxComponent } from '../widget/organization-box/organization-box.component'; +import { EntryBoxComponent } from '../widget/entry-box/entry-box.component'; +import { NewsNotificationsComponent } from '../widget/news-updates/news-notifications.component'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-dashboard', templateUrl: './dashboard.component.html', styleUrls: ['./dashboard.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + NewsNotificationsComponent, + EntryBoxComponent, + OrganizationBoxComponent, + StarredBoxComponent, + NewsBoxComponent, + MastodonComponent, + FeaturedContentComponent, + ], }) export class DashboardComponent extends Base implements OnInit { public Dockstore = Dockstore; diff --git a/src/app/home-page/home-logged-out/home.component.spec.ts b/src/app/home-page/home-logged-out/home.component.spec.ts index b28ffc1f3a..4fd274f166 100644 --- a/src/app/home-page/home-logged-out/home.component.spec.ts +++ b/src/app/home-page/home-logged-out/home.component.spec.ts @@ -16,10 +16,11 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { HomeComponent } from './home.component'; import { MastodonService } from '../../shared/mastodon/mastodon.service'; @@ -30,9 +31,15 @@ describe('HomeComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [HomeComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule], + imports: [ + RouterTestingModule, + HttpClientTestingModule, + BrowserAnimationsModule, + HomeComponent, + MatLegacyDialogModule, + MatLegacySnackBarModule, + ], providers: [MastodonService, DescriptorLanguageService], }).compileComponents(); }) diff --git a/src/app/home-page/home-logged-out/home.component.ts b/src/app/home-page/home-logged-out/home.component.ts index 4e56f8bd01..7014bd506e 100644 --- a/src/app/home-page/home-logged-out/home.component.ts +++ b/src/app/home-page/home-logged-out/home.component.ts @@ -24,6 +24,23 @@ import { User } from '../../shared/openapi/model/user'; import { UserQuery } from '../../shared/user/user.query'; import { Category } from '../../shared/openapi'; import { AllCategoriesService } from '../../categories/state/all-categories.service'; +import { MastodonComponent } from '../../shared/mastodon/mastodon.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { NewsAndUpdatesComponent } from '../widget/featured-content/news-and-updates.component'; +import { FeaturedContentComponent } from '../widget/featured-content/featured-content.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { CategoryButtonComponent } from '../../categories/button/category-button.component'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { NgIf, NgFor, AsyncPipe, SlicePipe } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RouterLink } from '@angular/router'; +import { JsonLdComponent } from '../../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; /** * Simple youtube iframe component, too simple to have its own file @@ -33,6 +50,7 @@ import { AllCategoriesService } from '../../categories/state/all-categories.serv */ @Component({ template: '', + standalone: true, }) export class YoutubeComponent { constructor(public dialogRef: MatDialogRef) {} @@ -42,6 +60,29 @@ export class YoutubeComponent { selector: 'app-home', templateUrl: './home.component.html', styleUrls: ['./home.component.scss'], + standalone: true, + imports: [ + FlexModule, + JsonLdComponent, + RouterLink, + MatLegacyButtonModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + MatLegacyChipsModule, + NgFor, + CategoryButtonComponent, + MatLegacyTabsModule, + ExtendedModule, + FontAwesomeModule, + FeaturedContentComponent, + NewsAndUpdatesComponent, + MatDividerModule, + MastodonComponent, + AsyncPipe, + SlicePipe, + ], }) export class HomeComponent extends Base implements OnInit { faGithub = faGithub; diff --git a/src/app/home-page/home-page.module.ts b/src/app/home-page/home-page.module.ts deleted file mode 100644 index b197fc9ed0..0000000000 --- a/src/app/home-page/home-page.module.ts +++ /dev/null @@ -1,89 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { HomeComponent } from 'app/home-page/home-logged-out/home.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshWizardModule } from '../container/refresh-wizard.module'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CategoryButtonModule } from '../categories/button/category-button.module'; -import { JsonLdModule } from '../shared/modules/json-ld.module'; -import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module'; -import { RecentEventsModule } from './recent-events/recent-events.module'; -import { FeaturedContentComponent } from './widget/featured-content/featured-content.component'; -import { NewsAndUpdatesComponent } from './widget/featured-content/news-and-updates.component'; -import { GettingStartedComponent } from './widget/getting-started/getting-started.component'; -import { NewsNotificationsComponent } from './widget/news-updates/news-notifications.component'; -import { MySidebarModule } from '../shared/modules/my-sidebar.module'; -import { EntryBoxComponent } from './widget/entry-box/entry-box.component'; -import { MytoolsService } from 'app/mytools/mytools.service'; -import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service'; -import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; -import { MyEntriesStore } from 'app/shared/state/my-entries.store'; -import { MyEntriesQuery } from 'app/shared/state/my-entries.query'; -import { RegisterWorkflowModalService } from 'app/workflow/register-workflow-modal/register-workflow-modal.service'; -import { RegisterToolService } from 'app/container/register-tool/register-tool.service'; -import { RegisterToolComponent } from 'app/container/register-tool/register-tool.component'; -import { DashboardComponent } from './dashboard/dashboard.component'; -import { OrganizationBoxComponent } from './widget/organization-box/organization-box.component'; -import { StarredBoxComponent } from './widget/starred-box/starred-box.component'; -import { HeaderModule } from 'app/shared/modules/header.module'; -import { NewsBoxComponent } from './widget/news-box/news-box.component'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; -import { MastodonComponent } from '../shared/mastodon/mastodon.component'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; - -@NgModule({ - imports: [ - CommonModule, - CustomMaterialModule, - FlexLayoutModule, - RouterModule, - FormsModule, - HttpClientModule, - RefreshAlertModule, - MarkdownModule, - FontAwesomeModule, - MatAutocompleteModule, - CategoryButtonModule, - JsonLdModule, - MySidebarModule, - RecentEventsModule, - RefreshWizardModule, - HeaderModule, - MarkdownWrapperModule, - PreviewWarningModule, - RegisterGithubAppModule, - SharedWorkflowServicesNotebooksModule, - ], - declarations: [ - HomeComponent, - FeaturedContentComponent, - NewsAndUpdatesComponent, - NewsNotificationsComponent, - GettingStartedComponent, - EntryBoxComponent, - RegisterToolComponent, - DashboardComponent, - OrganizationBoxComponent, - StarredBoxComponent, - NewsBoxComponent, - MastodonComponent, - ], - providers: [ - MytoolsService, - MyWorkflowsService, - MyEntriesStateService, - MyEntriesStore, - MyEntriesQuery, - RegisterToolService, - RegisterWorkflowModalService, - ], -}) -export class HomePageModule {} diff --git a/src/app/home-page/recent-events/recent-events.component.ts b/src/app/home-page/recent-events/recent-events.component.ts index 87282280f0..dd6926b388 100644 --- a/src/app/home-page/recent-events/recent-events.component.ts +++ b/src/app/home-page/recent-events/recent-events.component.ts @@ -1,5 +1,5 @@ import { Component, Input, OnInit } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; +import { ActivatedRoute, RouterLink } from '@angular/router'; import { ID } from '@datorama/akita'; import { Dockstore } from 'app/shared/dockstore.model'; import { Event, User, UsersService, EventsService } from 'app/shared/openapi'; @@ -13,6 +13,14 @@ import { Base } from 'app/shared/base'; import { Observable } from 'rxjs'; import { OrgLogoService } from '../../shared/org-logo.service'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { RecentEventsPipe } from '../../shared/entry/recent-events.pipe'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, NgFor, NgSwitch, NgSwitchCase, AsyncPipe, LowerCasePipe, SlicePipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; /** * Shows recent events related to starred organization and entries or user organization events @@ -25,6 +33,25 @@ import { GravatarService } from '../../gravatar/gravatar.service'; selector: 'app-recent-events', templateUrl: './recent-events.component.html', styleUrls: ['../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + NgFor, + FlexModule, + RouterLink, + NgSwitch, + NgSwitchCase, + ImgFallbackDirective, + MatLegacyCardModule, + MatIconModule, + AsyncPipe, + LowerCasePipe, + SlicePipe, + DatePipe, + GravatarPipe, + RecentEventsPipe, + ], }) export class RecentEventsComponent extends Base implements OnInit { @Input() eventType: 'SELF_ORGANIZATIONS' | 'ALL_STARRED'; diff --git a/src/app/home-page/recent-events/recent-events.module.ts b/src/app/home-page/recent-events/recent-events.module.ts index e62002d93b..86068bdbfa 100644 --- a/src/app/home-page/recent-events/recent-events.module.ts +++ b/src/app/home-page/recent-events/recent-events.module.ts @@ -1,6 +1,6 @@ import { NgModule } from '@angular/core'; import { RecentEventsComponent } from './recent-events.component'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; + import { CommonModule } from '@angular/common'; import { EntryToDisplayNamePipe } from 'app/shared/entry-to-display-name.pipe'; import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; @@ -9,13 +9,10 @@ import { MatDividerModule } from '@angular/material/divider'; import { RouterModule } from '@angular/router'; import { MatIconModule } from '@angular/material/icon'; import { PipeModule } from '../../shared/pipe/pipe.module'; -import { ImgFallbackModule } from '../../shared/modules/img-fallback.module'; @NgModule({ - declarations: [RecentEventsComponent, EntryToDisplayNamePipe], providers: [], imports: [ - RefreshAlertModule, MatIconModule, CommonModule, MatCardModule, @@ -23,7 +20,8 @@ import { ImgFallbackModule } from '../../shared/modules/img-fallback.module'; MatDividerModule, RouterModule, PipeModule, - ImgFallbackModule, + RecentEventsComponent, + EntryToDisplayNamePipe, ], exports: [RecentEventsComponent], }) diff --git a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts index 90cd18c193..ec055574d6 100644 --- a/src/app/home-page/widget/entry-box/entry-box.component.spec.ts +++ b/src/app/home-page/widget/entry-box/entry-box.component.spec.ts @@ -34,7 +34,6 @@ describe('EntryBoxComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [EntryBoxComponent], schemas: [NO_ERRORS_SCHEMA], imports: [ MatAutocompleteModule, @@ -44,6 +43,7 @@ describe('EntryBoxComponent', () => { MatDialogModule, HttpClientTestingModule, MatSnackBarModule, + EntryBoxComponent, ], providers: [ { provide: RegisterToolService, useClass: RegisterToolStubService }, diff --git a/src/app/home-page/widget/entry-box/entry-box.component.ts b/src/app/home-page/widget/entry-box/entry-box.component.ts index 515a52262f..52b15cc460 100644 --- a/src/app/home-page/widget/entry-box/entry-box.component.ts +++ b/src/app/home-page/widget/entry-box/entry-box.component.ts @@ -25,12 +25,43 @@ import { Dockstore } from 'app/shared/dockstore.model'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { HttpResponse, HttpErrorResponse } from '@angular/common/http'; import { SessionService } from '../../../shared/session/session.service'; -import { Router } from '@angular/router'; +import { Router, RouterLink } from '@angular/router'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgFor, TitleCasePipe, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-entry-box', templateUrl: './entry-box.component.html', styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + FlexModule, + NgIf, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatDividerModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + MatLegacyAutocompleteModule, + MatIconModule, + NgFor, + MatLegacyOptionModule, + RouterLink, + TitleCasePipe, + DatePipe, + ], }) export class EntryBoxComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/featured-content/featured-content.component.ts b/src/app/home-page/widget/featured-content/featured-content.component.ts index 4a86ea10a6..0a975c6a14 100644 --- a/src/app/home-page/widget/featured-content/featured-content.component.ts +++ b/src/app/home-page/widget/featured-content/featured-content.component.ts @@ -6,6 +6,7 @@ import { Dockstore } from '../../../shared/dockstore.model'; @Component({ selector: 'app-featured-content', template: `
    `, + standalone: true, }) export class FeaturedContentComponent implements OnInit { public myExternalHTML = ''; diff --git a/src/app/home-page/widget/featured-content/news-and-updates.component.ts b/src/app/home-page/widget/featured-content/news-and-updates.component.ts index be7e107941..410704805b 100644 --- a/src/app/home-page/widget/featured-content/news-and-updates.component.ts +++ b/src/app/home-page/widget/featured-content/news-and-updates.component.ts @@ -7,6 +7,7 @@ import { Dockstore } from '../../../shared/dockstore.model'; selector: 'app-news-and-updates', template: ` `, styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, }) export class NewsAndUpdatesComponent { // TODO should parameterize FeaturedContentComponent or something diff --git a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts index b9f6348fbc..145f5de3e8 100644 --- a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts +++ b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts @@ -1,8 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MatIconModule } from '@angular/material/icon'; -import { RouterLinkStubDirective } from '../../../test'; + +import { MatLegacyButtonModule, MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { RouterTestingModule } from '@angular/router/testing'; +import { ActivatedRoute, ActivatedRouteStub, RouterLinkStubDirective } from '../../../test'; import { GettingStartedComponent } from './getting-started.component'; describe('GettingStartedComponent', () => { @@ -12,8 +13,8 @@ describe('GettingStartedComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [GettingStartedComponent, RouterLinkStubDirective], - imports: [MatIconModule, MatButtonModule], + declarations: [RouterLinkStubDirective], + imports: [RouterTestingModule, MatIconModule, MatLegacyButtonModule, GettingStartedComponent], }).compileComponents(); }) ); diff --git a/src/app/home-page/widget/getting-started/getting-started.component.ts b/src/app/home-page/widget/getting-started/getting-started.component.ts index c88fd7bb49..1b386c5f7b 100644 --- a/src/app/home-page/widget/getting-started/getting-started.component.ts +++ b/src/app/home-page/widget/getting-started/getting-started.component.ts @@ -1,10 +1,15 @@ import { Component } from '@angular/core'; import { Dockstore } from '../../../shared/dockstore.model'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-getting-started', templateUrl: './getting-started.component.html', styleUrls: ['./getting-started.component.scss'], + standalone: true, + imports: [MatLegacyButtonModule, RouterLink, MatIconModule], }) export class GettingStartedComponent { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/news-box/news-box.component.spec.ts b/src/app/home-page/widget/news-box/news-box.component.spec.ts index b47ecfd91d..4d43a241cc 100644 --- a/src/app/home-page/widget/news-box/news-box.component.spec.ts +++ b/src/app/home-page/widget/news-box/news-box.component.spec.ts @@ -1,7 +1,8 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatDividerModule } from '@angular/material/divider'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; -import { HomePageModule } from '../../home-page.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { NewsBoxComponent } from './news-box.component'; describe('NewsBoxComponent', () => { @@ -10,8 +11,7 @@ describe('NewsBoxComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - imports: [MatLegacyCardModule, MatDividerModule, HomePageModule], - declarations: [NewsBoxComponent], + imports: [MatLegacyCardModule, MatDividerModule, NewsBoxComponent, HttpClientTestingModule, MatLegacySnackBarModule], }).compileComponents(); }); diff --git a/src/app/home-page/widget/news-box/news-box.component.ts b/src/app/home-page/widget/news-box/news-box.component.ts index 7806d45758..990b6c51d1 100644 --- a/src/app/home-page/widget/news-box/news-box.component.ts +++ b/src/app/home-page/widget/news-box/news-box.component.ts @@ -1,8 +1,14 @@ import { Component } from '@angular/core'; +import { NewsAndUpdatesComponent } from '../featured-content/news-and-updates.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-news-box', templateUrl: './news-box.component.html', styleUrls: ['../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [MatLegacyCardModule, FlexModule, MatDividerModule, NewsAndUpdatesComponent], }) export class NewsBoxComponent {} diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts index ae289c871d..1282f9a157 100644 --- a/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts +++ b/src/app/home-page/widget/news-updates/news-notifications.component.spec.ts @@ -10,8 +10,7 @@ describe('NewsNotificationsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NewsNotificationsComponent], - imports: [MarkdownModule, HttpClientTestingModule], + imports: [MarkdownModule, HttpClientTestingModule, NewsNotificationsComponent], }).compileComponents(); }) ); diff --git a/src/app/home-page/widget/news-updates/news-notifications.component.ts b/src/app/home-page/widget/news-updates/news-notifications.component.ts index 49da060f53..aa4b595706 100644 --- a/src/app/home-page/widget/news-updates/news-notifications.component.ts +++ b/src/app/home-page/widget/news-updates/news-notifications.component.ts @@ -2,11 +2,19 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { NotificationsService } from '../../../notifications/state/notifications.service'; import { Notification } from '../../../shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../../../shared/markdown-wrapper/markdown-wrapper.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-news-notifications', templateUrl: './news-notifications.component.html', styleUrls: ['./news-notifications.component.scss'], + standalone: true, + imports: [NgFor, MatLegacyCardModule, FlexModule, MarkdownWrapperComponent, MatLegacyButtonModule, MatIconModule, AsyncPipe], }) export class NewsNotificationsComponent implements OnInit { public activeNotifications$: Observable>; diff --git a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts index f3dcfefce0..644fc37d7b 100644 --- a/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts +++ b/src/app/home-page/widget/organization-box/my-organizations-dialog.component/my-organizations-dialog.component.ts @@ -1,10 +1,19 @@ import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { OrganizationUpdateTime } from 'app/shared/openapi'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgFor, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-my-organizations-dialog', templateUrl: './my-organizations-dialog.component.html', + standalone: true, + imports: [FlexModule, MatLegacyDialogModule, NgFor, MatLegacyButtonModule, DatePipe], }) export class MyOrganizationsDialogComponent { constructor( diff --git a/src/app/home-page/widget/organization-box/organization-box.component.ts b/src/app/home-page/widget/organization-box/organization-box.component.ts index c2ea7c252c..997f5d9e1c 100644 --- a/src/app/home-page/widget/organization-box/organization-box.component.ts +++ b/src/app/home-page/widget/organization-box/organization-box.component.ts @@ -9,12 +9,33 @@ import { bootstrap4mediumModalSize, bootstrap4largeModalSize } from 'app/shared/ import { Observable } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { MyOrganizationsDialogComponent } from './my-organizations-dialog.component/my-organizations-dialog.component'; -import { Router } from '@angular/router'; +import { Router, RouterLink } from '@angular/router'; +import { RecentEventsComponent } from '../../recent-events/recent-events.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-organization-box', templateUrl: './organization-box.component.html', styleUrls: ['./organization-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + FlexModule, + MatIconModule, + RouterLink, + MatLegacyTooltipModule, + NgIf, + MatLegacyButtonModule, + MatDividerModule, + RecentEventsComponent, + AsyncPipe, + ], }) export class OrganizationBoxComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/home-page/widget/starred-box/starred-box.component.ts b/src/app/home-page/widget/starred-box/starred-box.component.ts index 74f51b9318..ba397ab6c5 100644 --- a/src/app/home-page/widget/starred-box/starred-box.component.ts +++ b/src/app/home-page/widget/starred-box/starred-box.component.ts @@ -2,11 +2,20 @@ import { Component, OnInit } from '@angular/core'; import { Base } from 'app/shared/base'; import { Dockstore } from 'app/shared/dockstore.model'; import { UsersService } from 'app/shared/openapi'; +import { RecentEventsComponent } from '../../recent-events/recent-events.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { NgIf } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-starred-box', templateUrl: './starred-box.component.html', styleUrls: ['./starred-box.component.scss', '../../../shared/styles/dashboard-boxes.scss'], + standalone: true, + imports: [MatLegacyCardModule, FlexModule, MatIconModule, RouterLink, NgIf, MatDividerModule, RecentEventsComponent], }) export class StarredBoxComponent extends Base implements OnInit { public Dockstore = Dockstore; diff --git a/src/app/information-dialog/information-dialog.component.ts b/src/app/information-dialog/information-dialog.component.ts index e34c93187f..1675c7cb3c 100644 --- a/src/app/information-dialog/information-dialog.component.ts +++ b/src/app/information-dialog/information-dialog.component.ts @@ -1,5 +1,12 @@ import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf } from '@angular/common'; export class InformationDialogData { message?: string; @@ -10,6 +17,8 @@ export class InformationDialogData { @Component({ selector: 'app-information-dialog', templateUrl: './information-dialog.component.html', + standalone: true, + imports: [NgIf, MatLegacyDialogModule, FlexModule, MatLegacyButtonModule], }) export class InformationDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: InformationDialogData) {} diff --git a/src/app/login/login.component.spec.ts b/src/app/login/login.component.spec.ts index 9e1a962fc8..80a04b7fe8 100644 --- a/src/app/login/login.component.spec.ts +++ b/src/app/login/login.component.spec.ts @@ -15,9 +15,12 @@ */ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { RegisterService } from '../register/register.service'; +import { ProviderService } from '../shared/provider.service'; import { TrackLoginService } from '../shared/track-login.service'; import { UserService } from '../shared/user/user.service'; import { LoginStubService, TrackLoginStubService, UserStubService } from '../test/service-stubs'; @@ -31,14 +34,14 @@ describe('LoginComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LoginComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule], + imports: [RouterTestingModule, LoginComponent, MatLegacySnackBarModule, NoopAnimationsModule], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: UserService, useClass: UserStubService }, { provide: LoginService, useClass: LoginStubService }, { provide: RegisterService, useClass: LoginStubService }, + ProviderService, ], }).compileComponents(); }) diff --git a/src/app/login/login.component.ts b/src/app/login/login.component.ts index 40913145d1..1628759388 100644 --- a/src/app/login/login.component.ts +++ b/src/app/login/login.component.ts @@ -23,11 +23,32 @@ import { RegisterService } from '../register/register.service'; import { TrackLoginService } from '../shared/track-login.service'; import { UserService } from '../shared/user/user.service'; import { LoginService } from './login.service'; +import { NgTemplateOutlet } from '@angular/common'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../shared/alert/alert.component'; @Component({ selector: 'app-login', templateUrl: './login.component.html', styleUrls: ['./login.component.scss'], + standalone: true, + imports: [ + AlertComponent, + FlexModule, + MatLegacyCardModule, + MatLegacyTabsModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FontAwesomeModule, + MatLegacyCheckboxModule, + NgTemplateOutlet, + ], }) export class LoginComponent { faGithub = faGithub; diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts index 199910aa50..a9feafb913 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.spec.ts @@ -1,9 +1,10 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { AccountSidebarComponent } from './account-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CommonModule } from '@angular/common'; import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table'; @@ -18,8 +19,16 @@ describe('AccountSidebarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [AccountSidebarComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, MatTableModule, MatLegacyButtonModule, RouterTestingModule], + imports: [ + FlexLayoutModule, + CommonModule, + MatTableModule, + MatLegacyButtonModule, + MatLegacySnackBarModule, + MatLegacyDialogModule, + RouterTestingModule, + AccountSidebarComponent, + ], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: UserService, useClass: UserStubService }, diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts index 62345b9bea..78ffbda541 100644 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts +++ b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.component.ts @@ -12,11 +12,19 @@ import { UserService } from '../../../shared/user/user.service'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ChangeUsernameComponent } from '../../../../app/loginComponents/accounts/internal/change-username/change-username.component'; import { bootstrap4largeModalSize } from '../../../shared/constants'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgIf } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-account-sidebar', templateUrl: './account-sidebar.component.html', styleUrls: ['./account-sidebar.component.scss'], + standalone: true, + imports: [FlexModule, NgIf, MatIconModule, MatLegacyTooltipModule, MatLegacyButtonModule, RouterLink], }) export class AccountSidebarComponent implements OnInit { user: User; diff --git a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts b/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts deleted file mode 100644 index 16a0cc91bf..0000000000 --- a/src/app/loginComponents/accounts/account-sidebar/account-sidebar.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2022 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { AccountSidebarComponent } from './account-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { CommonModule } from '@angular/common'; -import { RouterModule } from '@angular/router'; -import { ChangeUsernameModule } from '../internal/change-username/change-username.module'; - -@NgModule({ - declarations: [AccountSidebarComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, RouterModule, ChangeUsernameModule], - providers: [], - exports: [AccountSidebarComponent], -}) -export class AccountSidebarModule {} diff --git a/src/app/loginComponents/accounts/accounts.component.ts b/src/app/loginComponents/accounts/accounts.component.ts index d8c86503a4..c7851b5eff 100644 --- a/src/app/loginComponents/accounts/accounts.component.ts +++ b/src/app/loginComponents/accounts/accounts.component.ts @@ -1,16 +1,34 @@ import { Location } from '@angular/common'; import { Component, OnInit } from '@angular/core'; import { UntypedFormControl } from '@angular/forms'; -import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { ActivatedRoute, Params } from '@angular/router'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; +import { RequestsComponent } from '../requests/requests.component'; +import { ControlsComponent } from './controls/controls.component'; +import { AccountsExternalComponent } from './external/accounts.component'; +import { AccountSidebarComponent } from './account-sidebar/account-sidebar.component'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-accounts', templateUrl: './accounts.component.html', styleUrls: ['./accounts.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + AccountSidebarComponent, + MatLegacyTabsModule, + AccountsExternalComponent, + ControlsComponent, + RequestsComponent, + ], }) export class AccountsComponent extends Base implements OnInit { public currentTab = 'accounts'; // default to the 'accounts' tab diff --git a/src/app/loginComponents/accounts/controls/controls.component.spec.ts b/src/app/loginComponents/accounts/controls/controls.component.spec.ts index 3c9f0303a0..924f1ee536 100644 --- a/src/app/loginComponents/accounts/controls/controls.component.spec.ts +++ b/src/app/loginComponents/accounts/controls/controls.component.spec.ts @@ -2,7 +2,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ReactiveFormsModule } from '@angular/forms'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; import { RefreshService } from '../../../shared/refresh.service'; import { UsersService } from '../../../shared/openapi'; import { UserService } from '../../../shared/user/user.service'; @@ -17,8 +16,7 @@ describe('ControlsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ControlsComponent, ChangeUsernameComponent], - imports: [CustomMaterialModule, BrowserAnimationsModule, ReactiveFormsModule], + imports: [BrowserAnimationsModule, ReactiveFormsModule, ControlsComponent, ChangeUsernameComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: UsersService, useClass: UsersStubService }, diff --git a/src/app/loginComponents/accounts/controls/controls.component.ts b/src/app/loginComponents/accounts/controls/controls.component.ts index ada4fd9b49..ce3e898d96 100644 --- a/src/app/loginComponents/accounts/controls/controls.component.ts +++ b/src/app/loginComponents/accounts/controls/controls.component.ts @@ -5,11 +5,17 @@ import { UsersService } from '../../../shared/openapi'; import { UserQuery } from '../../../shared/user/user.query'; import { UserService } from '../../../shared/user/user.service'; import { DeleteAccountDialogComponent } from './delete-account-dialog/delete-account-dialog.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-controls', templateUrl: './controls.component.html', styleUrls: ['./controls.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyButtonModule, AsyncPipe], }) export class ControlsComponent implements OnInit { public canChangeUsername$: Observable; diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts index 5b1ba194ee..006cb0fd19 100644 --- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts +++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.spec.ts @@ -3,8 +3,8 @@ import { ReactiveFormsModule } from '@angular/forms'; import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { LogoutService } from '../../../../shared/logout.service'; -import { CustomMaterialModule } from '../../../../shared/modules/material.module'; import { UsersService } from '../../../../shared/openapi'; import { LogoutStubService, UsersStubService } from '../../../../test/service-stubs'; import { DeleteAccountDialogComponent } from './delete-account-dialog.component'; @@ -16,9 +16,8 @@ describe('DeleteAccountDialogComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DeleteAccountDialogComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, ReactiveFormsModule], + imports: [ReactiveFormsModule, DeleteAccountDialogComponent, MatLegacySnackBarModule], providers: [ { provide: LogoutService, useClass: LogoutStubService }, { provide: UsersService, useClass: UsersStubService }, diff --git a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts index 6a932caa3d..0eb5cf050d 100644 --- a/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts +++ b/src/app/loginComponents/accounts/controls/delete-account-dialog/delete-account-dialog.component.ts @@ -1,7 +1,16 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, UntypedFormBuilder, UntypedFormControl, UntypedFormGroup, ValidatorFn, Validators } from '@angular/forms'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { + AbstractControl, + UntypedFormBuilder, + UntypedFormControl, + UntypedFormGroup, + ValidatorFn, + Validators, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Subject } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; @@ -9,11 +18,29 @@ import { finalize, takeUntil } from 'rxjs/operators'; import { LogoutService } from '../../../../shared/logout.service'; import { UsersService } from '../../../../shared/openapi'; import { UserQuery } from '../../../../shared/user/user.query'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from '../../../../shared/alert/alert.component'; @Component({ selector: 'app-delete-account-dialog', templateUrl: './delete-account-dialog.component.html', styleUrls: ['./delete-account-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + ], }) export class DeleteAccountDialogComponent implements OnDestroy { username = ''; diff --git a/src/app/loginComponents/accounts/external/accounts.component.ts b/src/app/loginComponents/accounts/external/accounts.component.ts index 4f3f3e3117..e35f2ac8de 100644 --- a/src/app/loginComponents/accounts/external/accounts.component.ts +++ b/src/app/loginComponents/accounts/external/accounts.component.ts @@ -15,7 +15,7 @@ */ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; -import { Router } from '@angular/router'; +import { Router, RouterLink } from '@angular/router'; import { AuthService } from 'ng2-ui-auth'; import { Observable, Subject } from 'rxjs'; import { first, map, takeUntil } from 'rxjs/operators'; @@ -34,6 +34,19 @@ import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { accountInfo, bootstrap4largeModalSize } from '../../../shared/constants'; import { AlertService } from '../../../shared/alert/state/alert.service'; import { HttpErrorResponse } from '@angular/common/http'; +import { GetTokenUsernamePipe } from './getTokenUsername.pipe'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; export interface AccountInfo { name: string; @@ -53,6 +66,25 @@ export interface AccountInfo { selector: 'app-accounts-external', templateUrl: './accounts.component.html', styleUrls: ['./accounts.component.scss'], + standalone: true, + imports: [ + FlexModule, + NgIf, + MatLegacyCardModule, + MatBadgeModule, + MatLegacyChipsModule, + RouterLink, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + NgFor, + AsyncPipe, + GetTokenUsernamePipe, + ], }) export class AccountsExternalComponent implements OnInit, OnDestroy { public dsServerURI: any; diff --git a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts index 002bc34766..999701ccb1 100644 --- a/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts +++ b/src/app/loginComponents/accounts/external/getTokenUsername.pipe.ts @@ -4,6 +4,7 @@ import { TokenUser } from './../../../shared/openapi/model/tokenUser'; @Pipe({ name: 'getTokenUsername', + standalone: true, }) export class GetTokenUsernamePipe implements PipeTransform { /** diff --git a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts index 19388bd34d..87b26f9e92 100644 --- a/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts +++ b/src/app/loginComponents/accounts/external/revoke-token-dialog/revoke-token-dialog.component.ts @@ -15,16 +15,45 @@ */ import { Component, OnDestroy } from '@angular/core'; -import { AbstractControl, FormBuilder, FormControl, FormGroup, ValidatorFn, Validators } from '@angular/forms'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { + AbstractControl, + FormBuilder, + FormControl, + FormGroup, + ValidatorFn, + Validators, + FormsModule, + ReactiveFormsModule, +} from '@angular/forms'; +import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { takeUntil } from 'rxjs/operators'; import { UserQuery } from '../../../../shared/user/user.query'; import { Base } from '../../../../shared/base'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from '../../../../shared/alert/alert.component'; @Component({ selector: 'app-revoke-token-dialog', templateUrl: './revoke-token-dialog.component.html', styleUrls: ['./revoke-token-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + ], }) export class RevokeTokenDialogComponent extends Base implements OnDestroy { username = ''; diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts index f37b4bd429..d1d840257b 100644 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts +++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.spec.ts @@ -22,7 +22,6 @@ describe('ChangeUsernameComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ChangeUsernameComponent], imports: [ ReactiveFormsModule, MatIconModule, @@ -33,6 +32,7 @@ describe('ChangeUsernameComponent', () => { MatFormFieldModule, MatCardModule, BrowserAnimationsModule, + ChangeUsernameComponent, ], providers: [ { provide: UserService, useClass: UserStubService }, diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts index 50733798c5..e6e544053b 100644 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts +++ b/src/app/loginComponents/accounts/internal/change-username/change-username.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, Input, OnInit } from '@angular/core'; -import { UntypedFormControl, Validators } from '@angular/forms'; +import { UntypedFormControl, Validators, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { Observable, Subject } from 'rxjs'; import { debounceTime, finalize, takeUntil } from 'rxjs/operators'; import { formInputDebounceTime } from '../../../../shared/constants'; @@ -23,11 +23,33 @@ import { User } from '../../../../shared/openapi/model/user'; import { UserQuery } from '../../../../shared/user/user.query'; import { UserService } from '../../../../shared/user/user.service'; import { UsersService } from './../../../../shared/openapi/api/users.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-change-username', templateUrl: './change-username.component.html', styleUrls: ['./change-username.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyDialogModule, + MatLegacyCardModule, + FlexModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + ReactiveFormsModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class ChangeUsernameComponent implements OnInit { @Input() noDialog: boolean; diff --git a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts b/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts deleted file mode 100644 index db9d5aa694..0000000000 --- a/src/app/loginComponents/accounts/internal/change-username/change-username.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2022 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { CommonModule } from '@angular/common'; -import { ChangeUsernameComponent } from './change-username.component'; -import { ReactiveFormsModule } from '@angular/forms'; - -@NgModule({ - declarations: [ChangeUsernameComponent], - imports: [CustomMaterialModule, FlexLayoutModule, CommonModule, ReactiveFormsModule], - providers: [], - exports: [ChangeUsernameComponent], -}) -export class ChangeUsernameModule {} diff --git a/src/app/loginComponents/auth/auth.component.spec.ts b/src/app/loginComponents/auth/auth.component.spec.ts index 9d265e84af..9349726431 100644 --- a/src/app/loginComponents/auth/auth.component.spec.ts +++ b/src/app/loginComponents/auth/auth.component.spec.ts @@ -14,8 +14,7 @@ describe('AuthComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [AuthComponent], - imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule], + imports: [RouterTestingModule.withRoutes([{ path: '**', component: AuthComponent }]), MatSnackBarModule, AuthComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: TokenService, useClass: TokenStubService }, diff --git a/src/app/loginComponents/auth/auth.component.ts b/src/app/loginComponents/auth/auth.component.ts index 5ed1268068..aaf13c26ed 100644 --- a/src/app/loginComponents/auth/auth.component.ts +++ b/src/app/loginComponents/auth/auth.component.ts @@ -13,6 +13,7 @@ import { TokenService } from '../../shared/state/token.service'; @Component({ selector: 'app-auth', templateUrl: './auth.component.html', + standalone: true, }) export class AuthComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts index 9876ec67f9..0eff90ebec 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts @@ -22,7 +22,7 @@ describe('DownloadCLIClientComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DownloadCLIClientComponent, RouterLinkStubDirective, RouterOutletStubComponent], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], imports: [ ClipboardModule, MarkdownModule.forRoot(), @@ -32,6 +32,7 @@ describe('DownloadCLIClientComponent', () => { MatSnackBarModule, MatTabsModule, NoopAnimationsModule, + DownloadCLIClientComponent, ], providers: [ { provide: AuthService, useClass: AuthStubService }, diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index 39c2ea7baa..b47c52e1da 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -8,11 +8,31 @@ import { AlertService } from './../../../shared/alert/state/alert.service'; import { forkJoin } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { Base } from 'app/shared/base'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgClass } from '@angular/common'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MarkdownModule } from 'ngx-markdown'; @Component({ selector: 'app-downloadcliclient', templateUrl: './downloadcliclient.component.html', styleUrls: ['./downloadcliclient.component.scss'], + standalone: true, + imports: [ + MarkdownModule, + MatLegacyTabsModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + SnackbarDirective, + NgClass, + ExtendedModule, + ClipboardModule, + ], }) export class DownloadCLIClientComponent extends Base implements OnInit { public downloadCli = 'dummy-start-value'; diff --git a/src/app/loginComponents/onboarding/onboarding.component.ts b/src/app/loginComponents/onboarding/onboarding.component.ts index edca9ef82f..ce33911516 100644 --- a/src/app/loginComponents/onboarding/onboarding.component.ts +++ b/src/app/loginComponents/onboarding/onboarding.component.ts @@ -5,11 +5,36 @@ import { Dockstore } from '../../shared/dockstore.model'; import { TokenQuery } from '../../shared/state/token.query'; import { ExtendedUserData, User } from '../../shared/openapi'; import { UserQuery } from '../../shared/user/user.query'; +import { MatDividerModule } from '@angular/material/divider'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component'; +import { AccountsExternalComponent } from '../accounts/external/accounts.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ChangeUsernameComponent } from '../accounts/internal/change-username/change-username.component'; +import { MatStepperModule } from '@angular/material/stepper'; +import { NgIf } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-onboarding', templateUrl: './onboarding.component.html', styleUrls: ['./onboarding.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + MatIconModule, + NgIf, + MatStepperModule, + ChangeUsernameComponent, + MatLegacyButtonModule, + AccountsExternalComponent, + DownloadCLIClientComponent, + FlexModule, + RouterLink, + MatDividerModule, + ], }) export class OnboardingComponent implements OnInit, OnDestroy { public tokenSetComplete: boolean; diff --git a/src/app/loginComponents/onboarding/quickstart.component.ts b/src/app/loginComponents/onboarding/quickstart.component.ts index 2105f52acb..35626b73a5 100644 --- a/src/app/loginComponents/onboarding/quickstart.component.ts +++ b/src/app/loginComponents/onboarding/quickstart.component.ts @@ -15,10 +15,16 @@ */ import { Component, OnInit } from '@angular/core'; import { Dockstore } from '../../shared/dockstore.model'; +import { DownloadCLIClientComponent } from './downloadcliclient/downloadcliclient.component'; +import { NgIf } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-onboarding', templateUrl: './quickstart.component.html', + standalone: true, + imports: [HeaderComponent, MatIconModule, NgIf, DownloadCLIClientComponent], }) export class QuickStartComponent implements OnInit { public curStep = 1; diff --git a/src/app/loginComponents/requests.module.ts b/src/app/loginComponents/requests.module.ts deleted file mode 100644 index 8b0c149047..0000000000 --- a/src/app/loginComponents/requests.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RouterModule } from '@angular/router'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { - OrganizationInviteConfirmDialogComponent, - OrganizationRequestConfirmDialogComponent, - RequestsComponent, -} from './requests/requests.component'; -@NgModule({ - imports: [CommonModule, CustomMaterialModule, RouterModule, FlexLayoutModule], - declarations: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent], - exports: [RequestsComponent, OrganizationRequestConfirmDialogComponent, OrganizationInviteConfirmDialogComponent], -}) -export class RequestsModule {} diff --git a/src/app/loginComponents/requests/requests.component.ts b/src/app/loginComponents/requests/requests.component.ts index dc8cd87a9d..4f0b9c2ed6 100644 --- a/src/app/loginComponents/requests/requests.component.ts +++ b/src/app/loginComponents/requests/requests.component.ts @@ -3,6 +3,7 @@ import { MatLegacyDialog as MatDialog, MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -14,10 +15,20 @@ import { Organization, OrganizationUser } from '../../shared/openapi'; import { UserQuery } from '../../shared/user/user.query'; import { RequestsQuery } from '../state/requests.query'; import { RequestsService } from '../state/requests.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe, LowerCasePipe, DatePipe } from '@angular/common'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; @Component({ selector: 'app-organization-request-confirm-dialog', templateUrl: 'organization-request-confirm-dialog.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, NgIf], }) export class OrganizationRequestConfirmDialogComponent { constructor( @@ -33,6 +44,8 @@ export class OrganizationRequestConfirmDialogComponent { @Component({ selector: 'app-organization-invite-confirm-dialog', templateUrl: 'organization-invite-confirm-dialog.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, NgIf], }) export class OrganizationInviteConfirmDialogComponent { constructor(public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: DialogData) {} @@ -52,6 +65,21 @@ export interface DialogData { selector: 'app-requests', templateUrl: './requests.component.html', styleUrls: ['./requests.component.scss'], + standalone: true, + imports: [ + MatLegacyProgressBarModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + NgFor, + RouterLink, + MatLegacyTooltipModule, + MatLegacyButtonModule, + AsyncPipe, + LowerCasePipe, + DatePipe, + ], }) export class RequestsComponent extends Base implements OnInit { public allPendingOrganizations$: Observable>; diff --git a/src/app/logout/logout.component.spec.ts b/src/app/logout/logout.component.spec.ts index 3d3d42f2a9..6427aed236 100644 --- a/src/app/logout/logout.component.spec.ts +++ b/src/app/logout/logout.component.spec.ts @@ -1,11 +1,13 @@ import { Component } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { LogoutComponent } from './logout.component'; @Component({ selector: 'app-header', template: '', + standalone: true, }) class HeaderComponent {} @@ -16,7 +18,7 @@ describe('LogoutComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LogoutComponent, HeaderComponent], + imports: [LogoutComponent, HeaderComponent, MatLegacySnackBarModule], }).compileComponents(); }) ); diff --git a/src/app/logout/logout.component.ts b/src/app/logout/logout.component.ts index e8eb492fe7..3917d97ab2 100644 --- a/src/app/logout/logout.component.ts +++ b/src/app/logout/logout.component.ts @@ -1,8 +1,12 @@ import { Component } from '@angular/core'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-logout', templateUrl: './logout.component.html', styleUrls: ['./logout.component.scss'], + standalone: true, + imports: [HeaderComponent, FlexModule], }) export class LogoutComponent {} diff --git a/src/app/maintenance/maintenance.component.spec.ts b/src/app/maintenance/maintenance.component.spec.ts index fb5ef75c59..6f28f3e913 100644 --- a/src/app/maintenance/maintenance.component.spec.ts +++ b/src/app/maintenance/maintenance.component.spec.ts @@ -11,8 +11,7 @@ describe('MaintenanceComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MaintenanceComponent], - imports: [MatCardModule, MatIconModule], + imports: [MatCardModule, MatIconModule, MaintenanceComponent], }).compileComponents(); }) ); diff --git a/src/app/maintenance/maintenance.component.ts b/src/app/maintenance/maintenance.component.ts index 5b1344b2c3..c52186d62b 100644 --- a/src/app/maintenance/maintenance.component.ts +++ b/src/app/maintenance/maintenance.component.ts @@ -1,8 +1,12 @@ import { Component } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-maintenance', templateUrl: './maintenance.component.html', styleUrls: ['./maintenance.component.scss'], + standalone: true, + imports: [MatLegacyCardModule, MatIconModule], }) export class MaintenanceComponent {} diff --git a/src/app/my-notebooks/my-notebooks.module.ts b/src/app/my-notebooks/my-notebooks.module.ts deleted file mode 100644 index 6ca991e898..0000000000 --- a/src/app/my-notebooks/my-notebooks.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { MyNotebooksRoutes } from './my-notebooks.routing'; - -@NgModule({ - imports: [MyNotebooksRoutes, SharedWorkflowServicesNotebooksModule], -}) -export class MyNotebooksModule {} diff --git a/src/app/my-notebooks/my-notebooks.routing.ts b/src/app/my-notebooks/my-notebooks.routing.ts index 401fff4d06..50d9ddb313 100644 --- a/src/app/my-notebooks/my-notebooks.routing.ts +++ b/src/app/my-notebooks/my-notebooks.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; import { EntryType } from '../shared/enum/entry-type'; @@ -10,4 +10,4 @@ const routes: Routes = [ }, ]; -export const MyNotebooksRoutes = RouterModule.forChild(routes); +export const MyNotebooksRoutes = routes; diff --git a/src/app/my-services/my-services.module.ts b/src/app/my-services/my-services.module.ts deleted file mode 100644 index 36ccc0c66b..0000000000 --- a/src/app/my-services/my-services.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { MyServicesRoutes } from './my-services.routing'; - -@NgModule({ - imports: [MyServicesRoutes, SharedWorkflowServicesNotebooksModule], -}) -export class MyServicesModule {} diff --git a/src/app/my-services/my-services.routing.ts b/src/app/my-services/my-services.routing.ts index 3a536062ed..38c1c16519 100644 --- a/src/app/my-services/my-services.routing.ts +++ b/src/app/my-services/my-services.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; import { EntryType } from '../shared/enum/entry-type'; @@ -10,4 +10,4 @@ const routes: Routes = [ }, ]; -export const MyServicesRoutes = RouterModule.forChild(routes); +export const MyServicesRoutes = routes; diff --git a/src/app/my-sidebar/my-sidebar.component.spec.ts b/src/app/my-sidebar/my-sidebar.component.spec.ts index e0af42cec9..ade3b3e0f9 100644 --- a/src/app/my-sidebar/my-sidebar.component.spec.ts +++ b/src/app/my-sidebar/my-sidebar.component.spec.ts @@ -1,4 +1,7 @@ import { ComponentFixture, TestBed } from '@angular/core/testing'; +import { ProviderService } from '../shared/provider.service'; +import { ActivatedRoute, ActivatedRouteStub } from '../test'; +import { ProviderStubService } from '../test/service-stubs'; import { MySidebarComponent } from './my-sidebar.component'; describe('MySidebarComponent', () => { @@ -7,7 +10,11 @@ describe('MySidebarComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [MySidebarComponent], + imports: [MySidebarComponent], + providers: [ + { provide: ProviderService, useClass: ProviderStubService }, + { provide: ActivatedRoute, useClass: ActivatedRouteStub }, + ], }).compileComponents(); }); diff --git a/src/app/my-sidebar/my-sidebar.component.ts b/src/app/my-sidebar/my-sidebar.component.ts index b0948448e6..58aad9cc4b 100644 --- a/src/app/my-sidebar/my-sidebar.component.ts +++ b/src/app/my-sidebar/my-sidebar.component.ts @@ -1,10 +1,15 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { NgIf } from '@angular/common'; +import { RouterLink, RouterLinkActive } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-my-sidebar', templateUrl: './my-sidebar.component.html', styleUrls: ['./my-sidebar.component.scss'], + standalone: true, + imports: [MatLegacyButtonModule, RouterLink, RouterLinkActive, NgIf], }) export class MySidebarComponent { Dockstore = Dockstore; diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index 356437c77e..ad2ab8217e 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -47,11 +47,44 @@ import { UserQuery } from '../../shared/user/user.query'; import { MytoolsService } from '../mytools.service'; import { EntryType } from '../../shared/enum/entry-type'; import { UserService } from 'app/shared/user/user.service'; +import { ContainerComponent } from '../../container/container.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component'; +import { SidebarAccordionComponent as WorkflowSidebarAccordionComponent } from '../../myworkflows/sidebar-accordion/sidebar-accordion.component'; @Component({ selector: 'app-my-tool', templateUrl: './my-tool.component.html', styleUrls: ['../../shared/styles/my-entry.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + MatLegacyButtonModule, + MatIconModule, + MatSidenavModule, + NgIf, + MatLegacyTooltipModule, + MatLegacyMenuModule, + SidebarAccordionComponent, + WorkflowSidebarAccordionComponent, + MatLegacyCardModule, + FontAwesomeModule, + ContainerComponent, + AsyncPipe, + TitleCasePipe, + ], }) export class MyToolComponent extends MyEntry implements OnInit { faGithub = faGithub; diff --git a/src/app/mytools/mytools.component.ts b/src/app/mytools/mytools.component.ts index 0ca917018f..84fde1e82f 100644 --- a/src/app/mytools/mytools.component.ts +++ b/src/app/mytools/mytools.component.ts @@ -14,10 +14,13 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { RouterOutlet } from '@angular/router'; @Component({ selector: 'app-mytools', templateUrl: './mytools.component.html', styleUrls: ['./mytools.component.css'], + standalone: true, + imports: [RouterOutlet], }) export class MyToolsComponent {} diff --git a/src/app/mytools/mytools.module.ts b/src/app/mytools/mytools.module.ts deleted file mode 100644 index 59bb759b12..0000000000 --- a/src/app/mytools/mytools.module.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RefreshWizardModule } from 'app/container/refresh-wizard.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { RefreshToolOrganizationComponent } from '../container/refresh-tool-organization/refresh-tool-organization.component'; -import { ContainerModule } from '../shared/modules/container.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { RegisterToolService } from './../container/register-tool/register-tool.service'; -import { AccountsService } from './../loginComponents/accounts/external/accounts.service'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { MyToolComponent } from './my-tool/my-tool.component'; -import { MyToolsComponent } from './mytools.component'; -import { mytoolsRouting } from './mytools.routing'; -import { MytoolsService } from './mytools.service'; -import { SidebarAccordionComponent } from './sidebar-accordion/sidebar-accordion.component'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { IsAppToolPipe } from '../search/is-app-tool.pipe'; -import { WorkflowModule } from '../shared/modules/workflow.module'; -import { MySidebarModule } from '../shared/modules/my-sidebar.module'; - -@NgModule({ - declarations: [MyToolsComponent, RefreshToolOrganizationComponent, MyToolComponent, SidebarAccordionComponent], - imports: [ - CommonModule, - ContainerModule, - FormsModule, - HeaderModule, - mytoolsRouting, - CustomMaterialModule, - PipeModule, - MyEntriesModule, - RefreshWizardModule, - SharedWorkflowServicesNotebooksModule, - WorkflowModule, - MySidebarModule, - ], - providers: [RegisterToolService, AccountsService, MytoolsService, IsAppToolPipe], -}) -export class MyToolsModule {} diff --git a/src/app/mytools/mytools.routing.ts b/src/app/mytools/mytools.routing.ts index 77b94ab96e..d0b4b728a8 100644 --- a/src/app/mytools/mytools.routing.ts +++ b/src/app/mytools/mytools.routing.ts @@ -13,8 +13,12 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; +import { EmailService } from '../container/email.service'; +import { InfoTabService } from '../container/info-tab/info-tab.service'; +import { ToolLaunchService } from '../container/launch/tool-launch.service'; +import { VersionModalService } from '../container/version-modal/version-modal.service'; import { MyToolComponent } from './my-tool/my-tool.component'; import { MyToolsComponent } from './mytools.component'; @@ -23,7 +27,14 @@ const MYTOOLS_ROUTES: Routes = [ path: '', component: MyToolsComponent, data: { title: 'Dockstore | My Tools' }, - children: [{ path: '**', component: MyToolComponent, data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool } }], + children: [ + { + path: '**', + component: MyToolComponent, + data: { title: 'Dockstore | My Tools', entryType: EntryType.Tool }, + providers: [EmailService, InfoTabService, ToolLaunchService, VersionModalService], + }, + ], }, ]; -export const mytoolsRouting = RouterModule.forChild(MYTOOLS_ROUTES); +export const mytoolsRouting = MYTOOLS_ROUTES; diff --git a/src/app/mytools/mytools.service.spec.ts b/src/app/mytools/mytools.service.spec.ts index 1db7a2eb7d..b41eedf312 100644 --- a/src/app/mytools/mytools.service.spec.ts +++ b/src/app/mytools/mytools.service.spec.ts @@ -16,19 +16,20 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { ContainerService } from 'app/shared/container.service'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; import { UrlResolverService } from 'app/shared/url-resolver.service'; -import { ContainerStubService, WorkflowsStubService } from 'app/test/service-stubs'; +import { ContainerStubService, DateStubService, WorkflowsStubService } from 'app/test/service-stubs'; +import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; +import { DateService } from '../shared/date.service'; +import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; import { DockstoreTool, Workflow, WorkflowsService } from '../shared/openapi'; +import { ProviderService } from '../shared/provider.service'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; import { OrgToolObject } from './my-tool/my-tool.component'; import { MytoolsService } from './mytools.service'; -import { DateService } from '../shared/date.service'; -import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; -import { ProviderService } from '../shared/provider.service'; -import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; describe('MytoolsService', () => { const tool1: DockstoreTool = { @@ -288,11 +289,13 @@ describe('MytoolsService', () => { { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: ContainerService, useClass: ContainerStubService }, { provide: UrlResolverService, useclass: UrlResolverService }, - MyWorkflowsService, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, + MyWorkflowsService, + MyEntriesStateService, + MyEntriesStore, ], - imports: [RouterTestingModule, CustomMaterialModule, HttpClientTestingModule, MyEntriesModule], + imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule], }); }); it('should ...', inject([MytoolsService], (service: MytoolsService) => { diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts index a1294f5a68..7a987b13b1 100644 --- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts +++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.spec.ts @@ -23,7 +23,6 @@ describe('SidebarAccordionComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SidebarAccordionComponent, RefreshToolOrganizationComponent, SelectTabPipe], imports: [ MatTabsModule, MatToolbarModule, @@ -34,6 +33,9 @@ describe('SidebarAccordionComponent', () => { MatTooltipModule, RouterTestingModule, HttpClientTestingModule, + SidebarAccordionComponent, + RefreshToolOrganizationComponent, + SelectTabPipe, ], providers: [ { provide: RegisterToolService, useClass: RegisterToolStubService }, diff --git a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts index 0838171fc1..899c88c00a 100644 --- a/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts +++ b/src/app/mytools/sidebar-accordion/sidebar-accordion.component.ts @@ -3,9 +3,17 @@ import { DockstoreTool } from 'app/shared/openapi'; import { Observable } from 'rxjs'; import { ToolQuery } from '../../shared/tool/tool.query'; import { OrgToolObject } from '../my-tool/my-tool.component'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgFor, NgIf, NgTemplateOutlet, NgClass, AsyncPipe, KeyValuePipe } from '@angular/common'; import { MetadataService } from '../../shared/openapi/api/metadata.service'; import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; +import { RefreshToolOrganizationComponent } from '../../container/refresh-tool-organization/refresh-tool-organization.component'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyListModule } from '@angular/material/legacy-list'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatExpansionModule } from '@angular/material/expansion'; interface GroupEntriesByRegistry { groupEntryInfo: OrgToolObject[]; @@ -16,6 +24,23 @@ interface GroupEntriesByRegistry { selector: 'app-sidebar-accordion', templateUrl: './sidebar-accordion.component.html', styleUrls: ['./sidebar-accordion.component.scss', '../../shared/styles/my-entry-sidebar.scss'], + standalone: true, + imports: [ + NgFor, + NgIf, + MatExpansionModule, + MatLegacyTabsModule, + NgTemplateOutlet, + MatLegacyListModule, + NgClass, + ExtendedModule, + MatIconModule, + RouterLink, + RefreshToolOrganizationComponent, + AsyncPipe, + KeyValuePipe, + SelectTabPipe, + ], }) export class SidebarAccordionComponent implements OnInit, OnChanges { @Input() openOneAtATime; diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts index bf6df897a6..24faabd7d1 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts @@ -16,21 +16,31 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacyDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TrackLoginService } from 'app/shared/track-login.service'; import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { MyEntriesModule } from '../../shared/modules/my-entries.module'; -import { RefreshService } from '../../shared/refresh.service'; -import { TokenQuery } from '../../shared/state/token.query'; -import { WorkflowService } from '../../shared/state/workflow.service'; +import { MytoolsService } from '../../mytools/mytools.service'; +import { BioschemaService } from '../../shared/bioschema.service'; import { ContainerService } from '../../shared/container.service'; +import { DateService } from '../../shared/date.service'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; +import { ExtendedToolsService } from '../../shared/extended-tools.service'; +import { ExtendedWorkflowsService } from '../../shared/extended-workflows.service'; +import { MetadataService } from '../../shared/openapi'; import { UsersService } from '../../shared/openapi/api/users.service'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { Configuration } from '../../shared/openapi/configuration'; +import { ProviderService } from '../../shared/provider.service'; +import { RefreshService } from '../../shared/refresh.service'; +import { MyEntriesQuery } from '../../shared/state/my-entries.query'; +import { MyEntriesStateService } from '../../shared/state/my-entries.service'; +import { MyEntriesStore } from '../../shared/state/my-entries.store'; +import { TokenQuery } from '../../shared/state/token.query'; +import { WorkflowService } from '../../shared/state/workflow.service'; import { UrlResolverService } from '../../shared/url-resolver.service'; import { UserQuery } from '../../shared/user/user.query'; import { RouterLinkStubDirective } from '../../test'; @@ -39,7 +49,10 @@ import { AccountsStubService, AuthStubService, ConfigurationStub, + ContainerStubService, + DateStubService, MetadataStubService, + ProviderStubService, RefreshStubService, RegisterWorkflowModalStubService, TrackLoginStubService, @@ -47,14 +60,10 @@ import { UsersStubService, WorkflowsStubService, WorkflowStubService, - ContainerStubService, } from '../../test/service-stubs'; import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service'; import { MyWorkflowsService } from '../myworkflows.service'; -import { MytoolsService } from '../../mytools/mytools.service'; import { MyWorkflowComponent } from './my-workflow.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { MetadataService } from '../../shared/openapi'; describe('MyWorkflowsComponent', () => { let component: MyWorkflowComponent; @@ -63,9 +72,16 @@ describe('MyWorkflowsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MyWorkflowComponent, RouterLinkStubDirective, RouterOutletStubComponent], + declarations: [RouterLinkStubDirective, RouterOutletStubComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule, HttpClientTestingModule, BrowserAnimationsModule, CustomMaterialModule, MyEntriesModule], + imports: [ + RouterTestingModule, + HttpClientTestingModule, + BrowserAnimationsModule, + MatLegacySnackBarModule, + MatLegacyDialogModule, + MyWorkflowComponent, + ], providers: [ { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, { provide: MetadataService, useClass: MetadataStubService }, @@ -77,10 +93,18 @@ describe('MyWorkflowsComponent', () => { { provide: ContainerService, useClass: ContainerStubService }, { provide: RefreshService, useClass: RefreshStubService }, { provide: RegisterWorkflowModalService, useClass: RegisterWorkflowModalStubService }, + { provide: DateService, useClass: DateStubService }, + BioschemaService, + ExtendedToolsService, + ExtendedWorkflowsService, + MyEntriesQuery, + MyEntriesStateService, + MyEntriesStore, MyWorkflowsService, MytoolsService, TokenQuery, { provide: AccountsService, useClass: AccountsStubService }, + { provide: ProviderService, useClass: ProviderStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: UrlResolverService, useClass: UrlResolverStubService }, { provide: TrackLoginService, useClass: TrackLoginStubService }, diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts index 38468ce7c4..0e7a85e72e 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts @@ -42,6 +42,19 @@ import { UserQuery } from '../../shared/user/user.query'; import { RegisterWorkflowModalService } from '../../workflow/register-workflow-modal/register-workflow-modal.service'; import { MyWorkflowsService } from '../myworkflows.service'; import { Dockstore } from '../../shared/dockstore.model'; +import { WorkflowComponent } from '../../workflow/workflow.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSidenavModule } from '@angular/material/sidenav'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { HeaderComponent } from '../../header/header.component'; +import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; /** * How the workflow selection works: @@ -63,6 +76,24 @@ import { Dockstore } from '../../shared/dockstore.model'; selector: 'app-my-workflow', templateUrl: './my-workflow.component.html', styleUrls: ['../../shared/styles/my-entry.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + MatLegacyButtonModule, + MatIconModule, + NgIf, + MatSidenavModule, + MatLegacyTooltipModule, + MatLegacyMenuModule, + SidebarAccordionComponent, + MatLegacyCardModule, + FontAwesomeModule, + WorkflowComponent, + AsyncPipe, + TitleCasePipe, + ], }) export class MyWorkflowComponent extends MyEntry implements OnInit { Dockstore = Dockstore; diff --git a/src/app/myworkflows/myworkflows.module.ts b/src/app/myworkflows/myworkflows.module.ts deleted file mode 100644 index 8d4dc55248..0000000000 --- a/src/app/myworkflows/myworkflows.module.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { SharedWorkflowServicesNotebooksModule } from '../shared-workflow-services-notebooks/shared-workflow-services-notebooks.module'; -import { myworkflowRouting } from './myworkflows.routing'; -import { GitHubAppsLogsModule } from './sidebar-accordion/github-apps-logs/github-apps-logs.module'; - -@NgModule({ - imports: [SharedWorkflowServicesNotebooksModule, myworkflowRouting, GitHubAppsLogsModule], -}) -export class MyWorkflowsModule {} diff --git a/src/app/myworkflows/myworkflows.routing.ts b/src/app/myworkflows/myworkflows.routing.ts index c9ab572450..fbbb6812d3 100644 --- a/src/app/myworkflows/myworkflows.routing.ts +++ b/src/app/myworkflows/myworkflows.routing.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from '../shared/enum/entry-type'; import { MyWorkflowComponent } from './my-workflow/my-workflow.component'; @@ -24,4 +24,4 @@ const routes: Routes = [ data: { title: 'Dockstore | My Workflows', entryType: EntryType.BioWorkflow }, }, ]; -export const myworkflowRouting = RouterModule.forChild(routes); +export const myworkflowRouting = routes; diff --git a/src/app/myworkflows/myworkflows.service.spec.ts b/src/app/myworkflows/myworkflows.service.spec.ts index 69e16847fb..6de22a876e 100644 --- a/src/app/myworkflows/myworkflows.service.spec.ts +++ b/src/app/myworkflows/myworkflows.service.spec.ts @@ -15,20 +15,26 @@ */ import { inject, TestBed } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { WorkflowService } from 'app/shared/state/workflow.service'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; import { UsersService, WorkflowsService } from 'app/shared/openapi'; +import { WorkflowService } from 'app/shared/state/workflow.service'; import { UrlResolverService } from 'app/shared/url-resolver.service'; -import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; import { + DateStubService, + EntryTypeMetadataStubService, + ProviderStubService, UrlResolverStubService, UsersStubService, WorkflowsStubService, WorkflowStubService, - EntryTypeMetadataStubService, } from 'app/test/service-stubs'; +import { DateService } from '../shared/date.service'; +import { ProviderService } from '../shared/provider.service'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; import { Workflow } from './../shared/openapi/model/workflow'; import { OrgWorkflowObject } from './my-workflow/my-workflow.component'; import { MyWorkflowsService } from './myworkflows.service'; @@ -152,14 +158,17 @@ describe('MyWorkflowsService', () => { const expectedResult: OrgWorkflowObject[] = [expectedResult1, expectedResult2, expectedResult3]; beforeEach(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule, RouterTestingModule, MyEntriesModule], + imports: [RouterTestingModule, MatLegacySnackBarModule, MatLegacyDialogModule], providers: [ - MyWorkflowsService, + { provide: DateService, useClass: DateStubService }, { provide: UrlResolverService, useClass: UrlResolverStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, { provide: UsersService, useClass: UsersStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, + { provide: ProviderService, useClass: ProviderStubService }, + MyEntriesStateService, + MyEntriesStore, ], }); }); diff --git a/src/app/myworkflows/myworkflows.service.ts b/src/app/myworkflows/myworkflows.service.ts index 2ceda97fca..989f2a89d5 100644 --- a/src/app/myworkflows/myworkflows.service.ts +++ b/src/app/myworkflows/myworkflows.service.ts @@ -42,7 +42,9 @@ import { catchError, finalize } from 'rxjs/operators'; import { OrgWorkflowObject } from './my-workflow/my-workflow.component'; import { Location } from '@angular/common'; -@Injectable() +@Injectable({ + providedIn: 'root', +}) export class MyWorkflowsService extends MyEntriesService> { constructor( protected userQuery: UserQuery, diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts index 6613dc6ecc..612d68dd22 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts @@ -1,8 +1,8 @@ import { animate, state, style, transition, trigger } from '@angular/animations'; import { AfterViewInit, Component, ElementRef, Inject, OnInit, ViewChild } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; -import { MatLegacyPaginator as MatPaginator } from '@angular/material/legacy-paginator'; -import { MatSort } from '@angular/material/sort'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacyPaginator as MatPaginator, MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatSort, MatSortModule } from '@angular/material/sort'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { LambdaEvent, LambdaEventsService } from 'app/shared/openapi'; import { fromEvent, merge, Observable } from 'rxjs'; @@ -11,6 +11,20 @@ import { Base } from '../../../shared/base'; import { formInputDebounceTime } from '../../../shared/constants'; import { PaginatorService } from '../../../shared/state/paginator.service'; import { LambdaEventDataSource, ShowContent } from './lambda-events-datasource'; +import { MapFriendlyValuesPipe } from '../../../search/map-friendly-values.pipe'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { SnackbarDirective } from '../../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgSwitch, NgSwitchCase, NgSwitchDefault, AsyncPipe, TitleCasePipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../../shared/loading/loading.component'; /** * Based on https://material.angular.io/components/table/examples example with expandable rows @@ -30,6 +44,33 @@ import { LambdaEventDataSource, ShowContent } from './lambda-events-datasource'; transition('expanded <=> void', animate('225ms cubic-bezier(0.4, 0.0, 0.2, 1)')), ]), ], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + RouterLink, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + NgFor, + NgSwitch, + NgSwitchCase, + FlexModule, + MatLegacyButtonModule, + SnackbarDirective, + MatLegacyTooltipModule, + ClipboardModule, + NgSwitchDefault, + MatLegacyPaginatorModule, + AsyncPipe, + TitleCasePipe, + DatePipe, + MapFriendlyValuesPipe, + ], }) export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewInit { columnsToDisplay: string[]; diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts deleted file mode 100644 index 6c6d6f0633..0000000000 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -/* - * Copyright 2020 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { PipeModule } from '../../../shared/pipe/pipe.module'; -import { SnackbarModule } from '../../../shared/modules/snackbar.module'; -import { GithubAppsLogsComponent } from './github-apps-logs.component'; - -@NgModule({ - imports: [ - CustomMaterialModule, - CommonModule, - RefreshAlertModule, - FlexLayoutModule, - PipeModule, - RouterModule, - ClipboardModule, - SnackbarModule, - ], - declarations: [GithubAppsLogsComponent], -}) -export class GitHubAppsLogsModule {} diff --git a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts index d74b296b97..c15f8a895c 100644 --- a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts +++ b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.spec.ts @@ -1,16 +1,15 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacyDialogModule, MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { RefreshWorkflowOrganizationComponent } from 'app/workflow/refresh-workflow-organization/refresh-workflow-organization.component'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; import { RefreshService } from '../../shared/refresh.service'; import { WorkflowService } from '../../shared/state/workflow.service'; import { RefreshStubService, RegisterWorkflowModalStubService, WorkflowStubService } from './../../test/service-stubs'; import { RegisterWorkflowModalService } from './../../workflow/register-workflow-modal/register-workflow-modal.service'; import { SidebarAccordionComponent } from './sidebar-accordion.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; describe('SidebarAccordionComponent', () => { let component: SidebarAccordionComponent; @@ -19,8 +18,14 @@ describe('SidebarAccordionComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SidebarAccordionComponent, RefreshWorkflowOrganizationComponent, SelectTabPipe], - imports: [HttpClientTestingModule, CustomMaterialModule, RouterTestingModule], + imports: [ + HttpClientTestingModule, + RouterTestingModule, + SidebarAccordionComponent, + RefreshWorkflowOrganizationComponent, + SelectTabPipe, + MatLegacyDialogModule, + ], providers: [ { provide: RegisterWorkflowModalService, diff --git a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts index b40dadb453..588cb7c2d1 100644 --- a/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts +++ b/src/app/myworkflows/sidebar-accordion/sidebar-accordion.component.ts @@ -25,8 +25,18 @@ import { Observable } from 'rxjs'; import { WorkflowQuery } from '../../shared/state/workflow.query'; import { OrgWorkflowObject } from '../my-workflow/my-workflow.component'; import { GithubAppsLogsComponent } from './github-apps-logs/github-apps-logs.component'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgFor, NgIf, NgClass, NgTemplateOutlet, AsyncPipe, KeyValuePipe } from '@angular/common'; import { MetadataService } from '../../shared/openapi/api/metadata.service'; +import { SelectTabPipe } from '../../shared/entry/select-tab.pipe'; +import { RefreshWorkflowOrganizationComponent } from '../../workflow/refresh-workflow-organization/refresh-workflow-organization.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { RouterLink } from '@angular/router'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyListModule } from '@angular/material/legacy-list'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatExpansionModule } from '@angular/material/expansion'; interface GroupEntriesBySource { groupEntryInfo: OrgWorkflowObject[]; @@ -41,6 +51,25 @@ interface GroupEntriesBySource { '../../mytools/sidebar-accordion/sidebar-accordion.component.scss', '../../shared/styles/my-entry-sidebar.scss', ], + standalone: true, + imports: [ + NgFor, + NgIf, + MatExpansionModule, + MatLegacyTabsModule, + ExtendedModule, + NgClass, + NgTemplateOutlet, + MatLegacyListModule, + MatIconModule, + RouterLink, + FlexModule, + MatLegacyButtonModule, + RefreshWorkflowOrganizationComponent, + AsyncPipe, + KeyValuePipe, + SelectTabPipe, + ], }) export class SidebarAccordionComponent implements OnInit, OnChanges { @Input() openOneAtATime; diff --git a/src/app/navbar/navbar.component.spec.ts b/src/app/navbar/navbar.component.spec.ts index 3cef98928d..fccd8adbcc 100644 --- a/src/app/navbar/navbar.component.spec.ts +++ b/src/app/navbar/navbar.component.spec.ts @@ -38,7 +38,6 @@ describe('NavbarComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [NavbarComponent], imports: [ RouterTestingModule, MatMenuModule, @@ -48,6 +47,7 @@ describe('NavbarComponent', () => { MatDividerModule, MatToolbarModule, HttpClientTestingModule, + NavbarComponent, ], schemas: [NO_ERRORS_SCHEMA], providers: [ diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts index 70af820893..4c1b3bec31 100644 --- a/src/app/navbar/navbar.component.ts +++ b/src/app/navbar/navbar.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { NavigationEnd, Router } from '@angular/router'; +import { NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/router'; import { Observable, Subject, combineLatest } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import { Logout } from '../loginComponents/logout'; @@ -30,11 +30,35 @@ import { TrackLoginService } from './../shared/track-login.service'; import { Organization, OrganizationUser } from '../shared/openapi'; import { RequestsQuery } from '../loginComponents/state/requests.query'; import { RequestsService } from '../loginComponents/state/requests.service'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatIconModule } from '@angular/material/icon'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgClass, NgIf, NgTemplateOutlet, AsyncPipe } from '@angular/common'; +import { MatToolbarModule } from '@angular/material/toolbar'; @Component({ selector: 'app-navbar', templateUrl: './navbar.component.html', styleUrls: ['./navbar.component.scss'], + standalone: true, + imports: [ + MatToolbarModule, + NgClass, + ExtendedModule, + RouterLink, + MatLegacyButtonModule, + RouterLinkActive, + NgIf, + FlexModule, + MatIconModule, + MatBadgeModule, + NgTemplateOutlet, + MatLegacyMenuModule, + AsyncPipe, + ], }) export class NavbarComponent extends Logout implements OnInit { public user: User; diff --git a/src/app/notebook/notebook-markdown.component.ts b/src/app/notebook/notebook-markdown.component.ts index e8778b5bd0..7301fd1dff 100644 --- a/src/app/notebook/notebook-markdown.component.ts +++ b/src/app/notebook/notebook-markdown.component.ts @@ -3,11 +3,14 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; import { MarkdownWrapperService } from '../shared/markdown-wrapper/markdown-wrapper.service'; import { join, replaceAll, selectBestFromMimeBundle } from './notebook-helpers'; import { Attachments, Cell } from './notebook-types'; +import { NgIf } from '@angular/common'; import './mathjax'; @Component({ selector: 'app-notebook-markdown', templateUrl: './notebook-markdown.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookMarkdownComponent implements OnChanges { @Input() cell: Cell; diff --git a/src/app/notebook/notebook-mime-bundle-output.component.ts b/src/app/notebook/notebook-mime-bundle-output.component.ts index 8e7ace5512..84fa3add03 100644 --- a/src/app/notebook/notebook-mime-bundle-output.component.ts +++ b/src/app/notebook/notebook-mime-bundle-output.component.ts @@ -2,10 +2,13 @@ import { Component, Input, OnChanges } from '@angular/core'; import { MarkdownWrapperService } from '../shared/markdown-wrapper/markdown-wrapper.service'; import { escape, selectBestFromMimeBundle } from './notebook-helpers'; import { MimeBundle, Output, OutputMetadata } from './notebook-types'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-notebook-mime-bundle-output', templateUrl: './notebook-mime-bundle-output.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookMimeBundleOutputComponent implements OnChanges { @Input() output: Output; diff --git a/src/app/notebook/notebook-source.component.ts b/src/app/notebook/notebook-source.component.ts index 15b1318c9d..7f047c7d18 100644 --- a/src/app/notebook/notebook-source.component.ts +++ b/src/app/notebook/notebook-source.component.ts @@ -1,11 +1,14 @@ import { Component, Input, OnChanges } from '@angular/core'; import { escape, join } from './notebook-helpers'; import { Cell } from './notebook-types'; +import { NgIf } from '@angular/common'; import './prism'; @Component({ selector: 'app-notebook-source', templateUrl: './notebook-source.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookSourceComponent implements OnChanges { @Input() cell: Cell; diff --git a/src/app/notebook/notebook-stream-output.component.ts b/src/app/notebook/notebook-stream-output.component.ts index e69a9351dc..f3a1be36e7 100644 --- a/src/app/notebook/notebook-stream-output.component.ts +++ b/src/app/notebook/notebook-stream-output.component.ts @@ -1,10 +1,13 @@ import { Component, Input, OnChanges } from '@angular/core'; import { join } from './notebook-helpers'; import { Output } from './notebook-types'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-notebook-stream-output', templateUrl: './notebook-stream-output.component.html', + standalone: true, + imports: [NgIf], }) export class NotebookStreamOutputComponent implements OnChanges { @Input() output: Output; diff --git a/src/app/notebook/notebook.component.spec.ts b/src/app/notebook/notebook.component.spec.ts index 20895ac358..d13a5eaef1 100644 --- a/src/app/notebook/notebook.component.spec.ts +++ b/src/app/notebook/notebook.component.spec.ts @@ -20,14 +20,14 @@ describe('NotebookComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ + imports: [ + HttpClientTestingModule, NotebookComponent, NotebookMarkdownComponent, NotebookSourceComponent, NotebookStreamOutputComponent, NotebookMimeBundleOutputComponent, ], - imports: [HttpClientTestingModule], providers: [ { provide: WorkflowsService, diff --git a/src/app/notebook/notebook.component.ts b/src/app/notebook/notebook.component.ts index 3525f91962..f908cfea20 100644 --- a/src/app/notebook/notebook.component.ts +++ b/src/app/notebook/notebook.component.ts @@ -3,6 +3,11 @@ import { finalize } from 'rxjs/operators'; import { Subscription } from 'rxjs'; import { SourceFile, Workflow, WorkflowVersion, WorkflowsService } from 'app/shared/openapi'; import { Cell } from './notebook-types'; +import { NotebookMimeBundleOutputComponent } from './notebook-mime-bundle-output.component'; +import { NotebookStreamOutputComponent } from './notebook-stream-output.component'; +import { NotebookSourceComponent } from './notebook-source.component'; +import { NotebookMarkdownComponent } from './notebook-markdown.component'; +import { NgIf, NgFor } from '@angular/common'; /** * Convert the specified notebook to user-friendly preview that represents it. @@ -14,6 +19,15 @@ import { Cell } from './notebook-types'; @Component({ selector: 'app-notebook', templateUrl: './notebook.component.html', + standalone: true, + imports: [ + NgIf, + NgFor, + NotebookMarkdownComponent, + NotebookSourceComponent, + NotebookStreamOutputComponent, + NotebookMimeBundleOutputComponent, + ], }) export class NotebookComponent implements OnChanges { constructor(private workflowsService: WorkflowsService) {} diff --git a/src/app/notifications/sitewide-notifications.component.ts b/src/app/notifications/sitewide-notifications.component.ts index a3f559f87a..ad1e67fcda 100644 --- a/src/app/notifications/sitewide-notifications.component.ts +++ b/src/app/notifications/sitewide-notifications.component.ts @@ -2,11 +2,18 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; import { Notification } from '../shared/openapi/model/notification'; import { NotificationsService } from './state/notifications.service'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../shared/markdown-wrapper/markdown-wrapper.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-sitewide-notifications', templateUrl: './sitewide-notifications.component.html', styleUrls: ['./sitewide-notifications.component.scss'], + standalone: true, + imports: [NgFor, FlexModule, MarkdownWrapperComponent, MatLegacyButtonModule, MatIconModule, AsyncPipe], }) export class SitewideNotificationsComponent implements OnInit { public activeNotifications$: Observable>; diff --git a/src/app/notifications/state/notifications.service.spec.ts b/src/app/notifications/state/notifications.service.spec.ts index 8c476ee244..dce3ea7d75 100644 --- a/src/app/notifications/state/notifications.service.spec.ts +++ b/src/app/notifications/state/notifications.service.spec.ts @@ -1,5 +1,7 @@ +import { HttpClient } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { NotificationsService } from './notifications.service'; import { NotificationsStore } from './notifications.store'; import { expiredMockNotification, mockedNotification } from '../../test/mocked-objects'; diff --git a/src/app/organizations/collection/add-entry.module.ts b/src/app/organizations/collection/add-entry.module.ts index 53eda4aaf8..446af09a57 100644 --- a/src/app/organizations/collection/add-entry.module.ts +++ b/src/app/organizations/collection/add-entry.module.ts @@ -17,12 +17,10 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FlexLayoutModule } from '@ngbracket/ngx-layout'; import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; + import { AddEntryComponent } from './add-entry/add-entry.component'; @NgModule({ - imports: [CommonModule, CustomMaterialModule, CurrentCollectionsModule, FlexLayoutModule, RefreshAlertModule], - declarations: [AddEntryComponent], + imports: [CommonModule, CurrentCollectionsModule, FlexLayoutModule, AddEntryComponent], }) export class AddEntryModule {} diff --git a/src/app/organizations/collection/add-entry/add-entry.component.ts b/src/app/organizations/collection/add-entry/add-entry.component.ts index b02556596d..f080fa61ba 100644 --- a/src/app/organizations/collection/add-entry/add-entry.component.ts +++ b/src/app/organizations/collection/add-entry/add-entry.component.ts @@ -1,14 +1,42 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { Collection, OrganizationUser } from '../../../shared/openapi'; import { AddEntryQuery } from '../state/add-entry.query'; import { AddEntryService } from '../state/add-entry.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../../shared/loading/loading.component'; @Component({ selector: 'app-add-entry', templateUrl: './add-entry.component.html', styleUrls: ['./add-entry.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + FlexModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class AddEntryComponent implements OnInit { public memberships$: Observable>; diff --git a/src/app/organizations/collection/collection.component.ts b/src/app/organizations/collection/collection.component.ts index d65cfd2419..6cdf02c3f9 100644 --- a/src/app/organizations/collection/collection.component.ts +++ b/src/app/organizations/collection/collection.component.ts @@ -1,5 +1,9 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialog as MatDialog, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { bootstrap4mediumModalSize } from '../../shared/constants'; import { Dockstore } from '../../shared/dockstore.model'; @@ -20,10 +24,30 @@ import { OrganizationQuery } from '../state/organization.query'; import { EntryType } from 'app/shared/enum/entry-type'; import { HttpErrorResponse } from '@angular/common/http'; import { AlertService } from '../../shared/alert/state/alert.service'; +import { AlertComponent } from '../../shared/alert/alert.component'; +import { RouterLinkPipe } from '../../entry/router-link.pipe'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MapFriendlyValuesPipe } from '../../search/map-friendly-values.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { CategoryButtonComponent } from '../../categories/button/category-button.component'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgClass, AsyncPipe, DatePipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-collection-entry-confirm-remove', templateUrl: 'collection-entry-confirm-remove.html', + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule], }) export class CollectionRemoveEntryDialogComponent { constructor(@Inject(MAT_DIALOG_DATA) public data: EntryDialogData, private collectionsService: CollectionsService) {} @@ -51,6 +75,30 @@ export interface EntryDialogData { selector: 'app-collection', templateUrl: './collection.component.html', styleUrls: ['./collection.component.scss', '../organization/organization.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + RouterLink, + ExtendedModule, + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + ImgFallbackDirective, + MatLegacyTooltipModule, + MatLegacyButtonModule, + NgFor, + MatLegacyChipsModule, + CategoryButtonComponent, + NgClass, + MarkdownWrapperComponent, + AsyncPipe, + DatePipe, + MapFriendlyValuesPipe, + GravatarPipe, + RouterLinkPipe, + ], }) export class CollectionComponent implements OnInit { entryType = EntryType; diff --git a/src/app/organizations/collection/state/add-entry.service.spec.ts b/src/app/organizations/collection/state/add-entry.service.spec.ts index 71057156bb..7c96f6033c 100644 --- a/src/app/organizations/collection/state/add-entry.service.spec.ts +++ b/src/app/organizations/collection/state/add-entry.service.spec.ts @@ -1,6 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AddEntryService } from './add-entry.service'; import { AddEntryStore } from './add-entry.store'; @@ -10,7 +10,7 @@ describe('AddEntryService', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [AddEntryService, AddEntryStore], - imports: [HttpClientTestingModule, CustomMaterialModule], + imports: [HttpClientTestingModule, MatLegacySnackBarModule], }); addEntryService = TestBed.inject(AddEntryService); diff --git a/src/app/organizations/collections.module.ts b/src/app/organizations/collections.module.ts deleted file mode 100644 index b4c567efff..0000000000 --- a/src/app/organizations/collections.module.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RouterModule } from '@angular/router'; - -import { MarkdownModule } from 'ngx-markdown'; -import { CategoryButtonModule } from '../categories/button/category-button.module'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { CollectionComponent, CollectionRemoveEntryDialogComponent } from './collection/collection.component'; -import { CollectionsComponent } from './collections/collections.component'; -import { CreateCollectionModule } from './collections/create-collection.module'; -import { RemoveCollectionDialogComponent } from './collections/remove-collection/remove-collection.component'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; - -@NgModule({ - imports: [ - CommonModule, - CreateCollectionModule, - CustomMaterialModule, - FlexLayoutModule, - HeaderModule, - RefreshAlertModule, - RouterModule, - MarkdownModule, - UpdateOrganizationDescriptionModule, - MarkdownWrapperModule, - CategoryButtonModule, - ImgFallbackModule, - PipeModule, - PreviewWarningModule, - ], - declarations: [CollectionsComponent, CollectionComponent, CollectionRemoveEntryDialogComponent, RemoveCollectionDialogComponent], - exports: [CollectionsComponent, CollectionComponent], -}) -export class CollectionsModule {} diff --git a/src/app/organizations/collections/collections.component.ts b/src/app/organizations/collections/collections.component.ts index df481328c6..32d2b7b3f5 100644 --- a/src/app/organizations/collections/collections.component.ts +++ b/src/app/organizations/collections/collections.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { P } from '@angular/cdk/keycodes'; -import { KeyValue } from '@angular/common'; +import { KeyValue, NgIf, NgFor, AsyncPipe, JsonPipe, KeyValuePipe } from '@angular/common'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { HashMap } from '@datorama/akita'; @@ -26,11 +26,33 @@ import { CollectionsService } from '../state/collections.service'; import { OrganizationQuery } from '../state/organization.query'; import { CreateCollectionComponent } from './create-collection/create-collection.component'; import { Dockstore } from '../../shared/dockstore.model'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-collections', templateUrl: './collections.component.html', styleUrls: ['./collections.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + LoadingComponent, + MatLegacyCardModule, + FlexModule, + NgFor, + RouterLink, + AsyncPipe, + JsonPipe, + KeyValuePipe, + ], }) export class CollectionsComponent implements OnInit, OnChanges { public Dockstore = Dockstore; diff --git a/src/app/organizations/collections/create-collection.module.ts b/src/app/organizations/collections/create-collection.module.ts deleted file mode 100644 index 2e83bef608..0000000000 --- a/src/app/organizations/collections/create-collection.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { CreateCollectionComponent } from './create-collection/create-collection.component'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule], - declarations: [CreateCollectionComponent], -}) -export class CreateCollectionModule {} diff --git a/src/app/organizations/collections/create-collection/create-collection.component.ts b/src/app/organizations/collections/create-collection/create-collection.component.ts index 8914bc7edc..92e7a5c25f 100644 --- a/src/app/organizations/collections/create-collection/create-collection.component.ts +++ b/src/app/organizations/collections/create-collection/create-collection.component.ts @@ -1,7 +1,7 @@ -import { KeyValue } from '@angular/common'; +import { KeyValue, NgIf, AsyncPipe } from '@angular/common'; import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { HashMap } from '@datorama/akita'; import { NgFormsManager } from '@ngneat/forms-manager'; import { Observable } from 'rxjs'; @@ -10,6 +10,12 @@ import { Collection } from '../../../shared/openapi'; import { CreateCollectionQuery } from '../state/create-collection.query'; import { CreateCollectionService, FormsState } from '../state/create-collection.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; /** * This is actually both create and update collection dialog @@ -21,6 +27,20 @@ import { CreateCollectionService, FormsState } from '../state/create-collection. */ @Component({ templateUrl: './create-collection.component.html', + standalone: true, + imports: [ + NgIf, + MatLegacyDialogModule, + AlertComponent, + FormsModule, + FlexModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + AsyncPipe, + ], }) export class CreateCollectionComponent implements OnInit, OnDestroy { createCollectionForm: UntypedFormGroup; diff --git a/src/app/organizations/collections/remove-collection/remove-collection.component.ts b/src/app/organizations/collections/remove-collection/remove-collection.component.ts index 974960e4f3..634a91695a 100644 --- a/src/app/organizations/collections/remove-collection/remove-collection.component.ts +++ b/src/app/organizations/collections/remove-collection/remove-collection.component.ts @@ -14,14 +14,21 @@ * limitations under the License. */ import { Component, Inject } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { CollectionsService } from '../../state/collections.service'; import { CollectionsQuery } from '../../state/collections.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-collection-confirm-remove', templateUrl: './remove-collection.component.html', + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, FlexModule, MatLegacyButtonModule, MatLegacyTooltipModule, AsyncPipe], }) export class RemoveCollectionDialogComponent { public collectionsQueryLoading$: Observable; diff --git a/src/app/organizations/events.module.ts b/src/app/organizations/events.module.ts deleted file mode 100644 index a9dce469a5..0000000000 --- a/src/app/organizations/events.module.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RouterModule } from '@angular/router'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from './../shared/modules/material.module'; -import { EventsComponent } from './events/events.component'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RouterModule, RefreshAlertModule], - declarations: [EventsComponent], - exports: [EventsComponent], -}) -export class EventsModule {} diff --git a/src/app/organizations/events/events.component.ts b/src/app/organizations/events/events.component.ts index d544691695..5b5c52aa03 100644 --- a/src/app/organizations/events/events.component.ts +++ b/src/app/organizations/events/events.component.ts @@ -3,11 +3,31 @@ import { Observable } from 'rxjs'; import { Event } from '../../shared/openapi'; import { EventsQuery } from '../state/events.query'; import { EventsService } from '../state/events.service'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { NgFor, NgIf, AsyncPipe, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-events', templateUrl: './events.component.html', styleUrls: ['./events.component.scss'], + standalone: true, + imports: [ + MatLegacyCardModule, + LoadingComponent, + FlexModule, + NgFor, + MatLegacyChipsModule, + MatLegacyTooltipModule, + RouterLink, + NgIf, + AsyncPipe, + DatePipe, + ], }) export class EventsComponent implements OnInit, OnChanges { @Input() organizationID: number; diff --git a/src/app/organizations/organization-members.module.ts b/src/app/organizations/organization-members.module.ts deleted file mode 100644 index 1daa55e4cb..0000000000 --- a/src/app/organizations/organization-members.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RouterModule } from '@angular/router'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { OrganizationMembersComponent } from './organization-members/organization-members.component'; -import { UpsertOrganizationMemberModule } from './upsert-organization-member.module'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, RefreshAlertModule, UpsertOrganizationMemberModule, RouterModule], - declarations: [OrganizationMembersComponent], - exports: [OrganizationMembersComponent], -}) -export class OrganizationMembersModule {} diff --git a/src/app/organizations/organization-members/organization-members.component.ts b/src/app/organizations/organization-members/organization-members.component.ts index 0d216d7f57..ee1eebb606 100644 --- a/src/app/organizations/organization-members/organization-members.component.ts +++ b/src/app/organizations/organization-members/organization-members.component.ts @@ -30,11 +30,36 @@ import { OrganizationMembersService } from '../state/organization-members.servic import { OrganizationQuery } from '../state/organization.query'; import { UpsertOrganizationMemberComponent } from '../upsert-organization-member/upsert-organization-member.component'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, NgFor, NgClass, AsyncPipe, TitleCasePipe } from '@angular/common'; @Component({ selector: 'app-organization-members', templateUrl: './organization-members.component.html', styleUrls: ['./organization-members.component.scss'], + standalone: true, + imports: [ + NgIf, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + LoadingComponent, + NgFor, + MatLegacyCardModule, + RouterLink, + NgClass, + ExtendedModule, + AsyncPipe, + TitleCasePipe, + ], }) export class OrganizationMembersComponent extends Base implements OnInit { OrganizationUser = OrganizationUser; diff --git a/src/app/organizations/organization.module.ts b/src/app/organizations/organization.module.ts deleted file mode 100644 index 733b734ee6..0000000000 --- a/src/app/organizations/organization.module.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RouterModule } from '@angular/router'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { MarkdownWrapperModule } from '../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { CollectionsModule } from './collections.module'; -import { EventsModule } from './events.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { OrganizationMembersModule } from './organization-members.module'; -import { OrganizationStargazersModule } from './organization/organization-stargazers/organization-stargazers.module'; -import { OrganizationStarringModule } from './organization/organization-starring/organization-starring.module'; -import { OrganizationComponent } from './organization/organization.component'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; - -@NgModule({ - imports: [ - CollectionsModule, - CommonModule, - FlexLayoutModule, - HeaderModule, - CustomMaterialModule, - OrganizationMembersModule, - UpdateOrganizationDescriptionModule, - EventsModule, - RouterModule, - RefreshAlertModule, - OrganizationStarringModule, - OrganizationStargazersModule, - MarkdownModule, - PipeModule, - MarkdownWrapperModule, - ImgFallbackModule, - PreviewWarningModule, - ], - declarations: [OrganizationComponent], - exports: [OrganizationComponent], -}) -export class OrganizationModule {} diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts index 219bda9d69..8a4d4e6816 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.spec.ts @@ -29,8 +29,7 @@ describe('OrganizationStargazersComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [OrganizationStargazersComponent], - imports: [MatIconModule, MatCardModule], + imports: [MatIconModule, MatCardModule, OrganizationStargazersComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: OrganizationStarringService, useClass: OrganizationStarringStubService }, diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts index 9bd9f4fcbf..cf0885adb5 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.component.ts @@ -22,11 +22,18 @@ import { User } from '../../../shared/openapi'; import { UserService } from '../../../shared/user/user.service'; import { OrganizationStarringService } from '../organization-starring/organization-starring.service'; import { altAvatarImg } from 'app/shared/constants'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-organization-stargazers', templateUrl: '../../../stargazers/stargazers.component.html', styleUrls: ['../../../stargazers/stargazers.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, FlexModule, NgFor, RouterLink], }) export class OrganizationStargazersComponent extends Base implements OnInit { starGazers: Array; diff --git a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts index ca58626ea5..c4953c2d1b 100644 --- a/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts +++ b/src/app/organizations/organization/organization-stargazers/organization-stargazers.module.ts @@ -16,7 +16,7 @@ import { CommonModule } from '@angular/common'; import { NgModule } from '@angular/core'; import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; + import { RouterModule } from '@angular/router'; import { StarOrganizationService } from '../../../shared/star-organization.service'; @@ -24,8 +24,7 @@ import { OrganizationStarringService } from '../organization-starring/organizati import { OrganizationStargazersComponent } from './organization-stargazers.component'; @NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, RouterModule], - declarations: [OrganizationStargazersComponent], + imports: [CommonModule, FlexLayoutModule, RouterModule, OrganizationStargazersComponent], exports: [OrganizationStargazersComponent], providers: [OrganizationStarringService, StarOrganizationService], }) diff --git a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts index 7c32f896e2..ec583119bb 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts @@ -43,8 +43,7 @@ describe('OrganizationStarringComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatIconModule, MatSnackBarModule, MatTooltipModule], - declarations: [OrganizationStarringComponent], + imports: [MatIconModule, MatSnackBarModule, MatTooltipModule, OrganizationStarringComponent], providers: [ { provide: TrackLoginService, useClass: TrackLoginStubService }, { provide: OrganizationStarringService, useClass: OrganizationStarringStubService }, diff --git a/src/app/organizations/organization/organization-starring/organization-starring.component.ts b/src/app/organizations/organization/organization-starring/organization-starring.component.ts index 6632dc27de..7b568c3fbd 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.component.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.component.ts @@ -25,11 +25,16 @@ import { Organization, User } from '../../../shared/openapi'; import { TrackLoginService } from '../../../shared/track-login.service'; import { UserQuery } from '../../../shared/user/user.query'; import { OrganizationStarringService } from './organization-starring.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgClass, NgIf } from '@angular/common'; @Component({ selector: 'app-organization-starring', templateUrl: '../../../starring/starring.component.html', styleUrls: ['../../../starring/starring.component.scss'], + standalone: true, + imports: [NgClass, NgIf, MatIconModule, MatLegacyTooltipModule], }) export class OrganizationStarringComponent extends Base implements OnInit, OnDestroy, OnChanges { @Input() organization: Organization; diff --git a/src/app/organizations/organization/organization-starring/organization-starring.module.ts b/src/app/organizations/organization/organization-starring/organization-starring.module.ts index c35c4df231..c9270ede14 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.module.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.module.ts @@ -23,8 +23,7 @@ import { OrganizationStarringComponent } from './organization-starring.component import { OrganizationStarringService } from './organization-starring.service'; @NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [OrganizationStarringComponent], + imports: [CommonModule, MatIconModule, MatTooltipModule, OrganizationStarringComponent], exports: [OrganizationStarringComponent], providers: [OrganizationStarringService, StarOrganizationService], }) diff --git a/src/app/organizations/organization/organization.component.ts b/src/app/organizations/organization/organization.component.ts index 33b07fa4cb..8a10082e6b 100644 --- a/src/app/organizations/organization/organization.component.ts +++ b/src/app/organizations/organization/organization.component.ts @@ -33,11 +33,55 @@ import { OrganizationService } from '../state/organization.service'; // eslint-disable-next-line max-len import { UpdateOrganizationOrCollectionDescriptionComponent } from './update-organization-description/update-organization-description.component'; import { Dockstore } from '../../shared/dockstore.model'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { EventsComponent } from '../events/events.component'; +import { OrganizationMembersComponent } from '../organization-members/organization-members.component'; +import { CollectionsComponent } from '../collections/collections.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { OrganizationStargazersComponent } from './organization-stargazers/organization-stargazers.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { OrganizationStarringComponent } from './organization-starring/organization-starring.component'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { JsonLdComponent } from '../../shared/json-ld/json-ld.component'; +import { LoadingComponent } from '../../shared/loading/loading.component'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-organization', templateUrl: './organization.component.html', styleUrls: ['./organization.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + RouterLink, + ExtendedModule, + NgIf, + LoadingComponent, + JsonLdComponent, + MatLegacyCardModule, + MatIconModule, + ImgFallbackDirective, + OrganizationStarringComponent, + MatLegacyButtonModule, + MatLegacyTooltipModule, + OrganizationStargazersComponent, + MatLegacyTabsModule, + CollectionsComponent, + OrganizationMembersComponent, + EventsComponent, + MarkdownWrapperComponent, + AsyncPipe, + GravatarPipe, + ], }) export class OrganizationComponent implements OnInit { public organizationStarGazersClicked = false; diff --git a/src/app/organizations/organization/time-ago-msg.pipe.ts b/src/app/organizations/organization/time-ago-msg.pipe.ts index 2999e08bbf..67871b648c 100644 --- a/src/app/organizations/organization/time-ago-msg.pipe.ts +++ b/src/app/organizations/organization/time-ago-msg.pipe.ts @@ -18,6 +18,7 @@ import { DateService } from '../../shared/date.service'; @Pipe({ name: 'timeAgoMessage', + standalone: true, }) export class TimeAgoMsgPipe implements PipeTransform { constructor(private dateService: DateService) {} diff --git a/src/app/organizations/organization/update-organization-description.module.ts b/src/app/organizations/organization/update-organization-description.module.ts deleted file mode 100644 index 341d59ad78..0000000000 --- a/src/app/organizations/organization/update-organization-description.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { ReactiveFormsModule } from '@angular/forms'; -import { MarkdownModule } from 'ngx-markdown'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { JsonLdModule } from '../../shared/modules/json-ld.module'; -import { MarkdownWrapperModule } from '../../shared/modules/markdown-wrapper.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { OrgSchemaService } from '../../shared/org-schema.service'; -import { StarOrganizationService } from '../../shared/star-organization.service'; -import { OrganizationStarringService } from './organization-starring/organization-starring.service'; -// eslint-disable-next-line max-len -import { UpdateOrganizationOrCollectionDescriptionComponent } from './update-organization-description/update-organization-description.component'; - -@NgModule({ - imports: [ - CommonModule, - FlexLayoutModule, - CustomMaterialModule, - JsonLdModule, - RefreshAlertModule, - ReactiveFormsModule, - MarkdownModule, - MarkdownWrapperModule, - ], - providers: [OrganizationStarringService, StarOrganizationService, OrgSchemaService], - declarations: [UpdateOrganizationOrCollectionDescriptionComponent], - exports: [JsonLdModule], -}) -export class UpdateOrganizationDescriptionModule {} diff --git a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts index d12d050375..b465ab16f5 100644 --- a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts +++ b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts @@ -14,12 +14,34 @@ * limitations under the License. */ import { Component, Inject, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { UpdateOrganizationOrCollectionDescriptionService } from '../state/update-organization-description.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MarkdownWrapperComponent } from '../../../shared/markdown-wrapper/markdown-wrapper.component'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ templateUrl: './update-organization-description.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatLegacyTabsModule, + FormsModule, + FlexModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MarkdownWrapperComponent, + MatLegacyButtonModule, + MatLegacyTooltipModule, + ], }) export class UpdateOrganizationOrCollectionDescriptionComponent implements OnInit { updateOrganizationOrCollectionDescriptionForm: UntypedFormGroup; diff --git a/src/app/organizations/organizations.module.ts b/src/app/organizations/organizations.module.ts deleted file mode 100644 index c3d5dbe322..0000000000 --- a/src/app/organizations/organizations.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { HeaderModule } from '../shared/modules/header.module'; -import { ImgFallbackModule } from '../shared/modules/img-fallback.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { OrganizationModule } from './organization.module'; -import { UpdateOrganizationDescriptionModule } from './organization/update-organization-description.module'; -import { OrganizationsRouting } from './organizations.routing'; -import { OrganizationsComponent } from './organizations/organizations.component'; -import { RegisterOrganizationModule } from './register-organization.module'; - -@NgModule({ - imports: [ - CommonModule, - FlexLayoutModule, - HeaderModule, - CustomMaterialModule, - OrganizationModule, - OrganizationsRouting, - ReactiveFormsModule, - RegisterOrganizationModule, - UpdateOrganizationDescriptionModule, - ImgFallbackModule, - PipeModule, - ], - declarations: [OrganizationsComponent], -}) -export class OrganizationsModule {} diff --git a/src/app/organizations/organizations.routing.ts b/src/app/organizations/organizations.routing.ts index b2b54aaf41..cb738a5f15 100644 --- a/src/app/organizations/organizations.routing.ts +++ b/src/app/organizations/organizations.routing.ts @@ -14,7 +14,8 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; +import { OrgSchemaService } from '../shared/org-schema.service'; import { CollectionComponent } from './collection/collection.component'; import { OrganizationComponent } from './organization/organization.component'; @@ -22,8 +23,13 @@ import { OrganizationsComponent } from './organizations/organizations.component' const ORGANIZATIONS_ROUTES: Routes = [ { path: '', component: OrganizationsComponent, data: { title: 'Dockstore | Organizations' } }, - { path: ':organizationName', component: OrganizationComponent, data: { title: 'Dockstore | Organization' } }, + { + path: ':organizationName', + component: OrganizationComponent, + data: { title: 'Dockstore | Organization' }, + providers: [OrgSchemaService], + }, { path: ':organizationName/collections/:collectionName', component: CollectionComponent, data: { title: 'Dockstore | Collection' } }, ]; -export const OrganizationsRouting = RouterModule.forChild(ORGANIZATIONS_ROUTES); +export const OrganizationsRouting = ORGANIZATIONS_ROUTES; diff --git a/src/app/organizations/organizations/organizations.component.ts b/src/app/organizations/organizations/organizations.component.ts index 31a985798c..20ac10e7e4 100644 --- a/src/app/organizations/organizations/organizations.component.ts +++ b/src/app/organizations/organizations/organizations.component.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { UntypedFormBuilder, UntypedFormGroup } from '@angular/forms'; +import { UntypedFormBuilder, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { LegacyPageEvent as PageEvent } from '@angular/material/legacy-paginator'; +import { LegacyPageEvent as PageEvent, MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, takeUntil } from 'rxjs/operators'; import { AlertQuery } from '../../shared/alert/state/alert.query'; @@ -28,11 +28,49 @@ import { OrganizationsQuery } from '../state/organizations.query'; import { OrganizationsStateService } from '../state/organizations.service'; import { RequireAccountsModalComponent } from '../registerOrganization/requireAccountsModal/require-accounts-modal.component'; import { OrgLogoService } from '../../shared/org-logo.service'; +import { GravatarPipe } from '../../gravatar/gravatar.pipe'; +import { ImgFallbackDirective } from '../../shared/img-fallback.directive'; +import { RouterLink } from '@angular/router'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../../header/header.component'; @Component({ selector: 'app-organizations', templateUrl: './organizations.component.html', styleUrls: ['./organizations.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + NgIf, + ExtendedModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + MatLegacyInputModule, + MatIconModule, + NgFor, + MatLegacyCardModule, + RouterLink, + ImgFallbackDirective, + MatLegacyPaginatorModule, + AsyncPipe, + GravatarPipe, + ], }) export class OrganizationsComponent extends Base implements OnInit { public orgLength$: Observable; diff --git a/src/app/organizations/register-organization.module.ts b/src/app/organizations/register-organization.module.ts deleted file mode 100644 index d78c6fffe3..0000000000 --- a/src/app/organizations/register-organization.module.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { AlertService } from '../shared/alert/state/alert.service'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { RegisterOrganizationComponent } from './registerOrganization/register-organization.component'; -import { RouterModule } from '@angular/router'; -import { RequireAccountsModalComponent } from './registerOrganization/requireAccountsModal/require-accounts-modal.component'; -import { FlexModule } from '@ngbracket/ngx-layout'; - -@NgModule({ - imports: [CommonModule, FormsModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule, RouterModule, FlexModule], - declarations: [RegisterOrganizationComponent, RequireAccountsModalComponent], - providers: [AlertService], -}) -export class RegisterOrganizationModule {} diff --git a/src/app/organizations/registerOrganization/register-organization.component.ts b/src/app/organizations/registerOrganization/register-organization.component.ts index 6e7eb92df1..5fa4cae289 100644 --- a/src/app/organizations/registerOrganization/register-organization.component.ts +++ b/src/app/organizations/registerOrganization/register-organization.component.ts @@ -14,13 +14,20 @@ * limitations under the License. */ import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { Organization } from 'app/shared/openapi'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { FormsState, RegisterOrganizationService } from '../state/register-organization.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../shared/alert/alert.component'; +import { NgIf } from '@angular/common'; /** * This is actually create and update organization dialog @@ -34,6 +41,19 @@ import { FormsState, RegisterOrganizationService } from '../state/register-organ selector: 'app-register-organization', templateUrl: './register-organization.component.html', styleUrls: ['./register-organization.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + NgIf, + AlertComponent, + FormsModule, + ReactiveFormsModule, + MatLegacyFormFieldModule, + MatLegacyTooltipModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + ], }) export class RegisterOrganizationComponent implements OnInit, OnDestroy { registerOrganizationForm: UntypedFormGroup; diff --git a/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts b/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts index 12430f331e..5b19e7fdfb 100644 --- a/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts +++ b/src/app/organizations/registerOrganization/requireAccountsModal/require-accounts-modal.component.ts @@ -1,14 +1,20 @@ import { Component, OnInit } from '@angular/core'; import { TokenQuery } from '../../../shared/state/token.query'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { RegisterOrganizationComponent } from '../register-organization.component'; import { TagEditorMode } from '../../../shared/enum/tagEditorMode.enum'; import { map } from 'rxjs/operators'; import { Observable } from 'rxjs'; +import { AsyncPipe, I18nPluralPipe } from '@angular/common'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-require-accounts-modal', templateUrl: './require-accounts-modal.component.html', + standalone: true, + imports: [MatLegacyDialogModule, FlexModule, MatLegacyButtonModule, RouterLink, AsyncPipe, I18nPluralPipe], }) export class RequireAccountsModalComponent implements OnInit { public numLinkedAccounts$: Observable; diff --git a/src/app/organizations/state/collections.service.spec.ts b/src/app/organizations/state/collections.service.spec.ts index f487d7d87a..04ac9de423 100644 --- a/src/app/organizations/state/collections.service.spec.ts +++ b/src/app/organizations/state/collections.service.spec.ts @@ -1,11 +1,11 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; - -import { CustomMaterialModule } from '../../shared/modules/material.module'; +import { UrlResolverService } from '../../shared/url-resolver.service'; import { CollectionsService } from './collections.service'; import { CollectionsStore } from './collections.store'; -import { UrlResolverService } from '../../shared/url-resolver.service'; describe('CollectionsService', () => { let collectionsService: CollectionsService; @@ -13,7 +13,7 @@ describe('CollectionsService', () => { beforeEach(() => { TestBed.configureTestingModule({ providers: [CollectionsService, CollectionsStore, UrlResolverService], - imports: [HttpClientTestingModule, CustomMaterialModule, RouterTestingModule], + imports: [HttpClientTestingModule, RouterTestingModule, MatLegacySnackBarModule, MatLegacyDialogModule], }); collectionsService = TestBed.inject(CollectionsService); diff --git a/src/app/organizations/state/organization.service.spec.ts b/src/app/organizations/state/organization.service.spec.ts index d20ed5ca3b..9b2bdfc5b9 100644 --- a/src/app/organizations/state/organization.service.spec.ts +++ b/src/app/organizations/state/organization.service.spec.ts @@ -25,6 +25,8 @@ import { UrlResolverService } from '../../shared/url-resolver.service'; @Component({ template: ` `, + standalone: true, + imports: [HttpClientTestingModule, MatSnackBarModule], }) export class OrganizationsComponent {} @@ -34,9 +36,13 @@ describe('OrganizationService', () => { let organizationService: OrganizationService; beforeEach(() => { TestBed.configureTestingModule({ - declarations: [OrganizationsComponent], providers: [OrganizationService, OrganizationStore, UrlResolverService], - imports: [HttpClientTestingModule, MatSnackBarModule, RouterTestingModule.withRoutes(MOCK_ORGANIZATIONS_ROUTES)], + imports: [ + HttpClientTestingModule, + MatSnackBarModule, + RouterTestingModule.withRoutes(MOCK_ORGANIZATIONS_ROUTES), + OrganizationsComponent, + ], }); organizationService = TestBed.inject(OrganizationService); diff --git a/src/app/organizations/upsert-organization-member.module.ts b/src/app/organizations/upsert-organization-member.module.ts deleted file mode 100644 index bd01e83b17..0000000000 --- a/src/app/organizations/upsert-organization-member.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { ReactiveFormsModule } from '@angular/forms'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { UpsertOrganizationMemberComponent } from './upsert-organization-member/upsert-organization-member.component'; - -@NgModule({ - imports: [CommonModule, FlexLayoutModule, CustomMaterialModule, ReactiveFormsModule, RefreshAlertModule], - declarations: [UpsertOrganizationMemberComponent], -}) -export class UpsertOrganizationMemberModule {} diff --git a/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts b/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts index 6466e6f05a..eb781be149 100644 --- a/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts +++ b/src/app/organizations/upsert-organization-member/upsert-organization-member.component.ts @@ -1,10 +1,19 @@ import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { NgFormsManager } from '@ngneat/forms-manager'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { OrganizationUser } from '../../shared/openapi'; import { FormsState, UpsertOrganizationMemberService } from '../state/upsert-organization-member.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { NgIf, NgFor, TitleCasePipe } from '@angular/common'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { AlertComponent } from '../../shared/alert/alert.component'; export interface UpsertOrganizationMemberComponentData { mode: TagEditorMode; @@ -18,6 +27,23 @@ export interface UpsertOrganizationMemberComponentData { @Component({ selector: 'app-upsert-organization-member', templateUrl: './upsert-organization-member.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + ReactiveFormsModule, + FlexModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + NgIf, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + TitleCasePipe, + ], }) export class UpsertOrganizationMemberComponent implements OnInit, OnDestroy { roleKeys: any; diff --git a/src/app/pagenotfound/pagenotfound.component.ts b/src/app/pagenotfound/pagenotfound.component.ts index 0b5a05e039..198b685ad0 100644 --- a/src/app/pagenotfound/pagenotfound.component.ts +++ b/src/app/pagenotfound/pagenotfound.component.ts @@ -1,9 +1,13 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-pagenotfound', templateUrl: './pagenotfound.component.html', + standalone: true, + imports: [FlexModule, ExtendedModule], }) export class PageNotFoundComponent { Dockstore = Dockstore; diff --git a/src/app/preview-warning/preview-warning.component.ts b/src/app/preview-warning/preview-warning.component.ts index a44f654c46..3a2cacf60b 100644 --- a/src/app/preview-warning/preview-warning.component.ts +++ b/src/app/preview-warning/preview-warning.component.ts @@ -1,8 +1,12 @@ import { Component, Input } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-preview-warning', templateUrl: './preview-warning.component.html', + standalone: true, + imports: [MatLegacyCardModule, MatIconModule], }) export class PreviewWarningComponent { @Input() featureName: string; diff --git a/src/app/search/advancedsearch/advancedsearch.component.ts b/src/app/search/advancedsearch/advancedsearch.component.ts index 04dedb3620..7c87b20d04 100644 --- a/src/app/search/advancedsearch/advancedsearch.component.ts +++ b/src/app/search/advancedsearch/advancedsearch.component.ts @@ -15,17 +15,35 @@ */ import { Component, OnInit } from '@angular/core'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; +import { SearchAuthorsHtmlPipe } from '../search-authors-html.pipe'; import { SearchService } from '../state/search.service'; import { AdvancedSearchObject } from './../../shared/models/AdvancedSearchObject'; import { AdvancedSearchQuery } from './state/advanced-search.query'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-advancedsearch', templateUrl: './advancedsearch.component.html', styleUrls: ['./advancedsearch.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + NgIf, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + FormsModule, + MatLegacyTooltipModule, + SearchAuthorsHtmlPipe, + ], }) export class AdvancedSearchComponent extends Base implements OnInit { NOTFilter: string; diff --git a/src/app/search/basic-search/basic-search.component.spec.ts b/src/app/search/basic-search/basic-search.component.spec.ts index e9dbf03e78..84e77437f1 100644 --- a/src/app/search/basic-search/basic-search.component.spec.ts +++ b/src/app/search/basic-search/basic-search.component.spec.ts @@ -2,9 +2,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { ProviderService } from '../../shared/provider.service'; import { SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; @@ -18,8 +18,7 @@ describe('BasicSearchComponent', () => { waitForAsync(() => { TestBed.configureTestingModule({ schemas: [NO_ERRORS_SCHEMA], - imports: [MatAutocompleteModule, RouterTestingModule, BrowserAnimationsModule, CustomMaterialModule], - declarations: [BasicSearchComponent], + imports: [MatAutocompleteModule, MatLegacyDialogModule, RouterTestingModule, BrowserAnimationsModule, BasicSearchComponent], providers: [ProviderService, { provide: SearchService, useClass: SearchStubService }], }).compileComponents(); }) diff --git a/src/app/search/basic-search/basic-search.component.ts b/src/app/search/basic-search/basic-search.component.ts index ff4148d346..b4c8d93f0e 100644 --- a/src/app/search/basic-search/basic-search.component.ts +++ b/src/app/search/basic-search/basic-search.component.ts @@ -1,5 +1,5 @@ import { Component, EventEmitter, OnInit, Output } from '@angular/core'; -import { UntypedFormControl } from '@angular/forms'; +import { UntypedFormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { Observable } from 'rxjs'; import { debounceTime, distinctUntilChanged, shareReplay, takeUntil } from 'rxjs/operators'; @@ -8,11 +8,36 @@ import { bootstrap4largeModalSize, formInputDebounceTime } from '../../shared/co import { AdvancedSearchComponent } from '../advancedsearch/advancedsearch.component'; import { SearchQuery } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatExpansionModule } from '@angular/material/expansion'; @Component({ selector: 'app-basic-search', templateUrl: './basic-search.component.html', styleUrls: ['./basic-search.component.scss'], + standalone: true, + imports: [ + MatExpansionModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyAutocompleteModule, + FormsModule, + MatLegacyTooltipModule, + ReactiveFormsModule, + NgIf, + MatLegacyButtonModule, + MatIconModule, + NgFor, + MatLegacyOptionModule, + AsyncPipe, + ], }) export class BasicSearchComponent extends Base implements OnInit { constructor(private searchService: SearchService, private searchQuery: SearchQuery, private matDialog: MatDialog) { diff --git a/src/app/search/facet-search/facet-search-update.pipe.ts b/src/app/search/facet-search/facet-search-update.pipe.ts index f0c641b7bf..0dd8670986 100644 --- a/src/app/search/facet-search/facet-search-update.pipe.ts +++ b/src/app/search/facet-search/facet-search-update.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getFacetSearchUpdate', + standalone: true, }) /** * This pipe updates the number of hidden items in the facet when a search is completed diff --git a/src/app/search/facet-search/facet-search.pipe.ts b/src/app/search/facet-search/facet-search.pipe.ts index 668fdc285f..bf71779f67 100644 --- a/src/app/search/facet-search/facet-search.pipe.ts +++ b/src/app/search/facet-search/facet-search.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getFacetSearchResults', + standalone: true, }) /** * This pipe filters results in the facet according to the facet search text diff --git a/src/app/search/get-histogram-style.pipe.ts b/src/app/search/get-histogram-style.pipe.ts index 5d72713beb..d17524b008 100644 --- a/src/app/search/get-histogram-style.pipe.ts +++ b/src/app/search/get-histogram-style.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'getHistogramStyle', + standalone: true, }) export class GetHistogramStylePipe implements PipeTransform { /** diff --git a/src/app/search/is-app-tool.pipe.ts b/src/app/search/is-app-tool.pipe.ts index f55d3060d5..280272a68b 100644 --- a/src/app/search/is-app-tool.pipe.ts +++ b/src/app/search/is-app-tool.pipe.ts @@ -3,6 +3,7 @@ import { AppTool, DockstoreTool } from '../shared/openapi'; @Pipe({ name: 'isAppTool', + standalone: true, }) export class IsAppToolPipe implements PipeTransform { transform(tool: DockstoreTool | AppTool): tool is AppTool { diff --git a/src/app/search/join-with-ellipses.pipe.ts b/src/app/search/join-with-ellipses.pipe.ts index 5d24cd66e5..7a05d9b8ef 100644 --- a/src/app/search/join-with-ellipses.pipe.ts +++ b/src/app/search/join-with-ellipses.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'joinWithEllipses', + standalone: true, }) export class JoinWithEllipsesPipe implements PipeTransform { transform(fragments: any): string { diff --git a/src/app/search/map-friendly-values.pipe.ts b/src/app/search/map-friendly-values.pipe.ts index 9250dcec0d..693d5c33d0 100644 --- a/src/app/search/map-friendly-values.pipe.ts +++ b/src/app/search/map-friendly-values.pipe.ts @@ -21,6 +21,7 @@ import PartnerEnum = CloudInstance.PartnerEnum; @Pipe({ name: 'mapFriendlyValue', + standalone: true, }) export class MapFriendlyValuesPipe implements PipeTransform { constructor(private descriptorLanguageService: DescriptorLanguageService, private platformPartnerPipe: PlatformPartnerPipe) {} diff --git a/src/app/search/search-authors-html.pipe.ts b/src/app/search/search-authors-html.pipe.ts index 307b96ed11..e1d473b06e 100644 --- a/src/app/search/search-authors-html.pipe.ts +++ b/src/app/search/search-authors-html.pipe.ts @@ -3,6 +3,7 @@ import { Author, OrcidAuthorInformation } from 'app/shared/openapi'; @Pipe({ name: 'getSearchAuthorsHtml', + standalone: true, }) /** * This pipe filters results in the facet according to the facet search text diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts b/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts index 8e3dbf3de7..30caf1b702 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.spec.ts @@ -6,8 +6,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { DockstoreStubService, SearchStubService } from '../../test/service-stubs'; +import { DateStubService, DockstoreStubService, SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; import { SearchNotebookTableComponent } from './search-notebook-table.component'; @@ -18,12 +17,11 @@ describe('SearchNotebookTableComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchNotebookTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchNotebookTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: SearchService, useClass: SearchStubService }, ], }).compileComponents(); diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.ts b/src/app/search/search-notebook-table/search-notebook-table.component.ts index 4b6ece0c8e..cbf158642c 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.ts @@ -14,13 +14,26 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; import { Notebook, Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatIconModule } from '@angular/material/icon'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, KeyValuePipe } from '@angular/common'; import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** @@ -31,6 +44,25 @@ import TopicSelectionEnum = Workflow.TopicSelectionEnum; selector: 'app-search-notebook-table', templateUrl: './search-notebook-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-notebook-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + FontAwesomeModule, + MatIconModule, + NgFor, + MatLegacyPaginatorModule, + KeyValuePipe, + DescriptorLanguagePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + ], }) export class SearchNotebookTableComponent extends SearchEntryTable implements OnInit { public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'descriptorTypeSubclass', 'projectLinks', 'starredUsers']; diff --git a/src/app/search/search-results/search-results.component.spec.ts b/src/app/search/search-results/search-results.component.spec.ts index d3af0819d7..d987344059 100644 --- a/src/app/search/search-results/search-results.component.spec.ts +++ b/src/app/search/search-results/search-results.component.spec.ts @@ -16,7 +16,9 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { ExtendedGA4GHStubService, QueryBuilderStubService, SearchStubService } from './../../test/service-stubs'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; +import { DateService } from '../../shared/date.service'; +import { DateStubService, ExtendedGA4GHStubService, QueryBuilderStubService, SearchStubService } from './../../test/service-stubs'; import { QueryBuilderService } from './../query-builder.service'; import { RouterTestingModule } from '@angular/router/testing'; @@ -31,13 +33,13 @@ describe('SearchResultsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchResultsComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [RouterTestingModule], + imports: [RouterTestingModule, SearchResultsComponent, NoopAnimationsModule], providers: [ { provide: SearchService, useClass: SearchStubService }, { provide: QueryBuilderService, useClass: QueryBuilderStubService }, { provide: ExtendedGA4GHService, useClass: ExtendedGA4GHStubService }, + { provide: DateService, useClass: DateStubService }, ], }).compileComponents(); }) diff --git a/src/app/search/search-results/search-results.component.ts b/src/app/search/search-results/search-results.component.ts index 77cdbb7b3d..fa1c3d75e8 100644 --- a/src/app/search/search-results/search-results.component.ts +++ b/src/app/search/search-results/search-results.component.ts @@ -15,18 +15,37 @@ */ import { Component, OnInit } from '@angular/core'; import { faMinus, faPlus } from '@fortawesome/free-solid-svg-icons'; -import { CloudData, CloudOptions } from 'angular-tag-cloud-module'; +import { CloudData, CloudOptions, TagCloudComponent } from 'angular-tag-cloud-module'; import { ExtendedGA4GHService } from 'app/shared/openapi'; import { Observable } from 'rxjs'; import { Base } from '../../shared/base'; import { QueryBuilderService } from '../query-builder.service'; import { SearchQuery } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { SearchNotebookTableComponent } from '../search-notebook-table/search-notebook-table.component'; +import { SearchToolTableComponent } from '../search-tool-table/search-tool-table.component'; +import { SearchWorkflowTableComponent } from '../search-workflow-table/search-workflow-table.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-search-results', templateUrl: './search-results.component.html', styleUrls: ['./search-results.component.scss'], + standalone: true, + imports: [ + NgIf, + FlexModule, + FontAwesomeModule, + TagCloudComponent, + MatDividerModule, + SearchWorkflowTableComponent, + SearchToolTableComponent, + SearchNotebookTableComponent, + AsyncPipe, + ], }) export class SearchResultsComponent extends Base implements OnInit { faPlus = faPlus; diff --git a/src/app/search/search-tool-table/search-tool-table.component.spec.ts b/src/app/search/search-tool-table/search-tool-table.component.spec.ts index 90e0b253a3..cfafb945c7 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.spec.ts +++ b/src/app/search/search-tool-table/search-tool-table.component.spec.ts @@ -7,8 +7,7 @@ import { RouterTestingModule } from '@angular/router/testing'; import { ListContainersService } from '../../containers/list/list.service'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { DockstoreStubService, ListContainersStubService, SearchStubService } from '../../test/service-stubs'; +import { DateStubService, DockstoreStubService, ListContainersStubService, SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; import { SearchToolTableComponent } from './search-tool-table.component'; @@ -19,12 +18,11 @@ describe('SearchToolTableComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchToolTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchToolTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: ListContainersService, useClass: ListContainersStubService }, { provide: SearchService, useClass: SearchStubService }, ], diff --git a/src/app/search/search-tool-table/search-tool-table.component.ts b/src/app/search/search-tool-table/search-tool-table.component.ts index c24b05fe07..900fdda72a 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.ts +++ b/src/app/search/search-tool-table/search-tool-table.component.ts @@ -1,11 +1,26 @@ import { Component, OnInit } from '@angular/core'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; import { AppTool, DockstoreTool } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { IsAppToolPipe } from '../is-app-tool.pipe'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { PrivateIconComponent } from '../../shared/private-icon/private-icon.component'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, UpperCasePipe, KeyValuePipe } from '@angular/common'; import TopicSelectionEnum = DockstoreTool.TopicSelectionEnum; /** @@ -16,6 +31,28 @@ import TopicSelectionEnum = DockstoreTool.TopicSelectionEnum; selector: 'app-search-tool-table', templateUrl: './search-tool-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-tool-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + PrivateIconComponent, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + MatIconModule, + FlexModule, + NgFor, + FontAwesomeModule, + MatLegacyPaginatorModule, + UpperCasePipe, + KeyValuePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + IsAppToolPipe, + ], }) export class SearchToolTableComponent extends SearchEntryTable implements OnInit { readonly entryType = 'tool'; diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts index 594a04248e..76cb256d5c 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts +++ b/src/app/search/search-workflow-table/search-workflow-table.component.spec.ts @@ -6,8 +6,7 @@ import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; -import { DockstoreStubService, SearchStubService } from '../../test/service-stubs'; +import { DateStubService, DockstoreStubService, SearchStubService } from '../../test/service-stubs'; import { SearchService } from '../state/search.service'; import { SearchWorkflowTableComponent } from './search-workflow-table.component'; @@ -18,12 +17,11 @@ describe('SearchWorkflowTableComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchWorkflowTableComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [CustomMaterialModule, BrowserAnimationsModule, RouterTestingModule], + imports: [BrowserAnimationsModule, RouterTestingModule, SearchWorkflowTableComponent], providers: [ { provide: DockstoreService, useClass: DockstoreStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, { provide: SearchService, useClass: SearchStubService }, ], }).compileComponents(); diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.ts b/src/app/search/search-workflow-table/search-workflow-table.component.ts index 0115b5f121..0b4b6935af 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.ts +++ b/src/app/search/search-workflow-table/search-workflow-table.component.ts @@ -14,13 +14,26 @@ * limitations under the License. */ import { Component, OnInit } from '@angular/core'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { Observable } from 'rxjs'; import { DateService } from '../../shared/date.service'; import { Workflow } from '../../shared/openapi'; import { SearchEntryTable } from '../search-entry-table'; import { SearchQuery, SearchResult } from '../state/search.query'; import { SearchService } from '../state/search.service'; +import { JoinWithEllipsesPipe } from 'app/search/join-with-ellipses.pipe'; +import { SearchAuthorsHtmlPipe } from 'app/search/search-authors-html.pipe'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { RouterLink } from '@angular/router'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, KeyValuePipe } from '@angular/common'; import TopicSelectionEnum = Workflow.TopicSelectionEnum; /** @@ -31,6 +44,25 @@ import TopicSelectionEnum = Workflow.TopicSelectionEnum; selector: 'app-search-workflow-table', templateUrl: './search-workflow-table.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './search-workflow-table.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + RouterLink, + AiBubbleComponent, + ExtendedModule, + MatIconModule, + FontAwesomeModule, + NgFor, + MatLegacyPaginatorModule, + KeyValuePipe, + DescriptorLanguagePipe, + SearchAuthorsHtmlPipe, + JoinWithEllipsesPipe, + ], }) export class SearchWorkflowTableComponent extends SearchEntryTable implements OnInit { readonly entryType = 'workflow'; diff --git a/src/app/search/search.component.spec.ts b/src/app/search/search.component.spec.ts index e8b68d2bee..b19207df3e 100644 --- a/src/app/search/search.component.spec.ts +++ b/src/app/search/search.component.spec.ts @@ -16,6 +16,7 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { Component } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; @@ -23,9 +24,15 @@ import { RouterTestingModule } from '@angular/router/testing'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { ExtendedGA4GHService } from 'app/shared/openapi'; import { of } from 'rxjs'; -import { CustomMaterialModule } from '../shared/modules/material.module'; +import { DateService } from '../shared/date.service'; import { ProviderService } from '../shared/provider.service'; -import { ExtendedGA4GHStubService, ProviderStubService, QueryBuilderStubService, SearchStubService } from './../test/service-stubs'; +import { + DateStubService, + ExtendedGA4GHStubService, + ProviderStubService, + QueryBuilderStubService, + SearchStubService, +} from './../test/service-stubs'; import { MapFriendlyValuesPipe } from './map-friendly-values.pipe'; import { QueryBuilderService } from './query-builder.service'; import { SearchComponent } from './search.component'; @@ -35,18 +42,24 @@ import { SearchService } from './state/search.service'; @Component({ selector: 'app-search-results', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class SearchResultsComponent {} @Component({ selector: 'app-basic-search', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class BasicSearchComponent {} @Component({ selector: 'app-header', template: '', + standalone: true, + imports: [ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule], }) class HeaderComponent {} @@ -59,14 +72,18 @@ describe('SearchComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SearchComponent, MapFriendlyValuesPipe, HeaderComponent, BasicSearchComponent, SearchResultsComponent], imports: [ BrowserAnimationsModule, - CustomMaterialModule, ClipboardModule, FontAwesomeModule, RouterTestingModule, MatSnackBarModule, + MatLegacyDialogModule, + SearchComponent, + MapFriendlyValuesPipe, + HeaderComponent, + BasicSearchComponent, + SearchResultsComponent, ], providers: [ { provide: SearchService, useClass: SearchStubService }, @@ -74,6 +91,7 @@ describe('SearchComponent', () => { { provide: ProviderService, useClass: ProviderStubService }, { provide: ExtendedGA4GHService, useClass: ExtendedGA4GHStubService }, { provide: SearchQuery, useValue: jasmine.createSpyObj('SearchQuery', ['select', 'getValue', 'searchText']) }, + { provide: DateService, useClass: DateStubService }, ], }).compileComponents(); }) diff --git a/src/app/search/search.component.ts b/src/app/search/search.component.ts index 60941b5458..8d74f1e84f 100644 --- a/src/app/search/search.component.ts +++ b/src/app/search/search.component.ts @@ -13,11 +13,11 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Location } from '@angular/common'; +import { Location, NgClass, NgFor, NgIf, NgStyle, AsyncPipe, LowerCasePipe } from '@angular/common'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, HostListener, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { MatAccordion } from '@angular/material/expansion'; -import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; +import { MatAccordion, MatExpansionModule } from '@angular/material/expansion'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { ActivatedRoute, ParamMap, Router } from '@angular/router'; import { faAngleDoubleDown, @@ -41,6 +41,27 @@ import { AdvancedSearchQuery } from './advancedsearch/state/advanced-search.quer import { QueryBuilderService } from './query-builder.service'; import { SearchQuery } from './state/search.query'; import { Hit, SearchService } from './state/search.service'; +import { GetFacetSearchUpdatePipe } from './facet-search/facet-search-update.pipe'; +import { GetFacetSearchResultsPipe } from './facet-search/facet-search.pipe'; +import { GetHistogramStylePipe } from './get-histogram-style.pipe'; +import { MapFriendlyValuesPipe } from './map-friendly-values.pipe'; +import { SearchResultsComponent } from './search-results/search-results.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../shared/snackbar.directive'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyCheckboxModule } from '@angular/material/legacy-checkbox'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyAutocompleteModule } from '@angular/material/legacy-autocomplete'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { BasicSearchComponent } from './basic-search/basic-search.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; /** * @@ -70,6 +91,38 @@ import { Hit, SearchService } from './state/search.service'; selector: 'app-search', templateUrl: './search.component.html', styleUrls: ['./search.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + MatLegacyTabsModule, + NgClass, + ExtendedModule, + MatLegacyButtonModule, + MatExpansionModule, + BasicSearchComponent, + NgFor, + NgIf, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FormsModule, + MatLegacyAutocompleteModule, + MatLegacyOptionModule, + FontAwesomeModule, + NgStyle, + MatLegacyCheckboxModule, + MatLegacyCardModule, + SnackbarDirective, + ClipboardModule, + SearchResultsComponent, + AsyncPipe, + LowerCasePipe, + MapFriendlyValuesPipe, + GetHistogramStylePipe, + GetFacetSearchResultsPipe, + GetFacetSearchUpdatePipe, + ], }) export class SearchComponent implements OnInit, OnDestroy { Dockstore = Dockstore; diff --git a/src/app/search/search.module.ts b/src/app/search/search.module.ts deleted file mode 100644 index 5c9bf943e2..0000000000 --- a/src/app/search/search.module.ts +++ /dev/null @@ -1,84 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { HttpClientModule } from '@angular/common/http'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { FormsModule, ReactiveFormsModule } from '@angular/forms'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { TagCloudComponent } from 'angular-tag-cloud-module'; - -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { SnackbarModule } from '../shared/modules/snackbar.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { PrivateIconModule } from '../shared/private-icon/private-icon.module'; -import { AdvancedSearchComponent } from './advancedsearch/advancedsearch.component'; -import { BasicSearchComponent } from './basic-search/basic-search.component'; -import { IsAppToolPipe } from './is-app-tool.pipe'; -import { QueryBuilderService } from './query-builder.service'; -import { SearchResultsComponent } from './search-results/search-results.component'; -import { SearchToolTableComponent } from './search-tool-table/search-tool-table.component'; -import { SearchWorkflowTableComponent } from './search-workflow-table/search-workflow-table.component'; -import { SearchNotebookTableComponent } from './search-notebook-table/search-notebook-table.component'; -import { SearchComponent } from './search.component'; -import { searchRouting } from './search.routing'; -import { SearchService } from './state/search.service'; -import { PreviewWarningModule } from '../shared/modules/preview-warning.module'; -import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; -import { JoinWithEllipsesPipe } from './join-with-ellipses.pipe'; -import { AiBubbleComponent } from '../shared/ai-bubble/ai-bubble.component'; -import { AppModule } from '../app.module'; -import { AiBubbleModule } from '../shared/ai-bubble/ai-bubble.module'; - -@NgModule({ - declarations: [ - AdvancedSearchComponent, - SearchComponent, - SearchResultsComponent, - SearchToolTableComponent, - SearchWorkflowTableComponent, - SearchNotebookTableComponent, - BasicSearchComponent, - IsAppToolPipe, - ], - imports: [ - CommonModule, - CustomMaterialModule, - FontAwesomeModule, - MatAutocompleteModule, - FormsModule, - HeaderModule, - PipeModule, - ClipboardModule, - searchRouting, - HttpClientModule, - PrivateIconModule, - ReactiveFormsModule, - RefreshAlertModule, - FlexLayoutModule, - SnackbarModule, - TagCloudComponent, - PreviewWarningModule, - AiBubbleModule, - ], - providers: [SearchService, QueryBuilderService, SearchAuthorsHtmlPipe, JoinWithEllipsesPipe], - exports: [SearchComponent, IsAppToolPipe], -}) -export class SearchModule {} diff --git a/src/app/search/search.routing.ts b/src/app/search/search.routing.ts index 2d6e3c71f9..d07526582c 100644 --- a/src/app/search/search.routing.ts +++ b/src/app/search/search.routing.ts @@ -15,14 +15,18 @@ */ import { RouterModule, Routes } from '@angular/router'; +import { QueryBuilderService } from './query-builder.service'; +import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; import { SearchComponent } from './search.component'; +import { SearchService } from './state/search.service'; const CONTAINERS_ROUTES: Routes = [ { + providers: [QueryBuilderService, SearchService, SearchAuthorsHtmlPipe], path: '**', component: SearchComponent, data: { title: 'Dockstore | Search' }, }, ]; -export const searchRouting = RouterModule.forChild(CONTAINERS_ROUTES); +export const searchRouting = CONTAINERS_ROUTES; diff --git a/src/app/search/state/search.service.spec.ts b/src/app/search/state/search.service.spec.ts index d86191fe0f..8a77eb6835 100644 --- a/src/app/search/state/search.service.spec.ts +++ b/src/app/search/state/search.service.spec.ts @@ -15,7 +15,7 @@ */ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; -import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; +import { MatLegacySnackBarModule as MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; import { first } from 'rxjs/operators'; import { ImageProviderService } from '../../shared/image-provider.service'; @@ -31,7 +31,7 @@ describe('SearchService', () => { let searchService: SearchService; beforeEach(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule, HttpClientTestingModule, MatSnackBarModule], + imports: [RouterTestingModule, HttpClientTestingModule, MatLegacySnackBarModule], providers: [ ImageProviderService, SearchService, diff --git a/src/app/select/select.component.spec.ts b/src/app/select/select.component.spec.ts index 499f4c79c9..a709832f2e 100644 --- a/src/app/select/select.component.spec.ts +++ b/src/app/select/select.component.spec.ts @@ -16,6 +16,7 @@ import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { SelectComponent } from './select.component'; @@ -26,7 +27,7 @@ describe('SelectComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SelectComponent], + imports: [SelectComponent, NoopAnimationsModule], schemas: [NO_ERRORS_SCHEMA], }).compileComponents(); }) diff --git a/src/app/select/select.component.ts b/src/app/select/select.component.ts index 18b0527e4c..caddca4473 100644 --- a/src/app/select/select.component.ts +++ b/src/app/select/select.component.ts @@ -15,10 +15,17 @@ */ import { Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { NgFor, NgIf } from '@angular/common'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; @Component({ selector: 'app-select', templateUrl: './select.component.html', + standalone: true, + imports: [MatLegacyFormFieldModule, MatLegacySelectModule, NgFor, MatLegacyOptionModule, MatLegacyTooltipModule, NgIf], }) export class SelectComponent implements OnChanges { @Input() items: Array; diff --git a/src/app/session-expired/session-expired.component.ts b/src/app/session-expired/session-expired.component.ts index 021a9082e7..45112503a6 100644 --- a/src/app/session-expired/session-expired.component.ts +++ b/src/app/session-expired/session-expired.component.ts @@ -14,9 +14,13 @@ * limitations under the License. */ import { Component } from '@angular/core'; +import { RouterLink } from '@angular/router'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-policy-update', templateUrl: './session-expired.component.html', + standalone: true, + imports: [HeaderComponent, RouterLink], }) export class SessionExpiredComponent {} diff --git a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts b/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts deleted file mode 100644 index 6018af8d97..0000000000 --- a/src/app/shared-workflow-services-notebooks/shared-workflow-services-notebooks.module.ts +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright 2022 OICR, UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { RouterModule } from '@angular/router'; -import { MyWorkflowsService } from 'app/myworkflows/myworkflows.service'; -import { EntryWizardModule } from 'app/shared/entry-wizard.module'; -import { MyEntriesModule } from 'app/shared/modules/my-entries.module'; -import { PreviewWarningModule } from 'app/shared/modules/preview-warning.module'; -import { RegisterGithubAppModalComponent } from 'app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component'; -import { MyWorkflowComponent } from '../myworkflows/my-workflow/my-workflow.component'; -import { SidebarAccordionComponent } from '../myworkflows/sidebar-accordion/sidebar-accordion.component'; -import { RefreshAlertModule } from '../shared/alert/alert.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { RegisterGithubAppModule } from '../shared/modules/register-github-app.module'; -import { WorkflowModule } from '../shared/modules/workflow.module'; -import { PipeModule } from '../shared/pipe/pipe.module'; -import { RefreshWorkflowOrganizationComponent } from '../workflow/refresh-workflow-organization/refresh-workflow-organization.component'; -import { RegisterWorkflowModalComponent } from '../workflow/register-workflow-modal/register-workflow-modal.component'; - -const DECLARATIONS: any[] = [ - MyWorkflowComponent, - RefreshWorkflowOrganizationComponent, - RegisterWorkflowModalComponent, - RegisterGithubAppModalComponent, - SidebarAccordionComponent, -]; -const IMPORTS = [ - FormsModule, - WorkflowModule, - HeaderModule, - CustomMaterialModule, - RefreshAlertModule, - PipeModule, - CommonModule, - RouterModule, - MyEntriesModule, - EntryWizardModule, - PreviewWarningModule, - RegisterGithubAppModule, -]; - -/** - * This is a shared module between the My Workflows page, My Services page, and My Notebooks page. - * It shares modules and components - * - * @export - * @class SharedWorkflowServicesNotebooksModule - */ -@NgModule({ - declarations: DECLARATIONS, - imports: IMPORTS, - providers: [MyWorkflowsService], - exports: [DECLARATIONS.concat(IMPORTS), SidebarAccordionComponent], -}) -export class SharedWorkflowServicesNotebooksModule {} diff --git a/src/app/shared/ai-bubble/ai-bubble.component.ts b/src/app/shared/ai-bubble/ai-bubble.component.ts index fce9fce6af..72b75e0a36 100644 --- a/src/app/shared/ai-bubble/ai-bubble.component.ts +++ b/src/app/shared/ai-bubble/ai-bubble.component.ts @@ -15,6 +15,7 @@ */ import { Component, Input, OnInit } from '@angular/core'; import { Dockstore } from '../dockstore.model'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; /** * Component for the AI generated indicator. @@ -26,6 +27,8 @@ import { Dockstore } from '../dockstore.model'; @Component({ selector: 'app-ai-bubble', templateUrl: './ai-bubble.component.html', + standalone: true, + imports: [MatLegacyTooltipModule], }) export class AiBubbleComponent implements OnInit { constructor() {} diff --git a/src/app/shared/ai-bubble/ai-bubble.module.ts b/src/app/shared/ai-bubble/ai-bubble.module.ts deleted file mode 100644 index 1a5e726da9..0000000000 --- a/src/app/shared/ai-bubble/ai-bubble.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FlexModule } from '@ngbracket/ngx-layout'; -import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; -import { RouterLink } from '@angular/router'; -import { AiBubbleComponent } from './ai-bubble.component'; - -@NgModule({ - declarations: [AiBubbleComponent], - exports: [AiBubbleComponent], - imports: [CommonModule, FlexModule, MatIconModule, MatTooltipModule, RouterLink], -}) -export class AiBubbleModule {} diff --git a/src/app/shared/alert/alert.component.spec.ts b/src/app/shared/alert/alert.component.spec.ts index b1d3e17e74..afed9557ea 100644 --- a/src/app/shared/alert/alert.component.spec.ts +++ b/src/app/shared/alert/alert.component.spec.ts @@ -13,8 +13,7 @@ describe('RefreshAlertComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule], - declarations: [AlertComponent], + imports: [MatProgressBarModule, MatSnackBarModule, MatIconModule, MatCardModule, AlertComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/alert/alert.component.ts b/src/app/shared/alert/alert.component.ts index 245d7aba29..197c9b1d9a 100644 --- a/src/app/shared/alert/alert.component.ts +++ b/src/app/shared/alert/alert.component.ts @@ -18,6 +18,10 @@ import { Observable } from 'rxjs'; import { AlertQuery } from './state/alert.query'; import { AlertService } from './state/alert.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; /** * Stick this component into any location you want to potentially display a progress bar or alert. @@ -30,6 +34,8 @@ import { AlertService } from './state/alert.service'; selector: 'app-alert', templateUrl: './alert.component.html', styleUrls: ['./alert.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule, AsyncPipe], }) export class AlertComponent implements OnInit { public showError$: Observable; diff --git a/src/app/shared/alert/alert.module.ts b/src/app/shared/alert/alert.module.ts deleted file mode 100644 index 9bc8f77cf9..0000000000 --- a/src/app/shared/alert/alert.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; -import { CustomMaterialModule } from './../modules/material.module'; - -import { LoadingComponent } from '../loading/loading.component'; -import { AlertComponent } from './alert.component'; - -@NgModule({ - declarations: [AlertComponent, LoadingComponent], - imports: [MatProgressBarModule, MatIconModule, CommonModule, FormsModule, CustomMaterialModule], - exports: [AlertComponent, LoadingComponent], -}) -export class RefreshAlertModule {} diff --git a/src/app/shared/available-logs.module.ts b/src/app/shared/available-logs.module.ts deleted file mode 100644 index f8ddc9ff2a..0000000000 --- a/src/app/shared/available-logs.module.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright 2019 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { RefreshAlertModule } from './alert/alert.module'; -import { AvailableLogsComponent } from './available-logs/available-logs.component'; -import { RemoveExtensionPipe } from './available-logs/remove-extension.pipe'; -import { ToolTesterLogPipe } from './available-logs/tool-tester-log.pipe'; -import { VerifiedDisplayComponent } from './entry/verified-display/verified-display.component'; -import { CustomMaterialModule } from './modules/material.module'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FlexLayoutModule, RefreshAlertModule], - declarations: [AvailableLogsComponent, VerifiedDisplayComponent, ToolTesterLogPipe, RemoveExtensionPipe], - exports: [VerifiedDisplayComponent], -}) -export class AvailableLogsModule {} diff --git a/src/app/shared/available-logs/available-logs.component.ts b/src/app/shared/available-logs/available-logs.component.ts index d76e757224..eff8a85fc3 100644 --- a/src/app/shared/available-logs/available-logs.component.ts +++ b/src/app/shared/available-logs/available-logs.component.ts @@ -1,5 +1,5 @@ import { Component, Inject, OnInit } from '@angular/core'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { ID } from '@datorama/akita'; import { Observable } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; @@ -9,6 +9,15 @@ import { ToolTesterLog } from '../openapi/model/toolTesterLog'; import { AvailableLogsQuery } from '../state/available-logs.query'; import { AvailableLogsService } from '../state/available-logs.service'; import { CheckerWorkflowQuery } from '../state/checker-workflow.query'; +import { RemoveExtensionPipe } from './remove-extension.pipe'; +import { ToolTesterLogPipe } from './tool-tester-log.pipe'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { VerifiedDisplayComponent } from '../entry/verified-display/verified-display.component'; +import { NgIf, AsyncPipe, DatePipe } from '@angular/common'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../loading/loading.component'; interface VersionVerifiedInformation { version: WorkflowVersion | Tag; @@ -19,6 +28,21 @@ interface VersionVerifiedInformation { selector: 'app-available-logs', templateUrl: './available-logs.component.html', styleUrls: ['./available-logs.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + LoadingComponent, + MatLegacyCardModule, + NgIf, + VerifiedDisplayComponent, + MatLegacyTableModule, + MatLegacyButtonModule, + FlexModule, + AsyncPipe, + DatePipe, + ToolTesterLogPipe, + RemoveExtensionPipe, + ], }) export class AvailableLogsComponent extends Base implements OnInit { version: Tag | WorkflowVersion | null; diff --git a/src/app/shared/available-logs/remove-extension.pipe.ts b/src/app/shared/available-logs/remove-extension.pipe.ts index 6add2d5dff..45c2381595 100644 --- a/src/app/shared/available-logs/remove-extension.pipe.ts +++ b/src/app/shared/available-logs/remove-extension.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'removeExtension', + standalone: true, }) export class RemoveExtensionPipe implements PipeTransform { /** diff --git a/src/app/shared/available-logs/tool-tester-log.pipe.ts b/src/app/shared/available-logs/tool-tester-log.pipe.ts index 3962068e91..8eb51f6aaa 100644 --- a/src/app/shared/available-logs/tool-tester-log.pipe.ts +++ b/src/app/shared/available-logs/tool-tester-log.pipe.ts @@ -3,6 +3,7 @@ import { Router, UrlTree } from '@angular/router'; import { Dockstore } from '../dockstore.model'; @Pipe({ name: 'toolTesterLog', + standalone: true, }) export class ToolTesterLogPipe implements PipeTransform { constructor(private router: Router) {} diff --git a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts index e8979ad7a8..d89f5c6ec0 100644 --- a/src/app/shared/code-editor-list/code-editor-list.component.spec.ts +++ b/src/app/shared/code-editor-list/code-editor-list.component.spec.ts @@ -27,7 +27,6 @@ describe('CodeEditorListComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CodeEditorListComponent, CodeEditorComponent, PublicFileDownloadPipe, PrivateFilePathPipe], imports: [ MatButtonModule, MatTabsModule, @@ -39,6 +38,10 @@ describe('CodeEditorListComponent', () => { MatCardModule, ClipboardModule, HttpClientTestingModule, + CodeEditorListComponent, + CodeEditorComponent, + PublicFileDownloadPipe, + PrivateFilePathPipe, ], providers: [ { provide: WorkflowService, useClass: WorkflowStubService }, diff --git a/src/app/shared/code-editor-list/code-editor-list.component.ts b/src/app/shared/code-editor-list/code-editor-list.component.ts index 8ca9f0c543..6cc71dc8c6 100644 --- a/src/app/shared/code-editor-list/code-editor-list.component.ts +++ b/src/app/shared/code-editor-list/code-editor-list.component.ts @@ -7,6 +7,20 @@ import { ToolDescriptor } from './../../shared/openapi/model/toolDescriptor'; import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; import { CodeEditorListService } from './code-editor-list.service'; import { FileService } from 'app/shared/file.service'; +import { PrivateFilePathPipe } from '../entry/private-file-path.pipe'; +import { PublicFileDownloadPipe } from '../entry/public-file-download.pipe'; +import { CodeEditorComponent } from '../code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../snackbar.directive'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FormsModule } from '@angular/forms'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam'; @@ -14,6 +28,25 @@ export type FileCategory = 'descriptor' | 'dockerfile' | 'testParam'; selector: 'app-code-editor-list', templateUrl: './code-editor-list.component.html', styleUrls: ['./code-editor-list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + NgFor, + MatToolbarModule, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatIconModule, + SnackbarDirective, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + PublicFileDownloadPipe, + PrivateFilePathPipe, + ], }) export class CodeEditorListComponent { @Input() sourcefiles: SourceFile[]; diff --git a/src/app/shared/code-editor/code-editor.component.spec.ts b/src/app/shared/code-editor/code-editor.component.spec.ts index 145886bec0..967851a280 100644 --- a/src/app/shared/code-editor/code-editor.component.spec.ts +++ b/src/app/shared/code-editor/code-editor.component.spec.ts @@ -10,8 +10,7 @@ describe('CodeEditorComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CodeEditorComponent], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, CodeEditorComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/code-editor/code-editor.component.ts b/src/app/shared/code-editor/code-editor.component.ts index f185c0726e..b6220bb8fb 100644 --- a/src/app/shared/code-editor/code-editor.component.ts +++ b/src/app/shared/code-editor/code-editor.component.ts @@ -10,6 +10,7 @@ let ACE_EDITOR_INSTANCE = 0; selector: 'app-code-editor', templateUrl: './code-editor.component.html', styleUrls: ['./code-editor.component.scss'], + standalone: true, }) export class CodeEditorComponent implements AfterViewInit { editorContent: string; diff --git a/src/app/shared/entry-actions/entry-actions.service.spec.ts b/src/app/shared/entry-actions/entry-actions.service.spec.ts index 7162da7538..a56dfd7878 100644 --- a/src/app/shared/entry-actions/entry-actions.service.spec.ts +++ b/src/app/shared/entry-actions/entry-actions.service.spec.ts @@ -1,18 +1,18 @@ import { inject, TestBed } from '@angular/core/testing'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { ContainersStubService, ContainerStubService, + EntriesStubService, WorkflowsStubService, WorkflowStubService, - EntriesStubService, } from 'app/test/service-stubs'; import { exampleEntry } from '../../test/mocked-objects'; import { ContainerService } from '../container.service'; import { EntryType } from '../enum/entry-type'; -import { CustomMaterialModule } from '../modules/material.module'; +import { ContainersService, DockstoreTool, EntriesService, Entry, Tag, Workflow, WorkflowsService } from '../openapi'; import { WorkflowService } from '../state/workflow.service'; -import { ContainersService, DockstoreTool, Entry, Tag, Workflow, WorkflowsService, EntriesService } from '../openapi'; import { EntryActionsService } from './entry-actions.service'; describe('Service: EntryActionsService', () => { @@ -41,7 +41,7 @@ describe('Service: EntryActionsService', () => { useClass: EntriesStubService, }, ], - imports: [CustomMaterialModule], + imports: [MatLegacySnackBarModule, MatLegacyDialogModule], }); }); diff --git a/src/app/shared/entry-actions/tool-actions.component.ts b/src/app/shared/entry-actions/tool-actions.component.ts index de79fa3153..145098578f 100644 --- a/src/app/shared/entry-actions/tool-actions.component.ts +++ b/src/app/shared/entry-actions/tool-actions.component.ts @@ -4,11 +4,19 @@ import { RefreshService } from '../refresh.service'; import { DockstoreTool, Tag } from '../openapi'; import { EntryActionsComponent } from './entry-actions.component'; import { EntryActionsService } from './entry-actions.service'; +import { ModalComponent } from '../../container/deregister-modal/deregister-modal.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-tool-actions', templateUrl: './tool-actions.component.html', styleUrls: ['./entry-actions.component.scss'], + standalone: true, + imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, ModalComponent, AsyncPipe], }) export class ToolActionsComponent extends EntryActionsComponent implements OnInit, OnChanges { @Input() tool: DockstoreTool; diff --git a/src/app/shared/entry-actions/workflow-actions.component.ts b/src/app/shared/entry-actions/workflow-actions.component.ts index 4ec4cc92d3..37833de1b2 100644 --- a/src/app/shared/entry-actions/workflow-actions.component.ts +++ b/src/app/shared/entry-actions/workflow-actions.component.ts @@ -13,11 +13,18 @@ import { EntryActionsComponent } from './entry-actions.component'; import { EntryActionsService } from './entry-actions.service'; import { DeleteEntryDialogComponent } from '../../entry/delete/dialog/delete-entry-dialog.component'; import { bootstrap4largeModalSize } from '../../shared/constants'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-workflow-actions', templateUrl: './workflow-actions.component.html', styleUrls: ['./entry-actions.component.scss'], + standalone: true, + imports: [NgIf, FlexModule, MatLegacyButtonModule, RouterLink, MatLegacyTooltipModule, AsyncPipe], }) export class WorkflowActionsComponent extends EntryActionsComponent implements OnInit, OnChanges { @Input() workflow: BioWorkflow | Service | Notebook; diff --git a/src/app/shared/entry-to-display-name.pipe.ts b/src/app/shared/entry-to-display-name.pipe.ts index 6d6a59f69b..fe14cc407d 100644 --- a/src/app/shared/entry-to-display-name.pipe.ts +++ b/src/app/shared/entry-to-display-name.pipe.ts @@ -7,6 +7,7 @@ import { DockstoreTool, Workflow } from './openapi'; */ @Pipe({ name: 'entryToDisplayName', + standalone: true, }) export class EntryToDisplayNamePipe implements PipeTransform { transform(entry: DockstoreTool | Workflow): string { diff --git a/src/app/shared/entry-wizard.module.ts b/src/app/shared/entry-wizard.module.ts deleted file mode 100644 index 949639abd7..0000000000 --- a/src/app/shared/entry-wizard.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { EntryWizardComponent } from './entry-wizard/entry-wizard.component'; -import { CustomMaterialModule } from './modules/material.module'; - -@NgModule({ - imports: [CommonModule, CustomMaterialModule, FormsModule], - declarations: [EntryWizardComponent], - exports: [EntryWizardComponent], -}) -export class EntryWizardModule {} diff --git a/src/app/shared/entry-wizard/entry-wizard.component.ts b/src/app/shared/entry-wizard/entry-wizard.component.ts index 9e2340b526..d111fa5141 100644 --- a/src/app/shared/entry-wizard/entry-wizard.component.ts +++ b/src/app/shared/entry-wizard/entry-wizard.component.ts @@ -1,15 +1,35 @@ import { Component, OnInit } from '@angular/core'; -import { MatLegacySlideToggleChange as MatSlideToggleChange } from '@angular/material/legacy-slide-toggle'; +import { MatLegacySlideToggleChange as MatSlideToggleChange, MatLegacySlideToggleModule } from '@angular/material/legacy-slide-toggle'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { Repository } from '../openapi/model/repository'; import { EntryWizardQuery } from '../state/entry-wizard.query'; import { EntryWizardService } from '../state/entry-wizard.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { FormsModule } from '@angular/forms'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-entry-wizard', templateUrl: './entry-wizard.component.html', styleUrls: ['./entry-wizard.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + FormsModule, + NgFor, + MatLegacyOptionModule, + MatLegacySlideToggleModule, + MatLegacyTooltipModule, + AsyncPipe, + ], }) export class EntryWizardComponent implements OnInit { isLoading$: Observable; diff --git a/src/app/shared/entry/base-url.pipe.ts b/src/app/shared/entry/base-url.pipe.ts index afcd2c392a..c0dcccd770 100644 --- a/src/app/shared/entry/base-url.pipe.ts +++ b/src/app/shared/entry/base-url.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'baseUrl', + standalone: true, }) export class BaseUrlPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/commit-url.pipe.ts b/src/app/shared/entry/commit-url.pipe.ts index 1af461154b..3e4c56ff6d 100644 --- a/src/app/shared/entry/commit-url.pipe.ts +++ b/src/app/shared/entry/commit-url.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'commitUrl', + standalone: true, }) export class CommitUrlPipe implements PipeTransform { transform(commitId: string, providerUrl: string): string { diff --git a/src/app/shared/entry/descriptor-language-versions.pipe.ts b/src/app/shared/entry/descriptor-language-versions.pipe.ts index 43cb01bb8d..7c74ea2e42 100644 --- a/src/app/shared/entry/descriptor-language-versions.pipe.ts +++ b/src/app/shared/entry/descriptor-language-versions.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'descriptorLanguageVersions', + standalone: true, }) export class DescriptorLanguageVersionsPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/descriptor-language.pipe.ts b/src/app/shared/entry/descriptor-language.pipe.ts index be955ac018..ed3111fc2d 100644 --- a/src/app/shared/entry/descriptor-language.pipe.ts +++ b/src/app/shared/entry/descriptor-language.pipe.ts @@ -4,6 +4,7 @@ import { Workflow } from '../../shared/openapi'; @Pipe({ name: 'descriptorLanguage', + standalone: true, }) export class DescriptorLanguagePipe implements PipeTransform { /** diff --git a/src/app/shared/entry/entry.module.ts b/src/app/shared/entry/entry.module.ts index be0fa5162a..69ea97fcb0 100644 --- a/src/app/shared/entry/entry.module.ts +++ b/src/app/shared/entry/entry.module.ts @@ -22,16 +22,13 @@ import { RouterModule } from '@angular/router'; import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; import { ShareIconsModule } from 'ngx-sharebuttons/icons'; -import { RefreshAlertModule } from '../alert/alert.module'; -import { AvailableLogsModule } from '../available-logs.module'; + import { BioschemaService } from '../bioschema.service'; import { CodeEditorListComponent } from '../code-editor-list/code-editor-list.component'; import { CodeEditorComponent } from '../code-editor/code-editor.component'; import { EntryActionsService } from '../entry-actions/entry-actions.service'; import { PublicFileDownloadPipe } from '../entry/public-file-download.pipe'; -import { JsonLdModule } from '../modules/json-ld.module'; -import { CustomMaterialModule } from '../modules/material.module'; -import { SnackbarModule } from '../modules/snackbar.module'; + import { CommitUrlPipe } from './commit-url.pipe'; import { InfoTabCheckerWorkflowPathComponent } from './info-tab-checker-workflow-path/info-tab-checker-workflow-path.component'; import { LaunchCheckerWorkflowComponent } from './launch-checker-workflow/launch-checker-workflow.component'; @@ -45,19 +42,12 @@ import { VersionProviderUrlPipe } from './versionProviderUrl.pipe'; @NgModule({ imports: [ - AvailableLogsModule, CommonModule, FormsModule, - CustomMaterialModule, FlexLayoutModule, - JsonLdModule, ClipboardModule, RouterModule, ReactiveFormsModule, - RefreshAlertModule, - SnackbarModule, - ], - declarations: [ InfoTabCheckerWorkflowPathComponent, RegisterCheckerWorkflowComponent, LaunchCheckerWorkflowComponent, @@ -76,16 +66,12 @@ import { VersionProviderUrlPipe } from './versionProviderUrl.pipe'; LaunchCheckerWorkflowComponent, CodeEditorComponent, CodeEditorListComponent, - CustomMaterialModule, CommitUrlPipe, FlexLayoutModule, VerifiedByComponent, - VerifiedDisplayComponent, VerifiedPlatformsPipe, VersionProviderUrlPipe, PublicFileDownloadPipe, - JsonLdModule, - RefreshAlertModule, ShareButtonsModule, ShareIconsModule, UrlDeconstructPipe, diff --git a/src/app/shared/entry/execution-status.pipe.ts b/src/app/shared/entry/execution-status.pipe.ts index 33407f44f2..72e1a8b37f 100644 --- a/src/app/shared/entry/execution-status.pipe.ts +++ b/src/app/shared/entry/execution-status.pipe.ts @@ -4,6 +4,7 @@ import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; @Pipe({ name: 'executionStatus', + standalone: true, }) export class ExecutionStatusPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.spec.ts b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.spec.ts index 0c4b56fc98..73723b60e0 100644 --- a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.spec.ts +++ b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.spec.ts @@ -18,12 +18,11 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { RouterTestingModule } from '@angular/router/testing'; -import { CheckerWorkflowStubService, RegisterCheckerWorkflowStubService, EntryTypeMetadataStubService } from '../../../test/service-stubs'; -import { CustomMaterialModule } from '../../modules/material.module'; +import { EntryTypeMetadataService } from '../../../entry/type-metadata/entry-type-metadata.service'; +import { CheckerWorkflowStubService, EntryTypeMetadataStubService, RegisterCheckerWorkflowStubService } from '../../../test/service-stubs'; import { CheckerWorkflowService } from '../../state/checker-workflow.service'; import { RegisterCheckerWorkflowService } from '../register-checker-workflow/register-checker-workflow.service'; import { InfoTabCheckerWorkflowPathComponent } from './info-tab-checker-workflow-path.component'; -import { EntryTypeMetadataService } from '../../../entry/type-metadata/entry-type-metadata.service'; describe('InfoTabCheckerWorkflowPathComponent', () => { let component: InfoTabCheckerWorkflowPathComponent; @@ -32,13 +31,12 @@ describe('InfoTabCheckerWorkflowPathComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [FormsModule, RouterTestingModule, MatDialogModule, CustomMaterialModule], + imports: [FormsModule, RouterTestingModule, MatDialogModule, InfoTabCheckerWorkflowPathComponent], providers: [ { provide: CheckerWorkflowService, useClass: CheckerWorkflowStubService }, { provide: RegisterCheckerWorkflowService, useClass: RegisterCheckerWorkflowStubService }, { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, ], - declarations: [InfoTabCheckerWorkflowPathComponent], schemas: [CUSTOM_ELEMENTS_SCHEMA], }).compileComponents(); }) diff --git a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.ts b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.ts index f731f4f438..c8867b0301 100644 --- a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.ts +++ b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.ts @@ -24,11 +24,20 @@ import { CheckerWorkflowQuery } from '../../state/checker-workflow.query'; import { CheckerWorkflowService } from '../../state/checker-workflow.service'; import { RegisterCheckerWorkflowComponent } from '../register-checker-workflow/register-checker-workflow.component'; import { RegisterCheckerWorkflowService } from '../register-checker-workflow/register-checker-workflow.service'; +import { MatIconModule } from '@angular/material/icon'; +import { RouterLink } from '@angular/router'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { FormsModule } from '@angular/forms'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-info-tab-checker-workflow-path', templateUrl: './info-tab-checker-workflow-path.component.html', styleUrls: ['./info-tab-checker-workflow-path.component.scss'], + standalone: true, + imports: [NgIf, FormsModule, FlexModule, MatLegacyTooltipModule, MatLegacyButtonModule, RouterLink, MatIconModule, AsyncPipe], }) export class InfoTabCheckerWorkflowPathComponent extends Base implements OnInit, OnDestroy { isPublic$: Observable; diff --git a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts index d18832b31c..2b92191f00 100644 --- a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts +++ b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.spec.ts @@ -26,9 +26,8 @@ describe('LaunchCheckerWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchCheckerWorkflowComponent], providers: [{ provide: CheckerWorkflowService, useClass: CheckerWorkflowStubService }], - imports: [MatCardModule], + imports: [MatCardModule, LaunchCheckerWorkflowComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts index 9f7cfc722c..a64a00a8de 100644 --- a/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts +++ b/src/app/shared/entry/launch-checker-workflow/launch-checker-workflow.component.ts @@ -18,11 +18,29 @@ import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CheckerWorkflowQuery } from '../../state/checker-workflow.query'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-launch-checker-workflow', templateUrl: './launch-checker-workflow.component.html', styleUrls: ['./launch-checker-workflow.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + AsyncPipe, + ], }) export class LaunchCheckerWorkflowComponent { @Input() command: string; diff --git a/src/app/shared/entry/platform-partner.pipe.ts b/src/app/shared/entry/platform-partner.pipe.ts index 1169aa59ea..3425b36f6b 100644 --- a/src/app/shared/entry/platform-partner.pipe.ts +++ b/src/app/shared/entry/platform-partner.pipe.ts @@ -4,6 +4,7 @@ import PartnerEnum = CloudInstance.PartnerEnum; @Pipe({ name: 'platformPartner', + standalone: true, }) export class PlatformPartnerPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/private-file-path.pipe.ts b/src/app/shared/entry/private-file-path.pipe.ts index 9cb1f35d93..5c55dec7cc 100644 --- a/src/app/shared/entry/private-file-path.pipe.ts +++ b/src/app/shared/entry/private-file-path.pipe.ts @@ -3,6 +3,7 @@ import { FileService } from '../file.service'; @Pipe({ name: 'privateFilePath', + standalone: true, }) export class PrivateFilePathPipe implements PipeTransform { constructor(protected fileService: FileService) {} diff --git a/src/app/shared/entry/public-file-download.pipe.ts b/src/app/shared/entry/public-file-download.pipe.ts index 60e785179a..289f8cb686 100644 --- a/src/app/shared/entry/public-file-download.pipe.ts +++ b/src/app/shared/entry/public-file-download.pipe.ts @@ -6,6 +6,7 @@ import { ToolDescriptor } from '../openapi'; @Pipe({ name: 'publicFileDownload', + standalone: true, }) export class PublicFileDownloadPipe implements PipeTransform { constructor(protected fileService: FileService) {} diff --git a/src/app/shared/entry/recent-events.pipe.ts b/src/app/shared/entry/recent-events.pipe.ts index 3af5c702af..54681638c7 100644 --- a/src/app/shared/entry/recent-events.pipe.ts +++ b/src/app/shared/entry/recent-events.pipe.ts @@ -5,6 +5,7 @@ import { EntryType } from '../../shared/enum/entry-type'; @Pipe({ name: 'recentEvents', + standalone: true, }) export class RecentEventsPipe implements PipeTransform { private EntryType = EntryType; diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts index ad72a31179..6f67af0d5a 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.spec.ts @@ -19,7 +19,6 @@ import { FormsModule } from '@angular/forms'; import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { CheckerWorkflowStubService, DescriptorLanguageStubService, RegisterCheckerWorkflowStubService } from '../../../test/service-stubs'; import { DescriptorTypeCompatService } from '../../descriptor-type-compat.service'; import { CheckerWorkflowService } from '../../state/checker-workflow.service'; @@ -34,9 +33,8 @@ describe('RegisterCheckerWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RegisterCheckerWorkflowComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [FormsModule, MatSnackBarModule, MatDialogModule, BrowserAnimationsModule, CustomMaterialModule], + imports: [FormsModule, MatSnackBarModule, MatDialogModule, BrowserAnimationsModule, RegisterCheckerWorkflowComponent], providers: [ { provide: RegisterCheckerWorkflowService, useClass: RegisterCheckerWorkflowStubService }, { provide: CheckerWorkflowService, useClass: CheckerWorkflowStubService }, diff --git a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts index 7c46a751b2..9d36b1ed0d 100644 --- a/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts +++ b/src/app/shared/entry/register-checker-workflow/register-checker-workflow.component.ts @@ -15,7 +15,7 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { AfterViewChecked, Component, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; +import { NgForm, FormsModule } from '@angular/forms'; import { ExtendedDescriptorLanguageBean } from 'app/entry/extendedDescriptorLanguage'; import { Observable } from 'rxjs'; import { debounceTime, takeUntil } from 'rxjs/operators'; @@ -31,9 +31,33 @@ import { Workflow } from '../../openapi/model/workflow'; import { formErrors, validationDescriptorPatterns, validationMessages } from '../../validationMessages.model'; import { DescriptorLanguageService } from '../descriptor-language.service'; import { RegisterCheckerWorkflowService } from './register-checker-workflow.service'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { NgIf, NgFor, AsyncPipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { AlertComponent } from '../../alert/alert.component'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; @Component({ templateUrl: './register-checker-workflow.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTooltipModule, + NgIf, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatLegacyButtonModule, + AsyncPipe, + ], }) export class RegisterCheckerWorkflowComponent extends Base implements OnInit, AfterViewChecked { constructor( diff --git a/src/app/shared/entry/select-tab.pipe.ts b/src/app/shared/entry/select-tab.pipe.ts index 2976de1d6f..08dbc7b26d 100644 --- a/src/app/shared/entry/select-tab.pipe.ts +++ b/src/app/shared/entry/select-tab.pipe.ts @@ -22,6 +22,7 @@ import { DockstoreTool, Entry, Workflow } from '../openapi'; @Pipe({ name: 'selectTab', + standalone: true, }) export class SelectTabPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/url-deconstruct.pipe.ts b/src/app/shared/entry/url-deconstruct.pipe.ts index 16fe8c4373..fb601b7e32 100644 --- a/src/app/shared/entry/url-deconstruct.pipe.ts +++ b/src/app/shared/entry/url-deconstruct.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'urlDeconstruct', + standalone: true, }) export class UrlDeconstructPipe implements PipeTransform { /** diff --git a/src/app/shared/entry/verified-by/verified-by.component.spec.ts b/src/app/shared/entry/verified-by/verified-by.component.spec.ts index 287abe9746..3f5ef67d6e 100644 --- a/src/app/shared/entry/verified-by/verified-by.component.spec.ts +++ b/src/app/shared/entry/verified-by/verified-by.component.spec.ts @@ -1,5 +1,4 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../modules/material.module'; import { VerifiedByComponent } from './verified-by.component'; describe('VerifiedByComponent', () => { @@ -9,8 +8,7 @@ describe('VerifiedByComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule], - declarations: [VerifiedByComponent], + imports: [VerifiedByComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/verified-by/verified-by.component.ts b/src/app/shared/entry/verified-by/verified-by.component.ts index d9e461b07b..5101a1856c 100644 --- a/src/app/shared/entry/verified-by/verified-by.component.ts +++ b/src/app/shared/entry/verified-by/verified-by.component.ts @@ -1,14 +1,21 @@ import { Component, Input, OnChanges } from '@angular/core'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { AvailableLogsComponent } from '../../available-logs/available-logs.component'; import { bootstrap4largeModalSize } from '../../constants'; import { VersionVerifiedPlatform, Tag, WorkflowVersion } from '../../openapi'; import { VerifiedByService } from '../../verified-by.service'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-verified-by', templateUrl: './verified-by.component.html', styleUrls: ['./verified-by.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, FlexModule, MatLegacyButtonModule, MatDividerModule, NgFor, MatLegacyDialogModule], }) export class VerifiedByComponent implements OnChanges { @Input() version: WorkflowVersion | Tag; diff --git a/src/app/shared/entry/verified-display/verified-display.component.spec.ts b/src/app/shared/entry/verified-display/verified-display.component.spec.ts index 847213cc92..9c21bf5dff 100644 --- a/src/app/shared/entry/verified-display/verified-display.component.spec.ts +++ b/src/app/shared/entry/verified-display/verified-display.component.spec.ts @@ -3,7 +3,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { versionVerifiedPlatform } from '../../../test/mocked-objects'; -import { CustomMaterialModule } from '../../modules/material.module'; import { VerifiedDisplayComponent } from './verified-display.component'; describe('VerifiedDisplayComponent', () => { @@ -13,8 +12,7 @@ describe('VerifiedDisplayComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [VerifiedDisplayComponent], - imports: [CustomMaterialModule, BrowserAnimationsModule], + imports: [BrowserAnimationsModule, VerifiedDisplayComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/entry/verified-display/verified-display.component.ts b/src/app/shared/entry/verified-display/verified-display.component.ts index 714217d438..5819327618 100644 --- a/src/app/shared/entry/verified-display/verified-display.component.ts +++ b/src/app/shared/entry/verified-display/verified-display.component.ts @@ -14,14 +14,16 @@ * limitations under the License. */ import { Component, Input, OnChanges, OnInit, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { VersionVerifiedPlatform, Tag, VerificationInformation, WorkflowVersion } from '../../openapi'; @Component({ selector: 'app-verified-display', templateUrl: './verified-display.component.html', styleUrls: ['./verified-display.component.scss'], + standalone: true, + imports: [MatLegacyTableModule, MatSortModule], }) export class VerifiedDisplayComponent implements OnInit, OnChanges { @Input() verifiedByPlatform: Array; diff --git a/src/app/shared/entry/verified-platforms.pipe.ts b/src/app/shared/entry/verified-platforms.pipe.ts index 43bb2e3633..94af00a4b9 100644 --- a/src/app/shared/entry/verified-platforms.pipe.ts +++ b/src/app/shared/entry/verified-platforms.pipe.ts @@ -3,6 +3,7 @@ import { VersionVerifiedPlatform } from '../openapi'; @Pipe({ name: 'verifiedPlatforms', + standalone: true, }) export class VerifiedPlatformsPipe implements PipeTransform { transform(versionid: number, versionVerifiedPlatform: Array): string { diff --git a/src/app/shared/entry/versionProviderUrl.pipe.ts b/src/app/shared/entry/versionProviderUrl.pipe.ts index 1166ea2303..bdad727c5a 100644 --- a/src/app/shared/entry/versionProviderUrl.pipe.ts +++ b/src/app/shared/entry/versionProviderUrl.pipe.ts @@ -2,6 +2,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'versionProviderUrl', + standalone: true, }) export class VersionProviderUrlPipe implements PipeTransform { transform(providerUrl: string, versionName: string): any { diff --git a/src/app/shared/img-fallback.directive.spec.ts b/src/app/shared/img-fallback.directive.spec.ts index 2074cc55b4..a7866be8e6 100644 --- a/src/app/shared/img-fallback.directive.spec.ts +++ b/src/app/shared/img-fallback.directive.spec.ts @@ -5,6 +5,8 @@ import { ImgFallbackDirective } from './img-fallback.directive'; @Component({ template: '', + imports: [ImgFallbackDirective], + standalone: true, }) class TestComponent {} @@ -12,9 +14,7 @@ describe('ImgFallbackDirective', () => { let img: any; beforeEach(() => { - const component = TestBed.configureTestingModule({ declarations: [ImgFallbackDirective, TestComponent] }).createComponent( - TestComponent - ); + const component = TestBed.configureTestingModule({ imports: [TestComponent] }).createComponent(TestComponent); img = component.debugElement.query(By.css('img')).nativeElement; }); diff --git a/src/app/shared/img-fallback.directive.ts b/src/app/shared/img-fallback.directive.ts index 904d31125a..4f47e284b5 100644 --- a/src/app/shared/img-fallback.directive.ts +++ b/src/app/shared/img-fallback.directive.ts @@ -2,6 +2,7 @@ import { Directive, ElementRef, HostListener, Input } from '@angular/core'; @Directive({ selector: 'img[appFallback]', + standalone: true, }) export class ImgFallbackDirective { @Input() appFallback: string; diff --git a/src/app/shared/json-ld/json-ld.component.spec.ts b/src/app/shared/json-ld/json-ld.component.spec.ts index 8b4e62f963..d15442b836 100644 --- a/src/app/shared/json-ld/json-ld.component.spec.ts +++ b/src/app/shared/json-ld/json-ld.component.spec.ts @@ -72,7 +72,7 @@ describe('JsonLdComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [JsonLdComponent], + imports: [JsonLdComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/json-ld/json-ld.component.ts b/src/app/shared/json-ld/json-ld.component.ts index 38c5aa4ea4..bade532c21 100644 --- a/src/app/shared/json-ld/json-ld.component.ts +++ b/src/app/shared/json-ld/json-ld.component.ts @@ -56,6 +56,7 @@ import { DomSanitizer, SafeHtml } from '@angular/platform-browser'; selector: 'app-json-ld', template: '', changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, }) export class JsonLdComponent { @Input() diff --git a/src/app/shared/loading/loading.component.spec.ts b/src/app/shared/loading/loading.component.spec.ts index 531b8b63ac..aa9611b6ca 100644 --- a/src/app/shared/loading/loading.component.spec.ts +++ b/src/app/shared/loading/loading.component.spec.ts @@ -11,8 +11,7 @@ describe('LoadingComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MatProgressBarModule], - declarations: [LoadingComponent], + imports: [MatProgressBarModule, LoadingComponent], }).compileComponents(); }) ); diff --git a/src/app/shared/loading/loading.component.ts b/src/app/shared/loading/loading.component.ts index fc25182ea1..278f45156c 100644 --- a/src/app/shared/loading/loading.component.ts +++ b/src/app/shared/loading/loading.component.ts @@ -1,4 +1,6 @@ import { Component, Input } from '@angular/core'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf } from '@angular/common'; /** * To use this component, wrap your original component with this component's tags @@ -13,6 +15,8 @@ import { Component, Input } from '@angular/core'; selector: 'app-loading', templateUrl: './loading.component.html', styleUrls: ['./loading.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyProgressBarModule], }) export class LoadingComponent { @Input() loading = true; diff --git a/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts b/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts index fa51723453..d7f6d7c7e1 100644 --- a/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts +++ b/src/app/shared/markdown-wrapper/markdown-wrapper.component.spec.ts @@ -11,8 +11,7 @@ describe('MarkdownWrapperComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [MarkdownModule], - declarations: [MarkdownWrapperComponent], + imports: [MarkdownModule, MarkdownWrapperComponent], providers: [MarkdownService, { provide: SECURITY_CONTEXT, useValue: SecurityContext.HTML }], }).compileComponents(); }) diff --git a/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts b/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts index 0619925da2..20c7ca8558 100644 --- a/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts +++ b/src/app/shared/markdown-wrapper/markdown-wrapper.component.ts @@ -5,6 +5,7 @@ import { MarkdownWrapperService } from './markdown-wrapper.service'; selector: 'app-markdown-wrapper', templateUrl: './markdown-wrapper.component.html', styleUrls: ['./markdown-wrapper.component.scss'], + standalone: true, }) export class MarkdownWrapperComponent implements OnChanges { @Input() data: string; diff --git a/src/app/shared/mastodon/mastodon.component.ts b/src/app/shared/mastodon/mastodon.component.ts index 81645bdc66..6fa01f2d41 100644 --- a/src/app/shared/mastodon/mastodon.component.ts +++ b/src/app/shared/mastodon/mastodon.component.ts @@ -6,6 +6,10 @@ import { Component } from '@angular/core'; import { MastodonService } from './mastodon.service'; // Import the service +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { NgFor, NgIf, NgStyle } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; export interface MastodonTimelineData { postUrl: string; @@ -25,6 +29,8 @@ export interface MastodonTimelineData { selector: 'app-mastodon-timeline', templateUrl: './mastodon.component.html', styleUrls: ['./mastodon.component.scss'], + standalone: true, + imports: [MatLegacyCardModule, MatDividerModule, NgFor, NgIf, NgStyle, ExtendedModule], }) export class MastodonComponent { fetchedData: Map; diff --git a/src/app/shared/modules/container.module.ts b/src/app/shared/modules/container.module.ts deleted file mode 100644 index 3dda0418a9..0000000000 --- a/src/app/shared/modules/container.module.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { FormsModule } from '@angular/forms'; - -import { MarkdownModule } from 'ngx-markdown'; -import { ContainerComponent } from '../../container/container.component'; -import { DescriptorsComponent } from '../../container/descriptors/descriptors.component'; -import { DockerfileComponent } from '../../container/dockerfile/dockerfile.component'; -import { EmailService } from '../../container/email.service'; -import { FilesContainerComponent } from '../../container/files/files.component'; -import { LaunchComponent } from '../../container/launch/launch.component'; -import { ToolLaunchService } from '../../container/launch/tool-launch.service'; -import { ParamfilesComponent } from '../../container/paramfiles/paramfiles.component'; -import { ParamfilesService } from '../../container/paramfiles/paramfiles.service'; -import { ToolFileEditorComponent } from '../../container/tool-file-editor/tool-file-editor.component'; -import { VersionsContainerComponent } from '../../container/versions/versions.component'; -import { ViewContainerComponent } from '../../container/view/view.component'; -import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { AddEntryModule } from '../../organizations/collection/add-entry.module'; -import { OrderByModule } from '../../shared/modules/orderby.module'; -import { StargazersModule } from '../../stargazers/stargazers.module'; -import { StarringModule } from '../../starring/starring.module'; -import { StarringService } from '../../starring/starring.service'; -import { DateService } from '../date.service'; -import { ToolActionsComponent } from '../entry-actions/tool-actions.component'; -import { FileService } from '../file.service'; -import { PipeModule } from '../pipe/pipe.module'; -import { AddTagComponent } from './../../container/add-tag/add-tag.component'; -import { ModalComponent } from './../../container/deregister-modal/deregister-modal.component'; -import { InfoTabComponent } from './../../container/info-tab/info-tab.component'; -import { InfoTabService } from './../../container/info-tab/info-tab.service'; -import { RegisterToolService } from './../../container/register-tool/register-tool.service'; -import { VersionModalComponent } from './../../container/version-modal/version-modal.component'; -import { VersionModalService } from './../../container/version-modal/version-modal.service'; -import { EntryModule } from './../entry/entry.module'; -import { CustomMaterialModule } from './../modules/material.module'; -import { PrivateIconModule } from './../private-icon/private-icon.module'; -import { RefreshService } from './../refresh.service'; -import { HeaderModule } from './header.module'; -import { ListContainersModule } from './list-containers.module'; -import { MarkdownWrapperModule } from './markdown-wrapper.module'; -import { SelectModule } from './select.module'; -import { SnackbarModule } from './snackbar.module'; -import { CategoryButtonModule } from './../../categories/button/category-button.module'; -import { WorkflowModule } from './workflow.module'; -import { AiBubbleModule } from '../ai-bubble/ai-bubble.module'; - -@NgModule({ - declarations: [ - ContainerComponent, - LaunchComponent, - VersionsContainerComponent, - ViewContainerComponent, - FilesContainerComponent, - DockerfileComponent, - DescriptorsComponent, - ParamfilesComponent, - ModalComponent, - ToolActionsComponent, - AddTagComponent, - VersionModalComponent, - InfoTabComponent, - ToolFileEditorComponent, - ], - imports: [ - CommonModule, - ClipboardModule, - CurrentCollectionsModule, - HeaderModule, - SelectModule, - ListContainersModule, - FormsModule, - OrderByModule, - PrivateIconModule, - StarringModule, - StargazersModule, - EntryModule, - AddEntryModule, - FlexLayoutModule, - MarkdownModule, - MarkdownWrapperModule, - PipeModule, - SnackbarModule, - CategoryButtonModule, - WorkflowModule, - AiBubbleModule, - ], - providers: [ - EmailService, - DateService, - FileService, - ToolLaunchService, - ParamfilesService, - RefreshService, - RegisterToolService, - StarringService, - VersionModalService, - InfoTabService, - ], - exports: [ContainerComponent, CustomMaterialModule, EntryModule, ToolActionsComponent], -}) -export class ContainerModule {} diff --git a/src/app/shared/modules/header.module.ts b/src/app/shared/modules/header.module.ts deleted file mode 100644 index 64653fb407..0000000000 --- a/src/app/shared/modules/header.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { HeaderComponent } from '../../header/header.component'; -import { RefreshAlertModule } from '../alert/alert.module'; - -@NgModule({ - declarations: [HeaderComponent], - imports: [RefreshAlertModule], - providers: [], - exports: [HeaderComponent], -}) -export class HeaderModule {} diff --git a/src/app/shared/modules/img-fallback.module.ts b/src/app/shared/modules/img-fallback.module.ts deleted file mode 100644 index 543416b7d7..0000000000 --- a/src/app/shared/modules/img-fallback.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { ImgFallbackDirective } from '../img-fallback.directive'; - -@NgModule({ - declarations: [ImgFallbackDirective], - exports: [ImgFallbackDirective], -}) -export class ImgFallbackModule {} diff --git a/src/app/shared/modules/json-ld.module.ts b/src/app/shared/modules/json-ld.module.ts deleted file mode 100644 index 411bad6f55..0000000000 --- a/src/app/shared/modules/json-ld.module.ts +++ /dev/null @@ -1,27 +0,0 @@ -/* - * - * * Copyright 2022 OICR and UCSC - * * - * * Licensed under the Apache License, Version 2.0 (the "License"); - * * you may not use this file except in compliance with the License. - * * You may obtain a copy of the License at - * * - * * http://www.apache.org/licenses/LICENSE-2.0 - * * - * * Unless required by applicable law or agreed to in writing, software - * * distributed under the License is distributed on an "AS IS" BASIS, - * * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * * See the License for the specific language governing permissions and - * * limitations under the License. - * - * - */ - -import { NgModule } from '@angular/core'; -import { JsonLdComponent } from '../json-ld/json-ld.component'; - -@NgModule({ - declarations: [JsonLdComponent], - exports: [JsonLdComponent], -}) -export class JsonLdModule {} diff --git a/src/app/shared/modules/list-containers.module.ts b/src/app/shared/modules/list-containers.module.ts deleted file mode 100644 index fd13cf9fad..0000000000 --- a/src/app/shared/modules/list-containers.module.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; - -import { ListContainersComponent } from '../../containers/list/list.component'; -import { ListContainersService } from '../../containers/list/list.service'; -import { PublishedToolsDataSource } from '../../containers/list/published-tools.datasource'; -import { EntryModule } from '../entry/entry.module'; -import { PrivateIconModule } from '../private-icon/private-icon.module'; -import { HeaderModule } from './header.module'; -import { CustomMaterialModule } from './material.module'; - -@NgModule({ - declarations: [ListContainersComponent], - imports: [CommonModule, RouterModule, ClipboardModule, CustomMaterialModule, HeaderModule, PrivateIconModule, EntryModule], - providers: [PublishedToolsDataSource, ListContainersService], - exports: [ListContainersComponent], -}) -export class ListContainersModule {} diff --git a/src/app/shared/modules/list-workflows.module.ts b/src/app/shared/modules/list-workflows.module.ts deleted file mode 100644 index 932e8941ea..0000000000 --- a/src/app/shared/modules/list-workflows.module.ts +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { RouterModule } from '@angular/router'; -import { ListWorkflowsComponent } from '../../workflows/list/list.component'; -import { PublishedWorkflowsDataSource } from '../../workflows/list/published-workflows.datasource'; -import { EntryModule } from '../entry/entry.module'; -import { PipeModule } from '../pipe/pipe.module'; -import { HeaderModule } from './header.module'; -import { CustomMaterialModule } from './material.module'; - -@NgModule({ - declarations: [ListWorkflowsComponent], - imports: [CommonModule, RouterModule, HeaderModule, CustomMaterialModule, EntryModule, PipeModule], - providers: [PublishedWorkflowsDataSource], - exports: [ListWorkflowsComponent], -}) -export class ListWorkflowsModule {} diff --git a/src/app/shared/modules/markdown-wrapper.module.ts b/src/app/shared/modules/markdown-wrapper.module.ts deleted file mode 100644 index 0ffff82d45..0000000000 --- a/src/app/shared/modules/markdown-wrapper.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2020 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MarkdownModule } from 'ngx-markdown'; -import { MarkdownWrapperComponent } from '../markdown-wrapper/markdown-wrapper.component'; -import { MarkdownWrapperService } from '../markdown-wrapper/markdown-wrapper.service'; - -@NgModule({ - declarations: [MarkdownWrapperComponent], - imports: [CommonModule, MarkdownModule], - providers: [MarkdownWrapperService], - exports: [MarkdownWrapperComponent], -}) -export class MarkdownWrapperModule {} diff --git a/src/app/shared/modules/material.module.ts b/src/app/shared/modules/material.module.ts deleted file mode 100644 index 614afd25aa..0000000000 --- a/src/app/shared/modules/material.module.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright 2018 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License") - * you may not use this file except in compliance with the License - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { DragDropModule } from '@angular/cdk/drag-drop'; -import { NgModule } from '@angular/core'; -import { MatBadgeModule } from '@angular/material/badge'; -import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; -import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatLegacyCheckboxModule as MatCheckboxModule } from '@angular/material/legacy-checkbox'; -import { MatLegacyChipsModule as MatChipsModule } from '@angular/material/legacy-chips'; -import { MatLegacyDialogModule as MatDialogModule } from '@angular/material/legacy-dialog'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatExpansionModule } from '@angular/material/expansion'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; -import { MatLegacyListModule as MatListModule } from '@angular/material/legacy-list'; -import { MatLegacyMenuModule as MatMenuModule } from '@angular/material/legacy-menu'; -import { MatLegacyPaginatorModule as MatPaginatorModule } from '@angular/material/legacy-paginator'; -import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; -import { MatLegacyProgressSpinnerModule as MatProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; -import { MatLegacyRadioModule as MatRadioModule } from '@angular/material/legacy-radio'; -import { MatLegacySelectModule as MatSelectModule } from '@angular/material/legacy-select'; -import { MatSidenavModule } from '@angular/material/sidenav'; -import { MatLegacySlideToggleModule as MatSlideToggleModule } from '@angular/material/legacy-slide-toggle'; -import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; -import { MatSortModule } from '@angular/material/sort'; -import { MatStepperModule } from '@angular/material/stepper'; -import { MatLegacyTableModule as MatTableModule } from '@angular/material/legacy-table'; -import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; -import { MatToolbarModule } from '@angular/material/toolbar'; -import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; -import { MatTreeModule } from '@angular/material/tree'; - -const MATERIAL_MODULES = [ - DragDropModule, - MatBadgeModule, - MatButtonModule, - MatCardModule, - MatCheckboxModule, - MatChipsModule, - MatDialogModule, - MatDividerModule, - MatExpansionModule, - MatFormFieldModule, - MatIconModule, - MatInputModule, - MatListModule, - MatMenuModule, - MatPaginatorModule, - MatProgressBarModule, - MatProgressSpinnerModule, - MatRadioModule, - MatSelectModule, - MatSidenavModule, - MatSnackBarModule, - MatSortModule, - MatStepperModule, - MatTableModule, - MatTabsModule, - MatToolbarModule, - MatTooltipModule, - MatTreeModule, - MatSlideToggleModule, -]; - -@NgModule({ - imports: MATERIAL_MODULES, - exports: MATERIAL_MODULES, -}) -export class CustomMaterialModule {} diff --git a/src/app/shared/modules/my-entries.module.ts b/src/app/shared/modules/my-entries.module.ts deleted file mode 100644 index ac0ba2842a..0000000000 --- a/src/app/shared/modules/my-entries.module.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MyEntriesQuery } from '../state/my-entries.query'; -import { MyEntriesStateService } from '../state/my-entries.service'; -import { MyEntriesStore } from '../state/my-entries.store'; - -/** - * This module contains components and services that are common to all my-entry pages (such as my-tools, my-workflows, my-services) - * - * @export - * @class MyEntriesModule - */ -@NgModule({ - providers: [MyEntriesStateService, MyEntriesStore, MyEntriesQuery], - imports: [CommonModule], -}) -export class MyEntriesModule {} diff --git a/src/app/shared/modules/my-sidebar.module.ts b/src/app/shared/modules/my-sidebar.module.ts deleted file mode 100644 index 2f1bc4695c..0000000000 --- a/src/app/shared/modules/my-sidebar.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { RouterModule } from '@angular/router'; - -@NgModule({ - declarations: [MySidebarComponent], - imports: [CommonModule, CustomMaterialModule, RouterModule], - providers: [], - exports: [MySidebarComponent], -}) -export class MySidebarModule {} diff --git a/src/app/shared/modules/orderby.module.ts b/src/app/shared/modules/orderby.module.ts deleted file mode 100644 index 21f29d602f..0000000000 --- a/src/app/shared/modules/orderby.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; - -/* Bootstrap */ -import { OrderBy } from '../../shared/orderBy'; - -@NgModule({ - declarations: [OrderBy], - exports: [OrderBy], -}) -export class OrderByModule {} diff --git a/src/app/shared/modules/preview-warning.module.ts b/src/app/shared/modules/preview-warning.module.ts deleted file mode 100644 index da80a008c3..0000000000 --- a/src/app/shared/modules/preview-warning.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2023 OICR, UCSC - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { NgModule } from '@angular/core'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; -import { PreviewWarningComponent } from '../../preview-warning/preview-warning.component'; - -@NgModule({ - declarations: [PreviewWarningComponent], - imports: [CustomMaterialModule], - exports: [PreviewWarningComponent], -}) -export class PreviewWarningModule {} diff --git a/src/app/shared/modules/register-github-app.module.ts b/src/app/shared/modules/register-github-app.module.ts deleted file mode 100644 index 97f46c043f..0000000000 --- a/src/app/shared/modules/register-github-app.module.ts +++ /dev/null @@ -1,39 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FlexModule } from '@ngbracket/ngx-layout'; -import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; -import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; -import { RouterLink } from '@angular/router'; -import { RegisterGithubAppComponent } from '../register-github-app/register-github-app.component'; -import { GithubLandingPageComponent } from '../../github-landing-page/github-landing-page.component'; -import { MatLegacyAutocompleteModule as MatAutocompleteModule } from '@angular/material/legacy-autocomplete'; -import { MatLegacyCardModule as MatCardModule } from '@angular/material/legacy-card'; -import { MatDividerModule } from '@angular/material/divider'; -import { MatLegacyFormFieldModule as MatFormFieldModule } from '@angular/material/legacy-form-field'; -import { MatLegacyInputModule as MatInputModule } from '@angular/material/legacy-input'; -import { MatLegacyOptionModule as MatOptionModule } from '@angular/material/legacy-core'; -import { ReactiveFormsModule } from '@angular/forms'; -import { EntryModule } from '../entry/entry.module'; - -@NgModule({ - declarations: [RegisterGithubAppComponent, GithubLandingPageComponent], - exports: [RegisterGithubAppComponent], - imports: [ - CommonModule, - FlexModule, - MatButtonModule, - MatIconModule, - MatTooltipModule, - RouterLink, - MatAutocompleteModule, - MatCardModule, - MatDividerModule, - MatFormFieldModule, - MatInputModule, - MatOptionModule, - ReactiveFormsModule, - EntryModule, - ], -}) -export class RegisterGithubAppModule {} diff --git a/src/app/shared/modules/select.module.ts b/src/app/shared/modules/select.module.ts deleted file mode 100644 index 2c56658b0d..0000000000 --- a/src/app/shared/modules/select.module.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FormsModule } from '@angular/forms'; -import { CustomMaterialModule } from './../modules/material.module'; - -import { SelectComponent } from '../../select/select.component'; - -@NgModule({ - declarations: [SelectComponent], - imports: [CommonModule, FormsModule, CustomMaterialModule], - providers: [], - exports: [SelectComponent], -}) -export class SelectModule {} diff --git a/src/app/shared/modules/snackbar.module.ts b/src/app/shared/modules/snackbar.module.ts deleted file mode 100644 index f7ccfd82bd..0000000000 --- a/src/app/shared/modules/snackbar.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { SnackbarDirective } from '../snackbar.directive'; - -@NgModule({ - declarations: [SnackbarDirective], - exports: [SnackbarDirective], -}) -export class SnackbarModule {} diff --git a/src/app/shared/modules/workflow.module.ts b/src/app/shared/modules/workflow.module.ts deleted file mode 100644 index f36461933d..0000000000 --- a/src/app/shared/modules/workflow.module.ts +++ /dev/null @@ -1,145 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { ClipboardModule } from '@angular/cdk/clipboard'; -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { FormsModule } from '@angular/forms'; - -import { MarkdownModule } from 'ngx-markdown'; -import { ParamfilesService } from '../../container/paramfiles/paramfiles.service'; -import { CurrentCollectionsModule } from '../../entry/current-collections.module'; -import { AddEntryModule } from '../../organizations/collection/add-entry.module'; -import { OrderByModule } from '../../shared/modules/orderby.module'; -import { SourceFileTabsComponent } from '../../source-file-tabs/source-file-tabs.component'; -import { NotebookComponent } from '../../notebook/notebook.component'; -import { NotebookMimeBundleOutputComponent } from '../../notebook/notebook-mime-bundle-output.component'; -import { NotebookStreamOutputComponent } from '../../notebook/notebook-stream-output.component'; -import { NotebookMarkdownComponent } from '../../notebook/notebook-markdown.component'; -import { NotebookSourceComponent } from '../../notebook/notebook-source.component'; -import { StargazersModule } from '../../stargazers/stargazers.module'; -import { StarringModule } from '../../starring/starring.module'; -import { FilterCloudInstancesPipe } from '../../workflow/launch-third-party/filterCloudInstances.pipe'; -import { LaunchThirdPartyComponent } from '../../workflow/launch-third-party/launch-third-party.component'; -import { MultiCloudLaunchComponent } from '../../workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component'; -import { LaunchWorkflowComponent } from '../../workflow/launch/launch.component'; -import { WorkflowLaunchService } from '../../workflow/launch/workflow-launch.service'; -import { PermissionsComponent } from '../../workflow/permissions/permissions.component'; -import { VersionsWorkflowComponent } from '../../workflow/versions/versions.component'; -import { ViewWorkflowComponent } from '../../workflow/view/view.component'; -import { WorkflowFileEditorComponent } from '../../workflow/workflow-file-editor/workflow-file-editor.component'; -import { WorkflowComponent } from '../../workflow/workflow.component'; -import { RefreshAlertModule } from '../alert/alert.module'; -import { DateService } from '../date.service'; -import { WorkflowActionsComponent } from '../entry-actions/workflow-actions.component'; -import { FileService } from '../file.service'; -import { HeaderModule } from '../modules/header.module'; -import { ListWorkflowsModule } from '../modules/list-workflows.module'; -import { SelectModule } from '../modules/select.module'; -import { PipeModule } from '../pipe/pipe.module'; -import { DagModule } from './../../workflow/dag/dag.module'; -import { InfoTabComponent } from './../../workflow/info-tab/info-tab.component'; -import { InfoTabService } from './../../workflow/info-tab/info-tab.service'; -import { RegisterWorkflowModalService } from './../../workflow/register-workflow-modal/register-workflow-modal.service'; -import { ToolTabComponent } from './../../workflow/tool-tab/tool-tab.component'; -import { VersionModalComponent } from './../../workflow/version-modal/version-modal.component'; -import { VersionModalService } from './../../workflow/version-modal/version-modal.service'; -import { ExecutionsTabComponent } from '../../workflow/executions/executions-tab.component'; -import { EntryModule } from './../entry/entry.module'; -import { CustomMaterialModule } from './../modules/material.module'; -import { RefreshService } from './../refresh.service'; -import { MarkdownWrapperModule } from './markdown-wrapper.module'; -import { SnackbarModule } from './snackbar.module'; -import { CategoryButtonModule } from './../../categories/button/category-button.module'; -import { MySidebarModule } from '../modules/my-sidebar.module'; -import { SourceFileTabsService } from '../../source-file-tabs/source-file-tabs.service'; -import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; -import { PreviewWarningModule } from './preview-warning.module'; -import { AiBubbleModule } from '../ai-bubble/ai-bubble.module'; - -@NgModule({ - declarations: [ - WorkflowComponent, - WorkflowFileEditorComponent, - VersionsWorkflowComponent, - LaunchThirdPartyComponent, - LaunchWorkflowComponent, - PermissionsComponent, - ViewWorkflowComponent, - VersionModalComponent, - WorkflowActionsComponent, - InfoTabComponent, - ExecutionsTabComponent, - ToolTabComponent, - SourceFileTabsComponent, - NotebookComponent, - NotebookMimeBundleOutputComponent, - NotebookStreamOutputComponent, - NotebookMarkdownComponent, - NotebookSourceComponent, - FilterCloudInstancesPipe, - MultiCloudLaunchComponent, - ExecutionsTabComponent, - ], - imports: [ - CommonModule, - CurrentCollectionsModule, - FlexLayoutModule, - HeaderModule, - ListWorkflowsModule, - SelectModule, - PipeModule, - StarringModule, - OrderByModule, - FormsModule, - DagModule, - StargazersModule, - ClipboardModule, - EntryModule, - AddEntryModule, - MarkdownModule, - RefreshAlertModule, - MarkdownWrapperModule, - SnackbarModule, - CategoryButtonModule, - MySidebarModule, - NgxMatSelectSearchModule, - PreviewWarningModule, - AiBubbleModule, - ], - providers: [ - DateService, - FileService, - WorkflowLaunchService, - ParamfilesService, - InfoTabService, - RefreshService, - RegisterWorkflowModalService, - VersionModalService, - SourceFileTabsService, - ], - exports: [ - WorkflowComponent, - CustomMaterialModule, - EntryModule, - HeaderModule, - CommonModule, - WorkflowActionsComponent, - FilterCloudInstancesPipe, - MySidebarModule, - ], -}) -export class WorkflowModule {} diff --git a/src/app/shared/modules/workflowsPage.module.ts b/src/app/shared/modules/workflowsPage.module.ts deleted file mode 100644 index 6f5cdb9b72..0000000000 --- a/src/app/shared/modules/workflowsPage.module.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { SearchWorkflowsComponent } from 'app/workflows/search/search.component'; -import { WorkflowsComponent } from 'app/workflows/workflows.component'; -import { ListWorkflowsModule } from './list-workflows.module'; -import { WorkflowModule } from './workflow.module'; -import { PreviewWarningModule } from './preview-warning.module'; - -@NgModule({ - declarations: [WorkflowsComponent, SearchWorkflowsComponent], - imports: [WorkflowModule, ListWorkflowsModule, PreviewWarningModule], - exports: [WorkflowsComponent, WorkflowModule, ListWorkflowsModule], -}) -export class WorkflowsPageModule {} diff --git a/src/app/shared/orderBy.ts b/src/app/shared/orderBy.ts index 431e7ca30a..064f41d07f 100644 --- a/src/app/shared/orderBy.ts +++ b/src/app/shared/orderBy.ts @@ -25,7 +25,11 @@ import { Pipe, PipeTransform } from '@angular/core'; -@Pipe({ name: 'orderBy', pure: false }) +@Pipe({ + name: 'orderBy', + pure: false, + standalone: true, +}) export class OrderBy implements PipeTransform { value: string[] = []; diff --git a/src/app/shared/pipe/pipe.module.ts b/src/app/shared/pipe/pipe.module.ts index 1e971fd872..b44e92cfd0 100644 --- a/src/app/shared/pipe/pipe.module.ts +++ b/src/app/shared/pipe/pipe.module.ts @@ -41,8 +41,7 @@ const DECLARATIONS: any[] = [ ExecutionStatusPipe, ]; @NgModule({ - imports: [CommonModule], - declarations: DECLARATIONS, + imports: [CommonModule, ...DECLARATIONS], exports: DECLARATIONS, providers: [EntryToDisplayNamePipe, PlatformPartnerPipe, MapFriendlyValuesPipe], }) diff --git a/src/app/shared/private-icon/private-icon.component.ts b/src/app/shared/private-icon/private-icon.component.ts index 4eb4bde6fa..c31471c88f 100644 --- a/src/app/shared/private-icon/private-icon.component.ts +++ b/src/app/shared/private-icon/private-icon.component.ts @@ -1,9 +1,13 @@ import { Component } from '@angular/core'; import { Dockstore } from '../../shared/dockstore.model'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-private-icon', templateUrl: './private-icon.component.html', + standalone: true, + imports: [MatIconModule, MatLegacyTooltipModule], }) export class PrivateIconComponent { // Change this link if necessary diff --git a/src/app/shared/private-icon/private-icon.module.ts b/src/app/shared/private-icon/private-icon.module.ts deleted file mode 100644 index 7d2d4cf0d5..0000000000 --- a/src/app/shared/private-icon/private-icon.module.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CommonModule } from '@angular/common'; -import { NgModule } from '@angular/core'; -import { MatIconModule } from '@angular/material/icon'; - -import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; -import { PrivateIconComponent } from './private-icon.component'; - -@NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [PrivateIconComponent], - exports: [PrivateIconComponent], -}) -export class PrivateIconModule {} diff --git a/src/app/shared/register-github-app/register-github-app.component.spec.ts b/src/app/shared/register-github-app/register-github-app.component.spec.ts index 46835f1c10..fa741bb68e 100644 --- a/src/app/shared/register-github-app/register-github-app.component.spec.ts +++ b/src/app/shared/register-github-app/register-github-app.component.spec.ts @@ -14,8 +14,7 @@ describe('RegisterGithubAppComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [RegisterGithubAppComponent], - imports: [HttpClientTestingModule, MatIconModule], + imports: [HttpClientTestingModule, MatIconModule, RegisterGithubAppComponent], providers: [ { provide: MatDialogRef, diff --git a/src/app/shared/register-github-app/register-github-app.component.ts b/src/app/shared/register-github-app/register-github-app.component.ts index 146abdc4c2..fbb95b21f9 100644 --- a/src/app/shared/register-github-app/register-github-app.component.ts +++ b/src/app/shared/register-github-app/register-github-app.component.ts @@ -5,10 +5,17 @@ import { UserQuery } from '../user/user.query'; import { HttpParams } from '@angular/common/http'; import { EntryType, EntryTypeMetadata } from '../openapi'; import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { AsyncPipe, TitleCasePipe } from '@angular/common'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; @Component({ selector: 'app-register-github-app', templateUrl: './register-github-app.component.html', + standalone: true, + imports: [MatIconModule, FlexModule, MatLegacyButtonModule, MatLegacyTooltipModule, AsyncPipe, TitleCasePipe], }) export class RegisterGithubAppComponent extends Base implements OnInit { public Dockstore = Dockstore; diff --git a/src/app/shared/snackbar.directive.ts b/src/app/shared/snackbar.directive.ts index e56620ba8d..7aaad0487b 100644 --- a/src/app/shared/snackbar.directive.ts +++ b/src/app/shared/snackbar.directive.ts @@ -3,6 +3,7 @@ import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack @Directive({ selector: '[appSnackbar]', + standalone: true, }) export class SnackbarDirective { constructor(private matSnackBar: MatSnackBar) {} diff --git a/src/app/sitemap/sitemap.component.spec.ts b/src/app/sitemap/sitemap.component.spec.ts index 1b6c97fd3b..5c707d75f4 100644 --- a/src/app/sitemap/sitemap.component.spec.ts +++ b/src/app/sitemap/sitemap.component.spec.ts @@ -9,8 +9,7 @@ describe('SitemapComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SitemapComponent], - imports: [RouterTestingModule], + imports: [RouterTestingModule, SitemapComponent], }).compileComponents(); }) ); diff --git a/src/app/sitemap/sitemap.component.ts b/src/app/sitemap/sitemap.component.ts index 4aaa14c016..1282ef3863 100644 --- a/src/app/sitemap/sitemap.component.ts +++ b/src/app/sitemap/sitemap.component.ts @@ -1,10 +1,14 @@ import { Component } from '@angular/core'; import { Dockstore } from '../shared/dockstore.model'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-sitemap', templateUrl: './sitemap.component.html', styleUrls: ['./sitemap.component.css'], + standalone: true, + imports: [FlexModule, RouterLink], }) export class SitemapComponent { Dockstore = Dockstore; diff --git a/src/app/source-file-tabs/source-file-tabs.component.spec.ts b/src/app/source-file-tabs/source-file-tabs.component.spec.ts index 8240385d20..61f165c16d 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.spec.ts @@ -18,8 +18,7 @@ describe('SourceFileTabsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [SourceFileTabsComponent, MapFriendlyValuesPipe], - imports: [HttpClientTestingModule, MatDialogModule, RouterTestingModule], + imports: [HttpClientTestingModule, MatDialogModule, RouterTestingModule, SourceFileTabsComponent, MapFriendlyValuesPipe], providers: [ { provide: SourceFileTabsService, useClass: SourceFileTabsStubService }, { provide: FileService, useClass: FileStubService }, diff --git a/src/app/source-file-tabs/source-file-tabs.component.ts b/src/app/source-file-tabs/source-file-tabs.component.ts index 027e4c2311..2ee7876504 100644 --- a/src/app/source-file-tabs/source-file-tabs.component.ts +++ b/src/app/source-file-tabs/source-file-tabs.component.ts @@ -1,9 +1,9 @@ -import { KeyValue, Location } from '@angular/common'; +import { KeyValue, Location, NgIf, NgFor, AsyncPipe, KeyValuePipe } from '@angular/common'; import { Component, Input, OnChanges } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; -import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; -import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; +import { MatLegacySelectChange as MatSelectChange, MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { FileTreeComponent } from 'app/file-tree/file-tree.component'; import { bootstrap4largeModalSize } from 'app/shared/constants'; import { FileService } from 'app/shared/file.service'; @@ -12,11 +12,42 @@ import { Observable } from 'rxjs'; import { finalize } from 'rxjs/operators'; import { WorkflowQuery } from '../shared/state/workflow.query'; import { SourceFileTabsService } from './source-file-tabs.service'; +import { CodeEditorComponent } from '../shared/code-editor/code-editor.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatToolbarModule } from '@angular/material/toolbar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { LoadingComponent } from '../shared/loading/loading.component'; @Component({ selector: 'app-source-file-tabs', templateUrl: './source-file-tabs.component.html', styleUrls: ['./source-file-tabs.component.scss'], + standalone: true, + imports: [ + LoadingComponent, + NgIf, + MatLegacyCardModule, + MatIconModule, + NgFor, + MatLegacyTabsModule, + MatToolbarModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + ClipboardModule, + CodeEditorComponent, + AsyncPipe, + KeyValuePipe, + ], }) export class SourceFileTabsComponent implements OnChanges { constructor( diff --git a/src/app/source-file-tabs/source-file-tabs.service.spec.ts b/src/app/source-file-tabs/source-file-tabs.service.spec.ts index a316411665..13d4324d95 100644 --- a/src/app/source-file-tabs/source-file-tabs.service.spec.ts +++ b/src/app/source-file-tabs/source-file-tabs.service.spec.ts @@ -8,12 +8,11 @@ import { DescriptorTypeCompatStubService, FileStubService, ProviderStubService, import { ProviderService } from '../shared/provider.service'; import { SourceFileTabsService } from './source-file-tabs.service'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; -import { WorkflowModule } from '../shared/modules/workflow.module'; describe('SourceFileTabsService', () => { beforeEach(() => TestBed.configureTestingModule({ - imports: [HttpClientTestingModule, WorkflowModule], + imports: [HttpClientTestingModule], providers: [ { provide: FileService, useClass: FileStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, diff --git a/src/app/stargazers/stargazers.component.spec.ts b/src/app/stargazers/stargazers.component.spec.ts index fbc2625fce..1502dfebb3 100644 --- a/src/app/stargazers/stargazers.component.spec.ts +++ b/src/app/stargazers/stargazers.component.spec.ts @@ -30,8 +30,7 @@ describe('StargazersComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [StargazersComponent], - imports: [MatIconModule, MatCardModule], + imports: [MatIconModule, MatCardModule, StargazersComponent], providers: [ { provide: UserService, useClass: UserStubService }, { provide: StarringService, useClass: StarringStubService }, diff --git a/src/app/stargazers/stargazers.component.ts b/src/app/stargazers/stargazers.component.ts index 7555bc52ff..ef3e73bce5 100644 --- a/src/app/stargazers/stargazers.component.ts +++ b/src/app/stargazers/stargazers.component.ts @@ -22,11 +22,18 @@ import { User } from '../shared/openapi'; import { StarentryService } from '../shared/starentry.service'; import { UserService } from '../shared/user/user.service'; import { StarringService } from '../starring/starring.service'; +import { RouterLink } from '@angular/router'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; @Component({ selector: 'app-stargazers', templateUrl: './stargazers.component.html', styleUrls: ['./stargazers.component.css'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, FlexModule, NgFor, RouterLink], }) export class StargazersComponent extends Base implements OnInit { starGazers: User[]; diff --git a/src/app/stargazers/stargazers.module.ts b/src/app/stargazers/stargazers.module.ts index cb90879293..96cb830a3f 100644 --- a/src/app/stargazers/stargazers.module.ts +++ b/src/app/stargazers/stargazers.module.ts @@ -21,12 +21,11 @@ import { RouterModule } from '@angular/router'; import { StarentryService } from '../shared/starentry.service'; import { StarringService } from '../starring/starring.service'; -import { CustomMaterialModule } from './../shared/modules/material.module'; + import { StargazersComponent } from './stargazers.component'; @NgModule({ - imports: [CommonModule, FlexLayoutModule, MatIconModule, CustomMaterialModule, RouterModule], - declarations: [StargazersComponent], + imports: [CommonModule, FlexLayoutModule, MatIconModule, RouterModule, StargazersComponent], exports: [StargazersComponent], providers: [StarringService, StarentryService], }) diff --git a/src/app/starredentries/starredentries.component.spec.ts b/src/app/starredentries/starredentries.component.spec.ts index 4c03dcab30..aa3dcc549a 100644 --- a/src/app/starredentries/starredentries.component.spec.ts +++ b/src/app/starredentries/starredentries.component.spec.ts @@ -1,7 +1,22 @@ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; +import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; +import { AuthService } from 'ng2-ui-auth'; +import { MytoolsService } from '../mytools/mytools.service'; +import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; +import { ContainerService } from '../shared/container.service'; +import { DateService } from '../shared/date.service'; +import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; import { ImageProviderService } from '../shared/image-provider.service'; +import { Configuration } from '../shared/openapi'; +import { MyEntriesStateService } from '../shared/state/my-entries.service'; +import { MyEntriesStore } from '../shared/state/my-entries.store'; +import { TrackLoginService } from '../shared/track-login.service'; +import { UrlResolverService } from '../shared/url-resolver.service'; import { ProviderService } from './../shared/provider.service'; import { StarentryService } from './../shared/starentry.service'; import { UsersService } from './../shared/openapi/api/users.service'; @@ -13,6 +28,13 @@ import { StarringStubService, UsersStubService, OrgLogoStubService, + AuthStubService, + DescriptorLanguageStubService, + UrlResolverStubService, + ContainerStubService, + TrackLoginStubService, + ConfigurationStub, + DateStubService, } from './../test/service-stubs'; import { StarredEntriesComponent } from './starredentries.component'; @@ -23,16 +45,33 @@ describe('StarredEntriesComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [RouterTestingModule], - declarations: [StarredEntriesComponent], + imports: [ + RouterTestingModule, + StarredEntriesComponent, + MatLegacySnackBarModule, + NoopAnimationsModule, + HttpClientTestingModule, + MatLegacyDialogModule, + ], schemas: [NO_ERRORS_SCHEMA], providers: [ { provide: StarringService, useClass: StarringStubService }, { provide: ImageProviderService, useClass: ImageProviderStubService }, + { provide: DateService, useClass: DateStubService }, + MyEntriesStateService, + MyEntriesStore, + MytoolsService, + MyWorkflowsService, ProviderService, + { provide: Configuration, useClass: ConfigurationStub }, + { provide: AuthService, useClass: AuthStubService }, + { provide: ContainerService, useClass: ContainerStubService }, { provide: StarentryService, useClass: StarEntryStubService }, { provide: UsersService, useClass: UsersStubService }, { provide: OrgLogoService, useClass: OrgLogoStubService }, + { provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, + { provide: UrlResolverService, useClass: UrlResolverStubService }, + { provide: TrackLoginService, useClass: TrackLoginStubService }, ], }).compileComponents(); }) diff --git a/src/app/starredentries/starredentries.component.ts b/src/app/starredentries/starredentries.component.ts index c9b2b69af2..97abe56bc7 100644 --- a/src/app/starredentries/starredentries.component.ts +++ b/src/app/starredentries/starredentries.component.ts @@ -5,20 +5,69 @@ import { ProviderService } from '../shared/provider.service'; import { DockstoreTool, Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; import { UserQuery } from '../shared/user/user.query'; import { UsersService } from './../shared/openapi/api/users.service'; -import { MatLegacyTabChangeEvent as MatTabChangeEvent } from '@angular/material/legacy-tabs'; +import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; import { UntypedFormControl } from '@angular/forms'; import { ExtendedDockstoreTool } from 'app/shared/models/ExtendedDockstoreTool'; import { ExtendedWorkflow } from 'app/shared/models/ExtendedWorkflow'; import { OrgLogoService } from '../shared/org-logo.service'; import { EntryType } from '../shared/enum/entry-type'; -import { ActivatedRoute } from '@angular/router'; -import { Location } from '@angular/common'; +import { ActivatedRoute, RouterLink } from '@angular/router'; +import { Location, NgIf, NgClass, NgFor, NgTemplateOutlet, SlicePipe, DatePipe } from '@angular/common'; import { Dockstore } from 'app/shared/dockstore.model'; +import { DescriptorLanguagePipe } from '../shared/entry/descriptor-language.pipe'; +import { BaseUrlPipe } from '../shared/entry/base-url.pipe'; +import { RouterLinkPipe } from '../entry/router-link.pipe'; +import { GravatarPipe } from '../gravatar/gravatar.pipe'; +import { OrganizationStarringComponent } from '../organizations/organization/organization-starring/organization-starring.component'; +import { ImgFallbackDirective } from '../shared/img-fallback.directive'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { MarkdownWrapperComponent } from '../shared/markdown-wrapper/markdown-wrapper.component'; +import { StarringComponent } from '../starring/starring.component'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { OrganizationStargazersComponent } from '../organizations/organization/organization-stargazers/organization-stargazers.component'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { HeaderComponent } from '../header/header.component'; +import { MySidebarComponent } from '../my-sidebar/my-sidebar.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-starredentries', templateUrl: './starredentries.component.html', styleUrls: ['./starredentries.component.scss'], + standalone: true, + imports: [ + FlexModule, + MySidebarComponent, + HeaderComponent, + NgIf, + StargazersComponent, + MatLegacyButtonModule, + MatIconModule, + OrganizationStargazersComponent, + MatLegacyTabsModule, + NgClass, + ExtendedModule, + MatLegacyCardModule, + NgFor, + NgTemplateOutlet, + RouterLink, + StarringComponent, + MarkdownWrapperComponent, + MatLegacyChipsModule, + MatLegacyTooltipModule, + ImgFallbackDirective, + OrganizationStarringComponent, + SlicePipe, + DatePipe, + GravatarPipe, + RouterLinkPipe, + BaseUrlPipe, + DescriptorLanguagePipe, + ], }) export class StarredEntriesComponent extends Base implements OnInit { Dockstore = Dockstore; diff --git a/src/app/starring/starring.component.spec.ts b/src/app/starring/starring.component.spec.ts index 81bc27bb3b..5425b5df18 100644 --- a/src/app/starring/starring.component.spec.ts +++ b/src/app/starring/starring.component.spec.ts @@ -39,8 +39,7 @@ describe('StarringComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [StarringComponent], - imports: [MatIconModule, MatSnackBarModule, MatLegacyTooltipModule], + imports: [MatIconModule, MatSnackBarModule, MatLegacyTooltipModule, StarringComponent], providers: [ { provide: StarringService, useClass: StarringStubService }, { provide: TrackLoginService, useClass: TrackLoginStubService }, diff --git a/src/app/starring/starring.component.ts b/src/app/starring/starring.component.ts index 1b8a43217b..50f21753c7 100644 --- a/src/app/starring/starring.component.ts +++ b/src/app/starring/starring.component.ts @@ -25,11 +25,16 @@ import { TrackLoginService } from '../shared/track-login.service'; import { UserQuery } from '../shared/user/user.query'; import { StarEntry } from './StarEntry'; import { StarringService } from './starring.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { NgClass, NgIf } from '@angular/common'; @Component({ selector: 'app-starring', templateUrl: './starring.component.html', styleUrls: ['./starring.component.scss'], + standalone: true, + imports: [NgClass, NgIf, MatIconModule, MatLegacyTooltipModule], }) export class StarringComponent implements OnInit, OnDestroy, OnChanges { @Input() tool: any; diff --git a/src/app/starring/starring.module.ts b/src/app/starring/starring.module.ts index 90c6a46ee3..6d25960310 100644 --- a/src/app/starring/starring.module.ts +++ b/src/app/starring/starring.module.ts @@ -23,8 +23,7 @@ import { StarringComponent } from './starring.component'; import { StarringService } from './starring.service'; @NgModule({ - imports: [CommonModule, MatIconModule, MatTooltipModule], - declarations: [StarringComponent], + imports: [CommonModule, MatIconModule, MatTooltipModule, StarringComponent], exports: [StarringComponent], providers: [StarringService, StarentryService], }) diff --git a/src/app/tosBanner/tos-banner.component.ts b/src/app/tosBanner/tos-banner.component.ts index bf1a5608f1..665c390f26 100644 --- a/src/app/tosBanner/tos-banner.component.ts +++ b/src/app/tosBanner/tos-banner.component.ts @@ -1,10 +1,16 @@ import { Component, Input } from '@angular/core'; import { TosBannerService } from './state/tos-banner.service'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; @Component({ selector: 'app-tos-banner', templateUrl: './tos-banner.component.html', styleUrls: ['./tos-banner.component.css'], + standalone: true, + imports: [FlexModule, NgIf, MatLegacyButtonModule, MatIconModule], }) export class TosBannerComponent { @Input() diff --git a/src/app/user-page/user-page.component.ts b/src/app/user-page/user-page.component.ts index a73bfd93c3..31aec60728 100644 --- a/src/app/user-page/user-page.component.ts +++ b/src/app/user-page/user-page.component.ts @@ -14,11 +14,39 @@ import { UserQuery } from '../shared/user/user.query'; import { Base } from '../shared/base'; import { AccountInfo } from '../loginComponents/accounts/external/accounts.component'; import { UrlResolverService } from '../shared/url-resolver.service'; +import { RecentEventsComponent } from '../home-page/recent-events/recent-events.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatBadgeModule } from '@angular/material/badge'; +import { MatLineModule } from '@angular/material/core'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-user-page', templateUrl: './user-page.component.html', styleUrls: ['./user-page.component.scss'], + standalone: true, + imports: [ + HeaderComponent, + FlexModule, + ExtendedModule, + MatIconModule, + NgIf, + MatLegacyCardModule, + MatLineModule, + MatBadgeModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + MatLegacyTabsModule, + RecentEventsComponent, + NgFor, + ], }) export class UserPageComponent extends Base implements OnInit { public user: User; diff --git a/src/app/user-page/user-page.module.ts b/src/app/user-page/user-page.module.ts deleted file mode 100644 index 208bd26e37..0000000000 --- a/src/app/user-page/user-page.module.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { NgModule } from '@angular/core'; -import { UserPageComponent } from './user-page.component'; -import { RecentEventsModule } from '../home-page/recent-events/recent-events.module'; -import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { CommonModule } from '@angular/common'; -import { CustomMaterialModule } from '../shared/modules/material.module'; -import { HeaderModule } from '../shared/modules/header.module'; -import { RouterModule } from '@angular/router'; -import { UserPageRouting } from './user-page.routing'; - -@NgModule({ - declarations: [UserPageComponent], - imports: [RecentEventsModule, FlexLayoutModule, CommonModule, CustomMaterialModule, HeaderModule, RouterModule, UserPageRouting], - exports: [UserPageComponent], -}) -export class UserPageModule {} diff --git a/src/app/user-page/user-page.routing.ts b/src/app/user-page/user-page.routing.ts index 6fbce8be18..c5ec5e8ed7 100644 --- a/src/app/user-page/user-page.routing.ts +++ b/src/app/user-page/user-page.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { UserPageComponent } from './user-page.component'; const USERPAGE_ROUTES: Routes = [ @@ -6,4 +6,4 @@ const USERPAGE_ROUTES: Routes = [ { path: '**', redirectTo: '' }, ]; -export const UserPageRouting = RouterModule.forChild(USERPAGE_ROUTES); +export const UserPageRouting = USERPAGE_ROUTES; diff --git a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts index fea66361ca..e6d7426bf7 100644 --- a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts +++ b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.spec.ts @@ -17,8 +17,7 @@ describe('cwl-viewerComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [CwlViewerComponent], - imports: [HttpClientTestingModule, FormsModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, FormsModule, HttpClientTestingModule, CwlViewerComponent], schemas: [NO_ERRORS_SCHEMA], providers: [DockstoreService, DateService, ProviderService, WorkflowService, DescriptorLanguageService], }).compileComponents(); diff --git a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts index 57efb1c3c4..a5acd293fd 100644 --- a/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts +++ b/src/app/workflow/dag/cwl-viewer/cwl-viewer.component.ts @@ -21,12 +21,18 @@ import { ExtendedWorkflow } from '../../../shared/models/ExtendedWorkflow'; import { ExtendedWorkflowQuery } from '../../../shared/state/extended-workflow.query'; import { WorkflowVersion } from '../../../shared/openapi/model/workflowVersion'; import { CwlViewerDescriptor, CwlViewerService } from './cwl-viewer.service'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf } from '@angular/common'; @Component({ selector: 'app-cwl-viewer', templateUrl: './cwl-viewer.html', providers: [CwlViewerService], styleUrls: ['./cwl-viewer.scss'], + standalone: true, + imports: [NgIf, MatLegacyCardModule, MatIconModule, MatLegacyProgressBarModule], }) export class CwlViewerComponent implements OnInit, OnChanges, OnDestroy { @Input() selectedVersion: WorkflowVersion; diff --git a/src/app/workflow/dag/dag.component.spec.ts b/src/app/workflow/dag/dag.component.spec.ts index 5ddb4ef495..fac028c0b0 100644 --- a/src/app/workflow/dag/dag.component.spec.ts +++ b/src/app/workflow/dag/dag.component.spec.ts @@ -33,8 +33,7 @@ describe('DagComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [DagComponent, CwlViewerComponent], - imports: [HttpClientTestingModule, FormsModule], + imports: [HttpClientTestingModule, FormsModule, DagComponent, CwlViewerComponent], schemas: [NO_ERRORS_SCHEMA], providers: [ DagStore, diff --git a/src/app/workflow/dag/dag.component.ts b/src/app/workflow/dag/dag.component.ts index 5c34b152bd..bdef651b01 100644 --- a/src/app/workflow/dag/dag.component.ts +++ b/src/app/workflow/dag/dag.component.ts @@ -27,6 +27,16 @@ import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; import { DagQuery } from './state/dag.query'; import { DagService } from './state/dag.service'; import { DagStore } from './state/dag.store'; +import { CwlViewerComponent } from './cwl-viewer/cwl-viewer.component'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FormsModule } from '@angular/forms'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgClass, AsyncPipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { LoadingComponent } from '../../shared/loading/loading.component'; /** * This is the DAG tab @@ -45,6 +55,21 @@ import { DagStore } from './state/dag.store'; templateUrl: './dag.component.html', styleUrls: ['./dag.component.scss'], providers: [DagStore, DagQuery, DagService], + standalone: true, + imports: [ + LoadingComponent, + FlexModule, + NgIf, + MatLegacyCardModule, + MatIconModule, + NgClass, + ExtendedModule, + FormsModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + CwlViewerComponent, + AsyncPipe, + ], }) export class DagComponent extends EntryTab implements OnInit, OnChanges, AfterViewInit { @Input() id: number; diff --git a/src/app/workflow/dag/dag.module.ts b/src/app/workflow/dag/dag.module.ts index 19367899f9..e5429193ec 100644 --- a/src/app/workflow/dag/dag.module.ts +++ b/src/app/workflow/dag/dag.module.ts @@ -21,8 +21,7 @@ import { FormsModule } from '@angular/forms'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyProgressBarModule as MatProgressBarModule } from '@angular/material/legacy-progress-bar'; import { MatLegacyTooltipModule as MatTooltipModule } from '@angular/material/legacy-tooltip'; -import { RefreshAlertModule } from 'app/shared/alert/alert.module'; -import { CustomMaterialModule } from './../../shared/modules/material.module'; + import { CwlViewerComponent } from './cwl-viewer/cwl-viewer.component'; import { DagComponent } from './dag.component'; @@ -35,10 +34,9 @@ import { DagComponent } from './dag.component'; MatIconModule, MatProgressBarModule, MatTooltipModule, - CustomMaterialModule, - RefreshAlertModule, + DagComponent, + CwlViewerComponent, ], - declarations: [DagComponent, CwlViewerComponent], exports: [DagComponent], }) export class DagModule {} diff --git a/src/app/workflow/executions/executions-tab.component.spec.ts b/src/app/workflow/executions/executions-tab.component.spec.ts index 39460560f0..3981aa8980 100644 --- a/src/app/workflow/executions/executions-tab.component.spec.ts +++ b/src/app/workflow/executions/executions-tab.component.spec.ts @@ -13,17 +13,17 @@ * See the License for the specific language governing permissions and * limitations under the License. */ +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { NO_ERRORS_SCHEMA } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - -import { DescriptorLanguageStubService } from '../../test/service-stubs'; -import { ExecutionsTabComponent } from './executions-tab.component'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AlertService } from '../../shared/alert/state/alert.service'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { PipeModule } from '../../shared/pipe/pipe.module'; +import { DescriptorLanguageStubService } from '../../test/service-stubs'; +import { ExecutionsTabComponent } from './executions-tab.component'; + describe('ExecutionsTabComponent', () => { let component: ExecutionsTabComponent; let fixture: ComponentFixture; @@ -31,9 +31,8 @@ describe('ExecutionsTabComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ExecutionsTabComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [HttpClientTestingModule, CustomMaterialModule, PipeModule], + imports: [HttpClientTestingModule, PipeModule, ExecutionsTabComponent, MatLegacySnackBarModule], providers: [{ provide: DescriptorLanguageService, useClass: DescriptorLanguageStubService }, AlertService], }).compileComponents(); }) diff --git a/src/app/workflow/executions/executions-tab.component.ts b/src/app/workflow/executions/executions-tab.component.ts index 3c3af07918..dc5a23bf68 100644 --- a/src/app/workflow/executions/executions-tab.component.ts +++ b/src/app/workflow/executions/executions-tab.component.ts @@ -32,10 +32,23 @@ import { SessionQuery } from '../../shared/session/session.query'; import { takeUntil } from 'rxjs/operators'; import PartnerEnum = CloudInstance.PartnerEnum; import ExecutionStatusEnum = RunExecution.ExecutionStatusEnum; -import { MatLegacySelectChange as MatSelectChange } from '@angular/material/legacy-select'; +import { MatLegacySelectChange as MatSelectChange, MatLegacySelectModule } from '@angular/material/legacy-select'; import { AlertService } from '../../shared/alert/state/alert.service'; import { UserQuery } from 'app/shared/user/user.query'; import { combineLatest } from 'rxjs'; +import { ExecutionStatusPipe } from '../../shared/entry/execution-status.pipe'; +import { SecondsToHoursMinutesSecondsPipe } from 'app/workflow/executions/seconds-to-hours-minutes-seconds.pipe'; +import { PlatformPartnerPipe } from '../../shared/entry/platform-partner.pipe'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgClass, NgTemplateOutlet, DecimalPipe, DatePipe } from '@angular/common'; interface ExecutionMetricsTableObject { metric: string; // Name of the execution metric @@ -48,6 +61,28 @@ interface ExecutionMetricsTableObject { @Component({ selector: 'app-executions-tab', templateUrl: './executions-tab.component.html', + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + NgFor, + MatLegacyOptionModule, + MatDividerModule, + MatLegacyTableModule, + MatLegacyTooltipModule, + NgClass, + ExtendedModule, + NgTemplateOutlet, + DecimalPipe, + DatePipe, + PlatformPartnerPipe, + SecondsToHoursMinutesSecondsPipe, + ExecutionStatusPipe, + ], }) export class ExecutionsTabComponent extends EntryTab implements OnInit, OnChanges { metrics: Map; diff --git a/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts b/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts index 138eb0a264..adb09061dc 100644 --- a/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts +++ b/src/app/workflow/executions/seconds-to-hours-minutes-seconds.pipe.ts @@ -3,6 +3,7 @@ import { Pipe, PipeTransform } from '@angular/core'; @Pipe({ name: 'secondsToHoursMinutesSeconds', + standalone: true, }) export class SecondsToHoursMinutesSecondsPipe implements PipeTransform { transform(totalSeconds: number): string { diff --git a/src/app/workflow/info-tab/info-tab.component.ts b/src/app/workflow/info-tab/info-tab.component.ts index fa04b4ea4b..68ed8489df 100644 --- a/src/app/workflow/info-tab/info-tab.component.ts +++ b/src/app/workflow/info-tab/info-tab.component.ts @@ -15,7 +15,7 @@ */ import { HttpResponse } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatLegacyRadioChange as MatRadioChange } from '@angular/material/legacy-radio'; +import { MatLegacyRadioChange as MatRadioChange, MatLegacyRadioModule } from '@angular/material/legacy-radio'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { EntryType } from 'app/shared/enum/entry-type'; import { FileService } from 'app/shared/file.service'; @@ -36,11 +36,58 @@ import { WorkflowVersion } from '../../shared/openapi/model/workflowVersion'; import { Tooltip } from '../../shared/tooltip'; import { validationDescriptorPatterns } from '../../shared/validationMessages.model'; import { InfoTabService } from './info-tab.service'; +import { VersionProviderUrlPipe } from '../../shared/entry/versionProviderUrl.pipe'; +import { BaseUrlPipe } from '../../shared/entry/base-url.pipe'; +import { MapFriendlyValuesPipe } from '../../search/map-friendly-values.pipe'; +import { MarkdownWrapperComponent } from '../../shared/markdown-wrapper/markdown-wrapper.component'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { InfoTabCheckerWorkflowPathComponent } from '../../shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { FormsModule } from '@angular/forms'; +import { MatIconModule } from '@angular/material/icon'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, NgFor, NgClass, NgSwitch, NgSwitchCase, NgSwitchDefault, AsyncPipe, TitleCasePipe } from '@angular/common'; @Component({ selector: 'app-info-tab', templateUrl: './info-tab.component.html', styleUrls: ['./info-tab.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatDividerModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + MatIconModule, + FormsModule, + FlexModule, + AiBubbleComponent, + MatLegacyRadioModule, + InfoTabCheckerWorkflowPathComponent, + NgFor, + MatLegacyTableModule, + ExtendedModule, + NgClass, + MarkdownWrapperComponent, + NgSwitch, + NgSwitchCase, + NgSwitchDefault, + AsyncPipe, + TitleCasePipe, + MapFriendlyValuesPipe, + BaseUrlPipe, + VersionProviderUrlPipe, + ], }) export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { @Input() validVersions; diff --git a/src/app/workflow/info-tab/info-tab.service.spec.ts b/src/app/workflow/info-tab/info-tab.service.spec.ts index c7654032d5..a62deb54a5 100644 --- a/src/app/workflow/info-tab/info-tab.service.spec.ts +++ b/src/app/workflow/info-tab/info-tab.service.spec.ts @@ -1,14 +1,14 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { ga4ghPath } from 'app/shared/constants'; import { DescriptorTypeCompatService } from 'app/shared/descriptor-type-compat.service'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { EntryType } from 'app/shared/enum/entry-type'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; +import { WorkflowsService } from 'app/shared/openapi'; import { ExtendedWorkflowQuery } from 'app/shared/state/extended-workflow.query'; import { WorkflowService } from 'app/shared/state/workflow.service'; -import { WorkflowsService } from 'app/shared/openapi'; import { WorkflowsStubService, WorkflowStubService } from 'app/test/service-stubs'; import { sampleWorkflow3 } from '../../test/mocked-objects'; import { InfoTabService } from './info-tab.service'; @@ -32,7 +32,7 @@ describe('ValueService', () => { DescriptorTypeCompatService, DescriptorLanguageService, ], - imports: [CustomMaterialModule, HttpClientTestingModule], + imports: [HttpClientTestingModule, MatLegacySnackBarModule], }); }); diff --git a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts index 19e61dd54e..baacadc6b0 100644 --- a/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts +++ b/src/app/workflow/launch-third-party/dialog/launch-to-codespace-dialog.component.ts @@ -14,16 +14,26 @@ * limitations under the License. */ import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { + MatLegacyDialogRef as MatDialogRef, + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, +} from '@angular/material/legacy-dialog'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router } from '@angular/router'; import { Dockstore } from '../../../shared/dockstore.model'; import { DockstoreTool, Entry, Workflow } from '../../../shared/openapi'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, TitleCasePipe } from '@angular/common'; +import { AlertComponent } from '../../../shared/alert/alert.component'; @Component({ selector: 'app-launch-to-codespace-dialog', templateUrl: './launch-to-codespace-dialog.component.html', styleUrls: ['./launch-to-codespace-dialog.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, AlertComponent, NgIf, FlexModule, MatLegacyButtonModule, TitleCasePipe], }) export class LaunchToCodespaceDialogComponent { clicked: boolean; diff --git a/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts b/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts index a5a92d25a0..e9c717578d 100644 --- a/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts +++ b/src/app/workflow/launch-third-party/filterCloudInstances.pipe.ts @@ -3,6 +3,7 @@ import { CloudInstance } from '../../shared/openapi'; @Pipe({ name: 'filterCloudInstances', + standalone: true, }) export class FilterCloudInstancesPipe implements PipeTransform { transform(cloudInstances: Array, filterFor: string): Array | null { diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts b/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts index 7e3b85f4ad..6ed9cec4b0 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.spec.ts @@ -1,19 +1,17 @@ -import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; - import { HttpClientModule } from '@angular/common/http'; +import { HttpClientTestingModule } from '@angular/common/http/testing'; import { CUSTOM_ELEMENTS_SCHEMA, SimpleChange } from '@angular/core'; +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ga4ghPath } from '../../shared/constants'; import { Dockstore } from '../../shared/dockstore.model'; +import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; import { GA4GHFilesService } from '../../shared/ga4gh-files/ga4gh-files.service'; import { GA4GHFilesStore } from '../../shared/ga4gh-files/ga4gh-files.store'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { CloudInstancesService, GA4GHV20Service, UsersService } from '../../shared/openapi'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { sampleWdlWorkflow2, sampleWorkflowVersion } from '../../test/mocked-objects'; import { CloudInstancesStubService, UsersStubService, WorkflowsStubService } from '../../test/service-stubs'; import { LaunchThirdPartyComponent } from './launch-third-party.component'; -import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; -import { HttpClientTestingModule } from '@angular/common/http/testing'; describe('LaunchThirdPartyComponent', () => { let component: LaunchThirdPartyComponent; @@ -22,8 +20,7 @@ describe('LaunchThirdPartyComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchThirdPartyComponent], - imports: [CustomMaterialModule, HttpClientModule, HttpClientTestingModule], + imports: [HttpClientModule, HttpClientTestingModule, LaunchThirdPartyComponent], providers: [ GA4GHFilesService, GA4GHV20Service, diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index ab587ad382..cf40ed6f55 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -1,6 +1,6 @@ import { HttpUrlEncodingCodec } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { combineLatest, Observable } from 'rxjs'; import { map, shareReplay, takeUntil } from 'rxjs/operators'; @@ -17,6 +17,13 @@ import { DescriptorsStore } from './state/descriptors-store'; import { DescriptorsService } from './state/descriptors.service'; import { LaunchToCodespaceDialogComponent } from './dialog/launch-to-codespace-dialog.component'; import { bootstrap4largeModalSize } from '../../shared/constants'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MultiCloudLaunchComponent } from './multi-cloud-launch/multi-cloud-launch.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatDividerModule } from '@angular/material/divider'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; import FileTypeEnum = ToolFile.FileTypeEnum; /* eslint-disable max-len */ @@ -96,6 +103,18 @@ import FileTypeEnum = ToolFile.FileTypeEnum; templateUrl: './launch-third-party.component.html', styleUrls: ['./launch-third-party.component.scss'], providers: [DescriptorsService, DescriptorsQuery, DescriptorsStore], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatDividerModule, + FlexModule, + MultiCloudLaunchComponent, + MatLegacyTooltipModule, + MatLegacyButtonModule, + MatLegacyDialogModule, + AsyncPipe, + ], }) export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit { /** diff --git a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts index caf29eb39b..f331e0c9bb 100644 --- a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts +++ b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.spec.ts @@ -1,6 +1,6 @@ import { HttpClientModule } from '@angular/common/http'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { CustomMaterialModule } from '../../../shared/modules/material.module'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { UsersService } from '../../../shared/openapi'; import { UserStubService } from '../../../test/service-stubs'; import { FilterCloudInstancesPipe } from '../filterCloudInstances.pipe'; @@ -13,8 +13,7 @@ describe('MultiCloudLaunchComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [MultiCloudLaunchComponent, FilterCloudInstancesPipe], - imports: [CustomMaterialModule, HttpClientModule], + imports: [HttpClientModule, MultiCloudLaunchComponent, FilterCloudInstancesPipe, MatLegacySnackBarModule], providers: [{ provider: UsersService, useClass: UserStubService }], }); }) diff --git a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts index 9073a9e8e0..fcfcd16dba 100644 --- a/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts +++ b/src/app/workflow/launch-third-party/multi-cloud-launch/multi-cloud-launch.component.ts @@ -1,14 +1,38 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Component, EventEmitter, Input, OnInit, Output, ViewChild } from '@angular/core'; -import { MatLegacyMenuTrigger as MatMenuTrigger } from '@angular/material/legacy-menu'; +import { MatLegacyMenuTrigger as MatMenuTrigger, MatLegacyMenuModule } from '@angular/material/legacy-menu'; import { AlertService } from '../../../shared/alert/state/alert.service'; import { Base } from '../../../shared/base'; import { CloudInstance, Language, User, UsersService } from '../../../shared/openapi'; +import { FilterCloudInstancesPipe } from '../filterCloudInstances.pipe'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgFor } from '@angular/common'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; @Component({ selector: 'app-multi-cloud-launch', templateUrl: './multi-cloud-launch.component.html', styleUrls: ['./multi-cloud-launch.component.scss', '../launch-third-party.component.scss'], + standalone: true, + imports: [ + MatLegacyTooltipModule, + MatLegacyButtonModule, + MatLegacyMenuModule, + MatIconModule, + FlexModule, + MatLegacyRadioModule, + FormsModule, + NgFor, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FilterCloudInstancesPipe, + ], }) export class MultiCloudLaunchComponent extends Base implements OnInit { @ViewChild(MatMenuTrigger) trigger: MatMenuTrigger; diff --git a/src/app/workflow/launch/launch.component.spec.ts b/src/app/workflow/launch/launch.component.spec.ts index 77a1d5e9cc..546f4d0a53 100644 --- a/src/app/workflow/launch/launch.component.spec.ts +++ b/src/app/workflow/launch/launch.component.spec.ts @@ -40,9 +40,8 @@ describe('LaunchWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [LaunchWorkflowComponent], schemas: [NO_ERRORS_SCHEMA], - imports: [HttpClientTestingModule], + imports: [HttpClientTestingModule, LaunchWorkflowComponent], providers: [ WorkflowLaunchService, { provide: ContainerService, useClass: ContainerStubService }, diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index d19c34bfa0..3c396d2a6f 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -29,11 +29,33 @@ import { Workflow } from '../../shared/openapi/model/workflow'; import { WorkflowVersion } from '../../shared/openapi/model/workflowVersion'; import { WorkflowLaunchService } from '../launch/workflow-launch.service'; import { EntryType } from '../../shared/enum/entry-type'; +import { LaunchCheckerWorkflowComponent } from '../../shared/entry/launch-checker-workflow/launch-checker-workflow.component'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from '../../shared/snackbar.directive'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-launch', templateUrl: './launch.component.html', styleUrls: ['./launch.component.css'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + FlexModule, + MatLegacyTooltipModule, + MatLegacyButtonModule, + SnackbarDirective, + ClipboardModule, + LaunchCheckerWorkflowComponent, + AsyncPipe, + ], }) export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChanges { @Input() basePath; diff --git a/src/app/workflow/permissions/permissions.component.spec.ts b/src/app/workflow/permissions/permissions.component.spec.ts index 967f2720d0..61fb0151e0 100644 --- a/src/app/workflow/permissions/permissions.component.spec.ts +++ b/src/app/workflow/permissions/permissions.component.spec.ts @@ -1,8 +1,8 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { RefreshService } from '../../shared/refresh.service'; import { TokenService } from '../../shared/state/token.service'; -import { CustomMaterialModule } from './../../shared/modules/material.module'; import { WorkflowsService } from './../../shared/openapi/api/workflows.service'; import { RefreshStubService, TokenStubService, WorkflowsStubService } from './../../test/service-stubs'; import { PermissionsComponent } from './permissions.component'; @@ -14,8 +14,7 @@ describe('PermissionsComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [PermissionsComponent], - imports: [CustomMaterialModule], + imports: [PermissionsComponent, MatLegacySnackBarModule], providers: [ { provide: WorkflowsService, useClass: WorkflowsStubService }, { provide: TokenService, useClass: TokenStubService }, diff --git a/src/app/workflow/permissions/permissions.component.ts b/src/app/workflow/permissions/permissions.component.ts index 31b3f20783..39caef1c75 100644 --- a/src/app/workflow/permissions/permissions.component.ts +++ b/src/app/workflow/permissions/permissions.component.ts @@ -1,7 +1,7 @@ import { COMMA, ENTER } from '@angular/cdk/keycodes'; import { HttpErrorResponse } from '@angular/common/http'; import { Component, Input, OnInit } from '@angular/core'; -import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -9,12 +9,18 @@ import { Dockstore } from '../../shared/dockstore.model'; import { TokenSource } from '../../shared/enum/token-source.enum'; import { TokenQuery } from '../../shared/state/token.query'; import { Permission, Workflow, WorkflowsService, WorkflowSubClass } from '../../shared/openapi'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, NgFor } from '@angular/common'; import RoleEnum = Permission.RoleEnum; @Component({ selector: 'app-permissions', templateUrl: './permissions.component.html', styleUrls: ['./permissions.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyProgressBarModule, MatLegacyFormFieldModule, MatLegacyChipsModule, NgFor, MatIconModule], }) export class PermissionsComponent implements OnInit { public Role = RoleEnum; diff --git a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts index 6df3167fa8..d52b8e1ea0 100644 --- a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts +++ b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.spec.ts @@ -46,8 +46,15 @@ describe('RefreshWorkflowOrganizationComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [RefreshWorkflowOrganizationComponent], - imports: [MatToolbarModule, MatIconModule, MatButtonModule, MatTooltipModule, MatSnackBarModule, HttpClientTestingModule], + imports: [ + MatToolbarModule, + MatIconModule, + MatButtonModule, + MatTooltipModule, + MatSnackBarModule, + HttpClientTestingModule, + RefreshWorkflowOrganizationComponent, + ], providers: [ { provide: UsersService, useClass: UsersStubService }, { provide: WorkflowService, useClass: WorkflowStubService }, diff --git a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts index fc9b9f12c2..4dfd510918 100644 --- a/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts +++ b/src/app/workflow/refresh-workflow-organization/refresh-workflow-organization.component.ts @@ -29,12 +29,16 @@ import { WorkflowService } from '../../shared/state/workflow.service'; import { WorkflowsService } from '../../shared/openapi'; import { Workflow } from '../../shared/openapi/model/workflow'; import { UserQuery } from '../../shared/user/user.query'; +import { AsyncPipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @Component({ selector: 'app-refresh-workflow-organization', // Note that the template and style is actually from the shared one (used by both my-workflows and my-tools) templateUrl: './../../shared/refresh-organization/refresh-organization.component.html', styleUrls: ['./../../shared/refresh-organization/refresh-organization.component.css'], + standalone: true, + imports: [MatLegacyButtonModule, AsyncPipe], }) export class RefreshWorkflowOrganizationComponent extends RefreshOrganizationComponent implements OnInit, OnChanges { @Input() protected orgWorkflowObject: OrgWorkflowObject; diff --git a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts index 62873c984c..002663a12a 100644 --- a/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts +++ b/src/app/workflow/register-workflow-modal/register-github-app-modal/register-github-app-modal.component.ts @@ -20,13 +20,18 @@ import { Observable } from 'rxjs'; import { AlertQuery } from '../../../shared/alert/state/alert.query'; import { Dockstore } from '../../../shared/dockstore.model'; import { RegisterWorkflowModalService } from '../register-workflow-modal.service'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { EntryType } from 'app/shared/openapi'; +import { TitleCasePipe } from '@angular/common'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { RegisterGithubAppComponent } from '../../../shared/register-github-app/register-github-app.component'; @Component({ selector: 'app-register-github-app-modal', templateUrl: './register-github-app-modal.component.html', styleUrls: ['../register-workflow-modal.component.scss'], + standalone: true, + imports: [MatLegacyDialogModule, RegisterGithubAppComponent, MatLegacyButtonModule, TitleCasePipe], }) export class RegisterGithubAppModalComponent implements OnInit { public EntryType = EntryType; diff --git a/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts b/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts index e0df1ece23..ecde30b337 100644 --- a/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts +++ b/src/app/workflow/register-workflow-modal/register-workflow-modal.component.ts @@ -14,9 +14,9 @@ * limitations under the License. */ import { AfterViewChecked, Component, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MatLegacyDialogRef as MatDialogRef } from '@angular/material/legacy-dialog'; -import { MatLegacyRadioChange as MatRadioChange } from '@angular/material/legacy-radio'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MatLegacyDialogRef as MatDialogRef, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacyRadioChange as MatRadioChange, MatLegacyRadioModule } from '@angular/material/legacy-radio'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { SessionQuery } from 'app/shared/session/session.query'; import { UserQuery } from 'app/shared/user/user.query'; @@ -35,6 +35,20 @@ import { validationMessages, } from '../../shared/validationMessages.model'; import { RegisterWorkflowModalService } from './register-workflow-modal.service'; +import { MapFriendlyValuesPipe } from '../../search/map-friendly-values.pipe'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { EntryWizardComponent } from '../../shared/entry-wizard/entry-wizard.component'; +import { RegisterGithubAppComponent } from '../../shared/register-github-app/register-github-app.component'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgFor, NgIf, AsyncPipe } from '@angular/common'; +import { MatIconModule } from '@angular/material/icon'; +import { MatStepperModule } from '@angular/material/stepper'; +import { AlertComponent } from '../../shared/alert/alert.component'; export interface HostedWorkflowObject { name: string; @@ -45,6 +59,28 @@ export interface HostedWorkflowObject { selector: 'app-register-workflow-modal', templateUrl: './register-workflow-modal.component.html', styleUrls: ['./register-workflow-modal.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatStepperModule, + MatIconModule, + MatLegacyRadioModule, + FormsModule, + NgFor, + NgIf, + MatLegacyButtonModule, + RegisterGithubAppComponent, + EntryWizardComponent, + FlexModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + MatLegacyOptionModule, + MatLegacyInputModule, + MatLegacyTooltipModule, + AsyncPipe, + MapFriendlyValuesPipe, + ], }) export class RegisterWorkflowModalComponent implements OnInit, AfterViewChecked, OnDestroy { public EntryType = EntryType; diff --git a/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.spec.ts b/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.spec.ts index dc8b25a909..fd052cfdf9 100644 --- a/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.spec.ts @@ -8,7 +8,7 @@ describe('ExporterStepComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [ExporterStepComponent], + imports: [ExporterStepComponent], }).compileComponents(); }); diff --git a/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.ts b/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.ts index ac28ab5fdd..a8ba97bebe 100644 --- a/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.ts +++ b/src/app/workflow/snapshot-exporter-modal/exporter-step/exporter-step.component.ts @@ -1,11 +1,18 @@ import { Component, Input } from '@angular/core'; import { IconDefinition } from '@fortawesome/free-brands-svg-icons'; -import { StepState } from '../snaphot-exporter-modal.component'; +import { MatLegacyProgressSpinnerModule } from '@angular/material/legacy-progress-spinner'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatIconModule } from '@angular/material/icon'; +import { NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { StepState } from '../step.state'; @Component({ selector: 'app-exporter-step', templateUrl: './exporter-step.component.html', styleUrls: ['./exporter-step.component.scss'], + standalone: true, + imports: [FlexModule, NgIf, MatIconModule, FontAwesomeModule, MatLegacyProgressSpinnerModule, NgSwitch, NgSwitchCase, NgSwitchDefault], }) export class ExporterStepComponent { @Input() stepState: StepState; diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts index 74f2aae97b..406e720086 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts @@ -10,7 +10,7 @@ import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; import { DateService } from '../../shared/date.service'; import { ProviderService } from '../../shared/provider.service'; -import { AccountsStubService, AuthStubService } from '../../test/service-stubs'; +import { AccountsStubService, AuthStubService, DateStubService } from '../../test/service-stubs'; import { SnaphotExporterModalComponent, SnapshotExporterAction } from './snaphot-exporter-modal.component'; import { DescriptorLanguageService } from '../../shared/entry/descriptor-language.service'; @@ -21,13 +21,12 @@ describe('SnapshotDoiOrcidComponent', () => { beforeEach(async () => { await TestBed.configureTestingModule({ - declarations: [SnaphotExporterModalComponent], - imports: [MatSnackBarModule, HttpClientTestingModule, RouterTestingModule, MatIconModule], + imports: [MatSnackBarModule, HttpClientTestingModule, RouterTestingModule, MatIconModule, SnaphotExporterModalComponent], providers: [ { provide: MAT_DIALOG_DATA, useValue: { - workflow: { entryTypeMetadata: { term: 'workflow' } }, // simulation of a Workflow + workflow: { entryTypeMetadata: { term: 'workflow' } }, version: { frozen: false, versionMetadata: { @@ -48,7 +47,7 @@ describe('SnapshotDoiOrcidComponent', () => { }, { provide: AuthService, useClass: AuthStubService }, { provide: AccountsService, useClass: AccountsStubService }, - DateService, + { provide: DateService, useClass: DateStubService }, ProviderService, { provide: DescriptorLanguageService, useClass: DescriptorLanguageService }, ], diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts index ee1689fe6f..b499eaa39d 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts @@ -1,15 +1,25 @@ +import { AsyncPipe, NgIf, NgSwitch, NgSwitchCase, NgSwitchDefault, NgTemplateOutlet } from '@angular/common'; import { Component, Inject } from '@angular/core'; -import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { + MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, + MatLegacyDialogModule, + MatLegacyDialogRef as MatDialogRef, +} from '@angular/material/legacy-dialog'; import { Router } from '@angular/router'; import { faOrcid } from '@fortawesome/free-brands-svg-icons'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; import { concat, Observable, of as observableOf, throwError } from 'rxjs'; import { catchError, first, switchMap, tap } from 'rxjs/operators'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { Base } from '../../shared/base'; import { Dockstore } from '../../shared/dockstore.model'; -import { TokenQuery } from '../../shared/state/token.query'; import { BioWorkflow, WorkflowVersion } from '../../shared/openapi'; +import { TokenQuery } from '../../shared/state/token.query'; +import { ExporterStepComponent } from './exporter-step/exporter-step.component'; import { SnapshotExporterModalService } from './snapshot-exporter-modal.service'; +import { StepState } from './step.state'; export enum SnapshotExporterAction { SNAPSHOT, @@ -24,13 +34,6 @@ export interface SnapshotExporterDialogData { userId: number; } -export enum StepState { - INITIAL, - EXECUTING, - COMPLETED, - ERROR, -} - export interface State { snapshot: StepState; doi: StepState; @@ -41,6 +44,20 @@ export interface State { @Component({ selector: 'app-snapshot-exporter-modal-component', templateUrl: './snaphot-exporter-modal.component.html', + standalone: true, + imports: [ + MatLegacyDialogModule, + NgSwitch, + NgSwitchCase, + NgIf, + NgTemplateOutlet, + FlexModule, + MatLegacyButtonModule, + NgSwitchDefault, + ExporterStepComponent, + MatIconModule, + AsyncPipe, + ], }) export class SnaphotExporterModalComponent extends Base { public hasZenodoToken$: Observable = this.tokenQuery.hasZenodoToken$; diff --git a/src/app/workflow/snapshot-exporter-modal/step.state.ts b/src/app/workflow/snapshot-exporter-modal/step.state.ts new file mode 100644 index 0000000000..72ca97a1b7 --- /dev/null +++ b/src/app/workflow/snapshot-exporter-modal/step.state.ts @@ -0,0 +1,25 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +export enum StepState { + INITIAL, + EXECUTING, + COMPLETED, + ERROR, +} diff --git a/src/app/workflow/tool-tab/tool-tab.component.spec.ts b/src/app/workflow/tool-tab/tool-tab.component.spec.ts index 123ec4013a..ea513eaa15 100644 --- a/src/app/workflow/tool-tab/tool-tab.component.spec.ts +++ b/src/app/workflow/tool-tab/tool-tab.component.spec.ts @@ -15,8 +15,6 @@ */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; -import { RefreshAlertModule } from '../../shared/alert/alert.module'; -import { CustomMaterialModule } from '../../shared/modules/material.module'; import { WorkflowService } from '../../shared/state/workflow.service'; import { WorkflowsService } from '../../shared/openapi'; import { WorkflowsStubService, WorkflowStubService } from '../../test/service-stubs'; @@ -31,8 +29,7 @@ describe('ToolTabComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ToolTabComponent], - imports: [FormsModule, CustomMaterialModule, RefreshAlertModule, HttpClientTestingModule], + imports: [FormsModule, HttpClientTestingModule, ToolTabComponent], providers: [ { provide: WorkflowService, useClass: WorkflowStubService }, { provide: WorkflowsService, useClass: WorkflowsStubService }, diff --git a/src/app/workflow/tool-tab/tool-tab.component.ts b/src/app/workflow/tool-tab/tool-tab.component.ts index 0f73077eec..7a38b14e1c 100644 --- a/src/app/workflow/tool-tab/tool-tab.component.ts +++ b/src/app/workflow/tool-tab/tool-tab.component.ts @@ -24,11 +24,18 @@ import { WorkflowQuery } from '../../shared/state/workflow.query'; import { ToolDescriptor, WorkflowVersion } from '../../shared/openapi'; import { WorkflowsService } from './../../shared/openapi/api/workflows.service'; import { ToolTabService } from './tool-tab.service'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { LoadingComponent } from '../../shared/loading/loading.component'; @Component({ selector: 'app-tool-tab', templateUrl: './tool-tab.component.html', styleUrls: ['./tool-tab.component.scss'], + standalone: true, + imports: [LoadingComponent, NgIf, MatLegacyCardModule, MatIconModule, MatLegacyTableModule, AsyncPipe], }) export class ToolTabComponent extends EntryTab { workflow: BioWorkflow | Service | Notebook; diff --git a/src/app/workflow/version-modal/version-modal.component.ts b/src/app/workflow/version-modal/version-modal.component.ts index 2a2d68283e..2770c5f863 100644 --- a/src/app/workflow/version-modal/version-modal.component.ts +++ b/src/app/workflow/version-modal/version-modal.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewChecked, Component, Inject, OnDestroy, OnInit, ViewChild } from '@angular/core'; -import { NgForm } from '@angular/forms'; -import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { NgForm, FormsModule } from '@angular/forms'; +import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { Service } from 'app/shared/openapi/model/service'; import { Notebook } from 'app/shared/openapi/model/notebook'; import { Observable, Subject } from 'rxjs'; @@ -34,6 +34,15 @@ import { formErrors, validationDescriptorPatterns, validationMessages } from '.. import { VersionModalService } from './version-modal.service'; import { EntryType } from '../../shared/enum/entry-type'; import { DockstoreService } from 'app/shared/dockstore.service'; +import { VerifiedPlatformsPipe } from '../../shared/entry/verified-platforms.pipe'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { NgIf, NgFor, NgClass, AsyncPipe } from '@angular/common'; +import { AlertComponent } from '../../shared/alert/alert.component'; export interface Dialogdata { canRead: boolean; @@ -47,6 +56,23 @@ export interface Dialogdata { selector: 'app-version-modal', templateUrl: './version-modal.component.html', styleUrls: ['./version-modal.component.css'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + FormsModule, + NgIf, + MatLegacyTooltipModule, + MatLegacyCardModule, + NgFor, + NgClass, + ExtendedModule, + MatIconModule, + FlexModule, + MatLegacyButtonModule, + AsyncPipe, + VerifiedPlatformsPipe, + ], }) export class VersionModalComponent implements OnInit, AfterViewChecked, OnDestroy { isPublic: boolean; diff --git a/src/app/workflow/versions/versions.component.spec.ts b/src/app/workflow/versions/versions.component.spec.ts index 581ebc47c1..4c298f713e 100644 --- a/src/app/workflow/versions/versions.component.spec.ts +++ b/src/app/workflow/versions/versions.component.spec.ts @@ -16,9 +16,9 @@ import { Component, Input } from '@angular/core'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { FormsModule } from '@angular/forms'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { DateService } from '../../shared/date.service'; import { DockstoreService } from '../../shared/dockstore.service'; @@ -45,6 +45,8 @@ import { DescriptorLanguageService } from '../../shared/entry/descriptor-languag @Component({ selector: 'app-view-workflow', template: '

    App View Component

    ', + standalone: true, + imports: [FormsModule, FontAwesomeModule, HttpClientTestingModule], }) class MockViewWorkflowComponent { @Input() versions; @@ -59,6 +61,8 @@ class MockViewWorkflowComponent { @Component({ selector: 'app-version-modal', template: '

    Version Modal Component

    ', + standalone: true, + imports: [FormsModule, FontAwesomeModule, HttpClientTestingModule], }) class MockVersionModalComponent { @Input() canRead; @@ -72,9 +76,13 @@ describe('VersionsWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule, FormsModule, FontAwesomeModule, BrowserAnimationsModule, HttpClientTestingModule], - declarations: [ + imports: [ + FormsModule, + FontAwesomeModule, + BrowserAnimationsModule, + HttpClientTestingModule, VersionsWorkflowComponent, + MatLegacySnackBarModule, OrderBy, CommitUrlPipe, VerifiedPlatformsPipe, diff --git a/src/app/workflow/versions/versions.component.ts b/src/app/workflow/versions/versions.component.ts index f9750e58ed..a7f0bb0cff 100644 --- a/src/app/workflow/versions/versions.component.ts +++ b/src/app/workflow/versions/versions.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { AfterViewInit, Component, EventEmitter, Input, OnChanges, OnInit, Output, ViewChild } from '@angular/core'; -import { MatSort } from '@angular/material/sort'; -import { MatLegacyTableDataSource as MatTableDataSource } from '@angular/material/legacy-table'; +import { MatSort, MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableDataSource as MatTableDataSource, MatLegacyTableModule } from '@angular/material/legacy-table'; import { faCodeBranch, faTag } from '@fortawesome/free-solid-svg-icons'; import { takeUntil } from 'rxjs/operators'; import { AlertService } from '../../shared/alert/state/alert.service'; @@ -29,11 +29,41 @@ import { ExtendedWorkflowQuery } from '../../shared/state/extended-workflow.quer import { Workflow } from '../../shared/openapi/model/workflow'; import { WorkflowVersion } from '../../shared/openapi/model/workflowVersion'; import { Versions } from '../../shared/versions'; +import { CommitUrlPipe } from '../../shared/entry/commit-url.pipe'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { DescriptorLanguageVersionsPipe } from '../../shared/entry/descriptor-language-versions.pipe'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { ViewWorkflowComponent } from '../view/view.component'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyChipsModule } from '@angular/material/legacy-chips'; +import { NgIf, NgClass, JsonPipe, DatePipe } from '@angular/common'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; @Component({ selector: 'app-versions-workflow', templateUrl: './versions.component.html', styleUrls: ['./versions.component.scss'], + standalone: true, + imports: [ + MatLegacyTableModule, + MatSortModule, + MatLegacyTooltipModule, + MatIconModule, + FlexModule, + NgIf, + MatLegacyChipsModule, + FontAwesomeModule, + ViewWorkflowComponent, + NgClass, + ExtendedModule, + JsonPipe, + DatePipe, + DescriptorLanguageVersionsPipe, + DescriptorLanguagePipe, + CommitUrlPipe, + ], }) export class VersionsWorkflowComponent extends Versions implements OnInit, OnChanges, AfterViewInit { faTag = faTag; diff --git a/src/app/workflow/view/view.component.spec.ts b/src/app/workflow/view/view.component.spec.ts index 08c94c398e..ceb52c6d37 100644 --- a/src/app/workflow/view/view.component.spec.ts +++ b/src/app/workflow/view/view.component.spec.ts @@ -14,8 +14,9 @@ * limitations under the License. */ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { AccountsService } from 'app/loginComponents/accounts/external/accounts.service'; -import { CustomMaterialModule } from 'app/shared/modules/material.module'; import { RefreshService } from 'app/shared/refresh.service'; import { DateService } from '../../shared/date.service'; import { WorkflowService } from '../../shared/state/workflow.service'; @@ -44,8 +45,7 @@ describe('ViewWorkflowComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - imports: [CustomMaterialModule, HttpClientTestingModule], - declarations: [ViewWorkflowComponent], + imports: [HttpClientTestingModule, ViewWorkflowComponent, MatLegacySnackBarModule, MatLegacyDialogModule], providers: [ { provide: ViewService }, { provide: AccountsService, useClass: AccountsStubService }, diff --git a/src/app/workflow/view/view.component.ts b/src/app/workflow/view/view.component.ts index 1f022ceeeb..d8c6ecdb02 100644 --- a/src/app/workflow/view/view.component.ts +++ b/src/app/workflow/view/view.component.ts @@ -41,11 +41,17 @@ import { SnaphotExporterModalComponent, SnapshotExporterAction } from '../snapsh import { VersionModalComponent } from '../version-modal/version-modal.component'; import { VersionModalService } from '../version-modal/version-modal.service'; import { ViewService } from './view.service'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyMenuModule } from '@angular/material/legacy-menu'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { NgIf, AsyncPipe } from '@angular/common'; @Component({ selector: 'app-view-workflow', templateUrl: './view.component.html', styleUrls: ['./view.component.css'], + standalone: true, + imports: [NgIf, MatLegacyButtonModule, MatLegacyMenuModule, MatLegacyTooltipModule, AsyncPipe], }) export class ViewWorkflowComponent extends View implements OnInit { @Input() workflowId: number; diff --git a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts index a002372f49..8b16a4f45c 100644 --- a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts +++ b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts @@ -34,13 +34,6 @@ describe('WorkflowFileEditorComponent', () => { beforeEach( waitForAsync(() => { TestBed.configureTestingModule({ - declarations: [ - WorkflowFileEditorComponent, - CodeEditorListComponent, - CodeEditorComponent, - PublicFileDownloadPipe, - PrivateFilePathPipe, - ], imports: [ MatButtonModule, MatTabsModule, @@ -55,6 +48,11 @@ describe('WorkflowFileEditorComponent', () => { BrowserAnimationsModule, HttpClientModule, HttpClientTestingModule, + WorkflowFileEditorComponent, + CodeEditorListComponent, + CodeEditorComponent, + PublicFileDownloadPipe, + PrivateFilePathPipe, ], providers: [ { provide: HostedService, useClass: HostedStubService }, diff --git a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.ts b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.ts index c273df63ca..a699a95a21 100644 --- a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.ts +++ b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.ts @@ -26,11 +26,19 @@ import { WorkflowService } from '../../shared/state/workflow.service'; import { HostedService } from './../../shared/openapi/api/hosted.service'; import { WorkflowsService } from './../../shared/openapi/api/workflows.service'; import { WorkflowVersion } from './../../shared/openapi/model/workflowVersion'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { NgIf, AsyncPipe } from '@angular/common'; +import { CodeEditorListComponent } from '../../shared/code-editor-list/code-editor-list.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; @Component({ selector: 'app-workflow-file-editor', templateUrl: './workflow-file-editor.component.html', styleUrls: ['./workflow-file-editor.component.scss'], + standalone: true, + imports: [MatLegacyTabsModule, CodeEditorListComponent, NgIf, MatLegacyCardModule, MatIconModule, MatLegacyButtonModule, AsyncPipe], }) export class WorkflowFileEditorComponent extends FileEditing { public EntryType = EntryType; diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 5f4442958a..1370fdaa0f 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -14,15 +14,27 @@ * limitations under the License. */ import { COMMA, ENTER } from '@angular/cdk/keycodes'; -import { Location } from '@angular/common'; +import { + Location, + NgIf, + NgFor, + NgClass, + NgSwitch, + NgSwitchCase, + NgSwitchDefault, + NgTemplateOutlet, + AsyncPipe, + DatePipe, +} from '@angular/common'; import { AfterViewInit, Component, Input, OnInit } from '@angular/core'; -import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/legacy-chips'; +import { MatLegacyChipInputEvent as MatChipInputEvent, MatLegacyChipsModule } from '@angular/material/legacy-chips'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ActivatedRoute, Router } from '@angular/router'; import { AlertService } from 'app/shared/alert/state/alert.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; import { Service } from 'app/shared/openapi/model/service'; import { Notebook } from 'app/shared/openapi/model/notebook'; +import { ShareIconsModule } from 'ngx-sharebuttons/icons'; import { Observable, ReplaySubject } from 'rxjs'; import { finalize, takeUntil } from 'rxjs/operators'; import { AlertQuery } from '../shared/alert/state/alert.query'; @@ -63,12 +75,92 @@ import { UrlResolverService } from '../shared/url-resolver.service'; import { Title } from '@angular/platform-browser'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; import RoleEnum = Permission.RoleEnum; -import { FormControl } from '@angular/forms'; +import { FormControl, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { BaseUrlPipe } from '../shared/entry/base-url.pipe'; +import { ShareButtonsModule } from 'ngx-sharebuttons/buttons'; +import { VerifiedByComponent } from '../shared/entry/verified-by/verified-by.component'; +import { CurrentCollectionsComponent } from '../entry/current-collections/current-collections.component'; +import { MatDividerModule } from '@angular/material/divider'; +import { LaunchThirdPartyComponent } from './launch-third-party/launch-third-party.component'; +import { PermissionsComponent } from './permissions/permissions.component'; +import { ExecutionsTabComponent } from './executions/executions-tab.component'; +import { DagComponent } from './dag/dag.component'; +import { ToolTabComponent } from './tool-tab/tool-tab.component'; +import { WorkflowFileEditorComponent } from './workflow-file-editor/workflow-file-editor.component'; +import { SourceFileTabsComponent } from '../source-file-tabs/source-file-tabs.component'; +import { VersionsWorkflowComponent } from './versions/versions.component'; +import { LaunchWorkflowComponent } from './launch/launch.component'; +import { NotebookComponent } from '../notebook/notebook.component'; +import { InfoTabComponent } from './info-tab/info-tab.component'; +import { MatLegacyTabsModule } from '@angular/material/legacy-tabs'; +import { StargazersComponent } from '../stargazers/stargazers.component'; +import { CategoryButtonComponent } from '../categories/button/category-button.component'; +import { WorkflowActionsComponent } from '../shared/entry-actions/workflow-actions.component'; +import { StarringComponent } from '../starring/starring.component'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { MatLegacyOptionModule } from '@angular/material/legacy-core'; +import { MatLegacySelectModule } from '@angular/material/legacy-select'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { JsonLdComponent } from '../shared/json-ld/json-ld.component'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; @Component({ selector: 'app-workflow', templateUrl: './workflow.component.html', styleUrls: ['../shared/styles/workflow-container.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyCardModule, + MatIconModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + FlexModule, + JsonLdComponent, + ExtendedModule, + MatLegacyChipsModule, + MatLegacyFormFieldModule, + MatLegacySelectModule, + FormsModule, + ReactiveFormsModule, + MatLegacyOptionModule, + NgxMatSelectSearchModule, + NgFor, + StarringComponent, + WorkflowActionsComponent, + CategoryButtonComponent, + StargazersComponent, + NgClass, + MatLegacyTabsModule, + InfoTabComponent, + NotebookComponent, + LaunchWorkflowComponent, + VersionsWorkflowComponent, + NgSwitch, + NgSwitchCase, + NgSwitchDefault, + NgTemplateOutlet, + SourceFileTabsComponent, + WorkflowFileEditorComponent, + ToolTabComponent, + DagComponent, + ExecutionsTabComponent, + PermissionsComponent, + LaunchThirdPartyComponent, + MatDividerModule, + CurrentCollectionsComponent, + VerifiedByComponent, + ShareButtonsModule, + ShareIconsModule, + AsyncPipe, + DatePipe, + BaseUrlPipe, + ], }) export class WorkflowComponent extends Entry implements AfterViewInit, OnInit { workflowEditData: any; diff --git a/src/app/workflows/apptools/apptools.module.ts b/src/app/workflows/apptools/apptools.module.ts deleted file mode 100644 index ce73a1809e..0000000000 --- a/src/app/workflows/apptools/apptools.module.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from '../../shared/modules/workflowsPage.module'; -import { AppToolsRoutes } from './apptools.routing'; - -@NgModule({ - declarations: [], - imports: [WorkflowsPageModule, AppToolsRoutes], -}) -export class AppToolsModule {} diff --git a/src/app/workflows/apptools/apptools.routing.ts b/src/app/workflows/apptools/apptools.routing.ts index 33cbe7699a..2fba77c350 100644 --- a/src/app/workflows/apptools/apptools.routing.ts +++ b/src/app/workflows/apptools/apptools.routing.ts @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const AppToolsRoutes = RouterModule.forChild(routes); +export const AppToolsRoutes = routes; diff --git a/src/app/workflows/list/list.component.ts b/src/app/workflows/list/list.component.ts index 848e61df8a..740ae3cbd9 100644 --- a/src/app/workflows/list/list.component.ts +++ b/src/app/workflows/list/list.component.ts @@ -26,11 +26,46 @@ import { PaginatorService } from '../../shared/state/paginator.service'; import { Workflow, WorkflowsService } from '../../shared/openapi'; import { ToolLister } from '../../shared/tool-lister'; import { PublishedWorkflowsDataSource } from './published-workflows.datasource'; +import { DescriptorLanguagePipe } from '../../shared/entry/descriptor-language.pipe'; +import { RouterLinkPipe } from '../../entry/router-link.pipe'; +import { MatLegacyPaginatorModule } from '@angular/material/legacy-paginator'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { MatIconModule } from '@angular/material/icon'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { RouterLink } from '@angular/router'; +import { MatSortModule } from '@angular/material/sort'; +import { MatLegacyTableModule } from '@angular/material/legacy-table'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { MatLegacyProgressBarModule } from '@angular/material/legacy-progress-bar'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; @Component({ selector: 'app-list-workflows', templateUrl: './list.component.html', styleUrls: ['../../shared/styles/entry-table.scss', './list.component.scss'], + standalone: true, + imports: [ + NgIf, + MatLegacyProgressBarModule, + MatLegacyFormFieldModule, + MatLegacyInputModule, + MatLegacyTableModule, + MatSortModule, + RouterLink, + ExtendedModule, + MatIconModule, + MatLegacyTooltipModule, + FontAwesomeModule, + MatLegacyButtonModule, + MatLegacyPaginatorModule, + AsyncPipe, + TitleCasePipe, + RouterLinkPipe, + DescriptorLanguagePipe, + ], }) export class ListWorkflowsComponent extends ToolLister implements OnInit { @Input() previewMode: boolean; diff --git a/src/app/workflows/notebooks/notebooks.module.ts b/src/app/workflows/notebooks/notebooks.module.ts deleted file mode 100644 index 525c8e3b60..0000000000 --- a/src/app/workflows/notebooks/notebooks.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { NotebooksRoutes } from './notebooks.routing'; - -@NgModule({ - imports: [WorkflowsPageModule, NotebooksRoutes], -}) -export class NotebooksModule {} diff --git a/src/app/workflows/notebooks/notebooks.routing.ts b/src/app/workflows/notebooks/notebooks.routing.ts index f3ed2517c7..cef8bc98eb 100644 --- a/src/app/workflows/notebooks/notebooks.routing.ts +++ b/src/app/workflows/notebooks/notebooks.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const NotebooksRoutes = RouterModule.forChild(routes); +export const NotebooksRoutes = routes; diff --git a/src/app/workflows/search/search.component.ts b/src/app/workflows/search/search.component.ts index 12865a062a..12cbdef6fa 100644 --- a/src/app/workflows/search/search.component.ts +++ b/src/app/workflows/search/search.component.ts @@ -15,9 +15,12 @@ */ import { Component } from '@angular/core'; +import { ListWorkflowsComponent } from '../list/list.component'; @Component({ selector: 'app-search-workflows', templateUrl: './search.component.html', + standalone: true, + imports: [ListWorkflowsComponent], }) export class SearchWorkflowsComponent {} diff --git a/src/app/workflows/services/services.module.ts b/src/app/workflows/services/services.module.ts deleted file mode 100644 index 62ea7d73dc..0000000000 --- a/src/app/workflows/services/services.module.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { ServicesRoutes } from './services.routing'; - -@NgModule({ - imports: [WorkflowsPageModule, ServicesRoutes], -}) -export class ServicesModule {} diff --git a/src/app/workflows/services/services.routing.ts b/src/app/workflows/services/services.routing.ts index abb605ac7a..5b539e41bc 100644 --- a/src/app/workflows/services/services.routing.ts +++ b/src/app/workflows/services/services.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; @@ -16,4 +16,4 @@ const routes: Routes = [ }, ]; -export const ServicesRoutes = RouterModule.forChild(routes); +export const ServicesRoutes = routes; diff --git a/src/app/workflows/workflows.component.ts b/src/app/workflows/workflows.component.ts index 98f2536bf1..88869493a8 100644 --- a/src/app/workflows/workflows.component.ts +++ b/src/app/workflows/workflows.component.ts @@ -15,17 +15,23 @@ */ import { Component } from '@angular/core'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute, Router, RouterLink, RouterOutlet } from '@angular/router'; import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { Observable } from 'rxjs'; import { EntryType } from '../shared/enum/entry-type'; import { EntryTypeMetadata } from 'app/shared/openapi'; import { UrlResolverService } from '../shared/url-resolver.service'; +import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { NgIf, AsyncPipe, TitleCasePipe } from '@angular/common'; +import { HeaderComponent } from '../header/header.component'; @Component({ selector: 'app-workflows', templateUrl: './workflows.component.html', + standalone: true, + imports: [HeaderComponent, NgIf, FlexModule, RouterLink, ExtendedModule, RouterOutlet, AsyncPipe, TitleCasePipe], }) export class WorkflowsComponent { public entryName: string; diff --git a/src/app/workflows/workflows.module.ts b/src/app/workflows/workflows.module.ts deleted file mode 100644 index 4f40c05836..0000000000 --- a/src/app/workflows/workflows.module.ts +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright 2017 OICR - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -import { NgModule } from '@angular/core'; -import { WorkflowsPageModule } from 'app/shared/modules/workflowsPage.module'; -import { workflowsRouting } from './workflows.routing'; -import { PlatformPartnerPipe } from '../shared/entry/platform-partner.pipe'; - -@NgModule({ - declarations: [], - imports: [workflowsRouting, WorkflowsPageModule], - providers: [PlatformPartnerPipe], -}) -export class WorkflowsModule {} diff --git a/src/app/workflows/workflows.routing.ts b/src/app/workflows/workflows.routing.ts index 93b6df554d..0df9786c27 100644 --- a/src/app/workflows/workflows.routing.ts +++ b/src/app/workflows/workflows.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from '../workflow/workflow.component'; import { SearchWorkflowsComponent } from './search/search.component'; @@ -32,4 +32,4 @@ const WORKFLOWS_ROUTES: Routes = [ }, ]; -export const workflowsRouting = RouterModule.forChild(WORKFLOWS_ROUTES); +export const workflowsRouting = WORKFLOWS_ROUTES; diff --git a/src/main.ts b/src/main.ts index 8a5aa7abe3..45217e203b 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,80 @@ -import { enableProdMode } from '@angular/core'; -import { platformBrowserDynamic } from '@angular/platform-browser-dynamic'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { HTTP_INTERCEPTORS, HttpClient, provideHttpClient, withInterceptorsFromDi } from '@angular/common/http'; +import { APP_INITIALIZER, enableProdMode, importProvidersFrom } from '@angular/core'; +import { FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { + MAT_LEGACY_SNACK_BAR_DEFAULT_OPTIONS as MAT_SNACK_BAR_DEFAULT_OPTIONS, + MatLegacySnackBarModule, +} from '@angular/material/legacy-snack-bar'; +import { MAT_LEGACY_TOOLTIP_DEFAULT_OPTIONS as MAT_TOOLTIP_DEFAULT_OPTIONS } from '@angular/material/legacy-tooltip'; +import { bootstrapApplication, BrowserModule, Title } from '@angular/platform-browser'; +import { provideAnimations } from '@angular/platform-browser/animations'; import { enableAkitaProdMode } from '@datorama/akita'; +import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; +import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; +import { FlexLayoutModule } from '@ngbracket/ngx-layout'; +import { AuthService, Ng2UiAuthModule } from 'ng2-ui-auth'; +import { MarkdownModule } from 'ngx-markdown'; +import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; +import { AppComponent } from './app/app.component'; -import { AppModule } from './app/app.module'; +import { getApiConfig, initializerFactory, myCustomSnackbarDefaults, myCustomTooltipDefaults } from './app/app.module'; +import { CLIENT_ROUTER_PROVIDERS, routing } from './app/app.routing'; +import { ConfigurationService } from './app/configuration.service'; +import { EmailService } from './app/container/email.service'; +import { ToolLaunchService } from './app/container/launch/tool-launch.service'; +import { ParamfilesService } from './app/container/paramfiles/paramfiles.service'; +import { RegisterToolService } from './app/container/register-tool/register-tool.service'; +import { InfoTabService as ContainerInfoTabService } from './app/container/info-tab/info-tab.service'; +import { VersionModalService as ContainerVersionModalService } from './app/container/version-modal/version-modal.service'; +import { ListContainersService } from './app/containers/list/list.service'; +import { EntryTypeMetadataService } from './app/entry/type-metadata/entry-type-metadata.service'; +import { CustomHeaderInterceptor } from './app/interceptors/custom-header.interceptor'; +import { WorkflowVersionsInterceptor } from './app/interceptors/workflow-versions.interceptor'; +import { LoginService } from './app/login/login.service'; +import { AccountsService } from './app/loginComponents/accounts/external/accounts.service'; +import { MytoolsService } from './app/mytools/mytools.service'; +import { MyWorkflowsService } from './app/myworkflows/myworkflows.service'; +import { OrganizationStargazersModule } from './app/organizations/organization/organization-stargazers/organization-stargazers.module'; +import { OrganizationStarringModule } from './app/organizations/organization/organization-starring/organization-starring.module'; +import { RegisterService } from './app/register/register.service'; +import { SearchAuthorsHtmlPipe } from './app/search/search-authors-html.pipe'; +import { SearchService } from './app/search/state/search.service'; +import { ServiceInfoService } from './app/service-info/service-info.service'; +import { AuthConfig } from './app/shared/auth.model'; +import { BioschemaService } from './app/shared/bioschema.service'; +import { ContainerService } from './app/shared/container.service'; +import { DateService } from './app/shared/date.service'; +import { EntryActionsService } from './app/shared/entry-actions/entry-actions.service'; +import { DescriptorLanguageService } from './app/shared/entry/descriptor-language.service'; +import { RegisterCheckerWorkflowService } from './app/shared/entry/register-checker-workflow/register-checker-workflow.service'; +import { ExtendedToolsService } from './app/shared/extended-tools.service'; +import { ExtendedWorkflowsService } from './app/shared/extended-workflows.service'; +import { ImageProviderService } from './app/shared/image-provider.service'; +import { ListService } from './app/shared/list.service'; +import { LogoutService } from './app/shared/logout.service'; +import { ApiModule, ApiModule as ApiModule2 } from './app/shared/openapi/api.module'; +import { GA4GHV20Service } from './app/shared/openapi/api/gA4GHV20.service'; +import { OrgLogoService } from './app/shared/org-logo.service'; +import { PagenumberService } from './app/shared/pagenumber.service'; +import { PipeModule } from './app/shared/pipe/pipe.module'; +import { ProviderService } from './app/shared/provider.service'; +import { RefreshService } from './app/shared/refresh.service'; +import { MyEntriesQuery } from './app/shared/state/my-entries.query'; +import { MyEntriesStateService } from './app/shared/state/my-entries.service'; +import { MyEntriesStore } from './app/shared/state/my-entries.store'; +import { TrackLoginService } from './app/shared/track-login.service'; +import { UrlResolverService } from './app/shared/url-resolver.service'; +import { VerifiedByService } from './app/shared/verified-by.service'; +import { StargazersModule } from './app/stargazers/stargazers.module'; +import { StarringModule } from './app/starring/starring.module'; +import { TosBannerService } from './app/tosBanner/state/tos-banner.service'; +import { InfoTabService } from './app/workflow/info-tab/info-tab.service'; +import { WorkflowLaunchService } from './app/workflow/launch/workflow-launch.service'; +import { RegisterWorkflowModalService } from './app/workflow/register-workflow-modal/register-workflow-modal.service'; +import { VersionModalService } from './app/workflow/version-modal/version-modal.service'; +import { ViewService } from './app/workflow/view/view.service'; import { environment } from './environments/environment'; if (environment.production) { @@ -10,4 +82,92 @@ if (environment.production) { enableAkitaProdMode(); } -platformBrowserDynamic().bootstrapModule(AppModule); +bootstrapApplication(AppComponent, { + providers: [ + importProvidersFrom( + environment.production ? [] : AkitaNgDevtools.forRoot(), + FontAwesomeModule, + BrowserModule, + FormsModule, + MatLegacyDialogModule, + MatLegacySnackBarModule, + Ng2UiAuthModule.forRoot(AuthConfig), + ClipboardModule, + FlexLayoutModule, + StarringModule, + OrganizationStarringModule, + OrganizationStargazersModule, + NgxMatSelectSearchModule, + routing, + StargazersModule, + MarkdownModule.forRoot(), + ReactiveFormsModule, + ApiModule.forRoot(getApiConfig), + ApiModule2.forRoot(getApiConfig), + PipeModule + ), + AccountsService, + AuthService, + BioschemaService, + CLIENT_ROUTER_PROVIDERS, + ConfigurationService, + ContainerInfoTabService, + ContainerService, + ContainerVersionModalService, + DateService, + DescriptorLanguageService, + EmailService, + EntryActionsService, + EntryTypeMetadataService, + ExtendedToolsService, + ExtendedWorkflowsService, + GA4GHV20Service, + HttpClient, + ImageProviderService, + InfoTabService, + InfoTabService, + ListContainersService, + ListService, + LoginService, + LogoutService, + MyEntriesQuery, + MyEntriesStateService, + MyEntriesStore, + MyWorkflowsService, + MytoolsService, + OrgLogoService, + PagenumberService, + ParamfilesService, + ProviderService, + RefreshService, + RegisterCheckerWorkflowService, + RegisterService, + RegisterToolService, + RegisterWorkflowModalService, + SearchAuthorsHtmlPipe, + SearchService, + ServiceInfoService, + Title, + ToolLaunchService, + TosBannerService, + TrackLoginService, + UrlResolverService, + VerifiedByService, + VersionModalService, + ViewService, + WorkflowLaunchService, + { + provide: APP_INITIALIZER, + useFactory: initializerFactory, + deps: [ConfigurationService, EntryTypeMetadataService], + multi: true, + }, + { provide: MAT_TOOLTIP_DEFAULT_OPTIONS, useValue: myCustomTooltipDefaults }, + { provide: MAT_SNACK_BAR_DEFAULT_OPTIONS, useValue: myCustomSnackbarDefaults }, + { provide: HTTP_INTERCEPTORS, useClass: WorkflowVersionsInterceptor, multi: true }, + { provide: HTTP_INTERCEPTORS, useClass: CustomHeaderInterceptor, multi: true }, + { provide: Window, useValue: window }, + provideAnimations(), + provideHttpClient(withInterceptorsFromDi()), + ], +}); From b2b4339cf55f7dac0ae066a53b78ae357eb92841 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 19 Jun 2024 10:43:36 -0400 Subject: [PATCH 51/98] Bump ws from 7.5.9 to 7.5.10 (#1980) Bumps [ws](https://github.com/websockets/ws) from 7.5.9 to 7.5.10. - [Release notes](https://github.com/websockets/ws/releases) - [Commits](https://github.com/websockets/ws/compare/7.5.9...7.5.10) --- updated-dependencies: - dependency-name: ws dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 4aa4ab14a9..65f9c9fd28 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18718,9 +18718,9 @@ "dev": true }, "node_modules/puppeteer/node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "engines": { "node": ">=8.3.0" @@ -37781,9 +37781,9 @@ "dev": true }, "ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, "requires": {} } From e221a20669591eb9b25ebc13267eab7f2a03598c Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Tue, 25 Jun 2024 11:05:46 -0700 Subject: [PATCH 52/98] point pcawg link at legacy page --- src/app/about/about.component.html | 2 +- src/app/about/about.component.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/about/about.component.html b/src/app/about/about.component.html index 6b84932254..371342c919 100644 --- a/src/app/about/about.component.html +++ b/src/app/about/about.component.html @@ -140,7 +140,7 @@

    The Importance of Sharing

    Building a Community

    Several large projects and organizations in the Biosciences, specifically cancer sequencing projects such as - PCAWG, + PCAWG, PrecisionFDA, the Broad Institute, the University of California Santa Cruz, and diff --git a/src/app/about/about.component.ts b/src/app/about/about.component.ts index 8a0753f74d..b7f216056b 100644 --- a/src/app/about/about.component.ts +++ b/src/app/about/about.component.ts @@ -58,7 +58,7 @@ export class AboutComponent implements OnInit { new Sponsor('ucsc.png', new URL('https://ucscgenomics.soe.ucsc.edu/')), new Sponsor('broad.svg', new URL('https://www.broadinstitute.org/')), new Sponsor('ga4gh.svg', new URL('https://genomicsandhealth.org/')), - new Sponsor('pcawg.png', new URL('https://dcc.icgc.org/pcawg')), + new Sponsor('pcawg.png', new URL('https://docs.icgc-argo.org/docs/data-access/icgc-25k-data')), new Sponsor('precision.png', new URL('https://precision.fda.gov/')), new Sponsor('nf-core.png', new URL('https://nf-co.re/')), ]; From 4a45133eb0f23558f44e845b4c07f26fac287aa0 Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Wed, 10 Jul 2024 16:20:47 -0400 Subject: [PATCH 53/98] Fix news content tests (#1990) --- cypress/support/commands.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cypress/support/commands.ts b/cypress/support/commands.ts index 714bd0aa78..afd66d01d2 100644 --- a/cypress/support/commands.ts +++ b/cypress/support/commands.ts @@ -262,7 +262,7 @@ export function checkFeaturedContent() { cy.get('app-featured-content').should('exist'); cy.get('.feat-content-container').within(() => { cy.get('.feat-content-card').its('length').should('be.gt', 0); - cy.get('.feat-content-card').first().contains('a').should('have.attr', 'href'); + cy.get('.feat-content-card').first().get('a').should('have.attr', 'href'); cy.get('.small-btn-structure').first().contains('View'); }); } @@ -272,7 +272,7 @@ export function checkNewsAndUpdates() { cy.get('app-news-and-updates').should('exist'); cy.get('.news-and-updates-box').within(() => { cy.get('.news-entry').its('length').should('be.gt', 0); - cy.get('.news-entry').first().contains('a').should('have.attr', 'href'); + cy.get('.news-entry').first().get('a').should('have.attr', 'href'); }); } From be7981aa91e71a529053ab185cb0cde78342bf2d Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Wed, 10 Jul 2024 16:59:53 -0400 Subject: [PATCH 54/98] Moving topic editing into a dialog to improve topics display (#1986) https://github.com/dockstore/dockstore/issues/5727 https://ucsc-cgl.atlassian.net/browse/DOCK-2483 --- cypress/e2e/group2/myworkflows.ts | 64 ++++--- cypress/e2e/group2/sharedWorkflows.ts | 3 +- cypress/e2e/group3/mytools.ts | 32 ++-- cypress/fixtures/workflowWithTopicAI.json | 156 ------------------ .../info-tab/info-tab.component.html | 86 +--------- .../container/info-tab/info-tab.component.ts | 35 +--- .../container/info-tab/info-tab.service.ts | 42 ----- .../home-logged-out/home.component.scss | 4 - .../entry-actions.service.spec.ts | 1 + .../display-topic.component.html | 37 +++++ .../display-topic.component.spec.ts | 48 ++++++ .../display-topic/display-topic.component.ts | 61 +++++++ .../edit-topic-dialog.component.html | 78 +++++++++ .../edit-topic-dialog.component.scss | 9 + .../edit-topic-dialog.component.spec.ts | 65 ++++++++ .../edit-topic/edit-topic-dialog.component.ts | 91 ++++++++++ .../edit-topic/edit-topic-dialog.service.ts | 48 ++++++ src/app/shared/state/workflow.service.ts | 10 +- .../styles/info-tab.component.scss} | 2 +- src/app/test/mocked-objects.ts | 67 +++++++- src/app/test/service-stubs.ts | 75 +++------ .../workflow/info-tab/info-tab.component.css | 16 -- .../workflow/info-tab/info-tab.component.html | 120 +------------- .../workflow/info-tab/info-tab.component.ts | 24 +-- src/app/workflow/info-tab/info-tab.service.ts | 46 ------ src/main.ts | 2 + src/styles.scss | 8 + 27 files changed, 622 insertions(+), 608 deletions(-) delete mode 100644 cypress/fixtures/workflowWithTopicAI.json create mode 100644 src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html create mode 100644 src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts create mode 100644 src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts create mode 100644 src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html create mode 100644 src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss create mode 100644 src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts create mode 100644 src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts create mode 100644 src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts rename src/app/{container/info-tab/info-tab.component.css => shared/styles/info-tab.component.scss} (96%) diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 7c41e946ec..9d97fe7953 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -180,6 +180,7 @@ describe('Dockstore my workflows', () => { cy.contains('Close').click(); }); it('Should contain the extended properties and be able to edit the info tab', () => { + cy.intercept('PUT', 'api/workflows/*').as('updateWorkflow'); // The seemingly unnecessary visits are due to a detached-from-dom error even using cy.get().click(); cy.visit('/my-workflows/github.com/A/l'); cy.contains('github.com'); @@ -191,6 +192,7 @@ describe('Dockstore my workflows', () => { const workflowPathInput = '[data-cy=workflowPathInput]'; cy.get(workflowPathInput).clear().type('/Dockstore2.cwl'); cy.contains('button', ' Save ').click(); + cy.wait('@updateWorkflow'); cy.visit('/my-workflows/github.com/A/g'); cy.contains('/Dockstore2.cwl'); // Change the file path back @@ -198,6 +200,7 @@ describe('Dockstore my workflows', () => { const dockstoreCwlPath = '/Dockstore.cwl'; cy.get(workflowPathInput).clear().type(dockstoreCwlPath); cy.contains('button', ' Save ').click(); + cy.wait('@updateWorkflow'); cy.visit('/my-workflows/github.com/A/g'); const workflowPathSpan = '[data-cy=workflowPathSpan]'; cy.get(workflowPathSpan).contains(dockstoreCwlPath); @@ -215,25 +218,55 @@ describe('Dockstore my workflows', () => { // Topic Editing const privateEntryURI = '/my-workflows/github.com/A/l'; cy.visit(privateEntryURI); + // Add an AI topic for testing + invokeSql("update workflow set topicai = 'test AI topic sentence' where id = 11"); + // Modify the manual topic, but don't save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('badTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain clear() + cy.get('[data-cy=topicInput]').type('badTopic'); cy.get('[data-cy=topicCancelButton]').click(); - cy.contains('badTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'badTopic'); + // Modify the manual topic and save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('goodTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain clear() + cy.get('[data-cy=topicInput]').type('goodTopic'); cy.get('[data-cy=topicSaveButton]').click(); - cy.contains('goodTopic').should('exist'); + cy.wait('@updateWorkflow'); + // Check that the manual topic is saved + cy.get('[data-cy=topicEditButton]').click(); + cy.get('[data-cy=topicInput]').should('have.value', 'goodTopic'); + cy.get('[data-cy=topicCancelButton]').click(); - // Check public view - cy.visit(privateEntryURI); + // Check public view. Manual topic should not be displayed because it's not the selected topic cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); - cy.contains('goodTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'goodTopic'); + // Select the manual topic and verify that it's displayed publicly cy.visit(privateEntryURI); - cy.contains('mat-radio-button', 'Manual').find('input').should('not.be.disabled').click({ force: true }); + cy.get('[data-cy=topicEditButton]').click(); + cy.get('.mat-radio-label').contains('Manual').click(); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateWorkflow'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); + // Topic selection bubble should be visible on private page + cy.get('[data-cy=topic-selection-bubble]').should('be.visible'); + // Topic selection bubble should not exist on public page + cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); + cy.get('[data-cy=topic-selection-bubble]').should('not.exist'); + + // Select the AI topic and verify that it's displayed publicly with an AI bubble cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); + cy.get('.mat-radio-label').contains('AI').click(); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateWorkflow'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); + cy.get('[data-cy=ai-bubble]').should('be.visible'); + // AI bubble should be displayed on public page too cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); + cy.get('[data-cy=ai-bubble]').should('be.visible'); }); it('should have mode tooltip', () => { cy.visit('/my-workflows/github.com/A/g'); @@ -639,19 +672,6 @@ describe('Version Dropdown should have search capabilities', () => { cy.get('mat-option').should('not.contain', 'master'); cy.get('mat-option').should('contain', 'test').should('be.visible'); }); - it('Test AI topic sentences', () => { - cy.fixture('workflowWithTopicAI.json').then((json) => { - cy.intercept('GET', '/api/workflows/11*', { - body: json, - statusCode: 200, - }).as('request'); - }); - - cy.visit('/my-workflows'); - cy.get('[data-cy=topic-ai-selection-button]').should('be.visible'); - cy.get('[data-cy=topicAI-text]').should('contain.text', 'test AI topic sentence'); - cy.get('[data-cy=ai-bubble]').should('be.visible'); - }); }); describe('Should handle no workflows correctly', () => { resetDB(); diff --git a/cypress/e2e/group2/sharedWorkflows.ts b/cypress/e2e/group2/sharedWorkflows.ts index b84acdf2d4..ced9dc0fec 100644 --- a/cypress/e2e/group2/sharedWorkflows.ts +++ b/cypress/e2e/group2/sharedWorkflows.ts @@ -21,7 +21,7 @@ import { resetDB, setTokenUserViewPort, } from '../../support/commands'; - +import { workflowEntryTypeMetadata } from '../../../src/app/test/mocked-objects'; import { BioWorkflow } from '../../../src/app/shared/openapi/model/bioWorkflow'; describe('Shared with me workflow test from my-workflows', () => { resetDB(); @@ -82,6 +82,7 @@ describe('Shared with me workflow test from my-workflows', () => { description: undefined, descriptorType: 'WDL', email: undefined, + entryTypeMetadata: workflowEntryTypeMetadata, full_workflow_path: 'dockstore.org/user_B/' + name, gitUrl: '', has_checker: false, diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 1924298e66..0122732223 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -79,6 +79,7 @@ describe('Dockstore my tools', () => { it('visit another page then come back', () => { // The seemingly unnecessary visits are due to a detached-from-dom error even using cy.get().click(); cy.intercept('api/containers/*?include=validations').as('getTool'); + cy.intercept('PUT', 'api/containers/*').as('updateTool'); cy.visit('/my-tools'); cy.wait('@getTool'); selectUnpublishedTab('A2'); @@ -96,6 +97,7 @@ describe('Dockstore my tools', () => { cy.contains('button', ' Edit ').click(); cy.get('input').first().should('be.visible').clear().type('/thing/Dockerfile'); cy.contains('button', ' Save ').click(); + cy.wait('@updateTool'); cy.visit('/my-tools/quay.io/A2/b1'); cy.contains('/thing/Dockerfile'); // Change the dockerfile path back @@ -105,28 +107,38 @@ describe('Dockstore my tools', () => { cy.visit('/my-tools/quay.io/A2/b1'); cy.contains('/Dockerfile'); - // // Topic Editing + // Topic Editing let privateEntryURI = '/my-tools/github.com/A2/a'; cy.visit(privateEntryURI); + // Modify the manual topic, but don't save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('badTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain commands after clear() + cy.get('[data-cy=topicInput]').type('badTopic'); cy.get('[data-cy=topicCancelButton]').click(); - cy.contains('badTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'badTopic'); + // Modify the manual topic and save it cy.get('[data-cy=topicEditButton]').click(); - cy.get('[data-cy=topicInput]').clear().type('goodTopic'); + cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain commands after clear() + cy.get('[data-cy=topicInput]').type('goodTopic'); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateTool'); + // Check that the manual topic is saved cy.get('[data-cy=topicEditButton]').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=topicInput]').should('have.value', 'goodTopic'); + cy.get('[data-cy=topicCancelButton]').click(); - // Check public view - cy.visit(privateEntryURI); + // Check public view. Manual topic should not be displayed because it's not the selected topic cy.get('[data-cy=viewPublicToolButton]').should('be.visible').click(); - cy.contains('goodTopic').should('not.exist'); + cy.get('[data-cy=selected-topic]').should('not.contain.text', 'goodTopic'); + // Select the manual topic and verify that it's displayed publicly cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); cy.get('.mat-radio-label').contains('Manual').click(); - cy.visit(privateEntryURI); + cy.get('[data-cy=topicSaveButton]').click(); + cy.wait('@updateTool'); cy.get('[data-cy=viewPublicToolButton]').should('be.visible').click(); - cy.contains('goodTopic').should('exist'); + cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); }); it('should be able to add labels', () => { cy.contains('quay.io/A2/a:latest'); diff --git a/cypress/fixtures/workflowWithTopicAI.json b/cypress/fixtures/workflowWithTopicAI.json deleted file mode 100644 index 7023a81b02..0000000000 --- a/cypress/fixtures/workflowWithTopicAI.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "type": "BioWorkflow", - "descriptorType": "CWL", - "aliases": {}, - "author": null, - "checker_id": null, - "conceptDoi": null, - "dbCreateDate": 1465419996000, - "dbUpdateDate": 1465419996000, - "defaultTestParameterFilePath": "/test.json", - "defaultVersion": null, - "description": null, - "descriptorTypeSubclass": "NOT_APPLICABLE", - "email": null, - "full_workflow_path": "github.com/A/l", - "gitUrl": "git@github.com:A/l.git", - "has_checker": false, - "id": 11, - "input_file_formats": [], - "isChecker": false, - "is_published": true, - "labels": [], - "lastUpdated": 1480374057688, - "last_modified": null, - "last_modified_date": null, - "mode": "FULL", - "organization": "A", - "output_file_formats": [], - "parent_id": null, - "path": "github.com/A/l", - "repository": "l", - "sourceControl": "github.com", - "source_control_provider": "GITHUB", - "starredUsers": [], - "topicId": 1234, - "topicAutomatic": null, - "topicManual": null, - "topicAI": "test AI topic sentence", - "topicSelection": "AI", - "users": [ - { - "avatarUrl": null, - "curator": true, - "id": 1, - "isAdmin": true, - "name": "user_A", - "orcid": null, - "privacyPolicyVersion": "PRIVACY_POLICY_VERSION_2_5", - "privacyPolicyVersionAcceptanceDate": null, - "setupComplete": false, - "tosacceptanceDate": null, - "tosversion": "TOS_VERSION_1", - "userProfiles": null, - "username": "user_A" - } - ], - "workflowName": null, - "workflowVersions": [ - { - "aliases": null, - "author": null, - "commitID": null, - "dbUpdateDate": 1480374119003, - "description": null, - "descriptionSource": null, - "dirtyBit": false, - "doiStatus": "NOT_REQUESTED", - "doiURL": null, - "email": null, - "frozen": false, - "hidden": false, - "id": 13, - "images": null, - "input_file_formats": [], - "last_modified": 1480374117003, - "legacyVersion": true, - "name": "master", - "output_file_formats": [], - "reference": "master", - "referenceType": "UNSET", - "sourceFiles": [ - { - "absolutePath": "/1st-workflow.cwl", - "checksums": null, - "content": "cwlVersion: v1.0\nclass: Workflow\ninputs:\n inp: File\n ex: string\n\noutputs:\n classout:\n type: File\n outputSource: compile/classfile\n\nsteps:\n untar:\n run: tar-param.cwl\n in:\n tarfile: inp\n extractfile: ex\n out: [example_out]\n\n compile:\n run: arguments.cwl\n in:\n src: untar/example_out\n out: [classfile]\n\n wrkflow:\n run: grep-and-count.cwl\n in:\n infiles: inp\n pattern: \"hello\"\n out: [outfile]\n", - "frozen": false, - "id": 28, - "path": "/1st-workflow.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - }, - { - "absolutePath": "/arguments.cwl", - "checksums": null, - "content": "cwlVersion: v1.0\nclass: CommandLineTool\nlabel: Example trivial wrapper for Java 7 compiler\nbaseCommand: javac\nhints:\n - DockerRequirement:\n dockerPull: java:7\nbaseCommand: javac\narguments: [\"-d\", $(runtime.outdir)]\ninputs:\n src:\n type: File\n inputBinding:\n position: 1\noutputs:\n classfile:\n type: File\n outputBinding:\nglob: \"*.class\"\n", - "frozen": false, - "id": 31, - "path": "arguments.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - }, - { - "absolutePath": "/grep-and-count.cwl", - "checksums": null, - "content": "class: Workflow\ncwlVersion: v1.0\n\nrequirements:\n - class: ScatterFeatureRequirement\n - class: DockerRequirement\n dockerPull: java:7\n\ninputs:\n pattern: string\n infiles: File[]\n\noutputs:\n outfile:\n type: File\n outputSource: wc/outfile\n\nsteps:\n grep:\n run: grep.cwl\n in:\n pattern: pattern\n infile: infiles\n scatter: infile\n out: [outfile]\n\n wc:\n run: wc.cwl\n in:\n infiles: grep/outfile\nout: [outfile]\n", - "frozen": false, - "id": 27, - "path": "grep-and-count.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - }, - { - "absolutePath": "/grep.cwl", - "checksums": null, - "content": "#!/usr/bin/env cwl-runner\nclass: CommandLineTool\ncwlVersion: v1.0\n\ninputs:\n pattern:\n type: string\n inputBinding: {position: 0}\n infile:\n type: File\n inputBinding: {position: 1}\n\noutputs:\n outfile:\n type: stdout\n\nbaseCommand: grep\n", - "frozen": false, - "id": 29, - "path": "grep.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - }, - { - "absolutePath": "/tar-param.cwl", - "checksums": null, - "content": "cwlVersion: v1.0\nclass: CommandLineTool\nbaseCommand: [tar, xf]\ninputs:\n tarfile:\n type: File\n inputBinding:\n position: 1\n extractfile:\n type: string\n inputBinding:\n position: 2\noutputs:\n example_out:\n type: File\n outputBinding:\nglob: $(inputs.extractfile)\n", - "frozen": false, - "id": 32, - "path": "tar-param.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - }, - { - "absolutePath": "/wc.cwl", - "checksums": null, - "content": "#!/usr/bin/env cwl-runner\nclass: CommandLineTool\ncwlVersion: v1.0\n\ninputs:\n infiles:\n type: File[]\n inputBinding: {position: 1}\n\noutputs:\n outfile:\n type: stdout\n\nbaseCommand: [wc, -l]\n", - "frozen": false, - "id": 30, - "path": "wc.cwl", - "type": "DOCKSTORE_CWL", - "verifiedBySource": {} - } - ], - "subClass": null, - "userIdToOrcidPutCode": {}, - "valid": true, - "validations": null, - "verified": false, - "verifiedSource": null, - "verifiedSources": [], - "versionEditor": null, - "workflow_path": "/1st-workflow.cwl", - "workingDirectory": "" - } - ], - "workflow_path": "/1st-workflow.cwl" -} diff --git a/src/app/container/info-tab/info-tab.component.html b/src/app/container/info-tab/info-tab.component.html index 760c14c7a9..a595e3d0d7 100644 --- a/src/app/container/info-tab/info-tab.component.html +++ b/src/app/container/info-tab/info-tab.component.html @@ -264,91 +264,9 @@ - -

  • - Topic - {{ tool?.topicAutomatic }} - {{ tool?.topicManual }} - - {{ tool?.topicAI }} - - +
  • +
  • - - -
  • - Topic Automatic - {{ tool?.topicAutomatic }} -
  • -
  • - AI Generated Topic - {{ tool?.topicAI }} - -
  • - -
  • -
    - Topic - {{ tool?.topicManual || 'n/a' }} - - - - - -
    -
  • -
  • -
    - Topic Selection - - - Automatic - Manual - AI Generated - - -
    -
  • -
    = []; public displayedColumns: string[] = ['name', 'role', 'affiliation', 'email']; @@ -156,7 +157,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { this.infoTabService.wdlPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlPathEditing = editing)); this.infoTabService.cwlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.cwlTestPathEditing = editing)); this.infoTabService.wdlTestPathEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.wdlTestPathEditing = editing)); - this.infoTabService.topicEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((topicEditing) => (this.topicEditing = topicEditing)); this.sessionQuery.isPublic$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((publicPage) => (this.isPublic = publicPage)); } @@ -168,25 +168,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { }); } - toggleEditTopic() { - if (this.topicEditing) { - this.infoTabService.saveTopic(this.tool, this.revertTopic.bind(this)); - } - this.infoTabService.setTopicEditing(!this.topicEditing); - } - - revertTopic() { - this.tool.topicManual = this.extendedDockstoreTool.topicManual; - } - - revertTopicSelection() { - this.tool.topicSelection = this.extendedDockstoreTool.topicSelection; - } - - topicSelectionChange() { - this.infoTabService.saveTopicSelection(this.tool, this.revertTopicSelection.bind(this)); - } - toggleEditDockerFile() { if (this.dockerFileEditing) { this.infoTabService.updateAndRefresh(this.tool); @@ -222,14 +203,7 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { } somethingIsBeingEdited(): boolean { - return ( - this.dockerFileEditing || - this.cwlPathEditing || - this.wdlPathEditing || - this.cwlTestPathEditing || - this.wdlTestPathEditing || - this.topicEditing - ); + return this.dockerFileEditing || this.cwlPathEditing || this.wdlPathEditing || this.cwlTestPathEditing || this.wdlTestPathEditing; } /** @@ -239,7 +213,6 @@ export class InfoTabComponent extends Base implements OnInit, OnChanges { */ cancelEditing(): void { this.infoTabService.cancelEditing(); - this.revertTopic(); } /** diff --git a/src/app/container/info-tab/info-tab.service.ts b/src/app/container/info-tab/info-tab.service.ts index 7673ea7540..10c9372d35 100644 --- a/src/app/container/info-tab/info-tab.service.ts +++ b/src/app/container/info-tab/info-tab.service.ts @@ -31,7 +31,6 @@ export class InfoTabService extends Base { public wdlPathEditing$: BehaviorSubject = new BehaviorSubject(false); public cwlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false); public wdlTestPathEditing$: BehaviorSubject = new BehaviorSubject(false); - public topicEditing$: BehaviorSubject = new BehaviorSubject(false); /** * The original tool that should be in sync with the database @@ -86,46 +85,6 @@ export class InfoTabService extends Base { this.wdlTestPathEditing$.next(editing); } - setTopicEditing(editing: boolean) { - this.topicEditing$.next(editing); - } - - saveTopic(tool: DockstoreTool, errorCallback: () => void) { - this.alertService.start('Updating topic'); - const partialTool = this.getPartialToolForUpdate(tool); - this.containersService.updateContainer(this.tool.id, partialTool).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopic = response.topicManual; - this.containerService.updateActiveTopic(newTopic); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - - /** - * Warning, this could potentially update a few other properties - * @param entry - */ - saveTopicSelection(entry: DockstoreTool, errorCallback: () => void) { - this.alertService.start('Updating topic selection'); - const partialEntryForUpdate = this.getPartialToolForUpdate(entry); - this.containersService.updateContainer(this.originalTool.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - this.containerService.updateActiveTopicSelection(newTopicSelection); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - updateAndRefresh(tool: ExtendedDockstoreTool) { const message = 'Tool Info'; const partialTool = this.getPartialToolForUpdate(tool); @@ -198,7 +157,6 @@ export class InfoTabService extends Base { this.wdlPathEditing$.next(false); this.wdlTestPathEditing$.next(false); this.cwlTestPathEditing$.next(false); - this.topicEditing$.next(false); this.restoreTool(); } diff --git a/src/app/home-page/home-logged-out/home.component.scss b/src/app/home-page/home-logged-out/home.component.scss index a82ee0ad70..33610751ee 100644 --- a/src/app/home-page/home-logged-out/home.component.scss +++ b/src/app/home-page/home-logged-out/home.component.scss @@ -115,10 +115,6 @@ h3 { border-radius: 1rem; } -.primary-3 { - color: mat.get-color-from-palette($dockstore-app-primary, 3); -} - .warn-1 { color: mat.get-color-from-palette($dockstore-app-error, darker); } diff --git a/src/app/shared/entry-actions/entry-actions.service.spec.ts b/src/app/shared/entry-actions/entry-actions.service.spec.ts index a56dfd7878..e54824bf53 100644 --- a/src/app/shared/entry-actions/entry-actions.service.spec.ts +++ b/src/app/shared/entry-actions/entry-actions.service.spec.ts @@ -49,6 +49,7 @@ describe('Service: EntryActionsService', () => { expect(service).toBeTruthy(); })); it('should know if entry is hosted', inject([EntryActionsService], (service: EntryActionsService) => { + expect(DockstoreTool.ModeEnum.HOSTED).toBe(Workflow.ModeEnum.HOSTED); // Both values should be the same expect(service.isEntryHosted(null)).toBeTruthy(); const dockstoreTool = {}; dockstoreTool.mode = DockstoreTool.ModeEnum.HOSTED; diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html new file mode 100644 index 0000000000..e071a83a00 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html @@ -0,0 +1,37 @@ +
    +
    + Topic: + {{ selectedTopic || 'n/a' }} + + + + {{ entry.topicSelection === TopicSelectionEnum.MANUAL ? 'edit' : 'sync' }} + {{ entry.topicSelection | titlecase }} + +
    + +
    diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts new file mode 100644 index 0000000000..2d4bfe6f39 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.spec.ts @@ -0,0 +1,48 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { DisplayTopicComponent } from './display-topic.component'; +import { EntryTypeMetadataStubService } from 'app/test/service-stubs'; +import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { sampleWorkflow1 } from 'app/test/mocked-objects'; + +describe('DisplayTopicComponent', () => { + let component: DisplayTopicComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + providers: [{ provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }], + imports: [MatLegacyDialogModule, DisplayTopicComponent], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(DisplayTopicComponent); + component = fixture.componentInstance; + component.entry = sampleWorkflow1; + component.disableEditing = false; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts new file mode 100644 index 0000000000..afe061932e --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.ts @@ -0,0 +1,61 @@ +import { AsyncPipe, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, Input, OnDestroy, OnInit } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyDialog } from '@angular/material/legacy-dialog'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { Base } from 'app/shared/base'; +import { DockstoreTool, Entry, EntryTypeMetadata, Workflow } from 'app/shared/openapi'; +import { SessionQuery } from 'app/shared/session/session.query'; +import { Observable } from 'rxjs'; +import { EditTopicDialogComponent } from '../edit-topic/edit-topic-dialog.component'; +import { bootstrap4largeModalSize } from 'app/shared/constants'; +import { AiBubbleComponent } from 'app/shared/ai-bubble/ai-bubble.component'; +import { FlexModule } from '@ngbracket/ngx-layout'; + +@Component({ + selector: 'app-display-topic', + templateUrl: './display-topic.component.html', + styleUrls: ['../../../styles/info-tab.component.scss'], + standalone: true, + imports: [NgIf, MatLegacyTooltipModule, MatLegacyButtonModule, MatIconModule, AsyncPipe, AiBubbleComponent, FlexModule, TitleCasePipe], +}) +export class DisplayTopicComponent extends Base implements OnInit, OnDestroy { + TopicSelectionEnum = Entry.TopicSelectionEnum; + isPublic$: Observable; + isGitHubAppEntry: boolean; + entryTypeMetadata: EntryTypeMetadata; + selectedTopic: string; + @Input() entry: DockstoreTool | Workflow; + @Input() disableEditing: boolean; + constructor(private sessionQuery: SessionQuery, private dialog: MatLegacyDialog) { + super(); + } + + ngOnInit(): void { + this.isPublic$ = this.sessionQuery.isPublic$; + this.entryTypeMetadata = this.entry.entryTypeMetadata; + this.isGitHubAppEntry = (this.entry as Workflow).mode === Workflow.ModeEnum.DOCKSTOREYML; // Only Workflow has DOCKSTOREYML ModeEnum + } + + ngOnChanges(): void { + this.selectedTopic = this.getSelectedTopic(); + } + + editTopic() { + this.dialog.open(EditTopicDialogComponent, { width: bootstrap4largeModalSize, data: { entry: this.entry } }); + } + + private getSelectedTopic(): string | null { + switch (this.entry.topicSelection) { + case this.TopicSelectionEnum.MANUAL: + return this.entry.topicManual; + case this.TopicSelectionEnum.AUTOMATIC: + return this.entry.topicAutomatic; + case this.TopicSelectionEnum.AI: + return this.entry.topicAI; + default: + return null; + } + } +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html new file mode 100644 index 0000000000..141fccc903 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html @@ -0,0 +1,78 @@ +

    Select a Topic

    + +

    + A topic is a short description of your {{ entryTypeMetadata.term }}. There are {{ isHostedEntry ? 'two' : 'three' }} types of topics + that you can choose from: +

    +
    + + + +
    + edit + Manual +
    +
    + Entered manually by the user{{ isGitHubAppEntry ? ' in the .dockstore.yml file on GitHub' : '' }}. +
    +
    + {{ entry.topicManual || 'Not Available' }} +
    + + + +
    +
    + + +
    + sync + Automatic +
    +
    Retrieved automatically from the GitHub repository description.
    +
    + {{ entry.topicAutomatic || 'Not Available' }} +
    +
    +
    + + +
    + AI generation icon + AI +
    +
    Generated by AI using the content of your {{ entryTypeMetadata.term }}.
    +
    {{ entry.topicAI || 'Not Available' }}
    +
    +
    +
    +
    +
    +
    + + +
    diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss new file mode 100644 index 0000000000..7a9b2dbddd --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss @@ -0,0 +1,9 @@ +// This style ensures that the mat radio content text fills up the whole mat-card +:host ::ng-deep .mat-radio-label-content { + width: 100%; +} + +// Wraps the text because by default, mat-radio-label doesn't wrap +:host ::ng-deep .mat-radio-label { + white-space: normal; +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts new file mode 100644 index 0000000000..ad5efac85e --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts @@ -0,0 +1,65 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; + +import { EditTopicDialogStubService, EntryActionsStubService, EntryTypeMetadataStubService } from 'app/test/service-stubs'; +import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogModule, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; +import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; +import { sampleWorkflow1 } from 'app/test/mocked-objects'; +import { EditTopicDialogComponent } from './edit-topic-dialog.component'; +import { EditTopicDialogService } from './edit-topic-dialog.service'; +import { NO_ERRORS_SCHEMA } from '@angular/core'; +import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; +import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; + +describe('EditTopicDialogComponent', () => { + let component: EditTopicDialogComponent; + let fixture: ComponentFixture; + + beforeEach( + waitForAsync(() => { + TestBed.configureTestingModule({ + schemas: [NO_ERRORS_SCHEMA], + providers: [ + { provide: EntryTypeMetadataService, useClass: EntryTypeMetadataStubService }, + { provide: EditTopicDialogService, useClass: EditTopicDialogStubService }, + { provide: EntryActionsService, useClass: EntryActionsStubService }, + { + provide: MatLegacyDialogRef, + useValue: { + close: (dialogResult: any) => {}, + }, + }, + { + provide: MAT_LEGACY_DIALOG_DATA, + useValue: { entry: sampleWorkflow1 }, + }, + ], + imports: [EditTopicDialogComponent, BrowserAnimationsModule], + }).compileComponents(); + }) + ); + + beforeEach(() => { + fixture = TestBed.createComponent(EditTopicDialogComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts new file mode 100644 index 0000000000..613585065b --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts @@ -0,0 +1,91 @@ +/* + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Component, Inject } from '@angular/core'; +import { MatLegacyDialogRef, MatLegacyDialogModule, MAT_LEGACY_DIALOG_DATA } from '@angular/material/legacy-dialog'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { FlexModule } from '@ngbracket/ngx-layout/flex'; +import { MatLegacyInputModule } from '@angular/material/legacy-input'; +import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; +import { NgIf } from '@angular/common'; +import { MatDividerModule } from '@angular/material/divider'; +import { AlertComponent } from 'app/shared/alert/alert.component'; +import { DockstoreTool, Entry, EntryType, EntryTypeMetadata, Workflow } from 'app/shared/openapi'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { AiBubbleComponent } from 'app/shared/ai-bubble/ai-bubble.component'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { EditTopicDialogService } from './edit-topic-dialog.service'; +import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; + +export interface EditTopicDialogData { + entry: DockstoreTool | Workflow; +} + +@Component({ + selector: 'app-edit-topic-dialog', + templateUrl: './edit-topic-dialog.component.html', + styleUrls: ['./edit-topic-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + AlertComponent, + MatDividerModule, + NgIf, + MatLegacyFormFieldModule, + MatLegacyInputModule, + FlexModule, + MatLegacyButtonModule, + MatLegacyTooltipModule, + AiBubbleComponent, + FormsModule, + MatLegacyRadioModule, + MatIconModule, + MatLegacyCardModule, + ], +}) +export class EditTopicDialogComponent { + TopicSelectionEnum = Entry.TopicSelectionEnum; + entry: Workflow | DockstoreTool; + entryType: EntryType; + entryTypeMetadata: EntryTypeMetadata; + isGitHubAppEntry: boolean; + isHostedEntry: boolean; + topicEditing: boolean; + selectedOption: Entry.TopicSelectionEnum; + editedTopicManual: string; + + constructor( + public dialogRef: MatLegacyDialogRef, + public editTopicDialogService: EditTopicDialogService, + public entryActionsService: EntryActionsService, + @Inject(MAT_LEGACY_DIALOG_DATA) public data: EditTopicDialogData + ) { + this.entry = data.entry; + this.entryType = data.entry.entryType; + this.entryTypeMetadata = data.entry.entryTypeMetadata; + this.isGitHubAppEntry = (data.entry as Workflow).mode === Workflow.ModeEnum.DOCKSTOREYML; // Only Workflow has DOCKSTOREYML ModeEnum + this.isHostedEntry = this.entryActionsService.isEntryHosted(data.entry); + this.selectedOption = data.entry.topicSelection; + this.editedTopicManual = data.entry.topicManual; + } + + saveTopic() { + this.editTopicDialogService.saveTopicChanges(this.entry, this.editedTopicManual, this.selectedOption); + } +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts new file mode 100644 index 0000000000..59fd114250 --- /dev/null +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts @@ -0,0 +1,48 @@ +import { Injectable } from '@angular/core'; +import { AlertService } from '../../../alert/state/alert.service'; +import { ContainersService, DockstoreTool, EntryType, Workflow, WorkflowsService } from '../../../openapi'; +import { WorkflowService } from '../../../state/workflow.service'; +import { ContainerService } from '../../../container.service'; + +@Injectable() +export class EditTopicDialogService { + constructor( + private alertService: AlertService, + private workflowsService: WorkflowsService, + private workflowService: WorkflowService, + private containersService: ContainersService, + private containerService: ContainerService + ) {} + + saveTopicChanges(entry: Workflow | DockstoreTool, topicManual: string, topicSelection: Workflow.TopicSelectionEnum) { + this.alertService.start('Saving topic changes'); + const newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection }; + + if (entry.entryType === EntryType.TOOL) { + this.containersService.updateContainer(entry.id, newEntryForUpdate as DockstoreTool).subscribe( + (response) => { + this.alertService.detailedSuccess(); + const newTopicSelection = response.topicSelection; + this.containerService.updateActiveTopicSelection(newTopicSelection); + const newTopic = response.topicManual; + this.containerService.updateActiveTopic(newTopic); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } else { + this.workflowsService.updateWorkflow(entry.id, newEntryForUpdate as Workflow).subscribe( + (response) => { + this.alertService.detailedSuccess(); + const newTopicSelection = response.topicSelection; + const newTopic = response.topicManual; + this.workflowService.updateActiveTopicManualAndTopicSelection(newTopic, newTopicSelection); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } + } +} diff --git a/src/app/shared/state/workflow.service.ts b/src/app/shared/state/workflow.service.ts index 828710f68b..f9067a3a27 100644 --- a/src/app/shared/state/workflow.service.ts +++ b/src/app/shared/state/workflow.service.ts @@ -53,14 +53,8 @@ export class WorkflowService { } } - updateActiveTopic(topic: string) { - const newWorkflow = { ...this.workflowQuery.getActive(), topicManual: topic }; - this.workflowStore.upsert(newWorkflow.id, newWorkflow); - this.extendedWorkflowService.update(newWorkflow); - } - - updateActiveTopicSelection(topicSelection: Workflow.TopicSelectionEnum) { - const newWorkflow = { ...this.workflowQuery.getActive(), topicSelection: topicSelection }; + updateActiveTopicManualAndTopicSelection(topicManual: string, topicSelection: Workflow.TopicSelectionEnum) { + const newWorkflow = { ...this.workflowQuery.getActive(), topicManual: topicManual, topicSelection: topicSelection }; this.workflowStore.upsert(newWorkflow.id, newWorkflow); this.extendedWorkflowService.update(newWorkflow); } diff --git a/src/app/container/info-tab/info-tab.component.css b/src/app/shared/styles/info-tab.component.scss similarity index 96% rename from src/app/container/info-tab/info-tab.component.css rename to src/app/shared/styles/info-tab.component.scss index b5351685e0..874ec6db35 100644 --- a/src/app/container/info-tab/info-tab.component.css +++ b/src/app/shared/styles/info-tab.component.scss @@ -1,5 +1,5 @@ /* - * Copyright 2017 OICR + * Copyright 2024 OICR and UCSC * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. diff --git a/src/app/test/mocked-objects.ts b/src/app/test/mocked-objects.ts index 9fb8b42348..992c7fac6b 100644 --- a/src/app/test/mocked-objects.ts +++ b/src/app/test/mocked-objects.ts @@ -18,7 +18,7 @@ import { OrgToolObject } from '../mytools/my-tool/my-tool.component'; import { Hit } from '../search/state/search.service'; import { ExtendedDockstoreTool } from '../shared/models/ExtendedDockstoreTool'; import { ExtendedWorkflow } from '../shared/models/ExtendedWorkflow'; -import { VersionVerifiedPlatform, Tag, WorkflowVersion, Author } from '../shared/openapi'; +import { VersionVerifiedPlatform, Tag, WorkflowVersion, Author, EntryTypeMetadata } from '../shared/openapi'; import { Notification } from '../shared/openapi/model/notification'; import { DockstoreTool } from './../shared/openapi/model/dockstoreTool'; import { SourceFile } from './../shared/openapi/model/sourceFile'; @@ -27,6 +27,61 @@ import { Workflow } from './../shared/openapi/model/workflow'; const DescriptorTypeEnum = Workflow.DescriptorTypeEnum; +export const toolEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'tools', + searchSupported: true, + sitePath: 'containers', + term: 'tool', + termPlural: 'tools', + trsPrefix: '', + trsSupported: true, + type: 'TOOL', +}; + +export const workflowEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'workflows', + searchSupported: true, + sitePath: 'workflows', + term: 'workflow', + termPlural: 'workflows', + trsPrefix: '#workflow/', + trsSupported: true, + type: 'WORKFLOW', +}; + +export const serviceEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: '', + searchSupported: false, + sitePath: 'services', + term: 'service', + termPlural: 'services', + trsPrefix: '#service/', + trsSupported: true, + type: 'SERVICE', +}; + +export const appToolEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: 'tools', + searchSupported: true, + sitePath: 'containers', + term: 'tool', + termPlural: 'tools', + trsPrefix: '', + trsSupported: true, + type: 'APPTOOL', +}; + +export const notebookEntryTypeMetadata: EntryTypeMetadata = { + searchEntryType: '', + searchSupported: false, + sitePath: 'notebooks', + term: 'notebook', + termPlural: 'notebooks', + trsPrefix: '#notebook/', + trsSupported: true, + type: 'NOTEBOOK', +}; + export const updatedWorkflow: Workflow = { type: '', descriptorType: DescriptorTypeEnum.CWL, @@ -40,6 +95,7 @@ export const updatedWorkflow: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow1: Workflow = { @@ -56,6 +112,7 @@ export const sampleWorkflow1: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow2: Workflow = { @@ -72,6 +129,7 @@ export const sampleWorkflow2: Workflow = { sourceControl: 'github.com', source_control_provider: 'GITHUB', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflow3: Workflow = { @@ -89,6 +147,7 @@ export const sampleWorkflow3: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/sampleWorkflowPath', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWdlWorkflow1: Workflow = { @@ -106,6 +165,7 @@ export const sampleWdlWorkflow1: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/DataBiosphere/topmed-workflows/Functional_Equivalence', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleCwlExtendedWorkflow: ExtendedWorkflow = { @@ -123,6 +183,7 @@ export const sampleCwlExtendedWorkflow: ExtendedWorkflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/dockstore-testing/md5sum-checker', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWdlWorkflow2: Workflow = { @@ -140,6 +201,7 @@ export const sampleWdlWorkflow2: Workflow = { source_control_provider: 'GITHUB', full_workflow_path: 'github.com/DataBiosphere/topmed-workflows/UM_aligner_wdl', descriptorTypeSubclass: 'n/a', + entryTypeMetadata: workflowEntryTypeMetadata, }; export const sampleWorkflowVersion: WorkflowVersion = { @@ -179,6 +241,7 @@ export const sampleTool1: DockstoreTool = { defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', tool_path: '', + entryTypeMetadata: toolEntryTypeMetadata, }; export const sampleTool2: DockstoreTool = { @@ -196,6 +259,7 @@ export const sampleTool2: DockstoreTool = { toolname: 'sampleToolname', defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', + entryTypeMetadata: toolEntryTypeMetadata, }; export const sampleTool3: DockstoreTool = { @@ -213,6 +277,7 @@ export const sampleTool3: DockstoreTool = { toolname: 'sampleToolname', defaultCWLTestParameterFile: 'sampleDefaultCWLTestParameterFile', defaultWDLTestParameterFile: 'sampleDefaultWDLTestParameterFile', + entryTypeMetadata: toolEntryTypeMetadata, }; // Case 1: sampleTool1 in published entries, unpublished doesn't matter diff --git a/src/app/test/service-stubs.ts b/src/app/test/service-stubs.ts index fe735af383..c2e4e26f66 100644 --- a/src/app/test/service-stubs.ts +++ b/src/app/test/service-stubs.ts @@ -38,7 +38,20 @@ import { TokenUser } from './../shared/openapi/model/tokenUser'; import { User } from './../shared/openapi/model/user'; import { Workflow } from './../shared/openapi/model/workflow'; import { WorkflowVersion } from './../shared/openapi/model/workflowVersion'; -import { bitbucketToken, gitHubToken, gitLabToken, quayToken, sampleTag, sampleWorkflow1, updatedWorkflow } from './mocked-objects'; +import { + appToolEntryTypeMetadata, + bitbucketToken, + gitHubToken, + gitLabToken, + notebookEntryTypeMetadata, + quayToken, + sampleTag, + sampleWorkflow1, + serviceEntryTypeMetadata, + toolEntryTypeMetadata, + updatedWorkflow, + workflowEntryTypeMetadata, +} from './mocked-objects'; import RoleEnum = Permission.RoleEnum; import DescriptorTypeEnum = Workflow.DescriptorTypeEnum; @@ -935,64 +948,19 @@ export class EntryTypeMetadataStubService { get(type: newEntryType): EntryTypeMetadata { switch (type) { case newEntryType.WORKFLOW: { - return { - searchEntryType: 'workflows', - searchSupported: true, - sitePath: 'workflows', - term: 'workflow', - termPlural: 'workflows', - trsPrefix: '#workflow/', - trsSupported: true, - type: 'WORKFLOW', - }; + return workflowEntryTypeMetadata; } case newEntryType.TOOL: { - return { - searchEntryType: 'tools', - searchSupported: true, - sitePath: 'containers', - term: 'tool', - termPlural: 'tools', - trsPrefix: '', - trsSupported: true, - type: 'TOOL', - }; + return toolEntryTypeMetadata; } case newEntryType.SERVICE: { - return { - searchEntryType: '', - searchSupported: false, - sitePath: 'services', - term: 'service', - termPlural: 'services', - trsPrefix: '#service/', - trsSupported: true, - type: 'SERVICE', - }; + return serviceEntryTypeMetadata; } case newEntryType.APPTOOL: { - return { - searchEntryType: 'tools', - searchSupported: true, - sitePath: 'containers', - term: 'tool', - termPlural: 'tools', - trsPrefix: '', - trsSupported: true, - type: 'APPTOOL', - }; + return appToolEntryTypeMetadata; } case newEntryType.NOTEBOOK: { - return { - searchEntryType: '', - searchSupported: false, - sitePath: 'notebooks', - term: 'notebook', - termPlural: 'notebooks', - trsPrefix: '#notebook/', - trsSupported: true, - type: 'NOTEBOOK', - }; + return notebookEntryTypeMetadata; } } return null; @@ -1010,4 +978,9 @@ export class MarkdownWrapperStubService { export class EntryActionsStubService { updateBackingEntry(entry) {} + isEntryHosted(entry) {} +} + +export class EditTopicDialogStubService { + saveTopicChanges(entry: Workflow | DockstoreTool, topicManual: string, topicSelection: Workflow.TopicSelectionEnum) {} } diff --git a/src/app/workflow/info-tab/info-tab.component.css b/src/app/workflow/info-tab/info-tab.component.css index efe631b0b2..71b2c025d5 100644 --- a/src/app/workflow/info-tab/info-tab.component.css +++ b/src/app/workflow/info-tab/info-tab.component.css @@ -27,19 +27,3 @@ .mat-column-orcid_id { width: 20rem; } - -/* Bootstrap adds a 5px bottom margin, this counteracts it. Remove once Bootstrap is removed */ -::ng-deep label { - margin-bottom: 0px; -} - -/* Better alignment for "save" icon instead of vertical-align: middle */ -.mat-icon-sm { - vertical-align: text-bottom; -} - -/* Disabled state for "edit" buttons */ -.mat-raised-button.mat-button-disabled.mat-button-disabled { - background-color: white; - filter: opacity(0.3); -} diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index c33827b346..a58db562c9 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -193,120 +193,12 @@ -
    - Topic - {{ workflow?.topicAutomatic }} - {{ workflow?.topicManual }} - - {{ workflow?.topicAI }} - - -
    -
    - Topic Automatic - {{ workflow?.topicAutomatic }} -
    -
    - AI Generated Topic - {{ workflow?.topicAI }} - -
    -
    - Topic Manual - {{ workflow?.topicManual }} - - - - - - -
    - -
  • -
    - Topic Selection - - - Automatic - Manual - AI Generated - - -
    +
  • (this.displayTextForButton = this.infoTabService.getTRSId(this.workflow, entryType))); this.infoTabService.forumUrlEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.forumUrlEditing = editing)); - this.infoTabService.topicEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((topicEditing) => (this.topicEditing = topicEditing)); } /** * Handle restubbing a workflow @@ -244,13 +245,6 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.infoTabService.setWorkflowPathEditing(!this.workflowPathEditing); } - toggleEditTopic() { - if (this.topicEditing) { - this.infoTabService.saveTopic(this.workflow, this.revertTopic.bind(this)); - } - this.infoTabService.setTopicEditing(!this.topicEditing); - } - toggleEditDefaultTestFilePath() { if (this.defaultTestFilePathEditing) { this.save(); @@ -265,18 +259,6 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.infoTabService.setForumUrlEditing(!this.forumUrlEditing); } - revertTopic() { - this.workflow.topicManual = this.extendedWorkflow.topicManual; - } - - revertTopicSelection() { - this.workflow.topicSelection = this.extendedWorkflow.topicSelection; - } - - radioChange(event: MatRadioChange) { - this.infoTabService.saveTopicSelection(this.workflow, this.revertTopicSelection.bind(this)); - } - save() { this.infoTabService.updateAndRefresh(this.workflow); } diff --git a/src/app/workflow/info-tab/info-tab.service.ts b/src/app/workflow/info-tab/info-tab.service.ts index ad6e57d798..14da36f845 100644 --- a/src/app/workflow/info-tab/info-tab.service.ts +++ b/src/app/workflow/info-tab/info-tab.service.ts @@ -34,7 +34,6 @@ export class InfoTabService { public workflowPathEditing$: BehaviorSubject = new BehaviorSubject(false); public defaultTestFilePathEditing$: BehaviorSubject = new BehaviorSubject(false); public forumUrlEditing$: BehaviorSubject = new BehaviorSubject(false); - public topicEditing$: BehaviorSubject = new BehaviorSubject(false); public descriptorLanguageMap = []; constructor( @@ -54,10 +53,6 @@ export class InfoTabService { this.workflowPathEditing$.next(editing); } - setTopicEditing(editing: boolean) { - this.topicEditing$.next(editing); - } - setDefaultTestFilePathEditing(editing: boolean) { this.defaultTestFilePathEditing$.next(editing); } @@ -66,46 +61,6 @@ export class InfoTabService { this.forumUrlEditing$.next(editing); } - /** - * Warning, this could potentially update a few other properties - * @param workflow - */ - saveTopic(workflow: Workflow, errorCallback: () => void) { - this.alertService.start('Updating topic'); - const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); - this.workflowsService.updateWorkflow(workflow.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopic = response.topicManual; - this.workflowService.updateActiveTopic(newTopic); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - - /** - * Warning, this could potentially update a few other properties - * @param workflow - */ - saveTopicSelection(workflow: Workflow, errorCallback: () => void) { - this.alertService.start('Updating topic selection'); - const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); - this.workflowsService.updateWorkflow(workflow.id, partialEntryForUpdate).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - this.workflowService.updateActiveTopicSelection(newTopicSelection); - }, - (error) => { - this.alertService.detailedError(error); - errorCallback(); - } - ); - } - updateAndRefresh(workflow: Workflow) { const message = 'Workflow Info'; const partialEntryForUpdate = this.getPartialEntryForUpdate(workflow); @@ -201,7 +156,6 @@ export class InfoTabService { this.workflowPathEditing$.next(false); this.defaultTestFilePathEditing$.next(false); this.forumUrlEditing$.next(false); - this.topicEditing$.next(false); } /** diff --git a/src/main.ts b/src/main.ts index 45217e203b..c4814b4e37 100644 --- a/src/main.ts +++ b/src/main.ts @@ -76,6 +76,7 @@ import { RegisterWorkflowModalService } from './app/workflow/register-workflow-m import { VersionModalService } from './app/workflow/version-modal/version-modal.service'; import { ViewService } from './app/workflow/view/view.service'; import { environment } from './environments/environment'; +import { EditTopicDialogService } from 'app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service'; if (environment.production) { enableProdMode(); @@ -116,6 +117,7 @@ bootstrapApplication(AppComponent, { ContainerVersionModalService, DateService, DescriptorLanguageService, + EditTopicDialogService, EmailService, EntryActionsService, EntryTypeMetadataService, diff --git a/src/styles.scss b/src/styles.scss index bb5928da42..85b6354bff 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1428,3 +1428,11 @@ app-ai-bubble { .ai-bubble:hover { background-color: mat.get-color-from-palette($dockstore-app-gray, 7); } + +.primary-3 { + color: mat.get-color-from-palette($dockstore-app-primary, 3); +} + +.gray-caption { + color: mat.get-color-from-palette($kim-gray, 2); +} From e137b6d59a3b989361c5eac79a9360e3a237665b Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Fri, 12 Jul 2024 10:09:19 -0400 Subject: [PATCH 55/98] Add "Configure your authorized organizations" message to My Tools page (#1988) https://github.com/dockstore/dockstore/issues/4852 https://ucsc-cgl.atlassian.net/browse/DOCK-2136 * Add configure your authorized organizations message to tools page * Use GitHub client ID to create config link --- src/app/mytools/my-tool/my-tool.component.html | 11 +++++++++++ src/app/mytools/my-tool/my-tool.component.ts | 2 ++ .../my-workflow/my-workflow.component.html | 2 +- .../github-apps-logs/github-apps-logs.component.html | 5 ++++- .../github-apps-logs/github-apps-logs.component.ts | 2 ++ 5 files changed, 20 insertions(+), 2 deletions(-) diff --git a/src/app/mytools/my-tool/my-tool.component.html b/src/app/mytools/my-tool/my-tool.component.html index 0cfc5ceaf3..d396f847b0 100644 --- a/src/app/mytools/my-tool/my-tool.component.html +++ b/src/app/mytools/my-tool/my-tool.component.html @@ -98,6 +98,17 @@ [groupEntriesObject]="groupEntriesObject$ | async" [refreshMessage]="isRefreshing$ | async" > +
    + Don't see an organization? + Configure + your authorized organizations.
  • diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index ad2ab8217e..116b7150a1 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -61,6 +61,7 @@ import { MySidebarComponent } from '../../my-sidebar/my-sidebar.component'; import { FlexModule } from '@ngbracket/ngx-layout/flex'; import { SidebarAccordionComponent } from '../sidebar-accordion/sidebar-accordion.component'; import { SidebarAccordionComponent as WorkflowSidebarAccordionComponent } from '../../myworkflows/sidebar-accordion/sidebar-accordion.component'; +import { Dockstore } from 'app/shared/dockstore.model'; @Component({ selector: 'app-my-tool', @@ -102,6 +103,7 @@ export class MyToolComponent extends MyEntry implements OnInit { public groupEntriesObject$: Observable>>; public groupAppToolEntryObjects$: Observable>>; EntryType = EntryType; + Dockstore = Dockstore; constructor( private mytoolsService: MytoolsService, protected configuration: Configuration, diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.html b/src/app/myworkflows/my-workflow/my-workflow.component.html index 1df6d79448..24a3a0f20e 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.html +++ b/src/app/myworkflows/my-workflow/my-workflow.component.html @@ -101,7 +101,7 @@ Don't see an organization? ConfigureGitHub App Logs Often, if you cannot view the logs for your GitHub user account, you must unlink and relink it in
    your Dockstore profile.
    Otherwise, your GitHub user or the Dockstore app may not have access to the GitHub organization.
    - Click here to confirm that the Dockstore app is authorized. diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts index 612d68dd22..46790f50ac 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.ts @@ -25,6 +25,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; import { NgIf, NgFor, NgSwitch, NgSwitchCase, NgSwitchDefault, AsyncPipe, TitleCasePipe, DatePipe } from '@angular/common'; import { LoadingComponent } from '../../../shared/loading/loading.component'; +import { Dockstore } from 'app/shared/dockstore.model'; /** * Based on https://material.angular.io/components/table/examples example with expandable rows @@ -73,6 +74,7 @@ import { LoadingComponent } from '../../../shared/loading/loading.component'; ], }) export class GithubAppsLogsComponent extends Base implements OnInit, AfterViewInit { + Dockstore = Dockstore; columnsToDisplay: string[]; displayedColumns: string[]; lambdaEvents: LambdaEvent[] | null; From 2ea9bf3e7a9a6658d22988abfbeb1ebb9349a8ac Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Fri, 12 Jul 2024 15:41:13 -0700 Subject: [PATCH 56/98] Bring ng2-ui-auth into dockstore-ui2 (#1984) Commit ng2-ui-auth to our repo and tweak it so it will build on Angular 15. Also Some random fixes in attempt to fix CircleCI failure - Noticed mocks have extra fields, unlikely to make a difference - See if cy.wait fixes some flakiness --- THIRD-PARTY-LICENSES.csv | 1 - cypress/e2e/group2/myworkflows.ts | 1 + cypress/e2e/group3/mytools.ts | 9 +- package-lock.json | 34 ---- package.json | 5 - src/app/app.component.spec.ts | 2 +- src/app/configuration.service.spec.ts | 2 +- src/app/configuration.service.ts | 4 +- src/app/login/login.service.spec.ts | 2 +- src/app/login/login.service.ts | 2 +- .../accounts/external/accounts.component.ts | 2 +- .../downloadcliclient.component.spec.ts | 2 +- .../downloadcliclient.component.ts | 2 +- src/app/mytools/my-tool/my-tool.component.ts | 2 +- .../my-workflow/my-workflow.component.spec.ts | 2 +- .../my-workflow/my-workflow.component.ts | 2 +- src/app/ng2-ui-auth/README.md | 4 + src/app/ng2-ui-auth/lib/auth.service.spec.ts | 51 ++++++ src/app/ng2-ui-auth/lib/auth.service.ts | 63 +++++++ .../lib/browser-storage.service.spec.ts | 35 ++++ .../lib/browser-storage.service.ts | 160 +++++++++++++++++ src/app/ng2-ui-auth/lib/config-interfaces.ts | 78 +++++++++ src/app/ng2-ui-auth/lib/config-providers.ts | 143 ++++++++++++++++ .../ng2-ui-auth/lib/config.service.spec.ts | 34 ++++ src/app/ng2-ui-auth/lib/config.service.ts | 98 +++++++++++ .../lib/interceptor.service.spec.ts | 37 ++++ .../ng2-ui-auth/lib/interceptor.service.ts | 19 +++ src/app/ng2-ui-auth/lib/local.service.spec.ts | 39 +++++ src/app/ng2-ui-auth/lib/local.service.ts | 41 +++++ src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts | 58 +++++++ src/app/ng2-ui-auth/lib/oauth-service.ts | 6 + src/app/ng2-ui-auth/lib/oauth.service.spec.ts | 40 +++++ src/app/ng2-ui-auth/lib/oauth.service.ts | 64 +++++++ .../ng2-ui-auth/lib/oauth1.service.spec.ts | 38 +++++ src/app/ng2-ui-auth/lib/oauth1.service.ts | 62 +++++++ .../ng2-ui-auth/lib/oauth2.service.spec.ts | 38 +++++ src/app/ng2-ui-auth/lib/oauth2.service.ts | 100 +++++++++++ src/app/ng2-ui-auth/lib/popup.service.spec.ts | 34 ++++ src/app/ng2-ui-auth/lib/popup.service.ts | 161 ++++++++++++++++++ .../ng2-ui-auth/lib/shared.service.spec.ts | 36 ++++ src/app/ng2-ui-auth/lib/shared.service.ts | 132 ++++++++++++++ src/app/ng2-ui-auth/lib/storage-service.ts | 11 ++ src/app/ng2-ui-auth/lib/storage-type.enum.ts | 27 +++ src/app/ng2-ui-auth/lib/utils.ts | 59 +++++++ src/app/ng2-ui-auth/public_api.ts | 35 ++++ src/app/ng2-ui-auth/test.ts | 16 ++ src/app/register/register.service.spec.ts | 2 +- src/app/register/register.service.ts | 2 +- src/app/shared/auth.guard.ts | 2 +- src/app/shared/auth.model.ts | 2 +- src/app/shared/my-entry.ts | 2 +- src/app/shared/track-login.service.ts | 2 +- src/app/shared/user/user.service.ts | 2 +- .../starredentries.component.spec.ts | 2 +- .../snaphot-exporter-modal.component.spec.ts | 2 +- src/main.ts | 10 +- 56 files changed, 1749 insertions(+), 72 deletions(-) create mode 100644 src/app/ng2-ui-auth/README.md create mode 100644 src/app/ng2-ui-auth/lib/auth.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/auth.service.ts create mode 100644 src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/browser-storage.service.ts create mode 100644 src/app/ng2-ui-auth/lib/config-interfaces.ts create mode 100644 src/app/ng2-ui-auth/lib/config-providers.ts create mode 100644 src/app/ng2-ui-auth/lib/config.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/config.service.ts create mode 100644 src/app/ng2-ui-auth/lib/interceptor.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/interceptor.service.ts create mode 100644 src/app/ng2-ui-auth/lib/local.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/local.service.ts create mode 100644 src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth-service.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth.service.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth1.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth1.service.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth2.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/oauth2.service.ts create mode 100644 src/app/ng2-ui-auth/lib/popup.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/popup.service.ts create mode 100644 src/app/ng2-ui-auth/lib/shared.service.spec.ts create mode 100644 src/app/ng2-ui-auth/lib/shared.service.ts create mode 100644 src/app/ng2-ui-auth/lib/storage-service.ts create mode 100644 src/app/ng2-ui-auth/lib/storage-type.enum.ts create mode 100644 src/app/ng2-ui-auth/lib/utils.ts create mode 100644 src/app/ng2-ui-auth/public_api.ts create mode 100644 src/app/ng2-ui-auth/test.ts diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 15cac87589..3fe31a482b 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -216,7 +216,6 @@ "move-concurrently@1.0.1","ISC","https://github.com/npm/move-concurrently" "ms@2.0.0","MIT","https://github.com/zeit/ms" "ms@2.1.2","MIT","https://github.com/zeit/ms" -"ng2-ui-auth@10.0.1","UNKNOWN","" "ngx-markdown@15.1.2","MIT","https://github.com/jfcere/ngx-markdown" "ngx-mat-select-search@6.0.0","MIT","https://github.com/bithost-gmbh/ngx-mat-select-search" "ngx-sharebuttons@8.1.0","MIT","https://github.com/murhafsousli/ngx-sharebuttons" diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 9d97fe7953..b989d4c042 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -575,6 +575,7 @@ describe('Dockstore my workflows part 3', () => { cy.wait(1000); cy.get('#2-register-workflow-option').click(); cy.contains('button', 'Next').click(); + cy.wait(2000); // Give animation a chance to kick in. // Untouched form should not have errors but is disabled cy.get('#submitButton').should('be.disabled'); notHaveAlert(); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 0122732223..28033135bf 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -241,11 +241,9 @@ describe('Dockstore my tools', () => { it('register tool', () => { const toolObject: DockstoreTool = { id: 40000, - author: undefined, description: undefined, labels: [], users: [{ id: 1, username: 'user_A', isAdmin: false, name: 'user_A' }], - email: undefined, defaultVersion: undefined, lastUpdated: 1482334377743, gitUrl: 'git@github.com:testnamespace/testname.git', @@ -287,6 +285,7 @@ describe('Dockstore my tools', () => { // Make sure page is loaded first cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); + cy.wait(2000); // Give animation a chance to kick in. cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); cy.get('.modal-footer').contains('Next').first().click(); @@ -307,11 +306,9 @@ describe('Dockstore my tools', () => { it('register tool', () => { const toolObject: DockstoreTool = { id: 40000, - author: undefined, description: undefined, labels: [], users: [{ id: 1, username: 'user_A', isAdmin: false, name: 'user_A' }], - email: undefined, defaultVersion: undefined, lastUpdated: 1482334377743, gitUrl: 'git@github.com:testnamespace/testname.git', @@ -354,9 +351,9 @@ describe('Dockstore my tools', () => { cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); + cy.wait(2000); // Give animation a chance to kick in. cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); cy.get('#sourceCodeRepositoryInput').click(); cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); @@ -462,9 +459,9 @@ describe('Dockstore my tools', () => { cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); + cy.wait(2000); // Give animation a chance to kick in. cy.get('.modal-footer').contains('Next').first().click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); cy.get('#sourceCodeRepositoryInput').click(); cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); diff --git a/package-lock.json b/package-lock.json index 65f9c9fd28..88fc1e0ada 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,6 @@ "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ng2-ui-auth": "^10.0.1", "ngx-markdown": "^15.1.2", "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", @@ -16641,24 +16640,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "node_modules/ng2-ui-auth": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ng2-ui-auth/-/ng2-ui-auth-10.0.1.tgz", - "integrity": "sha512-7LqWdH4/9Id21Ced5LCSIA9aUTPQU0DPwhtQhBMxHRCFx9P4bpCAUwTgJ0XLt2pczusdnGpmBxeDFILZnwupmA==", - "dependencies": { - "tslib": "^1.9.0" - }, - "peerDependencies": { - "@angular/common": "^8.0.0", - "@angular/core": "^8.0.0", - "rxjs": "^6.0.0" - } - }, - "node_modules/ng2-ui-auth/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, "node_modules/ngx-markdown": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-15.1.2.tgz", @@ -36171,21 +36152,6 @@ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "dev": true }, - "ng2-ui-auth": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ng2-ui-auth/-/ng2-ui-auth-10.0.1.tgz", - "integrity": "sha512-7LqWdH4/9Id21Ced5LCSIA9aUTPQU0DPwhtQhBMxHRCFx9P4bpCAUwTgJ0XLt2pczusdnGpmBxeDFILZnwupmA==", - "requires": { - "tslib": "^1.9.0" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - } - } - }, "ngx-markdown": { "version": "15.1.2", "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-15.1.2.tgz", diff --git a/package.json b/package.json index a213db0b1f..fea6794260 100644 --- a/package.json +++ b/package.json @@ -72,7 +72,6 @@ "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ng2-ui-auth": "^10.0.1", "ngx-markdown": "^15.1.2", "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", @@ -120,10 +119,6 @@ "typescript": "^4.8.4" }, "overrides": { - "ng2-ui-auth": { - "@angular/common": "~15.2.10", - "@angular/core": "~15.2.10" - }, "@schematics/update": { "ini": "^1.3.8" } diff --git a/src/app/app.component.spec.ts b/src/app/app.component.spec.ts index 860f9060a4..2497f72e4b 100644 --- a/src/app/app.component.spec.ts +++ b/src/app/app.component.spec.ts @@ -5,10 +5,10 @@ import { TestBed, waitForAsync } from '@angular/core/testing'; import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; -import { AuthService } from 'ng2-ui-auth'; import { AppComponent } from './app.component'; import { MytoolsService } from './mytools/mytools.service'; import { MyWorkflowsService } from './myworkflows/myworkflows.service'; +import { AuthService } from './ng2-ui-auth/public_api'; import { ServiceInfoService } from './service-info/service-info.service'; import { ContainerService } from './shared/container.service'; import { DateService } from './shared/date.service'; diff --git a/src/app/configuration.service.spec.ts b/src/app/configuration.service.spec.ts index 341328acac..5817565dfd 100644 --- a/src/app/configuration.service.spec.ts +++ b/src/app/configuration.service.spec.ts @@ -1,7 +1,7 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { inject, TestBed } from '@angular/core/testing'; -import { ConfigService } from 'ng2-ui-auth'; import { ConfigurationService } from './configuration.service'; +import { ConfigService } from './ng2-ui-auth/public_api'; describe('ConfigurationService', () => { beforeEach(() => diff --git a/src/app/configuration.service.ts b/src/app/configuration.service.ts index ac07a6e766..19139f6ff0 100644 --- a/src/app/configuration.service.ts +++ b/src/app/configuration.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { ConfigService } from 'ng2-ui-auth'; -import { IOauth2Options } from 'ng2-ui-auth/lib/config-interfaces'; +import { IOauth2Options } from './ng2-ui-auth/lib/config-interfaces'; +import { ConfigService } from './ng2-ui-auth/lib/config.service'; import { AuthConfig } from './shared/auth.model'; import { Dockstore } from './shared/dockstore.model'; import { FeatureService } from './shared/feature.service'; diff --git a/src/app/login/login.service.spec.ts b/src/app/login/login.service.spec.ts index 9674ba2df0..eeb3ab5ed4 100644 --- a/src/app/login/login.service.spec.ts +++ b/src/app/login/login.service.spec.ts @@ -15,7 +15,7 @@ */ import { inject, TestBed } from '@angular/core/testing'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; -import { AuthService } from 'ng2-ui-auth'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AuthStubService } from '../test/service-stubs'; import { LoginService } from './login.service'; diff --git a/src/app/login/login.service.ts b/src/app/login/login.service.ts index 72cde2f132..fcd99fb3a7 100644 --- a/src/app/login/login.service.ts +++ b/src/app/login/login.service.ts @@ -15,8 +15,8 @@ */ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { Observable } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AlertService } from '../shared/alert/state/alert.service'; @Injectable() diff --git a/src/app/loginComponents/accounts/external/accounts.component.ts b/src/app/loginComponents/accounts/external/accounts.component.ts index e35f2ac8de..5354f1da93 100644 --- a/src/app/loginComponents/accounts/external/accounts.component.ts +++ b/src/app/loginComponents/accounts/external/accounts.component.ts @@ -16,9 +16,9 @@ import { Component, OnDestroy, OnInit } from '@angular/core'; import { MatLegacySnackBar as MatSnackBar } from '@angular/material/legacy-snack-bar'; import { Router, RouterLink } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; import { Observable, Subject } from 'rxjs'; import { first, map, takeUntil } from 'rxjs/operators'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { Dockstore } from '../../../shared/dockstore.model'; import { TokenSource } from '../../../shared/enum/token-source.enum'; import { TokenQuery } from '../../../shared/state/token.query'; diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts index 0eff90ebec..55715caf69 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.spec.ts @@ -1,6 +1,5 @@ import { ClipboardModule } from '@angular/cdk/clipboard'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { AuthService } from 'ng2-ui-auth'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; @@ -8,6 +7,7 @@ import { MatIconModule } from '@angular/material/icon'; import { MatLegacyTabsModule as MatTabsModule } from '@angular/material/legacy-tabs'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { MarkdownModule } from 'ngx-markdown'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { MetadataService, GA4GHV20Service } from '../../../shared/openapi'; import { ServiceInfoService } from '../../../service-info/service-info.service'; import { RouterLinkStubDirective, RouterOutletStubComponent } from './../../../test/router-stubs'; diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index b47c52e1da..5253bf5f36 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -1,6 +1,6 @@ /* eslint-disable max-len */ import { Component, EventEmitter, OnInit } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; +import { AuthService } from '../../../ng2-ui-auth/public_api'; import { Dockstore } from '../../../shared/dockstore.model'; import { MetadataService, TRSService } from '../../../shared/openapi'; import { ServiceInfoService } from '../../../service-info/service-info.service'; diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index 116b7150a1..18fb2af772 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -22,7 +22,6 @@ import { SessionQuery } from 'app/shared/session/session.query'; import { SessionService } from 'app/shared/session/session.service'; import { MyEntriesQuery } from 'app/shared/state/my-entries.query'; import { MyEntriesStateService } from 'app/shared/state/my-entries.service'; -import { AuthService } from 'ng2-ui-auth'; import { combineLatest, Observable } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import { RegisterToolComponent } from '../../container/register-tool/register-tool.component'; @@ -31,6 +30,7 @@ import { Tool } from '../../container/register-tool/tool'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; import { OrgWorkflowObject } from '../../myworkflows/my-workflow/my-workflow.component'; import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { bootstrap4largeModalSize } from '../../shared/constants'; import { ContainerService } from '../../shared/container.service'; diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts index 24faabd7d1..ab712efd97 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.spec.ts @@ -21,9 +21,9 @@ import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; import { TrackLoginService } from 'app/shared/track-login.service'; -import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; import { MytoolsService } from '../../mytools/mytools.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { BioschemaService } from '../../shared/bioschema.service'; import { ContainerService } from '../../shared/container.service'; import { DateService } from '../../shared/date.service'; diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.ts b/src/app/myworkflows/my-workflow/my-workflow.component.ts index 0e7a85e72e..2e4f33ed56 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.ts +++ b/src/app/myworkflows/my-workflow/my-workflow.component.ts @@ -26,10 +26,10 @@ import { TokenService } from 'app/shared/state/token.service'; import { BioWorkflow } from 'app/shared/openapi/model/bioWorkflow'; import { Service } from 'app/shared/openapi/model/service'; import { UserService } from 'app/shared/user/user.service'; -import { AuthService } from 'ng2-ui-auth'; import { combineLatest, Observable } from 'rxjs'; import { filter, map, shareReplay, takeUntil } from 'rxjs/operators'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertQuery } from '../../shared/alert/state/alert.query'; import { MyEntry, OrgEntryObject } from '../../shared/my-entry'; import { TokenQuery } from '../../shared/state/token.query'; diff --git a/src/app/ng2-ui-auth/README.md b/src/app/ng2-ui-auth/README.md new file mode 100644 index 0000000000..07d6061cf3 --- /dev/null +++ b/src/app/ng2-ui-auth/README.md @@ -0,0 +1,4 @@ +Files in this directory are originally from https://github.com/ronzeidman/ng2-ui-auth + +That repo is no longer maintained, and became incompatible with recent Angular versions. It was easiest to commit the files +here and tweak them. diff --git a/src/app/ng2-ui-auth/lib/auth.service.spec.ts b/src/app/ng2-ui-auth/lib/auth.service.spec.ts new file mode 100644 index 0000000000..d679b63c6c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/auth.service.spec.ts @@ -0,0 +1,51 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; + +import { AuthService } from './auth.service'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; +import { LocalService } from './local.service'; +import { OauthService } from './oauth.service'; +import { PopupService } from './popup.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('AuthService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [ + AuthService, + ConfigService, + LocalService, + OauthService, + PopupService, + SharedService, + StorageService, + { provide: CONFIG_OPTIONS, useValue: {} }, + ], + }); + }); + + it('should be created', inject([AuthService], (service: AuthService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/auth.service.ts b/src/app/ng2-ui-auth/lib/auth.service.ts new file mode 100644 index 0000000000..0374e75ae6 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/auth.service.ts @@ -0,0 +1,63 @@ +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { LocalService } from './local.service'; +import { OauthService } from './oauth.service'; +import { SharedService } from './shared.service'; +import { StorageType } from './storage-type.enum'; + +@Injectable() +export class AuthService { + constructor(private shared: SharedService, private local: LocalService, private oauth: OauthService) {} + + public login(user: string | object, url?: string): Observable { + return this.local.login(user, url); + } + + public signup(user: string | object, url?: string): Observable { + return this.local.signup(user, url); + } + + public logout(): Observable { + return this.shared.logout(); + } + + public authenticate(name: string, userData?: any): Observable { + return this.oauth.authenticate(name, userData); + } + + public link(name: string, userData?: any): Observable { + return this.oauth.authenticate(name, userData); + } + + public unlink(provider: string, url?: string): Observable { + return this.oauth.unlink(provider, url); + } + + public isAuthenticated(): boolean { + return this.shared.isAuthenticated(); + } + + public getToken(): string | null { + return this.shared.getToken(); + } + + public setToken(token: string | object): void { + this.shared.setToken(token); + } + + public removeToken(): void { + this.shared.removeToken(); + } + + public getPayload(): any { + return this.shared.getPayload(); + } + + public setStorageType(type: StorageType): boolean { + return this.shared.setStorageType(type); + } + + public getExpirationDate(): Date | null { + return this.shared.getExpirationDate(); + } +} diff --git a/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts b/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts new file mode 100644 index 0000000000..935602f907 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/browser-storage.service.spec.ts @@ -0,0 +1,35 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { BrowserStorageService } from './browser-storage.service'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +describe('BrowserStorageService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [BrowserStorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([BrowserStorageService], (service: BrowserStorageService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/browser-storage.service.ts b/src/app/ng2-ui-auth/lib/browser-storage.service.ts new file mode 100644 index 0000000000..8558808643 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/browser-storage.service.ts @@ -0,0 +1,160 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { StorageService } from './storage-service'; +import { StorageType } from './storage-type.enum'; +import { ConfigService } from './config.service'; + +@Injectable() +export class BrowserStorageService extends StorageService { + private store: { [key: string]: string } = {}; + private storageType = StorageType.MEMORY; + + constructor(private config: ConfigService) { + super(); + if (!this.updateStorageType(config.options.storageType)) { + console.warn(config.options.storageType + ' is not available.'); + } + } + + public updateStorageType(storageType: StorageType) { + const isStorageAvailable = this.checkIsStorageAvailable(storageType); + if (!isStorageAvailable) { + return false; + } + this.storageType = storageType; + return true; + } + + public get(key: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + return this.getCookie(key); + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + return window[this.storageType].getItem(key); + case StorageType.MEMORY: + return this.store[key]; + case StorageType.NONE: + default: + return null; + } + } + + public set(key: string, value: string, date: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + this.setCookie(key, value, this.storageType === StorageType.COOKIE ? date : ''); + break; + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + window[this.storageType].setItem(key, value); + break; + case StorageType.MEMORY: + this.store[key] = value; + break; + case StorageType.NONE: + default: + break; + } + } + + public remove(key: string) { + switch (this.storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + this.removeCookie(key); + break; + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + window[this.storageType].removeItem(key); + break; + case StorageType.MEMORY: + delete this.store[key]; + break; + case StorageType.NONE: + default: + break; + } + } + + private checkIsStorageAvailable(storageType: StorageType) { + switch (storageType) { + case StorageType.COOKIE: + case StorageType.SESSION_COOKIE: + return this.isCookieStorageAvailable(); + case StorageType.LOCAL_STORAGE: + case StorageType.SESSION_STORAGE: + return this.isWindowStorageAvailable(storageType); + case StorageType.NONE: + case StorageType.MEMORY: + return true; + default: + return false; + } + } + + private isWindowStorageAvailable(storageType: StorageType.SESSION_STORAGE | StorageType.LOCAL_STORAGE) { + try { + const supported = window && storageType in window && window[storageType] !== null; + + if (supported) { + const key = Math.random().toString(36).substring(7); + window[storageType].setItem(key, ''); + window[storageType].removeItem(key); + } + + return supported; + } catch (e) { + return false; + } + } + + private isCookieStorageAvailable() { + try { + const supported = document && 'cookie' in document; + + if (supported) { + const key = Math.random().toString(36).substring(7); + this.setCookie(key, 'test', new Date(Date.now() + 60 * 1000).toUTCString()); + const value = this.getCookie(key); + this.removeCookie(key); + return value === 'test'; + } + return false; + } catch (e) { + return false; + } + } + + private setCookie(key: string, value: string, expires = '', path = '/') { + document.cookie = `${key}=${value}${expires ? `; expires=${expires}` : ''}; path=${path}`; + } + + private removeCookie(key: string, path = '/') { + this.setCookie(key, '', new Date(0).toUTCString(), path); + } + + private getCookie(key: string) { + return document.cookie.replace(new RegExp(`(?:(?:^|.*;\\s*)${key}\\s*\\=\\s*([^;]*).*$)|^.*$`), '$1'); + } +} diff --git a/src/app/ng2-ui-auth/lib/config-interfaces.ts b/src/app/ng2-ui-auth/lib/config-interfaces.ts new file mode 100644 index 0000000000..61339217e3 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config-interfaces.ts @@ -0,0 +1,78 @@ +import { StorageType } from './storage-type.enum'; + +export interface IPopupOptions { + width?: number; + height?: number; + left?: number; + top?: number; + visibleToolbar?: boolean; +} + +export interface IOauth1Options { + url?: string; + name?: string; + redirectUri?: string; + popupOptions?: IPopupOptions; + authorizationEndpoint?: string; + oauthType?: '1.0'; + method?: string; +} + +export interface IOauth2Options { + url?: string; + name?: string; + redirectUri?: string; + popupOptions?: IPopupOptions; + authorizationEndpoint?: string; + oauthType?: '2.0'; + method?: string; + responseType?: string; + clientId?: string; + additionalUrlParams?: { + [paramName: string]: string | (() => string) | null | undefined; + }; + scopeDelimiter?: string; + scope?: string[]; + state?: string | (() => string); +} + +export interface IProviders { + [provider: string]: IOauth2Options | IOauth1Options; +} + +export interface IConfigOptions { + tokenRoot: string | null; + cordova: boolean | null; + baseUrl: string; + loginUrl: string; + signupUrl: string; + unlinkUrl: string; + tokenName: string; + tokenSeparator: string; + tokenPrefix: string; + authToken: string; + authHeader: string; + storageType: StorageType; + providers: IProviders; + withCredentials: boolean; + resolveToken: (response: any, config: IConfigOptions) => string; +} + +// now even using ts 2.7.2 Partial causes "Could not resolve type Partial" build error... +export interface IPartialConfigOptions { + tokenRoot?: string | null; + cordova?: boolean | null; + baseUrl?: string; + loginUrl?: string; + signupUrl?: string; + unlinkUrl?: string; + tokenName?: string; + tokenSeparator?: string; + tokenPrefix?: string; + authToken?: string; + authHeader?: string; + storageType?: StorageType; + providers?: IProviders; + withCredentials?: boolean; + resolveToken?: (response: any, config: IConfigOptions) => string; +} diff --git a/src/app/ng2-ui-auth/lib/config-providers.ts b/src/app/ng2-ui-auth/lib/config-providers.ts new file mode 100644 index 0000000000..cc2ddc3daf --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config-providers.ts @@ -0,0 +1,143 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { IProviders } from '../public_api'; +import { getWindowOrigin } from './utils'; + +export const defaultProviders: IProviders = { + facebook: { + name: 'facebook', + url: '/auth/facebook', + redirectUri: `${getWindowOrigin()}/`, + authorizationEndpoint: 'https://www.facebook.com/v2.5/dialog/oauth', + additionalUrlParams: { + display: 'popup', + }, + scope: ['email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 580, height: 400 }, + }, + google: { + name: 'google', + url: '/auth/google', + authorizationEndpoint: 'https://accounts.google.com/o/oauth2/v2/auth', + additionalUrlParams: { + display: 'popup', + prompt: undefined, + login_hint: undefined, + access_type: undefined, + include_granted_scopes: undefined, + 'openid.realm': undefined, + hd: undefined, + }, + scope: ['openid', 'email'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 452, height: 633 }, + state: () => encodeURIComponent(Math.random().toString(36).substr(2)), + }, + github: { + name: 'github', + url: '/auth/github', + authorizationEndpoint: 'https://github.com/login/oauth/authorize', + scope: ['user:email'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 1020, height: 618 }, + }, + instagram: { + name: 'instagram', + url: '/auth/instagram', + authorizationEndpoint: 'https://api.instagram.com/oauth/authorize', + scope: ['basic'], + scopeDelimiter: '+', + oauthType: '2.0', + }, + linkedin: { + name: 'linkedin', + url: '/auth/linkedin', + authorizationEndpoint: 'https://www.linkedin.com/uas/oauth2/authorization', + scope: ['r_emailaddress'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 527, height: 582 }, + state: 'STATE', + }, + twitter: { + name: 'twitter', + url: '/auth/twitter', + authorizationEndpoint: 'https://api.twitter.com/oauth/authenticate', + oauthType: '1.0', + popupOptions: { width: 495, height: 645 }, + }, + twitch: { + name: 'twitch', + url: '/auth/twitch', + authorizationEndpoint: 'https://api.twitch.tv/kraken/oauth2/authorize', + scope: ['user_read'], + scopeDelimiter: ' ', + additionalUrlParams: { + display: 'popup', + }, + oauthType: '2.0', + popupOptions: { width: 500, height: 560 }, + }, + live: { + name: 'live', + url: '/auth/live', + authorizationEndpoint: 'https://login.live.com/oauth20_authorize.srf', + additionalUrlParams: { + display: 'popup', + }, + scope: ['wl.emails'], + scopeDelimiter: ' ', + oauthType: '2.0', + popupOptions: { width: 500, height: 560 }, + }, + yahoo: { + name: 'yahoo', + url: '/auth/yahoo', + authorizationEndpoint: 'https://api.login.yahoo.com/oauth2/request_auth', + scope: [], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 559, height: 519 }, + }, + bitbucket: { + name: 'bitbucket', + url: '/auth/bitbucket', + authorizationEndpoint: 'https://bitbucket.org/site/oauth2/authorize', + redirectUri: `${getWindowOrigin()}/`, + scope: ['email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 1028, height: 529 }, + }, + spotify: { + name: 'spotify', + url: '/auth/spotify', + authorizationEndpoint: 'https://accounts.spotify.com/authorize', + scope: ['', 'user-read-email'], + scopeDelimiter: ',', + oauthType: '2.0', + popupOptions: { width: 500, height: 530 }, + state: () => encodeURIComponent(Math.random().toString(36).substr(2)), + }, +}; diff --git a/src/app/ng2-ui-auth/lib/config.service.spec.ts b/src/app/ng2-ui-auth/lib/config.service.spec.ts new file mode 100644 index 0000000000..d08fd2da0c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config.service.spec.ts @@ -0,0 +1,34 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +describe('ConfigService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([ConfigService], (service: ConfigService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/config.service.ts b/src/app/ng2-ui-auth/lib/config.service.ts new file mode 100644 index 0000000000..bd9cfc8ca8 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/config.service.ts @@ -0,0 +1,98 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Inject, Injectable, InjectionToken } from '@angular/core'; +import { IConfigOptions, IPartialConfigOptions, IProviders } from './config-interfaces'; +import { defaultProviders } from './config-providers'; +import { StorageType } from './storage-type.enum'; + +export const CONFIG_OPTIONS = new InjectionToken('config.options'); +@Injectable() +export class ConfigService { + public options = { + withCredentials: false, + tokenRoot: null, + baseUrl: '/', + loginUrl: '/auth/login', + signupUrl: '/auth/signup', + unlinkUrl: '/auth/unlink/', + tokenName: 'token', + tokenSeparator: '_', + tokenPrefix: 'ng2-ui-auth', + authHeader: 'Authorization', + authToken: 'Bearer', + storageType: StorageType.LOCAL_STORAGE, + cordova: undefined, + resolveToken: (response: any, config: IConfigOptions) => { + const accessToken: string | { [key: string]: string } | null | undefined = + response && (response.access_token || response.token || response.data); + if (!accessToken) { + // console.warn('No token found'); + return null; + } + if (typeof accessToken === 'string') { + return accessToken; + } + if (typeof accessToken !== 'object') { + // console.warn('No token found'); + return null; + } + const tokenRootData = + config.tokenRoot && + config.tokenRoot.split('.').reduce((o: any, x: any) => { + return o[x]; + }, accessToken); + const token = tokenRootData ? tokenRootData[config.tokenName] : accessToken[config.tokenName]; + if (token) { + return token; + } + // const tokenPath = this.tokenRoot ? this.tokenRoot + '.' + this.tokenName : this.tokenName; + // console.warn('Expecting a token named "' + tokenPath); + return null; + }, + providers: {}, + }; + + constructor(@Inject(CONFIG_OPTIONS) options: IPartialConfigOptions) { + this.options = { + ...this.options, + ...options, + }; + this.mergeWithDefaultProviders(); + } + + updateProviders(providers: IProviders) { + this.options.providers = { + ...(this.options.providers || {}), + ...providers, + }; + this.mergeWithDefaultProviders(); + } + + mergeWithDefaultProviders() { + Object.keys(this.options.providers).forEach((key) => { + if (key in defaultProviders) { + this.options.providers[key] = { + ...defaultProviders[key], + ...this.options.providers[key], + }; + } + }); + } +} diff --git a/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts b/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts new file mode 100644 index 0000000000..8c216f2af5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/interceptor.service.spec.ts @@ -0,0 +1,37 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { JwtInterceptor } from './interceptor.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('InterceptorService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [JwtInterceptor, SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([JwtInterceptor], (service: JwtInterceptor) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/interceptor.service.ts b/src/app/ng2-ui-auth/lib/interceptor.service.ts new file mode 100644 index 0000000000..21e24336b9 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/interceptor.service.ts @@ -0,0 +1,19 @@ +import { Injectable } from '@angular/core'; +import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http'; +import { SharedService } from './shared.service'; +import { ConfigService } from './config.service'; +import { Observable } from 'rxjs'; + +@Injectable() +export class JwtInterceptor implements HttpInterceptor { + constructor(private shared: SharedService, private config: ConfigService) {} + + intercept(req: HttpRequest, next: HttpHandler): Observable> { + const { authHeader, authToken } = this.config.options; + const token = this.shared.getToken(); + const isAuthenticated = this.shared.isAuthenticated(); + const newReq = + isAuthenticated && !req.headers.has(authHeader) ? req.clone({ setHeaders: { [authHeader]: `${authToken} ${token}` } }) : req; + return next.handle(newReq); + } +} diff --git a/src/app/ng2-ui-auth/lib/local.service.spec.ts b/src/app/ng2-ui-auth/lib/local.service.spec.ts new file mode 100644 index 0000000000..27de1eb8f7 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/local.service.spec.ts @@ -0,0 +1,39 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { LocalService } from './local.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('LocalService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [LocalService, SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([LocalService], (service: LocalService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/local.service.ts b/src/app/ng2-ui-auth/lib/local.service.ts new file mode 100644 index 0000000000..33b6756ea5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/local.service.ts @@ -0,0 +1,41 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { HttpClient } from '@angular/common/http'; +import { SharedService } from './shared.service'; +import { ConfigService } from './config.service'; +import { joinUrl } from './utils'; +import { tap } from 'rxjs/operators'; +import { Observable } from 'rxjs'; + +@Injectable() +export class LocalService { + constructor(private http: HttpClient, private shared: SharedService, private config: ConfigService) {} + + public login(user: string | object, url?: string): Observable { + return this.http + .post(url || joinUrl(this.config.options.baseUrl, this.config.options.loginUrl), user) + .pipe(tap((data) => this.shared.setToken(data))); + } + + public signup(user: string | object, url?: string): Observable { + return this.http.post(url || joinUrl(this.config.options.baseUrl, this.config.options.signupUrl), user); + } +} diff --git a/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts new file mode 100644 index 0000000000..64029b0ea2 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts @@ -0,0 +1,58 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { NgModule, ModuleWithProviders } from '@angular/core'; +import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; +import { IConfigOptions, IPartialConfigOptions } from './config-interfaces'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; +import { StorageService } from './storage-service'; +import { BrowserStorageService } from './browser-storage.service'; +import { SharedService } from './shared.service'; +import { JwtInterceptor } from './interceptor.service'; +import { OauthService } from './oauth.service'; +import { HttpClient } from '@angular/common/http'; +import { PopupService } from './popup.service'; +import { LocalService } from './local.service'; +import { AuthService } from './auth.service'; + +@NgModule({ + imports: [HttpClientModule], + declarations: [], + exports: [], +}) +export class Ng2UiAuthModule { + static forRoot(configOptions?: IPartialConfigOptions, defaultJwtInterceptor = true): ModuleWithProviders { + return { + ngModule: Ng2UiAuthModule, + providers: [ + ...(configOptions ? [{ provide: CONFIG_OPTIONS, useValue: configOptions }] : []), + { provide: ConfigService, useClass: ConfigService, deps: [CONFIG_OPTIONS] }, + { provide: StorageService, useClass: BrowserStorageService, deps: [ConfigService] }, + { provide: SharedService, useClass: SharedService, deps: [StorageService, ConfigService] }, + { provide: LocalService, useClass: LocalService, deps: [HttpClient, SharedService, ConfigService] }, + { provide: PopupService, useClass: PopupService, deps: [ConfigService] }, + { provide: OauthService, useClass: OauthService, deps: [HttpClient, SharedService, ConfigService, PopupService] }, + { provide: AuthService, useClass: AuthService, deps: [SharedService, LocalService, OauthService] }, + ...(defaultJwtInterceptor + ? [{ provide: HTTP_INTERCEPTORS, useClass: JwtInterceptor, multi: true, deps: [SharedService, ConfigService] }] + : []), + ], + }; + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth-service.ts b/src/app/ng2-ui-auth/lib/oauth-service.ts new file mode 100644 index 0000000000..c6a0bc6bc5 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth-service.ts @@ -0,0 +1,6 @@ +import { IOauth2Options, IOauth1Options } from './config-interfaces'; +import { Observable } from 'rxjs'; + +export interface IOauthService { + open(options: IOauth2Options | IOauth1Options, userData: object): Observable; +} diff --git a/src/app/ng2-ui-auth/lib/oauth.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth.service.spec.ts new file mode 100644 index 0000000000..028592bde1 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth.service.spec.ts @@ -0,0 +1,40 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { OauthService } from './oauth.service'; +import { PopupService } from './popup.service'; +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('OauthService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [OauthService, SharedService, PopupService, StorageService, { provide: CONFIG_OPTIONS, useValue: {} }, ConfigService], + }); + }); + + it('should be created', inject([OauthService], (service: OauthService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth.service.ts b/src/app/ng2-ui-auth/lib/oauth.service.ts new file mode 100644 index 0000000000..97acc998bc --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth.service.ts @@ -0,0 +1,64 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable, Injector } from '@angular/core'; +import { joinUrl } from './utils'; +import { tap } from 'rxjs/operators'; +import { Oauth1Service } from './oauth1.service'; +import { Oauth2Service } from './oauth2.service'; +import { Observable } from 'rxjs'; +import { PopupService } from './popup.service'; +import { ConfigService } from './config.service'; +import { SharedService } from './shared.service'; +import { HttpClient } from '@angular/common/http'; +import { IOauthService } from './oauth-service'; + +@Injectable() +export class OauthService { + readonly depProviders = [ + { provide: HttpClient, useValue: this.http }, + { provide: PopupService, useValue: this.popup }, + { provide: ConfigService, useValue: this.config }, + ]; + readonly deps = [HttpClient, PopupService, ConfigService]; + + constructor(private http: HttpClient, private shared: SharedService, private config: ConfigService, private popup: PopupService) {} + + public authenticate(name: string, userData?: any): Observable { + const provider: IOauthService = + this.config.options.providers[name].oauthType === '1.0' + ? Injector.create([...this.depProviders, { provide: Oauth1Service, deps: this.deps }]).get(Oauth1Service) + : Injector.create([...this.depProviders, { provide: Oauth2Service, deps: this.deps }]).get(Oauth2Service); + + return provider.open(this.config.options.providers[name], userData || {}).pipe( + tap((response) => { + // this is for a scenario when someone wishes to opt out from + // satellizer's magic by doing authorization code exchange and + // saving a token manually. + if (this.config.options.providers[name].url) { + this.shared.setToken(response); + } + }) + ); + } + + public unlink(provider: string, url = joinUrl(this.config.options.baseUrl, this.config.options.unlinkUrl), method = 'POST') { + return this.http.request(method, url, { body: { provider } }); + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts new file mode 100644 index 0000000000..b8a3e5b418 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth1.service.spec.ts @@ -0,0 +1,38 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { Oauth1Service } from './oauth1.service'; +import { PopupService } from './popup.service'; + +describe('Oauth1Service', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Oauth1Service, PopupService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([Oauth1Service], (service: Oauth1Service) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth1.service.ts b/src/app/ng2-ui-auth/lib/oauth1.service.ts new file mode 100644 index 0000000000..35f3eb8cdc --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth1.service.ts @@ -0,0 +1,62 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { Observable } from 'rxjs'; +import { map, switchMap, tap } from 'rxjs/operators'; +import { IOauth1Options } from './config-interfaces'; +import { ConfigService } from './config.service'; +import { IOauthService } from './oauth-service'; +import { PopupService } from './popup.service'; +import { buildQueryString, joinUrl } from './utils'; + +@Injectable() +export class Oauth1Service implements IOauthService { + constructor(private http: HttpClient, private popup: PopupService, private config: ConfigService) {} + + open(oauthOptions: IOauth1Options, userData: object): Observable { + const serverUrl = this.config.options.baseUrl ? joinUrl(this.config.options.baseUrl, oauthOptions.url) : oauthOptions.url; + return this.popup.open('about:blank', oauthOptions, this.config.options.cordova).pipe( + switchMap((popupWindow) => + this.http.post(serverUrl, oauthOptions).pipe( + tap((authorizationData) => + popupWindow + ? popupWindow.location.replace([oauthOptions.authorizationEndpoint, buildQueryString(authorizationData)].join('?')) + : undefined + ), + switchMap((authorizationData) => + this.popup + .waitForClose(popupWindow, this.config.options.cordova, oauthOptions.redirectUri) + .pipe(map((oauthData) => ({ authorizationData, oauthData }))) + ) + ) + ), + switchMap(({ authorizationData, oauthData }) => this.exchangeForToken(oauthOptions, authorizationData, oauthData, userData)) + ); + } + + private exchangeForToken(oauthOptions: IOauth1Options, authorizationData: object, oauthData: object, userData: object) { + const body = { oauthOptions, authorizationData, oauthData, userData }; + const { withCredentials, baseUrl } = this.config.options; + const { method = 'POST', url } = oauthOptions; + const exchangeForTokenUrl = baseUrl ? joinUrl(baseUrl, url) : url; + return this.http.request(method, exchangeForTokenUrl, { body, withCredentials }); + } +} diff --git a/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts b/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts new file mode 100644 index 0000000000..bfc2be590d --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth2.service.spec.ts @@ -0,0 +1,38 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClientTestingModule } from '@angular/common/http/testing'; +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { Oauth2Service } from './oauth2.service'; +import { PopupService } from './popup.service'; + +describe('Oauth2Service', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + imports: [HttpClientTestingModule], + providers: [Oauth2Service, PopupService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([Oauth2Service], (service: Oauth2Service) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/oauth2.service.ts b/src/app/ng2-ui-auth/lib/oauth2.service.ts new file mode 100644 index 0000000000..494412ce28 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/oauth2.service.ts @@ -0,0 +1,100 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpClient } from '@angular/common/http'; +import { Injectable } from '@angular/core'; +import { empty, Observable, of } from 'rxjs'; +import { switchMap } from 'rxjs/operators'; +import { IOauth2Options } from './config-interfaces'; +import { ConfigService } from './config.service'; +import { IOauthService } from './oauth-service'; +import { PopupService } from './popup.service'; +import { buildQueryString, getWindowOrigin, joinUrl } from './utils'; + +@Injectable() +export class Oauth2Service implements IOauthService { + constructor(private http: HttpClient, private popup: PopupService, private config: ConfigService) {} + + open(oauthOptions: IOauth2Options, userData: object): Observable { + const authorizationData = this.getAuthorizationData(oauthOptions); + const url = [oauthOptions.authorizationEndpoint, buildQueryString(authorizationData)].join('?'); + return this.popup.open(url, oauthOptions, this.config.options.cordova).pipe( + switchMap((window?: Window) => + window ? this.popup.waitForClose(window, this.config.options.cordova, oauthOptions.redirectUri) : empty() + ), + switchMap((oauthData: any) => { + // when no server URL provided, return popup params as-is. + // this is for a scenario when someone wishes to opt out from + // satellizer's magic by doing authorization code exchange and + // saving a token manually. + if (oauthOptions.responseType === 'token' || !oauthOptions.url) { + return of(oauthData); + } + + if (oauthData.state && oauthData.state !== authorizationData.state) { + throw new Error('OAuth "state" mismatch'); + } + return this.exchangeForToken(oauthOptions, authorizationData, oauthData, userData); + }) + ); + } + + private exchangeForToken(options: IOauth2Options, authorizationData: object, oauthData: object, userData: object) { + const body = { authorizationData, oauthData, userData }; + const { baseUrl, withCredentials } = this.config.options; + const { url, method = 'POST' } = options; + const exchangeForTokenUrl = baseUrl ? joinUrl(baseUrl, url) : url; + return this.http.request(method, exchangeForTokenUrl, { body, withCredentials }); + } + + private getAuthorizationData(options: IOauth2Options) { + const { + responseType = 'code', + clientId, + redirectUri = getWindowOrigin() || '', + scopeDelimiter = ',', + scope, + state, + additionalUrlParams, + } = options; + const resolvedState = typeof state === 'function' ? state() : state; + return [ + ['response_type', responseType], + ['client_id', clientId], + ['redirect_uri', redirectUri], + ...(state ? [['state', resolvedState]] : []), + ...(scope ? [['scope', scope.join(scopeDelimiter)]] : []), + ...(additionalUrlParams + ? Object.keys(additionalUrlParams).map((key) => { + const value: string | (() => string) | null | undefined = (additionalUrlParams as any)[key]; + if (typeof value === 'string') { + return [key, value]; + } else if (typeof value === 'function') { + return [key, value()]; + } else if (value === null) { + return [key, '']; + } + return ['', '']; + }) + : []), + ] + .filter((_) => !!_[0]) + .reduce((acc, next) => ({ ...acc, [next[0]]: next[1] }), {} as { [key: string]: string }); + } +} diff --git a/src/app/ng2-ui-auth/lib/popup.service.spec.ts b/src/app/ng2-ui-auth/lib/popup.service.spec.ts new file mode 100644 index 0000000000..00967d0462 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/popup.service.spec.ts @@ -0,0 +1,34 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; + +import { PopupService } from './popup.service'; + +describe('PopupService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [PopupService], + }); + }); + + it('should be created', inject([PopupService], (service: PopupService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/popup.service.ts b/src/app/ng2-ui-auth/lib/popup.service.ts new file mode 100644 index 0000000000..e3313f20a0 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/popup.service.ts @@ -0,0 +1,161 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { empty, fromEvent, interval, merge, Observable, of, throwError } from 'rxjs'; +import { delay, map, switchMap, take } from 'rxjs/operators'; +import { IOauth1Options, IOauth2Options, IPopupOptions } from './config-interfaces'; +import { getWindowOrigin } from './utils'; + +declare const cordova: any; +@Injectable() +export class PopupService { + public open(url: string, options: IOauth2Options | IOauth1Options, cordova = this.isCordovaApp()) { + const stringifiedOptions = this.stringifyOptions(this.prepareOptions(options.popupOptions)); + const windowName = cordova ? '_blank' : options.name; + + const popupWindow = typeof window !== 'undefined' ? window.open(url, windowName, stringifiedOptions) : null; + + if (popupWindow) { + if (popupWindow.focus) { + popupWindow.focus(); + } + return of(popupWindow); + } + return empty(); + } + + public waitForClose(popupWindow: Window, cordova = this.isCordovaApp(), redirectUri = getWindowOrigin()) { + return cordova ? this.eventListener(popupWindow, redirectUri) : this.pollPopup(popupWindow, redirectUri); + } + + private eventListener(popupWindow: Window, redirectUri = getWindowOrigin()) { + if (!popupWindow) { + throw new Error('Popup was not created'); + } + return merge( + fromEvent(popupWindow, 'exit').pipe( + delay(100), + map(() => { + throw new Error('Authentication Canceled'); + }) + ), + fromEvent(popupWindow, 'loadstart') + ).pipe( + switchMap((event: Event & { url: string }) => { + if (!popupWindow || popupWindow.closed) { + return Observable.throw(new Error('Authentication Canceled')); + } + if (event.url.indexOf(redirectUri) !== 0) { + return empty(); + } + + const parser = document.createElement('a'); + parser.href = event.url; + + if (parser.search || parser.hash) { + const queryParams = parser.search.substring(1).replace(/\/$/, ''); + const hashParams = parser.hash.substring(1).replace(/\/$/, ''); + const hash = this.parseQueryString(hashParams); + const qs = this.parseQueryString(queryParams); + const allParams = { ...qs, ...hash }; + + popupWindow.close(); + + if (allParams.error) { + throw allParams.error; + } else { + return of(allParams); + } + } + return empty(); + }), + take(1) + ); + } + + private pollPopup(popupWindow: Window, redirectUri = getWindowOrigin()) { + return interval(50).pipe( + switchMap(() => { + if (!popupWindow || popupWindow.closed) { + return throwError(new Error('Authentication Canceled')); + } + + const popupWindowOrigin = getWindowOrigin(popupWindow); + + if ( + popupWindowOrigin && + (redirectUri.indexOf(popupWindowOrigin) === 0 || popupWindowOrigin.indexOf(redirectUri) === 0) && + (popupWindow.location.search || popupWindow.location.hash) + ) { + const queryParams = popupWindow.location.search.substring(1).replace(/\/$/, ''); + const hashParams = popupWindow.location.hash.substring(1).replace(/[\/$]/, ''); + const hash = this.parseQueryString(hashParams); + const qs = this.parseQueryString(queryParams); + popupWindow.close(); + const allParams = { ...qs, ...hash }; + if (allParams.error) { + throw allParams.error; + } else { + return of(allParams); + } + } + return empty(); + }), + take(1) + ); + } + + private prepareOptions(options?: IPopupOptions) { + options = options || {}; + const width = options.width || 500; + const height = options.height || 500; + return { + width, + height, + left: window.screenX + (window.outerWidth - width) / 2, + top: window.screenY + (window.outerHeight - height) / 2.5, + toolbar: options.visibleToolbar ? 'yes' : 'no', + ...options, + }; + } + + private stringifyOptions(options: { [index: string]: string | number | boolean | null | undefined }) { + return Object.keys(options) + .map((key) => (options[key] === null || options[key] === undefined ? key : key + '=' + options[key])) + .join(','); + } + + private parseQueryString(joinedKeyValue: string): any { + let key; + let value; + return joinedKeyValue.split('&').reduce((obj, keyValue) => { + if (keyValue) { + value = keyValue.split('='); + key = decodeURIComponent(value[0]); + obj[key] = typeof value[1] !== 'undefined' ? decodeURIComponent(value[1]) : true; + } + return obj; + }, {} as { [k: string]: string | true }); + } + + private isCordovaApp() { + return typeof cordova === 'object' || (document.URL.indexOf('http://') === -1 && document.URL.indexOf('https://') === -1); + } +} diff --git a/src/app/ng2-ui-auth/lib/shared.service.spec.ts b/src/app/ng2-ui-auth/lib/shared.service.spec.ts new file mode 100644 index 0000000000..bc8e08f201 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/shared.service.spec.ts @@ -0,0 +1,36 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { TestBed, inject } from '@angular/core/testing'; +import { CONFIG_OPTIONS, ConfigService } from './config.service'; + +import { SharedService } from './shared.service'; +import { StorageService } from './storage-service'; + +describe('SharedService', () => { + beforeEach(() => { + TestBed.configureTestingModule({ + providers: [SharedService, StorageService, ConfigService, { provide: CONFIG_OPTIONS, useValue: {} }], + }); + }); + + it('should be created', inject([SharedService], (service: SharedService) => { + expect(service).toBeTruthy(); + })); +}); diff --git a/src/app/ng2-ui-auth/lib/shared.service.ts b/src/app/ng2-ui-auth/lib/shared.service.ts new file mode 100644 index 0000000000..b0eb5807ab --- /dev/null +++ b/src/app/ng2-ui-auth/lib/shared.service.ts @@ -0,0 +1,132 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { Injectable } from '@angular/core'; +import { StorageType } from './storage-type.enum'; +import { Subscriber, Observable } from 'rxjs'; +import { StorageService } from './storage-service'; +import { ConfigService } from './config.service'; + +@Injectable() +export class SharedService { + public tokenName = this.config.options.tokenPrefix + ? [this.config.options.tokenPrefix, this.config.options.tokenName].join(this.config.options.tokenSeparator) + : this.config.options.tokenName; + + constructor(private storage: StorageService, private config: ConfigService) {} + + public getToken() { + return this.storage.get(this.tokenName); + } + + public getPayload(token = this.getToken()) { + if (token && token.split('.').length === 3) { + try { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + return JSON.parse(this.b64DecodeUnicode(base64)); + } catch (e) { + return undefined; + } + } + } + + public setToken(response: string | object) { + if (!response) { + // console.warn('Can\'t set token without passing a value'); + return; + } + + let token: string; + if (typeof response === 'string') { + token = response; + } else { + token = this.config.options.resolveToken(response, this.config.options); + } + + if (token) { + const expDate = this.getExpirationDate(token); + this.storage.set(this.tokenName, token, expDate ? expDate.toUTCString() : ''); + } + } + + public removeToken() { + this.storage.remove(this.tokenName); + } + + public isAuthenticated(token = this.getToken()) { + // a token is present + if (token) { + // token with a valid JWT format XXX.YYY.ZZZ + if (token.split('.').length === 3) { + // could be a valid JWT or an access token with the same format + try { + const base64Url = token.split('.')[1]; + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/'); + const exp = JSON.parse(this.b64DecodeUnicode(base64)).exp; + // jwt with an optional expiration claims + if (exp) { + const isExpired = Math.round(new Date().getTime() / 1000) >= exp; + if (isExpired) { + // fail: Expired token + this.storage.remove(this.tokenName); + return false; + } else { + // pass: Non-expired token + return true; + } + } + } catch (e) { + // pass: Non-JWT token that looks like JWT + return true; + } + } + // pass: All other tokens + return true; + } + // lail: No token at all + return false; + } + + public getExpirationDate(token = this.getToken()) { + const payload = this.getPayload(token); + if (payload && payload.exp && Math.round(new Date().getTime() / 1000) < payload.exp) { + const date = new Date(0); + date.setUTCSeconds(payload.exp); + return date; + } + return null; + } + + public logout(): Observable { + return Observable.create((observer: Subscriber) => { + this.storage.remove(this.tokenName); + observer.next(); + observer.complete(); + }); + } + + public setStorageType(type: StorageType) { + return this.storage.updateStorageType(type); + } + + private b64DecodeUnicode(str) { + return decodeURIComponent(Array.prototype.map.call(atob(str), (c) => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)).join('')); + } +} diff --git a/src/app/ng2-ui-auth/lib/storage-service.ts b/src/app/ng2-ui-auth/lib/storage-service.ts new file mode 100644 index 0000000000..dd2826cdd0 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/storage-service.ts @@ -0,0 +1,11 @@ +import { StorageType } from './storage-type.enum'; + +export abstract class StorageService { + abstract updateStorageType(storageType: StorageType): boolean; + + abstract get(key: string): string; + + abstract set(key: string, value: string, date: string): void; + + abstract remove(key: string): void; +} diff --git a/src/app/ng2-ui-auth/lib/storage-type.enum.ts b/src/app/ng2-ui-auth/lib/storage-type.enum.ts new file mode 100644 index 0000000000..33d5b338e2 --- /dev/null +++ b/src/app/ng2-ui-auth/lib/storage-type.enum.ts @@ -0,0 +1,27 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +export enum StorageType { + NONE = 'none', + MEMORY = 'memory', + LOCAL_STORAGE = 'localStorage', + SESSION_STORAGE = 'sessionStorage', + COOKIE = 'cookie', + SESSION_COOKIE = 'sessionCookie', +} diff --git a/src/app/ng2-ui-auth/lib/utils.ts b/src/app/ng2-ui-auth/lib/utils.ts new file mode 100644 index 0000000000..c4c82f254c --- /dev/null +++ b/src/app/ng2-ui-auth/lib/utils.ts @@ -0,0 +1,59 @@ +/* + * + * Copyright 2024 OICR and UCSC + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + * + */ + +import { HttpHeaders, HttpParams } from '@angular/common/http'; + +/** + * Created by Ron on 17/12/2015. + */ + +export function joinUrl(baseUrl: string, url: string) { + if (/^(?:[a-z]+:)?\/\//i.test(url)) { + return url; + } + + const joined = [baseUrl, url].join('/'); + + return joined.replace(/[\/]+/g, '/').replace(/\/\?/g, '?').replace(/\/\#/g, '#').replace(/\:\//g, '://'); +} + +export function buildQueryString(obj: object) { + return Object.keys(obj) + .map((key) => (!!obj[key] ? `${encodeURIComponent(key)}=${encodeURIComponent(obj[key])}` : key)) + .join('&'); +} + +export function getWindowOrigin(w?: Window) { + if (!w && typeof window !== 'undefined') { + w = window; + } + try { + if (!w || !w.location) { + return null; + } + if (!w.location.origin) { + return `${w.location.protocol}//${w.location.hostname}${w.location.port ? ':' + w.location.port : ''}`; + } + return w.location.origin; + } catch (error) { + return null; + // ignore DOMException: Blocked a frame with origin from accessing a cross-origin frame. + // error instanceof DOMException && error.name === 'SecurityError' + } +} diff --git a/src/app/ng2-ui-auth/public_api.ts b/src/app/ng2-ui-auth/public_api.ts new file mode 100644 index 0000000000..7bfed7f6da --- /dev/null +++ b/src/app/ng2-ui-auth/public_api.ts @@ -0,0 +1,35 @@ +import { Ng2UiAuthModule } from './lib/ng2-ui-auth.module'; +import { LocalService } from './lib/local.service'; +import { Oauth2Service } from './lib/oauth2.service'; +import { Oauth1Service } from './lib/oauth1.service'; +import { PopupService } from './lib/popup.service'; +import { OauthService } from './lib/oauth.service'; +import { SharedService } from './lib/shared.service'; +import { StorageService } from './lib/storage-service'; +import { BrowserStorageService } from './lib/browser-storage.service'; +import { AuthService } from './lib/auth.service'; +import { ConfigService, CONFIG_OPTIONS } from './lib/config.service'; +import { JwtInterceptor } from './lib/interceptor.service'; +import { IProviders } from './lib/config-interfaces'; +import { StorageType } from './lib/storage-type.enum'; + +/* + * Public API Surface of ng2-ui-auth + */ +export { + Ng2UiAuthModule, + LocalService, + Oauth2Service, + Oauth1Service, + PopupService, + OauthService, + SharedService, + StorageService, + BrowserStorageService, + AuthService, + ConfigService, + JwtInterceptor, + CONFIG_OPTIONS, + IProviders, + StorageType, +}; diff --git a/src/app/ng2-ui-auth/test.ts b/src/app/ng2-ui-auth/test.ts new file mode 100644 index 0000000000..a7f794a86a --- /dev/null +++ b/src/app/ng2-ui-auth/test.ts @@ -0,0 +1,16 @@ +// This file is required by karma.conf.js and loads recursively all the .spec and framework files + +import { getTestBed } from '@angular/core/testing'; +import { BrowserDynamicTestingModule, platformBrowserDynamicTesting } from '@angular/platform-browser-dynamic/testing'; +import 'core-js/es7/reflect'; +import 'zone.js/dist/zone'; +import 'zone.js/dist/zone-testing'; + +declare const require: any; + +// First, initialize the Angular testing environment. +getTestBed().initTestEnvironment(BrowserDynamicTestingModule, platformBrowserDynamicTesting()); +// Then we find all the tests. +const context = require.context('./', true, /\.spec\.ts$/); +// And load the modules. +context.keys().map(context); diff --git a/src/app/register/register.service.spec.ts b/src/app/register/register.service.spec.ts index 92c00eaa58..f310f09609 100644 --- a/src/app/register/register.service.spec.ts +++ b/src/app/register/register.service.spec.ts @@ -16,7 +16,7 @@ import { inject, TestBed } from '@angular/core/testing'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; -import { AuthService } from 'ng2-ui-auth'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AuthStubService } from '../test/service-stubs'; import { RegisterService } from './register.service'; diff --git a/src/app/register/register.service.ts b/src/app/register/register.service.ts index 260e05ba20..5348f9eec8 100644 --- a/src/app/register/register.service.ts +++ b/src/app/register/register.service.ts @@ -16,8 +16,8 @@ import { HttpErrorResponse } from '@angular/common/http'; import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { Observable } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { AlertService } from '../shared/alert/state/alert.service'; @Injectable() diff --git a/src/app/shared/auth.guard.ts b/src/app/shared/auth.guard.ts index faef9bf4e4..9d61feb9ea 100644 --- a/src/app/shared/auth.guard.ts +++ b/src/app/shared/auth.guard.ts @@ -16,9 +16,9 @@ import { Injectable } from '@angular/core'; import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; import { of } from 'rxjs/internal/observable/of'; import { catchError, map } from 'rxjs/operators'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { LogoutService } from './logout.service'; import { UsersService } from './openapi'; diff --git a/src/app/shared/auth.model.ts b/src/app/shared/auth.model.ts index 7f9a9ed231..cba4e6cb15 100644 --- a/src/app/shared/auth.model.ts +++ b/src/app/shared/auth.model.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { IPartialConfigOptions } from 'ng2-ui-auth/lib/config-interfaces'; +import { IPartialConfigOptions } from '../ng2-ui-auth/lib/config-interfaces'; import { Dockstore } from '../shared/dockstore.model'; export const AuthConfig: IPartialConfigOptions = { diff --git a/src/app/shared/my-entry.ts b/src/app/shared/my-entry.ts index d080c3d725..b980ef674f 100644 --- a/src/app/shared/my-entry.ts +++ b/src/app/shared/my-entry.ts @@ -15,10 +15,10 @@ */ import { Injectable, OnDestroy } from '@angular/core'; import { ActivatedRoute } from '@angular/router'; -import { AuthService } from 'ng2-ui-auth'; import { Observable, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { AccountsService } from '../loginComponents/accounts/external/accounts.service'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { Base } from './base'; import { TokenSource } from './enum/token-source.enum'; import { ExtendedDockstoreTool } from './models/ExtendedDockstoreTool'; diff --git a/src/app/shared/track-login.service.ts b/src/app/shared/track-login.service.ts index d6073e8161..fc5ed30ed1 100644 --- a/src/app/shared/track-login.service.ts +++ b/src/app/shared/track-login.service.ts @@ -15,8 +15,8 @@ */ import { Injectable } from '@angular/core'; -import { AuthService } from 'ng2-ui-auth'; import { BehaviorSubject, Subject } from 'rxjs'; +import { AuthService } from '../ng2-ui-auth/public_api'; @Injectable() export class TrackLoginService { diff --git a/src/app/shared/user/user.service.ts b/src/app/shared/user/user.service.ts index 094a27d0d6..0b4b753a43 100644 --- a/src/app/shared/user/user.service.ts +++ b/src/app/shared/user/user.service.ts @@ -1,8 +1,8 @@ import { Injectable } from '@angular/core'; import { Router } from '@angular/router'; import { transaction } from '@datorama/akita'; -import { AuthService } from 'ng2-ui-auth'; import { GravatarService } from '../../gravatar/gravatar.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertService } from '../alert/state/alert.service'; import { TokenService } from '../state/token.service'; import { WorkflowService } from '../state/workflow.service'; diff --git a/src/app/starredentries/starredentries.component.spec.ts b/src/app/starredentries/starredentries.component.spec.ts index aa3dcc549a..cabd65bd1b 100644 --- a/src/app/starredentries/starredentries.component.spec.ts +++ b/src/app/starredentries/starredentries.component.spec.ts @@ -5,9 +5,9 @@ import { MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { NoopAnimationsModule } from '@angular/platform-browser/animations'; import { RouterTestingModule } from '@angular/router/testing'; -import { AuthService } from 'ng2-ui-auth'; import { MytoolsService } from '../mytools/mytools.service'; import { MyWorkflowsService } from '../myworkflows/myworkflows.service'; +import { AuthService } from '../ng2-ui-auth/public_api'; import { ContainerService } from '../shared/container.service'; import { DateService } from '../shared/date.service'; import { DescriptorLanguageService } from '../shared/entry/descriptor-language.service'; diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts index 406e720086..d5663296d0 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts @@ -6,8 +6,8 @@ import { MatLegacyCommonModule } from '@angular/material/legacy-core'; import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; -import { AuthService } from 'ng2-ui-auth'; import { AccountsService } from '../../loginComponents/accounts/external/accounts.service'; +import { AuthService } from '../../ng2-ui-auth/public_api'; import { DateService } from '../../shared/date.service'; import { ProviderService } from '../../shared/provider.service'; import { AccountsStubService, AuthStubService, DateStubService } from '../../test/service-stubs'; diff --git a/src/main.ts b/src/main.ts index c4814b4e37..886e097f86 100644 --- a/src/main.ts +++ b/src/main.ts @@ -14,7 +14,6 @@ import { enableAkitaProdMode } from '@datorama/akita'; import { AkitaNgDevtools } from '@datorama/akita-ngdevtools'; import { FontAwesomeModule } from '@fortawesome/angular-fontawesome'; import { FlexLayoutModule } from '@ngbracket/ngx-layout'; -import { AuthService, Ng2UiAuthModule } from 'ng2-ui-auth'; import { MarkdownModule } from 'ngx-markdown'; import { NgxMatSelectSearchModule } from 'ngx-mat-select-search'; import { AppComponent } from './app/app.component'; @@ -23,10 +22,10 @@ import { getApiConfig, initializerFactory, myCustomSnackbarDefaults, myCustomToo import { CLIENT_ROUTER_PROVIDERS, routing } from './app/app.routing'; import { ConfigurationService } from './app/configuration.service'; import { EmailService } from './app/container/email.service'; +import { InfoTabService as ContainerInfoTabService } from './app/container/info-tab/info-tab.service'; import { ToolLaunchService } from './app/container/launch/tool-launch.service'; import { ParamfilesService } from './app/container/paramfiles/paramfiles.service'; import { RegisterToolService } from './app/container/register-tool/register-tool.service'; -import { InfoTabService as ContainerInfoTabService } from './app/container/info-tab/info-tab.service'; import { VersionModalService as ContainerVersionModalService } from './app/container/version-modal/version-modal.service'; import { ListContainersService } from './app/containers/list/list.service'; import { EntryTypeMetadataService } from './app/entry/type-metadata/entry-type-metadata.service'; @@ -36,6 +35,8 @@ import { LoginService } from './app/login/login.service'; import { AccountsService } from './app/loginComponents/accounts/external/accounts.service'; import { MytoolsService } from './app/mytools/mytools.service'; import { MyWorkflowsService } from './app/myworkflows/myworkflows.service'; +import { CONFIG_OPTIONS, ConfigService } from './app/ng2-ui-auth/lib/config.service'; +import { Ng2UiAuthModule } from './app/ng2-ui-auth/public_api'; import { OrganizationStargazersModule } from './app/organizations/organization/organization-stargazers/organization-stargazers.module'; import { OrganizationStarringModule } from './app/organizations/organization/organization-starring/organization-starring.module'; import { RegisterService } from './app/register/register.service'; @@ -92,7 +93,6 @@ bootstrapApplication(AppComponent, { FormsModule, MatLegacyDialogModule, MatLegacySnackBarModule, - Ng2UiAuthModule.forRoot(AuthConfig), ClipboardModule, FlexLayoutModule, StarringModule, @@ -105,10 +105,10 @@ bootstrapApplication(AppComponent, { ReactiveFormsModule, ApiModule.forRoot(getApiConfig), ApiModule2.forRoot(getApiConfig), - PipeModule + PipeModule, + Ng2UiAuthModule.forRoot(AuthConfig) ), AccountsService, - AuthService, BioschemaService, CLIENT_ROUTER_PROVIDERS, ConfigurationService, From 7739200a8fd8bfad67dcb58912d05b066f4f687e Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Tue, 16 Jul 2024 14:42:58 -0400 Subject: [PATCH 57/98] Use Chrome browser for Cypress tests to reduce flakiness and remove scrollIntoView (#1991) * cypress supposedly should automatically scroll these into view * Remove click before type * Check visible before typing * Run chrome browser * Clear before typing * Match my workflows * More matching * Last matching attempt. myworkflows.ts has not flaked once! * Remove extra wait --- .circleci/config.yml | 2 +- cypress/e2e/group2/myworkflows.ts | 3 --- cypress/e2e/group3/mytools.ts | 32 ++++++++++++++++++++----------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 7fbac9691d..f39ed4b04c 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -191,7 +191,7 @@ jobs: - setup_integration_test - run: name: Test - command: bash -i -c 'npx cypress run --record --config numTestsKeptInMemory=1 --reporter junit --spec cypress/e2e/<< parameters.integration_test_name >>/**/*' + command: bash -i -c 'npx cypress run --browser chrome --record --config numTestsKeptInMemory=1 --reporter junit --spec cypress/e2e/<< parameters.integration_test_name >>/**/*' no_output_timeout: 30m environment: MOCHA_FILE: integration-tests/test-results/junit/test-results-[hash].xml diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index b989d4c042..53c8d386e1 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -575,15 +575,12 @@ describe('Dockstore my workflows part 3', () => { cy.wait(1000); cy.get('#2-register-workflow-option').click(); cy.contains('button', 'Next').click(); - cy.wait(2000); // Give animation a chance to kick in. // Untouched form should not have errors but is disabled cy.get('#submitButton').should('be.disabled'); notHaveAlert(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); cy.get('#sourceCodeRepositoryInput').clear(); cy.get('#sourceCodeRepositoryInput').type('beef/stew'); cy.get('#submitButton').should('be.disabled'); - cy.get('#sourceCodeRepositoryWorkflowPathInput').scrollIntoView().should('be.visible'); cy.get('#sourceCodeRepositoryWorkflowPathInput').clear(); cy.get('#sourceCodeRepositoryWorkflowPathInput').type('/Dockstore.cwl'); notHaveAlert(); diff --git a/cypress/e2e/group3/mytools.ts b/cypress/e2e/group3/mytools.ts index 28033135bf..45f2a8c884 100644 --- a/cypress/e2e/group3/mytools.ts +++ b/cypress/e2e/group3/mytools.ts @@ -285,12 +285,15 @@ describe('Dockstore my tools', () => { // Make sure page is loaded first cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); - cy.wait(2000); // Give animation a chance to kick in. + // TODO: Fix this. When 'Next' is clicked too fast, the next step is empty + cy.wait(1000); cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); - cy.get('.modal-footer').contains('Next').first().click(); + cy.contains('button', 'Next').click(); - cy.get('#sourceCodeRepositoryInput').scrollIntoView().should('be.visible'); - cy.get('#sourceCodeRepositoryInput').click(); + // Untouched form should not have errors but is disabled + cy.get('#submitButton').should('be.disabled'); + cy.get('.mat-error').should('not.exist'); + cy.get('#sourceCodeRepositoryInput').clear(); cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); @@ -350,11 +353,15 @@ describe('Dockstore my tools', () => { // Make sure page is loaded first cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); + // TODO: Fix this. When 'Next' is clicked too fast, the next step is empty + cy.wait(1000); cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); - cy.wait(2000); // Give animation a chance to kick in. - cy.get('.modal-footer').contains('Next').first().click(); + cy.contains('button', 'Next').click(); - cy.get('#sourceCodeRepositoryInput').click(); + // Untouched form should not have errors but is disabled + cy.get('#submitButton').should('be.disabled'); + cy.get('.mat-error').should('not.exist'); + cy.get('#sourceCodeRepositoryInput').clear(); cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); @@ -458,11 +465,15 @@ describe('Dockstore my tools', () => { }); cy.get('#tool-path').should('be.visible'); cy.get('#register_tool_button').click(); + // TODO: Fix this. When 'Next' is clicked too fast, the next step is empty + cy.wait(1000); cy.contains('Create tool with descriptor(s) on remote sites').should('be.visible').click(); - cy.wait(2000); // Give animation a chance to kick in. - cy.get('.modal-footer').contains('Next').first().click(); + cy.contains('button', 'Next').click(); - cy.get('#sourceCodeRepositoryInput').click(); + // Untouched form should not have errors but is disabled + cy.get('#submitButton').should('be.disabled'); + cy.get('.mat-error').should('not.exist'); + cy.get('#sourceCodeRepositoryInput').clear(); cy.get('#sourceCodeRepositoryInput').type('testnamespace/testname'); cy.get('[data-cy=imageRegistryProviderSelect]').click(); @@ -473,7 +484,6 @@ describe('Dockstore my tools', () => { cy.get('#imageRegistryInput').type('testnamespace/testname'); - cy.get('#submitButton').scrollIntoView().should('be.enabled'); cy.get('#submitButton').click(); // TODO: This is temporarily disabled From e1c01ab76be1a1dae2f1e74d85fdd69aacfc4a4d Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Thu, 18 Jul 2024 10:59:20 -0700 Subject: [PATCH 58/98] Upgrade to Angular 16 (#1993) --- .eslintrc.json | 3 + THIRD-PARTY-LICENSES.csv | 136 +- package-lock.json | 13637 +++++++++------- package.json | 51 +- .../mytools/my-tool/my-tool.component.html | 2 +- src/app/mytools/my-tool/my-tool.component.ts | 1 + .../my-workflow/my-workflow.component.html | 2 +- .../organization/organization.component.html | 2 +- src/app/shared/auth.guard.ts | 4 +- src/app/shared/entry.ts | 3 +- src/main.ts | 2 + 11 files changed, 7890 insertions(+), 5953 deletions(-) diff --git a/.eslintrc.json b/.eslintrc.json index 1e4624e68a..dd3eb9c9f3 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -19,6 +19,9 @@ "plugin:@angular-eslint/recommended", "plugin:@angular-eslint/template/process-inline-templates" ], + "plugins": [ + "@typescript-eslint" + ], "rules": { "@angular-eslint/component-selector": [ "error", diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 3fe31a482b..bb7d58c23d 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -1,80 +1,80 @@ "module name","license","repository" "@angular-devkit/core@8.3.29","MIT","https://github.com/angular/angular-cli" "@angular-devkit/schematics@8.3.29","MIT","https://github.com/angular/angular-cli" -"@angular/animations@15.2.10","MIT","https://github.com/angular/angular" -"@angular/cdk@15.2.9","MIT","https://github.com/angular/components" -"@angular/common@15.2.10","MIT","https://github.com/angular/angular" -"@angular/compiler@15.2.10","MIT","https://github.com/angular/angular" -"@angular/core@15.2.10","MIT","https://github.com/angular/angular" -"@angular/forms@15.2.10","MIT","https://github.com/angular/angular" -"@angular/material@15.2.9","MIT","https://github.com/angular/components" -"@angular/platform-browser-dynamic@15.2.10","MIT","https://github.com/angular/angular" -"@angular/platform-browser@15.2.10","MIT","https://github.com/angular/angular" -"@angular/router@15.2.10","MIT","https://github.com/angular/angular" +"@angular/animations@16.2.12","MIT","https://github.com/angular/angular" +"@angular/cdk@16.2.14","MIT","https://github.com/angular/components" +"@angular/common@16.2.12","MIT","https://github.com/angular/angular" +"@angular/compiler@16.2.12","MIT","https://github.com/angular/angular" +"@angular/core@16.2.12","MIT","https://github.com/angular/angular" +"@angular/forms@16.2.12","MIT","https://github.com/angular/angular" +"@angular/material@16.2.14","MIT","https://github.com/angular/components" +"@angular/platform-browser-dynamic@16.2.12","MIT","https://github.com/angular/angular" +"@angular/platform-browser@16.2.12","MIT","https://github.com/angular/angular" +"@angular/router@16.2.12","MIT","https://github.com/angular/angular" "@braintree/sanitize-url@6.0.2","MIT","https://github.com/braintree/sanitize-url" "@datorama/akita@7.1.1","Apache-2.0","https://github.com/datorama/akita" -"@fortawesome/angular-fontawesome@0.12.1","MIT","https://github.com/FortAwesome/angular-fontawesome" +"@fortawesome/angular-fontawesome@0.13.0","MIT","https://github.com/FortAwesome/angular-fontawesome" "@fortawesome/fontawesome-common-types@0.3.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/fontawesome-common-types@6.2.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/fontawesome-svg-core@6.2.0","MIT","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/free-brands-svg-icons@6.0.0","(CC-BY-4.0 AND MIT)","https://github.com/FortAwesome/Font-Awesome" "@fortawesome/free-solid-svg-icons@6.0.0","(CC-BY-4.0 AND MIT)","https://github.com/FortAwesome/Font-Awesome" -"@material/animation@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/auto-init@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/banner@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/base@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/button@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/card@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/checkbox@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/chips@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/circular-progress@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/data-table@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/density@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/dialog@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/dom@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/drawer@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/elevation@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/fab@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/feature-targeting@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/floating-label@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/focus-ring@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/form-field@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/icon-button@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/image-list@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/layout-grid@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/line-ripple@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/linear-progress@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/list@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/menu-surface@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/menu@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/notched-outline@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/progress-indicator@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/radio@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/ripple@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/rtl@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/segmented-button@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/select@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/shape@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/slider@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/snackbar@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/switch@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tab-bar@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tab-indicator@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tab-scroller@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tab@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/textfield@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/theme@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tokens@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/tooltip@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/top-app-bar@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/touch-target@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" -"@material/typography@15.0.0-canary.684e33d25.0","MIT","https://github.com/material-components/material-components-web" +"@material/animation@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/auto-init@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/banner@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/base@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/card@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/checkbox@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/chips@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/circular-progress@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/data-table@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/density@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/dialog@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/dom@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/drawer@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/elevation@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/fab@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/feature-targeting@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/floating-label@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/focus-ring@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/form-field@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/icon-button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/image-list@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/layout-grid@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/line-ripple@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/linear-progress@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/list@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/menu-surface@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/menu@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/notched-outline@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/progress-indicator@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/radio@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/ripple@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/rtl@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/segmented-button@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/select@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/shape@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/slider@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/snackbar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/switch@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-bar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-indicator@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab-scroller@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tab@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/textfield@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/theme@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tokens@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/tooltip@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/top-app-bar@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/touch-target@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" +"@material/typography@15.0.0-canary.bc9ae6c9c.0","MIT","https://github.com/material-components/material-components-web" "@ngbracket/ngx-layout@15.1.3","MIT","https://github.com/ngbracket/ngx-layout" "@ngneat/forms-manager@2.5.0","MIT","" "@popperjs/core@2.11.2","MIT","https://github.com/popperjs/popper-core" "@schematics/angular@8.3.29","MIT","https://github.com/angular/angular-cli" "@schematics/update@0.803.29","MIT","https://github.com/angular/angular-cli" -"@types/marked@4.0.7","MIT","https://github.com/DefinitelyTyped/DefinitelyTyped" +"@types/marked@4.3.2","MIT","https://github.com/DefinitelyTyped/DefinitelyTyped" "@yarnpkg/lockfile@1.1.0","BSD-2-Clause","https://github.com/yarnpkg/yarn/blob/master/packages/lockfile" "JSONStream@1.3.5","(MIT OR Apache-2.0)","https://github.com/dominictarr/JSONStream" "academicons@1.9.1","OFL-1.1","https://github.com/jpswalsh/academicons" @@ -83,7 +83,7 @@ "agent-base@4.3.0","MIT","https://github.com/TooTallNate/node-agent-base" "agentkeepalive@3.5.2","MIT","https://github.com/node-modules/agentkeepalive" "ajv@6.12.3","MIT","https://github.com/ajv-validator/ajv" -"angular-tag-cloud-module@14.0.0","MIT*","https://github.com/d-koppenhagen/angular-tag-cloud-module" +"angular-tag-cloud-module@16.0.0","MIT","https://github.com/d-koppenhagen/angular-tag-cloud-module" "aproba@1.2.0","ISC","https://github.com/iarna/aproba" "balanced-match@1.0.2","MIT","https://github.com/juliangruber/balanced-match" "bluebird@3.7.2","MIT","https://github.com/petkaantonov/bluebird" @@ -202,7 +202,7 @@ "lru-cache@5.1.1","ISC","https://github.com/isaacs/node-lru-cache" "magic-string@0.25.3","MIT","https://github.com/rich-harris/magic-string" "make-fetch-happen@5.0.2","ISC","https://github.com/zkat/make-fetch-happen" -"marked@4.2.3","MIT","https://github.com/markedjs/marked" +"marked@4.3.0","MIT","https://github.com/markedjs/marked" "material-design-icons-iconfont@6.1.1","Apache-2.0","https://github.com/jossef/material-design-icons-iconfont" "mathjax@3.2.2","Apache-2.0","https://github.com/mathjax/MathJax" "mermaid@9.3.0","MIT","https://github.com/mermaid-js/mermaid" @@ -216,7 +216,7 @@ "move-concurrently@1.0.1","ISC","https://github.com/npm/move-concurrently" "ms@2.0.0","MIT","https://github.com/zeit/ms" "ms@2.1.2","MIT","https://github.com/zeit/ms" -"ngx-markdown@15.1.2","MIT","https://github.com/jfcere/ngx-markdown" +"ngx-markdown@16.0.0","MIT","https://github.com/jfcere/ngx-markdown" "ngx-mat-select-search@6.0.0","MIT","https://github.com/bithost-gmbh/ngx-mat-select-search" "ngx-sharebuttons@8.1.0","MIT","https://github.com/murhafsousli/ngx-sharebuttons" "node-fetch-npm@2.0.4","MIT","https://github.com/npm/node-fetch-npm" @@ -248,7 +248,7 @@ "pumpify@1.5.1","MIT","https://github.com/mafintosh/pumpify" "punycode@2.1.1","MIT","https://github.com/bestiejs/punycode.js" "readable-stream@2.3.7","MIT","https://github.com/nodejs/readable-stream" -"resolve@1.22.1","MIT","https://github.com/browserify/resolve" +"resolve@1.22.2","MIT","https://github.com/browserify/resolve" "retry@0.10.1","MIT","https://github.com/tim-kos/node-retry" "rimraf@2.7.1","ISC","https://github.com/isaacs/rimraf" "robust-predicates@3.0.1","Unlicense","https://github.com/mourner/robust-predicates" @@ -286,7 +286,7 @@ "tiny-emitter@2.1.0","MIT","https://github.com/scottcorgan/tiny-emitter" "ts-md5@1.2.11","MIT","https://github.com/cotag/ts-md5" "tslib@1.14.1","0BSD","https://github.com/Microsoft/tslib" -"tslib@2.5.0","0BSD","https://github.com/Microsoft/tslib" +"tslib@2.6.1","0BSD","https://github.com/Microsoft/tslib" "typedarray@0.0.6","MIT","https://github.com/substack/typedarray" "typescript@3.9.10","Apache-2.0","https://github.com/Microsoft/TypeScript" "unique-filename@1.1.1","ISC","https://github.com/iarna/unique-filename" @@ -302,4 +302,4 @@ "xtend@4.0.2","MIT","https://github.com/Raynos/xtend" "y18n@4.0.3","ISC","https://github.com/yargs/y18n" "yallist@3.1.1","ISC","https://github.com/isaacs/yallist" -"zone.js@0.11.4","MIT","https://github.com/angular/angular" +"zone.js@0.13.3","MIT","https://github.com/angular/angular" diff --git a/package-lock.json b/package-lock.json index 88fc1e0ada..45abda5ba1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,18 +10,18 @@ "hasInstallScript": true, "license": "Apache License 2.0", "dependencies": { - "@angular/animations": "^15.2.10", - "@angular/cdk": "^15.2.9", - "@angular/common": "^15.2.10", - "@angular/compiler": "^15.2.10", - "@angular/core": "^15.2.10", - "@angular/forms": "^15.2.10", - "@angular/material": "^15.2.9", - "@angular/platform-browser": "^15.2.10", - "@angular/platform-browser-dynamic": "^15.2.10", - "@angular/router": "^15.2.10", + "@angular/animations": "^16.2.12", + "@angular/cdk": "^16.2.14", + "@angular/common": "^16.2.12", + "@angular/compiler": "^16.2.12", + "@angular/core": "^16.2.12", + "@angular/forms": "^16.2.12", + "@angular/material": "^16.2.14", + "@angular/platform-browser": "^16.2.12", + "@angular/platform-browser-dynamic": "^16.2.12", + "@angular/router": "^16.2.12", "@datorama/akita": "^7.0.0", - "@fortawesome/angular-fontawesome": "^0.12.1", + "@fortawesome/angular-fontawesome": "^0.13.0", "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", @@ -29,7 +29,7 @@ "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", - "angular-tag-cloud-module": "^14.0.0", + "angular-tag-cloud-module": "^16.0.0", "bodybuilder": "^2.4.0", "bootstrap": "^3.4.1", "cytoscape": "^3.19.0", @@ -41,7 +41,7 @@ "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ngx-markdown": "^15.1.2", + "ngx-markdown": "^16.0.0", "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", "prismjs": "^1.29.0", @@ -49,18 +49,18 @@ "ts-md5": "^1.2.8", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "~0.11.4" + "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^15.2.10", - "@angular-eslint/builder": "^15.2.1", - "@angular-eslint/eslint-plugin": "^15.2.1", - "@angular-eslint/eslint-plugin-template": "^15.2.1", - "@angular-eslint/schematics": "15.2.1", + "@angular-devkit/build-angular": "^16.2.14", + "@angular-eslint/builder": "^16.3.1", + "@angular-eslint/eslint-plugin": "^16.3.1", + "@angular-eslint/eslint-plugin-template": "^16.3.1", + "@angular-eslint/schematics": "^16.3.1", "@angular-eslint/template-parser": "^15.2.1", - "@angular/cli": "^15.2.10", - "@angular/compiler-cli": "^15.2.10", - "@angular/language-service": "^15.2.10", + "@angular/cli": "^16.2.14", + "@angular/compiler-cli": "^16.2.12", + "@angular/language-service": "^16.2.12", "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", "@cypress/webpack-preprocessor": "^5.17.1", "@datorama/akita-ngdevtools": "^7.0.0", @@ -68,7 +68,7 @@ "@types/elasticsearch": "^5.0.37", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", - "@types/node": "^15.12.2", + "@types/node": "^18.19.39", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "cypress": "^13.7.2", @@ -85,16 +85,16 @@ "pa11y-ci": "^3.0.1", "prettier": "^2.3.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^4.9.5" } }, "node_modules/@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "dependencies": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" }, "engines": { @@ -102,54 +102,64 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1502.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.10.tgz", - "integrity": "sha512-S8lN73WYCfpEpw1Q41ZcUinw7JfDeSM8LyGs797OVshnW75QcOkOecWj/3CKR23G44IgFrHN6sqtzWxKmMxLig==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.2.10", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/architect/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/build-angular": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.10.tgz", - "integrity": "sha512-3pCPVEJilVwHIJC6Su1/PIEqvFfU1Lxew9yItxX4s6dud8HY+fuKrsDnao4NNMFNqCLqL4el5QbSBKnnpWH1sg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1502.10", - "@angular-devkit/build-webpack": "0.1502.10", - "@angular-devkit/core": "15.2.10", - "@babel/core": "7.20.12", - "@babel/generator": "7.20.14", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/helper-split-export-declaration": "7.18.6", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", + "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/build-webpack": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.20.7", - "@babel/plugin-transform-runtime": "7.19.6", - "@babel/preset-env": "7.20.2", - "@babel/runtime": "7.20.13", - "@babel/template": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.2.10", + "@ngtools/webpack": "16.2.14", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.13", - "babel-loader": "9.1.2", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "4.21.5", - "cacache": "17.0.4", + "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.3", - "esbuild-wasm": "0.17.8", - "glob": "8.1.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -158,49 +168,54 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.29.0", - "mini-css-extract-plugin": "2.7.2", - "open": "8.4.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "piscina": "3.2.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", "postcss": "8.4.31", - "postcss-loader": "7.0.2", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.58.1", - "sass-loader": "13.2.0", - "semver": "7.5.3", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.16.3", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.0", - "webpack": "5.76.1", - "webpack-dev-middleware": "6.0.1", - "webpack-dev-server": "4.11.1", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.5.3", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "optionalDependencies": { - "esbuild": "0.17.8" + "esbuild": "0.18.17" }, "peerDependencies": { - "@angular/compiler-cli": "^15.0.0", - "@angular/localize": "^15.0.0", - "@angular/platform-server": "^15.0.0", - "@angular/service-worker": "^15.0.0", + "@angular/compiler-cli": "^16.0.0", + "@angular/localize": "^16.0.0", + "@angular/platform-server": "^16.0.0", + "@angular/service-worker": "^16.0.0", + "jest": "^29.5.0", + "jest-environment-jsdom": "^29.5.0", "karma": "^6.3.0", - "ng-packagr": "^15.0.0", + "ng-packagr": "^16.0.0", "protractor": "^7.0.0", "tailwindcss": "^2.0.0 || ^3.0.0", - "typescript": ">=4.8.2 <5.0" + "typescript": ">=4.9.3 <5.2" }, "peerDependenciesMeta": { "@angular/localize": { @@ -212,6 +227,12 @@ "@angular/service-worker": { "optional": true }, + "jest": { + "optional": true + }, + "jest-environment-jsdom": { + "optional": true + }, "karma": { "optional": true }, @@ -227,26 +248,26 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -265,28 +286,16 @@ "semver": "bin/semver.js" } }, - "node_modules/@angular-devkit/build-angular/node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "dependencies": { - "@babel/types": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@angular-devkit/build-angular/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -306,12 +315,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "dependencies": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" }, "engines": { @@ -322,32 +331,36 @@ "webpack": ">=5" } }, - "node_modules/@angular-devkit/build-angular/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "node_modules/@angular-devkit/build-angular/node_modules/find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "dependencies": { - "balanced-match": "^1.0.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@angular-devkit/build-angular/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "node_modules/@angular-devkit/build-angular/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=12" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/@angular-devkit/build-angular/node_modules/json-schema-traverse": { @@ -356,16 +369,82 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "node_modules/@angular-devkit/build-angular/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/@angular-devkit/build-angular/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "p-locate": "^6.0.0" }, "engines": { - "node": ">=10" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" } }, "node_modules/@angular-devkit/build-angular/node_modules/schema-utils": { @@ -388,9 +467,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -403,16 +482,16 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1502.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.10.tgz", - "integrity": "sha512-55b9WZIGU4DNgiIV2lkkN6iQxJrgWY5CDaNu0kJC/qazotJgBbcN/8jgBx2DD8HNE1V3iXxWk66pt1h946Po+Q==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", + "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1502.10", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1602.14", + "rxjs": "7.8.1" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -421,20 +500,30 @@ "webpack-dev-server": "^4.0.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/core": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.10.tgz", - "integrity": "sha512-bFPm7wjvfBds9km2rCJxUhzkqe4h3h/199yJtzC1bNvwRr2LMHvtyoQAzftda+gs7Ulqac5wzUEZX/cVV3WrsA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "dependencies": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", + "picomatch": "2.3.1", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, @@ -469,6 +558,15 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "node_modules/@angular-devkit/core/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-devkit/core/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -479,28 +577,41 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.10.tgz", - "integrity": "sha512-EeoDs4oKFpLZNa21G/8dqBdclEc4U2piI9EeXCVTaN6z5DYXIZ0G1WtCXU8nhD+GckS47rmfZ4/3lMaXAvED+g==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.2.10", + "@angular-devkit/core": "16.2.14", "jsonc-parser": "3.2.0", - "magic-string": "0.29.0", + "magic-string": "0.30.1", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, + "node_modules/@angular-devkit/schematics/node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/@angular-eslint/builder": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-15.2.1.tgz", - "integrity": "sha512-7x2DANebLRl997Mj4DhZrnz5+vnSjavGGveJ0mBuU7CEsL0ZYLftdRqL0e0HtU3ksseS7xpchD6OM08nkNgySw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1", + "nx": "16.5.1" + }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" @@ -513,13 +624,13 @@ "dev": true }, "node_modules/@angular-eslint/eslint-plugin": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.1.tgz", - "integrity": "sha512-OM7b1kS4E4CkXjkaWN+lEzawh4VxY6l7FO1Cuk4s7iv3/YpZG3rJxIZBqnFLTixwrBuqw8y4FNBzF3eDgmFAUw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "dependencies": { - "@angular-eslint/utils": "15.2.1", - "@typescript-eslint/utils": "5.48.2" + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", @@ -527,37 +638,45 @@ } }, "node_modules/@angular-eslint/eslint-plugin-template": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.1.tgz", - "integrity": "sha512-IeiSLk6YxapFdH2z5o/O3R7VwtBd2T6fWmhLFPwDYMDknrwegnOjwswCdBplOccpUp0wqlCeGUx7LTsuzwaz7w==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.2.1", - "@angular-eslint/utils": "15.2.1", - "@typescript-eslint/type-utils": "5.48.2", - "@typescript-eslint/utils": "5.48.2", - "aria-query": "5.1.3", - "axobject-query": "3.1.1" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/eslint-plugin-template/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + }, "node_modules/@angular-eslint/schematics": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-15.2.1.tgz", - "integrity": "sha512-0ZfBCejHWIcgy3J5kFs9sS/jqi8i5AptxggOwFySOlCLJ+CzNrktjD4jff1Zy8K/VLzY0Ci0BSZXvgWfP0k9Rg==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.3.1.tgz", + "integrity": "sha512-cqrdobdtRY2XjLa6PhuGOQ7UhTRk2AvWS01sKeGjZ94nQJm5NUtEUyf6u3deIPYllW7gSAWjYzKUObKcTW/R+g==", "dev": true, "dependencies": { - "@angular-eslint/eslint-plugin": "15.2.1", - "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@nx/devkit": "16.5.1", "ignore": "5.2.4", + "nx": "16.5.1", "strip-json-comments": "3.1.1", "tmp": "0.2.1" }, "peerDependencies": { - "@angular/cli": ">= 15.0.0 < 16.0.0" + "@angular/cli": ">= 16.0.0 < 17.0.0" } }, "node_modules/@angular-eslint/template-parser": { @@ -600,37 +719,43 @@ } }, "node_modules/@angular-eslint/utils": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-15.2.1.tgz", - "integrity": "sha512-++FneAJHxJqcSu0igVN6uOkSoHxlzgLoMBswuovYJy3UKwm33/T6WFku8++753Ca/JucIoR1gdUfO7SoSspMDg==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", "dev": true, "dependencies": { - "@angular-eslint/bundled-angular-compiler": "15.2.1", - "@typescript-eslint/utils": "5.48.2" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@typescript-eslint/utils": "5.62.0" }, "peerDependencies": { "eslint": "^7.20.0 || ^8.0.0", "typescript": "*" } }, + "node_modules/@angular-eslint/utils/node_modules/@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + }, "node_modules/@angular/animations": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.10.tgz", - "integrity": "sha512-yxfN8qQpMaukRU5LjFkJBmy85rqrOp86tYVCsf+hmPEFRiXBMUj6xYLeCMcpk3Mt1JtnWGBR34ivGx+7bNeAow==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.10" + "@angular/core": "16.2.12" } }, "node_modules/@angular/cdk": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.9.tgz", - "integrity": "sha512-koaM07N1AIQ5oHU27l0/FoQSSoYAwlAYwVZ4Di3bYrJsTBNCN2Xsby7wI8gZxdepMnV4Fe9si382BDBov+oO4Q==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", "dependencies": { "tslib": "^2.3.0" }, @@ -638,23 +763,11 @@ "parse5": "^7.1.2" }, "peerDependencies": { - "@angular/common": "^15.0.0 || ^16.0.0", - "@angular/core": "^15.0.0 || ^16.0.0", + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, - "node_modules/@angular/cdk/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "optional": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/@angular/cdk/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -668,52 +781,43 @@ } }, "node_modules/@angular/cli": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.10.tgz", - "integrity": "sha512-/TSnm/ZQML6A4lvunyN2tjTB5utuvk3d1Pnfyehp/FXtV6YfZm6+EZrOpKkKPCxTuAgW6c9KK4yQtt3RuNVpwQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1502.10", - "@angular-devkit/core": "15.2.10", - "@angular-devkit/schematics": "15.2.10", - "@schematics/angular": "15.2.10", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "3.0.1", + "ini": "4.1.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", - "open": "8.4.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.1.0", - "resolve": "1.22.1", - "semver": "7.5.3", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", "symbol-observable": "4.0.0", - "yargs": "17.6.2" + "yargs": "17.7.2" }, "bin": { "ng": "bin/ng.js" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } }, - "node_modules/@angular/cli/node_modules/ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true, - "engines": { - "node": "^12.13.0 || ^14.15.0 || >=16.0.0" - } - }, "node_modules/@angular/cli/node_modules/semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -726,32 +830,32 @@ } }, "node_modules/@angular/common": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.10.tgz", - "integrity": "sha512-jdBn3fctkqoNrJn9VLsUHpcCEhCxWSczdsR+BBbD6T0oLl6vMrAVNjPwfBejnlgfWN1KoRU9kgOYsMxa5apIWQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.10", + "@angular/core": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.10.tgz", - "integrity": "sha512-M0XkeU0O73UlJZwDvOyp8/apetz9UKj78eTFDseMYJDLcxe6MpkbkxqpsGZnKYDj7LIep8PmCAKEkhtenE82zw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/core": "15.2.10" + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/core": { @@ -760,17 +864,15 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.10.tgz", - "integrity": "sha512-mCFIxrs60XicKfA2o42hA7LrQvhybi9BQveWuZn/2iIEOXx7R62Iemz8E21pLWftAZHGxEW3NECfBrY1d3gVmA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "dependencies": { - "@babel/core": "7.19.3", + "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.27.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "tslib": "^2.3.0", @@ -779,147 +881,135 @@ "bin": { "ng-xi18n": "bundles/src/bin/ng_xi18n.js", "ngc": "bundles/src/bin/ngc.js", - "ngcc": "bundles/ngcc/main-ngcc.js" + "ngcc": "bundles/ngcc/index.js" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/compiler": "15.2.10", - "typescript": ">=4.8.2 <5.0" - } - }, - "node_modules/@angular/compiler-cli/node_modules/magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" - }, - "engines": { - "node": ">=12" + "@angular/compiler": "16.2.12", + "typescript": ">=4.9.3 <5.2" } }, "node_modules/@angular/core": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.10.tgz", - "integrity": "sha512-meGGidnitQJGDxYd9/LrqYiVlId+vGaLoiLgJdKBz+o2ZO6OmXQGuNw2VBqf17/Cc0/UjzrOY7+kILNFKkk/WQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + "zone.js": "~0.13.0" } }, "node_modules/@angular/forms": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.10.tgz", - "integrity": "sha512-NIntGsNcN6o8L1txsbWXOf6f3K/CUBizdKsxsYVYGJIXEW5qU6UnWmfAZffNNXsT/XvbgUCjgDwT0cAwcqZPuQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.10", - "@angular/core": "15.2.10", - "@angular/platform-browser": "15.2.10", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/language-service": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.10.tgz", - "integrity": "sha512-G0g0teF4pBqLTgfyLcoBl55g91sCZvBK+V4VgTD/hXGpXyMNlNpOsgECSMliGQoJlsRLEugFsSlBNqy7CRoBtw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" } }, "node_modules/@angular/material": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.9.tgz", - "integrity": "sha512-emuFF/7+91Jq+6kVCl3FiVoFLtAZoh+woFQWNuK8nhx0HmD4ckLFI8d9a6ERYR3zRuKhq5deSRE2kYsfpjrrsQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/auto-init": "15.0.0-canary.684e33d25.0", - "@material/banner": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/card": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/chips": "15.0.0-canary.684e33d25.0", - "@material/circular-progress": "15.0.0-canary.684e33d25.0", - "@material/data-table": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dialog": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/drawer": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/fab": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/form-field": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/image-list": "15.0.0-canary.684e33d25.0", - "@material/layout-grid": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/linear-progress": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/radio": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/segmented-button": "15.0.0-canary.684e33d25.0", - "@material/select": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/slider": "15.0.0-canary.684e33d25.0", - "@material/snackbar": "15.0.0-canary.684e33d25.0", - "@material/switch": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", - "@material/tab-bar": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/tab-scroller": "15.0.0-canary.684e33d25.0", - "@material/textfield": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tooltip": "15.0.0-canary.684e33d25.0", - "@material/top-app-bar": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", + "integrity": "sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/animations": "^15.0.0 || ^16.0.0", - "@angular/cdk": "15.2.9", - "@angular/common": "^15.0.0 || ^16.0.0", - "@angular/core": "^15.0.0 || ^16.0.0", - "@angular/forms": "^15.0.0 || ^16.0.0", - "@angular/platform-browser": "^15.0.0 || ^16.0.0", + "@angular/animations": "^16.0.0 || ^17.0.0", + "@angular/cdk": "16.2.14", + "@angular/common": "^16.0.0 || ^17.0.0", + "@angular/core": "^16.0.0 || ^17.0.0", + "@angular/forms": "^16.0.0 || ^17.0.0", + "@angular/platform-browser": "^16.0.0 || ^17.0.0", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/platform-browser": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.10.tgz", - "integrity": "sha512-9tbgVGSJqwfrOzT8aA/kWBLNhJSQ9gUg0CJxwFBSJm8VkBUJrszoBlDsnSvlxx8/W2ejNULKHFTXeUzq0O/+RQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/animations": "15.2.10", - "@angular/common": "15.2.10", - "@angular/core": "15.2.10" + "@angular/animations": "16.2.12", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12" }, "peerDependenciesMeta": { "@angular/animations": { @@ -928,36 +1018,36 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.10.tgz", - "integrity": "sha512-JHP6W+FX715Qv7DhqvfZLuBZXSDJrboiQsR06gUAgDSjAUyhbqmpVg/2YOtgeWpPkzNDtXdPU2PhcRdIv5J3Yg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.10", - "@angular/compiler": "15.2.10", - "@angular/core": "15.2.10", - "@angular/platform-browser": "15.2.10" + "@angular/common": "16.2.12", + "@angular/compiler": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12" } }, "node_modules/@angular/router": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.10.tgz", - "integrity": "sha512-LmuqEg0iIXSw7bli6HKJ19cbxP91v37GtRwbGKswyLihqzTgvjBYpvcfMnB5FRQ5LWkTwq5JclkX03dZw290Yg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "dependencies": { "tslib": "^2.3.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0" + "node": "^16.14.0 || >=18.10.0" }, "peerDependencies": { - "@angular/common": "15.2.10", - "@angular/core": "15.2.10", - "@angular/platform-browser": "15.2.10", + "@angular/common": "16.2.12", + "@angular/core": "16.2.12", + "@angular/platform-browser": "16.2.12", "rxjs": "^6.5.3 || ^7.4.0" } }, @@ -968,48 +1058,48 @@ "dev": true }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "dependencies": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1019,6 +1109,41 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/core/node_modules/@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core/node_modules/convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "node_modules/@babel/core/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -1029,66 +1154,53 @@ } }, "node_modules/@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "dependencies": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/generator/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "dependencies": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -1097,38 +1209,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -1154,18 +1234,20 @@ "dev": true }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", - "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1174,14 +1256,48 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1190,24 +1306,19 @@ "@babel/core": "^7.0.0" } }, - "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@babel/types": "^7.24.7" }, - "peerDependencies": { - "@babel/core": "^7.4.0-0" + "engines": { + "node": ">=6.9.0" } }, - "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", @@ -1216,101 +1327,110 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", "dev": true, - "engines": { - "node": ">=6.9.0" + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, - "node_modules/@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "dependencies": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name/node_modules/@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "dependencies": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1319,37 +1439,48 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-module-transforms/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1358,15 +1489,27 @@ "@babel/core": "^7.0.0" } }, + "node_modules/@babel/helper-remap-async-to-generator/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1376,24 +1519,26 @@ } }, "node_modules/@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1412,42 +1557,56 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "dev": true, + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1482,23 +1641,24 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -1508,12 +1668,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1523,14 +1683,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1574,119 +1734,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", @@ -1707,66 +1754,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -1854,12 +1846,12 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -1868,6 +1860,33 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, "node_modules/@babel/plugin-syntax-json-strings": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", @@ -1997,30 +2016,64 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-arrow-functions": { + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" }, "engines": { "node": ">=6.9.0" }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, "peerDependencies": { "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -2030,12 +2083,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2059,6 +2112,39 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, "node_modules/@babel/plugin-transform-classes": { "version": "7.23.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", @@ -2081,31 +2167,34 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", "dev": true, "dependencies": { - "@babel/types": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", + "node_modules/@babel/plugin-transform-computed-properties/node_modules/@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" } }, "node_modules/@babel/plugin-transform-destructuring": { @@ -2124,13 +2213,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2140,12 +2229,28 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2155,13 +2260,29 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2171,12 +2292,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2186,14 +2308,30 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2203,12 +2341,28 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -2218,12 +2372,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2233,13 +2387,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2249,14 +2403,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2266,15 +2420,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2284,13 +2438,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2300,13 +2454,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2316,12 +2470,62 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2331,13 +2535,46 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -2347,12 +2584,46 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -2361,13 +2632,25 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-private-property-in-object/node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2425,18 +2708,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-jsx/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-react-pure-annotations": { "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz", @@ -2453,26 +2724,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-react-pure-annotations/node_modules/@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "dependencies": { - "@babel/types": "^7.22.5" - }, - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -2482,12 +2741,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2497,17 +2756,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2526,12 +2785,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2541,13 +2800,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2557,12 +2816,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2572,12 +2831,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2587,12 +2846,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2602,12 +2861,28 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2617,13 +2892,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" }, "engines": { "node": ">=6.9.0" @@ -2632,39 +2907,43 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -2674,45 +2953,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -2766,10 +3062,16 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "dependencies": { "regenerator-runtime": "^0.13.11" @@ -2779,33 +3081,33 @@ } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -2814,42 +3116,40 @@ } }, "node_modules/@babel/traverse/node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.24.7" }, "engines": { - "node": ">=6.0.0" + "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" }, "engines": { @@ -3744,9 +4044,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", - "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", "cpu": [ "arm" ], @@ -3760,9 +4060,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", - "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", "cpu": [ "arm64" ], @@ -3776,9 +4076,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", - "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", "cpu": [ "x64" ], @@ -3792,9 +4092,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", - "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", "cpu": [ "arm64" ], @@ -3808,9 +4108,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", - "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", "cpu": [ "x64" ], @@ -3824,9 +4124,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", - "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", "cpu": [ "arm64" ], @@ -3840,9 +4140,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", - "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", "cpu": [ "x64" ], @@ -3856,9 +4156,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", - "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", "cpu": [ "arm" ], @@ -3872,9 +4172,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", - "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", "cpu": [ "arm64" ], @@ -3888,9 +4188,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", - "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", "cpu": [ "ia32" ], @@ -3904,9 +4204,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", - "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", "cpu": [ "loong64" ], @@ -3920,9 +4220,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", - "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", "cpu": [ "mips64el" ], @@ -3936,9 +4236,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", - "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", "cpu": [ "ppc64" ], @@ -3952,9 +4252,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", - "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", "cpu": [ "riscv64" ], @@ -3968,9 +4268,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", - "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", "cpu": [ "s390x" ], @@ -3984,9 +4284,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", - "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", "cpu": [ "x64" ], @@ -4000,9 +4300,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", - "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", "cpu": [ "x64" ], @@ -4016,9 +4316,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", - "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", "cpu": [ "x64" ], @@ -4032,9 +4332,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", - "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", "cpu": [ "x64" ], @@ -4048,9 +4348,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", - "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", "cpu": [ "arm64" ], @@ -4064,9 +4364,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", - "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", "cpu": [ "ia32" ], @@ -4080,9 +4380,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", - "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", "cpu": [ "x64" ], @@ -4095,6 +4395,21 @@ "node": ">=12" } }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, "node_modules/@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -4170,14 +4485,14 @@ } }, "node_modules/@fortawesome/angular-fontawesome": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.12.1.tgz", - "integrity": "sha512-vGGUfmWhsCtC+wUhnLXPeWBod33XKMFERwvD21LTbVBOCwUDUfwcS9nqfTmrULcpFl/bn20REZH/1vSreWd3ZA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "dependencies": { "tslib": "^2.4.1" }, "peerDependencies": { - "@angular/core": "^15.0.0", + "@angular/core": "^16.0.0", "@fortawesome/fontawesome-svg-core": "~1.2.27 || ~1.3.0-beta2 || ^6.1.0" } }, @@ -4384,13 +4699,14 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" }, "engines": { "node": ">=6.0.0" @@ -4406,808 +4722,795 @@ } }, "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true, "engines": { "node": ">=6.0.0" } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "node_modules/@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "node_modules/@material/animation": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/auto-init": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/banner": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/base": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w==", - "dependencies": { - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "dependencies": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/card": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g==", - "dependencies": { - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "dependencies": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/checkbox": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/chips": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/circular-progress": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/progress-indicator": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/data-table": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/linear-progress": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/select": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/density": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/dialog": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/dom": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/drawer": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/elevation": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/fab": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/feature-targeting": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/floating-label": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/focus-ring": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", "dependencies": { - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0" + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" } }, "node_modules/@material/form-field": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/icon-button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/image-list": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA==", - "dependencies": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "dependencies": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/layout-grid": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/line-ripple": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/linear-progress": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/progress-indicator": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/list": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/menu": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/menu-surface": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/notched-outline": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/progress-indicator": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", "dependencies": { "tslib": "^2.1.0" } }, "node_modules/@material/radio": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/ripple": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/rtl": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", "dependencies": { - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/segmented-button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/select": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/shape": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/slider": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/snackbar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/switch": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/tab": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-bar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/tab-scroller": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-indicator": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/tab-scroller": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/textfield": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/theme": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/tokens": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", "dependencies": { - "@material/elevation": "15.0.0-canary.684e33d25.0" + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" } }, "node_modules/@material/tooltip": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "node_modules/@material/top-app-bar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw==", - "dependencies": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "dependencies": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/touch-target": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ==", - "dependencies": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "dependencies": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "node_modules/@material/typography": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", "dependencies": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, @@ -5240,18 +5543,18 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngtools/webpack": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.10.tgz", - "integrity": "sha512-ZExB4rKh/Saad31O/Ofd2XvRuILuCNTYs0+qJL697Be2pzeewvzBhE4Xe1Mm7Jg13aWSPeuIdzSGOqCdwxxxFQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", + "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", "dev": true, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" }, "peerDependencies": { - "@angular/compiler-cli": "^15.0.0", - "typescript": ">=4.8.2 <5.0", + "@angular/compiler-cli": "^16.0.0", + "typescript": ">=4.9.3 <5.2", "webpack": "^5.54.0" } }, @@ -5291,9 +5594,9 @@ } }, "node_modules/@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "dependencies": { "semver": "^7.3.5" @@ -5346,25 +5649,25 @@ } }, "node_modules/@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "dependencies": { "npm-bundled": "^3.0.0", "npm-normalize-package-bin": "^3.0.0" }, "bin": { - "installed-package-contents": "lib/index.js" + "installed-package-contents": "bin/index.js" }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/@npmcli/installed-package-contents/node_modules/npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "dependencies": { "npm-normalize-package-bin": "^3.0.0" @@ -5463,6 +5766,237 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "dependencies": { + "@nx/devkit": "16.5.1" + } + }, + "node_modules/@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "dependencies": { + "nx": "16.5.1" + }, + "bin": { + "tao": "index.js" + } + }, + "node_modules/@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "dependencies": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "peerDependencies": { + "nx": ">= 15 <= 17" + } + }, + "node_modules/@nx/devkit/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -5483,17 +6017,17 @@ } }, "node_modules/@schematics/angular": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.10.tgz", - "integrity": "sha512-eLdyP+T1TueNQ8FCP7sP+tt8z+YQ1BINsJsyAyoJT/XZjcCV7LUxgDIU94/kuvIotmJ2xTuFWHFPfAY+CN3duQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", "dev": true, "dependencies": { - "@angular-devkit/core": "15.2.10", - "@angular-devkit/schematics": "15.2.10", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", "jsonc-parser": "3.2.0" }, "engines": { - "node": "^14.20.0 || ^16.13.0 || >=18.10.0", + "node": "^16.14.0 || >=18.10.0", "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", "yarn": ">= 1.13.0" } @@ -6057,6 +6591,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/@sigstore/sign/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/@sigstore/sign/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/@sigstore/sign/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -6092,19 +6649,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/@sigstore/sign/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/@sigstore/sign/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -6119,9 +6667,9 @@ } }, "node_modules/@sigstore/sign/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -6147,12 +6695,12 @@ "dev": true }, "node_modules/@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true, "engines": { - "node": ">= 10" + "node": ">= 6" } }, "node_modules/@tsconfig/node10": { @@ -6211,9 +6759,9 @@ } }, "node_modules/@tufjs/models/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6311,9 +6859,9 @@ } }, "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/express": { @@ -6329,9 +6877,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -6383,9 +6931,9 @@ "dev": true }, "node_modules/@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", "peer": true }, "node_modules/@types/mime": { @@ -6395,10 +6943,13 @@ "dev": true }, "node_modules/@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/node-forge": { "version": "1.3.11", @@ -6416,9 +6967,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "node_modules/@types/range-parser": { @@ -6434,9 +6985,9 @@ "dev": true }, "node_modules/@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "node_modules/@types/send": { @@ -6459,14 +7010,14 @@ } }, "node_modules/@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "dependencies": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "node_modules/@types/sinonjs__fake-timers": { @@ -6622,13 +7173,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz", - "integrity": "sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "5.48.2", - "@typescript-eslint/utils": "5.48.2", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, @@ -6649,9 +7200,9 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/types": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", - "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6662,13 +7213,13 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", - "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6689,12 +7240,12 @@ } }, "node_modules/@typescript-eslint/type-utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", - "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6746,18 +7297,18 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz", - "integrity": "sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.2", - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/typescript-estree": "5.48.2", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "engines": { @@ -6772,13 +7323,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/scope-manager": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz", - "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6789,9 +7340,9 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/types": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", - "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" @@ -6802,13 +7353,13 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/typescript-estree": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", - "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -6829,12 +7380,12 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/@typescript-eslint/visitor-keys": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", - "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" }, "engines": { @@ -6862,32 +7413,44 @@ "url": "https://opencollective.com/typescript-eslint" } }, + "node_modules/@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "engines": { + "node": ">=14.6.0" + }, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0" + } + }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "node_modules/@webassemblyjs/helper-code-frame": { @@ -6960,111 +7523,111 @@ "dev": true }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-parser": { @@ -7111,15 +7674,108 @@ "dev": true }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "dependencies": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, + "node_modules/@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "deprecated": "this package has been renamed to ts-evaluator. Please install ts-evaluator instead", + "dev": true, + "dependencies": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "engines": { + "node": ">=10.1.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/wessberg/ts-evaluator?sponsor=1" + }, + "peerDependencies": { + "typescript": ">=3.2.x || >= 4.x" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/@wessberg/ts-evaluator/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@wessberg/ts-evaluator/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -7137,6 +7793,37 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, + "node_modules/@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "dependencies": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + }, + "engines": { + "node": ">=14.15.0" + } + }, + "node_modules/@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@zkochan/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "node_modules/abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -7174,9 +7861,9 @@ "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" }, "node_modules/acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -7185,10 +7872,41 @@ "node": ">=0.4.0" } }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals/node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true, + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -7350,15 +8068,15 @@ } }, "node_modules/angular-tag-cloud-module": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-14.0.0.tgz", - "integrity": "sha512-H1NU9C2nKT0WzKITZ0gP/T9QoXYpFxYHcUW9snFJOXnwmLLVo6VmXQ0KbI+0pVa5Tu/OxzNWiy1R61PtjBigKA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-16.0.0.tgz", + "integrity": "sha512-xEKt+56bdQ6uWsQF3gL+MsmEdvhWJLM0KKOEumC04RVBdfsFwJyZpBC1vHzDbvgmMtvydITGk5UdXc039tFiDw==", "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { - "@angular/common": "^14.0.0 || ^15.0.0-0", - "@angular/core": "^14.0.0 || ^15.0.0-0" + "@angular/common": "^16.0.0 || ^17.0.0-0", + "@angular/core": "^16.0.0 || ^17.0.0-0" } }, "node_modules/ansi-colors": { @@ -7461,6 +8179,7 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "delegates": "^1.0.0", @@ -7486,12 +8205,12 @@ } }, "node_modules/aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/arr-diff": { @@ -7521,22 +8240,6 @@ "node": ">=0.10.0" } }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -7711,9 +8414,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "funding": [ { @@ -7726,8 +8429,8 @@ } ], "dependencies": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -7743,18 +8446,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -7779,13 +8470,44 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "dependencies": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + } + }, + "node_modules/axios/node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/axios/node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, "node_modules/axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", "dev": true, "dependencies": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "node_modules/babel-loader": { @@ -7844,17 +8566,17 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { @@ -7867,28 +8589,60 @@ } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs3/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator/node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/balanced-match": { @@ -8166,6 +8920,12 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "node_modules/browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -8263,9 +9023,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "funding": [ { @@ -8275,13 +9035,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" }, "bin": { "browserslist": "cli.js" @@ -8355,21 +9119,20 @@ } }, "node_modules/cacache": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", - "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "dependencies": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", - "glob": "^8.0.1", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^4.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" @@ -8388,19 +9151,23 @@ } }, "node_modules/cacache/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" + }, + "bin": { + "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=12" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -8416,15 +9183,27 @@ } }, "node_modules/cacache/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" }, "engines": { - "node": ">=10" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/cacache/node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true, + "engines": { + "node": ">=16 || 14 >=14.17" } }, "node_modules/cacache/node_modules/unique-filename": { @@ -8517,9 +9296,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001585", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", - "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "dev": true, "funding": [ { @@ -8615,144 +9394,6 @@ "url": "https://github.com/sponsors/fb55" } }, - "node_modules/cheerio-select/node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/cheerio-select/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio-select/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/cheerio/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/cheerio/node_modules/parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -9179,6 +9820,12 @@ "node": ">= 6" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -9599,50 +10246,18 @@ } }, "node_modules/core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "dependencies": { - "browserslist": "^4.22.2" + "browserslist": "^4.23.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" } }, - "node_modules/core-js-compat/node_modules/browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, "node_modules/core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", @@ -9727,16 +10342,17 @@ "dev": true }, "node_modules/critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "dependencies": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" } }, @@ -9798,12 +10414,6 @@ "node": ">=8" } }, - "node_modules/critters/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/critters/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -9853,15 +10463,15 @@ } }, "node_modules/css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "dependencies": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -9879,13 +10489,10 @@ } }, "node_modules/css-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, "bin": { "semver": "bin/semver.js" }, @@ -9894,15 +10501,15 @@ } }, "node_modules/css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "dependencies": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" }, "funding": { @@ -9910,9 +10517,9 @@ } }, "node_modules/css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true, "engines": { "node": ">= 6" @@ -9933,6 +10540,30 @@ "node": ">=4" } }, + "node_modules/cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + }, "node_modules/custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -10591,6 +11222,55 @@ "node": ">=0.10" } }, + "node_modules/data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/data-urls/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/data-urls/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/data-urls/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -10632,6 +11312,12 @@ "node": "*" } }, + "node_modules/decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "node_modules/decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", @@ -10641,44 +11327,6 @@ "node": ">=0.10" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -10774,23 +11422,6 @@ "node": ">=8" } }, - "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -10843,13 +11474,13 @@ "node": ">= 0.8" } }, - "node_modules/dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true, "engines": { - "node": ">= 0.6.0" + "node": ">=6" } }, "node_modules/des.js": { @@ -10975,14 +11606,14 @@ } }, "node_modules/dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "dependencies": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" }, "funding": { "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" @@ -11010,13 +11641,35 @@ } ] }, + "node_modules/domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", + "dev": true, + "dependencies": { + "webidl-conversions": "^5.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/domexception/node_modules/webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "dependencies": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" }, "engines": { "node": ">= 4" @@ -11031,19 +11684,34 @@ "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" }, "node_modules/domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "dependencies": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" }, "funding": { "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "node_modules/duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -11099,10 +11767,25 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "node_modules/ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "dependencies": { + "jake": "^10.8.5" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/electron-to-chromium": { - "version": "1.4.661", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.661.tgz", - "integrity": "sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "dev": true }, "node_modules/elliptic": { @@ -11214,9 +11897,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -11245,10 +11928,13 @@ "dev": true }, "node_modules/entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true, + "engines": { + "node": ">=0.12" + }, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -11310,36 +11996,10 @@ "node": ">= 0.4" } }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "node_modules/es6-promise": { @@ -11356,12 +12016,11 @@ } }, "node_modules/esbuild": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", - "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", "dev": true, "hasInstallScript": true, - "optional": true, "bin": { "esbuild": "bin/esbuild" }, @@ -11369,34 +12028,34 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/android-arm": "0.17.8", - "@esbuild/android-arm64": "0.17.8", - "@esbuild/android-x64": "0.17.8", - "@esbuild/darwin-arm64": "0.17.8", - "@esbuild/darwin-x64": "0.17.8", - "@esbuild/freebsd-arm64": "0.17.8", - "@esbuild/freebsd-x64": "0.17.8", - "@esbuild/linux-arm": "0.17.8", - "@esbuild/linux-arm64": "0.17.8", - "@esbuild/linux-ia32": "0.17.8", - "@esbuild/linux-loong64": "0.17.8", - "@esbuild/linux-mips64el": "0.17.8", - "@esbuild/linux-ppc64": "0.17.8", - "@esbuild/linux-riscv64": "0.17.8", - "@esbuild/linux-s390x": "0.17.8", - "@esbuild/linux-x64": "0.17.8", - "@esbuild/netbsd-x64": "0.17.8", - "@esbuild/openbsd-x64": "0.17.8", - "@esbuild/sunos-x64": "0.17.8", - "@esbuild/win32-arm64": "0.17.8", - "@esbuild/win32-ia32": "0.17.8", - "@esbuild/win32-x64": "0.17.8" + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" } }, "node_modules/esbuild-wasm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", - "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true, "bin": { "esbuild": "bin/esbuild" @@ -11406,9 +12065,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "engines": { "node": ">=6" @@ -11429,6 +12088,46 @@ "node": ">=0.8.0" } }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/escodegen/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/escodegen/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/eslint": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", @@ -12274,9 +12973,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -12384,6 +13083,36 @@ "node": ">=8" } }, + "node_modules/filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "dependencies": { + "minimatch": "^5.0.1" + } + }, + "node_modules/filelist/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/filelist/node_modules/minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -12459,6 +13188,15 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -12529,15 +13267,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -12548,9 +13277,9 @@ } }, "node_modules/foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "dependencies": { "cross-spawn": "^7.0.0", @@ -12706,18 +13435,18 @@ } }, "node_modules/fs-minipass/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "node_modules/fs-write-stream-atomic": { @@ -12786,19 +13515,11 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "node_modules/functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "aproba": "^1.0.3 || ^2.0.0", @@ -13037,6 +13758,18 @@ "lodash": "^4.17.15" } }, + "node_modules/guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "dependencies": { + "@wessberg/ts-evaluator": "0.0.27" + }, + "peerDependencies": { + "typescript": ">=3.7.5" + } + }, "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -13054,15 +13787,6 @@ "node": ">= 0.4.0" } }, - "node_modules/has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -13108,21 +13832,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -13394,10 +14103,22 @@ "node": ">=6" } }, + "node_modules/html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "dependencies": { + "whatwg-encoding": "^1.0.5" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true, "funding": [ { @@ -13417,9 +14138,9 @@ "dev": true }, "node_modules/htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", @@ -13430,64 +14151,9 @@ ], "dependencies": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" - } - }, - "node_modules/htmlparser2/node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/htmlparser2/node_modules/entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "entities": "^4.4.0" } }, "node_modules/http-cache-semantics": { @@ -13548,12 +14214,12 @@ } }, "node_modules/http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "dependencies": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" }, @@ -13709,9 +14375,9 @@ } }, "node_modules/ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "dependencies": { "minimatch": "^9.0.0" @@ -13730,9 +14396,9 @@ } }, "node_modules/ignore-walk/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -13758,9 +14424,9 @@ } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "node_modules/import-fresh": { @@ -13937,20 +14603,6 @@ "node": ">=8" } }, - "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -13965,10 +14617,35 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/ip-address/node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "node_modules/ip-address/node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "node_modules/ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true, "engines": { "node": ">= 10" @@ -13995,56 +14672,12 @@ "node": ">=0.10.0" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "node_modules/is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "dependencies": { - "has-bigints": "^1.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -14057,40 +14690,12 @@ "node": ">=8" } }, - "node_modules/is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -14126,21 +14731,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -14243,15 +14833,6 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "node_modules/is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", @@ -14261,21 +14842,6 @@ "node": ">=0.12.0" } }, - "node_modules/is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -14318,21 +14884,11 @@ "node": ">=0.10.0" } }, - "node_modules/is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true }, "node_modules/is-regexp": { "version": "1.0.0", @@ -14343,27 +14899,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", @@ -14376,36 +14911,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -14424,28 +14929,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -14593,9 +15076,9 @@ } }, "node_modules/jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "dependencies": { "@isaacs/cliui": "^8.0.2" @@ -14610,6 +15093,94 @@ "@pkgjs/parseargs": "^0.11.0" } }, + "node_modules/jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "dependencies": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/jake/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/jasmine-core": { "version": "3.99.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz", @@ -14654,6 +15225,15 @@ "url": "https://github.com/chalk/supports-color?sponsor=1" } }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -14684,6 +15264,128 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, + "node_modules/jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsdom/node_modules/form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/jsdom/node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "node_modules/jsdom/node_modules/tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/jsdom/node_modules/webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true, + "engines": { + "node": ">=10.4" + } + }, + "node_modules/jsdom/node_modules/whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "dependencies": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/jsdom/node_modules/ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -15062,6 +15764,16 @@ "node": ">= 8" } }, + "node_modules/launch-editor": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "dev": true, + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "node_modules/lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -15678,12 +16390,12 @@ } }, "node_modules/magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "dependencies": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" }, "engines": { "node": ">=12" @@ -15759,6 +16471,15 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, + "node_modules/make-fetch-happen/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, "node_modules/make-fetch-happen/node_modules/brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -15813,6 +16534,7 @@ "version": "8.1.0", "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "deprecated": "Glob versions prior to v9 are no longer supported", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", @@ -15828,6 +16550,20 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/make-fetch-happen/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/make-fetch-happen/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -15919,9 +16655,9 @@ } }, "node_modules/marked": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz", - "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "peer": true, "bin": { "marked": "bin/marked.js" @@ -16138,9 +16874,9 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "dependencies": { "schema-utils": "^4.0.0" @@ -16157,15 +16893,15 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -16241,9 +16977,9 @@ } }, "node_modules/minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true, "engines": { "node": ">=8" @@ -16518,6 +17254,15 @@ "rimraf": "bin.js" } }, + "node_modules/mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, "node_modules/ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -16641,9 +17386,9 @@ "dev": true }, "node_modules/ngx-markdown": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-15.1.2.tgz", - "integrity": "sha512-mAUORpUnHCV4tnxEHV4oS5YEdIaolUclulCblUrvAEU3AEND8MMTxlwHujqVC2M398/aKH0SBSrjLzDbMUJCoQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-16.0.0.tgz", + "integrity": "sha512-/rlbXi+HBscJCDdwaTWIUrRkvwJicPnuAgeugOCZa0UbZ4VCWV3U0+uB1Zv6krRDF6FXJNXNLTUrMZV7yH8I6A==", "dependencies": { "tslib": "^2.3.0" }, @@ -16655,13 +17400,13 @@ "prismjs": "^1.28.0" }, "peerDependencies": { - "@angular/common": "^15.0.0", - "@angular/core": "^15.0.0", - "@angular/platform-browser": "^15.0.0", - "@types/marked": "^4.0.3", - "marked": "^4.0.17", + "@angular/common": "^16.0.0", + "@angular/core": "^16.0.0", + "@angular/platform-browser": "^16.0.0", + "@types/marked": "^4.3.0", + "marked": "^4.3.0", "rxjs": "^6.5.3 || ^7.4.0", - "zone.js": "~0.11.4 || ~0.12.0 || ~0.13.0" + "zone.js": "~0.13.0" } }, "node_modules/ngx-mat-select-search": { @@ -16708,8 +17453,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true + "dev": true }, "node_modules/node-fetch": { "version": "2.6.7", @@ -16780,11 +17524,10 @@ } }, "node_modules/node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", "dev": true, - "optional": true, "bin": { "node-gyp-build": "bin.js", "node-gyp-build-optional": "optional.js", @@ -16998,23 +17741,11 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-package-arg/node_modules/builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "dependencies": { - "semver": "^7.0.0" - } - }, "node_modules/npm-package-arg/node_modules/validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", "dev": true, - "dependencies": { - "builtins": "^5.0.0" - }, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } @@ -17073,6 +17804,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/npm-registry-fetch/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/npm-registry-fetch/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/npm-registry-fetch/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -17108,19 +17862,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/npm-registry-fetch/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -17135,9 +17880,9 @@ } }, "node_modules/npm-registry-fetch/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -17159,6 +17904,7 @@ "version": "6.0.2", "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "deprecated": "This package is no longer supported.", "dev": true, "dependencies": { "are-we-there-yet": "^3.0.0", @@ -17182,6 +17928,268 @@ "url": "https://github.com/fb55/nth-check?sponsor=1" } }, + "node_modules/nwsapi": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "dev": true + }, + "node_modules/nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@nrwl/tao": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "bin": { + "nx": "bin/nx.js" + }, + "optionalDependencies": { + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1" + }, + "peerDependencies": { + "@swc-node/register": "^1.4.2", + "@swc/core": "^1.2.173" + }, + "peerDependenciesMeta": { + "@swc-node/register": { + "optional": true + }, + "@swc/core": { + "optional": true + } + } + }, + "node_modules/nx/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/nx/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/nx/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/nx/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/nx/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/nx/node_modules/fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/nx/node_modules/glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "deprecated": "Glob versions prior to v9 are no longer supported", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/nx/node_modules/lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/nx/node_modules/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nx/node_modules/semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nx/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nx/node_modules/tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "dependencies": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -17285,29 +18293,13 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "node_modules/object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true, "engines": { - "node": ">= 0.4" + "node": ">= 10.12.0" } }, "node_modules/object-visit": { @@ -17322,24 +18314,6 @@ "node": ">=0.10.0" } }, - "node_modules/object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -17403,9 +18377,9 @@ } }, "node_modules/open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", @@ -17744,10 +18718,16 @@ "node": ">= 12" } }, + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "node_modules/pacote": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", - "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "dependencies": { "@npmcli/git": "^4.0.0", @@ -17756,7 +18736,7 @@ "@npmcli/run-script": "^6.0.0", "cacache": "^17.0.0", "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "npm-package-arg": "^10.0.0", "npm-packlist": "^7.0.0", "npm-pick-manifest": "^8.0.0", @@ -17765,7 +18745,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", + "sigstore": "^1.3.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -17786,49 +18766,50 @@ } }, "node_modules/pacote/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/pacote/node_modules/glob/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" } }, "node_modules/pacote/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, "node_modules/pacote/node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -17868,6 +18849,7 @@ "version": "6.0.4", "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-6.0.4.tgz", "integrity": "sha512-AEtWXYfopBj2z5N5PbkAOeNHRPUg5q+Nen7QLxV8M2zJq1ym6/lCz3fYNTCXe19puu2d06jfHhrP7v/S2PtMMw==", + "deprecated": "This package is no longer supported. Please use @npmcli/package-json instead.", "dev": true, "dependencies": { "glob": "^10.2.2", @@ -17989,18 +18971,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-html-rewriting-stream/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parse5-html-rewriting-stream/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -18013,21 +18983,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "dependencies": { - "parse5": "^6.0.1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter/node_modules/parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "node_modules/parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -18040,18 +18995,6 @@ "url": "https://github.com/inikulin/parse5?sponsor=1" } }, - "node_modules/parse5-sax-parser/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, "node_modules/parse5-sax-parser/node_modules/parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -18127,39 +19070,30 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "dev": true, "engines": { "node": "14 || >=16.14" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", - "dev": true, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", @@ -18204,9 +19138,9 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -18252,9 +19186,9 @@ } }, "node_modules/piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "dependencies": { "eventemitter-asyncresource": "^1.0.0", @@ -18336,13 +19270,13 @@ } }, "node_modules/postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "dependencies": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", "semver": "^7.3.8" }, "engines": { @@ -18357,14 +19291,55 @@ "webpack": "^5.0.0" } }, - "node_modules/postcss-loader/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "node_modules/postcss-loader/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/postcss-loader/node_modules/cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "dependencies": { - "lru-cache": "^6.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/postcss-loader/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/postcss-loader/node_modules/semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true, "bin": { "semver": "bin/semver.js" }, @@ -18373,9 +19348,9 @@ } }, "node_modules/postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "engines": { "node": "^10 || ^12 || >= 14" @@ -18385,9 +19360,9 @@ } }, "node_modules/postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "dependencies": { "icss-utils": "^5.0.0", @@ -18402,9 +19377,9 @@ } }, "node_modules/postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" @@ -18432,9 +19407,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -18873,9 +19848,9 @@ } }, "node_modules/read-package-json-fast/node_modules/json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true, "engines": { "node": "^14.17.0 || ^16.13.0 || >=18.0.0" @@ -18941,9 +19916,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -18959,9 +19934,9 @@ "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" @@ -18986,23 +19961,6 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -19016,28 +19974,22 @@ } }, "node_modules/regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "dependencies": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" }, "engines": { "node": ">=4" } }, - "node_modules/regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, "node_modules/regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -19118,11 +20070,11 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "dependencies": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -19266,6 +20218,22 @@ "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", "optional": true }, + "node_modules/rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=14.18.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, "node_modules/run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -19358,9 +20326,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "node_modules/sass": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", - "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -19371,16 +20339,15 @@ "sass": "sass.js" }, "engines": { - "node": ">=12.0.0" + "node": ">=14.0.0" } }, "node_modules/sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { @@ -19392,7 +20359,7 @@ }, "peerDependencies": { "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" @@ -19419,6 +20386,18 @@ "dev": true, "optional": true }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -19692,9 +20671,9 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "dependencies": { "randombytes": "^2.1.0" @@ -19807,20 +20786,6 @@ "node": ">= 0.4" } }, - "node_modules/set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "dependencies": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -19915,6 +20880,15 @@ "node": ">=8" } }, + "node_modules/shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -19954,6 +20928,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/sigstore/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sigstore/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/sigstore/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -19989,19 +20986,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/sigstore/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/sigstore/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -20016,9 +21004,9 @@ } }, "node_modules/sigstore/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -20346,16 +21334,16 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -20373,12 +21361,6 @@ "node": ">= 10" } }, - "node_modules/socks/node_modules/ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - }, "node_modules/source-list-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz", @@ -20610,9 +21592,9 @@ } }, "node_modules/ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "dependencies": { "minipass": "^7.0.3" @@ -20622,9 +21604,9 @@ } }, "node_modules/ssri/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -20735,18 +21717,6 @@ "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -20996,6 +21966,23 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "dependencies": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + }, + "bin": { + "sl-log-transformer": "bin/sl-log-transformer.js" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -21034,6 +22021,12 @@ "node": ">=0.10" } }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -21044,9 +22037,9 @@ } }, "node_modules/tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "dependencies": { "chownr": "^2.0.0", @@ -21118,23 +22111,14 @@ "node": ">=8" } }, - "node_modules/tar/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -21146,16 +22130,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "dependencies": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "engines": { "node": ">= 10.13.0" @@ -21179,10 +22163,16 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -21197,6 +22187,24 @@ "url": "https://opencollective.com/webpack" } }, + "node_modules/terser-webpack-plugin/node_modules/terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -21784,9 +22792,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -21829,6 +22837,29 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/tuf-js/node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true, + "engines": { + "node": ">= 10" + } + }, + "node_modules/tuf-js/node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/tuf-js/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -21864,19 +22895,10 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, - "node_modules/tuf-js/node_modules/minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/tuf-js/node_modules/minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "dependencies": { "minipass": "^7.0.3", @@ -21891,9 +22913,9 @@ } }, "node_modules/tuf-js/node_modules/minipass-fetch/node_modules/minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -21966,9 +22988,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "node_modules/typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -22007,6 +23029,12 @@ "through": "^2.3.8" } }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -22030,9 +23058,9 @@ } }, "node_modules/unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true, "engines": { "node": ">=4" @@ -22174,9 +23202,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "funding": [ { @@ -22193,8 +23221,8 @@ } ], "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -22363,6 +23391,61 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "dependencies": { + "esbuild": "^0.18.10", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^14.18.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + }, + "peerDependencies": { + "@types/node": ">= 14", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, "node_modules/vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -22378,6 +23461,28 @@ "node": ">=0.10.0" } }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "deprecated": "Use your platform's native performance.now() and performance.timeOrigin.", + "dev": true, + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "dependencies": { + "xml-name-validator": "^3.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -22720,22 +23825,22 @@ "dev": true }, "node_modules/webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -22744,9 +23849,9 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, @@ -22767,9 +23872,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", - "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "dependencies": { "colorette": "^2.0.10", @@ -22787,18 +23892,23 @@ }, "peerDependencies": { "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + } } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -22849,9 +23959,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", @@ -22860,7 +23970,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -22873,6 +23983,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -22882,7 +23993,7 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "bin": { "webpack-dev-server": "bin/webpack-dev-server.js" @@ -22898,21 +24009,24 @@ "webpack": "^4.37.0 || ^5.0.0" }, "peerDependenciesMeta": { + "webpack": { + "optional": true + }, "webpack-cli": { "optional": true } } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" }, "funding": { "type": "github", @@ -22985,10 +24099,31 @@ "webpack": "^4.0.0 || ^5.0.0" } }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", @@ -23029,9 +24164,9 @@ } }, "node_modules/webpack/node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -23069,6 +24204,21 @@ "node": ">=0.8.0" } }, + "node_modules/whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "dependencies": { + "iconv-lite": "0.4.24" + } + }, + "node_modules/whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -23094,56 +24244,6 @@ "node": ">= 8" } }, - "node_modules/which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "dependencies": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "dependencies": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -23154,9 +24254,9 @@ } }, "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "node_modules/word-wrap": { @@ -23310,6 +24410,18 @@ } } }, + "node_modules/xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "node_modules/xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -23343,9 +24455,9 @@ } }, "node_modules/yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "dependencies": { "cliui": "^8.0.1", @@ -23402,71 +24514,95 @@ "node": ">=6" } }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zone.js": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", - "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "dependencies": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" } } }, "dependencies": { "@ampproject/remapping": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", - "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz", + "integrity": "sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.1.0", + "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" } }, "@angular-devkit/architect": { - "version": "0.1502.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1502.10.tgz", - "integrity": "sha512-S8lN73WYCfpEpw1Q41ZcUinw7JfDeSM8LyGs797OVshnW75QcOkOecWj/3CKR23G44IgFrHN6sqtzWxKmMxLig==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.14.tgz", + "integrity": "sha512-eSdONEV5dbtLNiOMBy9Ue9DdJ1ct6dH9RdZfYiedq6VZn0lejePAjY36MYVXgq2jTE+v/uIiaNy7caea5pt55A==", "dev": true, "requires": { - "@angular-devkit/core": "15.2.10", - "rxjs": "6.6.7" + "@angular-devkit/core": "16.2.14", + "rxjs": "7.8.1" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@angular-devkit/build-angular": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-15.2.10.tgz", - "integrity": "sha512-3pCPVEJilVwHIJC6Su1/PIEqvFfU1Lxew9yItxX4s6dud8HY+fuKrsDnao4NNMFNqCLqL4el5QbSBKnnpWH1sg==", - "dev": true, - "requires": { - "@ampproject/remapping": "2.2.0", - "@angular-devkit/architect": "0.1502.10", - "@angular-devkit/build-webpack": "0.1502.10", - "@angular-devkit/core": "15.2.10", - "@babel/core": "7.20.12", - "@babel/generator": "7.20.14", - "@babel/helper-annotate-as-pure": "7.18.6", - "@babel/helper-split-export-declaration": "7.18.6", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", + "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "dev": true, + "requires": { + "@ampproject/remapping": "2.2.1", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/build-webpack": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@babel/core": "7.22.9", + "@babel/generator": "7.22.9", + "@babel/helper-annotate-as-pure": "7.22.5", + "@babel/helper-split-export-declaration": "7.22.6", "@babel/plugin-proposal-async-generator-functions": "7.20.7", - "@babel/plugin-transform-async-to-generator": "7.20.7", - "@babel/plugin-transform-runtime": "7.19.6", - "@babel/preset-env": "7.20.2", - "@babel/runtime": "7.20.13", - "@babel/template": "7.20.7", + "@babel/plugin-transform-async-to-generator": "7.22.5", + "@babel/plugin-transform-runtime": "7.22.9", + "@babel/preset-env": "7.22.9", + "@babel/runtime": "7.22.6", + "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "15.2.10", + "@ngtools/webpack": "16.2.14", + "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", - "autoprefixer": "10.4.13", - "babel-loader": "9.1.2", + "autoprefixer": "10.4.14", + "babel-loader": "9.1.3", "babel-plugin-istanbul": "6.1.1", - "browserslist": "4.21.5", - "cacache": "17.0.4", + "browserslist": "^4.21.5", "chokidar": "3.5.3", "copy-webpack-plugin": "11.0.0", - "critters": "0.0.16", - "css-loader": "6.7.3", - "esbuild": "0.17.8", - "esbuild-wasm": "0.17.8", - "glob": "8.1.0", + "critters": "0.0.20", + "css-loader": "6.8.1", + "esbuild": "0.18.17", + "esbuild-wasm": "0.18.17", + "fast-glob": "3.3.1", + "guess-parser": "0.4.22", "https-proxy-agent": "5.0.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", @@ -23475,53 +24611,56 @@ "less-loader": "11.1.0", "license-webpack-plugin": "4.0.2", "loader-utils": "3.2.1", - "magic-string": "0.29.0", - "mini-css-extract-plugin": "2.7.2", - "open": "8.4.1", + "magic-string": "0.30.1", + "mini-css-extract-plugin": "2.7.6", + "mrmime": "1.0.1", + "open": "8.4.2", "ora": "5.4.1", "parse5-html-rewriting-stream": "7.0.0", - "piscina": "3.2.0", + "picomatch": "2.3.1", + "piscina": "4.0.0", "postcss": "8.4.31", - "postcss-loader": "7.0.2", + "postcss-loader": "7.3.3", "resolve-url-loader": "5.0.0", - "rxjs": "6.6.7", - "sass": "1.58.1", - "sass-loader": "13.2.0", - "semver": "7.5.3", + "rxjs": "7.8.1", + "sass": "1.64.1", + "sass-loader": "13.3.2", + "semver": "7.5.4", "source-map-loader": "4.0.1", "source-map-support": "0.5.21", - "terser": "5.16.3", + "terser": "5.19.2", "text-table": "0.2.0", "tree-kill": "1.2.2", - "tslib": "2.5.0", - "webpack": "5.76.1", - "webpack-dev-middleware": "6.0.1", - "webpack-dev-server": "4.11.1", - "webpack-merge": "5.8.0", + "tslib": "2.6.1", + "vite": "4.5.3", + "webpack": "5.88.2", + "webpack-dev-middleware": "6.1.2", + "webpack-dev-server": "4.15.1", + "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { "@babel/core": { - "version": "7.20.12", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.20.12.tgz", - "integrity": "sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.20.7", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helpers": "^7.20.7", - "@babel/parser": "^7.20.7", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.20.12", - "@babel/types": "^7.20.7", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", + "integrity": "sha512-G2EgeufBcYw27U4hhoIwFcgc1XU7TlXJ3mv04oOv1WCuo900U/anZSPzEqNjwdjgffkk2Gs0AN0dW1CKVLcG7w==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.5", + "@babel/generator": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-module-transforms": "^7.22.9", + "@babel/helpers": "^7.22.6", + "@babel/parser": "^7.22.7", + "@babel/template": "^7.22.5", + "@babel/traverse": "^7.22.8", + "@babel/types": "^7.22.5", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.2", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -23532,25 +24671,16 @@ } } }, - "@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", - "dev": true, - "requires": { - "@babel/types": "^7.18.6" - } - }, "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "ajv-keywords": { @@ -23563,35 +24693,33 @@ } }, "babel-loader": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.2.tgz", - "integrity": "sha512-mN14niXW43tddohGl8HPu5yfQq70iUThvFL/4QzESA7GcZoC0eVOhvWdQ8+3UlSjaDE9MVtsW9mxDY07W7VpVA==", + "version": "9.1.3", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.1.3.tgz", + "integrity": "sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==", "dev": true, "requires": { - "find-cache-dir": "^3.3.2", + "find-cache-dir": "^4.0.0", "schema-utils": "^4.0.0" } }, - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", "dev": true, "requires": { - "balanced-match": "^1.0.0" + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" } }, - "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" } }, "json-schema-traverse": { @@ -23600,13 +24728,55 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, - "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", "dev": true, "requires": { - "brace-expansion": "^2.0.1" + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" + } + }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" } }, "schema-utils": { @@ -23622,9 +24792,9 @@ } }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -23633,25 +24803,37 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1502.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1502.10.tgz", - "integrity": "sha512-55b9WZIGU4DNgiIV2lkkN6iQxJrgWY5CDaNu0kJC/qazotJgBbcN/8jgBx2DD8HNE1V3iXxWk66pt1h946Po+Q==", + "version": "0.1602.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", + "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1502.10", - "rxjs": "6.6.7" + "@angular-devkit/architect": "0.1602.14", + "rxjs": "7.8.1" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@angular-devkit/core": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-15.2.10.tgz", - "integrity": "sha512-bFPm7wjvfBds9km2rCJxUhzkqe4h3h/199yJtzC1bNvwRr2LMHvtyoQAzftda+gs7Ulqac5wzUEZX/cVV3WrsA==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", + "integrity": "sha512-Ui14/d2+p7lnmXlK/AX2ieQEGInBV75lonNtPQgwrYgskF8ufCuN0DyVZQUy9fJDkC+xQxbJyYrby/BS0R0e7w==", "dev": true, "requires": { "ajv": "8.12.0", "ajv-formats": "2.1.1", "jsonc-parser": "3.2.0", - "rxjs": "6.6.7", + "picomatch": "2.3.1", + "rxjs": "7.8.1", "source-map": "0.7.4" }, "dependencies": { @@ -23673,6 +24855,15 @@ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", "dev": true }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + }, "source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -23682,24 +24873,38 @@ } }, "@angular-devkit/schematics": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-15.2.10.tgz", - "integrity": "sha512-EeoDs4oKFpLZNa21G/8dqBdclEc4U2piI9EeXCVTaN6z5DYXIZ0G1WtCXU8nhD+GckS47rmfZ4/3lMaXAvED+g==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-16.2.14.tgz", + "integrity": "sha512-B6LQKInCT8w5zx5Pbroext5eFFRTCJdTwHN8GhcVS8IeKCnkeqVTQLjB4lBUg7LEm8Y7UHXwzrVxmk+f+MBXhw==", "dev": true, "requires": { - "@angular-devkit/core": "15.2.10", + "@angular-devkit/core": "16.2.14", "jsonc-parser": "3.2.0", - "magic-string": "0.29.0", + "magic-string": "0.30.1", "ora": "5.4.1", - "rxjs": "6.6.7" + "rxjs": "7.8.1" + }, + "dependencies": { + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "dev": true, + "requires": { + "tslib": "^2.1.0" + } + } } }, "@angular-eslint/builder": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-15.2.1.tgz", - "integrity": "sha512-7x2DANebLRl997Mj4DhZrnz5+vnSjavGGveJ0mBuU7CEsL0ZYLftdRqL0e0HtU3ksseS7xpchD6OM08nkNgySw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/builder/-/builder-16.3.1.tgz", + "integrity": "sha512-PmIOnRwqdOW1bvZtpTGBTDcOq/Czm3D+IPC/k90yIMs1VsAtcxqUmUtELje+ylJeb2LPeEZavekSnEpcatM4HQ==", "dev": true, - "requires": {} + "requires": { + "@nx/devkit": "16.5.1", + "nx": "16.5.1" + } }, "@angular-eslint/bundled-angular-compiler": { "version": "15.2.1", @@ -23708,38 +24913,48 @@ "dev": true }, "@angular-eslint/eslint-plugin": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-15.2.1.tgz", - "integrity": "sha512-OM7b1kS4E4CkXjkaWN+lEzawh4VxY6l7FO1Cuk4s7iv3/YpZG3rJxIZBqnFLTixwrBuqw8y4FNBzF3eDgmFAUw==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin/-/eslint-plugin-16.3.1.tgz", + "integrity": "sha512-kSc8ESfoy8TUSthbq0Lpq9e17I+3Smy4rHoNpKCFEGuJgPs0+OssZMxB6a5EawGbv2EKTPEtrxzFm1WsLR0U9Q==", "dev": true, "requires": { - "@angular-eslint/utils": "15.2.1", - "@typescript-eslint/utils": "5.48.2" + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/utils": "5.62.0" } }, "@angular-eslint/eslint-plugin-template": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-15.2.1.tgz", - "integrity": "sha512-IeiSLk6YxapFdH2z5o/O3R7VwtBd2T6fWmhLFPwDYMDknrwegnOjwswCdBplOccpUp0wqlCeGUx7LTsuzwaz7w==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/eslint-plugin-template/-/eslint-plugin-template-16.3.1.tgz", + "integrity": "sha512-+RcFEWqNiRt3+5jXvmlIDlXtP9+vjdmgmVL6tt8yDbqdjBOewtyMu4pE4YaR4sFboyxgME9PbO2WrOyPXh6xjg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "15.2.1", - "@angular-eslint/utils": "15.2.1", - "@typescript-eslint/type-utils": "5.48.2", - "@typescript-eslint/utils": "5.48.2", - "aria-query": "5.1.3", - "axobject-query": "3.1.1" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@angular-eslint/utils": "16.3.1", + "@typescript-eslint/type-utils": "5.62.0", + "@typescript-eslint/utils": "5.62.0", + "aria-query": "5.3.0", + "axobject-query": "4.0.0" + }, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + } } }, "@angular-eslint/schematics": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-15.2.1.tgz", - "integrity": "sha512-0ZfBCejHWIcgy3J5kFs9sS/jqi8i5AptxggOwFySOlCLJ+CzNrktjD4jff1Zy8K/VLzY0Ci0BSZXvgWfP0k9Rg==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/schematics/-/schematics-16.3.1.tgz", + "integrity": "sha512-cqrdobdtRY2XjLa6PhuGOQ7UhTRk2AvWS01sKeGjZ94nQJm5NUtEUyf6u3deIPYllW7gSAWjYzKUObKcTW/R+g==", "dev": true, "requires": { - "@angular-eslint/eslint-plugin": "15.2.1", - "@angular-eslint/eslint-plugin-template": "15.2.1", + "@angular-eslint/eslint-plugin": "16.3.1", + "@angular-eslint/eslint-plugin-template": "16.3.1", + "@nx/devkit": "16.5.1", "ignore": "5.2.4", + "nx": "16.5.1", "strip-json-comments": "3.1.1", "tmp": "0.2.1" } @@ -23773,38 +24988,40 @@ } }, "@angular-eslint/utils": { - "version": "15.2.1", - "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-15.2.1.tgz", - "integrity": "sha512-++FneAJHxJqcSu0igVN6uOkSoHxlzgLoMBswuovYJy3UKwm33/T6WFku8++753Ca/JucIoR1gdUfO7SoSspMDg==", + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/utils/-/utils-16.3.1.tgz", + "integrity": "sha512-tEBcce0rG+DmcPO8jhRffUFDioGw3G4cUAE15XlRctY1J3QzOBH9HdUOTDt0mMjBgpWCzh0YVT1Moh2bPXU9Xg==", "dev": true, "requires": { - "@angular-eslint/bundled-angular-compiler": "15.2.1", - "@typescript-eslint/utils": "5.48.2" + "@angular-eslint/bundled-angular-compiler": "16.3.1", + "@typescript-eslint/utils": "5.62.0" + }, + "dependencies": { + "@angular-eslint/bundled-angular-compiler": { + "version": "16.3.1", + "resolved": "https://registry.npmjs.org/@angular-eslint/bundled-angular-compiler/-/bundled-angular-compiler-16.3.1.tgz", + "integrity": "sha512-m4WP1xwS9XLcC/3n6lIcG5HZoai/5eb5W3xm48GVcv//0qE2p7S96RSgKPgGHvif5pF8O9xAqEWs3gDEG45+7A==", + "dev": true + } } }, "@angular/animations": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-15.2.10.tgz", - "integrity": "sha512-yxfN8qQpMaukRU5LjFkJBmy85rqrOp86tYVCsf+hmPEFRiXBMUj6xYLeCMcpk3Mt1JtnWGBR34ivGx+7bNeAow==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-16.2.12.tgz", + "integrity": "sha512-MD0ElviEfAJY8qMOd6/jjSSvtqER2RDAi0lxe6EtUacC1DHCYkaPrKW4vLqY+tmZBg1yf+6n+uS77pXcHHcA3w==", "requires": { "tslib": "^2.3.0" } }, "@angular/cdk": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-15.2.9.tgz", - "integrity": "sha512-koaM07N1AIQ5oHU27l0/FoQSSoYAwlAYwVZ4Di3bYrJsTBNCN2Xsby7wI8gZxdepMnV4Fe9si382BDBov+oO4Q==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-16.2.14.tgz", + "integrity": "sha512-n6PrGdiVeSTEmM/HEiwIyg6YQUUymZrb5afaNLGFRM5YL0Y8OBqd+XhCjb0OfD/AfgCUtedVEPwNqrfW8KzgGw==", "requires": { "parse5": "^7.1.2", "tslib": "^2.3.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "optional": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -23817,41 +25034,35 @@ } }, "@angular/cli": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-15.2.10.tgz", - "integrity": "sha512-/TSnm/ZQML6A4lvunyN2tjTB5utuvk3d1Pnfyehp/FXtV6YfZm6+EZrOpKkKPCxTuAgW6c9KK4yQtt3RuNVpwQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-16.2.14.tgz", + "integrity": "sha512-0y71jtitigVolm4Rim1b8xPQ+B22cGp4Spef2Wunpqj67UowN6tsZaVuWBEQh4u5xauX8LAHKqsvy37ZPWCc4A==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1502.10", - "@angular-devkit/core": "15.2.10", - "@angular-devkit/schematics": "15.2.10", - "@schematics/angular": "15.2.10", + "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", + "@schematics/angular": "16.2.14", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", - "ini": "3.0.1", + "ini": "4.1.1", "inquirer": "8.2.4", "jsonc-parser": "3.2.0", "npm-package-arg": "10.1.0", "npm-pick-manifest": "8.0.1", - "open": "8.4.1", + "open": "8.4.2", "ora": "5.4.1", - "pacote": "15.1.0", - "resolve": "1.22.1", - "semver": "7.5.3", + "pacote": "15.2.0", + "resolve": "1.22.2", + "semver": "7.5.4", "symbol-observable": "4.0.0", - "yargs": "17.6.2" + "yargs": "17.7.2" }, "dependencies": { - "ini": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz", - "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==", - "dev": true - }, "semver": { - "version": "7.5.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", - "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "requires": { "lru-cache": "^6.0.0" @@ -23860,147 +25071,134 @@ } }, "@angular/common": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-15.2.10.tgz", - "integrity": "sha512-jdBn3fctkqoNrJn9VLsUHpcCEhCxWSczdsR+BBbD6T0oLl6vMrAVNjPwfBejnlgfWN1KoRU9kgOYsMxa5apIWQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-16.2.12.tgz", + "integrity": "sha512-B+WY/cT2VgEaz9HfJitBmgdk4I333XG/ybC98CMC4Wz8E49T8yzivmmxXB3OD6qvjcOB6ftuicl6WBqLbZNg2w==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-15.2.10.tgz", - "integrity": "sha512-M0XkeU0O73UlJZwDvOyp8/apetz9UKj78eTFDseMYJDLcxe6MpkbkxqpsGZnKYDj7LIep8PmCAKEkhtenE82zw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-16.2.12.tgz", + "integrity": "sha512-6SMXUgSVekGM7R6l1Z9rCtUGtlg58GFmgbpMCsGf+VXxP468Njw8rjT2YZkf5aEPxEuRpSHhDYjqz7n14cwCXQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/compiler-cli": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-15.2.10.tgz", - "integrity": "sha512-mCFIxrs60XicKfA2o42hA7LrQvhybi9BQveWuZn/2iIEOXx7R62Iemz8E21pLWftAZHGxEW3NECfBrY1d3gVmA==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-16.2.12.tgz", + "integrity": "sha512-pWSrr152562ujh6lsFZR8NfNc5Ljj+zSTQO44DsuB0tZjwEpnRcjJEgzuhGXr+CoiBf+jTSPZKemtSktDk5aaA==", "dev": true, "requires": { - "@babel/core": "7.19.3", + "@babel/core": "7.23.2", "@jridgewell/sourcemap-codec": "^1.4.14", "chokidar": "^3.0.0", "convert-source-map": "^1.5.1", - "dependency-graph": "^0.11.0", - "magic-string": "^0.27.0", "reflect-metadata": "^0.1.2", "semver": "^7.0.0", "tslib": "^2.3.0", "yargs": "^17.2.1" - }, - "dependencies": { - "magic-string": { - "version": "0.27.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.27.0.tgz", - "integrity": "sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==", - "dev": true, - "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" - } - } } }, "@angular/core": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-15.2.10.tgz", - "integrity": "sha512-meGGidnitQJGDxYd9/LrqYiVlId+vGaLoiLgJdKBz+o2ZO6OmXQGuNw2VBqf17/Cc0/UjzrOY7+kILNFKkk/WQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-16.2.12.tgz", + "integrity": "sha512-GLLlDeke/NjroaLYOks0uyzFVo6HyLl7VOm0K1QpLXnYvW63W9Ql/T3yguRZa7tRkOAeFZ3jw+1wnBD4O8MoUA==", "requires": { "tslib": "^2.3.0" } }, "@angular/forms": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-15.2.10.tgz", - "integrity": "sha512-NIntGsNcN6o8L1txsbWXOf6f3K/CUBizdKsxsYVYGJIXEW5qU6UnWmfAZffNNXsT/XvbgUCjgDwT0cAwcqZPuQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-16.2.12.tgz", + "integrity": "sha512-1Eao89hlBgLR3v8tU91vccn21BBKL06WWxl7zLpQmG6Hun+2jrThgOE4Pf3os4fkkbH4Apj0tWL2fNIWe/blbw==", "requires": { "tslib": "^2.3.0" } }, "@angular/language-service": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-15.2.10.tgz", - "integrity": "sha512-G0g0teF4pBqLTgfyLcoBl55g91sCZvBK+V4VgTD/hXGpXyMNlNpOsgECSMliGQoJlsRLEugFsSlBNqy7CRoBtw==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/language-service/-/language-service-16.2.12.tgz", + "integrity": "sha512-sZwB+ZEjChx9EYcqPaS4OnhC/q5RcedZjIdM9mCxuU/MtseURRYRI/8Hnm1RHo9qyc5PmsQpg7p9Vp/5hXLUjw==", "dev": true }, "@angular/material": { - "version": "15.2.9", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-15.2.9.tgz", - "integrity": "sha512-emuFF/7+91Jq+6kVCl3FiVoFLtAZoh+woFQWNuK8nhx0HmD4ckLFI8d9a6ERYR3zRuKhq5deSRE2kYsfpjrrsQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/auto-init": "15.0.0-canary.684e33d25.0", - "@material/banner": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/card": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/chips": "15.0.0-canary.684e33d25.0", - "@material/circular-progress": "15.0.0-canary.684e33d25.0", - "@material/data-table": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dialog": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/drawer": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/fab": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/form-field": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/image-list": "15.0.0-canary.684e33d25.0", - "@material/layout-grid": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/linear-progress": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/radio": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/segmented-button": "15.0.0-canary.684e33d25.0", - "@material/select": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/slider": "15.0.0-canary.684e33d25.0", - "@material/snackbar": "15.0.0-canary.684e33d25.0", - "@material/switch": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", - "@material/tab-bar": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/tab-scroller": "15.0.0-canary.684e33d25.0", - "@material/textfield": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tooltip": "15.0.0-canary.684e33d25.0", - "@material/top-app-bar": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-16.2.14.tgz", + "integrity": "sha512-zQIxUb23elPfiIvddqkIDYqQhAHa9ZwMblfbv+ug8bxr4D0Dw360jIarxCgMjAcLj7Ccl3GBqZMUnVeM6cjthw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/auto-init": "15.0.0-canary.bc9ae6c9c.0", + "@material/banner": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/card": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/chips": "15.0.0-canary.bc9ae6c9c.0", + "@material/circular-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/data-table": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dialog": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/drawer": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/fab": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/form-field": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/image-list": "15.0.0-canary.bc9ae6c9c.0", + "@material/layout-grid": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/radio": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/segmented-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/slider": "15.0.0-canary.bc9ae6c9c.0", + "@material/snackbar": "15.0.0-canary.bc9ae6c9c.0", + "@material/switch": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/textfield": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tooltip": "15.0.0-canary.bc9ae6c9c.0", + "@material/top-app-bar": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.3.0" } }, "@angular/platform-browser": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-15.2.10.tgz", - "integrity": "sha512-9tbgVGSJqwfrOzT8aA/kWBLNhJSQ9gUg0CJxwFBSJm8VkBUJrszoBlDsnSvlxx8/W2ejNULKHFTXeUzq0O/+RQ==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-16.2.12.tgz", + "integrity": "sha512-NnH7ju1iirmVEsUq432DTm0nZBGQsBrU40M3ZeVHMQ2subnGiyUs3QyzDz8+VWLL/T5xTxWLt9BkDn65vgzlIQ==", "requires": { "tslib": "^2.3.0" } }, "@angular/platform-browser-dynamic": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-15.2.10.tgz", - "integrity": "sha512-JHP6W+FX715Qv7DhqvfZLuBZXSDJrboiQsR06gUAgDSjAUyhbqmpVg/2YOtgeWpPkzNDtXdPU2PhcRdIv5J3Yg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-16.2.12.tgz", + "integrity": "sha512-ya54jerNgreCVAR278wZavwjrUWImMr2F8yM5n9HBvsMBbFaAQ83anwbOEiHEF2BlR+gJiEBLfpuPRMw20pHqw==", "requires": { "tslib": "^2.3.0" } }, "@angular/router": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-15.2.10.tgz", - "integrity": "sha512-LmuqEg0iIXSw7bli6HKJ19cbxP91v37GtRwbGKswyLihqzTgvjBYpvcfMnB5FRQ5LWkTwq5JclkX03dZw290Yg==", + "version": "16.2.12", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-16.2.12.tgz", + "integrity": "sha512-aU6QnYSza005V9P3W6PpkieL56O0IHps96DjqI1RS8yOJUl3THmokqYN4Fm5+HXy4f390FN9i6ftadYQDKeWmA==", "requires": { "tslib": "^2.3.0" } @@ -24012,44 +25210,73 @@ "dev": true }, "@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", "dev": true, "requires": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", + "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", "dev": true }, "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", - "dev": true, - "requires": { - "@ampproject/remapping": "^2.1.0", - "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", - "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", - "convert-source-map": "^1.7.0", + "version": "7.23.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.2.tgz", + "integrity": "sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==", + "dev": true, + "requires": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.22.13", + "@babel/generator": "^7.23.0", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-module-transforms": "^7.23.0", + "@babel/helpers": "^7.23.2", + "@babel/parser": "^7.23.0", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.2", + "@babel/types": "^7.23.0", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.1", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "dependencies": { + "@babel/generator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + } + }, + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + } + }, + "convert-source-map": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", + "dev": true + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -24059,73 +25286,49 @@ } }, "@babel/generator": { - "version": "7.20.14", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.20.14.tgz", - "integrity": "sha512-AEmuXHdcD3A52HHXxaTmYlb8q/xMEhoRP67B3T4Oq7lbmSoqroMZzjnGj3+i1io3pdnF8iBYVu4Ilj+c4hBxYg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.9.tgz", + "integrity": "sha512-KtLMbmicyuK2Ak/FTCJVbDnkN1SlT8/kceFTiuDiiRUUSMnHMidxSCdG4ndkTOHHpoomWe/4xkvHkEOncwjYIw==", "dev": true, "requires": { - "@babel/types": "^7.20.7", + "@babel/types": "^7.22.5", "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } } }, "@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" } }, "@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz", - "integrity": "sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.24.7.tgz", + "integrity": "sha512-xZeCVVdwb4MsDBkkyZ64tReWYrLRHlMN72vP7Bdm3OUOuyFZExhsHUUnuWnm2/XOlAJzR0LfPpB56WXZn0X/lA==", "dev": true, "requires": { - "@babel/helper-explode-assignable-expression": "^7.18.6", - "@babel/types": "^7.18.9" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", + "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", + "@babel/compat-data": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", "browserslist": "^4.22.2", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, "dependencies": { - "browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -24150,44 +25353,68 @@ } }, "@babel/helper-create-class-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz", - "integrity": "sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.19.0", - "@babel/helper-member-expression-to-functions": "^7.18.9", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.9", - "@babel/helper-split-export-declaration": "^7.18.6" + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", + "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, + "@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true + } } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz", - "integrity": "sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==", - "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "regexpu-core": "^5.1.0" - } - }, - "@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", + "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", - "debug": "^4.1.1", - "lodash.debounce": "^4.0.8", - "resolve": "^1.14.2", - "semver": "^6.1.2" + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" }, "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + }, "semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -24196,138 +25423,170 @@ } } }, - "@babel/helper-environment-visitor": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", - "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true + "@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.2.tgz", + "integrity": "sha512-LV76g+C502biUK6AyZ3LK10vDpDyCzZnhZFXkH1L75zHPj68+qc8Zfpx2th+gzwA2MzyK+1g/3EPl62yFnVttQ==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } }, - "@babel/helper-explode-assignable-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz", - "integrity": "sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==", + "@babel/helper-environment-visitor": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", + "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.24.7" } }, "@babel/helper-function-name": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", - "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", + "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/types": "^7.23.0" + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" }, "dependencies": { "@babel/template": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", - "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "requires": { - "@babel/code-frame": "^7.22.13", - "@babel/parser": "^7.22.15", - "@babel/types": "^7.22.15" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" } } } }, "@babel/helper-hoist-variables": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", - "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", + "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" } }, "@babel/helper-member-expression-to-functions": { - "version": "7.23.0", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", - "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", + "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", "dev": true, "requires": { - "@babel/types": "^7.23.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", + "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", "dev": true, "requires": { - "@babel/types": "^7.22.15" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", + "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "dependencies": { + "@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/helper-optimise-call-expression": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", - "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.24.7.tgz", + "integrity": "sha512-jKiTsW2xmWwxT1ixIdfXUZp+P5yURx2suzLZr5Hi64rURpDYdMW0pv+Uf17EYk2Rd428Lx4tLsnjGJzYKDM/6A==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/types": "^7.24.7" } }, "@babel/helper-plugin-utils": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", - "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", + "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", + "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", "dev": true, "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/helper-replace-supers": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", - "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", + "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-member-expression-to-functions": "^7.22.15", - "@babel/helper-optimise-call-expression": "^7.22.5" + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" } }, "@babel/helper-simple-access": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", - "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.24.7.tgz", + "integrity": "sha512-zBAIvbCMh5Ts+b86r/CjU+4XGYIs+R1j951gxI3KmmxBMhCg4oQMsv6ZXQ64XOm/cvzfU1FmoCyt6+owc5QMYg==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.24.7.tgz", + "integrity": "sha512-IO+DLT3LQUElMbpzlatRASEyQtfhSE0+m465v++3jyyXeBTBUjtVZg28/gHeV5mrTJqvEKhKroBGAvhW+qPHiQ==", "dev": true, "requires": { - "@babel/types": "^7.20.0" + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" } }, "@babel/helper-split-export-declaration": { @@ -24340,33 +25599,46 @@ } }, "@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", + "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", + "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz", - "integrity": "sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", + "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "dependencies": { + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + } + } } }, "@babel/helpers": { @@ -24394,40 +25666,41 @@ } }, "@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-validator-identifier": "^7.24.7", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" } }, "@babel/parser": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz", - "integrity": "sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", + "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", "dev": true }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", + "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz", - "integrity": "sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.24.7.tgz", + "integrity": "sha512-+izXIbke1T33mY4MSNnrqhPXDz01WYhEf3yF5NbnUtkiNnm+XBZJl3kNfoK6NKmYlz/D07+l2GWVK/QfDkNCuQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-proposal-optional-chaining": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" } }, "@babel/plugin-proposal-async-generator-functions": { @@ -24452,77 +25725,6 @@ "@babel/helper-plugin-utils": "^7.18.6" } }, - "@babel/plugin-proposal-class-static-block": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz", - "integrity": "sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - } - }, - "@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - } - }, - "@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - } - }, - "@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - } - }, - "@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz", - "integrity": "sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - } - }, - "@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - } - }, - "@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - } - }, "@babel/plugin-proposal-object-rest-spread": { "version": "7.20.7", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", @@ -24536,48 +25738,12 @@ "@babel/plugin-transform-parameters": "^7.20.7" } }, - "@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - } - }, - "@babel/plugin-proposal-optional-chaining": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz", - "integrity": "sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - } - }, - "@babel/plugin-proposal-private-methods": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", - "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", - "dev": true, - "requires": { - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - } - }, "@babel/plugin-proposal-private-property-in-object": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz", - "integrity": "sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "requires": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - } + "requires": {} }, "@babel/plugin-proposal-unicode-property-regex": { "version": "7.18.6", @@ -24635,12 +25801,30 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", + "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", + "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", + "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.10.4" } }, "@babel/plugin-syntax-json-strings": { @@ -24733,33 +25917,55 @@ "@babel/helper-plugin-utils": "^7.14.5" } }, - "@babel/plugin-transform-arrow-functions": { + "@babel/plugin-syntax-unicode-sets-regex": { "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz", - "integrity": "sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", "dev": true, "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" } }, + "@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.24.7.tgz", + "integrity": "sha512-Dt9LQs6iEY++gXUwY03DNFat5C2NbO48jj+j/bSAz6b3HgPs39qcPiYt77fDObIcFwj3/C2ICX9YMwGflUoSHQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", + "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "dev": true, + "requires": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + } + }, "@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz", + "integrity": "sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.5" } }, "@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.24.7.tgz", + "integrity": "sha512-yO7RAz6EsVQDaBH18IDJcMB1HnrUn2FJ/Jslc/WtPPWcjhpUJXU/rjbwmluzp7v/ZzWcEhTMXELnnsz8djWDwQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-block-scoping": { @@ -24771,6 +25977,27 @@ "@babel/helper-plugin-utils": "^7.22.5" } }, + "@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", + "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.24.7.tgz", + "integrity": "sha512-HMXK3WbBPpZQufbMG4B46A90PkuuhN9vBCb5T8+VAHqvAqvcLi+2cKoukcpmUYkszLhScU3l1iudhrks3DggRQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + } + }, "@babel/plugin-transform-classes": { "version": "7.23.8", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz", @@ -24785,28 +26012,31 @@ "@babel/helper-replace-supers": "^7.22.20", "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" + } + }, + "@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.24.7.tgz", + "integrity": "sha512-25cS7v+707Gu6Ds2oY6tCkUwsJ9YIDbggd9+cu9jzzDgiNq7hR/8dkzxWfKWnTic26vsI3EsCXNd4iEB6e8esQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" }, "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", + "@babel/template": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", + "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", "dev": true, "requires": { - "@babel/types": "^7.22.5" + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" } } } }, - "@babel/plugin-transform-computed-properties": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz", - "integrity": "sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==", - "dev": true, - "requires": { - "@babel/helper-plugin-utils": "^7.18.9" - } - }, "@babel/plugin-transform-destructuring": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", @@ -24817,160 +26047,287 @@ } }, "@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.24.7.tgz", + "integrity": "sha512-ZOA3W+1RRTSWvyqcMJDLqbchh7U4NRGqwRfFSVbOLS/ePIP4vHB5e8T8eXcuqyN1QkgKyj5wuW0lcS85v4CrSw==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.24.7.tgz", + "integrity": "sha512-JdYfXyCRihAe46jUIliuL2/s0x0wObgwwiGxw/UbgJBr20gQBThrokO4nYKgWkD7uBaqM7+9x5TU7NkExZJyzw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", + "integrity": "sha512-sc3X26PhZQDb3JhORmakcbvkeInvxz+A8oda99lj7J60QRuPZvNAk9wQlTBS1ZynelDrDmTU4pw1tyc5d5ZMUg==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" } }, "@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.24.7.tgz", + "integrity": "sha512-Rqe/vSc9OYgDajNIK35u7ot+KeCoetqQYFXM4Epf7M7ez3lWlOjrDjrwMei6caCVhfdw+mIKD4cgdGNy5JQotQ==", "dev": true, "requires": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.24.7.tgz", + "integrity": "sha512-v0K9uNYsPL3oXZ/7F9NNIbAj2jv1whUEtyA6aujhekLs56R++JDQuzRcP2/z4WX5Vg/c5lE9uWZA0/iUoFhLTA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" } }, "@babel/plugin-transform-for-of": { - "version": "7.18.8", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz", - "integrity": "sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.24.7.tgz", + "integrity": "sha512-wo9ogrDG1ITTTBsy46oGiN1dS9A7MROBTcYsfS8DtsImMkHk9JXJ3EWQM6X2SUw4x80uGPlwj0o00Uoc6nEE3g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" } }, "@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", + "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.24.7.tgz", + "integrity": "sha512-2yFnBGDvRuxAaE/f0vfBKvtnvvqU8tGpMHqMNpTN2oWMKIR3NqFkjaAgGwawhqK/pIN2T3XdjGPdaG0vDhOBGw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" } }, "@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", + "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.24.7.tgz", + "integrity": "sha512-4D2tpwlQ1odXmTEIFWy9ELJcZHqrStlzK/dAOWYyxX3zT0iXQB6banjgeOJQXzEc4S0E0a5A+hahxPaEFYftsw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" } }, "@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.24.7.tgz", + "integrity": "sha512-T/hRC1uqrzXMKLQ6UCwMT85S3EvqaBXDGf0FaMf4446Qx9vKwlghvee0+uuZcDUCZU5RuNi4781UQ7R308zzBw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-modules-amd": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.19.6.tgz", - "integrity": "sha512-uG3od2mXvAtIFQIh0xrpLH6r5fpSQN04gIVovl+ODLdUMANokxQLZnPBHcjmv3GxRjnqwLuHvppjjcelqUFZvg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.24.7.tgz", + "integrity": "sha512-9+pB1qxV3vs/8Hdmz/CulFB8w2tuu6EB94JZFsjdqxQokwGa9Unap7Bo2gGBGIvPmDIVvQrom7r5m/TCDMURhg==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.19.6.tgz", - "integrity": "sha512-8PIa1ym4XRTKuSsOUXqDG0YaOlEuTVvHMe5JCfgBMOtHvJKw/4NGovEGN33viISshG/rZNVrACiBmPQLvWN8xQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", + "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-simple-access": "^7.19.4" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.6.tgz", - "integrity": "sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", + "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.19.6", - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" } }, "@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.24.7.tgz", + "integrity": "sha512-3aytQvqJ/h9z4g8AsKPLvD4Zqi2qT+L3j7XoFFu1XBlZWEl2/1kWnhmAbxpLgPrHSY0M6UA02jyTiwUVtiKR6A==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz", - "integrity": "sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.24.7.tgz", + "integrity": "sha512-/jr7h/EWeJtk1U/uz2jlsCioHkZk1JJZVcc8oQsJ1dUlaJD83f4/6Zeh2aHt9BIFokHIsSeDfhUmju0+1GPd6g==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.19.0", - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.24.7.tgz", + "integrity": "sha512-RNKwfRIXg4Ls/8mMTza5oPF5RkOW8Wy/WgMAp1/F1yZ8mMbtwXW+HDoJiOsagWrAhI5f57Vncrmr9XeT4CVapA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.24.7.tgz", + "integrity": "sha512-Ts7xQVk1OEocqzm8rHMXHlxvsfZ0cEF2yomUqpKENHWMF4zKk175Y4q8H5knJes6PgYad50uuRmt3UJuhBw8pQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + } + }, + "@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.24.7.tgz", + "integrity": "sha512-e6q1TiVUzvH9KRvicuxdBTUj4AdKSRwzIyFFnfnezpCfP2/7Qmbb8qbU2j7GODbl4JMkblitCQjKYUaX/qkkwA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + } + }, + "@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.24.7.tgz", + "integrity": "sha512-4QrHAr0aXQCEFni2q4DqKLD31n2DL+RxcwnNjDFkSG0eNQ/xCavnRkfCUjsyqGC2OviNJvZOF/mQqZBw7i2C5Q==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" } }, "@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.24.7.tgz", + "integrity": "sha512-A/vVLwN6lBrMFmMDmPPz0jnE6ZGx7Jq7d6sT/Ev4H65RER6pZ+kczlf1DthF5N0qaPHBsI7UXiE8Zy66nmAovg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + } + }, + "@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.24.7.tgz", + "integrity": "sha512-uLEndKqP5BfBbC/5jTwPxLh9kqPWWgzN/f8w6UwAIirAEqiIVJWWY312X72Eub09g5KF9+Zn7+hT7sDxmhRuKA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + } + }, + "@babel/plugin-transform-optional-chaining": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", + "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" } }, "@babel/plugin-transform-parameters": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", - "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.24.7.tgz", + "integrity": "sha512-yGWW5Rr+sQOhK0Ot8hjDJuxU3XLRQGflvT4lhlSY0DFvdb3TwKaY26CJzHtYllU0vT9j58hc37ndFPsqT1SrzA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", + "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "dev": true, + "requires": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.24.7.tgz", + "integrity": "sha512-9z76mxwnwFxMyxZWEgdgECQglF2Q7cFLm0kMf8pGwt+GSJsY0cONKj/UuO4bOH0w/uAel3ekS4ra5CEAyJRmDA==", + "dev": true, + "requires": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "dependencies": { + "@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.24.7.tgz", + "integrity": "sha512-BaDeOonYvhdKw+JoMVkAixAAJzG2jVPIwWoKBPdYuY9b452e2rPuI9QPYh3KpofZ3pW2akOmwZLOiOsHMiqRAg==", + "dev": true, + "requires": { + "@babel/types": "^7.24.7" + } + } } }, "@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.24.7.tgz", + "integrity": "sha512-EMi4MLQSHfd2nrCqQEWxFdha2gBCqU4ZcCng4WBGZ5CJL4bBRW0ptdqqDdeirGZcpALazVVNJqRmsO8/+oNCBA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-react-display-name": { @@ -24993,17 +26350,6 @@ "@babel/helper-plugin-utils": "^7.22.5", "@babel/plugin-syntax-jsx": "^7.22.5", "@babel/types": "^7.22.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - } } }, "@babel/plugin-transform-react-jsx-development": { @@ -25023,50 +26369,39 @@ "requires": { "@babel/helper-annotate-as-pure": "^7.22.5", "@babel/helper-plugin-utils": "^7.22.5" - }, - "dependencies": { - "@babel/helper-annotate-as-pure": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", - "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", - "dev": true, - "requires": { - "@babel/types": "^7.22.5" - } - } } }, "@babel/plugin-transform-regenerator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz", - "integrity": "sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.24.7.tgz", + "integrity": "sha512-lq3fvXPdimDrlg6LWBoqj+r/DEWgONuwjuOuQCSYgRroXDH/IdM1C0IZf59fL5cHLpjEH/O6opIRBbqv7ELnuA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6", - "regenerator-transform": "^0.15.0" + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" } }, "@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.24.7.tgz", + "integrity": "sha512-0DUq0pHcPKbjFZCfTss/pGkYMfy3vFWydkUBd9r0GHpIyfs2eCDENvqadMycRS9wZCXR41wucAfJHJmwA0UmoQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-runtime": { - "version": "7.19.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.19.6.tgz", - "integrity": "sha512-PRH37lz4JU156lYFW1p8OxE5i7d6Sl/zV58ooyr+q1J1lnQPyg5tIiXlIwNVhJaY4W3TmOtdc8jqdXQcB1v5Yw==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.9.tgz", + "integrity": "sha512-9KjBH61AGJetCPYp/IEyLEp47SyybZb0nDRpBvmtEkm+rUIwxdlKpyNHI1TmsGkeuLclJdleQHRZ8XLBnnh8CQ==", "dev": true, "requires": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.19.0", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -25078,103 +26413,111 @@ } }, "@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.24.7.tgz", + "integrity": "sha512-KsDsevZMDsigzbA09+vacnLpmPH4aWjcZjXdyFKGzpplxhbeB4wYtury3vglQkg6KM/xEPKt73eCjPPf1PgXBA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-spread": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz", - "integrity": "sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.24.7.tgz", + "integrity": "sha512-x96oO0I09dgMDxJaANcRyD4ellXFLLiWhuwDxKZX5g2rWP1bTPkBSwCYv96VDXVT1bD9aPj8tppr5ITIh8hBng==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.19.0", - "@babel/helper-skip-transparent-expression-wrappers": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" } }, "@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.24.7.tgz", + "integrity": "sha512-kHPSIJc9v24zEml5geKg9Mjx5ULpfncj0wRpYtxbvKyTtHCYDkVE3aHQ03FrpEo4gEe2vrJJS1Y9CJTaThA52g==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.24.7.tgz", + "integrity": "sha512-AfDTQmClklHCOLxtGoP7HkeMw56k1/bTQjwsfhL6pppo/M4TOBSq+jjBUBLmV/4oeFg4GWMavIl44ZeCtmmZTw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", + "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-unicode-escapes": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz", - "integrity": "sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.24.7.tgz", + "integrity": "sha512-U3ap1gm5+4edc2Q/P+9VrBNhGkfnf+8ZqppY71Bo/pzZmXhhLdqgaUl6cuB07O1+AQJtCLfaOmswiNbSQ9ivhw==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.24.7.tgz", + "integrity": "sha512-uH2O4OV5M9FZYQrwc7NdVmMxQJOCCzFeYudlZSzUAHRFeOujQefa92E74TQDVskNHCzOXoigEuoyzHDhaEaK5w==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.24.7.tgz", + "integrity": "sha512-hlQ96MBZSAXUq7ltkjtu3FJCCSMx/j629ns3hA3pXnBXjanNP0LHi+JpPeA81zaWgVK1VGH95Xuy7u0RyQ8kMg==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + } + }, + "@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", + "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" } }, "@babel/preset-env": { - "version": "7.20.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.20.2.tgz", - "integrity": "sha512-1G0efQEWR1EHkKvKHqbG+IN/QdgwfByUpM5V5QroDzGV2t3S/WXNQd693cHiHTlCFMpr9B6FkPFXDA2lQcKoDg==", + "version": "7.22.9", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.9.tgz", + "integrity": "sha512-wNi5H/Emkhll/bqPjsjQorSykrlfY5OWakd6AulLvMEytpKasMVUpVy8RL4qBIBs5Ac6/5i0/Rv0b/Fg6Eag/g==", "dev": true, "requires": { - "@babel/compat-data": "^7.20.1", - "@babel/helper-compilation-targets": "^7.20.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-option": "^7.18.6", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-async-generator-functions": "^7.20.1", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.18.6", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.18.9", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.2", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.18.9", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.18.6", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "@babel/compat-data": "^7.22.9", + "@babel/helper-compilation-targets": "^7.22.9", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.22.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.22.5", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.22.5", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.22.5", + "@babel/plugin-syntax-import-attributes": "^7.22.5", + "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", @@ -25184,45 +26527,62 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.18.6", - "@babel/plugin-transform-async-to-generator": "^7.18.6", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.20.2", - "@babel/plugin-transform-classes": "^7.20.2", - "@babel/plugin-transform-computed-properties": "^7.18.9", - "@babel/plugin-transform-destructuring": "^7.20.2", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.18.8", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.19.6", - "@babel/plugin-transform-modules-commonjs": "^7.19.6", - "@babel/plugin-transform-modules-systemjs": "^7.19.6", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.19.1", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.20.1", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.18.6", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.19.0", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.18.10", - "@babel/plugin-transform-unicode-regex": "^7.18.6", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.22.5", + "@babel/plugin-transform-async-generator-functions": "^7.22.7", + "@babel/plugin-transform-async-to-generator": "^7.22.5", + "@babel/plugin-transform-block-scoped-functions": "^7.22.5", + "@babel/plugin-transform-block-scoping": "^7.22.5", + "@babel/plugin-transform-class-properties": "^7.22.5", + "@babel/plugin-transform-class-static-block": "^7.22.5", + "@babel/plugin-transform-classes": "^7.22.6", + "@babel/plugin-transform-computed-properties": "^7.22.5", + "@babel/plugin-transform-destructuring": "^7.22.5", + "@babel/plugin-transform-dotall-regex": "^7.22.5", + "@babel/plugin-transform-duplicate-keys": "^7.22.5", + "@babel/plugin-transform-dynamic-import": "^7.22.5", + "@babel/plugin-transform-exponentiation-operator": "^7.22.5", + "@babel/plugin-transform-export-namespace-from": "^7.22.5", + "@babel/plugin-transform-for-of": "^7.22.5", + "@babel/plugin-transform-function-name": "^7.22.5", + "@babel/plugin-transform-json-strings": "^7.22.5", + "@babel/plugin-transform-literals": "^7.22.5", + "@babel/plugin-transform-logical-assignment-operators": "^7.22.5", + "@babel/plugin-transform-member-expression-literals": "^7.22.5", + "@babel/plugin-transform-modules-amd": "^7.22.5", + "@babel/plugin-transform-modules-commonjs": "^7.22.5", + "@babel/plugin-transform-modules-systemjs": "^7.22.5", + "@babel/plugin-transform-modules-umd": "^7.22.5", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.22.5", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.22.5", + "@babel/plugin-transform-numeric-separator": "^7.22.5", + "@babel/plugin-transform-object-rest-spread": "^7.22.5", + "@babel/plugin-transform-object-super": "^7.22.5", + "@babel/plugin-transform-optional-catch-binding": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.22.6", + "@babel/plugin-transform-parameters": "^7.22.5", + "@babel/plugin-transform-private-methods": "^7.22.5", + "@babel/plugin-transform-private-property-in-object": "^7.22.5", + "@babel/plugin-transform-property-literals": "^7.22.5", + "@babel/plugin-transform-regenerator": "^7.22.5", + "@babel/plugin-transform-reserved-words": "^7.22.5", + "@babel/plugin-transform-shorthand-properties": "^7.22.5", + "@babel/plugin-transform-spread": "^7.22.5", + "@babel/plugin-transform-sticky-regex": "^7.22.5", + "@babel/plugin-transform-template-literals": "^7.22.5", + "@babel/plugin-transform-typeof-symbol": "^7.22.5", + "@babel/plugin-transform-unicode-escapes": "^7.22.5", + "@babel/plugin-transform-unicode-property-regex": "^7.22.5", + "@babel/plugin-transform-unicode-regex": "^7.22.5", + "@babel/plugin-transform-unicode-sets-regex": "^7.22.5", "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/types": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.4", + "babel-plugin-polyfill-corejs3": "^0.8.2", + "babel-plugin-polyfill-regenerator": "^0.5.1", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -25260,77 +26620,81 @@ "@babel/plugin-transform-react-pure-annotations": "^7.22.5" } }, + "@babel/regjsgen": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz", + "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==", + "dev": true + }, "@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.6.tgz", + "integrity": "sha512-wDb5pWm4WDdF6LFUde3Jl8WzPA+3ZbxYqkC6xAXuD3irdEHN1k0NfTRrJD8ZD378SJ61miMLCqIOXYhd8x+AJQ==", "dev": true, "requires": { "regenerator-runtime": "^0.13.11" } }, "@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.5.tgz", + "integrity": "sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==", "dev": true, "requires": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.5", + "@babel/parser": "^7.22.5", + "@babel/types": "^7.22.5" } }, "@babel/traverse": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz", - "integrity": "sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-function-name": "^7.23.0", - "@babel/helper-hoist-variables": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.23.9", - "@babel/types": "^7.23.9", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", + "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7", "debug": "^4.3.1", "globals": "^11.1.0" }, "dependencies": { "@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", + "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", "dev": true, "requires": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.7", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" } }, - "@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "@babel/helper-split-export-declaration": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", + "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" + "@babel/types": "^7.24.7" } } } }, "@babel/types": { - "version": "7.23.9", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz", - "integrity": "sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q==", + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", + "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.23.4", - "@babel/helper-validator-identifier": "^7.22.20", + "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } }, @@ -26084,159 +27448,168 @@ "dev": true }, "@esbuild/android-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.17.8.tgz", - "integrity": "sha512-0/rb91GYKhrtbeglJXOhAv9RuYimgI8h623TplY2X+vA4EXnk3Zj1fXZreJ0J3OJJu1bwmb0W7g+2cT/d8/l/w==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.18.17.tgz", + "integrity": "sha512-wHsmJG/dnL3OkpAcwbgoBTTMHVi4Uyou3F5mf58ZtmUyIKfcdA7TROav/6tCzET4A3QW2Q2FC+eFneMU+iyOxg==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.17.8.tgz", - "integrity": "sha512-oa/N5j6v1svZQs7EIRPqR8f+Bf8g6HBDjD/xHC02radE/NjKHK7oQmtmLxPs1iVwYyvE+Kolo6lbpfEQ9xnhxQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.18.17.tgz", + "integrity": "sha512-9np+YYdNDed5+Jgr1TdWBsozZ85U1Oa3xW0c7TWqH0y2aGghXtZsuT8nYRbzOMcl0bXZXjOGbksoTtVOlWrRZg==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.17.8.tgz", - "integrity": "sha512-bTliMLqD7pTOoPg4zZkXqCDuzIUguEWLpeqkNfC41ODBHwoUgZ2w5JBeYimv4oP6TDVocoYmEhZrCLQTrH89bg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.18.17.tgz", + "integrity": "sha512-O+FeWB/+xya0aLg23hHEM2E3hbfwZzjqumKMSIqcHbNvDa+dza2D0yLuymRBQQnC34CWrsJUXyH2MG5VnLd6uw==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.17.8.tgz", - "integrity": "sha512-ghAbV3ia2zybEefXRRm7+lx8J/rnupZT0gp9CaGy/3iolEXkJ6LYRq4IpQVI9zR97ID80KJVoUlo3LSeA/sMAg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.18.17.tgz", + "integrity": "sha512-M9uJ9VSB1oli2BE/dJs3zVr9kcCBBsE883prage1NWz6pBS++1oNn/7soPNS3+1DGj0FrkSvnED4Bmlu1VAE9g==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.17.8.tgz", - "integrity": "sha512-n5WOpyvZ9TIdv2V1K3/iIkkJeKmUpKaCTdun9buhGRWfH//osmUjlv4Z5mmWdPWind/VGcVxTHtLfLCOohsOXw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.18.17.tgz", + "integrity": "sha512-XDre+J5YeIJDMfp3n0279DFNrGCXlxOuGsWIkRb1NThMZ0BsrWXoTg23Jer7fEXQ9Ye5QjrvXpxnhzl3bHtk0g==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.17.8.tgz", - "integrity": "sha512-a/SATTaOhPIPFWvHZDoZYgxaZRVHn0/LX1fHLGfZ6C13JqFUZ3K6SMD6/HCtwOQ8HnsNaEeokdiDSFLuizqv5A==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.18.17.tgz", + "integrity": "sha512-cjTzGa3QlNfERa0+ptykyxs5A6FEUQQF0MuilYXYBGdBxD3vxJcKnzDlhDCa1VAJCmAxed6mYhA2KaJIbtiNuQ==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.17.8.tgz", - "integrity": "sha512-xpFJb08dfXr5+rZc4E+ooZmayBW6R3q59daCpKZ/cDU96/kvDM+vkYzNeTJCGd8rtO6fHWMq5Rcv/1cY6p6/0Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.18.17.tgz", + "integrity": "sha512-sOxEvR8d7V7Kw8QqzxWc7bFfnWnGdaFBut1dRUYtu+EIRXefBc/eIsiUiShnW0hM3FmQ5Zf27suDuHsKgZ5QrA==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.17.8.tgz", - "integrity": "sha512-6Ij8gfuGszcEwZpi5jQIJCVIACLS8Tz2chnEBfYjlmMzVsfqBP1iGmHQPp7JSnZg5xxK9tjCc+pJ2WtAmPRFVA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.18.17.tgz", + "integrity": "sha512-2d3Lw6wkwgSLC2fIvXKoMNGVaeY8qdN0IC3rfuVxJp89CRfA3e3VqWifGDfuakPmp90+ZirmTfye1n4ncjv2lg==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.17.8.tgz", - "integrity": "sha512-v3iwDQuDljLTxpsqQDl3fl/yihjPAyOguxuloON9kFHYwopeJEf1BkDXODzYyXEI19gisEsQlG1bM65YqKSIww==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.18.17.tgz", + "integrity": "sha512-c9w3tE7qA3CYWjT+M3BMbwMt+0JYOp3vCMKgVBrCl1nwjAlOMYzEo+gG7QaZ9AtqZFj5MbUc885wuBBmu6aADQ==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.17.8.tgz", - "integrity": "sha512-8svILYKhE5XetuFk/B6raFYIyIqydQi+GngEXJgdPdI7OMKUbSd7uzR02wSY4kb53xBrClLkhH4Xs8P61Q2BaA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.18.17.tgz", + "integrity": "sha512-1DS9F966pn5pPnqXYz16dQqWIB0dmDfAQZd6jSSpiT9eX1NzKh07J6VKR3AoXXXEk6CqZMojiVDSZi1SlmKVdg==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.17.8.tgz", - "integrity": "sha512-B6FyMeRJeV0NpyEOYlm5qtQfxbdlgmiGdD+QsipzKfFky0K5HW5Td6dyK3L3ypu1eY4kOmo7wW0o94SBqlqBSA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.18.17.tgz", + "integrity": "sha512-EvLsxCk6ZF0fpCB6w6eOI2Fc8KW5N6sHlIovNe8uOFObL2O+Mr0bflPHyHwLT6rwMg9r77WOAWb2FqCQrVnwFg==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.17.8.tgz", - "integrity": "sha512-CCb67RKahNobjm/eeEqeD/oJfJlrWyw29fgiyB6vcgyq97YAf3gCOuP6qMShYSPXgnlZe/i4a8WFHBw6N8bYAA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.18.17.tgz", + "integrity": "sha512-e0bIdHA5p6l+lwqTE36NAW5hHtw2tNRmHlGBygZC14QObsA3bD4C6sXLJjvnDIjSKhW1/0S3eDy+QmX/uZWEYQ==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.17.8.tgz", - "integrity": "sha512-bytLJOi55y55+mGSdgwZ5qBm0K9WOCh0rx+vavVPx+gqLLhxtSFU0XbeYy/dsAAD6xECGEv4IQeFILaSS2auXw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.18.17.tgz", + "integrity": "sha512-BAAilJ0M5O2uMxHYGjFKn4nJKF6fNCdP1E0o5t5fvMYYzeIqy2JdAP88Az5LHt9qBoUa4tDaRpfWt21ep5/WqQ==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.17.8.tgz", - "integrity": "sha512-2YpRyQJmKVBEHSBLa8kBAtbhucaclb6ex4wchfY0Tj3Kg39kpjeJ9vhRU7x4mUpq8ISLXRXH1L0dBYjAeqzZAw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.18.17.tgz", + "integrity": "sha512-Wh/HW2MPnC3b8BqRSIme/9Zhab36PPH+3zam5pqGRH4pE+4xTrVLx2+XdGp6fVS3L2x+DrsIcsbMleex8fbE6g==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.17.8.tgz", - "integrity": "sha512-QgbNY/V3IFXvNf11SS6exkpVcX0LJcob+0RWCgV9OiDAmVElnxciHIisoSix9uzYzScPmS6dJFbZULdSAEkQVw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.18.17.tgz", + "integrity": "sha512-j/34jAl3ul3PNcK3pfI0NSlBANduT2UO5kZ7FCaK33XFv3chDhICLY8wJJWIhiQ+YNdQ9dxqQctRg2bvrMlYgg==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.17.8.tgz", - "integrity": "sha512-mM/9S0SbAFDBc4OPoyP6SEOo5324LpUxdpeIUUSrSTOfhHU9hEfqRngmKgqILqwx/0DVJBzeNW7HmLEWp9vcOA==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.17.tgz", + "integrity": "sha512-QM50vJ/y+8I60qEmFxMoxIx4de03pGo2HwxdBeFd4nMh364X6TIBZ6VQ5UQmPbQWUVWHWws5MmJXlHAXvJEmpQ==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.17.8.tgz", - "integrity": "sha512-eKUYcWaWTaYr9zbj8GertdVtlt1DTS1gNBWov+iQfWuWyuu59YN6gSEJvFzC5ESJ4kMcKR0uqWThKUn5o8We6Q==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.18.17.tgz", + "integrity": "sha512-/jGlhWR7Sj9JPZHzXyyMZ1RFMkNPjC6QIAan0sDOtIo2TYk3tZn5UDrkE0XgsTQCxWTTOcMPf9p6Rh2hXtl5TQ==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.17.8.tgz", - "integrity": "sha512-Vc9J4dXOboDyMXKD0eCeW0SIeEzr8K9oTHJU+Ci1mZc5njPfhKAqkRt3B/fUNU7dP+mRyralPu8QUkiaQn7iIg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.18.17.tgz", + "integrity": "sha512-rSEeYaGgyGGf4qZM2NonMhMOP/5EHp4u9ehFiBrg7stH6BYEEjlkVREuDEcQ0LfIl53OXLxNbfuIj7mr5m29TA==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.17.8.tgz", - "integrity": "sha512-0xvOTNuPXI7ft1LYUgiaXtpCEjp90RuBBYovdd2lqAFxje4sEucurg30M1WIm03+3jxByd3mfo+VUmPtRSVuOw==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.18.17.tgz", + "integrity": "sha512-Y7ZBbkLqlSgn4+zot4KUNYst0bFoO68tRgI6mY2FIM+b7ZbyNVtNbDP5y8qlu4/knZZ73fgJDlXID+ohY5zt5g==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.17.8.tgz", - "integrity": "sha512-G0JQwUI5WdEFEnYNKzklxtBheCPkuDdu1YrtRrjuQv30WsYbkkoixKxLLv8qhJmNI+ATEWquZe/N0d0rpr55Mg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.18.17.tgz", + "integrity": "sha512-bwPmTJsEQcbZk26oYpc4c/8PvTY3J5/QK8jM19DVlEsAB41M39aWovWoHtNm78sd6ip6prilxeHosPADXtEJFw==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.17.8.tgz", - "integrity": "sha512-Fqy63515xl20OHGFykjJsMnoIWS+38fqfg88ClvPXyDbLtgXal2DTlhb1TfTX34qWi3u4I7Cq563QcHpqgLx8w==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.18.17.tgz", + "integrity": "sha512-H/XaPtPKli2MhW+3CQueo6Ni3Avggi6hP/YvgkEe1aSaxw+AeO8MFjq8DlgfTd9Iz4Yih3QCZI6YLMoyccnPRg==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.17.8.tgz", - "integrity": "sha512-1iuezdyDNngPnz8rLRDO2C/ZZ/emJLb72OsZeqQ6gL6Avko/XCXZw+NuxBSNhBAP13Hie418V7VMt9et1FMvpg==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.18.17.tgz", + "integrity": "sha512-fGEb8f2BSA3CW7riJVurug65ACLuQAzKq0SSqkY2b2yHHH0MzDfbLyKIGzHwOI/gkHcxM/leuSW6D5w/LMNitA==", "dev": true, "optional": true }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, "@eslint/eslintrc": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.0.5.tgz", @@ -26293,9 +27666,9 @@ } }, "@fortawesome/angular-fontawesome": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.12.1.tgz", - "integrity": "sha512-vGGUfmWhsCtC+wUhnLXPeWBod33XKMFERwvD21LTbVBOCwUDUfwcS9nqfTmrULcpFl/bn20REZH/1vSreWd3ZA==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@fortawesome/angular-fontawesome/-/angular-fontawesome-0.13.0.tgz", + "integrity": "sha512-gzSPRdveOXNO7NIiMgTyB46aiHG0i98KinnAEqHXi8qzraM/kCcHn/0y3f4MhemX6kftwsFli0IU8RyHmtXlSQ==", "requires": { "tslib": "^2.4.1" } @@ -26444,13 +27817,14 @@ "dev": true }, "@jridgewell/gen-mapping": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", - "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", "dev": true, "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" } }, "@jridgewell/resolve-uri": { @@ -26460,804 +27834,792 @@ "dev": true }, "@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", "dev": true }, "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "dependencies": { - "@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "requires": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - } + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, "@leichtgewicht/ip-codec": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz", + "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==", "dev": true }, "@material/animation": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-5osi1z4JQIXcklPALbH/zTfOm2pDzHt9Fxm7ZyURy250xIZj6QjULRzPTnzOhC2ropfix9ra2Cfggbf0dcRbEQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/animation/-/animation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-leRf+BcZTfC/iSigLXnYgcHAGvFVQveoJT5+2PIRdyPI/bIG7hhciRgacHRsCKC0sGya81dDblLgdkjSUemYLw==", "requires": { "tslib": "^2.1.0" } }, "@material/auto-init": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-OigQTmrVzkcGvxNjOaIe5oItTFPgrO9xLewvharDI6m6yvO1z7OBnkcW+sFN6ggLNYNxd0O1u9v64vMsmeDABQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/auto-init/-/auto-init-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uxzDq7q3c0Bu1pAsMugc1Ik9ftQYQqZY+5e2ybNplT8gTImJhNt4M2mMiMHbMANk2l3UgICmUyRSomgPBWCPIA==", "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/banner": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-PqtGp3KWzdu58rWv/DIvSfe38m5YKOBbAAbBinSvgadBb/da+IE1t5F7YPNKE1T5lJsQBGVUYx6QBIeXm+aI/A==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/banner/-/banner-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SHeVoidCUFVhXANN6MNWxK9SZoTSgpIP8GZB7kAl52BywLxtV+FirTtLXkg/8RUkxZRyRWl7HvQ0ZFZa7QQAyA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/base": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-oOaqb/SfjWwTKsdJUZmeh/Qrs41nIJI0N+zELsxnvbGjSIN1ZMAKYZFPMahqvC68OJ6+5CvJM8PoTNs5l+B8IQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/base/-/base-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Fc3vGuOf+duGo22HTRP6dHdc+MUe0VqQfWOuKrn/wXKD62m0QQR2TqJd3rRhCumH557T5QUyheW943M3E+IGfg==", "requires": { "tslib": "^2.1.0" } }, "@material/button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Nkekk4edeX+ObVOa7UlwavaHdmckPV5wU4SAJf3iA3R61cmz+KsgAgpzfcwv5WfNhIlc2nLu8QYEecpHdo9d/w==", - "requires": { - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/button/-/button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AQgwrPZCTWHDJvwgKq7Cj+BurQ4wTjDdGL+FEnIGUAjJDskwi1yzx5tW2Wf/NxIi7IoPFyOY3UB41jwMiOrnw==", + "requires": { + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/card": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-xhyB7XX5KkEiCEqwSPkl58ZGYL6xFdnY62zimyBXJRG/Eaa0Swj3kW20hVCpt4f7c9Zmp8Se27rg8vnKmhvO3g==", - "requires": { - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/card/-/card-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nPlhiWvbLmooTnBmV5gmzB0eLWSgLKsSRBYAbIBmO76Okgz1y+fQNLag+lpm/TDaHVsn5fmQJH8e0zIg0rYsQA==", + "requires": { + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/checkbox": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-NFpM3TS924PmVsk2KQLNU95OYCf8ZwYgzeqfnAexU0bEfjUJXINBun2Go0AaeOUMjuvWUe+byjrXgv8SFYbMUA==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/checkbox/-/checkbox-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-4tpNnO1L0IppoMF3oeQn8F17t2n0WHB0D7mdJK9rhrujen/fLbekkIC82APB3fdGtLGg3qeNqDqPsJm1YnmrwA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/chips": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-z4ajQ4NnsAQ/Si9tZ4xmxzjj2Qb+vW++4QjCjjjwAGIZbCe0xglAnMh2t66XLJUxt7RoKZuZVEO7ZqcFZpvJFQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/chips/-/chips-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-fqHKvE5bSWK0bXVkf57MWxZtytGqYBZvvHIOs4JI9HPHEhaJy4CpSw562BEtbm3yFxxALoQknvPW2KYzvADnmA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "@material/circular-progress": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-G6qD0nGNtEUwWnAMJuA9INYFpZoKtx7KFjBaPF4Ol2YLHtmShALNAYyn54TMAK8AZ2IpW08PXjGS7Ye88vrdEQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/progress-indicator": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/circular-progress/-/circular-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Lxe8BGAxQwCQqrLhrYrIP0Uok10h7aYS3RBXP41ph+5GmwJd5zdyE2t93qm2dyThvU6qKuXw9726Dtq/N+wvZQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/data-table": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-+wDw1DDDFfAsKAMzs84f/5GCjux39zjNfW8tL4wFbkWNwewmQrG9zaQMJhBpVOtLCrM8Gj6SOgOANqgqoCjvGg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/checkbox": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/linear-progress": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/select": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/data-table/-/data-table-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-j/7qplT9+sUpfe4pyWhPbl01qJA+OoNAG3VMJruBBR461ZBKyTi7ssKH9yksFGZ8eCEPkOsk/+kDxsiZvRWkeQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/checkbox": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/linear-progress": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/select": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/density": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-661yEVRMGrlq6S6WuSbPRO+ZwpdUOg2glCc7y96doM6itSLOa3UEAldjOLfsYZVB74GnKCiuDp//QmfoRyYTfA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/density/-/density-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Zt3u07fXrBWLW06Tl5fgvjicxNQMkFdawLyNTzZ5TvbXfVkErILLePwwGaw8LNcvzqJP6ABLA8jiR+sKNoJQCg==", "requires": { "tslib": "^2.1.0" } }, "@material/dialog": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-szn0dHnfeQTSOC6SSRSGAzX6Tnx+4NnSMUwNkXm+3bwjds8ZVK26+DXwLrP5f3ID5F1K5sFsRf2INo5/TNTHyQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dialog/-/dialog-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-o+9a/fmwJ9+gY3Z/uhj/PMVJDq7it1NTWKJn2GwAKdB+fDkT4hb9qEdcxMPyvJJ5ups+XiKZo03+tZrD+38c1w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/dom": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-7pEJLYov+tGgfuD8mZxoVU6rWtPI8ppjTAhz+F27Hz9FG0JETMWTKpDPBXLnKvX7vhIxL83GvZ9geNHCe8Hfog==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/dom/-/dom-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ly78R7aoCJtundSUu0UROU+5pQD5Piae0Y1MkN6bs0724azeazX1KeXFeaf06JOXnlr5/41ol+fSUPowjoqnOg==", "requires": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/drawer": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-/KMckLf1PYU/H3PXnS4e0aFl03qG3JlSv4LGgX6juJufcONqGTl/m63EMO/L/eUy6H1CRrXmVDjik/jzHLyDhg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/drawer/-/drawer-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-PFL4cEFnt7VTxDsuspFVNhsFDYyumjU0VWfj3PWB7XudsEfQ3lo85D3HCEtTTbRsCainGN8bgYNDNafLBqiigw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/elevation": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WDF8SsRtq3rXUbVVbd9K4DUijIPH0bUFSOreVYxudpuxAfTlDS5+aeS1EK9UIBFYLuba4u5wVT2tDv6e1RTfrQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/elevation/-/elevation-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Ro+Pk8jFuap+T0B0shA3xI1hs2b89dNQ2EIPCNjNMp87emHKAzJfhKb7EZGIwv3+gFLlVaLyIVkb94I89KLsyg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/fab": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-KCu87rWOKEAe9vZcAm6K8XazYSWPNjMG+OhrbPjHW6bCO7as1YCgtmkBkhff7csY/rFmcVpIy884xtUfLmSudQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/fab/-/fab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dvU0KWMRglwJEQwmQtFAmJcAjzg9VFF6Aqj78bJYu/DAIGFJ1VTTTSgoXM/XCm1YyQEZ7kZRvxBO37CH54rSDg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/feature-targeting": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-HyH1erNTSjS63sigNSUMaCd0nJhTNdDFeC+myrxwtDaQm+uYJ8troCNtQM3g6mx0XATNtX5aTOoPmrM6yVVi1A==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/feature-targeting/-/feature-targeting-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-wkDjVcoVEYYaJvun28IXdln/foLgPD7n9ZC9TY76GErGCwTq+HWpU6wBAAk+ePmpRFDayw4vI4wBlaWGxLtysQ==", "requires": { "tslib": "^2.1.0" } }, "@material/floating-label": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-f7TPp6bKpGvV3sYYiZHSGlrixXKkXXITW3Esp7KB9jRq42c0H82novmdwvY0eTef4ootmA2JEysr78KQfHBUPg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/floating-label/-/floating-label-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-bUWPtXzZITOD/2mkvLkEPO1ngDWmb74y0Kgbz6llHLOQBtycyJIpuoQJ1q2Ez0NM/tFLwPphhAgRqmL3YQ/Kzw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/focus-ring": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-ikw2RVUfgzXChpWIzPH1VzRvTjYb5ZKj4H+CZf7jqPUXMstFOZg90Bp7ARLZHqYiyNMuUq3zUTHozS6iHorSqg==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/focus-ring/-/focus-ring-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-cZHThVose3GvAlJzpJoBI1iqL6d1/Jj9hXrR+r8Mwtb1hBIUEG3hxfsRd4vGREuzROPlf0OgNf/V+YHoSwgR5w==", "requires": { - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0" + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0" } }, "@material/form-field": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-vpF9N/uq5no/7+8GAbEH0868FhOuBgxAWRr1Sfb+jthKfBr8OS/wPU/AHzZHdHdAm7PQynbeOXfDsX2dI//PDA==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/form-field/-/form-field-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-+JFXy5X44Gue1CbZZAQ6YejnI203lebYwL0i6k0ylDpWHEOdD5xkF2PyHR28r9/65Ebcbwbff6q7kI1SGoT7MA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/icon-button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-wMI+XGzmIN/o2ePBKg2hLyx7H4pXCRAyyIKMQS1FMp1UKa2tYmiHVX/V8skhKwCqxg3i6Ls/LxMjfPxTR18WvQ==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/icon-button/-/icon-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-1a0MHgyIwOs4RzxrVljsqSizGYFlM1zY2AZaLDsgT4G3kzsplTx8HZQ022GpUCjAygW+WLvg4z1qAhQHvsbqlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/image-list": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Ol+uaHYBe5R/cgzlfh5ONnMVX0wO6fV74JMUcQCQlxP6lXau/edARo4tkRc7A7UJUkU3VRv0EpEjLoCRNUPGaA==", - "requires": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/image-list/-/image-list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WKWmiYap2iu4QdqmeUSliLlN4O2Ueqa0OuVAYHn/TCzmQ2xmnhZ1pvDLbs6TplpOmlki7vFfe+aSt5SU9gwfOQ==", + "requires": { + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/layout-grid": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-ALXE1mqFNb/RB2lVRQ3/r1Aufw2mFZnOjRE+boYDVepmAG/xWyPCyaGoavELJF5l4GAb0tXi8wA/8HeGbLOpuA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/layout-grid/-/layout-grid-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-5GqmT6oTZhUGWIb+CLD0ZNyDyTiJsr/rm9oRIi3+vCujACwxFkON9tzBlZohdtFS16nuzUusthN6Jt9UrJcN6Q==", "requires": { "tslib": "^2.1.0" } }, "@material/line-ripple": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-7hRx8C/e9i0P6pgQpNOMfTwSS2r1fwEvBL72QDVGLtLuoKKwsjjgP6Z0Jat/GeHJe87u9LQvGBoD4upt+of/HA==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/line-ripple/-/line-ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-8S30WXEuUdgDdBulzUDlPXD6qMzwCX9SxYb5mGDYLwl199cpSGdXHtGgEcCjokvnpLhdZhcT1Dsxeo1g2Evh5Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/linear-progress": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-iJclt7mKmcMk6pqD7ocXKfCWZhqBoODp7N593jYlxVpTJuEz2wiVAjZUDn/YGj/Uz3CRH+2YFfOiLr9pwWjhDg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/progress-indicator": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/linear-progress/-/linear-progress-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-6EJpjrz6aoH2/gXLg9iMe0yF2C42hpQyZoHpmcgTLKeci85ktDvJIjwup8tnk8ULQyFiGiIrhXw2v2RSsiFjvQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/progress-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/list": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-rQ+FCSdzmwTcT00IYE0uRV3CS4oGSccKFl9hkcF+aHFW61L7ORh/SCGUDPrEfQFrFkMn5f8qroVJjpUAMXBz4g==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/list/-/list-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TQ1ppqiCMQj/P7bGD4edbIIv4goczZUoiUAaPq/feb1dflvrFMzYqJ7tQRRCyBL8nRhJoI2x99tk8Q2RXvlGUQ==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/menu": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-r7wzDLSGSI9629/mfpvsMzkVxpmV75kcD3IrW0Pcu6/Bv/1xi0EvjcUXzNJJoQlwN4Zj35Ymz/PCjZkIDIz68Q==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu/-/menu-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-IlAh61xzrzxXs38QZlt74UYt8J431zGznSzDtB1Fqs6YFNd11QPKoiRXn1J2Qu/lUxbFV7i8NBKMCKtia0n6/Q==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/menu-surface": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-RVO5GAYcfWPaKwxsF/NhUAmrYXQCQBKvRQW0TIlbmAJz6lcFeTs6YZqF3u1C7qrL3ZQGz+sur/7ywj6QU0oMow==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/menu-surface/-/menu-surface-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-dMtSPN+olTWE+08M5qe4ea1IZOhVryYqzK0Gyb2u1G75rSArUxCOB5rr6OC/ST3Mq3RS6zGuYo7srZt4534K9Q==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/notched-outline": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-9YHcBkvJLPVYzkHcWoTpBZAFrEd+j1hjhGxLhh0LuNrZe8VroUkZD1TTnUAPHRG3os6EqEWWaKb0RN+aPIF2yQ==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/notched-outline/-/notched-outline-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-WuurMg44xexkvLTBTnsO0A+qnzFjpcPdvgWBGstBepYozsvSF9zJGdb1x7Zv1MmqbpYh/Ohnuxtb/Y3jOh6irg==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/progress-indicator": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-c0icji4faeNWUoqGENGC7Hav0Puxh0RwXIDVizffaUxKIGbajpIp5+4Zop73fK/xFLGMB/npg7TbP+aCGjQ3fw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/progress-indicator/-/progress-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-uOnsvqw5F2fkeTnTl4MrYzjI7KCLmmLyZaM0cgLNuLsWVlddQE+SGMl28tENx7DUK3HebWq0FxCP8f25LuDD+w==", "requires": { "tslib": "^2.1.0" } }, "@material/radio": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-U3Eh8sNUA8trDla1Bq8Bo02foxYvtoewaKeF8A8tAju81XZ4jRiftfOsOWZDZEHCVbbCB2QwvutvFlnay5n+Aw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/radio/-/radio-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-ehzOK+U1IxQN+OQjgD2lsnf1t7t7RAwQzeO6Czkiuid29ookYbQynWuLWk7NW8H8ohl7lnmfqTP1xSNkkL/F0g==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/ripple": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-RyePu7SjIm/OuyyEieZ/gxiPYkNZOZHeid72WRcN9ofdlljj2pifcdPvcfZA+v/DMS33xo5GjG2L/Qj6ClWrKw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/ripple/-/ripple-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-JfLW+g3GMVDv4cruQ19+HUxpKVdWCldFlIPw1UYezz2h3WTNDy05S3uP2zUdXzZ01C3dkBFviv4nqZ0GCT16MA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/rtl": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-NqdJl8Ayupp1Th+vCNCpVQHbUFOuF7TCte9LD1norTIBUF/QizIxWby2W5uUEiPbnh5j9PmE1CJtfLwKun3pcw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/rtl/-/rtl-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-SkKLNLFp5QtG7/JEFg9R92qq4MzTcZ5As6sWbH7rRg6ahTHoJEuqE+pOb9Vrtbj84k5gtX+vCYPvCILtSlr2uw==", "requires": { - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/segmented-button": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-bEGgg8vgXNLyukyV8HRjFMuQ6t6nm5LQ4Pgm22um61Yc8qyi0BOqV41OR4SVdUrUqZxh1aVD+p+4NN03+LfQXw==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/touch-target": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/segmented-button/-/segmented-button-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-YDwkCWP9l5mIZJ7pZJZ2hMDxfBlIGVJ+deNzr8O+Z7/xC5LGXbl4R5aPtUVHygvXAXxpf5096ZD+dSXzYzvWlw==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/touch-target": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/select": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-kf178/2TeEinTv0mgmSBcmmExQ2h7a7dtR1E3WuqQgisJ/R6+zVLMkC2CnfIyzxYX2vkuUTG0ue3Reh/6XiqSg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/list": "15.0.0-canary.684e33d25.0", - "@material/menu": "15.0.0-canary.684e33d25.0", - "@material/menu-surface": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/select/-/select-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-unfOWVf7T0sixVG+3k3RTuATfzqvCF6QAzA6J9rlCh/Tq4HuIBNDdV4z19IVu4zwmgWYxY0iSvqWUvdJJYwakQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/list": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu": "15.0.0-canary.bc9ae6c9c.0", + "@material/menu-surface": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/shape": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-aEelpaTFmpnCji3TUGP9bVCS/bRVjUmLTHBPZtuu1gOrUVVtJ6kYOg73dZNJF+XOoNL2yOX/LRcKwsop29tptA==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/shape/-/shape-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Dsvr771ZKC46ODzoixLdGwlLEQLfxfLrtnRojXABoZf5G3o9KtJU+J+5Ld5aa960OAsCzzANuaub4iR88b1guA==", "requires": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/slider": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WVyK+2pSNSZmj07M2K/a3TADoQ9FBCndfNC/vE7/wGIg4dddJJK5KvQ+yruf9R2cSzTL/S1sZ5WpyyeM8E9HTw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/slider/-/slider-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-3AEu+7PwW4DSNLndue47dh2u7ga4hDJRYmuu7wnJCIWJBnLCkp6C92kNc4Rj5iQY2ftJio5aj1gqryluh5tlYg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/snackbar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-itO+DCkOannZzR1/cCHcqAm7ifhuFvXmDItNoA8qLEcAyJDJJRkhpwj3XQ01yuo9gBFcSctp7Txt7e+Hncm/Jg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/icon-button": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/snackbar/-/snackbar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-TwwQSYxfGK6mc03/rdDamycND6o+1p61WNd7ElZv1F1CLxB4ihRjbCoH7Qo+oVDaP8CTpjeclka+24RLhQq0mA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/icon-button": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/switch": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-Jxi0gl92yvvZZsAPxvVHzXx2ga+T/djMow98jvEczmpUorWnAhgiCr9CsSSRoosahWyRB8NLZOxUQrACxvffjw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/switch/-/switch-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-OjUjtT0kRz1ASAsOS+dNzwMwvsjmqy5edK57692qmrP6bL4GblFfBDoiNJ6t0AN4OaKcmL5Hy/xNrTdOZW7Qqw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "@material/tab": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-WQL3wj9syHNcfe8KbgGGUcA34M8C/xZ+n0Fkkh8Kk6puVwaU+xqUNihsxPY6YzKpmh4PZ4oJaBdiN8zvFT1zqQ==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/focus-ring": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab/-/tab-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-s/L9otAwn/pZwVQZBRQJmPqYeNbjoEbzbjMpDQf/VBG/6dJ+aP03ilIBEkqo8NVnCoChqcdtVCoDNRtbU+yp6w==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/focus-ring": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/tab-bar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-SW/cMaDsIGGkM1ag3A7GJRlmr8eXmObWsvitQJzh6Azr5zzZtSI+GQygkMesAEE1gbpqOVN8d40rh3H7VVIAcA==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", - "@material/tab-indicator": "15.0.0-canary.684e33d25.0", - "@material/tab-scroller": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-bar/-/tab-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-Xmtq0wJGfu5k+zQeFeNsr4bUKv7L+feCmUp/gsapJ655LQKMXOUQZtSv9ZqWOfrCMy55hoF1CzGFV+oN3tyWWQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-indicator": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab-scroller": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/tab-indicator": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-kKICqSPqOlaf0lzaFFCmuOqPXJC+cK48Qmsc+m5o6fJhkmuZRCYpIwB2JeP+uZSOq/bTH+SrPtCtnVlgWg6ksA==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-indicator/-/tab-indicator-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-despCJYi1GrDDq7F2hvLQkObHnSLZPPDxnOzU16zJ6FNYvIdszgfzn2HgAZ6pl5hLOexQ8cla6cAqjTDuaJBhQ==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/tab-scroller": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-H6EU/TSiK/M2DyyORX5GEtXD9rKYxTMHC2VxsNWARPMFJGzgeW2ugYkFv+rKI1/c0bs0CJ4e+qFnOlBsQXZvyQ==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/tab": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tab-scroller/-/tab-scroller-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-QWHG/EWxirj4V9u2IHz+OSY9XCWrnNrPnNgEufxAJVUKV/A8ma1DYeFSQqxhX709R8wKGdycJksg0Flkl7Gq7w==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/tab": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/textfield": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-OvgpDXjvpyJTtAWskO69IDybFvDNzr9w2PN/Fk7yFm+uNVupaWz1Ew8lZ4gGslaTNSVmh2XcsvmzxcLINSiiNg==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/density": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/floating-label": "15.0.0-canary.684e33d25.0", - "@material/line-ripple": "15.0.0-canary.684e33d25.0", - "@material/notched-outline": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/textfield/-/textfield-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-R3qRex9kCaZIAK8DuxPnVC42R0OaW7AB7fsFknDKeTeVQvRcbnV8E+iWSdqTiGdsi6QQHifX8idUrXw+O45zPw==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/density": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/floating-label": "15.0.0-canary.bc9ae6c9c.0", + "@material/line-ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/notched-outline": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/theme": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-AZxaXXAvRKzAi20RlMxzt2U5UmkCWyv7DMWEBXsxtG5Tk54mi1HsbVUp3fxDPTlmL7Pq8p1/DESg/o7TgRCVlw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/theme/-/theme-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CpUwXGE0dbhxQ45Hu9r9wbJtO/MAlv5ER4tBHA9tp/K+SU+lDgurBE2touFMg5INmdfVNtdumxb0nPPLaNQcUg==", "requires": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/tokens": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-wVwbQOTCXDPKYPdHQHLr026y36MMFelID1CmbfRk6mSol4O8yE9U0fXcShfRDW8Qo5E3X31w9c2A6T3neJY7wQ==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tokens/-/tokens-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-nbEuGj05txWz6ZMUanpM47SaAD7soyjKILR+XwDell9Zg3bGhsnexCNXPEz2fD+YgomS+jM5XmIcaJJHg/H93Q==", "requires": { - "@material/elevation": "15.0.0-canary.684e33d25.0" + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0" } }, "@material/tooltip": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-dtm26QjxyQdinc8btgz6yys07b7bUW4FZgNF2EBPeGrICrPg7jf+JEvDziz5g8VMaTBQLOQRSCGy0MKuRlOjLw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/button": "15.0.0-canary.684e33d25.0", - "@material/dom": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/tokens": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/tooltip/-/tooltip-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-UzuXp0b9NuWuYLYpPguxrjbJnCmT/Cco8CkjI/6JajxaeA3o2XEBbQfRMTq8PTafuBjCHTc0b0mQY7rtxUp1Gg==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/button": "15.0.0-canary.bc9ae6c9c.0", + "@material/dom": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/tokens": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "safevalues": "^0.3.4", "tslib": "^2.1.0" } }, "@material/top-app-bar": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-1M+oupUxflfW7u81P1XlxoLZB8bLzwtpKofIfDNRbEsiKhlLTERJR3Yak3BGE9xakNMysAaBHlkb5MrN5bNPFw==", - "requires": { - "@material/animation": "15.0.0-canary.684e33d25.0", - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/elevation": "15.0.0-canary.684e33d25.0", - "@material/ripple": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/shape": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", - "@material/typography": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/top-app-bar/-/top-app-bar-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-vJWjsvqtdSD5+yQ/9vgoBtBSCvPJ5uF/DVssv8Hdhgs1PYaAcODUi77kdi0+sy/TaWyOsTkQixqmwnFS16zesA==", + "requires": { + "@material/animation": "15.0.0-canary.bc9ae6c9c.0", + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/elevation": "15.0.0-canary.bc9ae6c9c.0", + "@material/ripple": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/shape": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", + "@material/typography": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/touch-target": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-zdE69Slg8+T7sTn1OwqZ6H7WBYac9mxJ/JlJqfTqthzIjZRcCxBSYymQJcDHjsrPnUojOtr9U4Tpm5YZ96TEkQ==", - "requires": { - "@material/base": "15.0.0-canary.684e33d25.0", - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/rtl": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/touch-target/-/touch-target-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-AqYh9fjt+tv4ZE0C6MeYHblS2H+XwLbDl2mtyrK0DOEnCVQk5/l5ImKDfhrUdFWHvS4a5nBM4AA+sa7KaroLoA==", + "requires": { + "@material/base": "15.0.0-canary.bc9ae6c9c.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/rtl": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, "@material/typography": { - "version": "15.0.0-canary.684e33d25.0", - "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.684e33d25.0.tgz", - "integrity": "sha512-aVnvgMwcfNa/K4wujzpKDIxjGl2hbkEL+m+OKDSQqWYjKcP9QrbzCXJruJBqxrBoPRHLbqo47k5f9uT8raSgjw==", + "version": "15.0.0-canary.bc9ae6c9c.0", + "resolved": "https://registry.npmjs.org/@material/typography/-/typography-15.0.0-canary.bc9ae6c9c.0.tgz", + "integrity": "sha512-CKsG1zyv34AKPNyZC8olER2OdPII64iR2SzQjpqh1UUvmIFiMPk23LvQ1OnC5aCB14pOXzmVgvJt31r9eNdZ6Q==", "requires": { - "@material/feature-targeting": "15.0.0-canary.684e33d25.0", - "@material/theme": "15.0.0-canary.684e33d25.0", + "@material/feature-targeting": "15.0.0-canary.bc9ae6c9c.0", + "@material/theme": "15.0.0-canary.bc9ae6c9c.0", "tslib": "^2.1.0" } }, @@ -27285,9 +28647,9 @@ } }, "@ngtools/webpack": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-15.2.10.tgz", - "integrity": "sha512-ZExB4rKh/Saad31O/Ofd2XvRuILuCNTYs0+qJL697Be2pzeewvzBhE4Xe1Mm7Jg13aWSPeuIdzSGOqCdwxxxFQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", + "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", "dev": true, "requires": {} }, @@ -27318,9 +28680,9 @@ } }, "@npmcli/fs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.0.tgz", - "integrity": "sha512-7kZUAaLscfgbwBQRbvdMYaZOWyMEcPTH/tJjnyAWJ/dvvs9Ef+CERx/qJb9GExJpl1qipaDGn7KqHnFGGixd0w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-3.1.1.tgz", + "integrity": "sha512-q9CRWjpHCMIh5sVyefoD1cA7PkvILqCZsnSOEUUivORLjxCO/Irmue2DprETiNgEqktDBZaM1Bi+jrarx1XdCg==", "dev": true, "requires": { "semver": "^7.3.5" @@ -27360,9 +28722,9 @@ } }, "@npmcli/installed-package-contents": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.0.2.tgz", - "integrity": "sha512-xACzLPhnfD51GKvTOOuNX2/V4G4mz9/1I2MfDoye9kBM3RYe5g2YbscsaGoTlaWqkxeiapBWyseULVKpSVHtKQ==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@npmcli/installed-package-contents/-/installed-package-contents-2.1.0.tgz", + "integrity": "sha512-c8UuGLeZpm69BryRykLuKRyKFZYJsZSCT4aVY5ds4omyZqJ172ApzgfKJ5eV/r3HgLdUYgFVe54KSFVjKoe27w==", "dev": true, "requires": { "npm-bundled": "^3.0.0", @@ -27370,9 +28732,9 @@ }, "dependencies": { "npm-bundled": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.0.tgz", - "integrity": "sha512-Vq0eyEQy+elFpzsKjMss9kxqb9tG3YHg4dsyWuUENuzvSUWe1TCnW/vV9FkhvBk/brEDoDiVd+M1Btosa6ImdQ==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-3.0.1.tgz", + "integrity": "sha512-+AvaheE/ww1JEwRHOrn4WHNzOxGtVp+adrg2AeZS/7KuxGUYFuBta98wYpfHBbJp6Tg6j1NKSEVHNcfZzJHQwQ==", "dev": true, "requires": { "npm-normalize-package-bin": "^3.0.0" @@ -27446,6 +28808,129 @@ } } }, + "@nrwl/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-NB+DE/+AFJ7lKH/WBFyatJEhcZGj25F24ncDkwjZ6MzEiSOGOJS0LaV/R+VUsmS5EHTPXYOpn3zHWWAcJhyOmA==", + "dev": true, + "requires": { + "@nx/devkit": "16.5.1" + } + }, + "@nrwl/tao": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nrwl/tao/-/tao-16.5.1.tgz", + "integrity": "sha512-x+gi/fKdM6uQNIti9exFlm3V5LBP3Y8vOEziO42HdOigyrXa0S0HD2WMpccmp6PclYKhwEDUjKJ39xh5sdh4Ig==", + "dev": true, + "requires": { + "nx": "16.5.1" + } + }, + "@nx/devkit": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/devkit/-/devkit-16.5.1.tgz", + "integrity": "sha512-T1acZrVVmJw/sJ4PIGidCBYBiBqlg/jT9e8nIGXLSDS20xcLvfo4zBQf8UZLrmHglnwwpDpOWuVJCp2rYA5aDg==", + "dev": true, + "requires": { + "@nrwl/devkit": "16.5.1", + "ejs": "^3.1.7", + "ignore": "^5.0.4", + "semver": "7.5.3", + "tmp": "~0.2.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@nx/nx-darwin-arm64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-arm64/-/nx-darwin-arm64-16.5.1.tgz", + "integrity": "sha512-q98TFI4B/9N9PmKUr1jcbtD4yAFs1HfYd9jUXXTQOlfO9SbDjnrYJgZ4Fp9rMNfrBhgIQ4x1qx0AukZccKmH9Q==", + "dev": true, + "optional": true + }, + "@nx/nx-darwin-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-darwin-x64/-/nx-darwin-x64-16.5.1.tgz", + "integrity": "sha512-j9HmL1l8k7EVJ3eOM5y8COF93gqrydpxCDoz23ZEtsY+JHY77VAiRQsmqBgEx9GGA2dXi9VEdS67B0+1vKariw==", + "dev": true, + "optional": true + }, + "@nx/nx-freebsd-x64": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-freebsd-x64/-/nx-freebsd-x64-16.5.1.tgz", + "integrity": "sha512-CXSPT01aVS869tvCCF2tZ7LnCa8l41wJ3mTVtWBkjmRde68E5Up093hklRMyXb3kfiDYlfIKWGwrV4r0eH6x1A==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm-gnueabihf": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm-gnueabihf/-/nx-linux-arm-gnueabihf-16.5.1.tgz", + "integrity": "sha512-BhrumqJSZCWFfLFUKl4CAUwR0Y0G2H5EfFVGKivVecEQbb+INAek1aa6c89evg2/OvetQYsJ+51QknskwqvLsA==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-gnu/-/nx-linux-arm64-gnu-16.5.1.tgz", + "integrity": "sha512-x7MsSG0W+X43WVv7JhiSq2eKvH2suNKdlUHEG09Yt0vm3z0bhtym1UCMUg3IUAK7jy9hhLeDaFVFkC6zo+H/XQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-arm64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-arm64-musl/-/nx-linux-arm64-musl-16.5.1.tgz", + "integrity": "sha512-J+/v/mFjOm74I0PNtH5Ka+fDd+/dWbKhpcZ2R1/6b9agzZk+Ff/SrwJcSYFXXWKbPX+uQ4RcJoytT06Zs3s0ow==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-gnu": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-gnu/-/nx-linux-x64-gnu-16.5.1.tgz", + "integrity": "sha512-igooWJ5YxQ94Zft7IqgL+Lw0qHaY15Btw4gfK756g/YTYLZEt4tTvR1y6RnK/wdpE3sa68bFTLVBNCGTyiTiDQ==", + "dev": true, + "optional": true + }, + "@nx/nx-linux-x64-musl": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-linux-x64-musl/-/nx-linux-x64-musl-16.5.1.tgz", + "integrity": "sha512-zF/exnPqFYbrLAduGhTmZ7zNEyADid2bzNQiIjJkh8Y6NpDwrQIwVIyvIxqynsjMrIs51kBH+8TUjKjj2Jgf5A==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-arm64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-arm64-msvc/-/nx-win32-arm64-msvc-16.5.1.tgz", + "integrity": "sha512-qtqiLS9Y9TYyAbbpq58kRoOroko4ZXg5oWVqIWFHoxc5bGPweQSJCROEqd1AOl2ZDC6BxfuVHfhDDop1kK05WA==", + "dev": true, + "optional": true + }, + "@nx/nx-win32-x64-msvc": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/@nx/nx-win32-x64-msvc/-/nx-win32-x64-msvc-16.5.1.tgz", + "integrity": "sha512-kUJBLakK7iyA9WfsGGQBVennA4jwf5XIgm0lu35oMOphtZIluvzItMt0EYBmylEROpmpEIhHq0P6J9FA+WH0Rg==", + "dev": true, + "optional": true + }, + "@parcel/watcher": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.0.4.tgz", + "integrity": "sha512-cTDi+FUDBIUOBKEtj+nhiJ71AZVlkAsQFuGQTun5tV9mwQBQgZvhCzG+URPQc8myeN32yRVZEfVAPCs1RW+Jvg==", + "dev": true, + "requires": { + "node-addon-api": "^3.2.1", + "node-gyp-build": "^4.3.0" + } + }, "@pkgjs/parseargs": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", @@ -27459,13 +28944,13 @@ "integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==" }, "@schematics/angular": { - "version": "15.2.10", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-15.2.10.tgz", - "integrity": "sha512-eLdyP+T1TueNQ8FCP7sP+tt8z+YQ1BINsJsyAyoJT/XZjcCV7LUxgDIU94/kuvIotmJ2xTuFWHFPfAY+CN3duQ==", + "version": "16.2.14", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-16.2.14.tgz", + "integrity": "sha512-YqIv727l9Qze8/OL6H9mBHc2jVXzAGRNBYnxYWqWhLbfvuVbbldo6NNIIjgv6lrl2LJSdPAAMNOD5m/f6210ug==", "dev": true, "requires": { - "@angular-devkit/core": "15.2.10", - "@angular-devkit/schematics": "15.2.10", + "@angular-devkit/core": "16.2.14", + "@angular-devkit/schematics": "16.2.14", "jsonc-parser": "3.2.0" } }, @@ -27940,6 +29425,23 @@ "make-fetch-happen": "^11.0.1" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -27969,16 +29471,10 @@ "ssri": "^10.0.0" } }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -27988,9 +29484,9 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -28014,9 +29510,9 @@ "dev": true }, "@tootallnate/once": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", - "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-1.1.2.tgz", + "integrity": "sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==", "dev": true }, "@tsconfig/node10": { @@ -28069,9 +29565,9 @@ } }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -28165,9 +29661,9 @@ } }, "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "@types/express": { @@ -28183,9 +29679,9 @@ } }, "@types/express-serve-static-core": { - "version": "4.17.43", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.43.tgz", - "integrity": "sha512-oaYtiBirUOPQGSWNGPWnzyAFJ0BP3cwvN4oWZQY+zUBwpVIGsKUkpBpSztp74drYcjavs7SKFZ4DX1V2QeN8rg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "requires": { "@types/node": "*", @@ -28237,9 +29733,9 @@ "dev": true }, "@types/marked": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.0.7.tgz", - "integrity": "sha512-eEAhnz21CwvKVW+YvRvcTuFKNU9CV1qH+opcgVK3pIMI6YZzDm6gc8o2vHjldFk6MGKt5pueSB7IOpvpx5Qekw==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/@types/marked/-/marked-4.3.2.tgz", + "integrity": "sha512-a79Yc3TOk6dGdituy8hmTTJXjOkZ7zsFYV10L337ttq/rec8lRMDBpV7fL3uLx6TgbFCa5DU/h8FmIBQPSbU0w==", "peer": true }, "@types/mime": { @@ -28249,10 +29745,13 @@ "dev": true }, "@types/node": { - "version": "15.14.9", - "resolved": "https://registry.npmjs.org/@types/node/-/node-15.14.9.tgz", - "integrity": "sha512-qjd88DrCxupx/kJD5yQgZdcYKZKSIGBVDIBE1/LTGcNm3d2Np/jxojkdePDdfnBHJc5W7vSMpbJ1aB7p/Py69A==", - "dev": true + "version": "18.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.19.39.tgz", + "integrity": "sha512-nPwTRDKUctxw3di5b4TfT3I0sWDiWoPQCZjXhvdkINntwr8lcoVCKsTgnXeRubKIlfnV+eN/HYk6Jb40tbcEAQ==", + "dev": true, + "requires": { + "undici-types": "~5.26.4" + } }, "@types/node-forge": { "version": "1.3.11", @@ -28270,9 +29769,9 @@ "dev": true }, "@types/qs": { - "version": "6.9.11", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.11.tgz", - "integrity": "sha512-oGk0gmhnEJK4Yyk+oI7EfXsLayXatCWPHary1MtcmbAifkobT9cM9yutG/hZKIseOU0MqbIwQ/u2nn/Gb+ltuQ==", + "version": "6.9.15", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", + "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", "dev": true }, "@types/range-parser": { @@ -28288,9 +29787,9 @@ "dev": true }, "@types/semver": { - "version": "7.5.6", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.6.tgz", - "integrity": "sha512-dn1l8LaMea/IjDoHNd9J52uBbInB796CDffS6VdIxvqYCPSG0V0DzHp76GpaWnlhg88uYyPbXCDIowa86ybd5A==", + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", "dev": true }, "@types/send": { @@ -28313,14 +29812,14 @@ } }, "@types/serve-static": { - "version": "1.15.5", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.5.tgz", - "integrity": "sha512-PDRk21MnK70hja/YF8AHfC7yIsiQHn1rcXx7ijCFBX/k+XQJhQT/gw3xekXKJvx+5SXaMMS8oqQy09Mzvz2TuQ==", + "version": "1.15.7", + "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz", + "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==", "dev": true, "requires": { "@types/http-errors": "*", - "@types/mime": "*", - "@types/node": "*" + "@types/node": "*", + "@types/send": "*" } }, "@types/sinonjs__fake-timers": { @@ -28428,31 +29927,31 @@ } }, "@typescript-eslint/type-utils": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.48.2.tgz", - "integrity": "sha512-QVWx7J5sPMRiOMJp5dYshPxABRoZV1xbRirqSk8yuIIsu0nvMTZesKErEA3Oix1k+uvsk8Cs8TGJ6kQ0ndAcew==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz", + "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "requires": { - "@typescript-eslint/typescript-estree": "5.48.2", - "@typescript-eslint/utils": "5.48.2", + "@typescript-eslint/typescript-estree": "5.62.0", + "@typescript-eslint/utils": "5.62.0", "debug": "^4.3.4", "tsutils": "^3.21.0" }, "dependencies": { "@typescript-eslint/types": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", - "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", - "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -28461,12 +29960,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", - "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } } @@ -28494,45 +29993,45 @@ } }, "@typescript-eslint/utils": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.48.2.tgz", - "integrity": "sha512-2h18c0d7jgkw6tdKTlNaM7wyopbLRBiit8oAxoP89YnuBOzCZ8g8aBCaCqq7h208qUTroL7Whgzam7UY3HVLow==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz", + "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "requires": { + "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.48.2", - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/typescript-estree": "5.48.2", + "@typescript-eslint/scope-manager": "5.62.0", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/typescript-estree": "5.62.0", "eslint-scope": "^5.1.1", - "eslint-utils": "^3.0.0", "semver": "^7.3.7" }, "dependencies": { "@typescript-eslint/scope-manager": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.48.2.tgz", - "integrity": "sha512-zEUFfonQid5KRDKoI3O+uP1GnrFd4tIHlvs+sTJXiWuypUWMuDaottkJuR612wQfOkjYbsaskSIURV9xo4f+Fw==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz", + "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2" + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0" } }, "@typescript-eslint/types": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.48.2.tgz", - "integrity": "sha512-hE7dA77xxu7ByBc6KCzikgfRyBCTst6dZQpwaTy25iMYOnbNljDT4hjhrGEJJ0QoMjrfqrx+j1l1B9/LtKeuqA==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz", + "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true }, "@typescript-eslint/typescript-estree": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.48.2.tgz", - "integrity": "sha512-bibvD3z6ilnoVxUBFEgkO0k0aFvUc4Cttt0dAreEr+nrAHhWzkO83PEVVuieK3DqcgL6VAK5dkzK8XUVja5Zcg==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz", + "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.2", - "@typescript-eslint/visitor-keys": "5.48.2", + "@typescript-eslint/types": "5.62.0", + "@typescript-eslint/visitor-keys": "5.62.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -28541,12 +30040,12 @@ } }, "@typescript-eslint/visitor-keys": { - "version": "5.48.2", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.48.2.tgz", - "integrity": "sha512-z9njZLSkwmjFWUelGEwEbdf4NwKvfHxvGC0OcGN1Hp/XNDIcJ7D5DpPNPv6x6/mFvc1tQHsaWmpD/a4gOvvCJQ==", + "version": "5.62.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz", + "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "requires": { - "@typescript-eslint/types": "5.48.2", + "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" } } @@ -28562,32 +30061,39 @@ "eslint-visitor-keys": "^3.0.0" } }, + "@vitejs/plugin-basic-ssl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-basic-ssl/-/plugin-basic-ssl-1.0.1.tgz", + "integrity": "sha512-pcub+YbFtFhaGRTo1832FQHQSHvMrlb43974e2eS8EKleR3p1cDdkJFPci1UhwkEf1J9Bz+wKBSzqpKp7nNj2A==", + "dev": true, + "requires": {} + }, "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz", + "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz", + "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==", "dev": true }, "@webassemblyjs/helper-code-frame": { @@ -28664,111 +30170,111 @@ } }, "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz", + "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz", + "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz", + "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz", + "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz", + "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "@webassemblyjs/wast-parser": { @@ -28817,15 +30323,78 @@ } }, "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz", + "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.1", + "@webassemblyjs/ast": "1.12.1", "@xtuc/long": "4.2.2" } }, + "@wessberg/ts-evaluator": { + "version": "0.0.27", + "resolved": "https://registry.npmjs.org/@wessberg/ts-evaluator/-/ts-evaluator-0.0.27.tgz", + "integrity": "sha512-7gOpVm3yYojUp/Yn7F4ZybJRxyqfMNf0LXK5KJiawbPfL0XTsJV+0mgrEDjOIR6Bi0OYk2Cyg4tjFu1r8MCZaA==", + "dev": true, + "requires": { + "chalk": "^4.1.0", + "jsdom": "^16.4.0", + "object-path": "^0.11.5", + "tslib": "^2.0.3" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", @@ -28843,6 +30412,33 @@ "resolved": "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz", "integrity": "sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ==" }, + "@yarnpkg/parsers": { + "version": "3.0.0-rc.46", + "resolved": "https://registry.npmjs.org/@yarnpkg/parsers/-/parsers-3.0.0-rc.46.tgz", + "integrity": "sha512-aiATs7pSutzda/rq8fnuPwTglyVwjM22bNnK2ZgjrpAjQHSSl3lztd2f9evst1W/qnC58DRz7T7QndUDumAR4Q==", + "dev": true, + "requires": { + "js-yaml": "^3.10.0", + "tslib": "^2.4.0" + } + }, + "@zkochan/js-yaml": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/@zkochan/js-yaml/-/js-yaml-0.0.6.tgz", + "integrity": "sha512-nzvgl3VfhcELQ8LyVrYOru+UtAy1nrygk2+AGbTm8a5YcO6o8lSjAT+pfg3vJWxIoZKOUhrK6UU7xW/+00kQrg==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + } + } + }, "abab": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", @@ -28876,15 +30472,39 @@ "integrity": "sha512-NBOQlm9+7RBqRqZwimpgquaLeTJFayqb9UEPtTkpC3TkkwDnlsT/TwsCC0svjt9kEZ6G9mH5AEOHSz6Q/HrzQQ==" }, "acorn": { - "version": "8.8.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", - "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", "dev": true }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dev": true, + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "dev": true + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "dev": true + } + } + }, "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "dev": true, "requires": {} }, @@ -29008,9 +30628,9 @@ "requires": {} }, "angular-tag-cloud-module": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-14.0.0.tgz", - "integrity": "sha512-H1NU9C2nKT0WzKITZ0gP/T9QoXYpFxYHcUW9snFJOXnwmLLVo6VmXQ0KbI+0pVa5Tu/OxzNWiy1R61PtjBigKA==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/angular-tag-cloud-module/-/angular-tag-cloud-module-16.0.0.tgz", + "integrity": "sha512-xEKt+56bdQ6uWsQF3gL+MsmEdvhWJLM0KKOEumC04RVBdfsFwJyZpBC1vHzDbvgmMtvydITGk5UdXc039tFiDw==", "requires": { "tslib": "^2.3.0" } @@ -29099,12 +30719,12 @@ } }, "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "arr-diff": { @@ -29125,16 +30745,6 @@ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==", "dev": true }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, "array-find-index": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", @@ -29277,25 +30887,19 @@ "dev": true }, "autoprefixer": { - "version": "10.4.13", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.13.tgz", - "integrity": "sha512-49vKpMqcZYsJjwotvt4+h/BCjJVnhGwcLpDt5xkcaOG3eLrG/HUYLagrihYsQ+qrIBgIzX1Rw7a6L8I/ZA1Atg==", + "version": "10.4.14", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.14.tgz", + "integrity": "sha512-FQzyfOsTlwVzjHxKEqRIAdJx9niO6VCBCoEwax/VLSoQF29ggECcPuBqUMZ+u8jCZOPSy8b8/8KnuFbp0SaFZQ==", "dev": true, "requires": { - "browserslist": "^4.21.4", - "caniuse-lite": "^1.0.30001426", + "browserslist": "^4.21.5", + "caniuse-lite": "^1.0.30001464", "fraction.js": "^4.2.0", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", "postcss-value-parser": "^4.2.0" } }, - "available-typed-arrays": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.6.tgz", - "integrity": "sha512-j1QzY8iPNPG4o4xmO3ptzpRxTciqD3MgEHtifP/YnJpIo58Xu+ne4BejlbkuaLfXn/nz6HFiw29bLpj2PNMdGg==", - "dev": true - }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -29314,13 +30918,43 @@ "integrity": "sha512-32+ub6kkdhhWick/UjvEwRchgoetXqTK14INLqbGm5U2TzBkBNF3nQtLYm8ovxSkQWArjEQvftCKryjZaATu3w==", "dev": true }, + "axios": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.2.tgz", + "integrity": "sha512-2A8QhOMrbomlDuiLeK9XibIBzuHeRcqqNOHp0Cyp5EoJ1IFDh+XZH3A6BkXtv0K4gFGCI0Y4BM7B1wOEi0Rmgw==", + "dev": true, + "requires": { + "follow-redirects": "^1.15.6", + "form-data": "^4.0.0", + "proxy-from-env": "^1.1.0" + }, + "dependencies": { + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + } + } + }, "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", "dev": true, "requires": { - "deep-equal": "^2.0.5" + "dequal": "^2.0.3" } }, "babel-loader": { @@ -29368,14 +31002,14 @@ } }, "babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", + "integrity": "sha512-sMEJ27L0gRHShOh5G54uAAPaiCOygY/5ratXuiyb2G46FmlSpc9eFCzYVyDiPxfNbwzA7mYahmjQc5q+CZQ09Q==", "dev": true, "requires": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" }, "dependencies": { "semver": { @@ -29387,22 +31021,52 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } } }, "babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz", + "integrity": "sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.5.0" + }, + "dependencies": { + "@babel/helper-define-polyfill-provider": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz", + "integrity": "sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q==", + "dev": true, + "requires": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + } + } } }, "balanced-match": { @@ -29633,6 +31297,12 @@ "integrity": "sha512-cKV8tMCEpQs4hK/ik71d6LrPOnpkpGBR0wzxqr68g2m/LB2GxVYQroAjMJZRVM1Y4BCjCKc3vAamxSzOY2RP+w==", "dev": true }, + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", + "dev": true + }, "browserify-aes": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz", @@ -29715,15 +31385,15 @@ } }, "browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.23.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", + "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001629", + "electron-to-chromium": "^1.4.796", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.16" } }, "buffer": { @@ -29771,21 +31441,20 @@ "dev": true }, "cacache": { - "version": "17.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.0.4.tgz", - "integrity": "sha512-Z/nL3gU+zTUjz5pCA5vVjYM8pmaw2kxM7JEiE0fv3w77Wj+sFbi70CrBruUWH0uNcEdvLDixFpgA2JM4F4DBjA==", + "version": "17.1.4", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-17.1.4.tgz", + "integrity": "sha512-/aJwG2l3ZMJ1xNAnqbMpA40of9dj/pIH3QfiuQSqjfPJF747VR0J/bHn+/KdNnHKc6XQcWt/AfRSBft82W1d2A==", "dev": true, "requires": { "@npmcli/fs": "^3.1.0", "fs-minipass": "^3.0.0", - "glob": "^8.0.1", + "glob": "^10.2.2", "lru-cache": "^7.7.1", - "minipass": "^4.0.0", + "minipass": "^7.0.3", "minipass-collect": "^1.0.2", "minipass-flush": "^1.0.5", "minipass-pipeline": "^1.2.4", "p-map": "^4.0.0", - "promise-inflight": "^1.0.1", "ssri": "^10.0.0", "tar": "^6.1.11", "unique-filename": "^3.0.0" @@ -29801,16 +31470,17 @@ } }, "glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "foreground-child": "^3.1.0", + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" } }, "lru-cache": { @@ -29820,14 +31490,20 @@ "dev": true }, "minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" } }, + "minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "dev": true + }, "unique-filename": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-3.0.0.tgz", @@ -29896,9 +31572,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001585", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001585.tgz", - "integrity": "sha512-yr2BWR1yLXQ8fMpdS/4ZZXpseBgE7o4g41x3a6AJOqZuOi+iE/WdJYAuZ6Y95i4Ohd2Y+9MzIWRR+uGABH4s3Q==", + "version": "1.0.30001639", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001639.tgz", + "integrity": "sha512-eFHflNTBIlFwP2AIKaYuBQN/apnUoKNhBdza8ZnW/h2di4LCZ4xFqYlxUxo+LQ76KFI1PGcC1QDxMbxTZpSCAg==", "dev": true }, "caseless": { @@ -29951,43 +31627,6 @@ "parse5-htmlparser2-tree-adapter": "^7.0.0" }, "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - }, "parse5": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.0.0.tgz", @@ -30021,64 +31660,6 @@ "domelementtype": "^2.3.0", "domhandler": "^5.0.3", "domutils": "^3.0.1" - }, - "dependencies": { - "css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dev": true, - "requires": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - } - }, - "css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true - }, - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - } } }, "chokidar": { @@ -30386,6 +31967,12 @@ "integrity": "sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA==", "dev": true }, + "common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", + "dev": true + }, "common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -30723,26 +32310,12 @@ } }, "core-js-compat": { - "version": "3.35.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz", - "integrity": "sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw==", + "version": "3.37.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", + "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", "dev": true, "requires": { - "browserslist": "^4.22.2" - }, - "dependencies": { - "browserslist": { - "version": "4.22.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.3.tgz", - "integrity": "sha512-UAp55yfwNv0klWNapjs/ktHoguxuQNGnOzxYmfnXIS+8AsRDZkSDxg7R1AX3GKzn078SBI5dzwzj/Yx0Or0e3A==", - "dev": true, - "requires": { - "caniuse-lite": "^1.0.30001580", - "electron-to-chromium": "^1.4.648", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - } - } + "browserslist": "^4.23.0" } }, "core-util-is": { @@ -30825,16 +32398,17 @@ "dev": true }, "critters": { - "version": "0.0.16", - "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.16.tgz", - "integrity": "sha512-JwjgmO6i3y6RWtLYmXwO5jMd+maZt8Tnfu7VVISmEWyQqfLpB8soBswf8/2bu6SBXxtKA68Al3c+qIG1ApT68A==", + "version": "0.0.20", + "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.20.tgz", + "integrity": "sha512-CImNRorKOl5d8TWcnAz5n5izQ6HFsvz29k327/ELy6UFcmbiZNOsinaKvzv16WZR0P6etfSWYzE47C4/56B3Uw==", "dev": true, "requires": { "chalk": "^4.1.0", - "css-select": "^4.2.0", - "parse5": "^6.0.1", - "parse5-htmlparser2-tree-adapter": "^6.0.1", - "postcss": "^8.3.7", + "css-select": "^5.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.2", + "htmlparser2": "^8.0.2", + "postcss": "^8.4.23", "pretty-bytes": "^5.3.0" }, "dependencies": { @@ -30878,12 +32452,6 @@ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -30926,15 +32494,15 @@ } }, "css-loader": { - "version": "6.7.3", - "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.3.tgz", - "integrity": "sha512-qhOH1KlBMnZP8FzRO6YCH9UHXQhVMcEGLyNdb7Hv2cpcmJbW0YrddO+tG1ab5nT41KpHIYGsbeHqxB9xPu1pKQ==", + "version": "6.8.1", + "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz", + "integrity": "sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g==", "dev": true, "requires": { "icss-utils": "^5.1.0", - "postcss": "^8.4.19", + "postcss": "^8.4.21", "postcss-modules-extract-imports": "^3.0.0", - "postcss-modules-local-by-default": "^4.0.0", + "postcss-modules-local-by-default": "^4.0.3", "postcss-modules-scope": "^3.0.0", "postcss-modules-values": "^4.0.0", "postcss-value-parser": "^4.2.0", @@ -30942,33 +32510,30 @@ }, "dependencies": { "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true } } }, "css-select": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.2.1.tgz", - "integrity": "sha512-/aUslKhzkTNCQUB2qTX84lVmfia9NyjP3WpDGtj/WxhwBzWBYUV3DgUpurHTme8UTPcPlAD1DJ+b0nN/t50zDQ==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", + "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", "dev": true, "requires": { "boolbase": "^1.0.0", - "css-what": "^5.1.0", - "domhandler": "^4.3.0", - "domutils": "^2.8.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", "nth-check": "^2.0.1" } }, "css-what": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-5.1.0.tgz", - "integrity": "sha512-arSMRWIIFY0hV8pIxZMEfmMI47Wj3R/aWpZDDxWYCPEiOMv6tfOrnpDtgxBYPEQD4V0Y/958+1TdC3iWTFcUPw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", "dev": true }, "cssesc": { @@ -30977,6 +32542,29 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, + "cssom": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.4.4.tgz", + "integrity": "sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==", + "dev": true + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dev": true, + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==", + "dev": true + } + } + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -31476,6 +33064,45 @@ "assert-plus": "^1.0.0" } }, + "data-urls": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-2.0.0.tgz", + "integrity": "sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==", + "dev": true, + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.0.0" + }, + "dependencies": { + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + } + } + }, "date-format": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.3.tgz", @@ -31503,46 +33130,18 @@ "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=", "dev": true }, + "decimal.js": { + "version": "10.4.3", + "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz", + "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==", + "dev": true + }, "decode-uri-component": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", "dev": true }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dev": true, - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", @@ -31616,17 +33215,6 @@ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", "dev": true }, - "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, "define-property": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz", @@ -31670,10 +33258,10 @@ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true }, - "dependency-graph": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", + "dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", "dev": true }, "des.js": { @@ -31785,14 +33373,14 @@ } }, "dom-serializer": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz", - "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", + "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", "dev": true, "requires": { - "domelementtype": "^2.0.1", - "domhandler": "^4.2.0", - "entities": "^2.0.0" + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" } }, "domain-browser": { @@ -31807,13 +33395,30 @@ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", "dev": true }, + "domexception": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", + "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "dev": true, + "requires": { + "webidl-conversions": "^5.0.0" + }, + "dependencies": { + "webidl-conversions": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-5.0.0.tgz", + "integrity": "sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==", + "dev": true + } + } + }, "domhandler": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.0.tgz", - "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", + "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", "dev": true, "requires": { - "domelementtype": "^2.2.0" + "domelementtype": "^2.3.0" } }, "dompurify": { @@ -31822,16 +33427,28 @@ "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" }, "domutils": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", - "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", + "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", "dev": true, "requires": { - "dom-serializer": "^1.0.1", - "domelementtype": "^2.2.0", - "domhandler": "^4.2.0" + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" } }, + "dotenv": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-10.0.0.tgz", + "integrity": "sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q==", + "dev": true + }, + "duplexer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", + "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==", + "dev": true + }, "duplexify": { "version": "3.7.1", "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", @@ -31889,10 +33506,19 @@ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", "dev": true }, + "ejs": { + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "dev": true, + "requires": { + "jake": "^10.8.5" + } + }, "electron-to-chromium": { - "version": "1.4.661", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.661.tgz", - "integrity": "sha512-AFg4wDHSOk5F+zA8aR+SVIOabu7m0e7BiJnigCvPXzIGy731XENw/lmNxTySpVFtkFEy+eyt4oHhh5FF3NjQNw==", + "version": "1.4.816", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.816.tgz", + "integrity": "sha512-EKH5X5oqC6hLmiS7/vYtZHZFTNdhsYG5NVPRN6Yn0kQHNBlT59+xSM8HBy66P5fxWpKgZbPqb+diC64ng295Jw==", "dev": true }, "elliptic": { @@ -31993,9 +33619,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz", - "integrity": "sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==", + "version": "5.17.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", + "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -32018,10 +33644,10 @@ "dev": true }, "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "devOptional": true }, "env-paths": { "version": "2.2.1", @@ -32065,35 +33691,10 @@ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", "dev": true }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "es6-promise": { @@ -32110,46 +33711,45 @@ } }, "esbuild": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.17.8.tgz", - "integrity": "sha512-g24ybC3fWhZddZK6R3uD2iF/RIPnRpwJAqLov6ouX3hMbY4+tKolP0VMF3zuIYCaXun+yHwS5IPQ91N2BT191g==", - "dev": true, - "optional": true, - "requires": { - "@esbuild/android-arm": "0.17.8", - "@esbuild/android-arm64": "0.17.8", - "@esbuild/android-x64": "0.17.8", - "@esbuild/darwin-arm64": "0.17.8", - "@esbuild/darwin-x64": "0.17.8", - "@esbuild/freebsd-arm64": "0.17.8", - "@esbuild/freebsd-x64": "0.17.8", - "@esbuild/linux-arm": "0.17.8", - "@esbuild/linux-arm64": "0.17.8", - "@esbuild/linux-ia32": "0.17.8", - "@esbuild/linux-loong64": "0.17.8", - "@esbuild/linux-mips64el": "0.17.8", - "@esbuild/linux-ppc64": "0.17.8", - "@esbuild/linux-riscv64": "0.17.8", - "@esbuild/linux-s390x": "0.17.8", - "@esbuild/linux-x64": "0.17.8", - "@esbuild/netbsd-x64": "0.17.8", - "@esbuild/openbsd-x64": "0.17.8", - "@esbuild/sunos-x64": "0.17.8", - "@esbuild/win32-arm64": "0.17.8", - "@esbuild/win32-ia32": "0.17.8", - "@esbuild/win32-x64": "0.17.8" + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.18.17.tgz", + "integrity": "sha512-1GJtYnUxsJreHYA0Y+iQz2UEykonY66HNWOb0yXYZi9/kNrORUEHVg87eQsCtqh59PEJ5YVZJO98JHznMJSWjg==", + "dev": true, + "requires": { + "@esbuild/android-arm": "0.18.17", + "@esbuild/android-arm64": "0.18.17", + "@esbuild/android-x64": "0.18.17", + "@esbuild/darwin-arm64": "0.18.17", + "@esbuild/darwin-x64": "0.18.17", + "@esbuild/freebsd-arm64": "0.18.17", + "@esbuild/freebsd-x64": "0.18.17", + "@esbuild/linux-arm": "0.18.17", + "@esbuild/linux-arm64": "0.18.17", + "@esbuild/linux-ia32": "0.18.17", + "@esbuild/linux-loong64": "0.18.17", + "@esbuild/linux-mips64el": "0.18.17", + "@esbuild/linux-ppc64": "0.18.17", + "@esbuild/linux-riscv64": "0.18.17", + "@esbuild/linux-s390x": "0.18.17", + "@esbuild/linux-x64": "0.18.17", + "@esbuild/netbsd-x64": "0.18.17", + "@esbuild/openbsd-x64": "0.18.17", + "@esbuild/sunos-x64": "0.18.17", + "@esbuild/win32-arm64": "0.18.17", + "@esbuild/win32-ia32": "0.18.17", + "@esbuild/win32-x64": "0.18.17" } }, "esbuild-wasm": { - "version": "0.17.8", - "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.17.8.tgz", - "integrity": "sha512-zCmpxv95E0FuCmvdw1K836UHnj4EdiQnFfjTby35y3LAjRPtXMj3sbHDRHjbD8Mqg5lTwq3knacr/1qIFU51CQ==", + "version": "0.18.17", + "resolved": "https://registry.npmjs.org/esbuild-wasm/-/esbuild-wasm-0.18.17.tgz", + "integrity": "sha512-9OHGcuRzy+I8ziF9FzjfKLWAPbvi0e/metACVg9k6bK+SI4FFxeV6PcZsz8RIVaMD4YNehw+qj6UMR3+qj/EuQ==", "dev": true }, "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-html": { @@ -32164,6 +33764,33 @@ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "dev": true, + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "source-map": "~0.6.1" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "optional": true + } + } + }, "eslint": { "version": "8.8.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.8.0.tgz", @@ -32811,9 +34438,9 @@ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-glob": { - "version": "3.2.11", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", - "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz", + "integrity": "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==", "dev": true, "requires": { "@nodelib/fs.stat": "^2.0.2", @@ -32903,6 +34530,35 @@ "integrity": "sha512-g872QGsHexznxkIAdK8UiZRe7SkE6kvylShU4Nsj8NvfvZag7S0QuQ4IgvPDkk75HxgjIVDwycFTDAgIiO4nDA==", "dev": true }, + "filelist": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz", + "integrity": "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==", + "dev": true, + "requires": { + "minimatch": "^5.0.1" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -32965,6 +34621,12 @@ "path-exists": "^4.0.0" } }, + "flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true + }, "flat-cache": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", @@ -33020,15 +34682,6 @@ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "for-in": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", @@ -33036,9 +34689,9 @@ "dev": true }, "foreground-child": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", - "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.2.1.tgz", + "integrity": "sha512-PXUUyLqrR2XCWICfv6ukppP96sdFwWbNEnfEMt7jNsISjMsvaLNinAHNDYyvkyU+SZG2BTSbT5NjG+vZslfGTA==", "dev": true, "requires": { "cross-spawn": "^7.0.0", @@ -33158,17 +34811,17 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } }, "fs-monkey": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.5.tgz", - "integrity": "sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz", + "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==", "dev": true }, "fs-write-stream-atomic": { @@ -33229,12 +34882,6 @@ "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, "gauge": { "version": "4.0.4", "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", @@ -33422,6 +35069,15 @@ "lodash": "^4.17.15" } }, + "guess-parser": { + "version": "0.4.22", + "resolved": "https://registry.npmjs.org/guess-parser/-/guess-parser-0.4.22.tgz", + "integrity": "sha512-KcUWZ5ACGaBM69SbqwVIuWGoSAgD+9iJnchR9j/IarVI1jHVeXv+bUXBIMeqVMSKt3zrn0Dgf9UpcOEpPBLbSg==", + "dev": true, + "requires": { + "@wessberg/ts-evaluator": "0.0.27" + } + }, "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", @@ -33436,12 +35092,6 @@ "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", @@ -33469,15 +35119,6 @@ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "dev": true }, - "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, - "requires": { - "has-symbols": "^1.0.3" - } - }, "has-unicode": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", @@ -33701,10 +35342,19 @@ "integrity": "sha512-vcz0yAaX/OaV6sdNHuT9alBOKkSxYb8h5Yq26dUqgi7XmCgGUSa7U9PiY1PBXQFMjKv1wVPs5/QzHlGuxPDUGg==", "dev": true }, + "html-encoding-sniffer": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-2.0.1.tgz", + "integrity": "sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==", + "dev": true, + "requires": { + "whatwg-encoding": "^1.0.5" + } + }, "html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==", "dev": true }, "html-escaper": { @@ -33714,54 +35364,15 @@ "dev": true }, "htmlparser2": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.1.tgz", - "integrity": "sha512-4lVbmc1diZC7GUJQtRQ5yBAeUCL1exyMwmForWkRLnwyzWBFxN633SALPMGYaWZvKe9j1pRZJpauvmxENSp/EA==", + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", + "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", "dev": true, "requires": { "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "domutils": "^3.0.1", - "entities": "^4.3.0" - }, - "dependencies": { - "dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - } - }, - "domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dev": true, - "requires": { - "domelementtype": "^2.3.0" - } - }, - "domutils": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.0.1.tgz", - "integrity": "sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==", - "dev": true, - "requires": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.1" - } - }, - "entities": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.3.1.tgz", - "integrity": "sha512-o4q/dYJlmyjP2zfnaWDUC6A3BQFmVTX+tZPezK7k0GLSU9QYCauscf5Y+qcEPzKL+EixVouYDgLQK5H9GrLpkg==", - "dev": true - } + "entities": "^4.4.0" } }, "http-cache-semantics": { @@ -33815,12 +35426,12 @@ } }, "http-proxy-agent": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", - "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-4.0.1.tgz", + "integrity": "sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==", "dev": true, "requires": { - "@tootallnate/once": "2", + "@tootallnate/once": "1", "agent-base": "6", "debug": "4" } @@ -33919,9 +35530,9 @@ "dev": true }, "ignore-walk": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.4.tgz", - "integrity": "sha512-t7sv42WkwFkyKbivUCglsQW5YWMskWtbEf4MNKX5u/CCWHKSPzN4FtBQGsQZgCLbxOzpVlcbWVK5KB3auIOjSw==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-6.0.5.tgz", + "integrity": "sha512-VuuG0wCnjhnylG1ABXT3dAuIpTNDs/G8jlpmwXY03fXoXy/8ZK8/T+hMzt8L4WnrLCJgdybqgPagnF/f97cg3A==", "dev": true, "requires": { "minimatch": "^9.0.0" @@ -33937,9 +35548,9 @@ } }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -33955,9 +35566,9 @@ "optional": true }, "immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "import-fresh": { @@ -34096,17 +35707,6 @@ } } }, - "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", - "dev": true, - "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - } - }, "internmap": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", @@ -34118,10 +35718,34 @@ "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" }, + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "dependencies": { + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + } + } + }, "ipaddr.js": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz", - "integrity": "sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ==", + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", + "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", "dev": true }, "is": { @@ -34139,41 +35763,12 @@ "kind-of": "^6.0.0" } }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -34183,28 +35778,12 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, "is-ci": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", @@ -34231,15 +35810,6 @@ "kind-of": "^6.0.0" } }, - "is-date-object": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", - "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-descriptor": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", @@ -34309,27 +35879,12 @@ "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", "dev": true }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-obj": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", @@ -34357,15 +35912,11 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==", + "dev": true }, "is-regexp": { "version": "1.0.0", @@ -34373,45 +35924,12 @@ "integrity": "sha1-/S2INUXEa6xaYz57mgnof6LLUGk=", "dev": true }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -34424,22 +35942,6 @@ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", "dev": true }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "is-what": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz", @@ -34555,15 +36057,78 @@ } }, "jackspeak": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", - "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.0.tgz", + "integrity": "sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==", "dev": true, "requires": { "@isaacs/cliui": "^8.0.2", "@pkgjs/parseargs": "^0.11.0" } }, + "jake": { + "version": "10.9.1", + "resolved": "https://registry.npmjs.org/jake/-/jake-10.9.1.tgz", + "integrity": "sha512-61btcOHNnLnsOdtLgA5efqQWjnSi/vow5HbI7HMdKKWqvrKR1bLK3BPlJn9gcSaP2ewuamUSMB5XEy76KUIS2w==", + "dev": true, + "requires": { + "async": "^3.2.3", + "chalk": "^4.0.2", + "filelist": "^1.0.4", + "minimatch": "^3.1.2" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "jasmine-core": { "version": "3.99.0", "resolved": "https://registry.npmjs.org/jasmine-core/-/jasmine-core-3.99.0.tgz", @@ -34598,6 +36163,12 @@ } } }, + "jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "dev": true + }, "jquery": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz", @@ -34625,6 +36196,93 @@ "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", "dev": true }, + "jsdom": { + "version": "16.7.0", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-16.7.0.tgz", + "integrity": "sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==", + "dev": true, + "requires": { + "abab": "^2.0.5", + "acorn": "^8.2.4", + "acorn-globals": "^6.0.0", + "cssom": "^0.4.4", + "cssstyle": "^2.3.0", + "data-urls": "^2.0.0", + "decimal.js": "^10.2.1", + "domexception": "^2.0.1", + "escodegen": "^2.0.0", + "form-data": "^3.0.0", + "html-encoding-sniffer": "^2.0.1", + "http-proxy-agent": "^4.0.1", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^2.0.0", + "webidl-conversions": "^6.1.0", + "whatwg-encoding": "^1.0.5", + "whatwg-mimetype": "^2.3.0", + "whatwg-url": "^8.5.0", + "ws": "^7.4.6", + "xml-name-validator": "^3.0.0" + }, + "dependencies": { + "form-data": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", + "dev": true + }, + "tr46": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-2.1.0.tgz", + "integrity": "sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==", + "dev": true, + "requires": { + "punycode": "^2.1.1" + } + }, + "webidl-conversions": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-6.1.0.tgz", + "integrity": "sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==", + "dev": true + }, + "whatwg-url": { + "version": "8.7.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-8.7.0.tgz", + "integrity": "sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==", + "dev": true, + "requires": { + "lodash": "^4.7.0", + "tr46": "^2.1.0", + "webidl-conversions": "^6.1.0" + } + }, + "ws": { + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "dev": true, + "requires": {} + } + } + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -34920,6 +36578,16 @@ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==", "dev": true }, + "launch-editor": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "dev": true, + "requires": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, "lazy-ass": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", @@ -35378,12 +37046,12 @@ } }, "magic-string": { - "version": "0.29.0", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.29.0.tgz", - "integrity": "sha512-WcfidHrDjMY+eLjlU+8OvwREqHwpgCeKVBUpQ3OhYYuvfaYCUgcbuBzappNzZvg/v8onU3oQj+BYpkOJe9Iw4Q==", + "version": "0.30.1", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.1.tgz", + "integrity": "sha512-mbVKXPmS0z0G4XqFDCTllmDQ6coZzn94aMlb0o/A4HEHJCKcanlDZwYJgwnkmgD3jyWhUgj9VsPrfd972yPffA==", "dev": true, "requires": { - "@jridgewell/sourcemap-codec": "^1.4.13" + "@jridgewell/sourcemap-codec": "^1.4.15" } }, "make-dir": { @@ -35443,6 +37111,12 @@ "semver": "^7.3.5" } }, + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, "brace-expansion": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", @@ -35500,6 +37174,17 @@ "once": "^1.3.0" } }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -35569,9 +37254,9 @@ } }, "marked": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.2.3.tgz", - "integrity": "sha512-slWRdJkbTZ+PjkyJnE30Uid64eHwbwa1Q25INCAYfZlK4o6ylagBy/Le9eWntqJFoFT93ikUKMv47GZ4gTwHkw==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", + "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", "peer": true }, "material-design-icons-iconfont": { @@ -35752,24 +37437,24 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.7.6", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz", + "integrity": "sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw==", "dev": true, "requires": { "schema-utils": "^4.0.0" }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "ajv-keywords": { @@ -35827,9 +37512,9 @@ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.2.8.tgz", - "integrity": "sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", + "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", "dev": true }, "minipass-collect": { @@ -36058,6 +37743,12 @@ } } }, + "mrmime": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz", + "integrity": "sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw==", + "dev": true + }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", @@ -36153,9 +37844,9 @@ "dev": true }, "ngx-markdown": { - "version": "15.1.2", - "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-15.1.2.tgz", - "integrity": "sha512-mAUORpUnHCV4tnxEHV4oS5YEdIaolUclulCblUrvAEU3AEND8MMTxlwHujqVC2M398/aKH0SBSrjLzDbMUJCoQ==", + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/ngx-markdown/-/ngx-markdown-16.0.0.tgz", + "integrity": "sha512-/rlbXi+HBscJCDdwaTWIUrRkvwJicPnuAgeugOCZa0UbZ4VCWV3U0+uB1Zv6krRDF6FXJNXNLTUrMZV7yH8I6A==", "requires": { "clipboard": "^2.0.11", "emoji-toolkit": "^7.0.0", @@ -36196,8 +37887,7 @@ "version": "3.2.1", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", - "dev": true, - "optional": true + "dev": true }, "node-fetch": { "version": "2.6.7", @@ -36255,11 +37945,10 @@ } }, "node-gyp-build": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.3.0.tgz", - "integrity": "sha512-iWjXZvmboq0ja1pUGULQBexmxq8CV4xBhX7VDOTbL7ZR4FOowwY/VOtRxBN/yKxmdGoIp4j5ysNT4u3S2pDQ3Q==", - "dev": true, - "optional": true + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", + "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==", + "dev": true }, "node-libs-browser": { "version": "2.2.1", @@ -36436,23 +38125,11 @@ "validate-npm-package-name": "^5.0.0" }, "dependencies": { - "builtins": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", - "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", - "dev": true, - "requires": { - "semver": "^7.0.0" - } - }, "validate-npm-package-name": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz", - "integrity": "sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ==", - "dev": true, - "requires": { - "builtins": "^5.0.0" - } + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz", + "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==", + "dev": true } } }, @@ -36500,6 +38177,23 @@ "proc-log": "^3.0.0" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -36529,16 +38223,10 @@ "ssri": "^10.0.0" } }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -36548,9 +38236,9 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -36587,6 +38275,203 @@ "boolbase": "^1.0.0" } }, + "nwsapi": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.10.tgz", + "integrity": "sha512-QK0sRs7MKv0tKe1+5uZIQk/C8XGza4DAnztJG8iD+TpJIORARrCxczA738awHrZoHeTjSSoHqao2teO0dC/gFQ==", + "dev": true + }, + "nx": { + "version": "16.5.1", + "resolved": "https://registry.npmjs.org/nx/-/nx-16.5.1.tgz", + "integrity": "sha512-I3hJRE4hG7JWAtncWwDEO3GVeGPpN0TtM8xH5ArZXyDuVeTth/i3TtJzdDzqXO1HHtIoAQN0xeq4n9cLuMil5g==", + "dev": true, + "requires": { + "@nrwl/tao": "16.5.1", + "@nx/nx-darwin-arm64": "16.5.1", + "@nx/nx-darwin-x64": "16.5.1", + "@nx/nx-freebsd-x64": "16.5.1", + "@nx/nx-linux-arm-gnueabihf": "16.5.1", + "@nx/nx-linux-arm64-gnu": "16.5.1", + "@nx/nx-linux-arm64-musl": "16.5.1", + "@nx/nx-linux-x64-gnu": "16.5.1", + "@nx/nx-linux-x64-musl": "16.5.1", + "@nx/nx-win32-arm64-msvc": "16.5.1", + "@nx/nx-win32-x64-msvc": "16.5.1", + "@parcel/watcher": "2.0.4", + "@yarnpkg/lockfile": "^1.1.0", + "@yarnpkg/parsers": "3.0.0-rc.46", + "@zkochan/js-yaml": "0.0.6", + "axios": "^1.0.0", + "chalk": "^4.1.0", + "cli-cursor": "3.1.0", + "cli-spinners": "2.6.1", + "cliui": "^7.0.2", + "dotenv": "~10.0.0", + "enquirer": "~2.3.6", + "fast-glob": "3.2.7", + "figures": "3.2.0", + "flat": "^5.0.2", + "fs-extra": "^11.1.0", + "glob": "7.1.4", + "ignore": "^5.0.4", + "js-yaml": "4.1.0", + "jsonc-parser": "3.2.0", + "lines-and-columns": "~2.0.3", + "minimatch": "3.0.5", + "npm-run-path": "^4.0.1", + "open": "^8.4.0", + "semver": "7.5.3", + "string-width": "^4.2.3", + "strong-log-transformer": "^2.1.0", + "tar-stream": "~2.2.0", + "tmp": "~0.2.1", + "tsconfig-paths": "^4.1.2", + "tslib": "^2.3.0", + "v8-compile-cache": "2.3.0", + "yargs": "^17.6.2", + "yargs-parser": "21.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "fast-glob": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.7.tgz", + "integrity": "sha512-rYGMRwip6lUMvYD3BTScMwT1HtAs2d71SMv66Vrxs0IekGZEjhM0pcMfjQPnknBt2zeCwQMEupiN02ZP4DiT1Q==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "glob": { + "version": "7.1.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", + "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "lines-and-columns": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-2.0.4.tgz", + "integrity": "sha512-wM1+Z03eypVAVUCE7QdSqpVIvelbOakn1M0bPDoA4SGWPx3sNDVUiMo3L6To6WWGClB7VyXnhQ4Sn7gxiJbE6A==", + "dev": true + }, + "minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-tUpxzX0VAzJHjLu0xUfFv1gwVp9ba3IOuRAVH2EGuRW8a5emA2FlACLqiT/lDVtS1W+TGNwqz3sWaNyLgDJWuw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "semver": { + "version": "7.5.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.3.tgz", + "integrity": "sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tsconfig-paths": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", + "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", + "dev": true, + "requires": { + "json5": "^2.2.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + } + } + }, "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", @@ -36667,20 +38552,10 @@ "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", "dev": true }, - "object-is": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", - "integrity": "sha512-3cyDsyHgtmi7I7DfSSI2LDp6SK2lwvtbg0p0R1e0RvTqF5ceGx+K2dfSjm1bKDMVCFEDAQvy+o8c6a7VujOddw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3" - } - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "object-path": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.8.tgz", + "integrity": "sha512-YJjNZrlXJFM42wTBn6zgOJVar9KFJvzx6sTWDte8sWZF//cnjl0BxHNpfZx+ZffXX63A9q0b1zsFiBX4g4X5KA==", "dev": true }, "object-visit": { @@ -36692,18 +38567,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", - "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -36752,9 +38615,9 @@ } }, "open": { - "version": "8.4.1", - "resolved": "https://registry.npmjs.org/open/-/open-8.4.1.tgz", - "integrity": "sha512-/4b7qZNhv6Uhd7jjnREh1NjnPxlTq+XNWPG88Ydkj5AILcA5m3ajvcg57pB24EQjKv0dK62XnDqk9c/hkIG5Kg==", + "version": "8.4.2", + "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz", + "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==", "dev": true, "requires": { "define-lazy-prop": "^2.0.0", @@ -37011,10 +38874,16 @@ } } }, + "package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true + }, "pacote": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.1.0.tgz", - "integrity": "sha512-FFcjtIl+BQNfeliSm7MZz5cpdohvUV1yjGnqgVM4UnVF7JslRY0ImXAygdaCDV0jjUADEWu4y5xsDV8brtrTLg==", + "version": "15.2.0", + "resolved": "https://registry.npmjs.org/pacote/-/pacote-15.2.0.tgz", + "integrity": "sha512-rJVZeIwHTUta23sIZgEIM62WYwbmGbThdbnkt81ravBplQv+HjyroqnLRNH2+sLJHcGZmLRmhPwACqhfTcOmnA==", "dev": true, "requires": { "@npmcli/git": "^4.0.0", @@ -37023,7 +38892,7 @@ "@npmcli/run-script": "^6.0.0", "cacache": "^17.0.0", "fs-minipass": "^3.0.0", - "minipass": "^4.0.0", + "minipass": "^5.0.0", "npm-package-arg": "^10.0.0", "npm-packlist": "^7.0.0", "npm-pick-manifest": "^8.0.0", @@ -37032,7 +38901,7 @@ "promise-retry": "^2.0.1", "read-package-json": "^6.0.0", "read-package-json-fast": "^3.0.0", - "sigstore": "^1.0.0", + "sigstore": "^1.3.0", "ssri": "^10.0.0", "tar": "^6.1.11" }, @@ -37047,36 +38916,37 @@ } }, "glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "requires": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", - "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "jackspeak": "^3.1.2", + "minimatch": "^9.0.4", + "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", + "path-scurry": "^1.11.1" }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } }, "json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true }, "minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", + "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -37211,12 +39081,6 @@ "parse5-sax-parser": "^7.0.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -37228,23 +39092,6 @@ } } }, - "parse5-htmlparser2-tree-adapter": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-6.0.1.tgz", - "integrity": "sha512-qPuWvbLgvDGilKc5BoicRovlT4MtYT6JfJyBOMDsKoiT+GiuP5qyrPCnR9HcPECIJJmZh5jRndyNThnhhb/vlA==", - "dev": true, - "requires": { - "parse5": "^6.0.1" - }, - "dependencies": { - "parse5": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-6.0.1.tgz", - "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==", - "dev": true - } - } - }, "parse5-sax-parser": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/parse5-sax-parser/-/parse5-sax-parser-7.0.0.tgz", @@ -37254,12 +39101,6 @@ "parse5": "^7.0.0" }, "dependencies": { - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true - }, "parse5": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", @@ -37319,25 +39160,19 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "requires": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "dependencies": { "lru-cache": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", - "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", - "dev": true - }, - "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "10.3.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.3.0.tgz", + "integrity": "sha512-CQl19J/g+Hbjbv4Y3mFNNXFEL/5t/KCg8POCuUqd4rMKjGG+j1ybER83hxV58zL+dFI1PTkt3GNFSHRt+d8qEQ==", "dev": true } } @@ -37380,9 +39215,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -37413,9 +39248,9 @@ } }, "piscina": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", - "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-4.0.0.tgz", + "integrity": "sha512-641nAmJS4k4iqpNUqfggqUBUMmlw0ZoM5VZKdQkV2e970Inn3Tk9kroCc1wpsYLD07vCwpys5iY0d3xI/9WkTg==", "dev": true, "requires": { "eventemitter-asyncresource": "^1.0.0", @@ -37469,38 +39304,62 @@ } }, "postcss-loader": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.0.2.tgz", - "integrity": "sha512-fUJzV/QH7NXUAqV8dWJ9Lg4aTkDCezpTS5HgJ2DvqznexTbSTxgi/dTECvTZ15BwKTtk8G/bqI/QTu2HPd3ZCg==", + "version": "7.3.3", + "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-7.3.3.tgz", + "integrity": "sha512-YgO/yhtevGO/vJePCQmTxiaEwER94LABZN0ZMT4A0vsak9TpO+RvKRs7EmJ8peIlB9xfXCsS7M8LjqncsUZ5HA==", "dev": true, "requires": { - "cosmiconfig": "^7.0.0", - "klona": "^2.0.5", + "cosmiconfig": "^8.2.0", + "jiti": "^1.18.2", "semver": "^7.3.8" }, "dependencies": { - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "cosmiconfig": { + "version": "8.3.6", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz", + "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==", "dev": true, "requires": { - "lru-cache": "^6.0.0" + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" } + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "semver": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", + "dev": true } } }, "postcss-modules-extract-imports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", - "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz", + "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==", "dev": true, "requires": {} }, "postcss-modules-local-by-default": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz", - "integrity": "sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q==", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz", + "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==", "dev": true, "requires": { "icss-utils": "^5.0.0", @@ -37509,9 +39368,9 @@ } }, "postcss-modules-scope": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz", - "integrity": "sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz", + "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==", "dev": true, "requires": { "postcss-selector-parser": "^6.0.4" @@ -37527,9 +39386,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.15", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz", - "integrity": "sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz", + "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -37871,9 +39730,9 @@ }, "dependencies": { "json-parse-even-better-errors": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.1.tgz", - "integrity": "sha512-aatBvbL26wVUCLmbWdCpeu9iF5wOyWpagiKkInA+kfws3sWdBrTnsvN2CKcyCYyUrc7rebNBlK6+kteg7ksecg==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-3.0.2.tgz", + "integrity": "sha512-fi0NG4bPjCHunUJffmLd0gxssIgkNmArMvis4iNah6Owg1MCJjWhEcDLmsK6iGkJq3tHwbDkTlce70/tmXN4cQ==", "dev": true }, "npm-normalize-package-bin": { @@ -37929,9 +39788,9 @@ "dev": true }, "regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "requires": { "regenerate": "^1.4.2" @@ -37944,9 +39803,9 @@ "dev": true }, "regenerator-transform": { - "version": "0.15.0", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", - "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "requires": { "@babel/runtime": "^7.8.4" @@ -37968,17 +39827,6 @@ "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==", "dev": true }, - "regexp.prototype.flags": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", - "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "set-function-name": "^2.0.0" - } - }, "regexpp": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", @@ -37986,25 +39834,19 @@ "dev": true }, "regexpu-core": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz", - "integrity": "sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz", + "integrity": "sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ==", "dev": true, "requires": { + "@babel/regjsgen": "^0.8.0", "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.1.0", - "regjsgen": "^0.7.1", "regjsparser": "^0.9.1", "unicode-match-property-ecmascript": "^2.0.0", - "unicode-match-property-value-ecmascript": "^2.0.0" + "unicode-match-property-value-ecmascript": "^2.1.0" } }, - "regjsgen": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz", - "integrity": "sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==", - "dev": true - }, "regjsparser": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz", @@ -38069,11 +39911,11 @@ "dev": true }, "resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", "requires": { - "is-core-module": "^2.9.0", + "is-core-module": "^2.11.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" } @@ -38181,6 +40023,15 @@ "integrity": "sha512-ndEIpszUHiG4HtDsQLeIuMvRsDnn8c8rYStabochtUeCvfuvNptb5TUbVD68LRAILPX7p9nqQGh4xJgn3EHS/g==", "optional": true }, + "rollup": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", + "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "dev": true, + "requires": { + "fsevents": "~2.3.2" + } + }, "run-async": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz", @@ -38257,9 +40108,9 @@ "integrity": "sha512-LRneZZRXNgjzwG4bDQdOTSbze3fHm1EAKN/8bePxnlEZiBmkYEDggaHbuvHI9/hoqHbGfsEA7tWS9GhYHZBBsw==" }, "sass": { - "version": "1.58.1", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.58.1.tgz", - "integrity": "sha512-bnINi6nPXbP1XNRaranMFEBZWUfdW/AF16Ql5+ypRxfTvCRTTKrLsMIakyDcayUt2t/RZotmL4kgJwNH5xO+bg==", + "version": "1.64.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.64.1.tgz", + "integrity": "sha512-16rRACSOFEE8VN7SCgBu1MpYCyN7urj9At898tyzdXFhC+a+yOX5dXwAR7L8/IdPJ1NB8OYoXmD55DM30B2kEQ==", "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", @@ -38268,12 +40119,11 @@ } }, "sass-loader": { - "version": "13.2.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.2.0.tgz", - "integrity": "sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.3.2.tgz", + "integrity": "sha512-CQbKl57kdEv+KDLquhC+gE3pXt74LEAzm+tzywcA0/aHZuub8wTErbjAoNI57rPUWRYRNC5WUnNl8eGJNbDdwg==", "dev": true, "requires": { - "klona": "^2.0.4", "neo-async": "^2.6.2" } }, @@ -38284,6 +40134,15 @@ "dev": true, "optional": true }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dev": true, + "requires": { + "xmlchars": "^2.2.0" + } + }, "schema-utils": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", @@ -38503,9 +40362,9 @@ } }, "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -38605,17 +40464,6 @@ "has-property-descriptors": "^1.0.1" } }, - "set-function-name": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", - "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", - "dev": true, - "requires": { - "define-data-property": "^1.0.1", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.0" - } - }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -38691,6 +40539,12 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, + "shell-quote": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz", + "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==", + "dev": true + }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", @@ -38721,6 +40575,23 @@ "make-fetch-happen": "^11.0.1" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -38750,16 +40621,10 @@ "ssri": "^10.0.0" } }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -38769,9 +40634,9 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -39039,21 +40904,13 @@ } }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" - }, - "dependencies": { - "ip": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", - "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", - "dev": true - } } }, "socks-proxy-agent": { @@ -39264,18 +41121,18 @@ } }, "ssri": { - "version": "10.0.5", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.5.tgz", - "integrity": "sha512-bSf16tAFkGeRlUNDjXu8FzaMQt6g2HZJrun7mtMbIPOddxt3GLMSz5VWUWcqTJUPfLEaDIepGxv+bYQW49596A==", + "version": "10.0.6", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", + "integrity": "sha512-MGrFH9Z4NP9Iyhqn16sDtBpRRNJ0Y2hNa6D65h736fVSaPCHr4DM4sWUNvVaSuC+0OBGhwsrydQwmgfg5LncqQ==", "dev": true, "requires": { "minipass": "^7.0.3" }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -39364,15 +41221,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "stream-browserify": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz", @@ -39578,6 +41426,17 @@ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", "dev": true }, + "strong-log-transformer": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strong-log-transformer/-/strong-log-transformer-2.1.0.tgz", + "integrity": "sha512-B3Hgul+z0L9a236FAUC9iZsL+nVHgoCJnqCbN588DjYxvGXaXaaFbfmQ/JhvKjZwsOukuR72XbHv71Qkug0HxA==", + "dev": true, + "requires": { + "duplexer": "^0.1.1", + "minimist": "^1.2.0", + "through": "^2.3.4" + } + }, "stylis": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", @@ -39604,6 +41463,12 @@ "integrity": "sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==", "dev": true }, + "symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==", + "dev": true + }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -39611,9 +41476,9 @@ "dev": true }, "tar": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", - "integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz", + "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==", "dev": true, "requires": { "chownr": "^2.0.0", @@ -39643,12 +41508,6 @@ } } } - }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true } } }, @@ -39686,13 +41545,13 @@ } }, "terser": { - "version": "5.16.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.3.tgz", - "integrity": "sha512-v8wWLaS/xt3nE9dgKEWhNUFP6q4kngO5B8eYFUuebsu7Dw/UNAnpUod6UHo04jSSkv8TzKHjZDSd7EXdDQAl8Q==", + "version": "5.19.2", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.2.tgz", + "integrity": "sha512-qC5+dmecKJA4cpYxRa5aVkKehYsQKc+AHeKl0Oe62aYjBL8ZA33tTljktDHJSaxxMnbI5ZYw+o/S2DxxLu8OfA==", "dev": true, "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -39706,28 +41565,46 @@ } }, "terser-webpack-plugin": { - "version": "5.3.6", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz", - "integrity": "sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==", + "version": "5.3.10", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", + "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.14", + "@jridgewell/trace-mapping": "^0.3.20", "jest-worker": "^27.4.5", "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "terser": "^5.14.1" + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" }, "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "dev": true + }, "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", "ajv-keywords": "^3.5.2" } + }, + "terser": { + "version": "5.31.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", + "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "dev": true, + "requires": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + } } } }, @@ -40189,9 +42066,9 @@ } }, "tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==" + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.1.tgz", + "integrity": "sha512-t0hLfiEKfMUoqhG+U1oid7Pva4bbDPHYfJNiB7BiIjRkj1pyC++4N3huJfqY6aRH6VTB0rvtzQwjM4K6qpfOig==" }, "tsutils": { "version": "3.21.0", @@ -40227,6 +42104,23 @@ "make-fetch-happen": "^11.1.1" }, "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "dev": true + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dev": true, + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", @@ -40256,16 +42150,10 @@ "ssri": "^10.0.0" } }, - "minipass": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz", - "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==", - "dev": true - }, "minipass-fetch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.4.tgz", - "integrity": "sha512-jHAqnA728uUpIaFm7NWsCnqKT6UqZz7GcI/bDpPATuwYyKwJwW0remxSCxUlKiEty+eopHGa3oc8WxgQ1FFJqg==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-3.0.5.tgz", + "integrity": "sha512-2N8elDQAtSnFV0Dk7gt15KHsS0Fyz6CbYZ360h0WTYV1Ty46li3rAXVOQj1THMNLdmrD9Vt5pBPtWtVkpwGBqg==", "dev": true, "requires": { "encoding": "^0.1.13", @@ -40275,9 +42163,9 @@ }, "dependencies": { "minipass": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", - "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", "dev": true } } @@ -40336,9 +42224,9 @@ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" }, "typescript": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.8.4.tgz", - "integrity": "sha512-QCh+85mCy+h0IGff8r5XWzOVSbBO+KfeYrMQh7NJ58QujwcE22u+NUSmUxqF+un70P9GXKxa2HCNiTTMJknyjQ==", + "version": "4.9.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", + "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "dev": true }, "ua-parser-js": { @@ -40357,6 +42245,12 @@ "through": "^2.3.8" } }, + "undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -40374,9 +42268,9 @@ } }, "unicode-match-property-value-ecmascript": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz", - "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz", + "integrity": "sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA==", "dev": true }, "unicode-property-aliases-ecmascript": { @@ -40487,13 +42381,13 @@ "optional": true }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.0.16", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", + "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { @@ -40638,6 +42532,18 @@ "extsprintf": "^1.2.0" } }, + "vite": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", + "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "dev": true, + "requires": { + "esbuild": "^0.18.10", + "fsevents": "~2.3.2", + "postcss": "^8.4.27", + "rollup": "^3.27.1" + } + }, "vm-browserify": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz", @@ -40650,6 +42556,24 @@ "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=", "dev": true }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dev": true, + "requires": { + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-2.0.0.tgz", + "integrity": "sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==", + "dev": true, + "requires": { + "xml-name-validator": "^3.0.0" + } + }, "watchpack": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", @@ -40948,22 +42872,22 @@ "dev": true }, "webpack": { - "version": "5.76.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.1.tgz", - "integrity": "sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==", + "version": "5.88.2", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", + "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", + "enhanced-resolve": "^5.15.0", + "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", @@ -40972,17 +42896,17 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", + "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", "webpack-sources": "^3.2.3" }, "dependencies": { "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "requires": { "@types/json-schema": "^7.0.8", @@ -40993,9 +42917,9 @@ } }, "webpack-dev-middleware": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.0.1.tgz", - "integrity": "sha512-PZPZ6jFinmqVPJZbisfggDiC+2EeGZ1ZByyMP5sOFJcPPWSexalISz+cvm+j+oYPT7FIJyxT76esjnw9DhE5sw==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-6.1.2.tgz", + "integrity": "sha512-Wu+EHmX326YPYUpQLKmKbTyZZJIB8/n6R09pTmB03kJmnMsVPTo9COzHZFr01txwaCAuZvfBJE4ZCHRcKs5JaQ==", "dev": true, "requires": { "colorette": "^2.0.10", @@ -41006,15 +42930,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "ajv-keywords": { @@ -41053,9 +42977,9 @@ } }, "webpack-dev-server": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz", - "integrity": "sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==", + "version": "4.15.1", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz", + "integrity": "sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA==", "dev": true, "requires": { "@types/bonjour": "^3.5.9", @@ -41064,7 +42988,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -41077,6 +43001,7 @@ "html-entities": "^2.3.2", "http-proxy-middleware": "^2.0.3", "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", "open": "^8.0.9", "p-retry": "^4.5.0", "rimraf": "^3.0.2", @@ -41086,19 +43011,19 @@ "sockjs": "^0.3.24", "spdy": "^4.0.2", "webpack-dev-middleware": "^5.3.1", - "ws": "^8.4.2" + "ws": "^8.13.0" }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", + "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "uri-js": "^4.4.1" } }, "ajv-keywords": { @@ -41146,13 +43071,20 @@ "range-parser": "^1.2.1", "schema-utils": "^4.0.0" } + }, + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "requires": {} } } }, "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz", + "integrity": "sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg==", "dev": true, "requires": { "clone-deep": "^4.0.1", @@ -41191,6 +43123,21 @@ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", "dev": true }, + "whatwg-encoding": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", + "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "dev": true, + "requires": { + "iconv-lite": "0.4.24" + } + }, + "whatwg-mimetype": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz", + "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==", + "dev": true + }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -41210,44 +43157,6 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.14.tgz", - "integrity": "sha512-VnXFiIW8yNn9kIHN88xvZ4yOWchftKDsRJ8fEPacX/wl1lOvBrhsJ/OeJCXq7B0AaijRuqgzSKalJoPk+D8MPg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.6", - "call-bind": "^1.0.5", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.1" - } - }, "wide-align": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz", @@ -41258,9 +43167,9 @@ } }, "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz", + "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, "word-wrap": { @@ -41370,6 +43279,18 @@ "dev": true, "requires": {} }, + "xml-name-validator": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz", + "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==", + "dev": true + }, + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==", + "dev": true + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", @@ -41394,9 +43315,9 @@ "dev": true }, "yargs": { - "version": "17.6.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", - "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", "dev": true, "requires": { "cliui": "^8.0.1", @@ -41443,12 +43364,18 @@ "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", "dev": true }, + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true + }, "zone.js": { - "version": "0.11.4", - "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.11.4.tgz", - "integrity": "sha512-DDh2Ab+A/B+9mJyajPjHFPWfYU1H+pdun4wnnk0OcQTNjem1XQSZ2CDW+rfZEUDjv5M19SBqAkjZi0x5wuB5Qw==", + "version": "0.13.3", + "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.13.3.tgz", + "integrity": "sha512-MKPbmZie6fASC/ps4dkmIhaT5eonHkEt6eAy80K42tAm0G2W+AahLJjbfi6X9NPdciOE9GRFTTM8u2IiF6O3ww==", "requires": { - "tslib": "^2.0.0" + "tslib": "^2.3.0" } } } diff --git a/package.json b/package.json index fea6794260..7c4e4f0839 100644 --- a/package.json +++ b/package.json @@ -41,18 +41,18 @@ }, "private": true, "dependencies": { - "@angular/animations": "^15.2.10", - "@angular/cdk": "^15.2.9", - "@angular/common": "^15.2.10", - "@angular/compiler": "^15.2.10", - "@angular/core": "^15.2.10", - "@angular/forms": "^15.2.10", - "@angular/material": "^15.2.9", - "@angular/platform-browser": "^15.2.10", - "@angular/platform-browser-dynamic": "^15.2.10", - "@angular/router": "^15.2.10", + "@angular/animations": "^16.2.12", + "@angular/cdk": "^16.2.14", + "@angular/common": "^16.2.12", + "@angular/compiler": "^16.2.12", + "@angular/core": "^16.2.12", + "@angular/forms": "^16.2.12", + "@angular/material": "^16.2.14", + "@angular/platform-browser": "^16.2.12", + "@angular/platform-browser-dynamic": "^16.2.12", + "@angular/router": "^16.2.12", "@datorama/akita": "^7.0.0", - "@fortawesome/angular-fontawesome": "^0.12.1", + "@fortawesome/angular-fontawesome": "^0.13.0", "@fortawesome/fontawesome-svg-core": "^6.2.0", "@fortawesome/free-brands-svg-icons": "^6.0.0", "@fortawesome/free-solid-svg-icons": "^6.0.0", @@ -60,7 +60,7 @@ "@ngneat/forms-manager": "^2.3.0", "academicons": "^1.8.6", "ace-builds": "^1.4.12", - "angular-tag-cloud-module": "^14.0.0", + "angular-tag-cloud-module": "^16.0.0", "bodybuilder": "^2.4.0", "bootstrap": "^3.4.1", "cytoscape": "^3.19.0", @@ -72,7 +72,7 @@ "jquery": "^3.6.0", "material-design-icons-iconfont": "^6.1.0", "mathjax": "^3.2.2", - "ngx-markdown": "^15.1.2", + "ngx-markdown": "^16.0.0", "ngx-mat-select-search": "^6.0.0", "ngx-sharebuttons": "^8.0.5", "prismjs": "^1.29.0", @@ -80,18 +80,18 @@ "ts-md5": "^1.2.8", "tslib": "^2.3.0", "uuid": "^8.3.2", - "zone.js": "~0.11.4" + "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^15.2.10", - "@angular-eslint/builder": "^15.2.1", - "@angular-eslint/eslint-plugin": "^15.2.1", - "@angular-eslint/eslint-plugin-template": "^15.2.1", - "@angular-eslint/schematics": "15.2.1", + "@angular-devkit/build-angular": "^16.2.14", + "@angular-eslint/builder": "^16.3.1", + "@angular-eslint/eslint-plugin": "^16.3.1", + "@angular-eslint/eslint-plugin-template": "^16.3.1", + "@angular-eslint/schematics": "^16.3.1", "@angular-eslint/template-parser": "^15.2.1", - "@angular/cli": "^15.2.10", - "@angular/compiler-cli": "^15.2.10", - "@angular/language-service": "^15.2.10", + "@angular/cli": "^16.2.14", + "@angular/compiler-cli": "^16.2.12", + "@angular/language-service": "^16.2.12", "@cypress/webpack-batteries-included-preprocessor": "^2.4.1", "@cypress/webpack-preprocessor": "^5.17.1", "@datorama/akita-ngdevtools": "^7.0.0", @@ -99,7 +99,7 @@ "@types/elasticsearch": "^5.0.37", "@types/jasmine": "^3.7.7", "@types/jquery": "^3.5.5", - "@types/node": "^15.12.2", + "@types/node": "^18.19.39", "@typescript-eslint/eslint-plugin": "5.3.0", "@typescript-eslint/parser": "5.3.0", "cypress": "^13.7.2", @@ -116,11 +116,14 @@ "pa11y-ci": "^3.0.1", "prettier": "^2.3.1", "ts-node": "^10.9.1", - "typescript": "^4.8.4" + "typescript": "^4.9.5" }, "overrides": { "@schematics/update": { "ini": "^1.3.8" + }, + "ngx-mat-select-search": { + "@angular/material": "^16.2.14" } } } diff --git a/src/app/mytools/my-tool/my-tool.component.html b/src/app/mytools/my-tool/my-tool.component.html index d396f847b0..83171d687d 100644 --- a/src/app/mytools/my-tool/my-tool.component.html +++ b/src/app/mytools/my-tool/my-tool.component.html @@ -143,7 +143,7 @@ class="accent-1-dark-btn" type="button" (click)="addToExistingTools()" - [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === false" + [disabled]="(isRefreshing$ | async) || (userQuery.user$ | async) === null" matTooltip="Discover tools added by others using your linked source control accounts" > Discover Existing Dockstore Tools diff --git a/src/app/mytools/my-tool/my-tool.component.ts b/src/app/mytools/my-tool/my-tool.component.ts index 18fb2af772..f8167309e9 100644 --- a/src/app/mytools/my-tool/my-tool.component.ts +++ b/src/app/mytools/my-tool/my-tool.component.ts @@ -150,6 +150,7 @@ export class MyToolComponent extends MyEntry implements OnInit { this.router.events .pipe( filter((event) => event instanceof NavigationEnd), + map((event) => event as NavigationEnd), takeUntil(this.ngUnsubscribe) ) .subscribe((event: RouterEvent) => { diff --git a/src/app/myworkflows/my-workflow/my-workflow.component.html b/src/app/myworkflows/my-workflow/my-workflow.component.html index 24a3a0f20e..8da02db3a1 100644 --- a/src/app/myworkflows/my-workflow/my-workflow.component.html +++ b/src/app/myworkflows/my-workflow/my-workflow.component.html @@ -80,7 +80,7 @@ color="primary" type="button" (click)="addToExistingWorkflows()" - [disabled]="(isRefreshing$ | async) || (user$ | async) === false" + [disabled]="(isRefreshing$ | async) || (user$ | async) === null" matTooltip="Discover {{ entryType$ | async }}s added by others using your linked source control accounts" matTooltipPosition="after" id="addToExistingWorkflows" diff --git a/src/app/organizations/organization/organization.component.html b/src/app/organizations/organization/organization.component.html index 0f6e4dafeb..b67614fb61 100644 --- a/src/app/organizations/organization/organization.component.html +++ b/src/app/organizations/organization/organization.component.html @@ -33,7 +33,7 @@ -
    Organization not found
    +
    Organization not found
    diff --git a/src/app/shared/auth.guard.ts b/src/app/shared/auth.guard.ts index 9d61feb9ea..cb63fd9783 100644 --- a/src/app/shared/auth.guard.ts +++ b/src/app/shared/auth.guard.ts @@ -15,7 +15,7 @@ */ import { Injectable } from '@angular/core'; -import { ActivatedRouteSnapshot, CanActivate, Router, RouterStateSnapshot } from '@angular/router'; +import { ActivatedRouteSnapshot, Router, RouterStateSnapshot } from '@angular/router'; import { of } from 'rxjs/internal/observable/of'; import { catchError, map } from 'rxjs/operators'; import { AuthService } from '../ng2-ui-auth/public_api'; @@ -23,7 +23,7 @@ import { LogoutService } from './logout.service'; import { UsersService } from './openapi'; @Injectable() -export class AuthGuard implements CanActivate { +export class AuthGuard { constructor( private auth: AuthService, private router: Router, diff --git a/src/app/shared/entry.ts b/src/app/shared/entry.ts index fc2bf80b3e..1d1d105454 100644 --- a/src/app/shared/entry.ts +++ b/src/app/shared/entry.ts @@ -21,7 +21,7 @@ import { MatLegacyChipInputEvent as MatChipInputEvent } from '@angular/material/ import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabGroup as MatTabGroup } from '@angular/material/legacy-tabs'; import { ActivatedRoute, NavigationEnd, Params, Router, RouterEvent } from '@angular/router'; import { Observable, Subject } from 'rxjs'; -import { filter, takeUntil } from 'rxjs/operators'; +import { filter, map, takeUntil } from 'rxjs/operators'; import { EntryCategoriesService } from '../categories/state/entry-categories.service'; import { Dockstore } from '../shared/dockstore.model'; import { Category, EntriesService, VersionVerifiedPlatform, SourceFile } from '../shared/openapi'; @@ -98,6 +98,7 @@ export abstract class Entry implements OnDestro this.router.events .pipe( filter((event) => event instanceof NavigationEnd), + map((event) => event as NavigationEnd), takeUntil(this.ngUnsubscribe) ) .subscribe((event: RouterEvent) => { diff --git a/src/main.ts b/src/main.ts index 886e097f86..7806cf61e1 100644 --- a/src/main.ts +++ b/src/main.ts @@ -40,6 +40,7 @@ import { Ng2UiAuthModule } from './app/ng2-ui-auth/public_api'; import { OrganizationStargazersModule } from './app/organizations/organization/organization-stargazers/organization-stargazers.module'; import { OrganizationStarringModule } from './app/organizations/organization/organization-starring/organization-starring.module'; import { RegisterService } from './app/register/register.service'; +import { QueryBuilderService } from './app/search/query-builder.service'; import { SearchAuthorsHtmlPipe } from './app/search/search-authors-html.pipe'; import { SearchService } from './app/search/state/search.service'; import { ServiceInfoService } from './app/service-info/service-info.service'; @@ -141,6 +142,7 @@ bootstrapApplication(AppComponent, { PagenumberService, ParamfilesService, ProviderService, + QueryBuilderService, RefreshService, RegisterCheckerWorkflowService, RegisterService, From 8a80e7ab2ac2efb98dd6bbad8d1b947b03a46395 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Fri, 19 Jul 2024 09:22:58 -0700 Subject: [PATCH 59/98] adjust UI code for new "state" SourceFile property https://ucsc-cgl.atlassian.net/browse/SEAB-6488 --- cypress/e2e/group2/notebooks.ts | 1 + .../tool-file-editor.component.spec.ts | 1 + src/app/file-tree/file-tree.component.spec.ts | 4 +- src/app/notebook/notebook.component.html | 2 +- src/app/notebook/notebook.component.spec.ts | 14 ++- src/app/notebook/notebook.component.ts | 56 ++++++++---- .../code-editor-list.service.spec.ts | 88 ++++++++++++++++--- .../code-editor-list.service.ts | 1 + src/app/test/mocked-objects.ts | 16 ++++ .../workflow-file-editor.component.spec.ts | 1 + test/github_app_tool_db_dump.sql | 24 ++--- test/github_notebook_db_dump.sql | 6 +- 12 files changed, 164 insertions(+), 50 deletions(-) diff --git a/cypress/e2e/group2/notebooks.ts b/cypress/e2e/group2/notebooks.ts index ed05a74998..7792823c52 100644 --- a/cypress/e2e/group2/notebooks.ts +++ b/cypress/e2e/group2/notebooks.ts @@ -190,6 +190,7 @@ describe('Dockstore notebooks', () => { { path: '/notebook.ipynb', content: '{ "nbformat_major": 4, "nbformat_minor": 0, "cells": [' + cells.join(',') + '] }', + state: 'COMPLETE', }, ]); } diff --git a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts index 33bb8c9835..919f706777 100644 --- a/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts +++ b/src/app/container/tool-file-editor/tool-file-editor.component.spec.ts @@ -86,6 +86,7 @@ describe('ToolFileEditorComponent', () => { path: 'foo.cwl', type: 'DOCKSTORE_CWL', content: content, + state: SourceFile.StateEnum.COMPLETE, }; component.originalSourceFiles = [sourceFile]; component.resetFiles(); diff --git a/src/app/file-tree/file-tree.component.spec.ts b/src/app/file-tree/file-tree.component.spec.ts index 8a2a128887..39dfdcf9b2 100644 --- a/src/app/file-tree/file-tree.component.spec.ts +++ b/src/app/file-tree/file-tree.component.spec.ts @@ -60,8 +60,8 @@ describe('FileTreeComponent', () => { let expectedNodes = []; expect(component.convertSourceFilesToTree(sourcefiles)).toEqual(expectedNodes); sourcefiles = [ - { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL }, - { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL }, + { absolutePath: '/folder1/file1', path: 'file1', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE }, + { absolutePath: '/folder1/file2', path: 'file2', type: SourceFile.TypeEnum.DOCKSTOREWDL, state: SourceFile.StateEnum.COMPLETE }, ]; expectedNodes = [ Object({ diff --git a/src/app/notebook/notebook.component.html b/src/app/notebook/notebook.component.html index 4ecd378f5a..55e6089cfd 100644 --- a/src/app/notebook/notebook.component.html +++ b/src/app/notebook/notebook.component.html @@ -1,6 +1,6 @@ -
    The notebook could not be displayed.
    +
    {{ error }}
    diff --git a/src/app/notebook/notebook.component.spec.ts b/src/app/notebook/notebook.component.spec.ts index d13a5eaef1..3b78c38fd0 100644 --- a/src/app/notebook/notebook.component.spec.ts +++ b/src/app/notebook/notebook.component.spec.ts @@ -64,7 +64,7 @@ describe('NotebookComponent', () => { } function makeSourceFile(content: string, path: string, type: SourceFile.TypeEnum = SourceFile.TypeEnum.DOCKSTOREJUPYTER): SourceFile { - return { content: content, path: path, type: type } as SourceFile; + return { content: content, path: path, type: type, state: SourceFile.StateEnum.COMPLETE } as SourceFile; } function makeWorkflow(language: string): Workflow { @@ -97,14 +97,14 @@ describe('NotebookComponent', () => { function confirmSuccess() { const element: HTMLElement = fixture.nativeElement; - expect(notebookComponent.error).toBeFalse(); + expect(notebookComponent.error).toBeNull(); expect(element.querySelectorAll('.notebook').length).toBe(1); expect(element.textContent).not.toContain('The notebook could not be displayed.'); } function confirmError() { const element: HTMLElement = fixture.nativeElement; - expect(notebookComponent.error).toBeTrue(); + expect(notebookComponent.error).not.toEqual(null); expect(element.querySelectorAll('.notebook').length).toBe(0); expect(element.textContent).toContain('The notebook could not be displayed.'); } @@ -192,4 +192,12 @@ describe('NotebookComponent', () => { expect(element.querySelector('.source').textContent).toContain('some input'); expect(element.querySelector('.output').textContent).toContain('some html'); }); + + it('should display the message from a NOT_STORED notebook', () => { + const sourceFile = makeSourceFile('could not store', '/main.ipynb'); + sourceFile.state = SourceFile.StateEnum.NOTSTORED; + formatEntities([sourceFile], makeWorkflow('Python'), makeVersion('/main.ipynb'), ''); + confirmError(); + expect(element.textContent).toContain('could not store'); + }); }); diff --git a/src/app/notebook/notebook.component.ts b/src/app/notebook/notebook.component.ts index f908cfea20..a933aa741f 100644 --- a/src/app/notebook/notebook.component.ts +++ b/src/app/notebook/notebook.component.ts @@ -16,6 +16,8 @@ import { NgIf, NgFor } from '@angular/common'; * https://nbformat.readthedocs.io/en/latest/ */ +const ERROR_MESSAGE = 'The notebook could not be displayed.'; + @Component({ selector: 'app-notebook', templateUrl: './notebook.component.html', @@ -35,7 +37,7 @@ export class NotebookComponent implements OnChanges { @Input() version: WorkflowVersion; @Input() baseUrl: string; loading: boolean = true; - error: boolean = false; + error: string | null = null; cells: Cell[] = []; private currentSubscription: Subscription = null; @@ -45,7 +47,7 @@ export class NotebookComponent implements OnChanges { retrieveAndFormatNotebook() { this.loading = true; - this.error = false; + this.error = null; this.cells = []; // The next line cancels any previous request that is still in progress, // because if we're here, the @Inputs have changed, and we're about to @@ -73,34 +75,50 @@ export class NotebookComponent implements OnChanges { (sourceFiles: SourceFile[]) => { for (const sourceFile of sourceFiles) { if (this.isPrimaryDescriptor(sourceFile.path)) { - try { - // Parse the JSON content of the notebook file. - const json = JSON.parse(sourceFile.content); - // Find the cells and, if necessary, convert them to a representation that approximates nbformat 4. - const cells = json?.nbformat < 4 ? this.cellsToNbformat4(json?.worksheets[0]?.cells) : json?.cells; - // If the `cells` property is an array, filter spam and "pass" the cells to the template. - if (this.isArray(cells)) { - this.cells = this.filterSpam(cells); - this.error = false; - return; - } - } catch (e) { - console.log('Exception formatting notebook:'); - console.log(e.message); + if (sourceFile.state === 'COMPLETE') { + this.formatNotebook(sourceFile.content); + } else { + this.error = this.incompleteSourceFileErrorMessage(sourceFile); } - this.error = true; return; } } - this.error = true; + this.error = ERROR_MESSAGE; }, // Failure. () => { - this.error = true; + this.error = ERROR_MESSAGE; } ); } + formatNotebook(content: string): void { + try { + // Parse the JSON content of the notebook file. + const json = JSON.parse(content); + // Find the cells and, if necessary, convert them to a representation that approximates nbformat 4. + const cells = json?.nbformat < 4 ? this.cellsToNbformat4(json?.worksheets[0]?.cells) : json?.cells; + // If the `cells` property is an array, filter spam, "pass" the cells to the template, and return. + if (this.isArray(cells)) { + this.cells = this.filterSpam(cells); + this.error = null; + return; + } + } catch (e) { + console.log('Exception formatting notebook:'); + console.log(e.message); + } + this.error = ERROR_MESSAGE; + } + + incompleteSourceFileErrorMessage(file: SourceFile): string { + var message = ERROR_MESSAGE; + if (file.state === 'NOT_STORED') { + message = message + ' ' + file.content; + } + return message; + } + isPrimaryDescriptor(path: string): boolean { return path === this.version.workflow_path; } diff --git a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts index 60ddaf7372..d992f83abd 100644 --- a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts +++ b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts @@ -33,37 +33,83 @@ describe('CodeEditorListService', () => { it('should be able to determine files to add', () => { const service: CodeEditorListService = TestBed.inject(CodeEditorListService); // Brand new hosted workflow with no descriptors - const primarySMKFile = { content: '', absolutePath: '/Snakefile', path: '/Snakefile', type: SourceFile.TypeEnum.DOCKSTORESMK }; - const secondarySMKFile = { content: '', absolutePath: '/.smk', path: '/.smk', type: SourceFile.TypeEnum.DOCKSTORESMK }; + const primarySMKFile = { + content: '', + absolutePath: '/Snakefile', + path: '/Snakefile', + type: SourceFile.TypeEnum.DOCKSTORESMK, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondarySMKFile = { + content: '', + absolutePath: '/.smk', + path: '/.smk', + type: SourceFile.TypeEnum.DOCKSTORESMK, + state: SourceFile.StateEnum.COMPLETE, + }; const primaryCWLFile: SourceFile = { content: '', absolutePath: '/Dockstore.cwl', path: '/Dockstore.cwl', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryCWLFile = { + content: '', + absolutePath: '/.cwl', + path: '/.cwl', + type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, + }; + const primaryWDLFile = { + content: '', + absolutePath: '/Dockstore.wdl', + path: '/Dockstore.wdl', + type: SourceFile.TypeEnum.DOCKSTOREWDL, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryWDLFile = { + content: '', + absolutePath: '/.wdl', + path: '/.wdl', + type: SourceFile.TypeEnum.DOCKSTOREWDL, + state: SourceFile.StateEnum.COMPLETE, + }; + const firstPrimaryNFLFile = { + content: '', + absolutePath: '/main.nf', + path: '/main.nf', + type: SourceFile.TypeEnum.NEXTFLOW, + state: SourceFile.StateEnum.COMPLETE, }; - const secondaryCWLFile = { content: '', absolutePath: '/.cwl', path: '/.cwl', type: SourceFile.TypeEnum.DOCKSTORECWL }; - const primaryWDLFile = { content: '', absolutePath: '/Dockstore.wdl', path: '/Dockstore.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL }; - const secondaryWDLFile = { content: '', absolutePath: '/.wdl', path: '/.wdl', type: SourceFile.TypeEnum.DOCKSTOREWDL }; - const firstPrimaryNFLFile = { content: '', absolutePath: '/main.nf', path: '/main.nf', type: SourceFile.TypeEnum.NEXTFLOW }; const secondPrimaryNFLFile = { content: '', absolutePath: '/nextflow.config', path: '/nextflow.config', type: SourceFile.TypeEnum.NEXTFLOWCONFIG, + state: SourceFile.StateEnum.COMPLETE, + }; + const secondaryNFLFile = { + content: '', + absolutePath: '/.nf', + path: '/.nf', + type: SourceFile.TypeEnum.NEXTFLOW, + state: SourceFile.StateEnum.COMPLETE, }; - const secondaryNFLFile = { content: '', absolutePath: '/.nf', path: '/.nf', type: SourceFile.TypeEnum.NEXTFLOW }; const primaryNFLFiles = [firstPrimaryNFLFile, secondPrimaryNFLFile]; const primaryGalaxyFile = { content: '', absolutePath: '/workflow-name.yml', path: '/workflow-name.yml', type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2, + state: SourceFile.StateEnum.COMPLETE, }; const secondaryGalaxyFile = { content: '', absolutePath: '/.yml', path: '/.yml', type: SourceFile.TypeEnum.DOCKSTOREGXFORMAT2, + state: SourceFile.StateEnum.COMPLETE, }; expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'descriptor', [])).toEqual([primarySMKFile]); expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.CWL, 'descriptor', [])).toEqual([primaryCWLFile]); @@ -71,27 +117,48 @@ describe('CodeEditorListService', () => { expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.NFL, 'descriptor', [])).toEqual(primaryNFLFiles); expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.GALAXY, 'descriptor', [])).toEqual([primaryGalaxyFile]); - const testSMKFile = { content: '', absolutePath: '/test.smk.json', path: '/test.smk.json', type: SourceFile.TypeEnum.SMKTESTPARAMS }; - const testCWLFile = { content: '', absolutePath: '/test.cwl.json', path: '/test.cwl.json', type: SourceFile.TypeEnum.CWLTESTJSON }; - const testWDLFile = { content: '', absolutePath: '/test.wdl.json', path: '/test.wdl.json', type: SourceFile.TypeEnum.WDLTESTJSON }; + const testSMKFile = { + content: '', + absolutePath: '/test.smk.json', + path: '/test.smk.json', + type: SourceFile.TypeEnum.SMKTESTPARAMS, + state: SourceFile.StateEnum.COMPLETE, + }; + const testCWLFile = { + content: '', + absolutePath: '/test.cwl.json', + path: '/test.cwl.json', + type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, + }; + const testWDLFile = { + content: '', + absolutePath: '/test.wdl.json', + path: '/test.wdl.json', + type: SourceFile.TypeEnum.WDLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, + }; // Weird because NFL doesn't have test parameter files const testNFLFile = { content: '', absolutePath: '/test.nfl.json', path: '/test.nfl.json', type: SourceFile.TypeEnum.NEXTFLOWTESTPARAMS, + state: SourceFile.StateEnum.COMPLETE, }; const testGalaxyFile = { content: '', absolutePath: '/test.galaxy.json', path: '/test.galaxy.json', type: SourceFile.TypeEnum.GXFORMAT2TESTFILE, + state: SourceFile.StateEnum.COMPLETE, }; const testDockerFile = { content: '', absolutePath: '/Dockerfile', path: '/Dockerfile', type: SourceFile.TypeEnum.DOCKERFILE, + state: SourceFile.StateEnum.COMPLETE, }; // Brand new hosted workflow with no test parameter file expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SMK, 'testParam', [])).toEqual([testSMKFile]); @@ -125,6 +192,7 @@ describe('CodeEditorListService', () => { absolutePath: '/.dockstore.yml', path: '/.dockstore.yml', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, }; expect(service.determineFilesToAdd(ToolDescriptor.TypeEnum.SERVICE, 'descriptor', [])).toEqual([weirdServiceFile]); }); diff --git a/src/app/shared/code-editor-list/code-editor-list.service.ts b/src/app/shared/code-editor-list/code-editor-list.service.ts index 77cf093ec2..34aabd1e99 100644 --- a/src/app/shared/code-editor-list/code-editor-list.service.ts +++ b/src/app/shared/code-editor-list/code-editor-list.service.ts @@ -201,6 +201,7 @@ export class CodeEditorListService { content: '', path: newFilePath, type: type, + state: 'COMPLETE', }; } else { return null; diff --git a/src/app/test/mocked-objects.ts b/src/app/test/mocked-objects.ts index 992c7fac6b..1caa786670 100644 --- a/src/app/test/mocked-objects.ts +++ b/src/app/test/mocked-objects.ts @@ -359,6 +359,7 @@ export const wdlSourceFile: SourceFile = { path: '', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const emptyWdlSourceFile: SourceFile = { @@ -367,6 +368,7 @@ export const emptyWdlSourceFile: SourceFile = { path: '/foo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const wdlSourceFileWithHttpImport: SourceFile = { @@ -375,6 +377,7 @@ export const wdlSourceFileWithHttpImport: SourceFile = { path: '/goo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; export const wdlSourceFileWithCommentedHttpImport: SourceFile = { @@ -383,6 +386,7 @@ export const wdlSourceFileWithCommentedHttpImport: SourceFile = { path: '/goo.wdl', absolutePath: '', type: 'DOCKSTORE_WDL', + state: SourceFile.StateEnum.COMPLETE, }; const cwlWithNoImport = `#!/usr/bin/env cwl-runner @@ -492,6 +496,7 @@ export const cwlSourceFileWithNoImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithHttpsImport: SourceFile = { @@ -500,6 +505,7 @@ export const cwlSourceFileWithHttpsImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithMixinImport: SourceFile = { @@ -508,6 +514,7 @@ export const cwlSourceFileWithMixinImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithCommentedMixinImport: SourceFile = { @@ -516,6 +523,7 @@ export const cwlSourceFileWithCommentedMixinImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithIncludeImport: SourceFile = { @@ -524,6 +532,7 @@ export const cwlSourceFileWithIncludeImport: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithSomeHttpLinks: SourceFile = { @@ -532,6 +541,7 @@ export const cwlSourceFileWithSomeHttpLinks: SourceFile = { path: '/fubar.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const cwlSourceFileWithHttpRun: SourceFile = { @@ -540,6 +550,7 @@ export const cwlSourceFileWithHttpRun: SourceFile = { path: '/checker.cwl', absolutePath: '', type: 'DOCKSTORE_CWL', + state: SourceFile.StateEnum.COMPLETE, }; export const sampleSourceFile: SourceFile = { @@ -548,6 +559,7 @@ export const sampleSourceFile: SourceFile = { path: '/cwl.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, }; export const versionVerifiedPlatform: Array = [ @@ -576,6 +588,7 @@ export const testSourceFiles: Array = [ path: '/Dockerfile', absolutePath: '', type: SourceFile.TypeEnum.DOCKERFILE, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: {}, }, { @@ -584,6 +597,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore-BTCA-SG.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: { 'Dockstore CLI': { metadata: 'Docktesters group', @@ -598,6 +612,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore.cwl', absolutePath: '', type: SourceFile.TypeEnum.DOCKSTORECWL, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: {}, }, { @@ -606,6 +621,7 @@ export const testSourceFiles: Array = [ path: '/Dockstore.json', absolutePath: '', type: SourceFile.TypeEnum.CWLTESTJSON, + state: SourceFile.StateEnum.COMPLETE, verifiedBySource: { 'Dockstore CLI': { metadata: 'Docktesters group', diff --git a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts index 8b16a4f45c..6e32521d08 100644 --- a/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts +++ b/src/app/workflow/workflow-file-editor/workflow-file-editor.component.spec.ts @@ -84,6 +84,7 @@ describe('WorkflowFileEditorComponent', () => { path: 'foo.cwl', type: 'DOCKSTORE_CWL', content: content, + state: 'COMPLETE', }; component.originalSourceFiles = [sourceFile]; component.resetFiles(); diff --git a/test/github_app_tool_db_dump.sql b/test/github_app_tool_db_dump.sql index 6f01320b09..4d374496ad 100644 --- a/test/github_app_tool_db_dump.sql +++ b/test/github_app_tool_db_dump.sql @@ -1,4 +1,4 @@ -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (50, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (50, '#!/usr/bin/env cwl-runner class: Workflow id: Md5sum @@ -43,9 +43,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 10:04:44.460000', '2022-01-14 10:04:44.460000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 10:04:44.460000', '2022-01-14 10:04:44.460000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (51, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (51, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -53,10 +53,10 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (54, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (54, '#!/usr/bin/env cwl-runner class: CommandLineTool id: Md5sum @@ -101,9 +101,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (55, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (55, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -111,9 +111,9 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (56, '#!/usr/bin/env cwl-runner +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (56, '#!/usr/bin/env cwl-runner class: CommandLineTool id: Md5sum @@ -158,9 +158,9 @@ outputs: glob: md5sum.txt doc: A text file that contains a single line that is the md5sum of the input file. baseCommand: [/bin/my_md5sum] -', 'DOCKSTORE_CWL', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); +', 'DOCKSTORE_CWL', 'COMPLETE', '/tools/Dockstore.cwl', '2022-01-14 09:13:37.403000', '2022-01-14 09:13:37.403000', '/tools/Dockstore.cwl', false); -INSERT INTO public.sourcefile (id, content, type, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (57, 'version: 1.2 +INSERT INTO public.sourcefile (id, content, type, state, path, dbcreatedate, dbupdatedate, absolutepath, frozen) VALUES (57, 'version: 1.2 tools: - subclass: cwl primaryDescriptorPath: /tools/Dockstore.cwl @@ -168,7 +168,7 @@ tools: workflows: - subclass: cwl primaryDescriptorPath: /workflows/HelloWorld.cwl -', 'DOCKSTORE_YML', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); +', 'DOCKSTORE_YML', 'COMPLETE', '/.dockstore.yml', '2022-01-14 10:04:44.458000', '2022-01-14 10:04:44.458000', '/.dockstore.yml', false); INSERT INTO public.apptool (id, conceptdoi, dbcreatedate, dbupdatedate, description, giturl, ispublished, lastmodified, lastupdated, licensename, topicid, checkerid, descriptortype, descriptortypesubclass, forumurl, mode, organization, repository, sourcecontrol, workflowname, actualdefaultversion, topicautomatic, topicmanual, topicselection, waseverpublic) VALUES (50, null, '2022-01-12 14:51:23.656000', '2022-01-12 14:51:23.689000', null, 'git@github.com:C/github-app-tools.git', true, '2022-01-12 14:48:20.000000', '2022-01-12 14:51:22.707000', null, null, null, 'cwl', 'n/a', null, 'DOCKSTORE_YML', 'C', 'test-github-app-tools', 'github.com', 'testing', null, null, null, 'AUTOMATIC', true); INSERT INTO public.apptool (id, conceptdoi, dbcreatedate, dbupdatedate, description, giturl, ispublished, lastmodified, lastupdated, licensename, topicid, checkerid, descriptortype, descriptortypesubclass, forumurl, mode, organization, repository, sourcecontrol, workflowname, actualdefaultversion, topicautomatic, topicmanual, topicselection, waseverpublic) VALUES (51, null, '2022-01-12 14:45:55.370000', '2022-01-14 10:05:15.491000', 'test description...', 'git@github.com:C/github-app-tools.git', false, '2022-01-14 09:13:50.000000', '2022-01-12 14:45:54.113000', null, null, null, 'cwl', 'n/a', null, 'DOCKSTORE_YML', 'C', 'test-github-app-tools', 'github.com', 'md5sum', null, null, null, 'AUTOMATIC', true); diff --git a/test/github_notebook_db_dump.sql b/test/github_notebook_db_dump.sql index 67629afaf7..c58c984819 100644 --- a/test/github_notebook_db_dump.sql +++ b/test/github_notebook_db_dump.sql @@ -39,9 +39,9 @@ COPY public.notebook (id, conceptdoi, dbcreatedate, dbupdatedate, description, g -- Data for Name: sourcefile; Type: TABLE DATA; Schema: public; Owner: dockstore -- -COPY public.sourcefile (id, content, path, type, dbcreatedate, dbupdatedate, absolutepath, frozen) FROM stdin; -1000 version: 1.2\nnotebooks:\n - path: /notebook.ipynb\n publish: true\n /.dockstore.yml DOCKSTORE_YML 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /.dockstore.yml f -1001 {\n "nbformat": 4,\n "nbformat_minor": 0,\n "metadata": {\n "colab": {\n "provenance": [],\n "authorship_tag": "ABX9TyOvihAxHYcHRNfCqilp5Zgg",\n "include_colab_link": true\n },\n "kernelspec": {\n "name": "python3",\n "display_name": "Python 3"\n },\n "language_info": {\n "name": "python"\n },\n "authors": [\n { "name": "Author Two" },\n { "name": "Author One" }\n ]\n },\n "cells": [\n {\n "cell_type": "markdown",\n "source": [\n "A simple notebook."\n ],\n "metadata": {\n "id": "PSOLAGuMMaYg"\n }\n },\n {\n "cell_type": "code",\n "execution_count": null,\n "metadata": {\n "colab": {\n "base_uri": "https://localhost:8080/"\n },\n "id": "z9GVmXMWFnWV",\n "outputId": "f33dda6a-d0fd-40ee-de84-e726fafab5b9"\n },\n "outputs": [\n {\n "output_type": "stream",\n "name": "stdout",\n "text": [\n "Hello world!\\n"\n ]\n }\n ],\n "source": [\n "print(\\"Hello world!\\")"\n ]\n }\n ]\n}\n /notebook.ipynb DOCKSTORE_JUPYTER 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /notebook.ipynb f +COPY public.sourcefile (id, content, path, type, state, dbcreatedate, dbupdatedate, absolutepath, frozen) FROM stdin; +1000 version: 1.2\nnotebooks:\n - path: /notebook.ipynb\n publish: true\n /.dockstore.yml DOCKSTORE_YML COMPLETE 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /.dockstore.yml f +1001 {\n "nbformat": 4,\n "nbformat_minor": 0,\n "metadata": {\n "colab": {\n "provenance": [],\n "authorship_tag": "ABX9TyOvihAxHYcHRNfCqilp5Zgg",\n "include_colab_link": true\n },\n "kernelspec": {\n "name": "python3",\n "display_name": "Python 3"\n },\n "language_info": {\n "name": "python"\n },\n "authors": [\n { "name": "Author Two" },\n { "name": "Author One" }\n ]\n },\n "cells": [\n {\n "cell_type": "markdown",\n "source": [\n "A simple notebook."\n ],\n "metadata": {\n "id": "PSOLAGuMMaYg"\n }\n },\n {\n "cell_type": "code",\n "execution_count": null,\n "metadata": {\n "colab": {\n "base_uri": "https://localhost:8080/"\n },\n "id": "z9GVmXMWFnWV",\n "outputId": "f33dda6a-d0fd-40ee-de84-e726fafab5b9"\n },\n "outputs": [\n {\n "output_type": "stream",\n "name": "stdout",\n "text": [\n "Hello world!\\n"\n ]\n }\n ],\n "source": [\n "print(\\"Hello world!\\")"\n ]\n }\n ]\n}\n /notebook.ipynb DOCKSTORE_JUPYTER COMPLETE 2023-03-16 16:38:14.982 2023-03-16 16:38:14.982 /notebook.ipynb f \. -- From 1fbda82dd92ec26ee863ca3eb3a96eabf8ce3247 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 19 Jul 2024 09:23:51 -0700 Subject: [PATCH 60/98] Bump socket.io from 4.6.1 to 4.7.5 (#1992) Bumps [socket.io](https://github.com/socketio/socket.io) from 4.6.1 to 4.7.5. - [Release notes](https://github.com/socketio/socket.io/releases) - [Changelog](https://github.com/socketio/socket.io/blob/4.7.5/CHANGELOG.md) - [Commits](https://github.com/socketio/socket.io/compare/4.6.1...4.7.5) --- updated-dependencies: - dependency-name: socket.io dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 124 +++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 46 deletions(-) diff --git a/package-lock.json b/package-lock.json index 45abda5ba1..956e9acb9a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -6689,9 +6689,9 @@ } }, "node_modules/@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "node_modules/@tootallnate/once": { @@ -6818,9 +6818,9 @@ "dev": true }, "node_modules/@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "dependencies": { "@types/node": "*" @@ -11867,9 +11867,9 @@ } }, "node_modules/engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -11880,22 +11880,43 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true, "engines": { "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.17.0", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", @@ -21284,20 +21305,21 @@ } }, "node_modules/socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "dependencies": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" }, "engines": { - "node": ">=10.0.0" + "node": ">=10.2.0" } }, "node_modules/socket.io-adapter": { @@ -21310,9 +21332,9 @@ } }, "node_modules/socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "dependencies": { "@socket.io/component-emitter": "~3.1.0", @@ -29504,9 +29526,9 @@ } }, "@socket.io/component-emitter": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz", - "integrity": "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", + "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", "dev": true }, "@tootallnate/once": { @@ -29620,9 +29642,9 @@ "dev": true }, "@types/cors": { - "version": "2.8.13", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.13.tgz", - "integrity": "sha512-RG8AStHlUiV5ysZQKq97copd2UmVYw3/pRMLefISZ3S1hK104Cwm7iLQ3fTKx+lsUH2CE8FlLaYeEA2LSeqYUA==", + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", "dev": true, "requires": { "@types/node": "*" @@ -33595,9 +33617,9 @@ } }, "engine.io": { - "version": "6.4.2", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.4.2.tgz", - "integrity": "sha512-FKn/3oMiJjrOEOeUub2WCox6JhxBXq/Zn3fZOMCBxKnNYtsdKjxhl7yR3fZhM9PV+rdE75SU5SYMc+2PGzo+Tg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -33608,14 +33630,23 @@ "cookie": "~0.4.1", "cors": "~2.8.5", "debug": "~4.3.1", - "engine.io-parser": "~5.0.3", - "ws": "~8.11.0" + "engine.io-parser": "~5.2.1", + "ws": "~8.17.1" + }, + "dependencies": { + "ws": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "dev": true, + "requires": {} + } } }, "engine.io-parser": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.0.6.tgz", - "integrity": "sha512-tjuoZDMAdEhVnSFleYPCtdL2GXwVTGtNjoeJd9IhIG3C1xs9uwxqRNEu5WpnDZCaozwVlK/nuQhpodhXSIMaxw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true }, "enhanced-resolve": { @@ -40860,17 +40891,18 @@ } }, "socket.io": { - "version": "4.6.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.6.1.tgz", - "integrity": "sha512-KMcaAi4l/8+xEjkRICl6ak8ySoxsYG+gG6/XfRCPJPQ/haCRIJBTL4wIl8YCsmtaBovcAXGLOShyVWQ/FG8GZA==", + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", "dev": true, "requires": { "accepts": "~1.3.4", "base64id": "~2.0.0", + "cors": "~2.8.5", "debug": "~4.3.2", - "engine.io": "~6.4.1", + "engine.io": "~6.5.2", "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.1" + "socket.io-parser": "~4.2.4" } }, "socket.io-adapter": { @@ -40883,9 +40915,9 @@ } }, "socket.io-parser": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.3.tgz", - "integrity": "sha512-JMafRntWVO2DCJimKsRTh/wnqVvO4hrfwOqtO7f+uzwsQMuxO6VwImtYxaQ+ieoyshWOTJyV0fA21lccEXRPpQ==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", + "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", "dev": true, "requires": { "@socket.io/component-emitter": "~3.1.0", From 9806a19d1a96b2aa62b227afc1d4b03fec7e1b02 Mon Sep 17 00:00:00 2001 From: Nayeon Hyun <61166764+hyunnaye@users.noreply.github.com> Date: Wed, 24 Jul 2024 14:05:33 -0400 Subject: [PATCH 61/98] SEAB-838: noUnusedLocals set to true (#1974) * noUnusedLocals * fix * fix * merge fixes * delete test * fix unit test errors * oops --- cypress/e2e/group3/archival.ts | 2 +- cypress/e2e/immutableDatabaseTests/app-spec.ts | 16 ---------------- .../e2e/smokeTests/sharedTests/basic-enduser.ts | 1 - scripts/generate-openapi-script.sh | 5 +++++ src/app/aliases/aliases.component.ts | 2 +- src/app/aliases/state/aliases.service.ts | 2 -- src/app/configuration.service.ts | 7 +------ .../current-collections.component.ts | 2 +- src/app/file-tree/file-tree.component.spec.ts | 1 - .../getting-started.component.spec.ts | 4 ++-- .../downloadcliclient.component.ts | 2 +- src/app/navbar/navbar.component.ts | 3 --- .../ng2-ui-auth/lib/browser-storage.service.ts | 2 +- src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts | 2 +- src/app/ng2-ui-auth/lib/utils.ts | 2 -- .../state/notifications.service.spec.ts | 2 -- .../collections/collections.component.ts | 1 - .../create-collection.component.ts | 1 - .../remove-collection.component.ts | 2 +- .../organization-starring.component.spec.ts | 1 - .../update-organization-description.component.ts | 2 +- .../organizations/state/organization.service.ts | 2 -- .../basic-search/basic-search.component.ts | 3 +-- .../search-results/search-results.component.ts | 2 -- src/app/search/search.routing.ts | 2 +- src/app/search/state/search.query.ts | 3 +-- .../code-editor-list.service.spec.ts | 7 ------- src/app/shared/constants.ts | 6 ------ .../edit-topic-dialog.component.spec.ts | 2 +- src/app/shared/entry/recent-events.pipe.spec.ts | 1 - src/app/shared/entry/recent-events.pipe.ts | 2 -- src/app/shared/file.service.ts | 3 +-- src/app/shared/session/session.query.ts | 3 +-- src/app/shared/user/user.service.ts | 2 -- src/app/shared/view.ts | 4 ++-- .../starredentries/starredentries.component.ts | 2 +- src/app/test/router-stubs.ts | 1 - src/app/user-page/user-page.component.ts | 3 +-- src/app/workflow/info-tab/info-tab.component.ts | 2 +- .../launch-third-party.component.ts | 3 +-- src/app/workflow/launch/launch.component.ts | 4 ++-- .../snaphot-exporter-modal.component.spec.ts | 2 -- src/app/workflow/view/view.component.ts | 2 +- src/app/workflows/apptools/apptools.routing.ts | 2 +- src/main.ts | 1 - tsconfig.json | 1 + 46 files changed, 33 insertions(+), 94 deletions(-) diff --git a/cypress/e2e/group3/archival.ts b/cypress/e2e/group3/archival.ts index 6b76713e31..758822c332 100644 --- a/cypress/e2e/group3/archival.ts +++ b/cypress/e2e/group3/archival.ts @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { resetDB, setTokenUserViewPort, insertNotebooks, insertAppTools, invokeSql, goToTab } from '../../support/commands'; +import { resetDB, setTokenUserViewPort, insertNotebooks, insertAppTools, invokeSql } from '../../support/commands'; describe('Entry Archival', () => { resetDB(); diff --git a/cypress/e2e/immutableDatabaseTests/app-spec.ts b/cypress/e2e/immutableDatabaseTests/app-spec.ts index 646c9eb37c..813091625c 100644 --- a/cypress/e2e/immutableDatabaseTests/app-spec.ts +++ b/cypress/e2e/immutableDatabaseTests/app-spec.ts @@ -31,22 +31,6 @@ describe('Logged in Dockstore Home', () => { cy.scrollTo('bottom'); cy.get('[data-cy=mt-toot]').should('be.visible'); }); - - function starColumn(url: string, type: string) { - if (type === 'workflow') { - cy.get('[data-cy=workflows-tab]').click(); - } - cy.get('.mat-icon.star-icon').should('not.exist'); - cy.visit(url); - cy.get('#starringButton').click(); - cy.visit(''); - if (type === 'workflow') { - cy.get('[data-cy=workflows-tab]').click(); - } - cy.get('.mat-icon.star-icon').should('exist'); - cy.visit(url); - cy.get('#starringButton').click(); - } }); describe('Logged out Dockstore Home', () => { diff --git a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts index 1a025226b7..5bc017f7a7 100644 --- a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts +++ b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts @@ -85,7 +85,6 @@ function isStagingOrProd() { return baseUrl === 'https://staging.dockstore.org' || baseUrl === 'https://dockstore.org'; } -const organizations = [['Broad Institute']]; describe('Check organizations page', () => { it('has multiple organizations and org with content', () => { cy.visit('/'); diff --git a/scripts/generate-openapi-script.sh b/scripts/generate-openapi-script.sh index 786a383e64..14cb4df892 100755 --- a/scripts/generate-openapi-script.sh +++ b/scripts/generate-openapi-script.sh @@ -25,4 +25,9 @@ else fi java -jar openapi-generator-cli.jar generate -i "${OPENAPI_PATH}" -g typescript-angular -o src/app/shared/openapi -c swagger-config.json --skip-validate-spec + +for file in src/app/shared/openapi/*.ts src/app/shared/openapi/**/*.ts; do + echo "//@ts-nocheck" | cat - $file >> tmpFile && mv tmpFile $file +done + rm openapi-generator-cli.jar diff --git a/src/app/aliases/aliases.component.ts b/src/app/aliases/aliases.component.ts index 0675341b0b..74c8f3be10 100644 --- a/src/app/aliases/aliases.component.ts +++ b/src/app/aliases/aliases.component.ts @@ -1,6 +1,6 @@ import { Component, OnInit } from '@angular/core'; import { Observable } from 'rxjs'; -import { map, takeUntil } from 'rxjs/operators'; +import { takeUntil } from 'rxjs/operators'; import { Base } from '../shared/base'; import { Collection, DockstoreTool, Entry, Organization, Workflow, WorkflowVersionPathInfo } from '../shared/openapi'; import { ActivatedRoute, Router } from '../test'; diff --git a/src/app/aliases/state/aliases.service.ts b/src/app/aliases/state/aliases.service.ts index feb555f540..24d981c030 100644 --- a/src/app/aliases/state/aliases.service.ts +++ b/src/app/aliases/state/aliases.service.ts @@ -8,7 +8,6 @@ import { Entry, Organization, OrganizationsService, - WorkflowsService, WorkflowVersionPathInfo, } from '../../shared/openapi'; import { AliasesStore } from './aliases.store'; @@ -19,7 +18,6 @@ export class AliasesService { private aliasesStore: AliasesStore, private organizationsService: OrganizationsService, private entriesService: EntriesService, - private workflowsService: WorkflowsService, private workflowVersionsService: WorkflowVersionsAliasService ) {} diff --git a/src/app/configuration.service.ts b/src/app/configuration.service.ts index 19139f6ff0..f238c33c23 100644 --- a/src/app/configuration.service.ts +++ b/src/app/configuration.service.ts @@ -10,12 +10,7 @@ import { Config, MetadataService } from './shared/openapi'; providedIn: 'root', }) export class ConfigurationService { - constructor( - private metadataService: MetadataService, - private configService: ConfigService, - private window: Window, - private featureService: FeatureService - ) {} + constructor(private metadataService: MetadataService, private configService: ConfigService, private featureService: FeatureService) {} load(): Promise { return this.metadataService diff --git a/src/app/entry/current-collections/current-collections.component.ts b/src/app/entry/current-collections/current-collections.component.ts index bacd085e38..6e0d8189af 100644 --- a/src/app/entry/current-collections/current-collections.component.ts +++ b/src/app/entry/current-collections/current-collections.component.ts @@ -1,4 +1,4 @@ -import { Component, Input, OnChanges, OnInit, SimpleChanges, Version } from '@angular/core'; +import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; import { ID } from '@datorama/akita'; import { Observable } from 'rxjs'; diff --git a/src/app/file-tree/file-tree.component.spec.ts b/src/app/file-tree/file-tree.component.spec.ts index 39dfdcf9b2..14c04ef6b9 100644 --- a/src/app/file-tree/file-tree.component.spec.ts +++ b/src/app/file-tree/file-tree.component.spec.ts @@ -1,6 +1,5 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; -import { MatFormFieldModule } from '@angular/material/form-field'; import { MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, diff --git a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts index 145f5de3e8..94d788c00a 100644 --- a/src/app/home-page/widget/getting-started/getting-started.component.spec.ts +++ b/src/app/home-page/widget/getting-started/getting-started.component.spec.ts @@ -1,9 +1,9 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatLegacyButtonModule, MatLegacyButtonModule as MatButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; import { RouterTestingModule } from '@angular/router/testing'; -import { ActivatedRoute, ActivatedRouteStub, RouterLinkStubDirective } from '../../../test'; +import { RouterLinkStubDirective } from '../../../test'; import { GettingStartedComponent } from './getting-started.component'; describe('GettingStartedComponent', () => { diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index 5253bf5f36..b9fab9e01e 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -1,5 +1,5 @@ /* eslint-disable max-len */ -import { Component, EventEmitter, OnInit } from '@angular/core'; +import { Component, OnInit } from '@angular/core'; import { AuthService } from '../../../ng2-ui-auth/public_api'; import { Dockstore } from '../../../shared/dockstore.model'; import { MetadataService, TRSService } from '../../../shared/openapi'; diff --git a/src/app/navbar/navbar.component.ts b/src/app/navbar/navbar.component.ts index 4c1b3bec31..68566aed79 100644 --- a/src/app/navbar/navbar.component.ts +++ b/src/app/navbar/navbar.component.ts @@ -18,7 +18,6 @@ import { NavigationEnd, Router, RouterLink, RouterLinkActive } from '@angular/ro import { Observable, Subject, combineLatest } from 'rxjs'; import { filter, map, takeUntil } from 'rxjs/operators'; import { Logout } from '../loginComponents/logout'; -import { currentPrivacyPolicyVersion, currentTOSVersion } from '../shared/constants'; import { Dockstore } from '../shared/dockstore.model'; import { toExtendSite } from '../shared/helpers'; import { UserQuery } from '../shared/user/user.query'; @@ -66,8 +65,6 @@ export class NavbarComponent extends Logout implements OnInit { isExtended = false; Dockstore = Dockstore; protected ngUnsubscribe: Subject<{}> = new Subject(); - private readonly currentTOSVersion: User.TosversionEnum = currentTOSVersion; - private readonly currentPrivacyPolicyVersion: User.PrivacyPolicyVersionEnum = currentPrivacyPolicyVersion; public myOrganizationInvites$: Observable>; public myRejectedOrganizationRequests$: Observable>; public allPendingOrganizations$: Observable>; diff --git a/src/app/ng2-ui-auth/lib/browser-storage.service.ts b/src/app/ng2-ui-auth/lib/browser-storage.service.ts index 8558808643..6750d1f63c 100644 --- a/src/app/ng2-ui-auth/lib/browser-storage.service.ts +++ b/src/app/ng2-ui-auth/lib/browser-storage.service.ts @@ -27,7 +27,7 @@ export class BrowserStorageService extends StorageService { private store: { [key: string]: string } = {}; private storageType = StorageType.MEMORY; - constructor(private config: ConfigService) { + constructor(config: ConfigService) { super(); if (!this.updateStorageType(config.options.storageType)) { console.warn(config.options.storageType + ' is not available.'); diff --git a/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts index 64029b0ea2..3d6a23b7a7 100644 --- a/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts +++ b/src/app/ng2-ui-auth/lib/ng2-ui-auth.module.ts @@ -19,7 +19,7 @@ import { NgModule, ModuleWithProviders } from '@angular/core'; import { HttpClientModule, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { IConfigOptions, IPartialConfigOptions } from './config-interfaces'; +import { IPartialConfigOptions } from './config-interfaces'; import { CONFIG_OPTIONS, ConfigService } from './config.service'; import { StorageService } from './storage-service'; import { BrowserStorageService } from './browser-storage.service'; diff --git a/src/app/ng2-ui-auth/lib/utils.ts b/src/app/ng2-ui-auth/lib/utils.ts index c4c82f254c..091a5700c2 100644 --- a/src/app/ng2-ui-auth/lib/utils.ts +++ b/src/app/ng2-ui-auth/lib/utils.ts @@ -17,8 +17,6 @@ * */ -import { HttpHeaders, HttpParams } from '@angular/common/http'; - /** * Created by Ron on 17/12/2015. */ diff --git a/src/app/notifications/state/notifications.service.spec.ts b/src/app/notifications/state/notifications.service.spec.ts index dce3ea7d75..8c476ee244 100644 --- a/src/app/notifications/state/notifications.service.spec.ts +++ b/src/app/notifications/state/notifications.service.spec.ts @@ -1,7 +1,5 @@ -import { HttpClient } from '@angular/common/http'; import { HttpClientTestingModule } from '@angular/common/http/testing'; import { TestBed, inject } from '@angular/core/testing'; -import { MatLegacySnackBarModule } from '@angular/material/legacy-snack-bar'; import { NotificationsService } from './notifications.service'; import { NotificationsStore } from './notifications.store'; import { expiredMockNotification, mockedNotification } from '../../test/mocked-objects'; diff --git a/src/app/organizations/collections/collections.component.ts b/src/app/organizations/collections/collections.component.ts index 32d2b7b3f5..c8b080ad4d 100644 --- a/src/app/organizations/collections/collections.component.ts +++ b/src/app/organizations/collections/collections.component.ts @@ -13,7 +13,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { P } from '@angular/cdk/keycodes'; import { KeyValue, NgIf, NgFor, AsyncPipe, JsonPipe, KeyValuePipe } from '@angular/common'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { MatLegacyDialog as MatDialog } from '@angular/material/legacy-dialog'; diff --git a/src/app/organizations/collections/create-collection/create-collection.component.ts b/src/app/organizations/collections/create-collection/create-collection.component.ts index 92e7a5c25f..4954237a26 100644 --- a/src/app/organizations/collections/create-collection/create-collection.component.ts +++ b/src/app/organizations/collections/create-collection/create-collection.component.ts @@ -2,7 +2,6 @@ import { KeyValue, NgIf, AsyncPipe } from '@angular/common'; import { Component, Inject, OnDestroy, OnInit } from '@angular/core'; import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; -import { HashMap } from '@datorama/akita'; import { NgFormsManager } from '@ngneat/forms-manager'; import { Observable } from 'rxjs'; import { TagEditorMode } from '../../../shared/enum/tagEditorMode.enum'; diff --git a/src/app/organizations/collections/remove-collection/remove-collection.component.ts b/src/app/organizations/collections/remove-collection/remove-collection.component.ts index 634a91695a..755490c262 100644 --- a/src/app/organizations/collections/remove-collection/remove-collection.component.ts +++ b/src/app/organizations/collections/remove-collection/remove-collection.component.ts @@ -37,7 +37,7 @@ export class RemoveCollectionDialogComponent { private collectionsService: CollectionsService, private collectionsQuery: CollectionsQuery ) { - this.collectionsQueryLoading$ = collectionsQuery.selectLoading(); + this.collectionsQueryLoading$ = this.collectionsQuery.selectLoading(); } removeCollection() { this.collectionsService.deleteCollection( diff --git a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts index ec583119bb..0b1e2ded3c 100644 --- a/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts +++ b/src/app/organizations/organization/organization-starring/organization-starring.component.spec.ts @@ -16,7 +16,6 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatIconTestingModule } from '@angular/material/icon/testing'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { MatTooltipModule } from '@angular/material/tooltip'; diff --git a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts index b465ab16f5..784ac88cae 100644 --- a/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts +++ b/src/app/organizations/organization/update-organization-description/update-organization-description.component.ts @@ -14,7 +14,7 @@ * limitations under the License. */ import { Component, Inject, OnInit } from '@angular/core'; -import { AbstractControl, UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; +import { UntypedFormGroup, FormsModule, ReactiveFormsModule } from '@angular/forms'; import { MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { UpdateOrganizationOrCollectionDescriptionService } from '../state/update-organization-description.service'; import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; diff --git a/src/app/organizations/state/organization.service.ts b/src/app/organizations/state/organization.service.ts index 1532a4936e..d863086015 100644 --- a/src/app/organizations/state/organization.service.ts +++ b/src/app/organizations/state/organization.service.ts @@ -19,7 +19,6 @@ import { finalize } from 'rxjs/operators'; import { Organization, OrganizationsService } from '../../shared/openapi'; import { OrganizationMembersService } from './organization-members.service'; import { OrganizationStore } from './organization.store'; -import { Router } from '@angular/router'; import { HttpHeaderResponse } from '@angular/common/http'; import { UrlResolverService } from '../../shared/url-resolver.service'; @@ -29,7 +28,6 @@ export class OrganizationService { private organizationStore: OrganizationStore, private organizationsService: OrganizationsService, private organizationMembersService: OrganizationMembersService, - private router: Router, public urlResolverService: UrlResolverService ) {} diff --git a/src/app/search/basic-search/basic-search.component.ts b/src/app/search/basic-search/basic-search.component.ts index b4c8d93f0e..0db3bae4a5 100644 --- a/src/app/search/basic-search/basic-search.component.ts +++ b/src/app/search/basic-search/basic-search.component.ts @@ -7,7 +7,6 @@ import { Base } from '../../shared/base'; import { bootstrap4largeModalSize, formInputDebounceTime } from '../../shared/constants'; import { AdvancedSearchComponent } from '../advancedsearch/advancedsearch.component'; import { SearchQuery } from '../state/search.query'; -import { SearchService } from '../state/search.service'; import { MatLegacyOptionModule } from '@angular/material/legacy-core'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyButtonModule } from '@angular/material/legacy-button'; @@ -40,7 +39,7 @@ import { MatExpansionModule } from '@angular/material/expansion'; ], }) export class BasicSearchComponent extends Base implements OnInit { - constructor(private searchService: SearchService, private searchQuery: SearchQuery, private matDialog: MatDialog) { + constructor(private searchQuery: SearchQuery, private matDialog: MatDialog) { super(); } public searchFormControl = new UntypedFormControl(); diff --git a/src/app/search/search-results/search-results.component.ts b/src/app/search/search-results/search-results.component.ts index fa1c3d75e8..8725316f19 100644 --- a/src/app/search/search-results/search-results.component.ts +++ b/src/app/search/search-results/search-results.component.ts @@ -56,8 +56,6 @@ export class SearchResultsComponent extends Base implements OnInit { public showWorkflowTagCloud$: Observable; public showToolTagCloud$: Observable; public showNotebookTagCloud$: Observable; - public selectedIndex$: Observable; - public selectedTab: number; toolTagCloudData: Array; workflowTagCloudData: Array; notebookTagCloudData: Array; diff --git a/src/app/search/search.routing.ts b/src/app/search/search.routing.ts index d07526582c..e2ff4492b2 100644 --- a/src/app/search/search.routing.ts +++ b/src/app/search/search.routing.ts @@ -14,7 +14,7 @@ * limitations under the License. */ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { QueryBuilderService } from './query-builder.service'; import { SearchAuthorsHtmlPipe } from './search-authors-html.pipe'; import { SearchComponent } from './search.component'; diff --git a/src/app/search/state/search.query.ts b/src/app/search/state/search.query.ts index e9bd581f31..cd02e5bfeb 100644 --- a/src/app/search/state/search.query.ts +++ b/src/app/search/state/search.query.ts @@ -1,5 +1,4 @@ import { Injectable } from '@angular/core'; -import { ActivatedRoute } from '@angular/router'; import { Query } from '@datorama/akita'; import { combineLatest, Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -60,7 +59,7 @@ export class SearchQuery extends Query { }) ); - constructor(protected store: SearchStore, private route: ActivatedRoute) { + constructor(protected store: SearchStore) { super(store); } diff --git a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts index d992f83abd..8d9a5beafd 100644 --- a/src/app/shared/code-editor-list/code-editor-list.service.spec.ts +++ b/src/app/shared/code-editor-list/code-editor-list.service.spec.ts @@ -40,13 +40,6 @@ describe('CodeEditorListService', () => { type: SourceFile.TypeEnum.DOCKSTORESMK, state: SourceFile.StateEnum.COMPLETE, }; - const secondarySMKFile = { - content: '', - absolutePath: '/.smk', - path: '/.smk', - type: SourceFile.TypeEnum.DOCKSTORESMK, - state: SourceFile.StateEnum.COMPLETE, - }; const primaryCWLFile: SourceFile = { content: '', absolutePath: '/Dockstore.cwl', diff --git a/src/app/shared/constants.ts b/src/app/shared/constants.ts index 2f594d40b4..3d9fdcb359 100644 --- a/src/app/shared/constants.ts +++ b/src/app/shared/constants.ts @@ -27,7 +27,6 @@ export const includesValidation = 'validations'; export const includesVersions = 'versions'; export const includesAuthors = 'authors'; export const includesMetrics = 'metrics'; -export const bootstrap4smallModalSize = '300px'; export const bootstrap4mediumModalSize = '500px'; export const bootstrap4largeModalSize = '800px'; export const bootstrap4extraLargeModalSize = '1140px'; @@ -35,12 +34,7 @@ export const myBioWorkflowsURLSegment = 'my-workflows'; export const myServicesURLSegment = 'my-services'; export const myToolsURLSegment = 'my-tools'; export const myNotebooksURLSegment = 'my-notebooks'; -export const bioWorkflowsURLSegment = 'workflows'; -export const servicesURLSegment = 'services'; -export const toolsURLSegment = 'tools'; -export const notebooksURLSegment = 'notebooks'; export const altAvatarImg = 'http://www.imcslc.ca/imc/includes/themes/imc/images/layout/img_placeholder_avatar.jpg'; -export const devMode = false; export const currentTOSVersion: User.TosversionEnum = User.TosversionEnum.TOSVERSION2; export const currentPrivacyPolicyVersion: User.PrivacyPolicyVersionEnum = User.PrivacyPolicyVersionEnum.PRIVACYPOLICYVERSION25; export const dismissedLatestTOS = 'dismissedLatestTOS'; diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts index ad5efac85e..8d74d1ee78 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.spec.ts @@ -16,7 +16,7 @@ import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { EditTopicDialogStubService, EntryActionsStubService, EntryTypeMetadataStubService } from 'app/test/service-stubs'; -import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogModule, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; +import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; import { EntryTypeMetadataService } from 'app/entry/type-metadata/entry-type-metadata.service'; import { sampleWorkflow1 } from 'app/test/mocked-objects'; import { EditTopicDialogComponent } from './edit-topic-dialog.component'; diff --git a/src/app/shared/entry/recent-events.pipe.spec.ts b/src/app/shared/entry/recent-events.pipe.spec.ts index cb454ffe8f..268aaf4fbb 100644 --- a/src/app/shared/entry/recent-events.pipe.spec.ts +++ b/src/app/shared/entry/recent-events.pipe.spec.ts @@ -1,5 +1,4 @@ import { RecentEventsPipe } from './recent-events.pipe'; -import { Workflow } from 'app/shared/openapi'; describe('Pipe: recentEvents', () => { const entryFields = ['tool', 'workflow', 'apptool', 'service', 'notebook']; diff --git a/src/app/shared/entry/recent-events.pipe.ts b/src/app/shared/entry/recent-events.pipe.ts index 54681638c7..bf51f68c7e 100644 --- a/src/app/shared/entry/recent-events.pipe.ts +++ b/src/app/shared/entry/recent-events.pipe.ts @@ -1,14 +1,12 @@ import { Inject, Pipe, PipeTransform } from '@angular/core'; import { Event, DockstoreTool, Workflow } from 'app/shared/openapi'; import { EntryToDisplayNamePipe } from '../entry-to-display-name.pipe'; -import { EntryType } from '../../shared/enum/entry-type'; @Pipe({ name: 'recentEvents', standalone: true, }) export class RecentEventsPipe implements PipeTransform { - private EntryType = EntryType; constructor(@Inject(EntryToDisplayNamePipe) private entryToDisplayNamePipe: EntryToDisplayNamePipe) {} /** diff --git a/src/app/shared/file.service.ts b/src/app/shared/file.service.ts index aa433c4e1c..dbc8d291db 100644 --- a/src/app/shared/file.service.ts +++ b/src/app/shared/file.service.ts @@ -15,7 +15,6 @@ */ import { Injectable } from '@angular/core'; import * as FileSaver from 'file-saver'; -import { DomSanitizer } from '@angular/platform-browser'; import { ga4ghPath, ga4ghWorkflowIdPrefix } from './constants'; import { DescriptorTypeCompatService } from './descriptor-type-compat.service'; import { Dockstore } from './dockstore.model'; @@ -26,7 +25,7 @@ const cwlImportHttpRegEx: RegExp = new RegExp(/^[^#]+((run)|(\$((import)|(includ @Injectable({ providedIn: 'root' }) export class FileService { - constructor(private sanitizer: DomSanitizer, private descriptorTypeCompatService: DescriptorTypeCompatService) {} + constructor(private descriptorTypeCompatService: DescriptorTypeCompatService) {} /** * Get the download path of a descriptor diff --git a/src/app/shared/session/session.query.ts b/src/app/shared/session/session.query.ts index 4efe29e96d..c66581e8dc 100644 --- a/src/app/shared/session/session.query.ts +++ b/src/app/shared/session/session.query.ts @@ -14,7 +14,6 @@ * limitations under the License. */ import { Injectable } from '@angular/core'; -import { Router } from '@angular/router'; import { Query } from '@datorama/akita'; import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; @@ -46,7 +45,7 @@ export class SessionQuery extends Query { isNotebook$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Notebook)); isTool$: Observable = this.entryType$.pipe(map((entryType) => entryType === EntryType.Tool)); loadingDialog$: Observable = this.select((session) => session.loadingDialog); - constructor(protected store: SessionStore, private route: Router, private entryTypeMetadataService: EntryTypeMetadataService) { + constructor(protected store: SessionStore, private entryTypeMetadataService: EntryTypeMetadataService) { super(store); } } diff --git a/src/app/shared/user/user.service.ts b/src/app/shared/user/user.service.ts index 0b4b753a43..38fdbf5079 100644 --- a/src/app/shared/user/user.service.ts +++ b/src/app/shared/user/user.service.ts @@ -5,7 +5,6 @@ import { GravatarService } from '../../gravatar/gravatar.service'; import { AuthService } from '../../ng2-ui-auth/public_api'; import { AlertService } from '../alert/state/alert.service'; import { TokenService } from '../state/token.service'; -import { WorkflowService } from '../state/workflow.service'; import { MyWorkflowsService } from '../../myworkflows/myworkflows.service'; import { MytoolsService } from '../../mytools/mytools.service'; import { EntryType } from '../enum/entry-type'; @@ -23,7 +22,6 @@ export class UserService { private configuration: Configuration, private tokenService: TokenService, private alertService: AlertService, - private workflowService: WorkflowService, private myWorkflowsService: MyWorkflowsService, private mytoolsService: MytoolsService, private trackLoginService: TrackLoginService, diff --git a/src/app/shared/view.ts b/src/app/shared/view.ts index 35573134f4..67812b19d7 100644 --- a/src/app/shared/view.ts +++ b/src/app/shared/view.ts @@ -13,8 +13,8 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -import { Directive, Input, OnDestroy } from '@angular/core'; -import { Observable, Subject } from 'rxjs'; +import { Directive, Input } from '@angular/core'; +import { Observable } from 'rxjs'; import { AlertQuery } from './alert/state/alert.query'; import { Base } from './base'; import { DateService } from './date.service'; diff --git a/src/app/starredentries/starredentries.component.ts b/src/app/starredentries/starredentries.component.ts index 97abe56bc7..a2d4efd1df 100644 --- a/src/app/starredentries/starredentries.component.ts +++ b/src/app/starredentries/starredentries.component.ts @@ -2,7 +2,7 @@ import { Component, OnInit } from '@angular/core'; import { Base } from '../shared/base'; import { ImageProviderService } from '../shared/image-provider.service'; import { ProviderService } from '../shared/provider.service'; -import { DockstoreTool, Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; +import { Entry, Organization, Workflow, EntryType as OpenApiEntryType } from '../shared/openapi'; import { UserQuery } from '../shared/user/user.query'; import { UsersService } from './../shared/openapi/api/users.service'; import { MatLegacyTabChangeEvent as MatTabChangeEvent, MatLegacyTabsModule } from '@angular/material/legacy-tabs'; diff --git a/src/app/test/router-stubs.ts b/src/app/test/router-stubs.ts index 398f560dd3..305a6b3f78 100644 --- a/src/app/test/router-stubs.ts +++ b/src/app/test/router-stubs.ts @@ -57,7 +57,6 @@ import { convertToParamMap, ParamMap } from '@angular/router'; @Injectable() export class ActivatedRouteStub { - private params = new BehaviorSubject(convertToParamMap(this.testParamMap)); // ActivatedRoute.paramMap is Observable private subject = new BehaviorSubject(convertToParamMap(this.testParamMap)); paramMap = this.subject.asObservable(); diff --git a/src/app/user-page/user-page.component.ts b/src/app/user-page/user-page.component.ts index 31aec60728..de7fe085cf 100644 --- a/src/app/user-page/user-page.component.ts +++ b/src/app/user-page/user-page.component.ts @@ -3,7 +3,7 @@ import { TokenSource } from '../shared/enum/token-source.enum'; import { Profile, TokenUser, User } from '../shared/openapi'; import { UsersService } from '../shared/openapi/api/users.service'; import { UserService } from '../shared/user/user.service'; -import { ActivatedRoute, Router } from '@angular/router'; +import { ActivatedRoute } from '@angular/router'; import { takeUntil } from 'rxjs/operators'; import { HttpErrorResponse } from '@angular/common/http'; import { AlertService } from '../shared/alert/state/alert.service'; @@ -64,7 +64,6 @@ export class UserPageComponent extends Base implements OnInit { private userService: UserService, private usersService: UsersService, private activatedRoute: ActivatedRoute, - private router: Router, private alertService: AlertService, private userQuery: UserQuery, public urlResolverService: UrlResolverService diff --git a/src/app/workflow/info-tab/info-tab.component.ts b/src/app/workflow/info-tab/info-tab.component.ts index d12e558188..414539f4ce 100644 --- a/src/app/workflow/info-tab/info-tab.component.ts +++ b/src/app/workflow/info-tab/info-tab.component.ts @@ -15,7 +15,7 @@ */ import { HttpResponse } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { MatLegacyRadioChange as MatRadioChange, MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; import { EntryType } from 'app/shared/enum/entry-type'; import { FileService } from 'app/shared/file.service'; diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index cf40ed6f55..2e89325962 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -8,7 +8,7 @@ import { Base } from '../../shared/base'; import { DescriptorTypeCompatService } from '../../shared/descriptor-type-compat.service'; import { Dockstore } from '../../shared/dockstore.model'; import { GA4GHFilesQuery } from '../../shared/ga4gh-files/ga4gh-files.query'; -import { CloudInstance, CloudInstancesService, User, UsersService, ToolFile, Workflow, WorkflowVersion } from '../../shared/openapi'; +import { CloudInstance, CloudInstancesService, User, ToolFile, Workflow, WorkflowVersion } from '../../shared/openapi'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { SourceFile } from '../../shared/openapi/model/sourceFile'; import { UserQuery } from '../../shared/user/user.query'; @@ -261,7 +261,6 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit private descriptorsQuery: DescriptorsQuery, private descriptorsService: DescriptorsService, private cloudInstanceService: CloudInstancesService, - private usersService: UsersService, private userQuery: UserQuery, private descriptorLanguageService: DescriptorLanguageService, private dialog: MatDialog diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index 3c396d2a6f..c31f743f54 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -14,8 +14,8 @@ * limitations under the License. */ import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; -import { combineLatest, forkJoin, Observable, Subject } from 'rxjs'; -import { take, takeUntil } from 'rxjs/operators'; +import { combineLatest, Observable, Subject } from 'rxjs'; +import { takeUntil } from 'rxjs/operators'; import { ga4ghWorkflowIdPrefix } from '../../shared/constants'; import { EntryTab } from '../../shared/entry/entry-tab'; diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts index d5663296d0..ad163d819f 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.spec.ts @@ -1,8 +1,6 @@ import { HttpClientTestingModule } from '@angular/common/http/testing'; import { ComponentFixture, TestBed } from '@angular/core/testing'; import { MatIconModule } from '@angular/material/icon'; -import { MatIconTestingModule } from '@angular/material/icon/testing'; -import { MatLegacyCommonModule } from '@angular/material/legacy-core'; import { MatLegacyDialogRef as MatDialogRef, MAT_LEGACY_DIALOG_DATA as MAT_DIALOG_DATA } from '@angular/material/legacy-dialog'; import { MatLegacySnackBarModule as MatSnackBarModule } from '@angular/material/legacy-snack-bar'; import { RouterTestingModule } from '@angular/router/testing'; diff --git a/src/app/workflow/view/view.component.ts b/src/app/workflow/view/view.component.ts index d8c6ecdb02..b2455808de 100644 --- a/src/app/workflow/view/view.component.ts +++ b/src/app/workflow/view/view.component.ts @@ -29,7 +29,7 @@ import { AlertService } from '../../shared/alert/state/alert.service'; import { bootstrap4largeModalSize, ga4ghServiceIdPrefix, ga4ghWorkflowIdPrefix } from '../../shared/constants'; import { DateService } from '../../shared/date.service'; import { Dockstore } from '../../shared/dockstore.model'; -import { Entry, Tag, VersionVerifiedPlatform, WorkflowVersion } from '../../shared/openapi'; +import { Entry, VersionVerifiedPlatform, WorkflowVersion } from '../../shared/openapi'; import { SessionQuery } from '../../shared/session/session.query'; import { WorkflowQuery } from '../../shared/state/workflow.query'; import { WorkflowService } from '../../shared/state/workflow.service'; diff --git a/src/app/workflows/apptools/apptools.routing.ts b/src/app/workflows/apptools/apptools.routing.ts index 2fba77c350..58d54ff7d4 100644 --- a/src/app/workflows/apptools/apptools.routing.ts +++ b/src/app/workflows/apptools/apptools.routing.ts @@ -1,4 +1,4 @@ -import { RouterModule, Routes } from '@angular/router'; +import { Routes } from '@angular/router'; import { EntryType } from 'app/shared/enum/entry-type'; import { WorkflowComponent } from 'app/workflow/workflow.component'; import { SearchWorkflowsComponent } from '../search/search.component'; diff --git a/src/main.ts b/src/main.ts index 7806cf61e1..e0f3ec32f4 100644 --- a/src/main.ts +++ b/src/main.ts @@ -35,7 +35,6 @@ import { LoginService } from './app/login/login.service'; import { AccountsService } from './app/loginComponents/accounts/external/accounts.service'; import { MytoolsService } from './app/mytools/mytools.service'; import { MyWorkflowsService } from './app/myworkflows/myworkflows.service'; -import { CONFIG_OPTIONS, ConfigService } from './app/ng2-ui-auth/lib/config.service'; import { Ng2UiAuthModule } from './app/ng2-ui-auth/public_api'; import { OrganizationStargazersModule } from './app/organizations/organization/organization-stargazers/organization-stargazers.module'; import { OrganizationStarringModule } from './app/organizations/organization/organization-starring/organization-starring.module'; diff --git a/tsconfig.json b/tsconfig.json index aa5a1095ae..eb2648585d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "sourceMap": true, "declaration": false, "moduleResolution": "node", + "noUnusedLocals": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "target": "ES2020", From c8b3f4d866c361e33134107de42f516ffc8fff4c Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Wed, 31 Jul 2024 15:05:36 -0400 Subject: [PATCH 62/98] Add AI topic approval bubble if user selects the AI topic option (#1997) https://github.com/dockstore/dockstore/issues/5866 https://ucsc-cgl.atlassian.net/browse/DOCK-2521 * Show Approved bubble if user selects AI topic * Reduce duplication * Set approved to true if topic is AI --- cypress/e2e/group2/myworkflows.ts | 23 +++- .../container/info-tab/info-tab.service.ts | 2 +- src/app/search/query-builder.service.ts | 1 + .../search-notebook-table.component.html | 5 +- .../search-tool-table.component.html | 5 +- .../search-workflow-table.component.html | 5 +- src/app/shared/container.service.ts | 22 +-- .../display-topic.component.html | 8 +- .../edit-topic-dialog.component.html | 125 ++++++++++-------- .../edit-topic-dialog.component.scss | 9 ++ .../edit-topic/edit-topic-dialog.component.ts | 57 +++++++- .../edit-topic/edit-topic-dialog.service.ts | 73 ++++++---- src/app/shared/state/workflow.service.ts | 13 +- src/app/workflow/info-tab/info-tab.service.ts | 2 +- .../snaphot-exporter-modal.component.html | 12 +- .../snaphot-exporter-modal.component.ts | 2 + 16 files changed, 228 insertions(+), 136 deletions(-) diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 53c8d386e1..831b5a32be 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -218,8 +218,6 @@ describe('Dockstore my workflows', () => { // Topic Editing const privateEntryURI = '/my-workflows/github.com/A/l'; cy.visit(privateEntryURI); - // Add an AI topic for testing - invokeSql("update workflow set topicai = 'test AI topic sentence' where id = 11"); // Modify the manual topic, but don't save it cy.get('[data-cy=topicEditButton]').click(); cy.get('[data-cy=topicInput]').clear(); // Unsafe to chain clear() @@ -255,18 +253,31 @@ describe('Dockstore my workflows', () => { cy.get('[data-cy=selected-topic]').should('contain.text', 'goodTopic'); cy.get('[data-cy=topic-selection-bubble]').should('not.exist'); - // Select the AI topic and verify that it's displayed publicly with an AI bubble + // Add an AI topic for testing and set topic selection to AI. The user has not approved of this topic. + invokeSql("update workflow set topicai = 'test AI topic sentence' where id = 11"); + invokeSql("update workflow set topicselection = 'AI' where id = 11"); + cy.visit(privateEntryURI); + cy.get('[data-cy=topicEditButton]').click(); + cy.get('[data-cy=unapprovedAITopicCard]').should('be.visible'); + cy.get('[data-cy=topicCancelButton]').click(); + // AI topic on public page should have an AI bubble because it wasn't approved by the user + cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); + cy.get('[data-cy=ai-bubble]').should('be.visible'); + + // Select the AI topic and verify that it's displayed publicly without an AI bubble cy.visit(privateEntryURI); cy.get('[data-cy=topicEditButton]').click(); cy.get('.mat-radio-label').contains('AI').click(); cy.get('[data-cy=topicSaveButton]').click(); + cy.get('[data-cy=confirmAISelectionPrompt').should('be.visible'); + cy.get('[data-cy=topicConfirmButton]').click(); cy.wait('@updateWorkflow'); cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); - cy.get('[data-cy=ai-bubble]').should('be.visible'); - // AI bubble should be displayed on public page too + cy.get('[data-cy=ai-bubble]').should('be.visible'); // AI bubble is displayed privately to indicate the topic selection + // AI bubble should not be displayed on public page because the user selected it and thus approves of it cy.get('[data-cy=viewPublicWorkflowButton]').should('be.visible').click(); cy.get('[data-cy=selected-topic]').should('contain.text', 'test AI topic sentence'); - cy.get('[data-cy=ai-bubble]').should('be.visible'); + cy.get('[data-cy=ai-bubble]').should('not.exist'); }); it('should have mode tooltip', () => { cy.visit('/my-workflows/github.com/A/g'); diff --git a/src/app/container/info-tab/info-tab.service.ts b/src/app/container/info-tab/info-tab.service.ts index 10c9372d35..f8fa04627b 100644 --- a/src/app/container/info-tab/info-tab.service.ts +++ b/src/app/container/info-tab/info-tab.service.ts @@ -116,7 +116,7 @@ export class InfoTabService extends Base { * Sending back only the ones relevant. * Additionally, the webservice does not appear to understand starredUsers which causes an error. */ - private getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool { + getPartialToolForUpdate(tool: ExtendedDockstoreTool): DockstoreTool { const partialTool: DockstoreTool = { gitUrl: tool.gitUrl, mode: tool.mode, diff --git a/src/app/search/query-builder.service.ts b/src/app/search/query-builder.service.ts index a6f0ddcbd4..880cde6060 100644 --- a/src/app/search/query-builder.service.ts +++ b/src/app/search/query-builder.service.ts @@ -78,6 +78,7 @@ export class QueryBuilderService { private sourceOptions(body: Bodybuilder) { return body.rawOption('_source', [ 'all_authors', + 'approvedAITopic', 'descriptorType', 'descriptorTypeSubclass', 'full_workflow_path', diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index 803ccb6b11..0fc7d10a2d 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -14,7 +14,10 @@ (notebook?.source.workflowName ? '/' + notebook?.source.workflowName : '') }}
    - + {{ notebook?.source.topicAutomatic }} diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 278890cf14..60f8fdb812 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -45,7 +45,10 @@ }}
    - + {{ tool?.source.topicAutomatic }} diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index 36a2710fba..e3858a49d5 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -19,7 +19,10 @@ }}
    - + {{ workflow?.source.topicAutomatic }} diff --git a/src/app/shared/container.service.ts b/src/app/shared/container.service.ts index 66a0d62afa..66e7f062ba 100644 --- a/src/app/shared/container.service.ts +++ b/src/app/shared/container.service.ts @@ -15,11 +15,8 @@ */ import { Injectable } from '@angular/core'; import { BehaviorSubject } from 'rxjs'; -import { ExtendedDockstoreToolService } from './extended-dockstoreTool/extended-dockstoreTool.service'; import { DockstoreTool } from './openapi/model/dockstoreTool'; -import { ToolQuery } from './tool/tool.query'; import { ToolService } from './tool/tool.service'; -import { ToolStore } from './tool/tool.store'; /** * This is mostly deprecated in favor of ToolService for the selected tool @@ -33,12 +30,7 @@ export class ContainerService { tools$ = new BehaviorSubject(null); // This contains the list of unsorted tools private copyBtnSource = new BehaviorSubject(null); // This is the currently selected copy button. copyBtn$ = this.copyBtnSource.asObservable(); - constructor( - private toolService: ToolService, - private toolQuery: ToolQuery, - private toolStore: ToolStore, - private extendedDockstoreToolService: ExtendedDockstoreToolService - ) {} + constructor(private toolService: ToolService) {} setTool(tool: any) { this.toolService.setTool(tool); } @@ -96,16 +88,4 @@ export class ContainerService { setCopyBtn(copyBtn: any) { this.copyBtnSource.next(copyBtn); } - - updateActiveTopic(topicManual: string) { - const newTool = { ...this.toolQuery.getActive(), topicManual: topicManual }; - this.toolStore.upsert(newTool.id, newTool); - this.extendedDockstoreToolService.update(newTool); - } - - updateActiveTopicSelection(topicSelection: DockstoreTool.TopicSelectionEnum) { - const newWorkflow = { ...this.toolQuery.getActive(), topicSelection: topicSelection }; - this.toolStore.upsert(newWorkflow.id, newWorkflow); - this.extendedDockstoreToolService.update(newWorkflow); - } } diff --git a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html index e071a83a00..9b95cbcfaf 100644 --- a/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html +++ b/src/app/shared/entry/info-tab-topic/display-topic/display-topic.component.html @@ -2,8 +2,12 @@
    Topic: {{ selectedTopic || 'n/a' }} - - + + - - -
    - edit - Manual + + +
    +
    + + edit + sync + AI generation icon + + {{ topicOption.label }} +
    + checkmark Approved
    -
    - Entered manually by the user{{ isGitHubAppEntry ? ' in the .dockstore.yml file on GitHub' : '' }}. -
    -
    {{ topicOption.description }}
    + + + - {{ entry.topicManual || 'Not Available' }} -
    - info You have not approved this topic. Click Save to confirm that you + have reviewed and approved the topic. Otherwise, select another topic. +
    + +
    - - - - - - -
    - sync - Automatic + {{ topicOption.value || 'Not Available' }}
    -
    Retrieved automatically from the GitHub repository description.
    -
    - {{ entry.topicAutomatic || 'Not Available' }} -
    -
    -
    - - -
    - AI generation icon - AI -
    -
    Generated by AI using the content of your {{ entryTypeMetadata.term }}.
    -
    {{ entry.topicAI || 'Not Available' }}
    + + + + +
    -
    +
    +
    + By selecting the AI topic, you are confirming that you have reviewed and approved it. There will be no + icon when the topic is displayed publicly. Are you sure you want to select the AI + topic? +
    -
    diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss index 7a9b2dbddd..733970e3da 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss @@ -1,3 +1,7 @@ +@use '@angular/material' as mat; + +@import 'materialColorScheme.scss'; + // This style ensures that the mat radio content text fills up the whole mat-card :host ::ng-deep .mat-radio-label-content { width: 100%; @@ -7,3 +11,8 @@ :host ::ng-deep .mat-radio-label { white-space: normal; } + +.approved { + color: white !important; + background-color: $accent-3-dark; +} diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts index 613585065b..c6b1c36713 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts @@ -20,7 +20,7 @@ import { MatLegacyButtonModule } from '@angular/material/legacy-button'; import { FlexModule } from '@ngbracket/ngx-layout/flex'; import { MatLegacyInputModule } from '@angular/material/legacy-input'; import { MatLegacyFormFieldModule } from '@angular/material/legacy-form-field'; -import { NgIf } from '@angular/common'; +import { NgFor, NgIf } from '@angular/common'; import { MatDividerModule } from '@angular/material/divider'; import { AlertComponent } from 'app/shared/alert/alert.component'; import { DockstoreTool, Entry, EntryType, EntryTypeMetadata, Workflow } from 'app/shared/openapi'; @@ -32,11 +32,19 @@ import { MatIconModule } from '@angular/material/icon'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; import { EditTopicDialogService } from './edit-topic-dialog.service'; import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; +import { MatRadioChange } from '@angular/material/radio'; export interface EditTopicDialogData { entry: DockstoreTool | Workflow; } +export interface TopicOption { + type: Entry.TopicSelectionEnum; + label: string; + description: string; + value: string | null; +} + @Component({ selector: 'app-edit-topic-dialog', templateUrl: './edit-topic-dialog.component.html', @@ -57,6 +65,7 @@ export interface EditTopicDialogData { MatLegacyRadioModule, MatIconModule, MatLegacyCardModule, + NgFor, ], }) export class EditTopicDialogComponent { @@ -69,6 +78,8 @@ export class EditTopicDialogComponent { topicEditing: boolean; selectedOption: Entry.TopicSelectionEnum; editedTopicManual: string; + promptToConfirmAISelection: boolean = false; + topicOptions: TopicOption[]; constructor( public dialogRef: MatLegacyDialogRef, @@ -83,9 +94,51 @@ export class EditTopicDialogComponent { this.isHostedEntry = this.entryActionsService.isEntryHosted(data.entry); this.selectedOption = data.entry.topicSelection; this.editedTopicManual = data.entry.topicManual; + const manualTopicOption: TopicOption = { + type: this.TopicSelectionEnum.MANUAL, + label: 'Manual', + description: `Entered manually by the user${this.isGitHubAppEntry ? 'in the .dockstore.yml.' : '.'}`, + value: this.entry.topicManual, + }; + const automaticTopicOption: TopicOption = { + type: this.TopicSelectionEnum.AUTOMATIC, + label: 'Automatic', + description: 'Retrieved automatically from the GitHub repository description.', + value: this.entry.topicAutomatic, + }; + const aiTopicOption: TopicOption = { + type: this.TopicSelectionEnum.AI, + label: 'AI', + description: `Generated by AI using the content of your ${this.entryTypeMetadata.term}.`, + value: this.entry.topicAI, + }; + this.topicOptions = [manualTopicOption]; + if (!this.isHostedEntry) { + this.topicOptions = [...this.topicOptions, automaticTopicOption]; + } + if (this.entry.topicAI) { + this.topicOptions = [...this.topicOptions, aiTopicOption]; + } + } + + /** + * This is triggered when a Topic Selection radio button is changed + * + * @param {MatRadioChange} event + * @memberof RegisterWorkflowModalComponent + */ + radioButtonChange(event: MatRadioChange): void { + if (event.value !== this.TopicSelectionEnum.AI) { + this.promptToConfirmAISelection = false; + } } saveTopic() { - this.editTopicDialogService.saveTopicChanges(this.entry, this.editedTopicManual, this.selectedOption); + if (this.selectedOption === this.TopicSelectionEnum.AI && !this.entry.approvedAITopic && !this.promptToConfirmAISelection) { + this.promptToConfirmAISelection = true; + } else { + this.editTopicDialogService.saveTopicChanges(this.entry, this.editedTopicManual, this.selectedOption); + this.dialogRef.close(); + } } } diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts index 59fd114250..c813418de3 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service.ts @@ -3,6 +3,10 @@ import { AlertService } from '../../../alert/state/alert.service'; import { ContainersService, DockstoreTool, EntryType, Workflow, WorkflowsService } from '../../../openapi'; import { WorkflowService } from '../../../state/workflow.service'; import { ContainerService } from '../../../container.service'; +import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { ToolQuery } from 'app/shared/tool/tool.query'; +import { InfoTabService as WorkflowInfoTabService } from 'app/workflow/info-tab/info-tab.service'; +import { InfoTabService as ContainerInfoTabService } from 'app/container/info-tab/info-tab.service'; @Injectable() export class EditTopicDialogService { @@ -11,38 +15,57 @@ export class EditTopicDialogService { private workflowsService: WorkflowsService, private workflowService: WorkflowService, private containersService: ContainersService, - private containerService: ContainerService + private containerService: ContainerService, + private workflowInfoTabService: WorkflowInfoTabService, + private containerInfoTabService: ContainerInfoTabService, + private workflowQuery: WorkflowQuery, + private toolQuery: ToolQuery ) {} saveTopicChanges(entry: Workflow | DockstoreTool, topicManual: string, topicSelection: Workflow.TopicSelectionEnum) { this.alertService.start('Saving topic changes'); - const newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection }; + let newEntryForUpdate; + if (topicSelection === Workflow.TopicSelectionEnum.AI) { + // If the user selects the AI topic, they have reviewed and approved it + newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection, approvedAITopic: true }; + } else { + newEntryForUpdate = { ...entry, topicManual: topicManual, topicSelection: topicSelection }; + } if (entry.entryType === EntryType.TOOL) { - this.containersService.updateContainer(entry.id, newEntryForUpdate as DockstoreTool).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - this.containerService.updateActiveTopicSelection(newTopicSelection); - const newTopic = response.topicManual; - this.containerService.updateActiveTopic(newTopic); - }, - (error) => { - this.alertService.detailedError(error); - } - ); + this.containersService + .updateContainer(entry.id, this.containerInfoTabService.getPartialToolForUpdate(newEntryForUpdate as DockstoreTool)) + .subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.containerService.setTool({ + ...this.toolQuery.getActive(), + topicManual: response.topicManual, + topicSelection: response.topicSelection, + approvedAITopic: response.approvedAITopic, + }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); } else { - this.workflowsService.updateWorkflow(entry.id, newEntryForUpdate as Workflow).subscribe( - (response) => { - this.alertService.detailedSuccess(); - const newTopicSelection = response.topicSelection; - const newTopic = response.topicManual; - this.workflowService.updateActiveTopicManualAndTopicSelection(newTopic, newTopicSelection); - }, - (error) => { - this.alertService.detailedError(error); - } - ); + this.workflowsService + .updateWorkflow(entry.id, this.workflowInfoTabService.getPartialEntryForUpdate(newEntryForUpdate as Workflow)) + .subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.workflowService.setWorkflow({ + ...this.workflowQuery.getActive(), + topicManual: response.topicManual, + topicSelection: response.topicSelection, + approvedAITopic: response.approvedAITopic, + }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); } } } diff --git a/src/app/shared/state/workflow.service.ts b/src/app/shared/state/workflow.service.ts index f9067a3a27..fc4d53f573 100644 --- a/src/app/shared/state/workflow.service.ts +++ b/src/app/shared/state/workflow.service.ts @@ -6,7 +6,6 @@ import { BioWorkflow } from '../openapi/model/bioWorkflow'; import { Service } from '../openapi/model/service'; import { Notebook } from '../openapi/model/notebook'; import { ExtendedWorkflowService } from './extended-workflow.service'; -import { WorkflowQuery } from './workflow.query'; import { WorkflowStore } from './workflow.store'; @Injectable({ providedIn: 'root' }) @@ -21,11 +20,7 @@ export class WorkflowService { nsWorkflows$: BehaviorSubject> = new BehaviorSubject>(null); private copyBtnSource = new BehaviorSubject(null); // This is the currently selected copy button. copyBtn$ = this.copyBtnSource.asObservable(); - constructor( - private workflowStore: WorkflowStore, - private extendedWorkflowService: ExtendedWorkflowService, - private workflowQuery: WorkflowQuery - ) {} + constructor(private workflowStore: WorkflowStore, private extendedWorkflowService: ExtendedWorkflowService) {} /** * Converts the mapping of roles to workflows to a concatentation of all the workflows @@ -53,12 +48,6 @@ export class WorkflowService { } } - updateActiveTopicManualAndTopicSelection(topicManual: string, topicSelection: Workflow.TopicSelectionEnum) { - const newWorkflow = { ...this.workflowQuery.getActive(), topicManual: topicManual, topicSelection: topicSelection }; - this.workflowStore.upsert(newWorkflow.id, newWorkflow); - this.extendedWorkflowService.update(newWorkflow); - } - get() { // Placeholder // this.http.get('https://akita.com').subscribe((entities) => this.workflowStore.set(entities)); diff --git a/src/app/workflow/info-tab/info-tab.service.ts b/src/app/workflow/info-tab/info-tab.service.ts index 14da36f845..38f3a49c69 100644 --- a/src/app/workflow/info-tab/info-tab.service.ts +++ b/src/app/workflow/info-tab/info-tab.service.ts @@ -85,7 +85,7 @@ export class InfoTabService { * Additionally, the webservice does not appear to understand starredUsers which causes an error. * Ideally this implementation should be similar to the tool counterpart */ - private getPartialEntryForUpdate(entry: Workflow): Workflow { + getPartialEntryForUpdate(entry: Workflow): Workflow { entry.workflowVersions = []; entry.starredUsers = []; entry.users = []; diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.html b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.html index 29590673e6..32bb6636b2 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.html +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.html @@ -61,15 +61,9 @@

    -
    - Are you sure you want to snapshot this version, making it uneditable? This cannot be undone. + Are you sure you want to snapshot this version, making it uneditable? This cannot be undone.
    diff --git a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts index b499eaa39d..f73babd608 100644 --- a/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts +++ b/src/app/workflow/snapshot-exporter-modal/snaphot-exporter-modal.component.ts @@ -20,6 +20,7 @@ import { TokenQuery } from '../../shared/state/token.query'; import { ExporterStepComponent } from './exporter-step/exporter-step.component'; import { SnapshotExporterModalService } from './snapshot-exporter-modal.service'; import { StepState } from './step.state'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; export enum SnapshotExporterAction { SNAPSHOT, @@ -57,6 +58,7 @@ export interface State { ExporterStepComponent, MatIconModule, AsyncPipe, + MatLegacyCardModule, ], }) export class SnaphotExporterModalComponent extends Base { From c112718f83b8596bbbd695f7e0e39b3add9c8d38 Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Thu, 1 Aug 2024 10:20:45 -0400 Subject: [PATCH 63/98] Update DOI properties, allow DOI selection, and move DOI display (#1994) https://ucsc-cgl.atlassian.net/browse/SEAB-6495 * Move DOI display and update to new DOI properties --- .../e2e/group1/checkerWorkflowFromTools.ts | 2 +- .../e2e/group1/checkerWorkflowFromWorkflow.ts | 2 +- cypress/e2e/group2/myworkflows.ts | 28 ++- cypress/e2e/group2/sharedWorkflows.ts | 3 + cypress/e2e/group3/githubAppTools.ts | 6 +- cypress/e2e/smokeTests/sharedTests/zenodo.ts | 10 +- cypress/fixtures/doiResponse.json | 78 ------- cypress/fixtures/getWorkflowWithDoi.json | 201 ++++++++++++++++++ cypress/fixtures/myNotebooks.json | 2 + cypress/fixtures/myTools.json | 7 + cypress/fixtures/myWorkflows.json | 2 +- cypress/fixtures/orcidExportResponse.json | 15 ++ cypress/fixtures/refreshedAslashl.json | 2 + cypress/fixtures/refreshedTool5.json | 1 + cypress/fixtures/sampleNotebook.json | 1 + .../doi/doi-badge/doi-badge.component.html | 32 +++ .../doi/doi-badge/doi-badge.component.ts | 27 +++ .../manage-dois-dialog.component.html | 47 ++++ .../manage-dois-dialog.component.scss | 9 + .../manage-dois-dialog.component.ts | 81 +++++++ .../manage-dois/manage-dois-dialog.service.ts | 32 +++ src/app/test/mocked-objects.ts | 4 + .../workflow/info-tab/info-tab.component.html | 34 +-- .../workflow/info-tab/info-tab.component.ts | 2 - .../snaphot-exporter-modal.component.html | 6 +- .../snaphot-exporter-modal.component.spec.ts | 1 + .../snaphot-exporter-modal.component.ts | 7 +- .../snapshot-exporter-modal.service.ts | 18 +- .../version-modal.component.html | 4 +- .../version-modal/version-modal.component.ts | 3 +- .../workflow/versions/versions.component.html | 39 ++-- .../workflow/versions/versions.component.ts | 19 +- src/app/workflow/view/view.component.html | 2 +- src/app/workflow/view/view.component.ts | 3 +- src/app/workflow/workflow.component.html | 45 +++- src/app/workflow/workflow.component.ts | 19 +- src/main.ts | 2 + 37 files changed, 619 insertions(+), 177 deletions(-) delete mode 100644 cypress/fixtures/doiResponse.json create mode 100644 cypress/fixtures/getWorkflowWithDoi.json create mode 100644 src/app/shared/entry/doi/doi-badge/doi-badge.component.html create mode 100644 src/app/shared/entry/doi/doi-badge/doi-badge.component.ts create mode 100644 src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html create mode 100644 src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss create mode 100644 src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts create mode 100644 src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts diff --git a/cypress/e2e/group1/checkerWorkflowFromTools.ts b/cypress/e2e/group1/checkerWorkflowFromTools.ts index 9e9c718a24..eb69ce7ca4 100644 --- a/cypress/e2e/group1/checkerWorkflowFromTools.ts +++ b/cypress/e2e/group1/checkerWorkflowFromTools.ts @@ -99,7 +99,7 @@ describe('Checker workflow test from my-tools', () => { cy.wait('@unpublishTool'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); // Clicking it should scroll it into view cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); goToTab('Info'); diff --git a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts index b508c05224..3fac473eef 100644 --- a/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts +++ b/cypress/e2e/group1/checkerWorkflowFromWorkflow.ts @@ -123,7 +123,7 @@ describe('Checker workflow test from my-workflows', () => { cy.url().should('eq', Cypress.config().baseUrl + '/my-workflows/github.com/A/l'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); goToTab('Info'); diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 831b5a32be..983acc8cc0 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -401,12 +401,17 @@ describe('Dockstore my workflows part 2', () => { statusCode: 200, }); }); - // doiResponse.json has a workflow version with a DOI - cy.fixture('doiResponse.json').then((json) => { - cy.intercept('PUT', '/api/**/requestDOI/*', { + // Return a 200 for requestDOI. The response is not used. + cy.intercept('PUT', '/api/**/requestDOI/*', { + statusCode: 200, + }); + // getWorkflowWithDoi.json has a workflow version with a DOI. + // This endpoint is called after a DOI is requested. + cy.fixture('getWorkflowWithDoi.json').then((json) => { + cy.intercept('GET', '/api/workflows/11?include=versions', { body: json, statusCode: 200, - }); + }).as('getWorkflowAfterRequestDoi'); }); // orcidExportResponse.json has a workflow version with an ORCID put code cy.fixture('orcidExportResponse.json').then((json) => { @@ -416,13 +421,18 @@ describe('Dockstore my workflows part 2', () => { }); }); - cy.get('[data-cy=workflow-version-DOI-badge]').should('not.exist'); // Make sure there are no existing Zenodo badges + // Make sure there are no existing Zenodo badges + cy.get('[data-cy=concept-DOI-badge]').should('not.exist'); + cy.get('[data-cy=version-DOI-badge]').should('not.exist'); gotoVersionsAndClickActions(); // Request DOI cy.get('[data-cy=dockstore-request-doi-button]').click(); cy.get('[data-cy=export-button').should('be.enabled'); cy.get('[data-cy=export-button').click(); - cy.get('[data-cy=workflow-version-DOI-badge]').its('length').should('be.gt', 0); // Should have a DOI badge now + // Should have DOI badges now + cy.get('[data-cy=user-DOI-icon]').should('be.visible'); + cy.get('[data-cy=concept-DOI-badge]').should('be.visible'); + cy.get('[data-cy=version-DOI-badge]').should('be.visible'); cy.get('td').contains('Actions').click(); cy.get('[data-cy=dockstore-request-doi-button').should('not.exist'); // Should not be able to request another DOI @@ -448,7 +458,7 @@ describe('Dockstore my workflows part 2', () => { // Should not be able to refresh a dockstore.yml workflow version goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('be.disabled'); cy.get('body').type('{esc}'); @@ -475,7 +485,7 @@ describe('Dockstore my workflows part 2', () => { cy.visit('/my-workflows/github.com/A/l'); cy.url().should('eq', Cypress.config().baseUrl + '/my-workflows/github.com/A/l'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('not.be.disabled'); }); @@ -623,7 +633,7 @@ describe('Dockstore my workflows part 3', () => { cy.get('#publishButton').should('contain', 'Publish').should('be.visible'); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.get('[data-cy=set-default-version-button]').should('be.visible').click(); cy.wait(1000); cy.get('#publishButton').should('contain', 'Publish').should('be.visible').click(); diff --git a/cypress/e2e/group2/sharedWorkflows.ts b/cypress/e2e/group2/sharedWorkflows.ts index ced9dc0fec..e3a51eb8a6 100644 --- a/cypress/e2e/group2/sharedWorkflows.ts +++ b/cypress/e2e/group2/sharedWorkflows.ts @@ -74,6 +74,7 @@ describe('Shared with me workflow test from my-workflows', () => { return { aliases: undefined, authors: [], + conceptDois: {}, checker_id: undefined, dbCreateDate: 1530729459942, dbUpdateDate: 1530729459942, @@ -124,6 +125,7 @@ describe('Shared with me workflow test from my-workflows', () => { dirtyBit: false, doiStatus: 'NOT_REQUESTED', doiURL: undefined, + dois: {}, hidden: false, id: 1, input_file_formats: [], @@ -164,6 +166,7 @@ describe('Shared with me workflow test from my-workflows', () => { dirtyBit: false, doiStatus: 'NOT_REQUESTED', doiURL: undefined, + dois: {}, hidden: false, id: 2, input_file_formats: [], diff --git a/cypress/e2e/group3/githubAppTools.ts b/cypress/e2e/group3/githubAppTools.ts index 39d12c1bf5..fc224a4a3c 100644 --- a/cypress/e2e/group3/githubAppTools.ts +++ b/cypress/e2e/group3/githubAppTools.ts @@ -166,7 +166,7 @@ describe('GitHub App Tools', () => { goToTab('Versions'); isActiveTab('Versions'); cy.get('table>tbody>tr').should('have.length', 1); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Refresh Version').should('be.disabled'); // Fix hiding a version. You have to refresh the page to see that it was hidden in the table @@ -177,7 +177,7 @@ describe('GitHub App Tools', () => { cy.get('[data-cy=save-version]').click(); cy.get('[data-cy=valid').should('exist'); cy.get('[data-cy=hidden').should('exist'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('Edit Info').click(); cy.get('[type="checkbox"]').uncheck(); cy.get('[data-cy=save-version]').click(); @@ -206,7 +206,7 @@ describe('GitHub App Tools', () => { cy.contains('Default Version Required'); cy.get('[data-cy=close-dialog-button]').click(); goToTab('Versions'); - cy.contains('button', 'Actions').should('be.visible').click(); + cy.contains('button', 'Actions').click(); cy.contains('button', 'Set as Default Version').should('be.visible').click(); cy.wait(500); cy.get('#publishButton').should('not.be.disabled'); diff --git a/cypress/e2e/smokeTests/sharedTests/zenodo.ts b/cypress/e2e/smokeTests/sharedTests/zenodo.ts index 1cda904567..44be9f06be 100644 --- a/cypress/e2e/smokeTests/sharedTests/zenodo.ts +++ b/cypress/e2e/smokeTests/sharedTests/zenodo.ts @@ -186,12 +186,8 @@ describe('Create Zenodo DOI for workflow version', () => { cy.get('[data-cy=confirm-dialog-button]').click(); cy.get('[data-cy=confirm-dialog-button]', { timeout: 20000 }).should('not.exist'); - cy.get('[data-cy=workflow-version-DOI-badge]').should('be.visible'); - - goToTab('Info'); - cy.get('[class=mat-card-header]').should('contain', 'Workflow Version Information'); - - // Check that the DOI appears on the Info page for the new version - cy.get('[data-cy=info-tab-DOI-badge]').should('be.visible'); + // Check that the DOI appears for the new version + cy.get('[data-cy=user-DOI-icon]').should('be.visible'); + cy.get('[data-cy=version-DOI-badge]').should('be.visible'); }); }); diff --git a/cypress/fixtures/doiResponse.json b/cypress/fixtures/doiResponse.json deleted file mode 100644 index 1983b771a7..0000000000 --- a/cypress/fixtures/doiResponse.json +++ /dev/null @@ -1,78 +0,0 @@ -[ - { - "aliases": null, - "author": null, - "commitID": null, - "dbUpdateDate": 1622246514895, - "description": null, - "descriptionSource": null, - "dirtyBit": false, - "doiStatus": "CREATED", - "doiURL": "10.5072/zenodo.841014", - "email": null, - "frozen": true, - "hidden": false, - "id": 13, - "images": null, - "input_file_formats": [], - "last_modified": 1480374117003, - "legacyVersion": true, - "name": "master", - "output_file_formats": [], - "reference": "master", - "referenceType": "UNSET", - "subClass": null, - "synced": false, - "valid": true, - "validations": null, - "verified": false, - "verifiedSource": null, - "verifiedSources": [], - "versionEditor": null, - "versionMetadata": { - "id": 13, - "userIdToOrcidPutCode": {}, - "parsedInformationSet": [] - }, - "workflow_path": "/1st-workflow.cwl", - "workingDirectory": "" - }, - { - "aliases": null, - "author": null, - "commitID": null, - "dbUpdateDate": 1480374117003, - "description": null, - "descriptionSource": null, - "dirtyBit": false, - "doiStatus": "NOT_REQUESTED", - "doiURL": null, - "email": null, - "frozen": false, - "hidden": true, - "id": 14, - "images": null, - "input_file_formats": [], - "last_modified": 1480374117003, - "legacyVersion": true, - "name": "test", - "output_file_formats": [], - "reference": "test", - "referenceType": "UNSET", - "subClass": null, - "synced": true, - "valid": true, - "validations": null, - "verified": false, - "verifiedSource": null, - "verifiedSources": [], - "versionEditor": null, - "versionMetadata": { - "id": 14, - "userIdToOrcidPutCode": {}, - "parsedInformationSet": [] - }, - "workflow_path": "/1st-workflow.cwl", - "workingDirectory": "" - } -] diff --git a/cypress/fixtures/getWorkflowWithDoi.json b/cypress/fixtures/getWorkflowWithDoi.json new file mode 100644 index 0000000000..6f6f54d60e --- /dev/null +++ b/cypress/fixtures/getWorkflowWithDoi.json @@ -0,0 +1,201 @@ +{ + "type": "BioWorkflow", + "descriptorType": "CWL", + "aliases": {}, + "archived": false, + "authors": [], + "checker_id": null, + "conceptDoi": null, + "conceptDois": { + "USER": { + "type": "CONCEPT", + "name": "10.5072/zenodo.841013", + "initiator": "USER" + } + }, + "dbCreateDate": 1465394796000, + "dbUpdateDate": 1465394796000, + "defaultTestParameterFilePath": "/test.json", + "defaultVersion": null, + "deletable": false, + "description": null, + "descriptorTypeSubclass": "n/a", + "doiSelection": "USER", + "entryType": "WORKFLOW", + "entryTypeMetadata": { + "searchEntryType": "workflows", + "searchSupported": true, + "sitePath": "workflows", + "term": "workflow", + "termPlural": "workflows", + "trsPrefix": "#workflow/", + "trsSupported": true, + "type": "WORKFLOW" + }, + "forumUrl": null, + "full_workflow_path": "github.com/A/l", + "gitUrl": "git@github.com:A/l.git", + "has_checker": false, + "id": 11, + "input_file_formats": [], + "isChecker": false, + "is_published": true, + "labels": [], + "lastUpdated": 1480345257688, + "last_modified": null, + "last_modified_date": null, + "licenseInformation": { + "licenseName": null + }, + "mode": "FULL", + "orcidAuthors": [], + "organization": "A", + "output_file_formats": [], + "parent_id": null, + "path": "github.com/A/l", + "repository": "l", + "sourceControl": "github.com", + "source_control_provider": "GITHUB", + "starredUsers": [], + "topic": null, + "topicAI": null, + "topicAutomatic": null, + "topicId": null, + "topicManual": null, + "topicSelection": "AUTOMATIC", + "userIdToOrcidPutCode": null, + "users": [ + { + "avatarUrl": null, + "curator": true, + "id": 1, + "isAdmin": true, + "name": "user_A", + "orcid": null, + "platformPartner": null, + "privacyPolicyVersion": "PRIVACY_POLICY_VERSION_2_5", + "privacyPolicyVersionAcceptanceDate": null, + "setupComplete": false, + "tosacceptanceDate": null, + "tosversion": "TOS_VERSION_2", + "userProfiles": null, + "username": "user_A", + "usernameChangeRequired": false + } + ], + "workflowName": null, + "workflowVersions": [ + { + "aiTopicProcessed": false, + "aliases": null, + "author": "Muhammed Lee", + "authors": [ + { + "affiliation": null, + "email": "Muhammad.Lee@oicr.on.ca", + "name": "Muhammed Lee", + "role": null + } + ], + "commitID": null, + "dbUpdateDate": 1722026014356, + "descriptionSource": null, + "dirtyBit": false, + "doiStatus": "NOT_REQUESTED", + "doiURL": null, + "dois": { + "USER": { + "type": "VERSION", + "name": "10.5072/zenodo.841014", + "initiator": "USER" + } + }, + "email": "Muhammad.Lee@oicr.on.ca", + "frozen": true, + "hidden": false, + "id": 13, + "images": null, + "input_file_formats": [], + "kernelImagePath": null, + "last_modified": 1480345317003, + "legacyVersion": true, + "metricsByPlatform": null, + "name": "master", + "orcidAuthors": null, + "output_file_formats": [], + "readMePath": null, + "reference": "master", + "referenceType": "UNSET", + "synced": false, + "userFiles": [], + "valid": true, + "validations": null, + "verified": false, + "verifiedPlatforms": [], + "verifiedSource": null, + "verifiedSources": [], + "versionEditor": null, + "versionMetadata": { + "descriptorTypeVersions": [], + "dois": {}, + "engineVersions": [], + "id": 13, + "parsedInformationSet": [], + "publicAccessibleTestParameterFile": null, + "userIdToOrcidPutCode": {} + }, + "workflow_path": "/1st-workflow.cwl", + "workingDirectory": "" + }, + { + "aiTopicProcessed": false, + "aliases": null, + "author": null, + "authors": [], + "commitID": null, + "dbUpdateDate": 1480345317003, + "descriptionSource": null, + "dirtyBit": false, + "doiStatus": "NOT_REQUESTED", + "doiURL": null, + "dois": {}, + "email": null, + "frozen": false, + "hidden": true, + "id": 14, + "images": null, + "input_file_formats": [], + "kernelImagePath": null, + "last_modified": 1480345317003, + "legacyVersion": true, + "metricsByPlatform": null, + "name": "test", + "orcidAuthors": null, + "output_file_formats": [], + "readMePath": null, + "reference": "test", + "referenceType": "UNSET", + "synced": true, + "userFiles": [], + "valid": true, + "validations": null, + "verified": false, + "verifiedPlatforms": [], + "verifiedSource": null, + "verifiedSources": [], + "versionEditor": null, + "versionMetadata": { + "descriptorTypeVersions": [], + "dois": {}, + "engineVersions": [], + "id": 14, + "parsedInformationSet": [], + "publicAccessibleTestParameterFile": null, + "userIdToOrcidPutCode": {} + }, + "workflow_path": "/1st-workflow.cwl", + "workingDirectory": "" + } + ], + "workflow_path": "/1st-workflow.cwl" + } \ No newline at end of file diff --git a/cypress/fixtures/myNotebooks.json b/cypress/fixtures/myNotebooks.json index 4d795dcfbc..8a54e4d907 100644 --- a/cypress/fixtures/myNotebooks.json +++ b/cypress/fixtures/myNotebooks.json @@ -6,6 +6,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, "defaultTestParameterFilePath": "/test.json", @@ -46,6 +47,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1678999094926, "dbUpdateDate": 1678999094994, "defaultTestParameterFilePath": "/test.json", diff --git a/cypress/fixtures/myTools.json b/cypress/fixtures/myTools.json index 6c85ba1091..11fef8e911 100644 --- a/cypress/fixtures/myTools.json +++ b/cypress/fixtures/myTools.json @@ -4,6 +4,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -44,6 +45,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -84,6 +86,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -124,6 +127,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -164,6 +168,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "amazon.dkr.ecr.test.amazonaws.com", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -204,6 +209,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, @@ -244,6 +250,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, diff --git a/cypress/fixtures/myWorkflows.json b/cypress/fixtures/myWorkflows.json index c8de2386f9..b2f0d3c5a5 100644 --- a/cypress/fixtures/myWorkflows.json +++ b/cypress/fixtures/myWorkflows.json @@ -1 +1 @@ -[{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/l","gitUrl":"git@github.com:A/l.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/l","repository":"l","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/addedthisworkflowviasync","gitUrl":"git@github.com:A/addedthisworkflowviasync.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/addedthisworkflowviasync","repository":"addedthisworkflowviasync","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1578510396000,"dbUpdateDate":1578510396000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/B/z","gitUrl":"git@github.com:B/z.git","has_checker":false,"id":30,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1580241657315,"last_modified":null,"last_modified_date":null,"mode":"DOCKSTORE_YML","organization":"B","output_file_formats":[],"parent_id":null,"path":"github.com/B/z","repository":"z","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.cwl"},{"type":"BioWorkflow","descriptorType":"WDL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"dockstore.org/A2/hosted-workflow","gitUrl":"git@dockstore.org:workflows/dockstore.org/A2/hosted-workflow.git","has_checker":false,"id":21,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1480363257315,"last_modified":null,"last_modified_date":null,"mode":"HOSTED","organization":"A","output_file_formats":[],"parent_id":null,"path":"dockstore.org/A2/hosted-workflow","repository":"hosted-workflow","sourceControl":"dockstore.org","source_control_provider":"DOCKSTORE","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.wdl"}] +[{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/l","gitUrl":"git@github.com:A/l.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/l","repository":"l","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/A/addedthisworkflowviasync","gitUrl":"git@github.com:A/addedthisworkflowviasync.git","has_checker":false,"id":11,"input_file_formats":[],"isChecker":false,"is_published":true,"labels":[],"lastUpdated":1480363257688,"last_modified":null,"last_modified_date":null,"mode":"FULL","organization":"A","output_file_formats":[],"parent_id":null,"path":"github.com/A/addedthisworkflowviasync","repository":"addedthisworkflowviasync","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/1st-workflow.cwl"},{"type":"BioWorkflow","descriptorType":"CWL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1578510396000,"dbUpdateDate":1578510396000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"github.com/B/z","gitUrl":"git@github.com:B/z.git","has_checker":false,"id":30,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1580241657315,"last_modified":null,"last_modified_date":null,"mode":"DOCKSTORE_YML","organization":"B","output_file_formats":[],"parent_id":null,"path":"github.com/B/z","repository":"z","sourceControl":"github.com","source_control_provider":"GITHUB","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.cwl"},{"type":"BioWorkflow","descriptorType":"WDL","aliases":null,"author":null,"checker_id":null,"conceptDoi":null,"conceptDois":{},"dbCreateDate":1465409196000,"dbUpdateDate":1465409196000,"defaultTestParameterFilePath":"/test.json","defaultVersion":null,"description":null,"descriptorTypeSubclass":"NOT_APPLICABLE","email":null,"full_workflow_path":"dockstore.org/A2/hosted-workflow","gitUrl":"git@dockstore.org:workflows/dockstore.org/A2/hosted-workflow.git","has_checker":false,"id":21,"input_file_formats":[],"isChecker":false,"is_published":false,"labels":[],"lastUpdated":1480363257315,"last_modified":null,"last_modified_date":null,"mode":"HOSTED","organization":"A","output_file_formats":[],"parent_id":null,"path":"dockstore.org/A2/hosted-workflow","repository":"hosted-workflow","sourceControl":"dockstore.org","source_control_provider":"DOCKSTORE","starredUsers":[],"topicId":null,"users":null,"workflowName":null,"workflowVersions":[],"workflow_path":"/Dockstore.wdl"}] diff --git a/cypress/fixtures/orcidExportResponse.json b/cypress/fixtures/orcidExportResponse.json index bc2f5d4533..072c20d65c 100644 --- a/cypress/fixtures/orcidExportResponse.json +++ b/cypress/fixtures/orcidExportResponse.json @@ -5,6 +5,13 @@ "author": null, "checker_id": null, "conceptDoi": "10.5072/zenodo.841013", + "conceptDois": { + "USER": { + "type": "CONCEPT", + "name": "10.5072/zenodo.841013", + "initiator": "USER" + } + }, "dbCreateDate": 1465409196000, "dbUpdateDate": 1465409196000, "defaultTestParameterFilePath": "/test.json", @@ -52,6 +59,13 @@ "dirtyBit": false, "doiStatus": "CREATED", "doiURL": "10.5072/zenodo.841014", + "dois": { + "USER": { + "type": "VERSION", + "name": "10.5072/zenodo.841014", + "initiator": "USER" + } + }, "email": null, "frozen": true, "hidden": false, @@ -96,6 +110,7 @@ "dirtyBit": false, "doiStatus": "NOT_REQUESTED", "doiURL": null, + "dois": {}, "email": null, "frozen": false, "hidden": true, diff --git a/cypress/fixtures/refreshedAslashl.json b/cypress/fixtures/refreshedAslashl.json index 4d5eac529f..070a9b36d6 100644 --- a/cypress/fixtures/refreshedAslashl.json +++ b/cypress/fixtures/refreshedAslashl.json @@ -5,6 +5,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1465419996000, "dbUpdateDate": 1465419996000, "defaultTestParameterFilePath": "/test.json", @@ -62,6 +63,7 @@ "dirtyBit": false, "doiStatus": "NOT_REQUESTED", "doiURL": null, + "dois": {}, "email": null, "frozen": false, "hidden": false, diff --git a/cypress/fixtures/refreshedTool5.json b/cypress/fixtures/refreshedTool5.json index 304a06f5e4..5816b2b27e 100644 --- a/cypress/fixtures/refreshedTool5.json +++ b/cypress/fixtures/refreshedTool5.json @@ -3,6 +3,7 @@ "author": "", "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "custom_docker_registry_path": "quay.io", "dbCreateDate": 1540931203177, "dbUpdateDate": 1540931206733, diff --git a/cypress/fixtures/sampleNotebook.json b/cypress/fixtures/sampleNotebook.json index 551db0e3e5..cab5e49307 100644 --- a/cypress/fixtures/sampleNotebook.json +++ b/cypress/fixtures/sampleNotebook.json @@ -5,6 +5,7 @@ "author": null, "checker_id": null, "conceptDoi": null, + "conceptDois": {}, "dbCreateDate": 1678804799542, "dbUpdateDate": 1678804799613, "defaultTestParameterFilePath": "/test.json", diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.html b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html new file mode 100644 index 0000000000..111b7ac279 --- /dev/null +++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.html @@ -0,0 +1,32 @@ + + small Dockstore logo + small GitHub logo + account_circle + + + {{ doi.name }} + diff --git a/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts new file mode 100644 index 0000000000..1d0b87aa47 --- /dev/null +++ b/src/app/shared/entry/doi/doi-badge/doi-badge.component.ts @@ -0,0 +1,27 @@ +import { NgIf } from '@angular/common'; +import { Component, Input } from '@angular/core'; +import { MatIconModule } from '@angular/material/icon'; +import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; +import { Dockstore } from 'app/shared/dockstore.model'; +import { Doi } from 'app/shared/openapi'; + +@Component({ + selector: 'app-doi-badge', + templateUrl: './doi-badge.component.html', + styleUrls: [], + standalone: true, + imports: [MatLegacyTooltipModule, NgIf, MatIconModule], +}) +export class DoiBadgeComponent { + Dockstore = Dockstore; + DoiInitiator = Doi.InitiatorEnum; + DoiType = Doi.TypeEnum; + zenodoUrl: string; + @Input() doi: Doi; + @Input() displayInitiator: boolean = true; + @Input() displayDoi: boolean = true; + + constructor() { + this.zenodoUrl = Dockstore.ZENODO_AUTH_URL ? Dockstore.ZENODO_AUTH_URL.replace('oauth/authorize', '') : ''; + } +} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html new file mode 100644 index 0000000000..6ee6edc9c8 --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html @@ -0,0 +1,47 @@ +

    Manage DOIs

    + +

    + A Digital Object Identifier (DOI) allows a {{ entryTypeMetadata.term }} version to be easily cited in publications. There are two types + of DOIs: +

    +
      +
    • Version DOI: represents a specific version.
    • +
    • Concept DOI: represents all versions and resolves to the latest one.
    • +
    + + info This {{ entryTypeMetadata.term }} has no DOIs. + +

    Select which DOI to display publicly:

    + +
    + + +
    + + {{ doiInfo.key | titlecase }} +
    +
    + Manually created by a user in the Dockstore UI. + + Automatically created by Dockstore for valid tags belonging to published {{ entryTypeMetadata.termPlural }}. + + Created by Zenodo's integration with GitHub. +
    + + Version DOI: + + n/a + + + Concept DOI: + + +
    +
    +
    +
    +
    +
    + + +
    diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss new file mode 100644 index 0000000000..7a9b2dbddd --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss @@ -0,0 +1,9 @@ +// This style ensures that the mat radio content text fills up the whole mat-card +:host ::ng-deep .mat-radio-label-content { + width: 100%; +} + +// Wraps the text because by default, mat-radio-label doesn't wrap +:host ::ng-deep .mat-radio-label { + white-space: normal; +} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts new file mode 100644 index 0000000000..2b421fe3d2 --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts @@ -0,0 +1,81 @@ +import { KeyValue, KeyValuePipe, NgFor, NgIf, TitleCasePipe } from '@angular/common'; +import { Component, Inject } from '@angular/core'; +import { FormsModule } from '@angular/forms'; +import { MatLegacyButtonModule } from '@angular/material/legacy-button'; +import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { MAT_LEGACY_DIALOG_DATA, MatLegacyDialogModule, MatLegacyDialogRef } from '@angular/material/legacy-dialog'; +import { MatLegacyRadioModule } from '@angular/material/legacy-radio'; +import { FlexModule } from '@ngbracket/ngx-layout'; +import { Doi, EntryTypeMetadata, Workflow, WorkflowVersion } from 'app/shared/openapi'; +import { ManageDoisDialogService } from './manage-dois-dialog.service'; +import { MatIconModule } from '@angular/material/icon'; +import { DoiBadgeComponent } from '../doi-badge/doi-badge.component'; + +export interface ManageDoisDialogData { + entry: Workflow; + version: WorkflowVersion; +} + +export interface DoiInfo { + initiator: Doi.InitiatorEnum; + conceptDoi: Doi; + versionDoi: Doi | undefined; +} + +@Component({ + selector: 'app-manage-dois-dialog', + templateUrl: './manage-dois-dialog.component.html', + styleUrls: ['./manage-dois-dialog.component.scss'], + standalone: true, + imports: [ + MatLegacyDialogModule, + MatLegacyButtonModule, + MatLegacyCardModule, + MatLegacyRadioModule, + MatIconModule, + FlexModule, + FormsModule, + NgIf, + NgFor, + KeyValuePipe, + TitleCasePipe, + DoiBadgeComponent, + ], +}) +export class ManageDoisDialogComponent { + DoiInitiatorEnum = Doi.InitiatorEnum; + entry: Workflow; + entryTypeMetadata: EntryTypeMetadata; + selectedOption: Doi.InitiatorEnum; + doiInfoMap: Map = new Map(); + + constructor( + public dialogRef: MatLegacyDialogRef, + public manageDoisDialogService: ManageDoisDialogService, + @Inject(MAT_LEGACY_DIALOG_DATA) public data: ManageDoisDialogData + ) { + this.entry = data.entry; + this.entryTypeMetadata = data.entry.entryTypeMetadata; + this.selectedOption = data.entry.doiSelection; + Object.entries(data.entry.conceptDois).forEach(([initiator, conceptDoi]) => { + let initiatorEnum = Object.keys(Doi.InitiatorEnum).find((i) => Doi.InitiatorEnum[i] === initiator); + let versionDoi = data.version?.dois[initiator]; + this.doiInfoMap.set(Doi.InitiatorEnum[initiatorEnum], { + initiator: Doi.InitiatorEnum[initiatorEnum], + conceptDoi: conceptDoi, + versionDoi: versionDoi, + }); + }); + } + + saveDoiSelection() { + this.manageDoisDialogService.saveDoiSelection(this.entry, this.selectedOption); + } + + /** + * To prevent the Angular's keyvalue pipe from sorting by key + */ + originalOrder = (a: KeyValue, b: KeyValue): number => { + return 0; + }; +} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts new file mode 100644 index 0000000000..3883b8c62d --- /dev/null +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.service.ts @@ -0,0 +1,32 @@ +import { Injectable } from '@angular/core'; +import { AlertService } from '../../../alert/state/alert.service'; +import { Doi, Workflow, WorkflowsService } from '../../../openapi'; +import { WorkflowService } from '../../../state/workflow.service'; +import { WorkflowQuery } from 'app/shared/state/workflow.query'; +import { InfoTabService } from 'app/workflow/info-tab/info-tab.service'; + +@Injectable() +export class ManageDoisDialogService { + constructor( + private alertService: AlertService, + private workflowsService: WorkflowsService, + private workflowService: WorkflowService, + private workflowQuery: WorkflowQuery, + private infoTabService: InfoTabService + ) {} + + saveDoiSelection(entry: Workflow, doiSelection: Doi.InitiatorEnum) { + this.alertService.start('Saving DOI selection'); + const newEntryForUpdate = this.infoTabService.getPartialEntryForUpdate({ ...entry, doiSelection: doiSelection }); + + this.workflowsService.updateWorkflow(entry.id, newEntryForUpdate).subscribe( + (response) => { + this.alertService.detailedSuccess(); + this.workflowService.setWorkflow({ ...this.workflowQuery.getActive(), doiSelection: response.doiSelection }); + }, + (error) => { + this.alertService.detailedError(error); + } + ); + } +} diff --git a/src/app/test/mocked-objects.ts b/src/app/test/mocked-objects.ts index 1caa786670..9ddc2a1a8e 100644 --- a/src/app/test/mocked-objects.ts +++ b/src/app/test/mocked-objects.ts @@ -656,6 +656,7 @@ export const elasticSearchResponse: Hit[] = [ workflowVersions: [ { doiURL: null, + dois: {}, dbUpdateDate: null, versionEditor: null, verifiedSource: null, @@ -675,6 +676,7 @@ export const elasticSearchResponse: Hit[] = [ }, { doiURL: null, + dois: {}, dbUpdateDate: null, versionEditor: null, verifiedSource: null, @@ -736,6 +738,7 @@ export const elasticSearchResponse: Hit[] = [ workflowVersions: [ { doiURL: null, + dois: {}, dbUpdateDate: null, subClass: null, versionEditor: null, @@ -774,6 +777,7 @@ export const exampleEntry: Version = { dirtyBit: true, doiStatus: 'NOT_REQUESTED', doiURL: null, + dois: {}, frozen: false, hidden: false, id: 25247, diff --git a/src/app/workflow/info-tab/info-tab.component.html b/src/app/workflow/info-tab/info-tab.component.html index a58db562c9..73c1dd9395 100644 --- a/src/app/workflow/info-tab/info-tab.component.html +++ b/src/app/workflow/info-tab/info-tab.component.html @@ -307,25 +307,6 @@ {{ 'descriptor_type' | mapFriendlyValue: workflow?.descriptorType }}
    -
    - Concept DOI - help - : - {{ workflow.conceptDoi }} - {{ workflow?.conceptDoi ? '' : 'n/a' }} -
    @@ -357,7 +338,7 @@
    - +
    warning This version is snapshotted but contains HTTP imports. HTTP imports may @@ -411,19 +392,6 @@ Engine Versions: {{ selectedVersion.versionMetadata.engineVersions }}
    -
    - Version DOI: - {{ selectedVersion.doiURL }} - {{ selectedVersion?.doiURL ? '' : 'n/a' }} -
    Open >
    - +
    @@ -70,7 +72,7 @@

    +

    Categories @@ -165,7 +188,9 @@

    - Labels + + Labels:{{ workflowEditData?.labels.length === 0 ? ' n/a' : '' }} +

    + +
    Cite this {{ workflow.entryTypeMetadata.term }}
    + + +

    + Cite version {{ selectedVersion.name }} using DOI + . +

    +

    + Version {{ selectedVersion.name }} has no DOI. +

    +

    + Cite all versions using the DOI + . This DOI represents all versions, and + will always resolve to the latest one. +

    +
    +
    Recent Versions
    diff --git a/src/app/workflow/workflow.component.ts b/src/app/workflow/workflow.component.ts index 1370fdaa0f..6b7c0a8367 100644 --- a/src/app/workflow/workflow.component.ts +++ b/src/app/workflow/workflow.component.ts @@ -40,6 +40,7 @@ import { finalize, takeUntil } from 'rxjs/operators'; import { AlertQuery } from '../shared/alert/state/alert.query'; import { BioschemaService } from '../shared/bioschema.service'; import { + bootstrap4largeModalSize, ga4ghNotebookIdPrefix, ga4ghServiceIdPrefix, ga4ghWorkflowIdPrefix, @@ -65,7 +66,7 @@ import { SessionService } from '../shared/session/session.service'; import { ExtendedWorkflowQuery } from '../shared/state/extended-workflow.query'; import { WorkflowQuery } from '../shared/state/workflow.query'; import { WorkflowService } from '../shared/state/workflow.service'; -import { Permission, ToolDescriptor, WorkflowsService, EntriesService, WorkflowSubClass } from '../shared/openapi'; +import { Permission, ToolDescriptor, WorkflowsService, EntriesService, WorkflowSubClass, Doi } from '../shared/openapi'; import { SyncStatus } from '../shared/openapi/model/syncStatus'; import { Tag } from '../shared/openapi/model/tag'; import { Workflow } from '../shared/openapi/model/workflow'; @@ -108,6 +109,8 @@ import { MatLegacyTooltipModule } from '@angular/material/legacy-tooltip'; import { MatLegacyButtonModule } from '@angular/material/legacy-button'; import { MatIconModule } from '@angular/material/icon'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; +import { ManageDoisDialogComponent } from 'app/shared/entry/doi/manage-dois/manage-dois-dialog.component'; +import { DoiBadgeComponent } from 'app/shared/entry/doi/doi-badge/doi-badge.component'; @Component({ selector: 'app-workflow', @@ -160,9 +163,11 @@ import { MatLegacyCardModule } from '@angular/material/legacy-card'; AsyncPipe, DatePipe, BaseUrlPipe, + DoiBadgeComponent, ], }) export class WorkflowComponent extends Entry implements AfterViewInit, OnInit { + DoiInitiatorEnum = Doi.InitiatorEnum; workflowEditData: any; public isRefreshing$: Observable; public workflow: BioWorkflow | Service | Notebook; @@ -200,6 +205,8 @@ export class WorkflowComponent extends Entry implements AfterVi public workflowVersionsCtrl: FormControl = new FormControl(null); //control for the selected version public versionFilterCtrl: FormControl = new FormControl(''); // control for the MatSelect filter keyword public filteredVersions: ReplaySubject> = new ReplaySubject>(1); + public selectedVersionDoi: Doi | undefined; + public selectedConceptDoi: Doi | undefined; @Input() user; @Input() selectedVersion: WorkflowVersion; @@ -410,6 +417,7 @@ export class WorkflowComponent extends Entry implements AfterVi if (workflow) { this.published = this.workflow.is_published; this.selectedVersion = this.selectWorkflowVersion(this.workflow.workflowVersions, this.urlVersion, this.workflow.defaultVersion); + this.selectedConceptDoi = this.workflow.conceptDois[this.workflow.doiSelection]; if (this.selectedVersion) { this.workflowService.setWorkflowVersion(this.selectedVersion); this.updateVersionsFileTypes(this.workflow.id, this.selectedVersion.id); @@ -420,6 +428,7 @@ export class WorkflowComponent extends Entry implements AfterVi } else { this.gA4GHFilesService.updateFiles(trsID, this.selectedVersion.name, [this.workflow.descriptorType]); } + this.selectedVersionDoi = this.selectedVersion.dois[this.workflow.doiSelection]; } this.workflowVersionAlphabetical = this.workflow.workflowVersions.slice().sort((a, b) => { return a.name.localeCompare(b.name); @@ -607,6 +616,7 @@ export class WorkflowComponent extends Entry implements AfterVi ]); this.updateVersionsFileTypes(this.workflow.id, this.selectedVersion.id); this.versionAgoMessage = this.dateService.getAgoMessage((this.selectedVersion as WorkflowVersion).last_modified); + this.selectedVersionDoi = this.selectedVersion.dois[this.workflow.doiSelection]; } this.workflowService.setWorkflowVersion(version); this.updateWorkflowUrl(this.workflow); @@ -642,4 +652,11 @@ export class WorkflowComponent extends Entry implements AfterVi openGitHubApp(): void { window.open(Dockstore.GITHUB_APP_INSTALLATION_URL + '/installations/new', '_blank', 'noopener,noreferrer'); } + + manageDois() { + this.dialog.open(ManageDoisDialogComponent, { + width: bootstrap4largeModalSize, + data: { entry: this.workflow, version: this.selectedVersion }, + }); + } } diff --git a/src/main.ts b/src/main.ts index e0f3ec32f4..5639fd2418 100644 --- a/src/main.ts +++ b/src/main.ts @@ -78,6 +78,7 @@ import { VersionModalService } from './app/workflow/version-modal/version-modal. import { ViewService } from './app/workflow/view/view.service'; import { environment } from './environments/environment'; import { EditTopicDialogService } from 'app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.service'; +import { ManageDoisDialogService } from 'app/shared/entry/doi/manage-dois/manage-dois-dialog.service'; if (environment.production) { enableProdMode(); @@ -132,6 +133,7 @@ bootstrapApplication(AppComponent, { ListService, LoginService, LogoutService, + ManageDoisDialogService, MyEntriesQuery, MyEntriesStateService, MyEntriesStore, From 7c7ce9b693966550c36ff401992240c9b7870a7c Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Wed, 7 Aug 2024 09:35:07 -0700 Subject: [PATCH 64/98] Update pipe for release event (#2000) SEAB-6466 --- src/app/search/map-friendly-values.pipe.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/app/search/map-friendly-values.pipe.ts b/src/app/search/map-friendly-values.pipe.ts index 693d5c33d0..04bfa13032 100644 --- a/src/app/search/map-friendly-values.pipe.ts +++ b/src/app/search/map-friendly-values.pipe.ts @@ -121,6 +121,7 @@ export class MapFriendlyValuesPipe implements PipeTransform { ['INSTALL', 'Install'], ['UNINSTALL', 'Uninstall'], ['PUBLISH', 'Publish'], + ['RELEASE', 'Release'], ]), ], [ From 28679d3bb416a9c96f3a5bd3539efe69e7742745 Mon Sep 17 00:00:00 2001 From: Nayeon Hyun <61166764+hyunnaye@users.noreply.github.com> Date: Wed, 7 Aug 2024 17:02:04 -0400 Subject: [PATCH 65/98] DOCK-2137: fix checker workflow field refresh issue (#1998) * fix checker workflow field * review --- .../info-tab-checker-workflow-path.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html index b039035408..ca59adb880 100644 --- a/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html +++ b/src/app/shared/entry/info-tab-checker-workflow-path/info-tab-checker-workflow-path.component.html @@ -1,4 +1,4 @@ -
  • +
  • Checker Workflow: @@ -15,7 +15,7 @@ > visibility View - +
  • +
    + + + {{ entry.topic }} + +

    diff --git a/src/app/organizations/collection/collection.component.ts b/src/app/organizations/collection/collection.component.ts index 6cdf02c3f9..3b2a575f3a 100644 --- a/src/app/organizations/collection/collection.component.ts +++ b/src/app/organizations/collection/collection.component.ts @@ -9,9 +9,9 @@ import { bootstrap4mediumModalSize } from '../../shared/constants'; import { Dockstore } from '../../shared/dockstore.model'; import { TagEditorMode } from '../../shared/enum/tagEditorMode.enum'; import { OrgLogoService } from '../../shared/org-logo.service'; -import { Collection, Organization, OrganizationsService } from '../../shared/openapi'; +import { Collection, Organization, OrganizationsService, Workflow } from '../../shared/openapi'; +import TopicSelectionEnum = Workflow.TopicSelectionEnum; import { ToolDescriptor } from '../../shared/openapi/model/toolDescriptor'; -import { Workflow } from '../../shared/openapi/model/workflow'; import { UserQuery } from '../../shared/user/user.query'; import { ActivatedRoute } from '../../test'; import { CreateCollectionComponent } from '../collections/create-collection/create-collection.component'; @@ -42,6 +42,7 @@ import { ExtendedModule } from '@ngbracket/ngx-layout/extended'; import { RouterLink } from '@angular/router'; import { FlexModule } from '@ngbracket/ngx-layout/flex'; import { HeaderComponent } from '../../header/header.component'; +import { AiBubbleComponent } from '../../shared/ai-bubble/ai-bubble.component'; @Component({ selector: 'app-collection-entry-confirm-remove', @@ -98,6 +99,7 @@ export interface EntryDialogData { MapFriendlyValuesPipe, GravatarPipe, RouterLinkPipe, + AiBubbleComponent, ], }) export class CollectionComponent implements OnInit { @@ -214,4 +216,5 @@ export class CollectionComponent implements OnInit { } protected readonly Dockstore = Dockstore; + protected readonly TopicSelectionEnum = TopicSelectionEnum; } From 840b591f25c648b77d2b79eaafbe2004ca452f79 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 3 Sep 2024 11:43:15 -0400 Subject: [PATCH 73/98] Bump elliptic from 6.5.4 to 6.5.7 (#2009) Bumps [elliptic](https://github.com/indutny/elliptic) from 6.5.4 to 6.5.7. - [Commits](https://github.com/indutny/elliptic/compare/v6.5.4...v6.5.7) --- updated-dependencies: - dependency-name: elliptic dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index 56925d3259..175042d326 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11789,9 +11789,9 @@ "dev": true }, "node_modules/elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "dependencies": { "bn.js": "^4.11.9", @@ -33538,9 +33538,9 @@ "dev": true }, "elliptic": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.4.tgz", - "integrity": "sha512-iLhC6ULemrljPZb+QutR5TQGB+pdW6KGD5RSegS+8sorOZT+rdQFbsQFJgvN3eRqNALqJer4oQ16YvJHlU8hzQ==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", From 82acaad135f7e738f30cf6a758fc39af605a3b77 Mon Sep 17 00:00:00 2001 From: David Steinberg Date: Wed, 4 Sep 2024 10:32:28 -0700 Subject: [PATCH 74/98] Add python version info (#2011) --- .../onboarding/downloadcliclient/downloadcliclient.component.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts index 2dcd1eed9a..64756b879d 100644 --- a/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts +++ b/src/app/loginComponents/onboarding/downloadcliclient/downloadcliclient.component.ts @@ -189,7 +189,7 @@ At this point, you now have the Dockstore CLI set up for interacting with the Do #### Part 6 - Install cwltool (Optional) Dockstore relies on [cwltool](https://github.com/common-workflow-language/cwltool) - a reference implementation of CWL - for local execution of tools and workflows described with CWL. -You'll need to have Python 3 and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine. +You'll need to have Python 3.10+ and [pipx](https://pipx.pypa.io/latest/installation/) to be installed on your machine. **Note:** cwltool must be available on your PATH for the Dockstore CLI to find it. From ca4ab636d93773a8511c10ebafbb8cd3ec7f7c91 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 5 Sep 2024 09:45:02 -0400 Subject: [PATCH 75/98] Bump webpack and @angular-devkit/build-angular (#2010) * Bump webpack and @angular-devkit/build-angular Bumps [webpack](https://github.com/webpack/webpack) to 5.94.0 and updates ancestor dependency [@angular-devkit/build-angular](https://github.com/angular/angular-cli). These dependencies need to be updated together. Updates `webpack` from 5.88.2 to 5.94.0 - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.88.2...v5.94.0) Updates `@angular-devkit/build-angular` from 16.2.14 to 16.2.15 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/16.2.14...16.2.15) --- updated-dependencies: - dependency-name: webpack dependency-type: indirect - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development ... Signed-off-by: dependabot[bot] * Update license file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- THIRD-PARTY-LICENSES.csv | 2 +- package-lock.json | 532 +++++++++++++++++++++++++++------------ package.json | 2 +- 3 files changed, 369 insertions(+), 167 deletions(-) diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 7f6cc32b4c..2a9aca9bd5 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -166,7 +166,7 @@ "get-stream@4.1.0","MIT","https://github.com/sindresorhus/get-stream" "glob@7.2.0","ISC","https://github.com/isaacs/node-glob" "good-listener@1.2.2","MIT","https://github.com/zenorocha/good-listener" -"graceful-fs@4.2.9","ISC","https://github.com/isaacs/node-graceful-fs" +"graceful-fs@4.2.11","ISC","https://github.com/isaacs/node-graceful-fs" "graphlib@2.1.8","MIT","https://github.com/dagrejs/graphlib" "has@1.0.3","MIT","https://github.com/tarruda/has" "heap@0.2.7","MIT","https://github.com/qiao/heap.js" diff --git a/package-lock.json b/package-lock.json index 175042d326..73a3b00c12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", + "@angular-devkit/build-angular": "^16.2.15", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", @@ -127,15 +127,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", - "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", + "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.14", - "@angular-devkit/build-webpack": "0.1602.14", - "@angular-devkit/core": "16.2.14", + "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/build-webpack": "0.1602.15", + "@angular-devkit/core": "16.2.15", "@babel/core": "7.22.9", "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", @@ -147,7 +147,7 @@ "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.14", + "@ngtools/webpack": "16.2.15", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -191,7 +191,7 @@ "tree-kill": "1.2.2", "tslib": "2.6.1", "vite": "4.5.3", - "webpack": "5.88.2", + "webpack": "5.94.0", "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0", @@ -248,6 +248,64 @@ } } }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.15", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/@babel/core": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", @@ -482,13 +540,22 @@ "node": ">=10" } }, + "node_modules/@angular-devkit/build-angular/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", - "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", + "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/architect": "0.1602.15", "rxjs": "7.8.1" }, "engines": { @@ -501,6 +568,70 @@ "webpack-dev-server": "^4.0.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "dev": true, + "dependencies": { + "@angular-devkit/core": "16.2.15", + "rxjs": "7.8.1" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "dev": true, + "dependencies": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "engines": { + "node": "^16.14.0 || >=18.10.0", + "npm": "^6.11.0 || ^7.5.6 || >=8.0.0", + "yarn": ">= 1.13.0" + }, + "peerDependencies": { + "chokidar": "^3.5.2" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@angular-devkit/build-webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "node_modules/@angular-devkit/build-webpack/node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -510,6 +641,15 @@ "tslib": "^2.1.0" } }, + "node_modules/@angular-devkit/build-webpack/node_modules/source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, "node_modules/@angular-devkit/core": { "version": "16.2.14", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.14.tgz", @@ -3898,9 +4038,9 @@ } }, "node_modules/@cypress/webpack-batteries-included-preprocessor/node_modules/webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, "dependencies": { "@webassemblyjs/ast": "1.9.0", @@ -5544,9 +5684,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngtools/webpack": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", - "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", + "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -6839,26 +6979,6 @@ "integrity": "sha512-lhnbkC0XorAD7Dt7X+94cXUSHEdDNnEVk/DgFLHgIZQNhixV631Lj4+KpXunTT5rCHyj9RqK3TfO7QrOiwEeUQ==", "dev": true }, - "node_modules/@types/eslint": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", - "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "node_modules/@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -6896,9 +7016,9 @@ "dev": true }, "node_modules/@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -7055,9 +7175,9 @@ "dev": true }, "node_modules/@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "dependencies": { "@types/node": "*" @@ -7904,10 +8024,10 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "peerDependencies": { "acorn": "^8" @@ -11918,9 +12038,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -13020,6 +13140,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "node_modules/fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -13766,9 +13892,9 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "node_modules/graphlib": { "version": "2.1.8", @@ -15782,9 +15908,9 @@ } }, "node_modules/launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", + "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -23501,9 +23627,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", @@ -23842,34 +23968,33 @@ "dev": true }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -24035,15 +24160,15 @@ } }, "node_modules/webpack-dev-server/node_modules/ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -24117,9 +24242,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "engines": { "node": ">=10.0.0" @@ -24585,15 +24710,15 @@ } }, "@angular-devkit/build-angular": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.14.tgz", - "integrity": "sha512-bXQ6i7QPhwmYHuh+DSNkBhjTIHQF0C6fqZEg2ApJA3NmnzE98oQnmJ9AnGnAkdf1Mjn3xi2gxoZWPDDxGEINMw==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", + "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.14", - "@angular-devkit/build-webpack": "0.1602.14", - "@angular-devkit/core": "16.2.14", + "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/build-webpack": "0.1602.15", + "@angular-devkit/core": "16.2.15", "@babel/core": "7.22.9", "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", @@ -24605,7 +24730,7 @@ "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.14", + "@ngtools/webpack": "16.2.15", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -24650,13 +24775,51 @@ "tree-kill": "1.2.2", "tslib": "2.6.1", "vite": "4.5.3", - "webpack": "5.88.2", + "webpack": "5.94.0", "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", "webpack-merge": "5.9.0", "webpack-subresource-integrity": "5.1.0" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.2.15", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/core": { + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "dev": true, + "requires": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + } + } + }, "@babel/core": { "version": "7.22.9", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.22.9.tgz", @@ -24816,19 +24979,67 @@ "requires": { "lru-cache": "^6.0.0" } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true } } }, "@angular-devkit/build-webpack": { - "version": "0.1602.14", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.14.tgz", - "integrity": "sha512-f+ZTCjOoA1SCQEaX3L/63ubqr/vlHkwDXAtKjBsQgyz6srnETcjy96Us5k/LoK7/hPc85zFneqLinfqOMVWHJQ==", + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", + "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1602.14", + "@angular-devkit/architect": "0.1602.15", "rxjs": "7.8.1" }, "dependencies": { + "@angular-devkit/architect": { + "version": "0.1602.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", + "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "dev": true, + "requires": { + "@angular-devkit/core": "16.2.15", + "rxjs": "7.8.1" + } + }, + "@angular-devkit/core": { + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", + "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "dev": true, + "requires": { + "ajv": "8.12.0", + "ajv-formats": "2.1.1", + "jsonc-parser": "3.2.0", + "picomatch": "2.3.1", + "rxjs": "7.8.1", + "source-map": "0.7.4" + } + }, + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -24837,6 +25048,12 @@ "requires": { "tslib": "^2.1.0" } + }, + "source-map": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", + "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==", + "dev": true } } }, @@ -27347,9 +27564,9 @@ } }, "webpack": { - "version": "4.46.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.46.0.tgz", - "integrity": "sha512-6jJuJjg8znb/xRItk7bkT0+Q7AHCYjjFnvKIWQPkNIOyRqoCGvkOs0ipeQzrqz4l5FtN5ZI/ukEHroeX/o1/5Q==", + "version": "4.47.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.47.0.tgz", + "integrity": "sha512-td7fYwgLSrky3fI1EuU5cneU4+pbH6GgOfuKNS1tNPcfdGinGELAqsb/BP4nnvZyKSG2i/xFGU7+n2PvZA8HJQ==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", @@ -28664,9 +28881,9 @@ } }, "@ngtools/webpack": { - "version": "16.2.14", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.14.tgz", - "integrity": "sha512-3+zPP3Wir46qrZ3FEiTz5/emSoVHYUCH+WgBmJ57mZCx1qBOYh2VgllnPr/Yusl1sc/jUZjdwq/es/9ZNw+zDQ==", + "version": "16.2.15", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", + "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", "dev": true, "requires": {} }, @@ -29657,26 +29874,6 @@ "integrity": "sha512-lhnbkC0XorAD7Dt7X+94cXUSHEdDNnEVk/DgFLHgIZQNhixV631Lj4+KpXunTT5rCHyj9RqK3TfO7QrOiwEeUQ==", "dev": true }, - "@types/eslint": { - "version": "8.4.8", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.8.tgz", - "integrity": "sha512-zUCKQI1bUCTi+0kQs5ZQzQ/XILWRLIlh15FXWNykJ+NG3TMKMVvwwC6GP3DR1Ylga15fB7iAExSzc4PNlR5i3w==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -29714,9 +29911,9 @@ "dev": true }, "@types/http-proxy": { - "version": "1.17.14", - "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.14.tgz", - "integrity": "sha512-SSrD0c1OQzlFX7pGu1eXxSEjemej64aaNPRhhVYUGqXh0BtldAAx37MG8btcumvpgKyZp1F5Gn3JkktdxiFv6w==", + "version": "1.17.15", + "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz", + "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==", "dev": true, "requires": { "@types/node": "*" @@ -29873,9 +30070,9 @@ "dev": true }, "@types/ws": { - "version": "8.5.10", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", - "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", + "version": "8.5.12", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.12.tgz", + "integrity": "sha512-3tPRkv1EtkDpzlgyKyI8pGsGZAGPEaXeu0DOj5DI25Ja91bdAYddYHbADRYVrZMRbfW+1l5YwXVDKohDJNQxkQ==", "dev": true, "requires": { "@types/node": "*" @@ -30518,10 +30715,10 @@ } } }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "acorn-import-attributes": { + "version": "1.9.5", + "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz", + "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==", "dev": true, "requires": {} }, @@ -33644,9 +33841,9 @@ "dev": true }, "enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -34486,6 +34683,12 @@ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-uri": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.1.tgz", + "integrity": "sha512-MWipKbbYiYI0UC7cl8m/i/IWTqfC8YXsqjzybjddLsFjStroQzsHXkc73JutMvBiXmOvapk+axIl79ig5t55Bw==", + "dev": true + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", @@ -35081,9 +35284,9 @@ } }, "graceful-fs": { - "version": "4.2.9", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", - "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, "graphlib": { "version": "2.1.8", @@ -36600,9 +36803,9 @@ "dev": true }, "launch-editor": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", - "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", + "version": "2.8.2", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", + "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", "dev": true, "requires": { "picocolors": "^1.0.0", @@ -42596,9 +42799,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -42893,34 +43096,33 @@ "dev": true }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "dependencies": { @@ -43036,15 +43238,15 @@ }, "dependencies": { "ajv": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.16.0.tgz", - "integrity": "sha512-F0twR8U1ZU67JIEtekUcLkXkoO5mMMmgGD8sK/xUFzJ805jxHQl92hImFAqqXMyMYjSPOyUPAwHYhB72g5sTXw==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.4.1" + "require-from-string": "^2.0.2" } }, "ajv-keywords": { @@ -43094,9 +43296,9 @@ } }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, "requires": {} } diff --git a/package.json b/package.json index 550e37ca38..d3c2819455 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.14", + "@angular-devkit/build-angular": "^16.2.15", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", From e7ebadeed42410e4d0fe3d564b7eeebb8809aa58 Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Fri, 6 Sep 2024 10:23:17 -0400 Subject: [PATCH 76/98] Fix ChromeDriver syntax error on install (#2013) * Update config.yml --- .circleci/config.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index f39ed4b04c..977613a8f5 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -3,7 +3,7 @@ orbs: aws-s3: circleci/aws-s3@3.0.0 aws-cli: circleci/aws-cli@3.1.1 slack: circleci/slack@4.4.4 - browser-tools: circleci/browser-tools@1.4.7 + browser-tools: circleci/browser-tools@1.4.8 executors: integration_test_exec: # declares a reusable executor docker: From 0d09df41aac2e605f947f5d2894f3f23e6fd8a68 Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Mon, 9 Sep 2024 09:29:05 -0400 Subject: [PATCH 77/98] Edit topic dialog improvements to manual and AI topics (#2012) https://github.com/dockstore/dockstore/issues/5959 / https://ucsc-cgl.atlassian.net/browse/DOCK-2562 https://github.com/dockstore/dockstore/issues/5942 / https://ucsc-cgl.atlassian.net/browse/DOCK-2552 * Improve manual topic description for GitHub App entries by adding info button * Make AI topics copyable * Autosize manual topic field --- .../manage-dois-dialog.component.html | 52 +++--- .../manage-dois-dialog.component.scss | 9 - .../manage-dois-dialog.component.ts | 2 +- .../edit-topic-dialog.component.html | 162 ++++++++++-------- .../edit-topic-dialog.component.scss | 10 -- .../edit-topic/edit-topic-dialog.component.ts | 12 +- src/app/shared/styles/radio-button-cards.scss | 41 +++++ 7 files changed, 171 insertions(+), 117 deletions(-) delete mode 100644 src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss create mode 100644 src/app/shared/styles/radio-button-cards.scss diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html index 6ee6edc9c8..13c8b6fcd9 100644 --- a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.html @@ -12,33 +12,33 @@

    Manage DOIs

    info This {{ entryTypeMetadata.term }} has no DOIs.

    Select which DOI to display publicly:

    - -
    - - -
    - - {{ doiInfo.key | titlecase }} -
    -
    - Manually created by a user in the Dockstore UI. - - Automatically created by Dockstore for valid tags belonging to published {{ entryTypeMetadata.termPlural }}. - - Created by Zenodo's integration with GitHub. -
    - - Version DOI: - - n/a + + + +
    + + {{ doiInfo.key | titlecase }} +
    +
    +
    +
    + Manually created by a user in the Dockstore UI. + + Automatically created by Dockstore for valid tags belonging to published {{ entryTypeMetadata.termPlural }}. - - Concept DOI: - - - - -
    + Created by Zenodo's integration with GitHub. +
    + + Version DOI: + + n/a + + + Concept DOI: + + +
    +
    diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss deleted file mode 100644 index 7a9b2dbddd..0000000000 --- a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.scss +++ /dev/null @@ -1,9 +0,0 @@ -// This style ensures that the mat radio content text fills up the whole mat-card -:host ::ng-deep .mat-radio-label-content { - width: 100%; -} - -// Wraps the text because by default, mat-radio-label doesn't wrap -:host ::ng-deep .mat-radio-label { - white-space: normal; -} diff --git a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts index 2b421fe3d2..595d86aa62 100644 --- a/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts +++ b/src/app/shared/entry/doi/manage-dois/manage-dois-dialog.component.ts @@ -25,7 +25,7 @@ export interface DoiInfo { @Component({ selector: 'app-manage-dois-dialog', templateUrl: './manage-dois-dialog.component.html', - styleUrls: ['./manage-dois-dialog.component.scss'], + styleUrls: ['../../../styles/radio-button-cards.scss'], standalone: true, imports: [ MatLegacyDialogModule, diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html index 85cd5f981e..06e03f7304 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.html @@ -5,80 +5,104 @@

    Select a Topic

    {{ topicOptions.length }} type{{ topicOptions.length === 1 ? '' : 's' }} of topic{{ topicOptions.length === 1 ? '' : 's' }} that you can choose from:

    -
    - - - -
    -
    - - edit - GitHub icon - AI generation icon - - {{ topicOption.label }} -
    - checkmark Approved + + + +
    +
    + + edit + GitHub icon + AI generation icon + + {{ topicOption.label }}
    -
    {{ topicOption.description }}
    - - - checkmark Approved - info You have not approved this topic. Click Save to confirm that you - have reviewed and approved the topic. Otherwise, select another topic. - +
    +
    +
    +
    + {{ topicOption.description }} + info +
    + + + + info You have not approved this topic. Click Save to confirm that you + have reviewed and approved the topic. Otherwise, select another topic. + -
    + {{ topicOption.value || 'Not Available' }} +
    - - file_copy + +
    + + + + + +
    +
    +
    diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss index 733970e3da..51d797084b 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.scss @@ -2,16 +2,6 @@ @import 'materialColorScheme.scss'; -// This style ensures that the mat radio content text fills up the whole mat-card -:host ::ng-deep .mat-radio-label-content { - width: 100%; -} - -// Wraps the text because by default, mat-radio-label doesn't wrap -:host ::ng-deep .mat-radio-label { - white-space: normal; -} - .approved { color: white !important; background-color: $accent-3-dark; diff --git a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts index 1ef9b531de..9476604829 100644 --- a/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts +++ b/src/app/shared/entry/info-tab-topic/edit-topic/edit-topic-dialog.component.ts @@ -33,6 +33,9 @@ import { MatLegacyCardModule } from '@angular/material/legacy-card'; import { EditTopicDialogService } from './edit-topic-dialog.service'; import { EntryActionsService } from 'app/shared/entry-actions/entry-actions.service'; import { MatRadioChange } from '@angular/material/radio'; +import { Dockstore } from 'app/shared/dockstore.model'; +import { ClipboardModule } from '@angular/cdk/clipboard'; +import { SnackbarDirective } from 'app/shared/snackbar.directive'; export interface EditTopicDialogData { entry: DockstoreTool | Workflow; @@ -48,7 +51,7 @@ export interface TopicOption { @Component({ selector: 'app-edit-topic-dialog', templateUrl: './edit-topic-dialog.component.html', - styleUrls: ['./edit-topic-dialog.component.scss'], + styleUrls: ['./edit-topic-dialog.component.scss', '../../../styles/radio-button-cards.scss'], standalone: true, imports: [ MatLegacyDialogModule, @@ -66,9 +69,12 @@ export interface TopicOption { MatIconModule, MatLegacyCardModule, NgFor, + ClipboardModule, + SnackbarDirective, ], }) export class EditTopicDialogComponent { + Dockstore = Dockstore; TopicSelectionEnum = Entry.TopicSelectionEnum; entry: Workflow | DockstoreTool; entryType: EntryType; @@ -97,7 +103,9 @@ export class EditTopicDialogComponent { const manualTopicOption: TopicOption = { type: this.TopicSelectionEnum.MANUAL, label: 'Manual', - description: `Entered manually by the user${this.isGitHubAppEntry ? 'in the .dockstore.yml.' : '.'}`, + description: this.isGitHubAppEntry + ? 'Specified in the .dockstore.yml file on GitHub. Edit the topic field in the .dockstore.yml to change the topic.' + : 'Entered manually by the user.', value: this.entry.topicManual, }; const automaticTopicOption: TopicOption = { diff --git a/src/app/shared/styles/radio-button-cards.scss b/src/app/shared/styles/radio-button-cards.scss new file mode 100644 index 0000000000..6b3b0c4f39 --- /dev/null +++ b/src/app/shared/styles/radio-button-cards.scss @@ -0,0 +1,41 @@ +/* + * Copyright 2024 OICR + * + * Licensed under the Apache License, Version 2.0 (the "License") + * you may not use this file except in compliance with the License + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +@use '@angular/material' as mat; +@import 'materialColorScheme.scss'; + +// This file contains styles for mat-cards with radio buttons + +// This style ensures that the mat radio content text fills up the whole mat-card +:host ::ng-deep .mat-radio-label-content { + width: 100%; +} + +// Wraps the text because by default, mat-radio-label doesn't wrap +:host ::ng-deep .mat-radio-label { + white-space: normal; +} + +:host ::ng-deep .mat-form-field-wrapper { + // Removing the padding because we don't need hint + padding-bottom: 0; +} + +// Highlights the card with the selected radio button +.selected-card { + border-width: 0.15rem; + border-color: mat.get-color-from-palette($kim-secondary, 2); +} From f2f3cf67900a632abafa4f279d976a636d1c70f5 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Tue, 10 Sep 2024 15:57:46 -0700 Subject: [PATCH 78/98] display "Warnings" status in lambda logs https://ucsc-cgl.atlassian.net/browse/DOCK-2469 --- cypress/e2e/group2/myworkflows.ts | 2 +- cypress/e2e/group3/githubAppTools.ts | 2 +- .../github-apps-logs/github-apps-logs.component.html | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/cypress/e2e/group2/myworkflows.ts b/cypress/e2e/group2/myworkflows.ts index 983acc8cc0..bc1dbb5a24 100644 --- a/cypress/e2e/group2/myworkflows.ts +++ b/cypress/e2e/group2/myworkflows.ts @@ -133,7 +133,7 @@ describe('Dockstore my workflows', () => { }).as('Default sort'); cy.contains('Apps Logs').click(); // Check that app logs contain the correct columns - const appLogColumns = ['Date', 'GitHub Username', 'Entry Name', 'Delivery ID', 'Repository', 'Reference', 'Success', 'Type']; + const appLogColumns = ['Date', 'GitHub Username', 'Entry Name', 'Delivery ID', 'Repository', 'Reference', 'Status', 'Type']; appLogColumns.forEach((column) => cy.contains(column)); // These next 2 values work on Circle CI (UTC?) I would have thought East Coast time, but there's an 8 hour diff with West Coast time. Confused cy.contains('2020-02-20T02:20'); diff --git a/cypress/e2e/group3/githubAppTools.ts b/cypress/e2e/group3/githubAppTools.ts index fc224a4a3c..68e650f897 100644 --- a/cypress/e2e/group3/githubAppTools.ts +++ b/cypress/e2e/group3/githubAppTools.ts @@ -142,7 +142,7 @@ describe('GitHub App Tools', () => { 'Organization', 'Repository', 'Reference', - 'Success', + 'Status', 'Type', ]; appLogColumns.forEach((column) => cy.contains(column)); diff --git a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html index 3502e41310..65a0b382c7 100644 --- a/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html +++ b/src/app/myworkflows/sidebar-accordion/github-apps-logs/github-apps-logs.component.html @@ -62,8 +62,12 @@

    GitHub App Logs

    - Success - {{ element.ignored ? 'Ignored' : (column | mapFriendlyValue: element[column]) }} + Status + + {{ + element.ignored ? 'Ignored' : element.success && element.message ? 'Warnings' : (column | mapFriendlyValue: element[column]) + }} +
    {{ column | titlecase }} From ccae736661430bb6c5f6d78b3fee90f479b13ba7 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Thu, 12 Sep 2024 09:38:38 -0700 Subject: [PATCH 79/98] change smoke test to delay refresh until after restub https://ucsc-cgl.atlassian.net/browse/SEAB-6535 --- cypress/e2e/smokeTests/sharedTests/auth-tests.ts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts index 3eea3bd3c9..58361131e4 100644 --- a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts +++ b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts @@ -267,7 +267,13 @@ function testWorkflow(registry: string, repo: string, name: string) { cy.get('#publishButton').contains('Unpublish').click({ force: true }); goToTab('Info'); + cy.intercept('**/restub').as('restub'); cy.contains('button', 'Restub').click(); + // Wait for the restub request to complete, so that it does not overlap + // with the subsequent refresh and occasionally trigger a db error on + // the webservice. + // See https://ucsc-cgl.atlassian.net/browse/SEAB-6535 + cy.wait('@restub'); // This fails because DOI is auto issued when published, and restub fails. // See https://ucsc-gi.slack.com/archives/C05EZH3RVNY/p1718128426265779 // cy.contains('button', 'Publish').should('be.disabled'); From 20802cb82a2e4faa9c0ede000151230447a7ab95 Mon Sep 17 00:00:00 2001 From: Nayeon Hyun <61166764+hyunnaye@users.noreply.github.com> Date: Thu, 12 Sep 2024 12:43:10 -0400 Subject: [PATCH 80/98] DOCK-2533: fix regex errors in Edit Info dialog (#2014) * fix regex' * test * test * test * test * test * test * test * test * test * test * fix * fix --- src/app/shared/validationMessages.model.ts | 44 +++++++++---------- .../version-modal.service.spec.ts | 13 ++++++ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/app/shared/validationMessages.model.ts b/src/app/shared/validationMessages.model.ts index ed5dc99607..306fe4ba9d 100644 --- a/src/app/shared/validationMessages.model.ts +++ b/src/app/shared/validationMessages.model.ts @@ -67,29 +67,29 @@ export const exampleDescriptorPatterns = { }; export const validationDescriptorPatterns = { - gitPath: '^([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)/([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)$', - smkPath: '^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$', - cwlPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)', - wdlPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$', - nflPath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)', - dockerfilePath: '^/([^/?:*|<>]+/)*(([a-zA-Z]+[.])?Dockerfile|Dockerfile([.][a-zA-Z]+)?)$', - testFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - imagePath: '^(([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)|_)/([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)$', - repoNameWithSlashesImagePath: '^(([a-zA-Z0-9]+([-_.][a-zA-Z0-9]+)*)|_)/([a-zA-Z0-9]+([-_./][a-zA-Z0-9]+)*)$', - privateAmazonImagePath: '^_/([a-zA-Z0-9]+([-_./][a-zA-Z0-9]+)*)$', // Has an empty namespace. Allows for slashes in repo name - toolName: '^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*$', - label: '^(| *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)( *, *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))* *)$', - versionTag: '^[a-zA-Z0-9]+([-_.]*[a-zA-Z0-9]+)*$', - reference: '[\\w-]+((/|.)[\\w-]+)*', - workflowDescriptorPath: '^/([^\\/?:*|<>]+/)*(Snakefile|[^\\/?:*|<>]+.(smk|cwl|wdl|yaml|yml|config|ga))', - workflowName: '[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*', - cwlTestParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - wdlTestParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', - testParameterFilePath: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(json|yml|yaml)$', + gitPath: '^([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)\\/([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)$', + smkPath: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$', + cwlPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)', + wdlPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$', + nflPath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)', + dockerfilePath: '^\\/([^\\/?:*\\|<>]+\\/)*(([a-zA-Z]+[.])?Dockerfile|Dockerfile([.][a-zA-Z]+)?)$', + testFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + imagePath: '^(([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)|_)\\/([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)$', + repoNameWithSlashesImagePath: '^(([a-zA-Z0-9]+([\\-_.][a-zA-Z0-9]+)*)|_)\\/([a-zA-Z0-9]+([\\-_.\\/][a-zA-Z0-9]+)*)$', + privateAmazonImagePath: '^_\\/([a-zA-Z0-9]+([\\-_.\\/][a-zA-Z0-9]+)*)$', // Has an empty namespace. Allows for slashes in repo name + toolName: '^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*$', + label: '^(\\| *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*)( *, *([a-zA-Z0-9]+(-[a-zA-Z0-9]+)*))* *)$', + versionTag: '^[a-zA-Z0-9]+([\\-_.]*[a-zA-Z0-9]+)*$', + reference: '[\\w\\-]+((\\/|.)[\\w\\-]+)*', + workflowDescriptorPath: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^\\/?:*\\|<>]+.(smk|cwl|wdl|yaml|yml|config|ga))', + workflowName: '[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*', + cwlTestParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + wdlTestParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', + testParameterFilePath: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(json|yml|yaml)$', // This should be used for all validation patterns that are alphanumeric with internal underscores, hyphens, and periods. - alphanumericInternalUHP: '^[a-zA-Z0-9]+([-_.]*[a-zA-Z0-9]+)*$', - amazonDockerRegistryPath: '(^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.amazonaws.com)|(public.ecr.aws)', // public and private path - privateAmazonDockerRegistryPath: '^[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([-_][a-zA-Z0-9]+)*.amazonaws.com', + alphanumericInternalUHP: '^[a-zA-Z0-9]+([\\-_.]*[a-zA-Z0-9]+)*$', + amazonDockerRegistryPath: '(^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.amazonaws.com)|(public.ecr.aws)', // public and private path + privateAmazonDockerRegistryPath: '^[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.dkr.ecr.[a-zA-Z0-9]+([\\-_][a-zA-Z0-9]+)*.amazonaws.com', sevenBridgesDockerRegistryPath: '^([a-zA-Z0-9]+-)?images.sbgenomics.com', }; diff --git a/src/app/workflow/version-modal/version-modal.service.spec.ts b/src/app/workflow/version-modal/version-modal.service.spec.ts index a84e26efe6..9f2d4f73b8 100644 --- a/src/app/workflow/version-modal/version-modal.service.spec.ts +++ b/src/app/workflow/version-modal/version-modal.service.spec.ts @@ -27,6 +27,7 @@ import { RefreshStubService, WorkflowsStubService, WorkflowStubService } from '. import { VersionModalService } from './version-modal.service'; import { BioWorkflow, Workflow } from '../../shared/openapi'; import DescriptorTypeSubclassEnum = Workflow.DescriptorTypeSubclassEnum; +import { validationDescriptorPatterns } from '../../shared/validationMessages.model'; describe('Service: version-modal.service.ts', () => { let workflowQuery: jasmine.SpyObj; @@ -79,4 +80,16 @@ describe('Service: version-modal.service.ts', () => { alertQuery.message$.subscribe((refreshMessage) => expect(refreshMessage).toEqual('')); } )); + it('regex should still be correct', () => { + const regexp: RegExp = new RegExp(validationDescriptorPatterns.cwlPath); + expect(regexp.test('/Dockstore.cwl')).toBeTruthy(); + expect(regexp.test('/Dockstore.yaml')).toBeTruthy(); + expect(regexp.test('/Dockstore.cw')).toBeFalsy(); + }); + + it('regex should still be valid in v mode', () => { + for (const [, pattern] of Object.entries(validationDescriptorPatterns)) { + expect(new RegExp(pattern, 'v')).toBeTruthy(); + } + }); }); From 6a73bf074c4e23f29ad704433ebf6492e8c5e466 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 18 Sep 2024 10:32:23 -0400 Subject: [PATCH 81/98] Bump dompurify from 2.4.1 to 2.5.4 (#2018) * Bump dompurify from 2.4.1 to 2.5.4 Bumps [dompurify](https://github.com/cure53/DOMPurify) from 2.4.1 to 2.5.4. - [Release notes](https://github.com/cure53/DOMPurify/releases) - [Commits](https://github.com/cure53/DOMPurify/compare/2.4.1...2.5.4) --- updated-dependencies: - dependency-name: dompurify dependency-type: direct:production ... Signed-off-by: dependabot[bot] * Update license file --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- THIRD-PARTY-LICENSES.csv | 1 + package-lock.json | 26 +++++++++++++++++++------- package.json | 2 +- 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/THIRD-PARTY-LICENSES.csv b/THIRD-PARTY-LICENSES.csv index 2a9aca9bd5..e2aac73b2c 100644 --- a/THIRD-PARTY-LICENSES.csv +++ b/THIRD-PARTY-LICENSES.csv @@ -143,6 +143,7 @@ "delaunator@5.0.0","ISC","https://github.com/mapbox/delaunator" "delegate@3.2.0","MIT","https://github.com/zenorocha/delegate" "dompurify@2.4.1","(MPL-2.0 OR Apache-2.0)","https://github.com/cure53/DOMPurify" +"dompurify@2.5.4","(MPL-2.0 OR Apache-2.0)","https://github.com/cure53/DOMPurify" "duplexify@3.7.1","MIT","https://github.com/mafintosh/duplexify" "emoji-toolkit@7.0.1","MIT","https://github.com/joypixels/emoji-toolkit" "encoding@0.1.13","MIT","https://github.com/andris9/encoding" diff --git a/package-lock.json b/package-lock.json index 73a3b00c12..9b8b8a45e2 100644 --- a/package-lock.json +++ b/package-lock.json @@ -35,7 +35,7 @@ "cytoscape": "^3.19.0", "cytoscape-dagre": "^2.3.2", "cytoscape-popper": "^2.0.0", - "dompurify": "^2.2.9", + "dompurify": "^2.5.4", "file-saver": "^2.0.5", "ini": "^4.1.1", "jquery": "^3.6.0", @@ -11799,9 +11799,9 @@ } }, "node_modules/dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.4.tgz", + "integrity": "sha512-l5NNozANzaLPPe0XaAwvg3uZcHtDBnziX/HjsY1UcDj1MxTK8Dd0Kv096jyPK5HRzs/XM5IMj20dW8Fk+HnbUA==" }, "node_modules/domutils": { "version": "3.1.0", @@ -16924,6 +16924,12 @@ "uuid": "^9.0.0" } }, + "node_modules/mermaid/node_modules/dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "optional": true + }, "node_modules/mermaid/node_modules/uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", @@ -33635,9 +33641,9 @@ } }, "dompurify": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", - "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==" + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.5.4.tgz", + "integrity": "sha512-l5NNozANzaLPPe0XaAwvg3uZcHtDBnziX/HjsY1UcDj1MxTK8Dd0Kv096jyPK5HRzs/XM5IMj20dW8Fk+HnbUA==" }, "domutils": { "version": "3.1.0", @@ -37591,6 +37597,12 @@ "uuid": "^9.0.0" }, "dependencies": { + "dompurify": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.4.1.tgz", + "integrity": "sha512-ewwFzHzrrneRjxzmK6oVz/rZn9VWspGFRDb4/rRtIsM1n36t9AKma/ye8syCpcw+XJ25kOK/hOG7t1j2I2yBqA==", + "optional": true + }, "uuid": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.0.tgz", diff --git a/package.json b/package.json index d3c2819455..5249061cfb 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "cytoscape": "^3.19.0", "cytoscape-dagre": "^2.3.2", "cytoscape-popper": "^2.0.0", - "dompurify": "^2.2.9", + "dompurify": "^2.5.4", "file-saver": "^2.0.5", "ini": "^4.1.1", "jquery": "^3.6.0", From 29a53fcc8a27f0baa834725a53541c05e6790760 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 19 Sep 2024 11:09:32 -0400 Subject: [PATCH 82/98] Bump express from 4.19.2 to 4.21.0 (#2020) Bumps [express](https://github.com/expressjs/express) from 4.19.2 to 4.21.0. - [Release notes](https://github.com/expressjs/express/releases) - [Changelog](https://github.com/expressjs/express/blob/4.21.0/History.md) - [Commits](https://github.com/expressjs/express/compare/4.19.2...4.21.0) --- updated-dependencies: - dependency-name: express dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 377 +++++++++++++++++++++++++++------------------- 1 file changed, 222 insertions(+), 155 deletions(-) diff --git a/package-lock.json b/package-lock.json index 9b8b8a45e2..2571a0d4d9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8916,9 +8916,9 @@ "dev": true }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "dependencies": { "bytes": "3.1.2", @@ -8929,7 +8929,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -8967,12 +8967,12 @@ } }, "node_modules/body-parser/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -9380,15 +9380,16 @@ } }, "node_modules/call-bind": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", - "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "set-function-length": "^1.2.0" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" }, "engines": { "node": ">= 0.4" @@ -11519,18 +11520,20 @@ } }, "node_modules/define-data-property": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", - "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "dependencies": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "gopd": "^1.0.1" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/define-lazy-prop": { @@ -12128,6 +12131,18 @@ "is-arrayish": "^0.2.1" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -12843,37 +12858,37 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -12902,14 +12917,23 @@ "ms": "2.0.0" } }, + "node_modules/express/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/express/node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -12939,12 +12963,12 @@ } }, "node_modules/express/node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -13943,21 +13967,21 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true, "engines": { "node": ">= 0.4" @@ -14092,9 +14116,9 @@ } }, "node_modules/hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -16886,10 +16910,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -18434,10 +18461,13 @@ } }, "node_modules/object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true, + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19244,9 +19274,9 @@ } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "node_modules/path-type": { @@ -20742,9 +20772,9 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "dependencies": { "debug": "2.6.9", @@ -20898,20 +20928,29 @@ "dev": true }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" } }, + "node_modules/serve-static/node_modules/encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -20919,17 +20958,17 @@ "dev": true }, "node_modules/set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "dependencies": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -21039,14 +21078,18 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -31409,9 +31452,9 @@ "dev": true }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -31422,7 +31465,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -31453,12 +31496,12 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } } } @@ -31767,15 +31810,16 @@ "dev": true }, "call-bind": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.6.tgz", - "integrity": "sha512-Mj50FLHtlsoVfRfnHaZvyrooHcrlceNZdL/QBvJJVd9Ta55qCQK0gs4ss2oZDeV9zFCs6ewzYgVE5yfVmfFpVg==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dev": true, "requires": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", - "set-function-length": "^1.2.0" + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -33417,15 +33461,14 @@ } }, "define-data-property": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.2.tgz", - "integrity": "sha512-SRtsSqsDbgpJBbW3pABMCOt6rQyeM8s8RiyeSN8jYG8sYmt/kGJejbydttUsnDs1tadr19tvhT4ShwMyoqAm4g==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", "dev": true, "requires": { + "es-define-property": "^1.0.0", "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.2", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "gopd": "^1.0.1" } }, "define-lazy-prop": { @@ -33913,6 +33956,15 @@ "is-arrayish": "^0.2.1" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.4" + } + }, "es-errors": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", @@ -34456,37 +34508,37 @@ "dev": true }, "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.0", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", + "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.10", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -34509,14 +34561,20 @@ "ms": "2.0.0" } }, + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -34540,12 +34598,12 @@ } }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "safe-buffer": { @@ -35332,18 +35390,18 @@ "dev": true }, "has-property-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", - "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dev": true, "requires": { - "get-intrinsic": "^1.2.2" + "es-define-property": "^1.0.0" } }, "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", "dev": true }, "has-symbols": { @@ -35440,9 +35498,9 @@ } }, "hasown": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", - "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "requires": { "function-bind": "^1.1.2" @@ -37562,9 +37620,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true }, "merge-stream": { @@ -38783,9 +38841,9 @@ } }, "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-path": { @@ -39414,9 +39472,9 @@ } }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", + "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", "dev": true }, "path-type": { @@ -40531,9 +40589,9 @@ } }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", @@ -40669,15 +40727,23 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" + }, + "dependencies": { + "encodeurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "dev": true + } } }, "set-blocking": { @@ -40687,17 +40753,17 @@ "dev": true }, "set-function-length": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.1.tgz", - "integrity": "sha512-j4t6ccc+VsKwYHso+kElc5neZpjtq9EnRICFZtWyBsLojhmeF/ZBd/elqm22WJh/BziDe/SBiOeAt0m2mfLD0g==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", "dev": true, "requires": { - "define-data-property": "^1.1.2", + "define-data-property": "^1.1.4", "es-errors": "^1.3.0", "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.3", + "get-intrinsic": "^1.2.4", "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.1" + "has-property-descriptors": "^1.0.2" } }, "set-value": { @@ -40782,14 +40848,15 @@ "dev": true }, "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", + "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", "dev": true, "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" } }, "signal-exit": { From c874826688492a33f59498326edd3dceaa3ca4e6 Mon Sep 17 00:00:00 2001 From: Charles Overbeck Date: Fri, 20 Sep 2024 16:45:32 -0700 Subject: [PATCH 83/98] Smoke Tests fixes (#2021) * Get auth smoke tests passing on QA SEAB-6674 --- .circleci/config.yml | 6 ++++++ cypress.config.ts | 4 ++-- cypress/e2e/group3/githubAppTools.ts | 5 ++++- cypress/e2e/immutableDatabaseTests/dropdown.ts | 3 ++- .../e2e/smokeTests/sharedTests/auth-tests.ts | 5 ++--- .../requests/requests.component.html | 17 +++++++++++++---- .../requests/requests.component.ts | 6 ++++++ .../workflow/versions/versions.component.html | 1 + src/app/workflow/versions/versions.component.ts | 4 ++++ 9 files changed, 40 insertions(+), 11 deletions(-) diff --git a/.circleci/config.yml b/.circleci/config.yml index 977613a8f5..c0b0cf9a31 100644 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -80,6 +80,10 @@ jobs: password: $DOCKERHUB_PASSWORD steps: - setup_nightly_tests + - run: + name: Reset dockstoretestuser4's resources + # Reset user dockstoretestuser4's resources such that it has no registered tools and published workflows + command: bash scripts/reset-dockstoretestuser4-resources.sh << parameters.stack >> - run: name: Run remote verification test against << parameters.stack >> (with auth) command: bash -i -c 'npm run test-<< parameters.stack >>-auth' @@ -89,6 +93,8 @@ jobs: name: Reset dockstoretestuser4's resources # Reset user dockstoretestuser4's resources such that it has no registered tools and published workflows command: bash scripts/reset-dockstoretestuser4-resources.sh << parameters.stack >> + # Reset even if the tests failed + when: always - upload_nightly_artifacts - slack/notify: channel: $<< parameters.stack >>_id diff --git a/cypress.config.ts b/cypress.config.ts index c26c4d4535..1c682b7662 100644 --- a/cypress.config.ts +++ b/cypress.config.ts @@ -2,8 +2,8 @@ import { defineConfig } from 'cypress' export default defineConfig({ projectId: '1ya4vj', - viewportHeight: 900, - viewportWidth: 1440, + viewportHeight: 1080, + viewportWidth: 1920, defaultCommandTimeout: 30000, requestTimeout: 30000, experimentalMemoryManagement: true, diff --git a/cypress/e2e/group3/githubAppTools.ts b/cypress/e2e/group3/githubAppTools.ts index 68e650f897..653a93d054 100644 --- a/cypress/e2e/group3/githubAppTools.ts +++ b/cypress/e2e/group3/githubAppTools.ts @@ -98,14 +98,17 @@ describe('GitHub App Tools', () => { cy.contains('Tool storage type').click(); cy.contains('Close').click(); + cy.intercept('GET', '/api/lambdaEvents/**').as('lambdaEvents1'); // GitHub App Logs cy.contains('Apps Logs').click(); + cy.wait('@lambdaEvents1'); cy.contains('There were problems retrieving the GitHub App logs for this organization.'); cy.contains('Close').click(); cy.intercept('GET', '/api/lambdaEvents/**', { body: [], - }).as('lambdaEvents'); + }).as('lambdaEvents2'); cy.contains('Apps Logs').click(); + cy.wait('@lambdaEvents2'); cy.contains('There are no GitHub App logs for this organization.'); cy.contains('Close').click(); diff --git a/cypress/e2e/immutableDatabaseTests/dropdown.ts b/cypress/e2e/immutableDatabaseTests/dropdown.ts index 027007816c..25a35bf798 100644 --- a/cypress/e2e/immutableDatabaseTests/dropdown.ts +++ b/cypress/e2e/immutableDatabaseTests/dropdown.ts @@ -294,7 +294,7 @@ describe('Dropdown test', () => { // Route all DELETE API calls to organizations respond with with an empty JSON object cy.intercept('DELETE', '*/organizations/*', { body: [], - }); + }).as('delete'); // Route GET API call to user/membership with the mocked membership JSON object after first deletion cy.intercept('GET', '*/users/user/memberships', { @@ -307,6 +307,7 @@ describe('Dropdown test', () => { cy.contains('div', 'Delete Organization').within(() => { cy.contains('button', 'Delete').click(); }); + cy.wait('@delete'); cy.get('#my-pending-org-card-0').should('be.visible'); cy.get('#my-rejected-org-card-0').should('not.exist'); diff --git a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts index 58361131e4..2dac498507 100644 --- a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts +++ b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts @@ -18,7 +18,6 @@ const username = 'dockstoretestuser4'; // tuples of registry, repo namespace (username), and entry-name (repo name) const toolName = 'dockstore-tool-md5sum'; const toolTuple = ['github.com', username, toolName]; -const workflowTuple = ['github.com', username, 'hello-dockstore-workflow']; // tuple of organization name, collection name const collectionTuple = ['DockstoreAuthTestOrg', 'SimpleCollection']; const hardcodedWaitTime = 4000; @@ -228,7 +227,7 @@ function testTool(registry: string, repo: string, name: string) { }); } -function testWorkflow(registry: string, repo: string, name: string) { +function testWorkflow() { describe('Refresh, publish, unpublish, and restub a workflow', () => { it('refresh and publish', () => { storeToken(); @@ -332,4 +331,4 @@ function testCollection(org: string, collection: string, registry: string, repo: testCollection(collectionTuple[0], collectionTuple[1], toolTuple[0], toolTuple[1], toolTuple[2]); testTool(toolTuple[0], toolTuple[1], toolTuple[2]); -testWorkflow(workflowTuple[0], workflowTuple[1], workflowTuple[2]); +testWorkflow(); diff --git a/src/app/loginComponents/requests/requests.component.html b/src/app/loginComponents/requests/requests.component.html index e741cc585d..202d21f3c4 100644 --- a/src/app/loginComponents/requests/requests.component.html +++ b/src/app/loginComponents/requests/requests.component.html @@ -12,7 +12,7 @@

    Curator Requests

    - + {{ org.displayName }} @@ -74,7 +74,10 @@

    My Requests

    - + {{ @@ -106,7 +109,10 @@

    My Requests

    info You have no rejected organizations.
    - + warning @@ -155,7 +161,10 @@

    Organization Invites

    - + {{ diff --git a/src/app/loginComponents/requests/requests.component.ts b/src/app/loginComponents/requests/requests.component.ts index 4f0b9c2ed6..3f4eef8366 100644 --- a/src/app/loginComponents/requests/requests.component.ts +++ b/src/app/loginComponents/requests/requests.component.ts @@ -175,4 +175,10 @@ export class RequestsComponent extends Base implements OnInit { } }); } + trackByOrg(index: number, item: Organization) { + return item.id; + } + trackByOrgUser(index: number, item: OrganizationUser) { + return item.id; + } } diff --git a/src/app/workflow/versions/versions.component.html b/src/app/workflow/versions/versions.component.html index 43bfbabd4a..381b954014 100644 --- a/src/app/workflow/versions/versions.component.html +++ b/src/app/workflow/versions/versions.component.html @@ -24,6 +24,7 @@ matSortActive="last_modified" matSortDisableClear matSortDirection="desc" + [trackBy]="trackBy" > , b: KeyValue): number => { return 0; }; + + trackBy(index: number, item: WorkflowVersion) { + return item.id; + } } From 364ef0f638b11896460afca5103b8aa74679d319 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 25 Sep 2024 10:20:07 -0400 Subject: [PATCH 84/98] Bump vite and @angular-devkit/build-angular (#2022) Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) to 4.5.5 and updates ancestor dependency [@angular-devkit/build-angular](https://github.com/angular/angular-cli). These dependencies need to be updated together. Updates `vite` from 4.5.3 to 4.5.5 - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v4.5.5/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v4.5.5/packages/vite) Updates `@angular-devkit/build-angular` from 16.2.15 to 16.2.16 - [Release notes](https://github.com/angular/angular-cli/releases) - [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md) - [Commits](https://github.com/angular/angular-cli/compare/16.2.15...16.2.16) --- updated-dependencies: - dependency-name: vite dependency-type: indirect - dependency-name: "@angular-devkit/build-angular" dependency-type: direct:development ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 154 +++++++++++++++++++++++----------------------- package.json | 2 +- 2 files changed, 78 insertions(+), 78 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2571a0d4d9..fcbec243ca 100644 --- a/package-lock.json +++ b/package-lock.json @@ -53,7 +53,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.15", + "@angular-devkit/build-angular": "^16.2.16", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", @@ -127,15 +127,15 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", - "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.16.tgz", + "integrity": "sha512-gEni21kza41xaRnVWP1sMuiWHS/rdoym5FEEGDo9PG60LwRC4lekIgT09GpTlmMu007UEfo0ccQnGroD6+MqWg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.15", - "@angular-devkit/build-webpack": "0.1602.15", - "@angular-devkit/core": "16.2.15", + "@angular-devkit/architect": "0.1602.16", + "@angular-devkit/build-webpack": "0.1602.16", + "@angular-devkit/core": "16.2.16", "@babel/core": "7.22.9", "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", @@ -147,7 +147,7 @@ "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.15", + "@ngtools/webpack": "16.2.16", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -190,7 +190,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.6.1", - "vite": "4.5.3", + "vite": "4.5.5", "webpack": "5.94.0", "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", @@ -249,12 +249,12 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "16.2.16", "rxjs": "7.8.1" }, "engines": { @@ -264,9 +264,9 @@ } }, "node_modules/@angular-devkit/build-angular/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -550,12 +550,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", - "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.16.tgz", + "integrity": "sha512-b99Sj0btI0C2GIfzoyP8epDMIOLqSTqXOxw6klGtBLaGZfM5KAxqFzekXh8cAnHxWCj20WdNhezS1eUTLOkaIA==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/architect": "0.1602.16", "rxjs": "7.8.1" }, "engines": { @@ -569,12 +569,12 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "dependencies": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "16.2.16", "rxjs": "7.8.1" }, "engines": { @@ -584,9 +584,9 @@ } }, "node_modules/@angular-devkit/build-webpack/node_modules/@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "dependencies": { "ajv": "8.12.0", @@ -5684,9 +5684,9 @@ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" }, "node_modules/@ngtools/webpack": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", - "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", + "integrity": "sha512-4gm2allK0Pjy/Lxb9IGRnhEZNEOJSOTWwy09VOdHouV2ODRK7Tto2LgteaFJUUSLkuvWRsI7pfuA6yrz8KDfHw==", "dev": true, "engines": { "node": "^16.14.0 || >=18.10.0", @@ -7088,9 +7088,9 @@ "dev": true }, "node_modules/@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, "node_modules/@types/range-parser": { @@ -15932,9 +15932,9 @@ } }, "node_modules/launch-editor": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", - "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -23584,9 +23584,9 @@ } }, "node_modules/vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, "dependencies": { "esbuild": "^0.18.10", @@ -24759,15 +24759,15 @@ } }, "@angular-devkit/build-angular": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.15.tgz", - "integrity": "sha512-gw9wQENYVNUCB2bnzk0yKd6YGlemDwuwKnrPnSm4myyMuScZpW+e+zliGW+JXRuVWZqiTJNcdd58e4CrrreILg==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-16.2.16.tgz", + "integrity": "sha512-gEni21kza41xaRnVWP1sMuiWHS/rdoym5FEEGDo9PG60LwRC4lekIgT09GpTlmMu007UEfo0ccQnGroD6+MqWg==", "dev": true, "requires": { "@ampproject/remapping": "2.2.1", - "@angular-devkit/architect": "0.1602.15", - "@angular-devkit/build-webpack": "0.1602.15", - "@angular-devkit/core": "16.2.15", + "@angular-devkit/architect": "0.1602.16", + "@angular-devkit/build-webpack": "0.1602.16", + "@angular-devkit/core": "16.2.16", "@babel/core": "7.22.9", "@babel/generator": "7.22.9", "@babel/helper-annotate-as-pure": "7.22.5", @@ -24779,7 +24779,7 @@ "@babel/runtime": "7.22.6", "@babel/template": "7.22.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "16.2.15", + "@ngtools/webpack": "16.2.16", "@vitejs/plugin-basic-ssl": "1.0.1", "ansi-colors": "4.1.3", "autoprefixer": "10.4.14", @@ -24823,7 +24823,7 @@ "text-table": "0.2.0", "tree-kill": "1.2.2", "tslib": "2.6.1", - "vite": "4.5.3", + "vite": "4.5.5", "webpack": "5.94.0", "webpack-dev-middleware": "6.1.2", "webpack-dev-server": "4.15.1", @@ -24832,19 +24832,19 @@ }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "requires": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "16.2.16", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "requires": { "ajv": "8.12.0", @@ -25038,29 +25038,29 @@ } }, "@angular-devkit/build-webpack": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.15.tgz", - "integrity": "sha512-ms1+vCDdV0KX8BplJ7JoKH3wKjWHxxZTOX+mSPIjt4wS1uAk5DnezXHIjpBiJ3HY9XVHFI9C0HT4n7o6kFIOEQ==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1602.16.tgz", + "integrity": "sha512-b99Sj0btI0C2GIfzoyP8epDMIOLqSTqXOxw6klGtBLaGZfM5KAxqFzekXh8cAnHxWCj20WdNhezS1eUTLOkaIA==", "dev": true, "requires": { - "@angular-devkit/architect": "0.1602.15", + "@angular-devkit/architect": "0.1602.16", "rxjs": "7.8.1" }, "dependencies": { "@angular-devkit/architect": { - "version": "0.1602.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.15.tgz", - "integrity": "sha512-+yPlUG5c8l7Z/A6dyeV7NQjj4WDWnWWQt+8eW/KInwVwoYiM32ntTJ0M4uU/aDdHuwKQnMLly28AcSWPWKYf2Q==", + "version": "0.1602.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1602.16.tgz", + "integrity": "sha512-aWEeGU4UlbrSKpcAZsldVNxNXAWEeu9hM2BPk77GftbRC8PBMWpgYyrJWTz2ryn8aSmGKT3T8OyBH4gZA/667w==", "dev": true, "requires": { - "@angular-devkit/core": "16.2.15", + "@angular-devkit/core": "16.2.16", "rxjs": "7.8.1" } }, "@angular-devkit/core": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.15.tgz", - "integrity": "sha512-68BgPWpcjNKz++uvLFG8IZaOH3ti2BWQVqaE3yTIYaMoNt0y0A0X2MUVd7EGbAGUk2JdloWJv5LTPVZMzCuK4w==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-16.2.16.tgz", + "integrity": "sha512-5xHs9JFmp78sydrOAg0UGErxfMVv5c2f3RXoikS7eBOOXTWEi5pmnOkOvSJ3loQFGVs3Y7i+u02G3VrF5ZxOrA==", "dev": true, "requires": { "ajv": "8.12.0", @@ -28930,9 +28930,9 @@ } }, "@ngtools/webpack": { - "version": "16.2.15", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.15.tgz", - "integrity": "sha512-rD4IHt3nS6PdIKvmoqwIadMIGKsemBSz412kD8Deetl0TiCVhD/Tn1M00dxXzMSHSFCQcOKxdZAeD53yRwTOOA==", + "version": "16.2.16", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-16.2.16.tgz", + "integrity": "sha512-4gm2allK0Pjy/Lxb9IGRnhEZNEOJSOTWwy09VOdHouV2ODRK7Tto2LgteaFJUUSLkuvWRsI7pfuA6yrz8KDfHw==", "dev": true, "requires": {} }, @@ -30032,9 +30032,9 @@ "dev": true }, "@types/qs": { - "version": "6.9.15", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.15.tgz", - "integrity": "sha512-uXHQKES6DQKKCLh441Xv/dwxOq1TVS3JPUMlEqoEglvlhR6Mxnlew/Xq/LRVHpLyk7iK3zODe1qYHIMltO7XGg==", + "version": "6.9.16", + "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.16.tgz", + "integrity": "sha512-7i+zxXdPD0T4cKDuxCUXJ4wHcsJLwENa6Z3dCu8cfCK743OGy5Nu1RmAGqDPsoTDINVEcdXKRvR/zre+P2Ku1A==", "dev": true }, "@types/range-parser": { @@ -36867,9 +36867,9 @@ "dev": true }, "launch-editor": { - "version": "2.8.2", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.2.tgz", - "integrity": "sha512-eF5slEUZXmi6WvFzI3dYcv+hA24/iKnROf24HztcURJpSz9RBmBgz5cNCVOeguouf1llrwy6Yctl4C4HM+xI8g==", + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz", + "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==", "dev": true, "requires": { "picocolors": "^1.0.0", @@ -42836,9 +42836,9 @@ } }, "vite": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.3.tgz", - "integrity": "sha512-kQL23kMeX92v3ph7IauVkXkikdDRsYMGTVl5KY2E9OY4ONLvkHf04MDTbnfo6NKxZiDLWzVpP5oTa8hQD8U3dg==", + "version": "4.5.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-4.5.5.tgz", + "integrity": "sha512-ifW3Lb2sMdX+WU91s3R0FyQlAyLxOzCSCP37ujw0+r5POeHPwe6udWVIElKQq8gk3t7b8rkmvqC6IHBpCff4GQ==", "dev": true, "requires": { "esbuild": "^0.18.10", diff --git a/package.json b/package.json index 5249061cfb..58ad3c720e 100644 --- a/package.json +++ b/package.json @@ -84,7 +84,7 @@ "zone.js": "~0.13.3" }, "devDependencies": { - "@angular-devkit/build-angular": "^16.2.15", + "@angular-devkit/build-angular": "^16.2.16", "@angular-eslint/builder": "^16.3.1", "@angular-eslint/eslint-plugin": "^16.3.1", "@angular-eslint/eslint-plugin-template": "^16.3.1", From a5e690e5b13800400855aff69565e5e3a8f2085d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 27 Sep 2024 16:06:06 -0400 Subject: [PATCH 85/98] Bump rollup from 3.29.4 to 3.29.5 (#2024) Bumps [rollup](https://github.com/rollup/rollup) from 3.29.4 to 3.29.5. - [Release notes](https://github.com/rollup/rollup/releases) - [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md) - [Commits](https://github.com/rollup/rollup/compare/v3.29.4...v3.29.5) --- updated-dependencies: - dependency-name: rollup dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package-lock.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/package-lock.json b/package-lock.json index fcbec243ca..e4b1589b27 100644 --- a/package-lock.json +++ b/package-lock.json @@ -20398,9 +20398,9 @@ "optional": true }, "node_modules/rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -40318,9 +40318,9 @@ "optional": true }, "rollup": { - "version": "3.29.4", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.4.tgz", - "integrity": "sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==", + "version": "3.29.5", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.29.5.tgz", + "integrity": "sha512-GVsDdsbJzzy4S/v3dqWPJ7EfvZJfCHiDqe80IyrF59LYuP+e6U1LJoUqeuqRbwAWoMNoXivMNeNAOf5E22VA1w==", "dev": true, "requires": { "fsevents": "~2.3.2" From daf8a4f20fe98c3b1df207802af0a9f26722993b Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Tue, 1 Oct 2024 15:21:28 -0700 Subject: [PATCH 86/98] remove "Jupyter" from workflow-related UI https://ucsc-cgl.atlassian.net/browse/DOCK-2586 dockstore/dockstore#6004 --- .../entry/descriptor-language.service.spec.ts | 11 +++++---- .../entry/descriptor-language.service.ts | 23 ++++--------------- 2 files changed, 11 insertions(+), 23 deletions(-) diff --git a/src/app/shared/entry/descriptor-language.service.spec.ts b/src/app/shared/entry/descriptor-language.service.spec.ts index add123f201..f979a3b1a3 100644 --- a/src/app/shared/entry/descriptor-language.service.spec.ts +++ b/src/app/shared/entry/descriptor-language.service.spec.ts @@ -28,23 +28,24 @@ describe('Service: DescriptorLanguage', () => { it('should return the descriptor languages in an string array', () => { const stubValue: Array = [{ value: 'cwl' }, { value: 'wdl' }, { value: 'nextflow' }]; metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(stubValue)); + workflowQuerySpy.entryType$ = observableOf('workflow'); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => { expect(languages).toEqual(['cwl', 'wdl', 'nextflow'], 'service returned stub value'); }); }); - it('should be able to filter service out', () => { + it('should be able to filter service and notebook out', () => { const descriptorLanguageBeans: DescriptorLanguageBean[] = []; descriptorLanguageBeans.push({ friendlyName: 'potato', value: 'potato' }); descriptorLanguageBeans.push({ friendlyName: 'beef', value: 'beef' }); descriptorLanguageBeans.push({ friendlyName: 'stew', value: 'stew' }); descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for services', value: 'service' }); + descriptorLanguageBeans.push({ friendlyName: 'generic placeholder for notebooks', value: 'jupyter' }); metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans)); + workflowQuerySpy.entryType$ = observableOf('workflow'); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); - const filteredDescriptorLanguageBeans = descriptorLanguageService.filterService(descriptorLanguageBeans); - expect(filteredDescriptorLanguageBeans.length).toEqual(3); - filteredDescriptorLanguageBeans.forEach((descriptorLanguageBean) => { - expect(descriptorLanguageBean.value).not.toEqual(descriptorLanguageService.knownServiceValue); + descriptorLanguageService.filteredDescriptorLanguages$.pipe(first()).subscribe((languages: Array) => { + expect(languages).toEqual(['potato', 'beef', 'stew'], 'service returned stub value'); }); }); it('should be able to get home page inner HTML', () => { diff --git a/src/app/shared/entry/descriptor-language.service.ts b/src/app/shared/entry/descriptor-language.service.ts index 9be4302da9..88020e0e19 100644 --- a/src/app/shared/entry/descriptor-language.service.ts +++ b/src/app/shared/entry/descriptor-language.service.ts @@ -34,8 +34,6 @@ export class DescriptorLanguageService { readonly knownServiceValue = 'service'; public descriptorLanguages$: Observable>; - public descriptorLanguagesInnerHTML$: Observable; - public noService$: Observable; private descriptorLanguagesBean$ = new BehaviorSubject([]); public filteredDescriptorLanguages$: Observable>; constructor(private metadataService: MetadataService, private sessionQuery: SessionQuery) { @@ -47,10 +45,6 @@ export class DescriptorLanguageService { } }) ); - this.noService$ = this.descriptorLanguagesBean$.pipe(map((beans) => this.filterService(beans))); - this.descriptorLanguagesInnerHTML$ = this.noService$.pipe( - map((descriptorLanguageBeans: DescriptorLanguageBean[]) => this.getDescriptorLanguagesInnerHTML(descriptorLanguageBeans)) - ); const combined$ = combineLatest([this.descriptorLanguages$, this.sessionQuery.entryType$]); this.filteredDescriptorLanguages$ = combined$.pipe(map((combined) => this.filterLanguages(combined[0], combined[1]))); } @@ -233,17 +227,6 @@ export class DescriptorLanguageService { } } - /** - * Certain pages ignore the 'service' descriptor language completely, this filters it out of the known languages - * - * @param {DescriptorLanguageBean[]} beans Descriptor language bean returned from the metadata endpoint - * @returns {DescriptorLanguageBean[]} Filtered list of languages that do not have 'service' in it - * @memberof DescriptorLanguageService - */ - filterService(beans: DescriptorLanguageBean[]): DescriptorLanguageBean[] { - return beans.filter((bean) => bean.value !== this.knownServiceValue); - } - /** * Some entries are not meant to show all descriptor types * @@ -254,7 +237,11 @@ export class DescriptorLanguageService { */ filterLanguages(descriptorTypes: Workflow.DescriptorTypeEnum[], entryType: EntryType): Workflow.DescriptorTypeEnum[] { if (entryType === EntryType.BioWorkflow || entryType === EntryType.Tool || !entryType) { - return descriptorTypes.filter((descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service); + return descriptorTypes.filter( + (descriptorType) => descriptorType !== Workflow.DescriptorTypeEnum.Service && descriptorType !== Workflow.DescriptorTypeEnum.Jupyter + ); + } else if (entryType === EntryType.Notebook) { + return [Workflow.DescriptorTypeEnum.Jupyter]; } else { return [Workflow.DescriptorTypeEnum.Service]; } From b88e89e0e60bd1b022d56311e2f4676bc09fb25c Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Wed, 2 Oct 2024 07:59:26 -0700 Subject: [PATCH 87/98] adjust for auto-doi generation https://ucsc-cgl.atlassian.net/browse/SEAB-6508 --- .../e2e/smokeTests/sharedTests/auth-tests.ts | 31 +++++++++++++------ 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts index 2dac498507..60db4cbea7 100644 --- a/cypress/e2e/smokeTests/sharedTests/auth-tests.ts +++ b/cypress/e2e/smokeTests/sharedTests/auth-tests.ts @@ -40,6 +40,11 @@ function storeToken() { } } +function hasSandboxZenodo() { + const baseUrl = Cypress.config('baseUrl'); + return baseUrl === 'https://qa.dockstore.org' || baseUrl === 'https://staging.dockstore.org' || baseUrl === 'https://dev.dockstore.net'; +} + function unpublishTool() { it('unpublish the tool', () => { storeToken(); @@ -266,16 +271,22 @@ function testWorkflow() { cy.get('#publishButton').contains('Unpublish').click({ force: true }); goToTab('Info'); - cy.intercept('**/restub').as('restub'); - cy.contains('button', 'Restub').click(); - // Wait for the restub request to complete, so that it does not overlap - // with the subsequent refresh and occasionally trigger a db error on - // the webservice. - // See https://ucsc-cgl.atlassian.net/browse/SEAB-6535 - cy.wait('@restub'); - // This fails because DOI is auto issued when published, and restub fails. - // See https://ucsc-gi.slack.com/archives/C05EZH3RVNY/p1718128426265779 - // cy.contains('button', 'Publish').should('be.disabled'); + + // For now, only restub the workflow in environments that use the sandbox zenodo, + // to avoid the subsequent creation of new versions and auto-generation of real + // zenodo DOIs, which will accumulate over time because they are effectively + // undeletable. + // See https://ucsc-cgl.atlassian.net/browse/SEAB-6508 + if (hasSandboxZenodo()) { + cy.intercept('**/restub').as('restub'); + cy.contains('button', 'Restub').click(); + // Wait for the restub request to complete, so that it does not overlap + // with the subsequent refresh and occasionally trigger a db error on + // the webservice. + // See https://ucsc-cgl.atlassian.net/browse/SEAB-6535 + cy.wait('@restub'); + cy.contains('button', 'Publish').should('be.disabled'); + } cy.get('[data-cy=refreshButton]').click(); goToTab('Versions'); From 3683f630e74da7fc22741a1000fa8d4df1bb190e Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Mon, 7 Oct 2024 11:18:15 -0700 Subject: [PATCH 88/98] improve search result presentation https://ucsc-cgl.atlassian.net/browse/SEAB-6696 --- .../smokeTests/sharedTests/basic-enduser.ts | 3 -- src/app/search/search-entry-table.ts | 2 +- .../search-notebook-table.component.html | 36 +++++---------- .../search-notebook-table.component.scss | 6 +-- .../search-notebook-table.component.ts | 2 +- .../search-tool-table.component.html | 44 +++++-------------- .../search-workflow-table.component.html | 38 ++++------------ src/app/search/search.component.scss | 4 ++ src/app/shared/styles/entry-table.scss | 4 +- src/styles.scss | 4 ++ 10 files changed, 46 insertions(+), 97 deletions(-) diff --git a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts index 0ad078e669..cdd5a217a7 100644 --- a/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts +++ b/cypress/e2e/smokeTests/sharedTests/basic-enduser.ts @@ -141,9 +141,6 @@ describe('Test search page functionality', () => { cy.url().should('contain', 'verified=1'); cy.get('[data-cy=workflowColumn] a'); cy.contains('mat-checkbox', /^[ ]*verified/); - cy.get('[data-cy=verificationStatus] a').each(($el, index, $list) => { - cy.wrap($el).contains('done'); - }); }); }); diff --git a/src/app/search/search-entry-table.ts b/src/app/search/search-entry-table.ts index 320ac18571..2749e0e76e 100644 --- a/src/app/search/search-entry-table.ts +++ b/src/app/search/search-entry-table.ts @@ -32,7 +32,7 @@ export abstract class SearchEntryTable extends Base implements OnInit { protected verifiedLink: string; protected ngUnsubscribe: Subject<{}> = new Subject(); - public readonly displayedColumns = ['name', 'verified', 'all_authors', 'descriptorType', 'projectLinks', 'starredUsers']; + public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'starredUsers']; public readonly columnsToDisplayWithExpand = [...this.displayedColumns, 'expand']; public readonly searchEverythingFriendlyNames = new Map([ ['full_workflow_path', 'Path'], diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index 0fc7d10a2d..8b04a893ac 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -4,37 +4,33 @@
    - Name + Name and Description
    + notebook icon {{ notebook?.source.organization + '/' + notebook?.source.repository + (notebook?.source.workflowName ? '/' + notebook?.source.workflowName : '') }} -
    +
    - {{ - notebook?.source.topicAutomatic - }} + {{ notebook?.source.topicAutomatic }}
    Author - + +
    + +
    +
    Format @@ -54,19 +50,11 @@
    - - Links - - - - - - Stars - {{ !notebook?.source.starredUsers || notebook?.source.starredUsers.length === 0 ? '' : notebook?.source.starredUsers?.length }} - star_rate + star_rate + {{ !notebook?.source.starredUsers || notebook?.source.starredUsers.length === 0 ? '' : notebook?.source.starredUsers.length }} diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.scss b/src/app/search/search-notebook-table/search-notebook-table.component.scss index db11452167..fabe799883 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.scss +++ b/src/app/search/search-notebook-table/search-notebook-table.component.scss @@ -1,9 +1,9 @@ .mat-column-descriptorType { - max-width: 90px; + max-width: 10rem; } -.mat-column-projectLinks { - max-width: 80px; +.mat-column-descriptorTypeSubclass { + max-width: 10rem; } td.mat-cell { diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.ts b/src/app/search/search-notebook-table/search-notebook-table.component.ts index cbf158642c..a0c8eaf118 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.ts +++ b/src/app/search/search-notebook-table/search-notebook-table.component.ts @@ -65,7 +65,7 @@ import TopicSelectionEnum = Workflow.TopicSelectionEnum; ], }) export class SearchNotebookTableComponent extends SearchEntryTable implements OnInit { - public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'descriptorTypeSubclass', 'projectLinks', 'starredUsers']; + public readonly displayedColumns = ['name', 'all_authors', 'descriptorType', 'descriptorTypeSubclass', 'starredUsers']; readonly entryType = 'notebook'; public dataSource: MatTableDataSource>; constructor(dateService: DateService, searchQuery: SearchQuery, searchService: SearchService) { diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 60f8fdb812..603cd8e386 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -23,10 +23,11 @@
    + tool icon -
    + -
    + {{ tool?.source.namespace + '/' + tool?.source.name + (tool?.source.toolname ? '/' + tool?.source.toolname : '') }} -
    +
    - {{ - tool?.source.topicAutomatic - }} + {{ tool?.source.topicAutomatic }}
    - - Verified - - - check - - - Author - + +
    + +
    +
    Format @@ -92,18 +80,6 @@ - - Links - - - - -     - - - - - Stars Name and Description - - Links - - - - - - Stars star_rate - {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers?.length }} + {{ !workflow?.source.starredUsers || workflow?.source.starredUsers.length === 0 ? '' : workflow?.source.starredUsers.length }} diff --git a/src/app/search/search.component.scss b/src/app/search/search.component.scss index b45679ec86..2a186e568c 100644 --- a/src/app/search/search.component.scss +++ b/src/app/search/search.component.scss @@ -24,6 +24,10 @@ mat-tab-group.homeComponent { color: $header-color; } +.hits { + line-height: 1.8; +} + .sidebar { position: fixed; top: 0; diff --git a/src/app/shared/styles/entry-table.scss b/src/app/shared/styles/entry-table.scss index ad72810089..dcf1f5f54f 100644 --- a/src/app/shared/styles/entry-table.scss +++ b/src/app/shared/styles/entry-table.scss @@ -5,15 +5,15 @@ .mat-column-starredUsers, .mat-column-stars { max-width: 6rem; - justify-content: flex-end; color: mat.get-color-from-palette($dockstore-app-accent-1, darker); } .mat-column-all_authors { - max-width: 20rem; + max-width: 16rem; } .mat-column-descriptorType, +.mat-column-descriptorTypeSubclass, .mat-column-format { min-width: min-content; max-width: 14rem; diff --git a/src/styles.scss b/src/styles.scss index 85b6354bff..b33eb0b5e4 100644 --- a/src/styles.scss +++ b/src/styles.scss @@ -1436,3 +1436,7 @@ app-ai-bubble { .gray-caption { color: mat.get-color-from-palette($kim-gray, 2); } + +.mr-2_5 { + margin-right: 0.75rem; +} From 88a2a0f03bb06bc699e5b4454e9f7d4fbf7ae8a1 Mon Sep 17 00:00:00 2001 From: Nayeon Hyun <61166764+hyunnaye@users.noreply.github.com> Date: Tue, 8 Oct 2024 15:30:16 -0400 Subject: [PATCH 89/98] DOCK-2533-followup: Fix regex in Register Workflow dialog (#2028) * fix regex * fix test * added $ * added $ --- src/app/descriptor-languages/CWL.ts | 2 +- src/app/descriptor-languages/Galaxy.ts | 2 +- src/app/descriptor-languages/Jupyter.ts | 2 +- src/app/descriptor-languages/Nextflow.ts | 2 +- src/app/descriptor-languages/Snakemake.ts | 2 +- src/app/descriptor-languages/WDL.ts | 2 +- src/app/shared/entry/descriptor-language.service.spec.ts | 8 ++++---- 7 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/app/descriptor-languages/CWL.ts b/src/app/descriptor-languages/CWL.ts index 882de7e6d3..d742072c1b 100644 --- a/src/app/descriptor-languages/CWL.ts +++ b/src/app/descriptor-languages/CWL.ts @@ -7,7 +7,7 @@ export const extendedCWL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'CWL', friendlyName: 'Common Workflow Language', defaultDescriptorPath: '/Dockstore.cwl', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$', descriptorPathPlaceholder: 'e.g. /Dockstore.cwl', toolDescriptorEnum: ToolDescriptor.TypeEnum.CWL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.CWL, diff --git a/src/app/descriptor-languages/Galaxy.ts b/src/app/descriptor-languages/Galaxy.ts index 91105ad135..37cbf82d5c 100644 --- a/src/app/descriptor-languages/Galaxy.ts +++ b/src/app/descriptor-languages/Galaxy.ts @@ -7,7 +7,7 @@ export const extendedGalaxy: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Galaxy', friendlyName: 'Galaxy Workflow Format', defaultDescriptorPath: '/workflow-name.yml', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(ga|yaml|yml)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(ga|yaml|yml)$', descriptorPathPlaceholder: 'e.g. /workflow-name.yml', toolDescriptorEnum: ToolDescriptor.TypeEnum.GALAXY, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Gxformat2, diff --git a/src/app/descriptor-languages/Jupyter.ts b/src/app/descriptor-languages/Jupyter.ts index e6ada828ec..d3c3aa366b 100644 --- a/src/app/descriptor-languages/Jupyter.ts +++ b/src/app/descriptor-languages/Jupyter.ts @@ -10,7 +10,7 @@ export const extendedJupyter: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Jupyter', friendlyName: 'Jupyter notebook', defaultDescriptorPath: '/notebook.ipynb', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.ipynb$', + descriptorPathPattern: '^^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.ipynb$', descriptorPathPlaceholder: 'e.g. /notebook.ipynb', toolDescriptorEnum: ToolDescriptor.TypeEnum.JUPYTER, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.Jupyter, diff --git a/src/app/descriptor-languages/Nextflow.ts b/src/app/descriptor-languages/Nextflow.ts index c40e73e591..a6aab51f0b 100644 --- a/src/app/descriptor-languages/Nextflow.ts +++ b/src/app/descriptor-languages/Nextflow.ts @@ -7,7 +7,7 @@ export const extendedNFL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Nextflow', friendlyName: 'Nextflow', defaultDescriptorPath: '/nextflow.config', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$', descriptorPathPlaceholder: 'e.g. /nextflow.config', toolDescriptorEnum: ToolDescriptor.TypeEnum.NFL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.NFL, diff --git a/src/app/descriptor-languages/Snakemake.ts b/src/app/descriptor-languages/Snakemake.ts index 3ea99ba7ec..51299c79cf 100644 --- a/src/app/descriptor-languages/Snakemake.ts +++ b/src/app/descriptor-languages/Snakemake.ts @@ -7,7 +7,7 @@ export const extendedSMK: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'Snakemake', friendlyName: 'Snakemake', defaultDescriptorPath: '/Snakefile', - descriptorPathPattern: '^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$', descriptorPathPlaceholder: 'e.g. /Snakefile', toolDescriptorEnum: ToolDescriptor.TypeEnum.SMK, diff --git a/src/app/descriptor-languages/WDL.ts b/src/app/descriptor-languages/WDL.ts index ed3f0b1ffb..e221ce7c20 100644 --- a/src/app/descriptor-languages/WDL.ts +++ b/src/app/descriptor-languages/WDL.ts @@ -7,7 +7,7 @@ export const extendedWDL: ExtendedDescriptorLanguageBean = { shortFriendlyName: 'WDL', friendlyName: 'Workflow Description Language', defaultDescriptorPath: '/Dockstore.wdl', - descriptorPathPattern: '^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$', + descriptorPathPattern: '^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$', descriptorPathPlaceholder: 'e.g. /Dockstore.wdl', toolDescriptorEnum: ToolDescriptor.TypeEnum.WDL, workflowDescriptorEnum: Workflow.DescriptorTypeEnum.WDL, diff --git a/src/app/shared/entry/descriptor-language.service.spec.ts b/src/app/shared/entry/descriptor-language.service.spec.ts index f979a3b1a3..d1e0410f12 100644 --- a/src/app/shared/entry/descriptor-language.service.spec.ts +++ b/src/app/shared/entry/descriptor-language.service.spec.ts @@ -106,13 +106,13 @@ describe('Service: DescriptorLanguage', () => { metadataServiceSpy.getDescriptorLanguages.and.returnValue(observableOf(descriptorLanguageBeans)); const descriptorLanguageService = new DescriptorLanguageService(metadataServiceSpy, workflowQuerySpy); let placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SMK); - expect(placeholder).toEqual('^/([^/?:*|<>]++/)*(Snakefile|[^./?:*|<>]++.smk))$'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*(Snakefile|[^.\\/?:*\\|<>]+.smk)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.CWL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(cwl|yaml|yml)'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(cwl|yaml|yml)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.WDL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.wdl$'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.wdl$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.NFL); - expect(placeholder).toEqual('^/([^/?:*|<>]+/)*[^/?:*|<>]+.(config)'); + expect(placeholder).toEqual('^\\/([^\\/?:*\\|<>]+\\/)*[^\\/?:*\\|<>]+.(config)$'); placeholder = descriptorLanguageService.getDescriptorPattern(ToolDescriptor.TypeEnum.SERVICE); expect(placeholder).toEqual('.*'); placeholder = descriptorLanguageService.getDescriptorPattern('UnrecognizedType'); From 75e13d718ca8bab9900a6be7603786d7ed8998e1 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Wed, 16 Oct 2024 14:45:02 -0700 Subject: [PATCH 90/98] fix faceted search for complex queries involving ORs https://ucsc-cgl.atlassian.net/browse/DOCK-2592 dockstore/dockstore#6020 https://ucsc-cgl.atlassian.net/browse/SEAB-6308 --- src/app/search/query-builder.service.ts | 39 ++++++++++--------- .../shared/ai-bubble/ai-bubble.component.html | 2 +- 2 files changed, 21 insertions(+), 20 deletions(-) diff --git a/src/app/search/query-builder.service.ts b/src/app/search/query-builder.service.ts index 547caaad3e..4bb323a7ac 100644 --- a/src/app/search/query-builder.service.ts +++ b/src/app/search/query-builder.service.ts @@ -173,26 +173,27 @@ export class QueryBuilderService { * @memberof SearchComponent */ appendFilter(body: any, aggKey: string | null, filters: Map>, exclusiveFilters: Array): Bodybuilder { - filters.forEach((value: Set, key: string) => { - value.forEach((insideFilter) => { - const isExclusiveFilter = exclusiveFilters.includes(key); - if (aggKey === key && !isExclusiveFilter) { - // Return some garbage filter because we've decided to append a filter, there's no turning back - // return body; // <--- this does not work - body = body.notFilter('term', 'some garbage term that hopefully never gets matched', insideFilter); - } else { - // value refers to the buckets selected - if (value.size > 1) { - body = body.orFilter('term', key, insideFilter); - } else { - if (isExclusiveFilter) { - body = body.filter('term', key, this.convertIntStringToBoolString(insideFilter)); - } else { - body = body.filter('term', key, insideFilter); - } + filters.forEach((values: Set, key: string) => { + const isExclusiveFilter = exclusiveFilters.includes(key); + if (aggKey === key && !isExclusiveFilter) { + // Return some garbage filter because we've decided to append a filter, there's no turning back + values.forEach((value) => { + body = body.notFilter('term', 'some garbage term that hopefully never gets matched', value); + }); + } else if (values.size == 1) { + // Add a filter that matches a single value + const [value] = values; + const convertedValue = isExclusiveFilter ? this.convertIntStringToBoolString(value) : value; + body = body.filter('term', key, convertedValue); + } else { + // Add a filter that matches at least one of multiple values + body = body.filter('bool', (b) => { + for (const value of values) { + b = b.orFilter('term', key, value); } - } - }); + return b; + }); + } }); return body; } diff --git a/src/app/shared/ai-bubble/ai-bubble.component.html b/src/app/shared/ai-bubble/ai-bubble.component.html index 925be1f3ce..d0271f9036 100644 --- a/src/app/shared/ai-bubble/ai-bubble.component.html +++ b/src/app/shared/ai-bubble/ai-bubble.component.html @@ -1,5 +1,5 @@ Date: Wed, 23 Oct 2024 14:04:52 -0700 Subject: [PATCH 91/98] Bump version --- package.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index 58ad3c720e..b8c51aac8a 100644 --- a/package.json +++ b/package.json @@ -4,8 +4,8 @@ "license": "Apache License 2.0", "config": { "webservice_version_prefix": "1.16.0", - "webservice_version": "1.16.0-alpha.10", - "use_snapshot": true + "webservice_version": "1.16.0-beta.7", + "use_snapshot": false }, "scripts": { "ng": "npx ng", From d7fa51da7ded808220d83861bf7a88379e9a9518 Mon Sep 17 00:00:00 2001 From: David Steinberg Date: Thu, 24 Oct 2024 11:00:48 -0700 Subject: [PATCH 92/98] Remove ai tooltip (#2036) * Remove AI topic tooltip in search * Not just workflows --- .../search-notebook-table/search-notebook-table.component.html | 2 +- .../search/search-tool-table/search-tool-table.component.html | 2 +- .../search-workflow-table/search-workflow-table.component.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index 8b04a893ac..58fccf03dd 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -19,7 +19,7 @@ *ngIf="notebook?.source.topicSelection === TopicSelectionEnum.AI && !notebook?.source.approvedAITopic" [isPublic]="true" > - {{ notebook?.source.topicAutomatic }} + {{ notebook?.source.topicAutomatic }}
    diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index 603cd8e386..ca99e12593 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -50,7 +50,7 @@ *ngIf="tool?.source.topicSelection === TopicSelectionEnum.AI && !tool?.source.approvedAITopic" [isPublic]="true" > - {{ tool?.source.topicAutomatic }} + {{ tool?.source.topicAutomatic }}
    diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index 8b53240c3e..5f6388aa23 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -24,7 +24,7 @@ *ngIf="workflow?.source.topicSelection === TopicSelectionEnum.AI && !workflow?.source.approvedAITopic" [isPublic]="true" > - {{ workflow?.source.topicAutomatic }} + {{ workflow?.source.topicAutomatic }}
    From c9ff71216f2a9832ec42a7862e28498634cccce7 Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Thu, 24 Oct 2024 12:40:05 -0700 Subject: [PATCH 93/98] fix TRS ID "copy button" bug https://ucsc-cgl.atlassian.net/browse/DOCK-2594 dockstore/dockstore#6024 --- src/app/workflow/info-tab/info-tab.component.ts | 4 +--- .../workflow/info-tab/info-tab.service.spec.ts | 15 ++++++++++----- src/app/workflow/info-tab/info-tab.service.ts | 7 ++++--- 3 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/app/workflow/info-tab/info-tab.component.ts b/src/app/workflow/info-tab/info-tab.component.ts index 5997703841..20f1635a11 100644 --- a/src/app/workflow/info-tab/info-tab.component.ts +++ b/src/app/workflow/info-tab/info-tab.component.ts @@ -194,6 +194,7 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.authors = null; this.description = null; } + this.displayTextForButton = this.infoTabService.getTRSId(this.workflow); } ngOnInit() { @@ -208,9 +209,6 @@ export class InfoTabComponent extends EntryTab implements OnInit, OnChanges { this.infoTabService.defaultTestFilePathEditing$ .pipe(takeUntil(this.ngUnsubscribe)) .subscribe((editing) => (this.defaultTestFilePathEditing = editing)); - this.entryType$ - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((entryType) => (this.displayTextForButton = this.infoTabService.getTRSId(this.workflow, entryType))); this.infoTabService.forumUrlEditing$.pipe(takeUntil(this.ngUnsubscribe)).subscribe((editing) => (this.forumUrlEditing = editing)); } /** diff --git a/src/app/workflow/info-tab/info-tab.service.spec.ts b/src/app/workflow/info-tab/info-tab.service.spec.ts index a62deb54a5..a0e7a6c0e0 100644 --- a/src/app/workflow/info-tab/info-tab.service.spec.ts +++ b/src/app/workflow/info-tab/info-tab.service.spec.ts @@ -10,7 +10,7 @@ import { WorkflowsService } from 'app/shared/openapi'; import { ExtendedWorkflowQuery } from 'app/shared/state/extended-workflow.query'; import { WorkflowService } from 'app/shared/state/workflow.service'; import { WorkflowsStubService, WorkflowStubService } from 'app/test/service-stubs'; -import { sampleWorkflow3 } from '../../test/mocked-objects'; +import { sampleWorkflow3, appToolEntryTypeMetadata, serviceEntryTypeMetadata, notebookEntryTypeMetadata } from '../../test/mocked-objects'; import { InfoTabService } from './info-tab.service'; describe('ValueService', () => { @@ -54,10 +54,15 @@ describe('ValueService', () => { it(`getTRSId should work for tools and workflows`, () => { service = TestBed.inject(InfoTabService); const fullWorkflowPath = sampleWorkflow3.full_workflow_path; - expect(service.getTRSId(sampleWorkflow3, EntryType.BioWorkflow)).toBe(`#workflow/${fullWorkflowPath}`); - expect(service.getTRSId(sampleWorkflow3, EntryType.AppTool)).toBe(fullWorkflowPath); - expect(service.getTRSId(sampleWorkflow3, EntryType.Service)).toBe(`#service/${fullWorkflowPath}`); - expect(service.getTRSId(null, EntryType.BioWorkflow)).toBe(''); + const clone = Object.assign({}, sampleWorkflow3); + expect(service.getTRSId(clone)).toBe(`#workflow/${fullWorkflowPath}`); + clone.entryTypeMetadata = appToolEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(fullWorkflowPath); + clone.entryTypeMetadata = serviceEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(`#service/${fullWorkflowPath}`); + clone.entryTypeMetadata = notebookEntryTypeMetadata; + expect(service.getTRSId(clone)).toBe(`#notebook/${fullWorkflowPath}`); + expect(service.getTRSId(null)).toBe(''); }); it(`getTRSPlainType should work for various descriptor types`, () => { diff --git a/src/app/workflow/info-tab/info-tab.service.ts b/src/app/workflow/info-tab/info-tab.service.ts index 38f3a49c69..85d3c93930 100644 --- a/src/app/workflow/info-tab/info-tab.service.ts +++ b/src/app/workflow/info-tab/info-tab.service.ts @@ -187,11 +187,12 @@ export class InfoTabService { ); } - getTRSId(workflow: Workflow | undefined, entryType: EntryType): string { - if (!workflow) { + getTRSId(workflow: Workflow | undefined): string { + if (workflow) { + return workflow.entryTypeMetadata.trsPrefix + workflow.full_workflow_path; + } else { return ''; } - return this.getTRSIDFromPath(workflow.full_workflow_path, entryType); } private getTRSIDFromPath(fullWorkflowPath: string, entryType: EntryType): string { From cc5b40bb9925a4e3d21c08b621c7a098dc25e0ab Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Mon, 28 Oct 2024 14:54:24 -0400 Subject: [PATCH 94/98] Don't truncate topics on search page, move AI bubble (#2037) https://ucsc-cgl.atlassian.net/browse/SEAB-6727 --- .../search-notebook-table.component.html | 4 ++-- .../search-tool-table/search-tool-table.component.html | 4 ++-- .../search-workflow-table.component.html | 4 ++-- src/app/shared/styles/entry-table.scss | 5 ----- 4 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/app/search/search-notebook-table/search-notebook-table.component.html b/src/app/search/search-notebook-table/search-notebook-table.component.html index 58fccf03dd..c9bf63827c 100644 --- a/src/app/search/search-notebook-table/search-notebook-table.component.html +++ b/src/app/search/search-notebook-table/search-notebook-table.component.html @@ -14,12 +14,12 @@ notebook?.source.repository + (notebook?.source.workflowName ? '/' + notebook?.source.workflowName : '') }} -
    +
    + {{ notebook?.source.topicAutomatic }} - {{ notebook?.source.topicAutomatic }}
    diff --git a/src/app/search/search-tool-table/search-tool-table.component.html b/src/app/search/search-tool-table/search-tool-table.component.html index ca99e12593..69110ecfe6 100644 --- a/src/app/search/search-tool-table/search-tool-table.component.html +++ b/src/app/search/search-tool-table/search-tool-table.component.html @@ -45,12 +45,12 @@ tool?.source.namespace + '/' + tool?.source.name + (tool?.source.toolname ? '/' + tool?.source.toolname : '') }} -
    +
    + {{ tool?.source.topicAutomatic }} - {{ tool?.source.topicAutomatic }}
    diff --git a/src/app/search/search-workflow-table/search-workflow-table.component.html b/src/app/search/search-workflow-table/search-workflow-table.component.html index 5f6388aa23..ae9cf1c2d8 100644 --- a/src/app/search/search-workflow-table/search-workflow-table.component.html +++ b/src/app/search/search-workflow-table/search-workflow-table.component.html @@ -19,12 +19,12 @@ (workflow?.source.workflowName ? '/' + workflow?.source.workflowName : '') }} -
    +
    + {{ workflow?.source.topicAutomatic }} - {{ workflow?.source.topicAutomatic }}
    diff --git a/src/app/shared/styles/entry-table.scss b/src/app/shared/styles/entry-table.scss index dcf1f5f54f..4bead7c00d 100644 --- a/src/app/shared/styles/entry-table.scss +++ b/src/app/shared/styles/entry-table.scss @@ -48,8 +48,3 @@ th { white-space: nowrap; vertical-align: top; } - -// Align AI bubble all the way to the left -app-ai-bubble { - margin-left: 0; -} From c806a27aae14787dd2c70961d6e362e3ce28863d Mon Sep 17 00:00:00 2001 From: Kathy Tran Date: Tue, 29 Oct 2024 10:57:01 -0400 Subject: [PATCH 95/98] Display same DOI icon on public Versions tab (#2038) https://github.com/dockstore/dockstore/issues/6026 https://ucsc-cgl.atlassian.net/browse/DOCK-2595 --- src/app/workflow/versions/versions.component.html | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/app/workflow/versions/versions.component.html b/src/app/workflow/versions/versions.component.html index 381b954014..993f040f09 100644 --- a/src/app/workflow/versions/versions.component.html +++ b/src/app/workflow/versions/versions.component.html @@ -252,7 +252,11 @@ DOI - check + From bcb8476df7366cfb835e269f8488d4b3eade88cc Mon Sep 17 00:00:00 2001 From: David Steinberg Date: Wed, 30 Oct 2024 13:03:37 -0700 Subject: [PATCH 96/98] Typo in landing page (#2039) --- src/app/home-page/home-logged-out/home.component.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/app/home-page/home-logged-out/home.component.html b/src/app/home-page/home-logged-out/home.component.html index 5a4fd4fd6e..bccac10107 100644 --- a/src/app/home-page/home-logged-out/home.component.html +++ b/src/app/home-page/home-logged-out/home.component.html @@ -174,7 +174,7 @@

    Use in many analysis environments.

    ## or grab one that the workflow author has provided (if applicable) wget --header='Accept: text/plain' https://dockstore.org/api/api/ga4gh/v2/tools/%23workflow%2Fgithub.com%2Fdockstore%2Fbcc2020-training%2FHelloWorld/versions/master/PLAIN_WDL/descriptor/..%2F..%2Ftest.json -O Dockstore.json ## Run locally with the Dockstore CLI - dockstore' workflow launch --entry github.com/dockstore/bcc2020-training/HelloWorld:master --json Dockstore.json + dockstore workflow launch --entry github.com/dockstore/bcc2020-training/HelloWorld:master --json Dockstore.json
    From bccb3bdbe8663c28d50ea0945edf61a220dc5b2c Mon Sep 17 00:00:00 2001 From: Steve Von Worley Date: Wed, 30 Oct 2024 14:04:50 -0700 Subject: [PATCH 97/98] fix launch-with button "has no content" bug https://ucsc-cgl.atlassian.net/browse/SEAB-6767 --- src/app/test/service-stubs.ts | 6 ++ .../launch-third-party.component.ts | 56 ++++++++----------- src/app/workflow/launch/launch.component.ts | 2 +- 3 files changed, 29 insertions(+), 35 deletions(-) diff --git a/src/app/test/service-stubs.ts b/src/app/test/service-stubs.ts index c2e4e26f66..b13914a67d 100644 --- a/src/app/test/service-stubs.ts +++ b/src/app/test/service-stubs.ts @@ -889,6 +889,12 @@ export class WorkflowsStubService { updateWorkflowDefaultVersion(workflowId: number, tag: string) { return observableOf([]); } + primaryDescriptor1(workflowId, descriptorType, versionName) { + return observableOf({}); + } + secondaryDescriptors1(workflowId, descriptorType, versionName) { + return observableOf([]); + } } export class ContainersStubService { diff --git a/src/app/workflow/launch-third-party/launch-third-party.component.ts b/src/app/workflow/launch-third-party/launch-third-party.component.ts index 2e89325962..8ecbdf9301 100644 --- a/src/app/workflow/launch-third-party/launch-third-party.component.ts +++ b/src/app/workflow/launch-third-party/launch-third-party.component.ts @@ -2,13 +2,11 @@ import { HttpUrlEncodingCodec } from '@angular/common/http'; import { Component, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { MatLegacyDialog as MatDialog, MatLegacyDialogModule } from '@angular/material/legacy-dialog'; import { DescriptorLanguageService } from 'app/shared/entry/descriptor-language.service'; -import { combineLatest, Observable } from 'rxjs'; +import { combineLatest, Observable, Subscription } from 'rxjs'; import { map, shareReplay, takeUntil } from 'rxjs/operators'; import { Base } from '../../shared/base'; -import { DescriptorTypeCompatService } from '../../shared/descriptor-type-compat.service'; import { Dockstore } from '../../shared/dockstore.model'; -import { GA4GHFilesQuery } from '../../shared/ga4gh-files/ga4gh-files.query'; -import { CloudInstance, CloudInstancesService, User, ToolFile, Workflow, WorkflowVersion } from '../../shared/openapi'; +import { CloudInstance, CloudInstancesService, User, Workflow, WorkflowVersion } from '../../shared/openapi'; import { WorkflowsService } from '../../shared/openapi/api/workflows.service'; import { SourceFile } from '../../shared/openapi/model/sourceFile'; import { UserQuery } from '../../shared/user/user.query'; @@ -24,7 +22,6 @@ import { FlexModule } from '@ngbracket/ngx-layout/flex'; import { MatDividerModule } from '@angular/material/divider'; import { MatLegacyCardModule } from '@angular/material/legacy-card'; import { NgIf, AsyncPipe } from '@angular/common'; -import FileTypeEnum = ToolFile.FileTypeEnum; /* eslint-disable max-len */ /** @@ -254,10 +251,11 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit map(([hasContent]) => (hasContent ? 'Run this notebook at mybinder.org' : 'The notebook has no content.')) ); + private primaryDescriptorSubscription: Subscription | null = null; + private secondaryDescriptorsSubscription: Subscription | null = null; + constructor( private workflowsService: WorkflowsService, - private descriptorTypeCompatService: DescriptorTypeCompatService, - private gA4GHFilesQuery: GA4GHFilesQuery, private descriptorsQuery: DescriptorsQuery, private descriptorsService: DescriptorsService, private cloudInstanceService: CloudInstancesService, @@ -279,37 +277,12 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit // this.usersCloudInstances = cloudInstances; // }); // } - - this.gA4GHFilesQuery - .getToolFiles(this.descriptorTypeCompatService.stringToDescriptorType(this.workflow.descriptorType), [ - FileTypeEnum.PRIMARYDESCRIPTOR, - FileTypeEnum.SECONDARYDESCRIPTOR, - ]) - .pipe(takeUntil(this.ngUnsubscribe)) - .subscribe((fileDescriptors) => { - if (fileDescriptors && fileDescriptors.length) { - // No idea if this.workflow.descriptorType is the one that's required or if it's some other enum - const descriptorType = this.workflow.descriptorType; - const descriptorLanguageEnum = - this.descriptorLanguageService.workflowDescriptorTypeEnumToExtendedDescriptorLanguageBean( - descriptorType - ).descriptorLanguageEnum; - this.workflowsService.primaryDescriptor1(this.workflow.id, descriptorType, this.selectedVersion.name).subscribe((sourceFile) => { - this.descriptorsService.updatePrimaryDescriptor(sourceFile); - if (fileDescriptors.some((file) => file.file_type === FileTypeEnum.SECONDARYDESCRIPTOR)) { - this.workflowsService - .secondaryDescriptors1(this.workflow.id, descriptorLanguageEnum, this.selectedVersion.name) - .subscribe((sourceFiles: Array) => { - this.descriptorsService.updateSecondaryDescriptors(sourceFiles); - }); - } - }); - } - }); } ngOnChanges(changes: SimpleChanges): void { this.descriptorsQuery.clear(); + this.primaryDescriptorSubscription?.unsubscribe(); + this.secondaryDescriptorsSubscription?.unsubscribe(); this.trsUrl = this.trsUrlAsQueryValue = this.workflowPathAsQueryValue = null; if (this.workflow && this.selectedVersion) { this.trsUrl = this.descriptorsService.trsUrl(this.workflow.full_workflow_path, this.selectedVersion.name); @@ -319,6 +292,21 @@ export class LaunchThirdPartyComponent extends Base implements OnChanges, OnInit this.workflowRepositoryAsQueryValue = this.encode(this.workflow.repository); this.selectedVersionNameAsQueryValue = this.encode(this.selectedVersion.name); this.selectedVersionWorkflowPathAsQueryValue = this.encode(this.prependIfNotPrefix('/', this.selectedVersion.workflow_path)); + const descriptorType = this.workflow.descriptorType; + const descriptorLanguageEnum = + this.descriptorLanguageService.workflowDescriptorTypeEnumToExtendedDescriptorLanguageBean(descriptorType).descriptorLanguageEnum; + this.primaryDescriptorSubscription = this.workflowsService + .primaryDescriptor1(this.workflow.id, descriptorType, this.selectedVersion.name) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((sourceFile) => { + this.descriptorsService.updatePrimaryDescriptor(sourceFile); + }); + this.secondaryDescriptorsSubscription = this.workflowsService + .secondaryDescriptors1(this.workflow.id, descriptorLanguageEnum, this.selectedVersion.name) + .pipe(takeUntil(this.ngUnsubscribe)) + .subscribe((sourceFiles: Array) => { + this.descriptorsService.updateSecondaryDescriptors(sourceFiles); + }); this.devcontainers = undefined; if (this.workflow.descriptorType === Workflow.DescriptorTypeEnum.Jupyter) { const workflowId = this.workflow.id; diff --git a/src/app/workflow/launch/launch.component.ts b/src/app/workflow/launch/launch.component.ts index c31f743f54..8c25bb7737 100644 --- a/src/app/workflow/launch/launch.component.ts +++ b/src/app/workflow/launch/launch.component.ts @@ -164,7 +164,7 @@ export class LaunchWorkflowComponent extends EntryTab implements OnInit, OnChang ]).subscribe( ([toolFiles, descriptorFiles]) => { // test parameter file is optional ... - if (toolFiles !== undefined) { + if (toolFiles) { if (toolFiles.length > 0) { this.testParameterPath = toolFiles[0].path; } else { From 7083d845afb8bb34b204be5fc94429dbf1176e8d Mon Sep 17 00:00:00 2001 From: Denis Yuen Date: Thu, 31 Oct 2024 14:46:17 -0400 Subject: [PATCH 98/98] test with final release --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index b8c51aac8a..0e864d6833 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "license": "Apache License 2.0", "config": { "webservice_version_prefix": "1.16.0", - "webservice_version": "1.16.0-beta.7", + "webservice_version": "1.16.0", "use_snapshot": false }, "scripts": {