diff --git a/README.md b/README.md index f1e592e6..cea8aa35 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ # PatternAtlas +This is an extension of the original [Patternatlas UI](https://github.com/PatternAtlas/pattern-atlas-ui). ## License diff --git a/package.json b/package.json index e2174a42..4d7ce8b3 100644 --- a/package.json +++ b/package.json @@ -28,12 +28,15 @@ "@angular/router": "9.1.2", "@auth0/angular-jwt": "^4.0.0", "@covalent/text-editor": "3.0.0-beta.1-2", + "@types/file-saver": "^2.0.5", "@ustutt/grapheditor-webcomponent": "0.5.4", "angular2-prettyjson": "3.0.1", "angular2-toaster": "8.0.0", "antlr4": "^4.8.0", "core-js": "2.6.3", "d3": "^5.9.2", + "file-saver": "^2.0.5", + "keyword-extractor": "0.0.25", "lodash": "^4.17.21", "madr": "2.1.2", "markdown-it": "10.0.0", @@ -78,7 +81,8 @@ "stylelint": "^13.5.0", "stylelint-config-sass-guidelines": "^7.0.0", "ts-node": "~8.0.1", - "typescript": "~3.7.7" + "typescript": "~3.7.7", + "yarn-audit-fix": "^10.0.1" }, "browser": { "fs": false diff --git a/src/app/core/component/action-button-bar/action-button-bar.component.html b/src/app/core/component/action-button-bar/action-button-bar.component.html index 4fa65809..4327eef1 100644 --- a/src/app/core/component/action-button-bar/action-button-bar.component.html +++ b/src/app/core/component/action-button-bar/action-button-bar.component.html @@ -7,12 +7,12 @@ {{this.displayText}} - + - + +
+ + Algorithm Name + + + + Select Patterns + + {{pattern.name}} + + + + Select Optional Patterns + + {{pattern.name}} + + + + href to PlanQK website + + +
+
+ + +
+ diff --git a/src/app/core/component/create-algorithm/create-algorithm.component.scss b/src/app/core/component/create-algorithm/create-algorithm.component.scss new file mode 100644 index 00000000..5adaed8f --- /dev/null +++ b/src/app/core/component/create-algorithm/create-algorithm.component.scss @@ -0,0 +1,11 @@ +.close-button{ + float: right; + top:-24px; + right:-24px; +} + +.close-button:hover{ +opacity: 0.9; +color: red; +cursor: pointer; +} \ No newline at end of file diff --git a/src/app/core/component/create-algorithm/create-algorithm.component.spec.ts b/src/app/core/component/create-algorithm/create-algorithm.component.spec.ts new file mode 100644 index 00000000..1d918342 --- /dev/null +++ b/src/app/core/component/create-algorithm/create-algorithm.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { CreateAlgorithmComponent } from './create-algorithm.component'; + +describe('CreateAlgorithmComponent', () => { + let component: CreateAlgorithmComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ CreateAlgorithmComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(CreateAlgorithmComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/component/create-algorithm/create-algorithm.component.ts b/src/app/core/component/create-algorithm/create-algorithm.component.ts new file mode 100644 index 00000000..40261cb5 --- /dev/null +++ b/src/app/core/component/create-algorithm/create-algorithm.component.ts @@ -0,0 +1,49 @@ +import { Component, OnInit, ViewChild, Inject } from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {MatSelectModule} from '@angular/material/select'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatButtonModule} from '@angular/material/button'; + +import { HttpClient } from '@angular/common/http'; + +@Component({ + selector: 'pp-create-algorithm', + templateUrl: './create-algorithm.component.html', + styleUrls: ['./create-algorithm.component.scss'] +}) +export class CreateAlgorithmComponent implements OnInit { + + patterns: any[]; + res = []; + opt = []; + name: string; + planqkref: string; + + infos: any; + + + constructor(public dialogRef: MatDialogRef, + private http: HttpClient, + @Inject(MAT_DIALOG_DATA) public data) { + this.patterns = data.patterns; + } + + ngOnInit(): void { + + let href = "https://platform.planqk.de/qc-catalog/algorithms/fae60bca-d2b6-4aa2-88b7-58caace34179"; + this.http.get(href).subscribe(data => { + this.infos = data; + }); + + } + + closeDialog() { + if(this.res.length > 0){ + const result = { name: this.name, patterns: this.res , optional: this.opt, href: this.planqkref}; + this.dialogRef.close(result); + } else { + alert("no patterns selected!"); + } + } + +} diff --git a/src/app/core/component/delete-algorithm/delete-algorithm.component.html b/src/app/core/component/delete-algorithm/delete-algorithm.component.html new file mode 100644 index 00000000..a38a7469 --- /dev/null +++ b/src/app/core/component/delete-algorithm/delete-algorithm.component.html @@ -0,0 +1,19 @@ + +
+ + Select algorithms to delete + + {{alg.name}} + + +
+
+ + +
\ No newline at end of file diff --git a/src/app/core/component/delete-algorithm/delete-algorithm.component.scss b/src/app/core/component/delete-algorithm/delete-algorithm.component.scss new file mode 100644 index 00000000..5adaed8f --- /dev/null +++ b/src/app/core/component/delete-algorithm/delete-algorithm.component.scss @@ -0,0 +1,11 @@ +.close-button{ + float: right; + top:-24px; + right:-24px; +} + +.close-button:hover{ +opacity: 0.9; +color: red; +cursor: pointer; +} \ No newline at end of file diff --git a/src/app/core/component/delete-algorithm/delete-algorithm.component.spec.ts b/src/app/core/component/delete-algorithm/delete-algorithm.component.spec.ts new file mode 100644 index 00000000..b1297784 --- /dev/null +++ b/src/app/core/component/delete-algorithm/delete-algorithm.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DeleteAlgorithmComponent } from './delete-algorithm.component'; + +describe('DeleteAlgorithmComponent', () => { + let component: DeleteAlgorithmComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DeleteAlgorithmComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DeleteAlgorithmComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/component/delete-algorithm/delete-algorithm.component.ts b/src/app/core/component/delete-algorithm/delete-algorithm.component.ts new file mode 100644 index 00000000..c695c9b5 --- /dev/null +++ b/src/app/core/component/delete-algorithm/delete-algorithm.component.ts @@ -0,0 +1,34 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {MatSelectModule} from '@angular/material/select'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatButtonModule} from '@angular/material/button'; + +@Component({ + selector: 'pp-delete-algorithm', + templateUrl: './delete-algorithm.component.html', + styleUrls: ['./delete-algorithm.component.scss'] +}) +export class DeleteAlgorithmComponent implements OnInit { + + algorithms: any[]; + res = []; + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { + this.algorithms = data.algorithms; + } + + ngOnInit(): void { + } + + closeDialog() { + if(this.res.length > 0){ + const result = this.res; + this.dialogRef.close(result); + } else { + alert("no algorithm selected!"); + } + } + +} diff --git a/src/app/core/component/dialoggraph/dialoggraph.component.html b/src/app/core/component/dialoggraph/dialoggraph.component.html new file mode 100644 index 00000000..ad586fa2 --- /dev/null +++ b/src/app/core/component/dialoggraph/dialoggraph.component.html @@ -0,0 +1,173 @@ + + +
+

{{algoName}} + +

+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + +
diff --git a/src/app/core/component/dialoggraph/dialoggraph.component.scss b/src/app/core/component/dialoggraph/dialoggraph.component.scss new file mode 100644 index 00000000..e69de29b diff --git a/src/app/core/component/dialoggraph/dialoggraph.component.spec.ts b/src/app/core/component/dialoggraph/dialoggraph.component.spec.ts new file mode 100644 index 00000000..aeb9440d --- /dev/null +++ b/src/app/core/component/dialoggraph/dialoggraph.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { DialoggraphComponent } from './dialoggraph.component'; + +describe('DialoggraphComponent', () => { + let component: DialoggraphComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ DialoggraphComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(DialoggraphComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/component/dialoggraph/dialoggraph.component.ts b/src/app/core/component/dialoggraph/dialoggraph.component.ts new file mode 100644 index 00000000..de29eca0 --- /dev/null +++ b/src/app/core/component/dialoggraph/dialoggraph.component.ts @@ -0,0 +1,242 @@ +import { Component, OnInit, ViewChild, ElementRef, AfterContentInit, Inject } from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import { DraggedEdge, edgeId } from '@ustutt/grapheditor-webcomponent/lib/edge'; +import * as d3 from 'd3'; +import GraphEditor from '@ustutt/grapheditor-webcomponent/lib/grapheditor'; + + +@Component({ + selector: 'pp-dialoggraph', + templateUrl: './dialoggraph.component.html', + styleUrls: ['./dialoggraph.component.scss'] +}) +export class DialoggraphComponent implements OnInit { + + @ViewChild('graphWrapper', { static: true }) + graph: ElementRef; + + @ViewChild('svg') + svg: ElementRef; + graphElement: GraphEditor; + nodes: any; + highlightedNodes: any; + edges: any; + edgeInformation: any; + optionalIds: any; + algoName: string; + href: string; + + currentSetNodes: any; + currentlyHidden = false; + hideOptionalNodeText = "hide optional nodes"; + + constructor(public dialogRef: MatDialogRef, + @Inject(MAT_DIALOG_DATA) public data) { + if(data != null){ + // deepcopy... slice doesnt work for objects/arrays + this.nodes = data.nodes; + this.edges = data.edges; + this.edgeInformation = data.edgeInformation; + this.highlightedNodes = data.highlightedNodes; + this.optionalIds = data.optionalNodeIds; + this.algoName = data.name; + this.href = data.href; + } + } + + ngOnInit(): void { + } + + openLink(){ + let url = this.href; + window.open(url, '_blank'); + } + + close(result: any){ + this.dialogRef.close(result); + } + + handleNodeClickedEvent2(event) { + const node = event['detail']['node']; + if (event['detail']['key'] === 'info2') { + this.close({node: node, algorithm: this.algoName}); + return; + } + return; + } + + //prevent edge changes + handleEdgeRemovedEvent(event){ + event.preventDefault(); + } + + //prevent edge changes + handleEdgeAddedEvent(event){ + event.preventDefault(); + } + + ngAfterContentInit() { + let currentEdges2 = this.edges; + let edgeInformation = this.edgeInformation; + + const exceptionIds = ["05e07b55-83cf-4e7b-8212-a7a0e908139f", "a82ecee7-1a0d-4ba6-83b9-49b20b420047", + "dd5b2a19-a01a-4d26-b968-31b53d976815", "70f81341-8ca3-4f47-9ac6-2d598fa31617", "bf873faa-68a1-466d-b8d1-7cc3c5de2c05", "b15bb40f-ca2c-41d2-b16b-a4da29ad1598", + "39bd3758-fa63-4d44-bd98-95616134a39d", "9186fde3-7b56-43bc-8c60-d45a8405c473", "ef3d426f-0733-45b0-89ec-d2e81a607d16", "45cdc264-bb7d-40b9-9a98-d25e586fab15", + ]; + + currentEdges2.forEach( edge => { + if(exceptionIds.includes(edge.id) == false){ + let oldsource = edge.source; + let oldsourcehandle = edge.sourceHandle + edge.source = edge.target; + edge.sourceHandle = edge.targetHandle; + edge.target = oldsource; + edge.targetHandle = oldsourcehandle; + } + else{ + console.log(edge.id); + } + }); + + + let edgesToRemove = []; + edgesToRemove.push("d82208b3-d9aa-454d-9489-d4f6bb43adde"); // entferne beidseitige realated to zwischen oracle und function table + +/* + currentEdges2.forEach(edge => { + edgeInformation.forEach(node => { + if(((node.nodeid == edge.source) || (node.nodeid == edge.target)) && this.highlightedNodes.includes(node.nodeid)) { + node.edges.forEach(edgedescription => { + if(edgedescription.edge.type == "isRelatedTo") { + //edgesToRemove.push(edge.id); + } + }); + } + }); + }); + */ + + //console.log("edgesToRemove"); + //console.log(edgesToRemove); + //remove edges + currentEdges2.forEach( edge => { + if(edgesToRemove.includes(edge.id)){ + let index5 = currentEdges2.indexOf(edge); + currentEdges2.splice(index5,1); + } + }); + //console.log(currentEdges2); + + + + let tempnodes = [].concat(this.highlightedNodes); + let tempedges = [].concat(currentEdges2); + let levelgraph = []; + for (let i = 1; i <= this.highlightedNodes.length; i++){ + let nodesToRemove = []; + tempnodes.forEach( node => { + let hasnoincomingedge = true; + let hasnooutgoingedge = true; + tempedges.forEach( edge => { + if(edge["target"] == node){ + hasnoincomingedge = false; + } + }); + if(hasnoincomingedge){ + tempedges.forEach( edge => { + if(edge["source"] == node){ + hasnooutgoingedge = false; + } + }); + //only first column adjusted + if(hasnooutgoingedge && i == 1){ + levelgraph.push({nodeid: node, level: i}); + nodesToRemove.push(node); + }else{ + levelgraph.unshift({nodeid: node, level: i}); + nodesToRemove.push(node); + } + } + }); + + nodesToRemove.forEach( node => { + tempedges = tempedges.filter( edge => edge["source"] != node); + let index = tempnodes.indexOf(node); + tempnodes.splice(index,1); + }); + } + //add remaining nodes (most likely because of cyclic dependencies) + tempnodes.forEach(node => levelgraph.push({nodeid: node, level: 100})); + //console.log("Levelgraph:"); + //console.log(levelgraph); + this.nodes.forEach(node => { + levelgraph.forEach( lnode => { + if(lnode.nodeid == node.id){ + node.level = lnode.level; + lnode.actualNode = node; + } + }); + }); + + let currentnodes = []; + levelgraph.forEach(entry => currentnodes.push(entry.actualNode)); + + //create graph + this.graphElement = this.graph.nativeElement; + if (this.graphElement == null) { + return; + } + let currentX = 0; + let currentY = 0; + for (let i = 1 ; i <= currentnodes.length; i++) { + currentnodes.forEach(node => { + if (node.level == i) { + node.x = currentX; + node.y = currentY; + currentY += 100; + //node.class = "optional-node"; + } + }); + currentY = 0; + currentX += 200; + } + + + this.graphElement.setNodes(currentnodes); + this.graphElement.setEdges(this.edges); + this.currentSetNodes = currentnodes; + + // optionale patterns müssen irgendwo gespeichert werden! + const optionalNodeIds = this.optionalIds; + if((optionalNodeIds != undefined)) { + this.graphElement.setNodeClass = (className, node) => { + if (optionalNodeIds.length > 0) { + if (className === 'optional-node') { + return optionalNodeIds.includes(node.id as string); + } + } + return false; + }; + } + + } + + hideOptionalNodes(){ + const optionalNodeIds = this.optionalIds; + if(this.currentlyHidden){ + this.graphElement.setEdges(this.edges); + this.graphElement.setNodes(this.currentSetNodes); + this.currentlyHidden = false; + this.hideOptionalNodeText = "hide optional nodes"; + }else{ + let visibleEdges = this.edges.filter(edge => !optionalNodeIds.includes(edge.source) && !optionalNodeIds.includes(edge.target)); + this.graphElement.setEdges(visibleEdges); + let visibleNodes = this.currentSetNodes.filter(node => !optionalNodeIds.includes(node.id)); + this.graphElement.setNodes(visibleNodes); + this.currentlyHidden = true; + this.hideOptionalNodeText = "show optional nodes"; + + } + this.graphElement.completeRender(false); + } +} diff --git a/src/app/core/component/graph-display/graph-display.component.html b/src/app/core/component/graph-display/graph-display.component.html index b8bf5d34..4c6fe165 100644 --- a/src/app/core/component/graph-display/graph-display.component.html +++ b/src/app/core/component/graph-display/graph-display.component.html @@ -106,6 +106,12 @@

Pattern Language Relations

+ + + quantum + + + Pattern Language RelationsPattern Language Relations + + (); + @Output() resetButtonClicked = new EventEmitter(); + @Output() addedAlgorithm = new EventEmitter(); + cpattern: any; + edgeInformation = []; + edgesToReverse = []; + waitForNativeGraph = false; constructor(private cdr: ChangeDetectorRef, private d3Service: D3Service, @@ -105,6 +121,7 @@ export class GraphDisplayComponent implements AfterContentInit, OnChanges { private graphDataService: GraphDataService, private activatedRoute: ActivatedRoute, private configService: PatternAtlasUiRepositoryConfigurationService, + private algoStateService: AlgoStateService, private router: Router) { } @@ -184,10 +201,12 @@ export class GraphDisplayComponent implements AfterContentInit, OnChanges { return false; }; this.getGraph(); + } ngOnChanges(changes: SimpleChanges): void { if (changes.data != null) { + console.log(changes); this.isLoading = true; this.initData(); this.getGraph(); @@ -197,6 +216,23 @@ export class GraphDisplayComponent implements AfterContentInit, OnChanges { this.triggerRerendering(true); }); } + if(this.addAlgorithmDialog){ + this.openCreateAlgorithm(); + } + if((this.AlgorithmData != null)||(this.AlgorithmData != undefined)){ + if(this.AlgorithmData.length > 0){ + if(this.graphNativeElement != undefined){ + this.generateEdgeInformation(); + this.showAlgorithmNode(); + }else{ + this.waitForNativeGraph = true; + } + }else{ + if(this.graphNativeElement != undefined){ + this.backgroundClicked(); + } + } + } } /** @@ -322,10 +358,12 @@ export class GraphDisplayComponent implements AfterContentInit, OnChanges { backgroundClicked() { this.highlightedNodeIds = []; this.highlightedEdgeIds = []; + this.nodes.forEach(node => node.level = undefined); this.clickedNodeId = null; this.selectedPattern = null; this.graphNativeElement.completeRender(); this.patternClicked = false; + this.resetAlgorithmValue.emit(); } public updateSideMenu() { @@ -442,19 +480,144 @@ export class GraphDisplayComponent implements AfterContentInit, OnChanges { } this.triggerRerendering(); this.graphNativeElement.zoomToBoundingBox(true); + + // falls storage beim initialisieren einen Werte enthaelt + if(this.waitForNativeGraph){ + console.log("hier rein falls etwas im storage ist"); + this.waitForNativeGraph = false; + this.generateEdgeInformation(); + this.showAlgorithmNode(); + } } private addNewPatternNodeToGraph(pat: Pattern, index: number) { this.graphNativeElement.addNode(GraphDisplayComponent.mapPatternsToNodes([pat], index)[0]); } + + private generateEdgeInformation(): void { + this.AlgorithmData[0].data.forEach(nodeid => { + this.cpattern = this.patterns.find(pat => pat.id === nodeid); + this.patternService.getPatternByUrl(this.cpattern._links.self.href).pipe( + switchMap((pattern: PatternResponse) => { + return this.patternRelationDescriptionService.getEdgesForPattern(pattern); + })).subscribe(edges => { + this.edgeInformation.push({ + edges: edges, + nodeid: nodeid, + }); + //this.cdr.detectChanges(); + }); + + }); + } + + private showAlgorithmNode(){ + //console.log("inside showAlgorithmNode"); + this.highlightedEdgeIds = []; + this.highlightedNodeIds = []; + //this.edgeInformation = []; + this.edgesToReverse = []; + this.AlgorithmData[0].data.forEach(element => { + this.highlightedNodeIds.push(element); + const outgoingLinks = Array.from(this.graph.nativeElement.getEdgesByTarget(element)); + const ingoingLinks = Array.from(this.graph.nativeElement.getEdgesBySource(element)); + const tooManyEdges = [].concat(outgoingLinks).concat(ingoingLinks); + this.highlightedEdgeIds = this.highlightedEdgeIds.concat(tooManyEdges); + }); + this.highlightedEdgeIds = this.highlightedEdgeIds.filter( edge => (this.highlightedNodeIds.includes(edge["source"])) && (this.highlightedNodeIds.includes(edge["target"]))); + this.highlightedEdgeIds = this.highlightedEdgeIds.filter((item, index) => this.highlightedEdgeIds.indexOf(item) === index); + + this.edgesToReverse = JSON.parse(JSON.stringify(this.highlightedEdgeIds)); + + this.highlightedEdgeIds = this.highlightedEdgeIds.map( edge => edge["id"] ? edge["id"] : edgeId(edge["id"])); + + this.triggerRerendering(); + if(this.showAlgoPopups){ + this.openGraphDialog(); + } + } + + private openGraphDialog(){ + //deepcopy + const currentNodes = JSON.parse(JSON.stringify(this.highlightedNodeIds)); + const nodecopy = JSON.parse(JSON.stringify(this.nodes)); + let linkproperty = ""; + if(this.AlgorithmData[0].hasOwnProperty('href')){ + linkproperty = this.AlgorithmData[0].href; + } + + const dialogRef = this.matDialog.open(DialoggraphComponent, { + autoFocus: false, + data: { + nodes: nodecopy, + highlightedNodes: currentNodes, + edges: this.edgesToReverse, + edgeInformation: this.edgeInformation, + optionalNodeIds: this.AlgorithmData[0].optional, + name: this.AlgorithmData[0].name, + href: linkproperty, + }, + height: '70%', + width: '100%' + }); + + dialogRef.afterClosed().subscribe(result => { + if(result != null && result != undefined) { + console.log(result); + this.resetButtonClicked.emit(true); + this.router.navigate(['./../..', 'pattern-languages', result.node.patternLanguageId, result.node.uri], { relativeTo: this.activatedRoute}); + }else{ + this.resetButtonClicked.emit(false); + } + console.log("closed dialog"); + }); + } + + private openCreateAlgorithm() { + const dialogRef2 = this.matDialog.open(CreateAlgorithmComponent, { + width: "1000px", + data: { + patterns: this.patterns, + }, + }); + + dialogRef2.afterClosed().subscribe(result => { + if((result != null) && (result.name != undefined)) { + let newAlgorithmPatternIds = []; + result.patterns.forEach(pattern => { + newAlgorithmPatternIds.push(pattern.id); + }); + // optional patterns have to be in both arrays! + let newOptionalAlgorithmPatternIds = []; + result.optional.forEach(optpattern => { + newOptionalAlgorithmPatternIds.push(optpattern.id); + if(!(newAlgorithmPatternIds.includes(optpattern.id))){ + newAlgorithmPatternIds.push(optpattern.id); + } + }); + let newhref = ""; + if((result.href != null) && (result.href != undefined)){ + newhref = result.href; + } + this.addedAlgorithm.emit({name: result.name, data: newAlgorithmPatternIds, optional: newOptionalAlgorithmPatternIds, href: newhref}); + }else{ + this.addedAlgorithm.emit(null); + } + console.log("closed creation dialog"); + }); + } private showInfoForClickedNode(node): void { this.clickedNodeId = node.id; + console.log(node); + console.log(node.id); + console.log(node.title); const outgoingLinks = Array.from(this.graph.nativeElement.getEdgesByTarget(node.id)); const ingoingLinks = Array.from(this.graph.nativeElement.getEdgesBySource(node.id)); + //console.log([].concat(outgoingLinks).concat(ingoingLinks)); this.highlightedEdgeIds = [].concat(outgoingLinks).concat(ingoingLinks).map((edge) => edge.id ? edge.id : edgeId(edge)); const outgoingNodeIds: string[] = outgoingLinks.map(it => it['source']); const ingoingNodeIds: string[] = ingoingLinks.map(it => it['target']); diff --git a/src/app/core/component/textmatcher/textmatcher.component.html b/src/app/core/component/textmatcher/textmatcher.component.html new file mode 100644 index 00000000..3a158232 --- /dev/null +++ b/src/app/core/component/textmatcher/textmatcher.component.html @@ -0,0 +1,73 @@ + +
+ + Input the known Information + + +
+
+

Rephrased input: {{rephrasedInput}}

+
+
+

The best matching algorithm with cosine similarity is {{resultAlgorithm.name}}.

+

The Cosine Similarity is {{resultAlgorithm.cosineSimilarity}}

+
+
+ + Number of displayed algorithms + + {{number}} + + +
+
+ + + Name + {{result.name}} + + + Cosine similarity + {{result.cosineSimilarity}} + + + + +
+
+ + + +
+ rephrase Problem using OpenAI +
+
+ diff --git a/src/app/core/component/textmatcher/textmatcher.component.scss b/src/app/core/component/textmatcher/textmatcher.component.scss new file mode 100644 index 00000000..5adaed8f --- /dev/null +++ b/src/app/core/component/textmatcher/textmatcher.component.scss @@ -0,0 +1,11 @@ +.close-button{ + float: right; + top:-24px; + right:-24px; +} + +.close-button:hover{ +opacity: 0.9; +color: red; +cursor: pointer; +} \ No newline at end of file diff --git a/src/app/core/component/textmatcher/textmatcher.component.spec.ts b/src/app/core/component/textmatcher/textmatcher.component.spec.ts new file mode 100644 index 00000000..c1528f5a --- /dev/null +++ b/src/app/core/component/textmatcher/textmatcher.component.spec.ts @@ -0,0 +1,25 @@ +import { async, ComponentFixture, TestBed } from '@angular/core/testing'; + +import { TextmatcherComponent } from './textmatcher.component'; + +describe('TextmatcherComponent', () => { + let component: TextmatcherComponent; + let fixture: ComponentFixture; + + beforeEach(async(() => { + TestBed.configureTestingModule({ + declarations: [ TextmatcherComponent ] + }) + .compileComponents(); + })); + + beforeEach(() => { + fixture = TestBed.createComponent(TextmatcherComponent); + component = fixture.componentInstance; + fixture.detectChanges(); + }); + + it('should create', () => { + expect(component).toBeTruthy(); + }); +}); diff --git a/src/app/core/component/textmatcher/textmatcher.component.ts b/src/app/core/component/textmatcher/textmatcher.component.ts new file mode 100644 index 00000000..f03eed65 --- /dev/null +++ b/src/app/core/component/textmatcher/textmatcher.component.ts @@ -0,0 +1,186 @@ +import { Component, OnInit, Inject } from '@angular/core'; +import {MAT_DIALOG_DATA, MatDialogRef} from "@angular/material/dialog"; +import {FormControl, FormsModule, ReactiveFormsModule} from '@angular/forms'; +import {MatSelectModule} from '@angular/material/select'; +import {MatFormFieldModule} from '@angular/material/form-field'; +import {MatButtonModule} from '@angular/material/button'; +import { HttpClient } from '@angular/common/http'; +import {MatTableModule, MatTableDataSource} from '@angular/material/table'; +import {MatCheckboxModule} from '@angular/material/checkbox'; + + +@Component({ + selector: 'pp-textmatcher', + templateUrl: './textmatcher.component.html', + styleUrls: ['./textmatcher.component.scss'] +}) +export class TextmatcherComponent implements OnInit { + + + inputfield: FormControl; + extractedAlgorithmInformation = []; //array of arrays with extracted keywords + infos = []; + keyword_extractor: any; + + checked = true; + + showMatchingResults: boolean; + resultAlgorithm: any; + + numbers = [1,3,5,10]; + selectednumber = 3; + + tabledata = new MatTableDataSource([{name: "test", cosineSimilarity: 1}]); // initial value + fulltabledata: any; + columnsToDisplay = ['name', 'cosineSimilarity']; + + rephrasedInput = ""; + showRephrasedInput: boolean; + + constructor(public dialogRef: MatDialogRef, + private http: HttpClient, + @Inject(MAT_DIALOG_DATA) public data) { + //onbackground click handler als andere lösung + dialogRef.disableClose = true; + + } + + + ngOnInit(): void { + + this.showMatchingResults = false; + this.showRephrasedInput = false; + + if(this.data.prev.length > 0) { + this.resultAlgorithm = this.data.prev[0].resultAlgorithm; + this.tabledata = this.data.prev[0].tabledata; + this.fulltabledata = this.data.prev[0].fulltabledata; + this.columnsToDisplay = this.data.prev[0].columnsToDisplay; + this.rephrasedInput = this.data.prev[0].rephrasedInput; + this.selectednumber = this.data.prev[0].selectedNumber; + + if (this.data.prev[0].inputfieldvalue != ''){ + this.inputfield = new FormControl(this.data.prev[0].inputfieldvalue); + }else{ + this.inputfield = new FormControl(''); + } + this.showMatchingResults = true; + if(this.rephrasedInput != ""){ + this.showRephrasedInput = true; + } + }else{ + this.inputfield = new FormControl(''); + } + + + let href = "https://platform.planqk.de/algorithms/fae60bca-d2b6-4aa2-88b7-58caace34179"; + this.data.data.forEach(algorithm => { + if((algorithm.href !== "")&&(algorithm.href != null)){ + let splitarray = algorithm.href.split("platform.planqk.de"); + let datahref = splitarray[0] + "platform.planqk.de/qc-catalog" + splitarray[1]; + this.http.get(datahref).subscribe(algodata => { + this.infos.push({name: algorithm.name, data: algodata}); + }); + }else{ + //do something if no href + } + }); + + } + + checkboxClicked(event){ + if(this.checked){ + this.checked = false; + }else{ + this.checked = true; + } + } + + numberChanged() { + this.tabledata.data = this.fulltabledata.slice(0, this.selectednumber); + } + + closeDialog(algorithmName: string) { + let previous = {resultAlgorithm: this.resultAlgorithm, + tabledata: this.tabledata, + fulltabledata: this.fulltabledata, + columnsToDisplay: this.columnsToDisplay, + inputfieldvalue: this.inputfield.value, + rephrasedInput: this.rephrasedInput, + selectedNumber: this.selectednumber,}; + + this.dialogRef.close({algoname: algorithmName, prev: previous}); + } + + closeDialog2() { + if((this.inputfield.value != '') && this.showMatchingResults){ + let previous = {resultAlgorithm: this.resultAlgorithm, + tabledata: this.tabledata, + fulltabledata: this.fulltabledata, + columnsToDisplay: this.columnsToDisplay, + inputfieldvalue: this.inputfield.value, + rephrasedInput: this.rephrasedInput, + selectedNumber: this.selectednumber,}; + + this.dialogRef.close({algoname: undefined, prev: previous}); + }else{ + this.dialogRef.close(null); + } + } + + + openLink(){ + let alg = this.data.data.filter(algorithm => algorithm.name == this.resultAlgorithm.name); + if(alg.length > 0){ + this.closeDialog(this.resultAlgorithm.name); + }; + + } + + openLink2(algname){ + let alg = this.data.data.filter(algorithm => algorithm.name == algname); + if(alg.length > 0){ + this.closeDialog(algname); + }; + } + + extractInformation(isRake){ + let datatosend = {input: this.inputfield.value, algodata: this.infos}; + let url = 'http://localhost:1985/api/matcher/'; + if(isRake){ + url = url + 'rake/'; + } + + if(this.checked){ + url = url + 'openai'; + } + this.rephrasedInput = ""; + this.showRephrasedInput = false; + + this.http.post(url, datatosend).subscribe(resultdata => { + this.tabledata.data = resultdata.result; + this.fulltabledata = this.tabledata.data; + console.log("tabledata:"); + console.log(this.fulltabledata); + this.tabledata.data = this.fulltabledata.slice(0, this.selectednumber); + + if(resultdata.hasOwnProperty('rephrasedInput')){ + this.rephrasedInput = resultdata.rephrasedInput; + this.showRephrasedInput = true; + } + + const maximumkey = this.fulltabledata.reduce(function(prev, current) { + return (prev.cosineSimilarity > current.cosineSimilarity) ? prev : current; + }); + + if(maximumkey.cosineSimilarity > 0){ + this.showMatchingResults = true; + this.resultAlgorithm = maximumkey; + }else{ + this.showMatchingResults = false; + console.log("no similarities found!"); + } + }); + } + +} diff --git a/src/app/core/core.module.ts b/src/app/core/core.module.ts index 34e81142..c8974156 100644 --- a/src/app/core/core.module.ts +++ b/src/app/core/core.module.ts @@ -96,6 +96,11 @@ import { DeleteConfirmationDialogComponent } from './component/delete-confirmati import { EditUrlDialogComponent } from './component/edit-url-dialog/edit-url-dialog.component'; import { FeatureToggleDialogComponent } from './component/feature-toggle-dialog/feature-toggle-dialog.component'; import { PatternAtlasUiFeatureToggleModule } from './directives/pattern-atlas-ui-feature-toggle.module'; +import { DialoggraphComponent } from './component/dialoggraph/dialoggraph.component'; +import { CreateAlgorithmComponent } from './component/create-algorithm/create-algorithm.component'; +import { TextmatcherComponent } from './component/textmatcher/textmatcher.component'; +import { MatTableModule } from '@angular/material/table'; +import { DeleteAlgorithmComponent } from './component/delete-algorithm/delete-algorithm.component'; @NgModule({ imports: [ @@ -130,6 +135,7 @@ import { PatternAtlasUiFeatureToggleModule } from './directives/pattern-atlas-ui MatChipsModule, MatCheckboxModule, MatSnackBarModule, + MatTableModule, PatternAtlasUiFeatureToggleModule ], exports: [ @@ -203,7 +209,11 @@ import { PatternAtlasUiFeatureToggleModule } from './directives/pattern-atlas-ui SelectPatternDialogComponent, DeleteConfirmationDialogComponent, EditUrlDialogComponent, - FeatureToggleDialogComponent + FeatureToggleDialogComponent, + DialoggraphComponent, + CreateAlgorithmComponent, + TextmatcherComponent, + DeleteAlgorithmComponent ], entryComponents: [ DefaultPlRendererComponent, @@ -221,7 +231,10 @@ import { PatternAtlasUiFeatureToggleModule } from './directives/pattern-atlas-ui EvidenceDialogComponent, CommentDialogComponent, DiscussDialogComponent, - FeatureToggleDialogComponent + FeatureToggleDialogComponent, + DialoggraphComponent, + CreateAlgorithmComponent, + TextmatcherComponent ], schemas: [CUSTOM_ELEMENTS_SCHEMA] }) diff --git a/src/app/core/default-pl-renderer/default-pl-renderer.component.html b/src/app/core/default-pl-renderer/default-pl-renderer.component.html index eca28661..ae08b69c 100644 --- a/src/app/core/default-pl-renderer/default-pl-renderer.component.html +++ b/src/app/core/default-pl-renderer/default-pl-renderer.component.html @@ -12,6 +12,37 @@ filter_list + + + Select an Algorithm + + None + + {{algorithm.name}} + + + + + + + + + +
@@ -73,6 +74,7 @@ (removedEdge)="handleLinkRemovedInGraphEditor($event)" (updatedGraphEvent)="addPatternFromGraphToView($event)" [showPatternLanguageName]="true" - [showViewRelations]="true"> + [showViewRelations]="true"> + diff --git a/src/assets/AlgoData.json b/src/assets/AlgoData.json new file mode 100644 index 00000000..d440618b --- /dev/null +++ b/src/assets/AlgoData.json @@ -0,0 +1,68 @@ +[ + { + "name": "Quantum Annealing", + "data": [ + "312bc9d3-26c0-40ae-b90b-56effd136c0d", + "bcd4c7a1-3c92-4f8c-a530-72b8b95d3750", + "482714a7-8409-4165-93fe-72b02c2ae99c", + "2229a430-fe92-4411-9d72-d10dd1d8da14", + "3d1f3991-df47-4d42-8f9a-e6dcf4e3ccec" + ], + "href": "https://platform.planqk.de/algorithms/786e1ff5-991e-428d-a538-b8b99bc3d175/" + }, + { + "name": "Reverse Annealing", + "data": [ + "312bc9d3-26c0-40ae-b90b-56effd136c0d", + "bcd4c7a1-3c92-4f8c-a530-72b8b95d3750", + "482714a7-8409-4165-93fe-72b02c2ae99c", + "2229a430-fe92-4411-9d72-d10dd1d8da14", + "3d1f3991-df47-4d42-8f9a-e6dcf4e3ccec", + "dd15032b-ce2b-40b6-80ac-97623255b531", + "bc795a9b-7977-4e01-b513-f9f5aba38aa7", + "b657ea73-63c0-4800-a69d-a91925e19ac6", + "3ea9e187-e91b-4852-84eb-b35b5c480892" + ], + "optional": [ + "3ea9e187-e91b-4852-84eb-b35b5c480892" + ], + "href": "https://platform.planqk.de/algorithms/fadafc8b-5388-4768-8804-5fc22cf04a20/" + }, + { + "name": "Quantum Approximate Optimization Algorithm", + "data": [ + "bcd4c7a1-3c92-4f8c-a530-72b8b95d3750", + "dd15032b-ce2b-40b6-80ac-97623255b531", + "bc795a9b-7977-4e01-b513-f9f5aba38aa7", + "b657ea73-63c0-4800-a69d-a91925e19ac6", + "3ea9e187-e91b-4852-84eb-b35b5c480892", + "da93f915-7f4c-49df-99d0-80d91f26a337" + ], + "optional": [ + "3ea9e187-e91b-4852-84eb-b35b5c480892" + ], + "href": "https://platform.planqk.de/algorithms/fae60bca-d2b6-4aa2-88b7-58caace34179/" + }, + { + "name": "Deutsch Algorithm", + "data": [ + "312bc9d3-26c0-40ae-b90b-56effd136c0d", + "bcd4c7a1-3c92-4f8c-a530-72b8b95d3750", + "482714a7-8409-4165-93fe-72b02c2ae99c", + "3d1f3991-df47-4d42-8f9a-e6dcf4e3ccec", + "1cc7e9d6-ab37-412e-8afa-604a25de296e", + "3f3fabf0-7fa7-4b43-a74a-46a7ac2c55ee", + "d4f7c247-e2bb-4301-ad06-f758fa58f2dc", + "2229a430-fe92-4411-9d72-d10dd1d8da14" + ], + "href": "https://platform.planqk.de/algorithms/533c90a5-5fbb-487b-b64d-a8f331aafb10/" + }, + { + "name": "test", + "data": [ + "312bc9d3-26c0-40ae-b90b-56effd136c0d", + "bcd4c7a1-3c92-4f8c-a530-72b8b95d3750", + "1a5e3708-da39-4356-ab3f-115264da6390" + ] + } +] \ No newline at end of file diff --git a/src/libs/jOWL.js b/src/libs/jOWL.js old mode 100755 new mode 100644 diff --git a/tsconfig.json b/tsconfig.json index b6f8cb61..aae07308 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -7,6 +7,7 @@ "sourceMap": true, "declaration": false, "moduleResolution": "node", + "resolveJsonModule": true, "emitDecoratorMetadata": true, "experimentalDecorators": true, "target": "es5", diff --git a/yarn.lock b/yarn.lock index 1e72a393..b9095416 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1341,6 +1341,24 @@ resolved "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz" integrity sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g== +"@types/file-saver@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@types/file-saver/-/file-saver-2.0.5.tgz#9ee342a5d1314bb0928375424a2f162f97c310c7" + integrity sha512-zv9kNf3keYegP5oThGLaPk8E081DFDuwfqjtiTzm6PoxChdJ1raSuADf2YGCVIyrSynLrgc8JWv296s7Q7pQSQ== + +"@types/find-cache-dir@^3.2.1": + version "3.2.1" + resolved "https://registry.yarnpkg.com/@types/find-cache-dir/-/find-cache-dir-3.2.1.tgz#7b959a4b9643a1e6a1a5fe49032693cc36773501" + integrity sha512-frsJrz2t/CeGifcu/6uRo4b+SzAwT4NYCVPu1GN8IB9XTzrpPkGuV0tmh9mN+/L0PklAlsC3u5Fxt0ju00LXIw== + +"@types/fs-extra@^11.0.1": + version "11.0.2" + resolved "https://registry.yarnpkg.com/@types/fs-extra/-/fs-extra-11.0.2.tgz#23dc1ed7b2eba8ccd75568ac34e7a4e48aa2d087" + integrity sha512-c0hrgAOVYr21EX8J0jBMXGLMgJqVf/v6yxi0dLaJboW9aQPh16Id+z6w2Tx1hm+piJOLv8xPfVKZCLfjPw/IMQ== + dependencies: + "@types/jsonfile" "*" + "@types/node" "*" + "@types/geojson@*": version "7946.0.7" resolved "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.7.tgz" @@ -1372,6 +1390,25 @@ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.4.tgz" integrity sha512-8+KAKzEvSUdeo+kmqnKrqgeE+LcA0tjYWFY7RPProVYwnqDjukzO+3b6dLD56rYX5TdWejnEOLJYOIeh4CXKuA== +"@types/jsonfile@*": + version "6.1.2" + resolved "https://registry.yarnpkg.com/@types/jsonfile/-/jsonfile-6.1.2.tgz#d3b8a3536c5bb272ebee0f784180e456b7691c8f" + integrity sha512-8t92P+oeW4d/CRQfJaSqEwXujrhH4OEeHRjGU3v1Q8mUS8GPF3yiX26sw4svv6faL2HfBtGTe2xWIoVgN3dy9w== + dependencies: + "@types/node" "*" + +"@types/lodash-es@^4.17.8": + version "4.17.9" + resolved "https://registry.yarnpkg.com/@types/lodash-es/-/lodash-es-4.17.9.tgz#49dbe5112e23c54f2b387d860b7d03028ce170c2" + integrity sha512-ZTcmhiI3NNU7dEvWLZJkzG6ao49zOIjEgIE0RgV7wbPxU0f2xT3VSAHw2gmst8swH6V0YkLRGp4qPlX/6I90MQ== + dependencies: + "@types/lodash" "*" + +"@types/lodash@*": + version "4.14.199" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.199.tgz#c3edb5650149d847a277a8961a7ad360c474e9bf" + integrity sha512-Vrjz5N5Ia4SEzWWgIVwnHNEnb1UE1XMkvY5DGXrAeOGE9imk0hgTHh5GyDjLDJi9OTCn9oo9dXH1uToK1VRfrg== + "@types/lodash@^4.14.149": version "4.14.153" resolved "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.153.tgz" @@ -1422,6 +1459,11 @@ resolved "https://registry.npmjs.org/@types/selenium-webdriver/-/selenium-webdriver-3.0.17.tgz" integrity sha512-tGomyEuzSC1H28y2zlW6XPCaDaXFaD6soTdb4GNdmte2qfHtrKqhy0ZFs4r/1hpazCfEZqeTSRLvSasmEx89uw== +"@types/semver@^7.5.0": + version "7.5.3" + resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.5.3.tgz#9a726e116beb26c24f1ccd6850201e1246122e04" + integrity sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw== + "@types/source-list-map@*": version "0.1.2" resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" @@ -1441,6 +1483,11 @@ "@types/source-list-map" "*" source-map "^0.6.1" +"@types/yarnpkg__lockfile@^1.1.6": + version "1.1.7" + resolved "https://registry.yarnpkg.com/@types/yarnpkg__lockfile/-/yarnpkg__lockfile-1.1.7.tgz#afe797c296670ea995ea4beca37c15de4f034a2f" + integrity sha512-yfOmuImLIhYVS+Xtwk2OevYLJLN+PRLe36AvtagtsSY3xHuYBTTM3zW6lterq94YTdiRcHEOPeX5h4H8QnynAg== + "@typescript-eslint/eslint-plugin@^2.31.0": version "2.34.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-2.34.0.tgz" @@ -1677,7 +1724,7 @@ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== -"@yarnpkg/lockfile@1.1.0": +"@yarnpkg/lockfile@1.1.0", "@yarnpkg/lockfile@^1.1.0": version "1.1.0" resolved "https://registry.npmjs.org/@yarnpkg/lockfile/-/lockfile-1.1.0.tgz" integrity sha512-GpSwvyXOcOOlV70vbnzjj4fW5xW/FdUF6nQEt1ENy7m4ZCczi1+/buVUPAqmGfqznsORNFzUMjctTIp8a9tuCQ== @@ -1896,6 +1943,11 @@ argparse@^1.0.7: dependencies: sprintf-js "~1.0.2" +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + arr-diff@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz" @@ -2125,6 +2177,27 @@ base@^0.11.1: mixin-deep "^1.2.0" pascalcase "^0.1.1" +bash-glob@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bash-glob/-/bash-glob-2.0.0.tgz#a8ef19450783403ed93fccca2dbe09f2cf6320dc" + integrity sha512-53/NJ+t2UAkEYgQPO6aFjbx1Ue8vNNXCYaA4EljNKP1SR8A9dSQQoBmYWR8BLXO0/NDRJEMSJ4BxWihi//m3Kw== + dependencies: + bash-path "^1.0.1" + component-emitter "^1.2.1" + cross-spawn "^5.1.0" + each-parallel-async "^1.0.0" + extend-shallow "^2.0.1" + is-extglob "^2.1.1" + is-glob "^4.0.0" + +bash-path@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bash-path/-/bash-path-1.0.3.tgz#dbc9efbdf18b1c11413dcb59b960e6aa56c84258" + integrity sha512-mGrYvOa6yTY/qNCiZkPFJqWmODK68y6kmVRAJ1NNbWlNoJrUrsFxu7FU2EKg7gbrer6ttrKkF2s/E/lhRy7/OA== + dependencies: + arr-union "^3.1.0" + is-windows "^1.0.1" + batch@0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz" @@ -2250,7 +2323,7 @@ braces@^2.3.1, braces@^2.3.2: split-string "^3.0.2" to-regex "^3.0.1" -braces@^3.0.1, braces@~3.0.2: +braces@^3.0.1, braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== @@ -2600,6 +2673,11 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@^5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-5.3.0.tgz#67c20a7ebef70e7f3970a01f90fa210cb6860385" + integrity sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w== + character-entities-html4@^1.0.0: version "1.1.4" resolved "https://registry.npmjs.org/character-entities-html4/-/character-entities-html4-1.1.4.tgz" @@ -2863,6 +2941,11 @@ colors@1.1.2, colors@^1.1.0: resolved "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz" integrity sha1-FopHAXVran9RoSzgyXv6KMCE7WM= +colors@1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" + integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== + combined-stream@^1.0.6, combined-stream@~1.0.6: version "1.0.8" resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" @@ -2870,11 +2953,26 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" -commander@2, commander@^2.19.0, commander@^2.20.0: +commander@2, commander@^2.11.0, commander@^2.19.0, commander@^2.20.0: 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== +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" @@ -3114,6 +3212,15 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cross-spawn@^6.0.0, cross-spawn@^6.0.5: version "6.0.5" resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz" @@ -3893,6 +4000,11 @@ duplexify@^3.4.2, duplexify@^3.6.0: readable-stream "^2.0.0" stream-shift "^1.0.0" +each-parallel-async@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/each-parallel-async/-/each-parallel-async-1.0.0.tgz#91783e190000c7dd588336b2d468ebaf71980f7b" + integrity sha512-P/9kLQiQj0vZNzphvKKTgRgMnlqs5cJsxeAiuog1jrUnwv0Z3hVUwJDQiP7MnLb2I9S15nR9SRUceFT9IxtqRg== + ecc-jsbn@~0.1.1: version "0.1.2" resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz" @@ -4022,6 +4134,11 @@ entities@^2.0.0, entities@~2.0.0: resolved "https://registry.npmjs.org/entities/-/entities-2.0.2.tgz" integrity sha512-dmD3AvJQBUjKpcNkoqr+x+IF0SdRtPz9Vk0uTy4yWqga9ibB6s4v++QFWNohjiUGoMlF552ZvNyXDxz5iW0qmw== +eol@^0.9.1: + version "0.9.1" + resolved "https://registry.yarnpkg.com/eol/-/eol-0.9.1.tgz#f701912f504074be35c6117a5c4ade49cd547acd" + integrity sha512-Ds/TEoZjwggRoz/Q2O7SE3i4Jm66mqTDfmdHdq/7DKVk3bro9Q8h6WdXKdPqFLMoqxrDK5SVRzHVPOS6uuGtrg== + err-code@^1.0.0: version "1.1.2" resolved "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz" @@ -4389,6 +4506,17 @@ fast-glob@^3.1.1: micromatch "^4.0.2" picomatch "^2.2.1" +fast-glob@^3.3.1: + version "3.3.1" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.3.1.tgz#784b4e897340f3dbbef17413b3f11acf03c874c4" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + fast-json-stable-stringify@2.1.0, fast-json-stable-stringify@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz" @@ -4447,6 +4575,11 @@ file-loader@6.0.0: loader-utils "^2.0.0" schema-utils "^2.6.5" +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.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz" @@ -4508,6 +4641,14 @@ find-cache-dir@^2.0.0, find-cache-dir@^2.1.0: make-dir "^2.0.0" pkg-dir "^3.0.0" +find-cache-dir@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-5.0.0.tgz#69d1a9b77bbe39aea078dbede99d277a170d3079" + integrity sha512-OuWNfjfP05JcpAP3JPgAKUhWefjMRfI5iAoSsvE24ANYWJaepAtlSgWECSVEuRgSXpyNEc9DJwG/TZpgcOqyig== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + find-up@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz" @@ -4523,6 +4664,14 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz" @@ -4617,6 +4766,15 @@ fs-extra@4.0.2: jsonfile "^4.0.0" universalify "^0.1.0" +fs-extra@^11.1.1: + version "11.1.1" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d" + integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ== + dependencies: + graceful-fs "^4.2.0" + jsonfile "^6.0.1" + universalify "^2.0.0" + fs-extra@^7.0.1: version "7.0.1" resolved "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz" @@ -4737,6 +4895,13 @@ glob-parent@^5.0.0, glob-parent@^5.1.0, glob-parent@~5.1.0: dependencies: is-glob "^4.0.1" +glob-parent@^5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + glob@7.1.6, glob@^7.0.3, glob@^7.0.6, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6: version "7.1.6" resolved "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz" @@ -4841,6 +5006,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.1.2, graceful-fs@^4.1.6 resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz" integrity sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw== +graceful-fs@^4.2.0: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + handle-thing@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" @@ -5650,7 +5820,7 @@ is-whitespace-character@^1.0.0: resolved "https://registry.npmjs.org/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz" integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w== -is-windows@^1.0.2: +is-windows@^1.0.1, is-windows@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz" integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== @@ -5854,6 +6024,13 @@ js-yaml@^3.13.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.1.0.tgz#c1fb65f8f5017901cdd2c951864ba18458a10602" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + jsbn@~0.1.0: version "0.1.1" resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" @@ -5920,6 +6097,15 @@ jsonfile@^4.0.0: optionalDependencies: graceful-fs "^4.1.6" +jsonfile@^6.0.1: + version "6.1.0" + resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae" + integrity sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ== + dependencies: + universalify "^2.0.0" + optionalDependencies: + graceful-fs "^4.1.6" + jsonparse@^1.2.0: version "1.3.1" resolved "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz" @@ -6020,6 +6206,11 @@ katex@^0.12.0: dependencies: commander "^2.19.0" +keyword-extractor@0.0.25: + version "0.0.25" + resolved "https://registry.yarnpkg.com/keyword-extractor/-/keyword-extractor-0.0.25.tgz#b791bf8cdae4d94abac33d3d2939334e2194fc6b" + integrity sha512-OpsjHSrHMheOEm/K5FQhkXV2wALqFemeI+yub/k2K5suhmodw7wM0RhuHHkvOKJp6m+LdKp5sVKFYf6ZtSFhrA== + killable@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz" @@ -6172,6 +6363,18 @@ locate-path@^5.0.0: dependencies: p-locate "^4.1.0" +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash-es@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.17.21.tgz#43e626c46e6591b7750beb2b50117390c609e3ee" + integrity sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw== + lodash.clonedeep@^4.5.0: version "4.5.0" resolved "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz" @@ -6187,7 +6390,7 @@ lodash.uniq@^4.5.0: resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" integrity sha1-0CJTc662Uq3BvILklFM5qEJ1R3M= -lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: +lodash@4.17.21, lodash@^4.17.11, lodash@^4.17.13, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6241,7 +6444,7 @@ loose-envify@^1.0.0: dependencies: js-tokens "^3.0.0 || ^4.0.0" -lru-cache@4.1.x: +lru-cache@4.1.x, lru-cache@^4.0.1: version "4.1.5" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== @@ -6256,6 +6459,13 @@ lru-cache@^5.1.1: dependencies: yallist "^3.0.2" +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + madr@2.1.2: version "2.1.2" resolved "https://registry.npmjs.org/madr/-/madr-2.1.2.tgz" @@ -6541,6 +6751,14 @@ micromatch@^4.0.2: braces "^3.0.1" picomatch "^2.0.5" +micromatch@^4.0.4: + version "4.0.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + miller-rabin@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz" @@ -6815,6 +7033,13 @@ nice-try@^1.0.4: resolved "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz" integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== +nmtree@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/nmtree/-/nmtree-1.0.6.tgz#953e057ad545e9e627f1275bd25fea4e92c1cf63" + integrity sha512-SUPCoyX5w/lOT6wD/PZEymR+J899984tYEOYjuDqQlIOeX5NSb1MEsCcT0az+dhZD0MLAj5hGBZEpKQxuDdniA== + dependencies: + commander "^2.11.0" + node-fetch-npm@^2.0.2: version "2.0.4" resolved "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz" @@ -7242,6 +7467,13 @@ p-limit@^2.0.0, p-limit@^2.2.0, p-limit@^2.2.1, p-limit@^2.2.2: dependencies: p-try "^2.0.0" +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + p-locate@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz" @@ -7256,6 +7488,13 @@ p-locate@^4.1.0: dependencies: p-limit "^2.2.0" +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + p-map@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" @@ -7438,6 +7677,11 @@ path-exists@^4.0.0: resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" @@ -7496,6 +7740,11 @@ picomatch@^2.0.4, picomatch@^2.0.5, picomatch@^2.2.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz" integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== +picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" @@ -7537,6 +7786,13 @@ pkg-dir@^4.1.0: dependencies: find-up "^4.0.0" +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + portfinder@^1.0.26: version "1.0.26" resolved "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz" @@ -8803,6 +9059,13 @@ semver@^7.3.2: resolved "https://registry.npmjs.org/semver/-/semver-7.3.2.tgz" integrity sha512-OrOb32TeeambH6UrhtShmF7CRDqhL6/5XpPNp2DuRH6+9QLw/orhp72j87v8Qa1ScDkvrrBNpZcDejAirJmfXQ== +semver@^7.3.5, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.5.4.tgz#483986ec4ed38e1c6c48c34894a9182dbff68a6e" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + send@0.17.1: version "0.17.1" resolved "https://registry.npmjs.org/send/-/send-0.17.1.tgz" @@ -9077,6 +9340,11 @@ sort-keys@^1.0.0: dependencies: is-plain-obj "^1.0.0" +sort-object-keys@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" + integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== + source-list-map@^2.0.0: version "2.0.1" resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz" @@ -9648,6 +9916,21 @@ symbol-observable@1.2.0: resolved "https://registry.npmjs.org/symbol-observable/-/symbol-observable-1.2.0.tgz" integrity sha512-e900nM8RRtGhlV36KGEU9k65K3mPb1WV70OdjfxlG2EAuM1noi/E/BaW/uMhL7bPEssK8QV57vN3esixjUvcXQ== +synp@^1.9.10: + version "1.9.10" + resolved "https://registry.yarnpkg.com/synp/-/synp-1.9.10.tgz#53163321a600418c9b06af0db499939ffce12907" + integrity sha512-G9Z/TXTaBG1xNslUf3dHFidz/8tvvRaR560WWyOwyI7XrGGEGBTEIIg4hdRh1qFtz8mPYynAUYwWXUg/Zh0Pzw== + dependencies: + "@yarnpkg/lockfile" "^1.1.0" + bash-glob "^2.0.0" + colors "1.4.0" + commander "^7.2.0" + eol "^0.9.1" + lodash "4.17.21" + nmtree "^1.0.6" + semver "^7.3.5" + sort-object-keys "^1.1.3" + table@^5.2.3, table@^5.4.6: version "5.4.6" resolved "https://registry.npmjs.org/table/-/table-5.4.6.tgz" @@ -10127,6 +10410,11 @@ universalify@^0.1.0: resolved "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz" integrity sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg== +universalify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717" + integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ== + unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" @@ -10721,6 +11009,29 @@ yargs@^13.3.2: y18n "^4.0.0" yargs-parser "^13.1.2" +yarn-audit-fix@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/yarn-audit-fix/-/yarn-audit-fix-10.0.1.tgz#914b20e91473b2aa3ca969bddce92da2fd2d92d3" + integrity sha512-fGSJE26UNjzVItCENrCc27iKH9HO7+y6hqlUKdCOX/MHlWk5/nUCx6ggy+M/+c4Y5dTthb2aiUpOQY9OsfjTNQ== + dependencies: + "@types/find-cache-dir" "^3.2.1" + "@types/fs-extra" "^11.0.1" + "@types/lodash-es" "^4.17.8" + "@types/semver" "^7.5.0" + "@types/yarnpkg__lockfile" "^1.1.6" + "@yarnpkg/lockfile" "^1.1.0" + chalk "^5.3.0" + commander "^10.0.1" + fast-glob "^3.3.1" + find-cache-dir "^5.0.0" + find-up "^6.3.0" + fs-extra "^11.1.1" + js-yaml "^4.1.0" + lodash-es "^4.17.21" + pkg-dir "^7.0.0" + semver "^7.5.4" + synp "^1.9.10" + yeast@0.1.2: version "0.1.2" resolved "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz" @@ -10731,6 +11042,11 @@ yn@^3.0.0: resolved "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz" integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== +yocto-queue@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.0.0.tgz#7f816433fb2cbc511ec8bf7d263c3b58a1a3c251" + integrity sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g== + zone.js@~0.10.3: version "0.10.3" resolved "https://registry.npmjs.org/zone.js/-/zone.js-0.10.3.tgz"