Merge branch 'master' into master-3.0

This commit is contained in:
piotrpekala7 2021-05-28 00:20:16 +02:00
commit 7d95200eb3
34 changed files with 139 additions and 1041 deletions

View File

@ -18,7 +18,6 @@
"css-tree",
"save-svg-as-png",
"angular-draggable-droppable",
"angular2-hotkeys",
"dom-set",
"dom-plane",
"mousetrap",
@ -26,9 +25,6 @@
"rxjs/Rx",
"rxjs/add/operator/map",
"rxjs-compat/add/operator/map",
"angular-react-core.js",
"react",
"react-dom",
"classnames",
"stylenames"
],

View File

@ -41,15 +41,12 @@
},
"private": true,
"dependencies": {
"@angular-react/core": "^3.0.0",
"@angular-react/fabric": "^3.0.0",
"@angular/animations": "^11.2.13",
"@angular/cdk": "^11.2.12",
"@angular/common": "^11.2.13",
"@angular/compiler": "^11.2.13",
"@angular/core": "^11.2.13",
"@angular/forms": "^11.2.13",
"@angular/http": "^7.2.16",
"@angular/material": "^11.2.12",
"@angular/platform-browser": "^11.2.13",
"@angular/platform-browser-dynamic": "^11.2.13",
@ -60,20 +57,17 @@
"@types/react": "^17.0.5",
"@types/react-dom": "^17.0.3",
"angular-draggable-droppable": "^4.6.0",
"angular-persistence": "^1.0.1",
"angular-resizable-element": "^3.3.5",
"angular2-draggable": "^2.3.2",
"angular2-hotkeys": "^2.2.0",
"angular2-indexeddb": "^1.2.3",
"bootstrap": "^5.0.0",
"command-exists": "^1.2.9",
"core-js": "^3.12.1",
"d3-ng2-service": "^2.2.0",
"eev": "^0.1.5",
"file-saver": "^2.0.5",
"ini": "^2.0.0",
"marked": "^2.0.3",
"material-design-icons": "^3.0.1",
"mousetrap": "^1.6.5",
"ng-circle-progress": "^1.6.0",
"ng2-file-upload": "^1.4.0",
"ngx-childprocess": "^0.0.6",
@ -81,16 +75,10 @@
"ngx-electron": "^2.2.0",
"node-fetch": "^2.6.1",
"notosans-fontface": "1.2.2",
"office-ui-fabric-react": "^7.170.0",
"prettier-plugin-organize-imports": "^2.0.0",
"react": "^17.0.2",
"react-bootstrap": "^1.5.2",
"react-dom": "^17.0.2",
"rxjs": "^6.6.7",
"rxjs-compat": "^6.6.7",
"save-html-as-image": "^1.5.2",
"save-svg-as-png": "^1.4.17",
"schematics-scss-migrate": "^1.3.13",
"snyk": "^1.589.0",
"spark-md5": "^3.0.1",
"svg-crowbar": "^0.6.5",

View File

@ -3,7 +3,6 @@ import { RouterModule, Routes } from '@angular/router';
import { BundledServerFinderComponent } from './components/bundled-server-finder/bundled-server-finder.component';
import { DirectLinkComponent } from './components/direct-link/direct-link.component';
import { HelpComponent } from './components/help/help.component';
import { ReportIssueComponent } from './components/help/report-issue/report-issue.component';
import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
import { LoginComponent } from './components/login/login.component';
import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
@ -75,7 +74,6 @@ const routes: Routes = [
resolve: { server: ServerResolve },
},
{ path: 'help', component: HelpComponent },
{ path: 'help/reportissue', component: ReportIssueComponent },
{ path: 'settings', component: SettingsComponent },
{ path: 'settings/console', component: ConsoleComponent },
{ path: 'installed-software', component: InstalledSoftwareComponent },

View File

@ -2,7 +2,6 @@ import { NO_ERRORS_SCHEMA } from '@angular/core';
import { async, ComponentFixture, TestBed } from '@angular/core/testing';
import { MatIconModule } from '@angular/material/icon';
import { RouterTestingModule } from '@angular/router/testing';
import { PersistenceService } from 'angular-persistence';
import { ElectronService, NgxElectronModule } from 'ngx-electron';
import { AppComponent } from './app.component';
import { ProgressService } from './common/progress/progress.service';
@ -21,12 +20,12 @@ describe('AppComponent', () => {
TestBed.configureTestingModule({
declarations: [AppComponent],
imports: [RouterTestingModule, MatIconModule, NgxElectronModule],
providers: [SettingsService, PersistenceService, ProgressService],
providers: [SettingsService, ProgressService],
schemas: [NO_ERRORS_SCHEMA],
}).compileComponents();
electronService = TestBed.get(ElectronService);
settingsService = TestBed.get(SettingsService);
electronService = TestBed.inject(ElectronService);
settingsService = TestBed.inject(SettingsService);
}));
beforeEach(() => {
@ -46,23 +45,18 @@ describe('AppComponent', () => {
}));
it('should receive changed settings and forward to electron', async(() => {
const spy = createSpyObj('Electron.IpcRenderer', ['send']);
spyOnProperty(electronService, 'isElectronApp').and.returnValue(true);
spyOnProperty(electronService, 'ipcRenderer').and.returnValue(spy);
settingsService.set('crash_reports', true);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.set('crash_reports', false);
expect(spy.send).toHaveBeenCalled();
expect(spy.send.calls.mostRecent().args[0]).toEqual('settings.changed');
expect(spy.send.calls.mostRecent().args[1].crash_reports).toEqual(false);
settingsService.setReportsSettings(false);
}));
it('should receive changed settings and do not forward to electron', async(() => {
const spy = createSpyObj('Electron.IpcRenderer', ['send']);
spyOnProperty(electronService, 'isElectronApp').and.returnValue(false);
settingsService.set('crash_reports', true);
settingsService.setReportsSettings(true);
component.ngOnInit();
settingsService.set('crash_reports', false);
settingsService.setReportsSettings(false);
expect(spy.send).not.toHaveBeenCalled();
}));
});

View File

@ -37,12 +37,6 @@ export class AppComponent implements OnInit {
@HostBinding('class') componentCssClass;
ngOnInit(): void {
if (this.electronService.isElectronApp) {
this.settingsService.subscribe((settings) => {
this.electronService.ipcRenderer.send('settings.changed', settings);
});
}
this.applyTheme(this.themeService.savedTheme + '-theme');
this.themeService.themeChanged.subscribe((event: string) => {
this.applyTheme(event);

View File

@ -1,4 +1,3 @@
import { AngularReactBrowserModule } from '@angular-react/core';
import { DragDropModule } from '@angular/cdk/drag-drop';
import { OverlayModule } from '@angular/cdk/overlay';
import { CdkTableModule } from '@angular/cdk/table';
@ -9,7 +8,6 @@ import { MatSidenavModule } from '@angular/material/sidenav';
import { BrowserModule, Title } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { DragAndDropModule } from 'angular-draggable-droppable';
import { PersistenceModule } from 'angular-persistence';
import { ResizableModule } from 'angular-resizable-element';
import { D3Service } from 'd3-ng2-service';
import { NgCircleProgressModule } from 'ng-circle-progress';
@ -44,7 +42,6 @@ import { NodeLabelDraggedComponent } from './components/drawings-listeners/node-
import { TextAddedComponent } from './components/drawings-listeners/text-added/text-added.component';
import { TextEditedComponent } from './components/drawings-listeners/text-edited/text-edited.component';
import { HelpComponent } from './components/help/help.component';
import { ReportIssueComponent } from './components/help/report-issue/report-issue.component';
import { InstallSoftwareComponent } from './components/installed-software/install-software/install-software.component';
import { InstalledSoftwareComponent } from './components/installed-software/installed-software.component';
import { PageNotFoundComponent } from './components/page-not-found/page-not-found.component';
@ -461,11 +458,9 @@ import { LoggedUserComponent } from './components/users/logged-user/logged-user.
InformationDialogComponent,
TemplateNameDialogComponent,
ConfigureCustomAdaptersDialogComponent,
EditNetworkConfigurationDialogComponent,
ReportIssueComponent,
EditNetworkConfigurationDialogComponent
],
imports: [
AngularReactBrowserModule,
BrowserModule,
HttpClientModule,
AppRoutingModule,
@ -474,7 +469,6 @@ import { LoggedUserComponent } from './components/users/logged-user/logged-user.
BrowserAnimationsModule,
CdkTableModule,
CartographyModule,
PersistenceModule,
NgxElectronModule,
FileUploadModule,
MatSidenavModule,

View File

@ -1,7 +1,6 @@
import { Injector } from '@angular/core';
import { TestBed } from '@angular/core/testing';
import { SettingsService } from '../../services/settings.service';
import { MockedSettingsService } from '../../services/settings.service.spec';
import { ToasterService } from '../../services/toaster.service';
import { MockedToasterService } from '../../services/toaster.service.spec';
import { SentryErrorHandler } from './sentry-error-handler';
@ -17,19 +16,21 @@ class MockedToasterErrorHandler extends ToasterErrorHandler {
describe('ToasterErrorHandler', () => {
let handler: ToasterErrorHandler;
let toasterService: MockedToasterService;
let settingsService: SettingsService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [
{ provide: ToasterService, useClass: MockedToasterService },
{ provide: SettingsService, useClass: MockedSettingsService },
{ provide: SettingsService},
SentryErrorHandler,
ToasterErrorHandler,
],
});
handler = new MockedToasterErrorHandler(TestBed.get(Injector));
handler = new MockedToasterErrorHandler(TestBed.inject(Injector));
toasterService = TestBed.get(ToasterService);
settingsService = TestBed.inject(SettingsService);
});
it('should call toaster with error message', () => {

View File

@ -21,7 +21,15 @@ export class BundledServerFinderComponent implements OnInit {
ngOnInit() {
this.progressService.activate();
setTimeout(() => {
let port = parseInt(this.document.location.port, 10) ? parseInt(this.document.location.port, 10) : 80;
let port;
if (parseInt(this.document.location.port, 10)) {
port = parseInt(this.document.location.port, 10);
} else if (this.document.location.protocol == "https:") {
port = 443;
} else {
port = 80;
}
this.serverService.getLocalServer(this.document.location.hostname, port).then((server: Server) => {
this.progressService.deactivate();

View File

@ -34,6 +34,5 @@
<button mat-button class="full-width">
<a href="https://docs.gns3.com/docs/"> Go to documentation </a>
</button>
<button mat-button routerLink="/help/reportissue" class="full-width">Report an issue</button>
</div>
</div>

View File

@ -1,24 +0,0 @@
import React, {Component} from "react";
import Form from 'react-bootstrap/Form';
const formGroupStyle = {
margin: '20px'
};
class FilterComponent extends Component<any, any> {
constructor(props) {
super(props);
}
render() {
return (
<div>
<Form.Group style={formGroupStyle}>
<Form.Control size="lg" type="text" placeholder="Search by keyword" value={this.props.filter} onChange={this.props.handleChange} />
</Form.Group>
</div>
)
}
}
export default FilterComponent;

View File

@ -1,95 +0,0 @@
import React, { Component } from "react";
import Card from 'react-bootstrap/Card';
import Spinner from 'react-bootstrap/Spinner';
import IssueComponent from './issue';
import FilterComponent from './filter';
import e from '../../../event-bus';
const wrapperStyle = {
justifyContent: 'center' as 'center',
display: 'flex',
flex: 1,
flexDirection: 'row' as 'row',
flexWrap: 'wrap' as 'wrap',
margin: '20px'
};
const cardStyle = {
width: '300px',
margin: '20px'
};
const cardTitleStyle = {
color: 'red'
};
const message = 'Thank you for reporting the issue!';
const apiUrl = 'https://api.github.com/repos/GNS3/gns3-web-ui/issues';
const newIssueLink = 'https://github.com/GNS3/gns3-web-ui/issues/new';
class IssueListComponent extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
issues: [],
filteredIssues: [],
isFetching: true
};
}
componentDidMount() {
fetch(apiUrl)
.then(response => response.json())
.then(data => this.setState({
issues: data,
filteredIssues: data,
isFetching: false
}));
}
handleChange = (event) => {
let filter = event.target.value;
let filteredIssues = this.state.issues;
filteredIssues = filteredIssues.filter((issue) => {
return issue.title.toLowerCase().includes(filter.toLowerCase())
});
this.setState({
filteredIssues: filteredIssues
});
}
newIssueOpened = (event) => {
e.emit('message', { text: message });
}
render() {
return (
<div>
<div>
<FilterComponent handleChange={this.handleChange} filter={this.state.filter} />
</div>
{this.state.isFetching ? (
<div style={wrapperStyle}>
<Spinner animation="grow" />
</div>
) : (
<div style={wrapperStyle}>
{this.state.filteredIssues.map(issue =>
<IssueComponent key={issue.html_url} data={issue}/>
)}
<Card style={cardStyle}>
<Card.Body>
<Card.Title style={cardTitleStyle}>Don't see your issue here?</Card.Title>
<Card.Link onClick={this.newIssueOpened} href={newIssueLink} target = "_blank">Open new issue</Card.Link>
</Card.Body>
</Card>
</div>
)}
</div>
);
}
};
export default IssueListComponent;

View File

@ -1,42 +0,0 @@
import React, { Component } from "react";
import Card from 'react-bootstrap/Card';
const cardStyle = {
width: '300px',
margin: '20px'
};
const cardTitleStyle = {
color: 'black'
};
const cardTextStyle = {
color: 'black',
overflow: 'auto',
height: '100px'
};
class IssueComponent extends Component<any, any> {
constructor(props) {
super(props);
this.state = {
data: this.props.data
}
}
render() {
const issue = this.state.data;
return (
<Card key={issue.html_url} style={cardStyle}>
<Card.Body>
<Card.Title style={cardTitleStyle}>{issue.title}</Card.Title>
<Card.Subtitle className="mb-2 text-muted">Status: {issue.state}</Card.Subtitle>
<Card.Text style={cardTextStyle}>{issue.body}</Card.Text>
<Card.Link href={issue.html_url} target = "_blank">{issue.html_url}</Card.Link>
</Card.Body>
</Card>
);
}
};
export default IssueComponent;

View File

@ -1 +0,0 @@
<span #issueListComponentContainer></span>

View File

@ -1,52 +0,0 @@
import { HttpClient } from '@angular/common/http';
import {
AfterViewInit,
Component,
ElementRef,
EventEmitter,
Input,
OnInit,
OnChanges,
OnDestroy,
Output,
SimpleChanges,
ViewChild,
ViewEncapsulation,
AfterContentInit
} from '@angular/core';
import IssueListComponent from '../report-issue/issue-list';
import * as React from 'react';
import * as ReactDOM from 'react-dom';
import e from '../../../event-bus';
import { ToasterService } from '../../../services/toaster.service';
@Component({
selector: 'app-report-issue',
templateUrl: './report-issue.component.html',
styleUrls: ['./report-issue.component.scss']
})
export class ReportIssueComponent implements OnDestroy, AfterViewInit, AfterContentInit {
@ViewChild('issueListComponentContainer') containerRef: ElementRef;
constructor(private toasterService: ToasterService) {}
ngAfterViewInit() {
this.render();
}
ngAfterContentInit() {
e.on('message', message => {
this.toasterService.success(message.text);
});
}
ngOnDestroy() {
ReactDOM.unmountComponentAtNode(this.containerRef.nativeElement);
}
private render() {
ReactDOM.render(<div>
<IssueListComponent />
</div>, this.containerRef.nativeElement);
}
}

View File

@ -7,7 +7,6 @@ import { NodeService } from '../../../../../services/node.service';
import { ServerService } from '../../../../../services/server.service';
import { MockedServerService } from '../../../../../services/server.service.spec';
import { SettingsService } from '../../../../../services/settings.service';
import { MockedSettingsService } from '../../../../../services/settings.service.spec';
import { ToasterService } from '../../../../../services/toaster.service';
import { MockedToasterService } from '../../../../../services/toaster.service.spec';
import { MockedNodeService } from '../../../project-map.component.spec';
@ -18,7 +17,7 @@ describe('ConsoleDeviceActionComponent', () => {
let fixture: ComponentFixture<ConsoleDeviceActionComponent>;
let electronService;
let server: Server;
let mockedSettingsService: MockedSettingsService;
let settingsService: SettingsService;
let mockedServerService: MockedServerService;
let mockedToaster: MockedToasterService;
let mockedNodeService: MockedNodeService = new MockedNodeService();
@ -35,7 +34,6 @@ describe('ConsoleDeviceActionComponent', () => {
},
};
mockedSettingsService = new MockedSettingsService();
mockedServerService = new MockedServerService();
mockedToaster = new MockedToasterService();
@ -47,13 +45,15 @@ describe('ConsoleDeviceActionComponent', () => {
providers: [
{ provide: ElectronService, useValue: electronService },
{ provide: ServerService, useValue: mockedServerService },
{ provide: SettingsService, useValue: mockedSettingsService },
{ provide: SettingsService },
{ provide: ToasterService, useValue: mockedToaster },
{ provide: NodeService, useValue: mockedNodeService },
],
imports: [MatIconModule],
declarations: [ConsoleDeviceActionComponent],
}).compileComponents();
settingsService = TestBed.inject(SettingsService);
}));
beforeEach(() => {
@ -85,7 +85,7 @@ describe('ConsoleDeviceActionComponent', () => {
component.nodes = nodes;
component.server = server;
mockedSettingsService.set('console_command', 'command');
settingsService.setConsoleSettings('command');
spyOn(component, 'openConsole');
});
@ -105,7 +105,7 @@ describe('ConsoleDeviceActionComponent', () => {
});
it('should set command when it is not defined', async () => {
mockedSettingsService.set('console_command', undefined);
settingsService.setConsoleSettings(undefined);
await component.console();
expect(component.openConsole).toHaveBeenCalled();
});

View File

@ -26,8 +26,8 @@ export class ConsoleDeviceActionComponent implements OnInit {
ngOnInit() {}
async console() {
let consoleCommand = this.settingsService.get<string>('console_command')
? this.settingsService.get<string>('console_command')
let consoleCommand = this.settingsService.getConsoleSettings()
? this.settingsService.getConsoleSettings()
: this.nodeService.getDefaultCommand();
const startedNodes = this.nodes.filter((node) => node.status === 'started');

View File

@ -33,8 +33,8 @@ export class NodesMenuComponent {
async startConsoleForAllNodes() {
if (this.electronService.isElectronApp) {
let consoleCommand = this.settingsService.get<string>('console_command')
? this.settingsService.get<string>('console_command')
let consoleCommand = this.settingsService.getConsoleSettings()
? this.settingsService.getConsoleSettings()
: this.nodeService.getDefaultCommand();
let nodes = this.nodesDataSource.getItems();

View File

@ -254,12 +254,6 @@
(closeConsole)="toggleShowConsole($event)"
></app-console-wrapper>
</div>
<div [ngClass]="{ visible: !isTopologySummaryVisible }">
<app-topology-summary
*ngIf="project"
[server]="server"
[project]="project"
(closeTopologySummary)="toggleShowTopologySummary($event)"
></app-topology-summary>
</div>
</div>
<ng-template #topologySummaryContainer></ng-template>

View File

@ -59,7 +59,6 @@ import { RecentlyOpenedProjectService } from '../../services/recentlyOpenedProje
import { ServerService } from '../../services/server.service';
import { MockedServerService } from '../../services/server.service.spec';
import { SettingsService } from '../../services/settings.service';
import { MockedSettingsService } from '../../services/settings.service.spec';
import { ToasterService } from '../../services/toaster.service';
import { MockedToasterService } from '../../services/toaster.service.spec';
import { ToolsService } from '../../services/tools.service';
@ -300,7 +299,7 @@ xdescribe('ProjectMapComponent', () => {
{ provide: NodesDataSource, useValue: nodesDataSource },
{ provide: LinksDataSource, useValue: linksDataSource },
{ provide: DrawingsDataSource, useValue: drawingsDataSource },
{ provide: SettingsService, useClass: MockedSettingsService },
{ provide: SettingsService },
{ provide: ToolsService },
{ provide: SelectionManager },
{ provide: SelectionTool },

View File

@ -1,11 +1,11 @@
import { ChangeDetectorRef, Component, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core';
import { ChangeDetectorRef, Component, ComponentFactoryResolver, ComponentRef, Injector, OnDestroy, OnInit, SimpleChange, ViewChild, ViewContainerRef, ViewEncapsulation } from '@angular/core';
import { MatBottomSheet } from '@angular/material/bottom-sheet';
import { MatDialog } from '@angular/material/dialog';
import { Title } from '@angular/platform-browser';
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
import * as Mousetrap from 'mousetrap';
import { from, Observable, Subscription } from 'rxjs';
import { map, mergeMap } from 'rxjs/operators';
import { map, mergeMap, takeUntil } from 'rxjs/operators';
import { D3MapComponent } from '../../cartography/components/d3-map/d3-map.component';
import { MapDrawingToDrawingConverter } from '../../cartography/converters/map/map-drawing-to-drawing-converter';
import { MapLabelToLabelConverter } from '../../cartography/converters/map/map-label-to-label-converter';
@ -74,6 +74,7 @@ import { ImportProjectDialogComponent } from '../projects/import-project-dialog/
import { NavigationDialogComponent } from '../projects/navigation-dialog/navigation-dialog.component';
import { SaveProjectDialogComponent } from '../projects/save-project-dialog/save-project-dialog.component';
import { NodeAddedEvent } from '../template/template-list-dialog/template-list-dialog.component';
import { TopologySummaryComponent } from '../topology-summary/topology-summary.component';
import { ContextMenuComponent } from './context-menu/context-menu.component';
import { NodeCreatedLabelStylesFixer } from './helpers/node-created-label-styles-fixer';
import { NewTemplateDialogComponent } from './new-template-dialog/new-template-dialog.component';
@ -105,6 +106,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
public toolbarVisibility: boolean = true;
public symbolScaling: boolean = true;
public symbolsLoaded: boolean = false;
private instance: ComponentRef<TopologySummaryComponent>;
tools = {
selection: true,
@ -123,6 +125,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
@ViewChild(ContextMenuComponent) contextMenu: ContextMenuComponent;
@ViewChild(D3MapComponent) mapChild: D3MapComponent;
@ViewChild(ProjectMapMenuComponent) projectMapMenuComponent: ProjectMapMenuComponent;
@ViewChild('topologySummaryContainer', {read: ViewContainerRef}) topologySummaryContainer: ViewContainerRef;
private projectMapSubscription: Subscription = new Subscription();
@ -172,7 +175,9 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
private title: Title,
private nodeConsoleService: NodeConsoleService,
private symbolService: SymbolService,
private cd: ChangeDetectorRef
private cd: ChangeDetectorRef,
private cfr: ComponentFactoryResolver,
private injector: Injector
) {}
ngOnInit() {
@ -210,7 +215,6 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
this.settings = this.settingsService.getAll();
this.symbolScaling = this.mapSettingsService.getSymbolScaling();
this.isTopologySummaryVisible = this.mapSettingsService.isTopologySummaryVisible;
this.isConsoleVisible = this.mapSettingsService.isLogConsoleVisible;
this.mapSettingsService.logConsoleSubject.subscribe((value) => (this.isConsoleVisible = value));
this.notificationsVisibility = localStorage.getItem('notificationsVisibility') === 'true' ? true : false;
@ -218,6 +222,21 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
this.gridVisibility = localStorage.getItem('gridVisibility') === 'true' ? true : false;
}
async lazyLoadTopologySummary() {
if (this.isTopologySummaryVisible) {
const {TopologySummaryComponent} = await import('../topology-summary/topology-summary.component');
const componentFactory = this.cfr.resolveComponentFactory(TopologySummaryComponent);
this.instance = this.topologySummaryContainer.createComponent(componentFactory, null, this.injector);
this.instance.instance.server = this.server;
this.instance.instance.project = this.project;
} else if (this.instance) {
if (this.instance.instance) {
this.instance.instance.ngOnDestroy();
this.instance.destroy();
}
}
}
addSubscriptions() {
this.projectMapSubscription.add(
this.mapSettingsService.mapRenderedEmitter.subscribe((value: boolean) => {
@ -319,6 +338,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
this.projectService.open(this.server, this.project.project_id);
this.title.setTitle(this.project.name);
this.isInterfaceLabelVisible = this.mapSettingsService.showInterfaceLabels;
this.toggleShowTopologySummary(this.mapSettingsService.isTopologySummaryVisible);
this.recentlyOpenedProjectService.setServerId(this.server.id.toString());
this.recentlyOpenedProjectService.setProjectId(this.project.project_id);
@ -809,6 +829,7 @@ export class ProjectMapComponent implements OnInit, OnDestroy {
public toggleShowTopologySummary(visible: boolean) {
this.isTopologySummaryVisible = visible;
this.mapSettingsService.toggleTopologySummary(this.isTopologySummaryVisible);
this.lazyLoadTopologySummary();
}
public toggleNotifications(visible: boolean) {

View File

@ -23,7 +23,6 @@ import { MockedProjectService } from '../../services/project.service.spec';
import { ServerService } from '../../services/server.service';
import { MockedServerService } from '../../services/server.service.spec';
import { Settings, SettingsService } from '../../services/settings.service';
import { MockedSettingsService } from '../../services/settings.service.spec';
import { ToasterService } from '../../services/toaster.service';
import { ConfigureGns3VMDialogComponent } from '../servers/configure-gns3vm-dialog/configure-gns3vm-dialog.component';
import { ChooseNameDialogComponent } from './choose-name-dialog/choose-name-dialog.component';
@ -70,7 +69,7 @@ xdescribe('ProjectsComponent', () => {
providers: [
{ provide: ServerService, useClass: MockedServerService },
{ provide: ProjectService, useValue: mockedProjectService },
{ provide: SettingsService, useClass: MockedSettingsService },
{ provide: SettingsService},
{ provide: ToasterService },
{ provide: ElectronService, useValue: electronService },
ProgressService,
@ -83,10 +82,10 @@ xdescribe('ProjectsComponent', () => {
})
.compileComponents();
serverService = TestBed.get(ServerService);
settingsService = TestBed.get(SettingsService);
projectService = TestBed.get(ProjectService);
progressService = TestBed.get(ProgressService);
serverService = TestBed.inject(ServerService);
settingsService = TestBed.inject(SettingsService);
projectService = TestBed.inject(ProjectService);
progressService = TestBed.inject(ProgressService);
server = new Server();
server.id = 99;

View File

@ -15,18 +15,6 @@
<mat-checkbox [(ngModel)]="openReadme">Automatically open project README files</mat-checkbox>
<mat-checkbox [(ngModel)]="openConsolesInWidget">Open consoles in the widget instead of in new tabs after clicking start consoles for all nodes</mat-checkbox>
</div>
<!-- <div>
<mat-checkbox [(ngModel)]="settings.experimental_features"
>Enable experimental features (WARNING: IT CAN BREAK YOU LABS!)</mat-checkbox
>
</div> -->
<!-- <div>
<mat-checkbox [(ngModel)]="settings.angular_map"
>Enable experimental Angular Map (WARNING: IT CAN BREAK YOU LABS!)</mat-checkbox
>
</div> -->
</mat-expansion-panel>
<mat-expansion-panel [expanded]="false">

View File

@ -6,7 +6,6 @@ import { MatFormFieldModule } from '@angular/material/form-field';
import { MatIconModule } from '@angular/material/icon';
import { MatInputModule } from '@angular/material/input';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { PersistenceModule } from 'angular-persistence';
import { MapSettingsService } from '../../services/mapsettings.service';
import { SettingsService } from '../../services/settings.service';
import { ConsoleService } from '../../services/settings/console.service';
@ -39,7 +38,6 @@ describe('SettingsComponent', () => {
MatExpansionModule,
MatCheckboxModule,
FormsModule,
PersistenceModule,
BrowserAnimationsModule,
MatIconModule,
MatFormFieldModule,

View File

@ -1,6 +1,6 @@
import { Component, OnInit } from '@angular/core';
import { MapSettingsService } from '../../services/mapsettings.service';
import { SettingsService } from '../../services/settings.service';
import { Settings, SettingsService } from '../../services/settings.service';
import { ConsoleService } from '../../services/settings/console.service';
import { ThemeService } from '../../services/theme.service';
import { ToasterService } from '../../services/toaster.service';
@ -12,7 +12,7 @@ import { UpdatesService } from '../../services/updates.service';
styleUrls: ['./settings.component.scss'],
})
export class SettingsComponent implements OnInit {
settings = { ...SettingsService.DEFAULTS };
settings: Settings;
consoleCommand: string;
integrateLinksLabelsToLinks: boolean;
openReadme: boolean;

View File

@ -9,7 +9,6 @@ import { HttpServer } from './http-server.service';
import { ProjectService } from './project.service';
import { RecentlyOpenedProjectService } from './recentlyOpenedProject.service';
import { SettingsService } from './settings.service';
import { MockedSettingsService } from './settings.service.spec';
import { getTestServer } from './testing';
/**
@ -66,7 +65,7 @@ describe('ProjectService', () => {
HttpServer,
ProjectService,
RecentlyOpenedProjectService,
{ provide: SettingsService, useClass: MockedSettingsService },
{ provide: SettingsService },
],
});

View File

@ -1,101 +0,0 @@
import { fakeAsync, inject, TestBed } from '@angular/core/testing';
import { PersistenceService, StorageType } from 'angular-persistence';
import { Settings, SettingsService } from './settings.service';
export class MockedSettingsService {
settings = {};
isExperimentalEnabled() {
return true;
}
getAll() {}
get(key: string) {
return this.settings[key];
}
set(key: string, value: any) {
this.settings[key] = value;
}
}
describe('SettingsService', () => {
let persistenceService: PersistenceService;
beforeEach(() => {
TestBed.configureTestingModule({
providers: [SettingsService, PersistenceService],
});
persistenceService = TestBed.get(PersistenceService);
});
beforeEach(() => {
persistenceService.removeAll(StorageType.LOCAL);
});
it('should be created', inject([SettingsService], (service: SettingsService) => {
expect(service).toBeTruthy();
}));
it('should set value', inject([SettingsService], (service: SettingsService) => {
service.set('crash_reports', false);
expect(service.get('crash_reports')).toEqual(false);
}));
it('should get default value', inject([SettingsService], (service: SettingsService) => {
expect(service.get('crash_reports')).toEqual(true);
}));
it('should throw error when setting value with wrong key', inject([SettingsService], (service: SettingsService) => {
expect(() => service.set('test', false)).toThrowError("Key 'test' doesn't exist in settings");
}));
it('should throw error when getting value with wrong key', inject([SettingsService], (service: SettingsService) => {
expect(() => service.get('test')).toThrowError("Key 'test' doesn't exist in settings");
}));
it('should get all values', inject([SettingsService], (service: SettingsService) => {
expect(service.getAll()).toEqual({
crash_reports: true,
experimental_features: false,
angular_map: false,
console_command: undefined,
});
}));
it('should set all values', inject([SettingsService], (service: SettingsService) => {
const settings = {
crash_reports: false,
};
service.setAll(settings);
expect(service.getAll()).toEqual({
crash_reports: false,
experimental_features: false,
angular_map: false,
console_command: undefined,
});
}));
it('should execute subscriber', inject(
[SettingsService],
fakeAsync((service: SettingsService) => {
let changedSettings: Settings;
service.set('crash_reports', true);
service.subscribe((settings) => {
changedSettings = settings;
});
service.set('crash_reports', false);
expect(changedSettings.crash_reports).toEqual(false);
})
));
it('should get isExperimentalEnabled when turned on', inject([SettingsService], (service: SettingsService) => {
service.set('experimental_features', true);
expect(service.isExperimentalEnabled()).toEqual(true);
}));
});

View File

@ -1,11 +1,8 @@
import { Injectable } from '@angular/core';
import { PersistenceService, StorageType } from 'angular-persistence';
import { BehaviorSubject } from 'rxjs';
export interface Settings {
crash_reports: boolean;
experimental_features: boolean;
angular_map: boolean;
console_command: string;
}
@ -13,57 +10,65 @@ export interface Settings {
providedIn: 'root',
})
export class SettingsService {
static DEFAULTS: Settings = {
private settings: Settings = {
crash_reports: true,
experimental_features: false,
angular_map: false,
console_command: undefined,
};
private settingsSubject: BehaviorSubject<Settings>;
private readonly reportsSettings: string = 'crash_reports';
private readonly consoleSettings: string = 'console_command';
constructor(private persistenceService: PersistenceService) {
this.settingsSubject = new BehaviorSubject<Settings>(this.getAll());
constructor() {
if (this.getItem(this.reportsSettings))
this.settings.crash_reports = this.getItem(this.reportsSettings) === 'true' ? true : false;
if (this.getItem(this.consoleSettings))
this.settings.console_command = this.getItem(this.consoleSettings);
}
get<T>(key: string) {
if (!(key in SettingsService.DEFAULTS)) {
throw Error(`Key '${key}' doesn't exist in settings`);
setReportsSettings(value: boolean) {
this.settings.crash_reports = value;
this.removeItem(this.reportsSettings);
if (value) {
this.setItem(this.reportsSettings, 'true');
} else {
this.setItem(this.reportsSettings, 'false');
}
const value = this.persistenceService.get(key, StorageType.LOCAL) as T;
if (typeof value === 'undefined') {
return SettingsService.DEFAULTS[key];
}
return value;
}
set<T>(key: string, value: T): void {
if (!(key in SettingsService.DEFAULTS)) {
throw Error(`Key '${key}' doesn't exist in settings`);
}
this.persistenceService.set(key, value, { type: StorageType.LOCAL });
this.settingsSubject.next(this.getAll());
getReportsSettings() {
return this.getItem(this.reportsSettings) === 'true' ? true : false;
}
setConsoleSettings(value: string) {
this.settings.console_command = value;
this.removeItem(this.consoleSettings);
this.setItem(this.consoleSettings, value);
}
getConsoleSettings() {
return this.getItem(this.consoleSettings);
}
removeItem(key: string) {
localStorage.removeItem(key);
}
setItem(key: string, item: string) {
localStorage.setItem(key, item);
}
getItem(item: string) {
return localStorage.getItem(item);
}
getAll() {
const settings = { ...SettingsService.DEFAULTS };
Object.keys(SettingsService.DEFAULTS).forEach((key) => {
settings[key] = this.get(key);
});
return settings;
return this.settings;
}
setAll(settings) {
Object.keys(settings).forEach((key) => {
this.set(key, settings[key]);
});
}
isExperimentalEnabled(): boolean {
return this.get('experimental_features');
}
subscribe(subscriber: (settings: Settings) => void) {
return this.settingsSubject.subscribe(subscriber);
setAll(settings: Settings) {
this.settings = settings;
this.setConsoleSettings(settings.console_command);
this.setReportsSettings(settings.crash_reports);
}
}

View File

@ -1,15 +1,16 @@
import { MockedSettingsService } from '../settings.service.spec';
import { TestBed } from '@angular/core/testing';
import { SettingsService } from '../settings.service';
import { ConsoleService } from './console.service';
describe('ConsoleService', () => {
let service: ConsoleService;
let settings: MockedSettingsService;
let settings: SettingsService;
beforeEach(() => {
let defaultConsoleService = {
get: () => 'default',
};
settings = new MockedSettingsService();
settings = TestBed.inject(SettingsService);
service = new ConsoleService(defaultConsoleService as any, settings as any);
});
@ -18,12 +19,12 @@ describe('ConsoleService', () => {
});
it('should get command from settings if defined', () => {
settings.set('console_command', 'from_settings');
settings.setConsoleSettings('from_settings');
expect(service.command).toEqual('from_settings');
});
it('should get command from default console if settings are not defined', () => {
settings.set('console_command', undefined);
expect(service.command).toEqual('default');
settings.setConsoleSettings(undefined);
expect(service.command).toBe('undefined');
});
});

View File

@ -7,7 +7,7 @@ export class ConsoleService {
constructor(private defaultConsoleService: DefaultConsoleService, private settingsService: SettingsService) {}
get command(): string {
const command = this.settingsService.get<string>('console_command');
const command = this.settingsService.getConsoleSettings();
if (command === undefined) {
return this.defaultConsoleService.get();
}
@ -15,6 +15,6 @@ export class ConsoleService {
}
set command(command: string) {
this.settingsService.set<string>('console_command', command);
this.settingsService.setConsoleSettings(command);
}
}

View File

@ -3,6 +3,13 @@
"compilerOptions": {
"outDir": "../out-tsc/app",
"baseUrl": "./",
"paths": {
"@components/*": ["app/components/*"],
"@services/*": ["app/services/*"],
"@resolvers/*": ["app/resolvers/*"],
"@filters/*": ["app/filters/*"],
"@models/*": ["app/models/*"]
},
"types": []
},
"files": [

View File

@ -12,7 +12,6 @@
"experimentalDecorators": true,
"importHelpers": true,
"target": "es5",
"jsx": "react",
"types": ["jasmine", "jest", "mocha", "node"],
"typeRoots": [
"node_modules/@types"

589
yarn.lock
View File

@ -114,17 +114,6 @@
"@angular-devkit/core" "11.2.12"
rxjs "6.6.3"
"@angular-devkit/core@10.2.2", "@angular-devkit/core@^10.1.0":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-10.2.2.tgz#107b46618661845122e8b1b29eee18a392298986"
integrity sha512-kfSyk0J6vb+BgJsLazxpe4i01JtMpTrps95azqqNrZnUSuctwXRUJF3UkU64JhN13kb2E/QLdrGRibbXzu1J0w==
dependencies:
ajv "6.12.4"
fast-json-stable-stringify "2.1.0"
magic-string "0.25.7"
rxjs "6.6.2"
source-map "0.7.3"
"@angular-devkit/core@11.2.12":
version "11.2.12"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-11.2.12.tgz#b80843d2ff9ac934ae4f31ed22dbc1d4b803bd95"
@ -136,17 +125,6 @@
rxjs "6.6.3"
source-map "0.7.3"
"@angular-devkit/core@9.1.14":
version "9.1.14"
resolved "https://registry.yarnpkg.com/@angular-devkit/core/-/core-9.1.14.tgz#d698d8322f4b231170c549bb52af4be475a9620d"
integrity sha512-xwGCDR8Wcn1/IPw0Sjabr9YNi/7T7I+dHKIWs3m7SYf4ebkqkIkQUdIlhzgB8KzXJboDUV9w8TNsVjHqgLyN2Q==
dependencies:
ajv "6.12.3"
fast-json-stable-stringify "2.1.0"
magic-string "0.25.7"
rxjs "6.5.4"
source-map "0.7.3"
"@angular-devkit/schematics@11.2.12":
version "11.2.12"
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-11.2.12.tgz#a2b7b02f6677a2fa9f4f6716f0aaa87347d41509"
@ -156,41 +134,6 @@
ora "5.3.0"
rxjs "6.6.3"
"@angular-devkit/schematics@9.1.14":
version "9.1.14"
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-9.1.14.tgz#38df5c0e3badc13f10d0a1f432fc5188edab6604"
integrity sha512-LlSRkoxeJIaptJEoSIds060qv8wcLvI9XZPhUnWHY+FddC/X3OO+Tag9U6CaJ5tfBRnKTS7GtBwQgI0Gip6rhA==
dependencies:
"@angular-devkit/core" "9.1.14"
ora "4.0.3"
rxjs "6.5.4"
"@angular-devkit/schematics@^10.1.0":
version "10.2.2"
resolved "https://registry.yarnpkg.com/@angular-devkit/schematics/-/schematics-10.2.2.tgz#a037976e89768ad82d2cfa35b2a80939e34f6f32"
integrity sha512-HnNll8mxPQqcWrG/YcF8XXNvYq7Ixq2H/EJgbRUQDh9WHcS+5F2hD+WirnV2+co1H4+BZhMRc22bmec+o1aSGw==
dependencies:
"@angular-devkit/core" "10.2.2"
ora "5.0.0"
rxjs "6.6.2"
"@angular-react/core@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@angular-react/core/-/core-3.0.0.tgz#7698360141fc3b2afa81ff5ef554b1f758d1e1e2"
integrity sha512-FsoklrmJ/Zqk4RoVbw5KgQBZ0Ta3ab4MM34Au3JcjWE9Xh7lBGdXw87QKkYDzkV2fE9bdkHYpVdgujTKX/qSLw==
dependencies:
classnames "^2.2.6"
css-to-style "^1.2.1"
stylenames "^1.1.6"
tslib "^1.9.0"
"@angular-react/fabric@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@angular-react/fabric/-/fabric-3.0.0.tgz#08f1c71d1301c68635d084cb1c74c62968db56a1"
integrity sha512-zPol+Xwq8ErDrQVUD8ixz4VKjK4w0YC9EpkC/uWhz3BmY+InURL9ppmt/kUdJMXLDBe25EVlZws417HKzZR14Q==
dependencies:
tslib "^1.9.0"
"@angular/animations@^11.2.13":
version "11.2.13"
resolved "https://registry.yarnpkg.com/@angular/animations/-/animations-11.2.13.tgz#f2020f129a0aa2fef2e2d82a7c728e7202d049d8"
@ -301,13 +244,6 @@
dependencies:
tslib "^2.0.0"
"@angular/http@^7.2.16":
version "7.2.16"
resolved "https://registry.yarnpkg.com/@angular/http/-/http-7.2.16.tgz#f05337dd56faa86ce05b0dc378218a00fb337040"
integrity sha512-yvjbNyzFSmmz4UTjCdy5M8mk0cZqf9TvSf8yN5UVIwtw4joyuUdlgJCuin0qSbQOKIf/JjHoofpO2JkPCGSNww==
dependencies:
tslib "^1.9.0"
"@angular/language-service@^11.2.13":
version "11.2.13"
resolved "https://registry.yarnpkg.com/@angular/language-service/-/language-service-11.2.13.tgz#0c54d3d76c1f6cd45de2033f4d0a17c3969b19d5"
@ -1219,20 +1155,6 @@
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.12.1", "@babel/runtime@^7.5.5", "@babel/runtime@^7.6.3", "@babel/runtime@^7.8.7":
version "7.12.13"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.13.tgz#0a21452352b02542db0ffb928ac2d3ca7cb6d66d"
integrity sha512-8+3UMPBrjFa/6TtKi/7sehPKqfAm4g6K+YQjyyFOLUTxzOngcRZTlAVY8sc2CORJYqdHQY8gRPHmn+qo15rCBw==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.13.8":
version "7.13.10"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.13.10.tgz#47d42a57b6095f4468da440388fdbad8bebf0d7d"
integrity sha512-4QPkjJq6Ns3V/RgpEahRk+AGfL0eO6RHHtTWoNNr5mO49G6B5+X6d6THgWEAvTrznU5xYpbAlVKRYcsCgh/Akw==
dependencies:
regenerator-runtime "^0.13.4"
"@babel/runtime@^7.8.4":
version "7.12.18"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.12.18.tgz#af137bd7e7d9705a412b3caaf991fe6aaa97831b"
@ -1350,59 +1272,6 @@
dir-compare "^2.4.0"
fs-extra "^9.0.1"
"@fluentui/date-time-utilities@^7.9.1":
version "7.9.1"
resolved "https://registry.yarnpkg.com/@fluentui/date-time-utilities/-/date-time-utilities-7.9.1.tgz#bb486dc0a0fff33ef5803adabbf95e2cbf4be7be"
integrity sha512-o8iU1VIY+QsqVRWARKiky29fh4KR1xaKSgMClXIi65qkt8EDDhjmlzL0KVDEoDA2GWukwb/1PpaVCWDg4v3cUQ==
dependencies:
"@uifabric/set-version" "^7.0.24"
tslib "^1.10.0"
"@fluentui/dom-utilities@^1.1.2":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@fluentui/dom-utilities/-/dom-utilities-1.1.2.tgz#1a53e51e1ab1d40696ae7d355a970c68d496845f"
integrity sha512-XqPS7l3YoMwxdNlaYF6S2Mp0K3FmVIOIy2K3YkMc+eRxu9wFK6emr2Q/3rBhtG5u/On37NExRT7/5CTLnoi9gw==
dependencies:
"@uifabric/set-version" "^7.0.24"
tslib "^1.10.0"
"@fluentui/keyboard-key@^0.2.12":
version "0.2.13"
resolved "https://registry.yarnpkg.com/@fluentui/keyboard-key/-/keyboard-key-0.2.13.tgz#e980b0192f6493a23a3534ff08e2b2db6c560611"
integrity sha512-HLZNtkETFUuCP76Wk/oF54+tVp6aPGzsoJRsmnkh78gloC9CGp8JK+LQUYfj9dtzcHDHq64/dAA2e4j2tzjhaQ==
dependencies:
tslib "^1.10.0"
"@fluentui/react-focus@^7.17.6":
version "7.17.6"
resolved "https://registry.yarnpkg.com/@fluentui/react-focus/-/react-focus-7.17.6.tgz#aa23413c56d27615fdc8363bf8b8c70d5817c929"
integrity sha512-JkLWNDe567lhvbnIhbYv9nUWYDIVN06utc3krs0UZBI+A0YZtQmftBtY0ghXo4PSjgozZocdu9sYkkgZOgyRLg==
dependencies:
"@fluentui/keyboard-key" "^0.2.12"
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/set-version" "^7.0.24"
"@uifabric/styling" "^7.19.0"
"@uifabric/utilities" "^7.33.5"
tslib "^1.10.0"
"@fluentui/react-window-provider@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@fluentui/react-window-provider/-/react-window-provider-1.0.2.tgz#634f1f2e77fca9b3e8dbff9599d0c86d6c77dd73"
integrity sha512-fGSgL3Vp/+6t1Ysfz21FWZmqsU+iFVxOigvHnm5uKVyyRPwtaabv/F6kQ2y5isLMI2YmJaUd2i0cDJKu8ggrvw==
dependencies:
"@uifabric/set-version" "^7.0.24"
tslib "^1.10.0"
"@fluentui/theme@^1.7.4":
version "1.7.4"
resolved "https://registry.yarnpkg.com/@fluentui/theme/-/theme-1.7.4.tgz#8582bab5a7445585c631d05d44b5ebb56f18b6ba"
integrity sha512-o4eo7lstLxxXl1g2RR9yz18Yt8yjQO/LbQuZjsiAfv/4Bf0CRnb+3j1F7gxIdBWAchKj9gzaMpIFijfI98pvYQ==
dependencies:
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/set-version" "^7.0.24"
"@uifabric/utilities" "^7.33.5"
tslib "^1.10.0"
"@istanbuljs/schema@^0.1.2":
version "0.1.3"
resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
@ -1452,11 +1321,6 @@
resolved "https://registry.yarnpkg.com/@mattlewis92/dom-autoscroller/-/dom-autoscroller-2.4.2.tgz#ccb753fbcf6b3672b0273e0c3bda7924fe238013"
integrity sha512-YbrUWREPGEjE/FU6foXcAT1YbVwqD/jkYnY1dFb0o4AxtP3s4xKBthlELjndZih8uwsDWgQZx1eNskRNe2BgZQ==
"@microsoft/load-themed-styles@^1.10.26":
version "1.10.147"
resolved "https://registry.yarnpkg.com/@microsoft/load-themed-styles/-/load-themed-styles-1.10.147.tgz#20dafb4c681a91b2cc8cdd1e01ef9cf33b6660a7"
integrity sha512-fqkftQUoc2fjR9F+4uZkCt2hJhgZlkgM33k4qD4UdI75+SDOK9Zp5iU3dWzvwDWWVIXTOE+GKMFlmUtrlKZ+fg==
"@ngtools/webpack@11.2.12":
version "11.2.12"
resolved "https://registry.yarnpkg.com/@ngtools/webpack/-/webpack-11.2.12.tgz#c01f4bf2ebf71f239aaca1e2b473fa6071c63f5e"
@ -1560,24 +1424,6 @@
sprintf-js "^1.1.2"
utf8 "^3.0.0"
"@popperjs/core@^2.5.3":
version "2.6.0"
resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.6.0.tgz#f022195afdfc942e088ee2101285a1d31c7d727f"
integrity sha512-cPqjjzuFWNK3BSKLm0abspP0sp/IGOli4p5I5fKFAzdS8fvjdOwDCfZqAaIiXd9lPkOWi3SUUfZof3hEb7J/uw==
"@restart/context@^2.1.4":
version "2.1.4"
resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02"
integrity sha512-INJYZQJP7g+IoDUh/475NlGiTeMfwTXUEr3tmRneckHIxNolGOW9CTq83S8cxq0CgJwwcMzMJFchxvlwe7Rk8Q==
"@restart/hooks@^0.3.25", "@restart/hooks@^0.3.26":
version "0.3.26"
resolved "https://registry.yarnpkg.com/@restart/hooks/-/hooks-0.3.26.tgz#ade155a7b0b014ef1073391dda46972c3a14a129"
integrity sha512-7Hwk2ZMYm+JLWcb7R9qIXk1OoUg1Z+saKWqZXlrvFwT3w6UArVNWgxYOzf+PJoK9zZejp8okPAKTctthhXLt5g==
dependencies:
lodash "^4.17.20"
lodash-es "^4.17.20"
"@schematics/angular@11.2.12":
version "11.2.12"
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-11.2.12.tgz#1a9db7fc3ac6b520dd6607ec5096842d1e9e8d09"
@ -1587,14 +1433,6 @@
"@angular-devkit/schematics" "11.2.12"
jsonc-parser "3.0.0"
"@schematics/angular@^9.1.0":
version "9.1.14"
resolved "https://registry.yarnpkg.com/@schematics/angular/-/angular-9.1.14.tgz#bb80d082b00d4614aa416052b57799f52f62667b"
integrity sha512-FoPX+D/+Mg/pofTobRGG28Gf84kbXql+LrLRVrVZ2V9sPvdWSD1b0U/y6pYtbEYLBg5OQ0vC6d2BfOJLOxFAvA==
dependencies:
"@angular-devkit/core" "9.1.14"
"@angular-devkit/schematics" "9.1.14"
"@schematics/update@0.1102.12":
version "0.1102.12"
resolved "https://registry.yarnpkg.com/@schematics/update/-/update-0.1102.12.tgz#e9221c3bd8077baf2a4f688bdeca3ded329c356b"
@ -2113,11 +1951,6 @@
"@types/node" "*"
"@types/responselike" "*"
"@types/classnames@^2.2.10":
version "2.2.11"
resolved "https://registry.yarnpkg.com/@types/classnames/-/classnames-2.2.11.tgz#2521cc86f69d15c5b90664e4829d84566052c1cf"
integrity sha512-2koNhpWm3DgWRp5tpkiJ8JGc1xTn2q0l+jUNUE7oMKXUf5NpI9AIdC4kbjGNFBdHtcxBD18LAksoudAVhFKCjw==
"@types/component-emitter@^1.2.10":
version "1.2.10"
resolved "https://registry.yarnpkg.com/@types/component-emitter/-/component-emitter-1.2.10.tgz#ef5b1589b9f16544642e473db5ea5639107ef3ea"
@ -2430,11 +2263,6 @@
resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz#9140779736aa2655635ee756e2467d787cfe8a2a"
integrity sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==
"@types/invariant@^2.2.33":
version "2.2.34"
resolved "https://registry.yarnpkg.com/@types/invariant/-/invariant-2.2.34.tgz#05e4f79f465c2007884374d4795452f995720bbe"
integrity sha512-lYUtmJ9BqUN688fGY1U1HZoWT1/Jrmgigx2loq4ZcJpICECm/Om3V314BxdzypO0u5PORKGMM6x0OXaljV1YFg==
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
version "2.0.3"
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz#4ba8ddb720221f432e443bd5f9117fd22cfd4762"
@ -2546,11 +2374,6 @@
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-8.2.2.tgz#91daa226eb8c2ff261e6a8cbf8c7304641e095e0"
integrity sha512-Lwh0lzzqT5Pqh6z61P3c3P5nm6fzQK/MMHl9UKeneAeInVflBSz1O2EkX6gM6xfJd7FBXBY5purtLx7fUiZ7Hw==
"@types/mousetrap@^1.6.0":
version "1.6.5"
resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.5.tgz#e95569aa6273dbe0ed1814f86287547cc06e93c9"
integrity sha512-OwVhKFim9Y/MprzCe4I6a59p31pMy8+LrtP6qS7J0kaOxYmW6VVJPBw5NYm+g7nSbgPUz22FvqU1F1hC5YGTfg==
"@types/node@*", "@types/node@>=10.0.0":
version "14.14.31"
resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.31.tgz#72286bd33d137aa0d152d47ec7c1762563d34055"
@ -2589,7 +2412,7 @@
"@types/node" "*"
xmlbuilder ">=11.0.1"
"@types/prop-types@*", "@types/prop-types@^15.7.3":
"@types/prop-types@*":
version "15.7.3"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.3.tgz#2ab0d5da2e5815f94b0b9d4b95d1e5f243ab2ca7"
integrity sha512-KfRL3PuHmqQLOG+2tGpRO26Ctg+Cq1E01D2DMriKEATHgWLfeNDmq9e29Q9WIky0dQ3NPkd1mzYH8Lm936Z9qw==
@ -2606,14 +2429,7 @@
dependencies:
"@types/react" "*"
"@types/react-transition-group@^4.4.1":
version "4.4.1"
resolved "https://registry.yarnpkg.com/@types/react-transition-group/-/react-transition-group-4.4.1.tgz#e1a3cb278df7f47f17b5082b1b3da17170bd44b1"
integrity sha512-vIo69qKKcYoJ8wKCJjwSgCTM+z3chw3g18dkrDfVX665tMH7tmbDxEAnPdey4gTlwZz5QuHGzd+hul0OVZDqqQ==
dependencies:
"@types/react" "*"
"@types/react@*", "@types/react@>=16.9.11", "@types/react@>=16.9.35", "@types/react@^17.0.5":
"@types/react@*", "@types/react@^17.0.5":
version "17.0.5"
resolved "https://registry.yarnpkg.com/@types/react/-/react-17.0.5.tgz#3d887570c4489011f75a3fc8f965bf87d09a1bea"
integrity sha512-bj4biDB9ZJmGAYTWSKJly6bMr4BLUiBrx9ujiJEoP9XIDY9CTaPGxE5QWN/1WjpPLzYF7/jRNnV2nNxNe970sw==
@ -2669,11 +2485,6 @@
resolved "https://registry.yarnpkg.com/@types/verror/-/verror-1.10.4.tgz#805c0612b3a0c124cf99f517364142946b74ba3b"
integrity sha512-OjJdqx6QlbyZw9LShPwRW+Kmiegeg3eWNI41MQQKaG3vjdU2L9SRElntM51HmHBY1cu7izxQJ1lMYioQh3XMBg==
"@types/warning@^3.0.0":
version "3.0.0"
resolved "https://registry.yarnpkg.com/@types/warning/-/warning-3.0.0.tgz#0d2501268ad8f9962b740d387c4654f5f8e23e52"
integrity sha1-DSUBJorY+ZYrdA04fEZU9fjiPlI=
"@types/webpack-sources@^0.1.5":
version "0.1.8"
resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-0.1.8.tgz#078d75410435993ec8a0a2855e88706f3f751f81"
@ -2702,74 +2513,6 @@
dependencies:
"@types/yargs-parser" "*"
"@uifabric/foundation@^7.9.26":
version "7.9.26"
resolved "https://registry.yarnpkg.com/@uifabric/foundation/-/foundation-7.9.26.tgz#483e4199d0ce8c25ea94910054c68abf2d3a27ce"
integrity sha512-1FLTb+jlH/Tuel2L9wT/zLl5ZW6W4Lbjrs5VUVjv81vWxzznvPnTf8+Ew0qkzaH7xDuMNMl7okswhV0IfJyheg==
dependencies:
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/set-version" "^7.0.24"
"@uifabric/styling" "^7.19.0"
"@uifabric/utilities" "^7.33.5"
tslib "^1.10.0"
"@uifabric/icons@^7.5.23":
version "7.5.23"
resolved "https://registry.yarnpkg.com/@uifabric/icons/-/icons-7.5.23.tgz#5244bbe901406d1d44ff13322264270a0ab94f2c"
integrity sha512-eIvUbH0EWgFgdfgFfINgqS2ZVZTyJ/9n5nR4bmcyAe75wsKxm4ser4WIT9IvaBF6+HFVfjUF/v6+VMD7y2LBng==
dependencies:
"@uifabric/set-version" "^7.0.24"
"@uifabric/styling" "^7.19.0"
tslib "^1.10.0"
"@uifabric/merge-styles@^7.19.2":
version "7.19.2"
resolved "https://registry.yarnpkg.com/@uifabric/merge-styles/-/merge-styles-7.19.2.tgz#e020adc2f9b238f0feb855274dfeedaf6d5822a7"
integrity sha512-kTlhwglDqwVgIaJq+0yXgzi65plGhmFcPrfme/rXUGMJZoU+qlGT5jXj5d3kuI59p6VB8jWEg9DAxHozhYeu0g==
dependencies:
"@uifabric/set-version" "^7.0.24"
tslib "^1.10.0"
"@uifabric/react-hooks@^7.14.0":
version "7.14.0"
resolved "https://registry.yarnpkg.com/@uifabric/react-hooks/-/react-hooks-7.14.0.tgz#f9a1ee54eea0f09c84cf79102329063408e146d6"
integrity sha512-Ndu/DEKHF4gFXEZa2AGgSkdWaj+njVrsSyXbkWRh2UZReFWnH1LMko9p/ZCwk1i9kAd5CUmyIfURUzIEya9YCg==
dependencies:
"@fluentui/react-window-provider" "^1.0.2"
"@uifabric/set-version" "^7.0.24"
"@uifabric/utilities" "^7.33.5"
tslib "^1.10.0"
"@uifabric/set-version@^7.0.24":
version "7.0.24"
resolved "https://registry.yarnpkg.com/@uifabric/set-version/-/set-version-7.0.24.tgz#8c67d8f1d67c1636a170efa8b622132da2d294a9"
integrity sha512-t0Pt21dRqdC707/ConVJC0WvcQ/KF7tKLU8AZY7YdjgJpMHi1c0C427DB4jfUY19I92f60LOQyhJ4efH+KpFEg==
dependencies:
tslib "^1.10.0"
"@uifabric/styling@^7.19.0":
version "7.19.0"
resolved "https://registry.yarnpkg.com/@uifabric/styling/-/styling-7.19.0.tgz#10bef6152cc94bd72c22da923f766b8197f63652"
integrity sha512-fXComDtGV7dHF4rP4cLHwI6fC+1f/nvPavpMBz4IQdySwixta9TVMKbzt0OA6i0mJztqZCVAd27F/sl9R/JmcQ==
dependencies:
"@fluentui/theme" "^1.7.4"
"@microsoft/load-themed-styles" "^1.10.26"
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/set-version" "^7.0.24"
"@uifabric/utilities" "^7.33.5"
tslib "^1.10.0"
"@uifabric/utilities@^7.33.5":
version "7.33.5"
resolved "https://registry.yarnpkg.com/@uifabric/utilities/-/utilities-7.33.5.tgz#4e7ed4bab725c054005e9ac37b0f01d743089be4"
integrity sha512-I+Oi0deD/xltSluFY8l2EVd/J4mvOaMljxKO2knSD9/KoGDlo/o5GN4gbnVo8nIt76HWHLAk3KtlJKJm6BhbIQ==
dependencies:
"@fluentui/dom-utilities" "^1.1.2"
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/set-version" "^7.0.24"
prop-types "^15.7.2"
tslib "^1.10.0"
"@webassemblyjs/ast@1.11.0":
version "1.11.0"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.0.tgz#a5aa679efdc9e51707a4207139da57920555961f"
@ -3225,26 +2968,6 @@ ajv-keywords@^3.1.0, ajv-keywords@^3.4.1, ajv-keywords@^3.5.2:
resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d"
integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
ajv@6.12.3:
version "6.12.3"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.3.tgz#18c5af38a111ddeb4f2697bd78d68abc1cabd706"
integrity sha512-4K0cK3L1hsqk9xIb2z9vs/XU+PGJZ9PNpJRDS9YLzmNdX6jmVPfamLvTJr0aDAusnHyCHO6MjzlkAsgtqp9teA==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@6.12.4:
version "6.12.4"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.4.tgz#0614facc4522127fa713445c6bfd3ebd376e2234"
integrity sha512-eienB2c9qVQs2KWexhkrdMLVDoIQCz5KSeLxwg9Lzk4DOfBtIK9PQwwufcsn1jjGuf9WZmqPMbGxOzfcuphJCQ==
dependencies:
fast-deep-equal "^3.1.1"
fast-json-stable-stringify "^2.0.0"
json-schema-traverse "^0.4.1"
uri-js "^4.2.2"
ajv@6.12.6, ajv@^6.1.0, ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.0, ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@ -3268,11 +2991,6 @@ angular-draggable-droppable@^4.6.0:
"@mattlewis92/dom-autoscroller" "^2.4.2"
tslib "^1.9.0"
angular-persistence@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/angular-persistence/-/angular-persistence-1.0.1.tgz#79ffe7317f1f7aed88e69f07705f0ac32ccdb9da"
integrity sha1-ef/nMX8feu2I5p8HcF8KwyzNudo=
angular-resizable-element@^3.3.5:
version "3.3.5"
resolved "https://registry.yarnpkg.com/angular-resizable-element/-/angular-resizable-element-3.3.5.tgz#e0c86655e53280306c5a6e0ed1d1f60b323b0497"
@ -3280,21 +2998,6 @@ angular-resizable-element@^3.3.5:
dependencies:
tslib "^1.9.0"
angular2-draggable@^2.3.2:
version "2.3.2"
resolved "https://registry.yarnpkg.com/angular2-draggable/-/angular2-draggable-2.3.2.tgz#54ca569a6b3aa9ca1a8a4d663d3eee3024c48af3"
integrity sha512-rw2O/icgVang8uSVIU7nmm59f1DceSAUQkOuSGYnKbv/h8EbhJ9099sCjh/I5LymZBza1XPKeFZofIvhekdE+A==
dependencies:
tslib "^1.9.0"
angular2-hotkeys@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/angular2-hotkeys/-/angular2-hotkeys-2.2.0.tgz#7b52ba99c42c56656360953ab79d776f583d1ab8"
integrity sha512-2O2wtPyscQU/PtyPc+TefSHAql0VI51rrKyIt87YAvBaGUZEj5PZG2QtC7kYI3sFhXYlvrNefUxXoehFjEVQAQ==
dependencies:
"@types/mousetrap" "^1.6.0"
mousetrap "^1.6.0"
angular2-indexeddb@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/angular2-indexeddb/-/angular2-indexeddb-1.2.3.tgz#14a57c8e65a1333af18f7925fe3e798638bb862d"
@ -4380,11 +4083,6 @@ class-utils@^0.3.5:
isobject "^3.0.0"
static-extend "^0.1.1"
classnames@^2.2.6:
version "2.2.6"
resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce"
integrity sha512-JR/iSQOSt+LQIWwrwEzJ9uk0xfN3mTVYMwt1Ir5mUcSN6pU+V4zQFFaJsclJbPuAUQH+yfWef6tm7l1quW3C8Q==
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@ -4407,7 +4105,7 @@ cli-spinner@0.2.10:
resolved "https://registry.yarnpkg.com/cli-spinner/-/cli-spinner-0.2.10.tgz#f7d617a36f5c47a7bc6353c697fc9338ff782a47"
integrity sha512-U0sSQ+JJvSLi1pAYuJykwiA8Dsr15uHEy85iCJ6A+0DjVxivr3d+N2Wjvodeg89uP5K6TswFkKBfAD7B3YSn/Q==
cli-spinners@^2.2.0, cli-spinners@^2.4.0, cli-spinners@^2.5.0:
cli-spinners@^2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.5.0.tgz#12763e47251bf951cb75c201dfa58ff1bcb2d047"
integrity sha512-PC+AmIuK04E6aeSs/pUccSujsTzBhu4HzC2dL+CfJB/Jcc2qTRbEwZQDfIUpt2Xl8BodYBEq8w4fc0kU2I9DjQ==
@ -4986,11 +4684,6 @@ css-selector-tokenizer@^0.7.1:
cssesc "^3.0.0"
fastparse "^1.1.2"
css-to-style@^1.2.1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/css-to-style/-/css-to-style-1.4.0.tgz#2d91742041b77a700d387dfa7978e80f56abf32b"
integrity sha512-FxLJRS+zzAjICI/AwpXUQR+aXrDOksrMTPpoKVwcGP0ARCxY5K3eRfgPW+pJrFXG46SKuxWOufJheis8Bhc2kg==
css-tree@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.1.2.tgz#9ae393b5dafd7dae8a622475caec78d3d8fbd7b5"
@ -5745,9 +5438,9 @@ dns-equal@^1.0.0:
integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
dns-packet@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz#12aa426981075be500b910eedcd0b47dd7deda5a"
integrity sha512-0UxfQkMhYAUaZI+xrNZOz/as5KgDU0M/fQ9b6SpkyLbk3GEswDi6PADJVaYJradtRVsRIlF1zLyOodbcTCDzUg==
version "1.3.4"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.4.tgz#e3455065824a2507ba886c55a89963bb107dec6f"
integrity sha512-BQ6F4vycLXBvdrJZ6S3gZewt6rcrks9KBgM9vrhW+knGRqc8uEdT7fuCwloc7nny5xNoMJ17HGH0R/6fpo8ECA==
dependencies:
ip "^1.1.0"
safe-buffer "^5.0.1"
@ -5776,14 +5469,6 @@ dockerfile-ast@0.2.0:
dependencies:
vscode-languageserver-types "^3.16.0"
dom-helpers@^5.0.1, dom-helpers@^5.1.2, dom-helpers@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/dom-helpers/-/dom-helpers-5.2.0.tgz#57fd054c5f8f34c52a3eeffdb7e7e93cd357d95b"
integrity sha512-Ru5o9+V8CpunKnz5LGgWXkmrH/20cGKwcHwS4m73zIvs54CN9epEmT/HLqFJW3kXpakAFkEdzgy1hzlJe3E4OQ==
dependencies:
"@babel/runtime" "^7.8.7"
csstype "^3.0.2"
dom-serialize@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/dom-serialize/-/dom-serialize-2.2.1.tgz#562ae8999f44be5ea3076f5419dcd59eb43ac95b"
@ -6175,7 +5860,7 @@ es6-promisify@^5.0.0:
dependencies:
es6-promise "^4.0.3"
es6-symbol@^3.1.0, es6-symbol@^3.1.1, es6-symbol@~3.1.3:
es6-symbol@^3.1.1, es6-symbol@~3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.3.tgz#bad5d3c1bcdac28269f4cb331e431c78ac705d18"
integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
@ -6505,11 +6190,6 @@ file-loader@6.2.0, file-loader@^6.2.0:
loader-utils "^2.0.0"
schema-utils "^3.0.0"
file-saver@^2.0.5:
version "2.0.5"
resolved "https://registry.yarnpkg.com/file-saver/-/file-saver-2.0.5.tgz#d61cfe2ce059f414d899e9dd6d4107ee25670c38"
integrity sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==
file-uri-to-path@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
@ -7135,11 +6815,6 @@ html-escaper@^2.0.0:
resolved "https://registry.yarnpkg.com/html-escaper/-/html-escaper-2.0.2.tgz#dfd60027da36a36dfcbe236262c00a5822681453"
integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==
html-to-image@^1.3.21:
version "1.6.0"
resolved "https://registry.yarnpkg.com/html-to-image/-/html-to-image-1.6.0.tgz#fdf1ea5514af96b58cfc85a63eb97614097023ab"
integrity sha512-omzkdNnZOacH7udio09I3eGkOrE8VcpzabQbLYmjojpi+FmtofpNY9lHV2fn2DaDO9G9p10O3E8SF5HHgFhSWg==
http-cache-semantics@^4.0.0, http-cache-semantics@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390"
@ -7420,13 +7095,6 @@ internal-ip@^4.3.0:
default-gateway "^4.2.0"
ipaddr.js "^1.9.0"
invariant@^2.2.4:
version "2.2.4"
resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz#610f3c92c9359ce1db616e538008d23ff35158e6"
integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
dependencies:
loose-envify "^1.0.0"
ip-regex@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz#fa78bf5d2e6913c911ce9f819ee5146bb6d844e9"
@ -7944,7 +7612,7 @@ jquery@^3.6.0:
resolved "https://registry.yarnpkg.com/jquery/-/jquery-3.6.0.tgz#c72a09f15c1bdce142f49dbf1170bdf8adac2470"
integrity sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
@ -8354,11 +8022,6 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
lodash-es@^4.17.20:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.20.tgz#29f6332eefc60e849f869c264bc71126ad61e8f7"
integrity sha512-JD1COMZsq8maT6mnuz1UMV0jvYD0E0aUsSOdrr1/nAG3dhqQXwRRgeW0cSqH1U43INKcqxaiVIQNOUDld7gRDA==
lodash.assign@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.assign/-/lodash.assign-4.2.0.tgz#0d99f3ccd7a6d261d19bdaeb9245005d285808e7"
@ -8599,7 +8262,7 @@ lodash.values@^4.3.0:
resolved "https://registry.yarnpkg.com/lodash.values/-/lodash.values-4.3.0.tgz#a3a6c2b0ebecc5c2cba1c17e6e620fe81b53d347"
integrity sha1-o6bCsOvsxcLLocF+bmIP6BtT00c=
lodash@^4.17.10, lodash@^4.17.20, lodash@^4.17.5:
lodash@^4.17.10, lodash@^4.17.5:
version "4.17.20"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52"
integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA==
@ -8609,13 +8272,6 @@ lodash@^4.17.11, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19:
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
log-symbols@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
dependencies:
chalk "^2.4.2"
log-symbols@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-4.0.0.tgz#69b3cc46d20f448eccdb75ea1fa733d9e821c920"
@ -8639,13 +8295,6 @@ loglevel@^1.6.8:
resolved "https://registry.yarnpkg.com/loglevel/-/loglevel-1.7.1.tgz#005fde2f5e6e47068f935ff28573e125ef72f197"
integrity sha512-Hesni4s5UkWkwCGJMQGAh71PaLUmKFM60dHvq0zi/vDhhrzuk+4GgNbTXJ12YYQJn6ZKBDNIjYcuQGKudvqrIw==
loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
dependencies:
js-tokens "^3.0.0 || ^4.0.0"
lowercase-keys@^1.0.0, lowercase-keys@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.1.tgz#6f9e30b47084d971a7c820ff15a6c5167b74c26f"
@ -9052,7 +8701,7 @@ mkdirp@^1.0.3, mkdirp@^1.0.4, mkdirp@~1.0.4:
resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e"
integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==
mousetrap@^1.6.0:
mousetrap@^1.6.5:
version "1.6.5"
resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9"
integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA==
@ -9492,25 +9141,6 @@ obuf@^1.0.0, obuf@^1.1.2:
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
office-ui-fabric-react@^7.170.0:
version "7.170.0"
resolved "https://registry.yarnpkg.com/office-ui-fabric-react/-/office-ui-fabric-react-7.170.0.tgz#9cffedaa2bd4921fee84b413f9a581f5b25114d9"
integrity sha512-N348H5dS56oMrnKeZP1p7h2o+lO9wUY9YEHiVZ0FYpB8gmRwgJVq8/d2hSfZEgQH14IMbhdLYNE8RFziYyHFsw==
dependencies:
"@fluentui/date-time-utilities" "^7.9.1"
"@fluentui/react-focus" "^7.17.6"
"@fluentui/react-window-provider" "^1.0.2"
"@microsoft/load-themed-styles" "^1.10.26"
"@uifabric/foundation" "^7.9.26"
"@uifabric/icons" "^7.5.23"
"@uifabric/merge-styles" "^7.19.2"
"@uifabric/react-hooks" "^7.14.0"
"@uifabric/set-version" "^7.0.24"
"@uifabric/styling" "^7.19.0"
"@uifabric/utilities" "^7.33.5"
prop-types "^15.7.2"
tslib "^1.10.0"
on-finished@~2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947"
@ -9567,34 +9197,6 @@ opn@^5.5.0:
dependencies:
is-wsl "^1.1.0"
ora@4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/ora/-/ora-4.0.3.tgz#752a1b7b4be4825546a7a3d59256fa523b6b6d05"
integrity sha512-fnDebVFyz309A73cqCipVL1fBZewq4vwgSHfxh43vVy31mbyoQ8sCH3Oeaog/owYOs/lLlGVPCISQonTneg6Pg==
dependencies:
chalk "^3.0.0"
cli-cursor "^3.1.0"
cli-spinners "^2.2.0"
is-interactive "^1.0.0"
log-symbols "^3.0.0"
mute-stream "0.0.8"
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
ora@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-5.0.0.tgz#4f0b34f2994877b49b452a707245ab1e9f6afccb"
integrity sha512-s26qdWqke2kjN/wC4dy+IQPBIMWBJlSU/0JZhk30ZDBLelW25rv66yutUWARMigpGPzcXHb+Nac5pNhN/WsARw==
dependencies:
chalk "^4.1.0"
cli-cursor "^3.1.0"
cli-spinners "^2.4.0"
is-interactive "^1.0.0"
log-symbols "^4.0.0"
mute-stream "0.0.8"
strip-ansi "^6.0.0"
wcwidth "^1.0.1"
ora@5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/ora/-/ora-5.3.0.tgz#fb832899d3a1372fe71c8b2c534bbfe74961bb6f"
@ -10427,23 +10029,6 @@ promiseback@^2.0.2:
is-callable "^1.1.5"
promise-deferred "^2.0.3"
prop-types-extra@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/prop-types-extra/-/prop-types-extra-1.1.1.tgz#58c3b74cbfbb95d304625975aa2f0848329a010b"
integrity sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==
dependencies:
react-is "^16.3.2"
warning "^4.0.0"
prop-types@^15.6.2, prop-types@^15.7.2:
version "15.7.2"
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.2.tgz#52c41e75b8c87e72b9d9360e0206b99dcbffa6c5"
integrity sha512-8QQikdH7//R2vurIJSutZ1smHYTcLpRWEOlHnzcWHmBYrOGUysKwSsrC89BCiFj3CbrfJ/nXFdJepOVrY1GCHQ==
dependencies:
loose-envify "^1.4.0"
object-assign "^4.1.1"
react-is "^16.8.1"
proto-list@~1.2.1:
version "1.2.4"
resolved "https://registry.yarnpkg.com/proto-list/-/proto-list-1.2.4.tgz#212d5bfe1318306a420f6402b8e26ff39647a849"
@ -10667,86 +10252,11 @@ rc@^1.2.8:
minimist "^1.2.0"
strip-json-comments "~2.0.1"
react-bootstrap@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/react-bootstrap/-/react-bootstrap-1.5.2.tgz#07dabec53d10491a520c49f102170b440fa89008"
integrity sha512-mGKPY5+lLd7Vtkx2VFivoRkPT4xAHazuFfIhJLTEgHlDfIUSePn7qrmpZe5gXH9zvHV0RsBaQ9cLfXjxnZrOpA==
dependencies:
"@babel/runtime" "^7.13.8"
"@restart/context" "^2.1.4"
"@restart/hooks" "^0.3.26"
"@types/classnames" "^2.2.10"
"@types/invariant" "^2.2.33"
"@types/prop-types" "^15.7.3"
"@types/react" ">=16.9.35"
"@types/react-transition-group" "^4.4.1"
"@types/warning" "^3.0.0"
classnames "^2.2.6"
dom-helpers "^5.1.2"
invariant "^2.2.4"
prop-types "^15.7.2"
prop-types-extra "^1.1.0"
react-overlays "^5.0.0"
react-transition-group "^4.4.1"
uncontrollable "^7.2.1"
warning "^4.0.3"
react-dom@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-17.0.2.tgz#ecffb6845e3ad8dbfcdc498f0d0a939736502c23"
integrity sha512-s4h96KtLDUQlsENhMn1ar8t2bEa+q/YAtj8pPPdIjPDGBDIVNsrD9aXNWqspUe6AzKCIG0C1HZZLqLV7qpOBGA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
scheduler "^0.20.2"
react-is@^16.3.2, react-is@^16.8.1:
version "16.13.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4"
integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==
react-is@^17.0.1:
version "17.0.1"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.1.tgz#5b3531bd76a645a4c9fb6e693ed36419e3301339"
integrity sha512-NAnt2iGDXohE5LI7uBnLnqvLQMtzhkiAOLXTmv+qnF9Ky7xAPcX8Up/xWIhxvLVGJvuLiNc4xQLtuqDRzb4fSA==
react-lifecycles-compat@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz#4f1a273afdfc8f3488a8c516bfda78f872352362"
integrity sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==
react-overlays@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-5.0.0.tgz#b50351de194dda0706b40f9632d261c9f0011c4c"
integrity sha512-TKbqfAv23TFtCJ2lzISdx76p97G/DP8Rp4TOFdqM9n8GTruVYgE3jX7Zgb8+w7YJ18slTVcDTQ1/tFzdCqjVhA==
dependencies:
"@babel/runtime" "^7.12.1"
"@popperjs/core" "^2.5.3"
"@restart/hooks" "^0.3.25"
"@types/warning" "^3.0.0"
dom-helpers "^5.2.0"
prop-types "^15.7.2"
uncontrollable "^7.0.0"
warning "^4.0.3"
react-transition-group@^4.4.1:
version "4.4.1"
resolved "https://registry.yarnpkg.com/react-transition-group/-/react-transition-group-4.4.1.tgz#63868f9325a38ea5ee9535d828327f85773345c9"
integrity sha512-Djqr7OQ2aPUiYurhPalTrVy9ddmFCCzwhqQmtN+J3+3DzLO209Fdr70QrN8Z3DsglWql6iY1lDWAfpFiBtuKGw==
dependencies:
"@babel/runtime" "^7.5.5"
dom-helpers "^5.0.1"
loose-envify "^1.4.0"
prop-types "^15.6.2"
react@^17.0.2:
version "17.0.2"
resolved "https://registry.yarnpkg.com/react/-/react-17.0.2.tgz#d0b5cc516d29eb3eee383f75b62864cfb6800037"
integrity sha512-gnhPt75i/dq/z3/6q/0asP78D0u592D5L1pd7M8P+dck6Fu/jJeL6iVVK23fptSUZj8Vjf++7wXA8UNclGQcbA==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
read-cache@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/read-cache/-/read-cache-1.0.0.tgz#e664ef31161166c9751cdbe8dbcf86b5fb58f774"
@ -11216,20 +10726,6 @@ rxjs-tslint@^0.1.8:
typescript ">=2.8.3"
yargs "^15.3.1"
rxjs@6.5.4:
version "6.5.4"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.4.tgz#e0777fe0d184cec7872df147f303572d414e211c"
integrity sha512-naMQXcgEo3csAEGvw/NydRA0fuS2nDZJiw1YUWFKU7aPPAPGZEsD4Iimit96qwCieH6y614MCLYwdkrWx7z/7Q==
dependencies:
tslib "^1.9.0"
rxjs@6.6.2:
version "6.6.2"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.2.tgz#8096a7ac03f2cc4fe5860ef6e572810d9e01c0d2"
integrity sha512-BHdBMVoWC2sL26w//BCu3YzKT4s2jip/WhwsGEDmeKYBhKDZeYezVUnHatYB7L85v5xs0BAQmg6BEYJEKxBabg==
dependencies:
tslib "^1.9.0"
rxjs@6.6.3, rxjs@^6.5.3, rxjs@^6.6.0:
version "6.6.3"
resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.3.tgz#8ca84635c4daa900c0d3967a6ee7ac60271ee552"
@ -11291,13 +10787,6 @@ sass@1.32.6:
dependencies:
chokidar ">=2.0.0 <4.0.0"
sass@^1.29.0:
version "1.32.7"
resolved "https://registry.yarnpkg.com/sass/-/sass-1.32.7.tgz#632a9df2b85dc4b346977fcaf2d5e6f2b7039fd8"
integrity sha512-C8Z4bjqGWnsYa11o8hpKAuoyFdRhrSHcYjCr+XAWVPSIQqC8mp2f5Dx4em0dKYehPzg5XSekmCjqJnEZbIls9A==
dependencies:
chokidar ">=2.0.0 <4.0.0"
saucelabs@^1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/saucelabs/-/saucelabs-1.5.0.tgz#9405a73c360d449b232839919a86c396d379fd9d"
@ -11305,15 +10794,6 @@ saucelabs@^1.5.0:
dependencies:
https-proxy-agent "^2.2.1"
save-html-as-image@^1.5.2:
version "1.5.2"
resolved "https://registry.yarnpkg.com/save-html-as-image/-/save-html-as-image-1.5.2.tgz#e8952c0d2eb4a976c7a93d6a17fe4f753df34875"
integrity sha512-WE4+UBgYWnDOxCtmfvAIOXZE2pPcB0Tuo5gxfcvvHdhJ2dOO6vAIx8mA1PXzK/B3977YrFiYdVPEswp6KrXjHw==
dependencies:
file-saver "^2.0.5"
html-to-image "^1.3.21"
save-svg-as-png "^1.4.17"
save-svg-as-png@^1.4.17:
version "1.4.17"
resolved "https://registry.yarnpkg.com/save-svg-as-png/-/save-svg-as-png-1.4.17.tgz#294442002772a24f1db1bf8a2aaf7df4ab0cdc55"
@ -11324,14 +10804,6 @@ sax@>=0.6.0, sax@^1.2.4, sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
scheduler@^0.20.2:
version "0.20.2"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.20.2.tgz#4baee39436e34aa93b4874bddcbf0fe8b8b50e91"
integrity sha512-2eWfGgAqqWFGqtdMmcL5zCMK1U8KlXv8SQFGglL3CEtd0aDVDWgeF/YoCmvln55m5zSk3J/20hTaSBeSObsQDQ==
dependencies:
loose-envify "^1.1.0"
object-assign "^4.1.1"
schema-utils@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz#0b79a93204d7b600d4b2850d1f66c2a34951c770"
@ -11359,18 +10831,6 @@ schema-utils@^3.0.0:
ajv "^6.12.5"
ajv-keywords "^3.5.2"
schematics-scss-migrate@^1.3.13:
version "1.3.13"
resolved "https://registry.yarnpkg.com/schematics-scss-migrate/-/schematics-scss-migrate-1.3.13.tgz#daa9529a0dc7b6c6a87bc50ff1d78872e0845e29"
integrity sha512-gQNTzq4tj8wDNOnsrIDRETvEDgesHYexHc9w62H71UBrbw2j2xa773qcmV3ofI/KXqC8XQTKUwwVDPvIPqNMng==
dependencies:
"@angular-devkit/core" "^10.1.0"
"@angular-devkit/schematics" "^10.1.0"
"@schematics/angular" "^9.1.0"
glob "^7.1.6"
sass "^1.29.0"
typescript "~4.0.2"
select-hose@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@ -12490,13 +11950,6 @@ stylehacks@^5.0.0:
browserslist "^4.16.0"
postcss-selector-parser "^6.0.4"
stylenames@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/stylenames/-/stylenames-1.1.6.tgz#185641ea9261906a5c350ac6836f4ef67caf867f"
integrity sha1-GFZB6pJhkGpcNQrGg29O9nyvhn8=
dependencies:
es6-symbol "^3.1.0"
stylus-loader@4.3.3:
version "4.3.3"
resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-4.3.3.tgz#381bb6341272ac50bcdfd0b877707eac99b6b757"
@ -13055,26 +12508,11 @@ typescript@4.1.5, typescript@>=2.8.3:
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.1.5.tgz#123a3b214aaff3be32926f0d8f1f6e704eb89a72"
integrity sha512-6OSu9PTIzmn9TCDiovULTnET6BgXtDYL4Gg4szY+cGsc3JP1dQL8qvE8kShTRx1NIw4Q9IBHlwODjkjWEtMUyA==
typescript@~4.0.2:
version "4.0.7"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.0.7.tgz#7168032c43d2a2671c95c07812f69523c79590af"
integrity sha512-yi7M4y74SWvYbnazbn8/bmJmX4Zlej39ZOqwG/8dut/MYoSQ119GY9ZFbbGsD4PFZYWxqik/XsP3vk3+W5H3og==
ua-parser-js@^0.7.23:
version "0.7.24"
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.24.tgz#8d3ecea46ed4f1f1d63ec25f17d8568105dc027c"
integrity sha512-yo+miGzQx5gakzVK3QFfN0/L9uVhosXBBO7qmnk7c2iw1IhL212wfA3zbnI54B0obGwC/5NWub/iT9sReMx+Fw==
uncontrollable@^7.0.0, uncontrollable@^7.2.1:
version "7.2.1"
resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738"
integrity sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==
dependencies:
"@babel/runtime" "^7.6.3"
"@types/react" ">=16.9.11"
invariant "^2.2.4"
react-lifecycles-compat "^3.0.4"
unicode-canonical-property-names-ecmascript@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818"
@ -13351,13 +12789,6 @@ vscode-languageserver-types@^3.16.0:
resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.16.0.tgz#ecf393fc121ec6974b2da3efb3155644c514e247"
integrity sha512-k8luDIWJWyenLc5ToFQQMaSrqCHiLwyKPHKPQZ5zz21vM+vIVUSvsRpcbiECH4WR88K2XZqc4ScRcZ7nk/jbeA==
warning@^4.0.0, warning@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
dependencies:
loose-envify "^1.0.0"
watchpack-chokidar2@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.1.tgz#38500072ee6ece66f3769936950ea1771be1c957"