Kaynağa Gözat

chain components

bioinsilico 4 yıl önce
ebeveyn
işleme
47c9e27996

Dosya farkı çok büyük olduğundan ihmal edildi
+ 6566 - 4
package-lock.json


+ 1 - 1
package.json

@@ -74,7 +74,7 @@
     "webpack-cli": "^3.3.12"
     "webpack-cli": "^3.3.12"
   },
   },
   "dependencies": {
   "dependencies": {
-    "@rcsb/rcsb-molstar": "^1.0.32",
+    "@rcsb/rcsb-molstar": "file:../rcsb-molstar",
     "@rcsb/rcsb-saguaro": "^1.0.13",
     "@rcsb/rcsb-saguaro": "^1.0.13",
     "@rcsb/rcsb-saguaro-app": "^1.0.22",
     "@rcsb/rcsb-saguaro-app": "^1.0.22",
     "@types/react": "^16.9.49",
     "@types/react": "^16.9.49",

+ 1 - 1
src/RcsbFvSequence/SequenceViews/AbstractView.tsx

@@ -81,7 +81,7 @@ export abstract class AbstractView<P,S> extends React.Component <P & AbstractVie
     protected updateDimensions(): void{}
     protected updateDimensions(): void{}
 
 
     protected additionalContent(): JSX.Element | null {
     protected additionalContent(): JSX.Element | null {
-        return <div></div>;
+        return <></>;
     }
     }
 
 
 }
 }

+ 27 - 8
src/RcsbFvSequence/SequenceViews/AssemblyView.tsx

@@ -23,9 +23,11 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
     private currentLabelAsymId: string;
     private currentLabelAsymId: string;
     private currentEntryId: string;
     private currentEntryId: string;
     private currentModelId: string;
     private currentModelId: string;
+    private currentModelNumber: string;
     private createComponentThresholdBatch = 3;
     private createComponentThresholdBatch = 3;
     private createComponentThreshold: number = 9;
     private createComponentThreshold: number = 9;
     private innerSelectionFlag: boolean = false;
     private innerSelectionFlag: boolean = false;
+    private currentSelectedComponentId: string;
     //private readonly componentSet = new Map<string, {current: Set<string>, previous: Set<string>}>();
     //private readonly componentSet = new Map<string, {current: Set<string>, previous: Set<string>}>();
 
 
     constructor(props: AssemblyViewInterface & AbstractViewInterface) {
     constructor(props: AssemblyViewInterface & AbstractViewInterface) {
@@ -52,16 +54,17 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
         setBoardConfig({
         setBoardConfig({
             trackWidth: trackWidth,
             trackWidth: trackWidth,
             elementClickCallBack:(e:RcsbFvTrackDataElementInterface)=>{
             elementClickCallBack:(e:RcsbFvTrackDataElementInterface)=>{
-                this.props.plugin.removeComponent();
+                if(this.currentSelectedComponentId != null)
+                    this.props.plugin.removeComponent(this.currentSelectedComponentId);
                 if(e == null)
                 if(e == null)
                     return;
                     return;
                 const x = e.begin;
                 const x = e.begin;
                 const y = e.end ?? e.begin;
                 const y = e.end ?? e.begin;
                 if(e.isEmpty){
                 if(e.isEmpty){
                     this.props.plugin.focusPositions(this.currentModelId, this.currentLabelAsymId, [x,y]);
                     this.props.plugin.focusPositions(this.currentModelId, this.currentLabelAsymId, [x,y]);
-                    const componentId: string = this.currentLabelAsymId +":"+ ((x === y) ? x.toString() : x.toString()+","+y.toString());
-                    this.props.plugin.createComponentFromSet(
-                        componentId,
+                    this.currentSelectedComponentId = this.currentLabelAsymId +":"+ ((x === y) ? x.toString() : x.toString()+","+y.toString());
+                    this.props.plugin.createComponent(
+                        this.currentSelectedComponentId,
                         this.currentModelId,
                         this.currentModelId,
                         [{asymId: this.currentLabelAsymId, position: x}, {asymId: this.currentLabelAsymId, position: y}],
                         [{asymId: this.currentLabelAsymId, position: x}, {asymId: this.currentLabelAsymId, position: y}],
                         'ball-and-stick'
                         'ball-and-stick'
@@ -69,8 +72,8 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
                 }else{
                 }else{
                     this.props.plugin.focusRange(this.currentModelId, this.currentLabelAsymId, x, y);
                     this.props.plugin.focusRange(this.currentModelId, this.currentLabelAsymId, x, y);
                     if((y-x)<this.createComponentThreshold){
                     if((y-x)<this.createComponentThreshold){
-                        const componentId: string = this.currentLabelAsymId +":"+ (x === y ? x.toString() : x.toString()+"-"+y.toString());
-                        this.props.plugin.createComponentFromRange(componentId, this.currentModelId, this.currentLabelAsymId, x, y, 'ball-and-stick');
+                        this.currentSelectedComponentId = this.currentLabelAsymId +":"+ (x === y ? x.toString() : x.toString()+"-"+y.toString());
+                        this.props.plugin.createComponent(this.currentSelectedComponentId, this.currentModelId, this.currentLabelAsymId, x, y, 'ball-and-stick');
                     }
                     }
                 }
                 }
             },
             },
@@ -123,8 +126,8 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
         if(getRcsbFv(this.pfvDivId) == null)
         if(getRcsbFv(this.pfvDivId) == null)
             return;
             return;
         this.innerSelectionFlag = true;
         this.innerSelectionFlag = true;
-        if(mode === 'select'){
-            this.props.plugin.removeComponent();
+        if(mode === 'select' && this.currentSelectedComponentId != null){
+            this.props.plugin.removeComponent(this.currentSelectedComponentId);
         }
         }
         const allSel: Array<ChainSelectionInterface> | undefined = this.props.selection.getSelection(mode);
         const allSel: Array<ChainSelectionInterface> | undefined = this.props.selection.getSelection(mode);
         if(allSel == null || allSel.length ===0) {
         if(allSel == null || allSel.length ===0) {
@@ -173,6 +176,7 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
                 const length: number = getRcsbFv(this.pfvDivId).getBoardConfig().length ?? 0;
                 const length: number = getRcsbFv(this.pfvDivId).getBoardConfig().length ?? 0;
                 this.createComponentThreshold = (((Math.floor(length/100))+1)*this.createComponentThresholdBatch)-1;
                 this.createComponentThreshold = (((Math.floor(length/100))+1)*this.createComponentThresholdBatch)-1;
             });
             });
+        this.createChainComponents(modelMap);
     }
     }
 
 
     protected updateDimensions(): void{
     protected updateDimensions(): void{
@@ -199,6 +203,21 @@ export class AssemblyView extends AbstractView<AssemblyViewInterface & AbstractV
         });
         });
     }
     }
 
 
+    private async createChainComponents(modelMap:SaguaroPluginModelMapType): Promise<void> {
+        const chains: Array<{modelId: string; auth: string; label: string;}> = new Array<{modelId: string; auth: string; label: string;}>();
+        modelMap.forEach((entry, modelId)=>{
+            entry.chains.forEach(ch=>{
+                if(ch.type === "polymer") {
+                    chains.push({modelId: modelId, auth: ch.auth, label: ch.label});
+                }
+            });
+        });
+        this.props.plugin.removeComponent();
+        for(const ch of chains) {
+            await this.props.plugin.createComponent("Chain " + ch.auth, ch.modelId, ch.label, 'cartoon');
+        }
+    }
+
     /*private removeComponents(labelAsymId?:string){
     /*private removeComponents(labelAsymId?:string){
         if(labelAsymId != null){
         if(labelAsymId != null){
             this.componentSet.get(labelAsymId)?.current.forEach(componentId=>{
             this.componentSet.get(labelAsymId)?.current.forEach(componentId=>{

+ 43 - 40
src/RcsbFvStructure/StructurePlugins/MolstarPlugin.ts

@@ -28,6 +28,7 @@ import {InteractivityManager} from "molstar/lib/mol-plugin-state/manager/interac
 import {Script} from "molstar/lib/mol-script/script";
 import {Script} from "molstar/lib/mol-script/script";
 import {MolScriptBuilder} from "molstar/lib/mol-script/language/builder";
 import {MolScriptBuilder} from "molstar/lib/mol-script/language/builder";
 import {SetUtils} from "molstar/lib/mol-util/set";
 import {SetUtils} from "molstar/lib/mol-util/set";
+import {StructureRepresentationRegistry} from "molstar/lib/mol-repr/structure/registry";
 
 
 export enum LoadMethod {
 export enum LoadMethod {
     loadPdbId = "loadPdbId",
     loadPdbId = "loadPdbId",
@@ -58,10 +59,10 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
     private plugin: Viewer;
     private plugin: Viewer;
     private innerSelectionFlag: boolean = false;
     private innerSelectionFlag: boolean = false;
     private loadingFlag: boolean = false;
     private loadingFlag: boolean = false;
-    private modelChangeCallback: (chainMap:SaguaroPluginModelMapType)=>void;
-    private modelMap: Map<string,string|undefined> = new Map<string, string>();
     private selectCallbackSubs: Subscription;
     private selectCallbackSubs: Subscription;
+    private modelChangeCallback: (chainMap:SaguaroPluginModelMapType)=>void;
     private modelChangeCallbackSubs: Subscription;
     private modelChangeCallbackSubs: Subscription;
+    private modelMap: Map<string,string|undefined> = new Map<string, string>();
     private readonly componentSet: Set<string> = new Set<string>();
     private readonly componentSet: Set<string> = new Set<string>();
 
 
     constructor(props: RcsbFvSelection) {
     constructor(props: RcsbFvSelection) {
@@ -70,6 +71,7 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
 
 
     public init(target: string | HTMLElement, props?: Partial<ViewerProps>) {
     public init(target: string | HTMLElement, props?: Partial<ViewerProps>) {
         this.plugin = new Viewer(target, {layoutShowControls:false, layoutShowSequence: true, ...props});
         this.plugin = new Viewer(target, {layoutShowControls:false, layoutShowSequence: true, ...props});
+        this.plugin.getPlugin().representation.structure.registry
     }
     }
 
 
     public clear(): void{
     public clear(): void{
@@ -169,22 +171,21 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
         this.focusPositions(modelId, asymId, seqIds);
         this.focusPositions(modelId, asymId, seqIds);
     }
     }
 
 
-    public createComponentFromRange(componentId: string, modelId:string, asymId: string, begin: number, end : number, representationType: 'ball-and-stick' | 'spacefill' | 'gaussian-surface' | 'cartoon'): Promise<void> {
-        return this.plugin.createComponentFromRange(componentId, this.getModelId(modelId), asymId, begin, end, representationType).then(()=>{
-            this.componentSet.add(componentId);
-        });
-    }
-
-
-    public createComponentFromSet(componentId: string, modelId:string, residues: Array<{asymId: string; position: number;}>, representationType: 'ball-and-stick' | 'spacefill' | 'gaussian-surface' | 'cartoon'): Promise<void> {
-        this.componentSet.add(componentId);
-        return this.plugin.createComponentFromSet(componentId, this.getModelId(modelId), residues, representationType);
+    public async createComponent(componentLabel: string, modelId:string, asymId: string, begin: number, end : number, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
+    public async createComponent(componentLabel: string, modelId:string, asymId: string, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
+    public async createComponent(componentLabel: string, modelId:string, residues: Array<{asymId: string; position: number;}>, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
+    public async createComponent(...args: any[]): Promise<void> {
+        this.componentSet.add(args[0]);
+        if(args.length === 4)
+            await this.plugin.createComponent(args[0], this.getModelId(args[1]), args[2], args[3]);
+        else if(args.length === 6)
+            await this.plugin.createComponent(args[0], this.getModelId(args[1]), args[2], args[3], args[4], args[5]);
     }
     }
 
 
-    public isComponent(componentId: string): boolean{
+    public isComponent(componentLabel: string): boolean{
         for(const c of this.plugin.getPlugin().managers.structure.hierarchy.currentComponentGroups){
         for(const c of this.plugin.getPlugin().managers.structure.hierarchy.currentComponentGroups){
             for(const comp of c){
             for(const comp of c){
-                if(comp.cell.obj?.label === componentId) {
+                if(comp.cell.obj?.label === componentLabel) {
                     return true;
                     return true;
                 }
                 }
             }
             }
@@ -206,15 +207,15 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
         return out;
         return out;
     }
     }
 
 
-    public removeComponent(componentId?: string): void{
-        if(componentId == null){
+    public removeComponent(componentLabel?: string): void{
+        if(componentLabel == null){
             this.componentSet.forEach(id=>{
             this.componentSet.forEach(id=>{
                 this.plugin.removeComponent(id);
                 this.plugin.removeComponent(id);
             })
             })
             this.componentSet.clear();
             this.componentSet.clear();
         }else{
         }else{
-            this.plugin.removeComponent(componentId);
-            this.componentSet.delete(componentId);
+            this.plugin.removeComponent(componentLabel);
+            this.componentSet.delete(componentLabel);
         }
         }
     }
     }
 
 
@@ -297,19 +298,21 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
         this.modelChangeCallbackSubs = this.plugin.getPlugin().state.events.object.updated.subscribe((o)=>{
         this.modelChangeCallbackSubs = this.plugin.getPlugin().state.events.object.updated.subscribe((o)=>{
             if(this.loadingFlag)
             if(this.loadingFlag)
                 return;
                 return;
-            if(o.action === "in-place" && o.ref === "ms-plugin.create-structure-focus-representation") {
+            if(o.obj.type.name === "Behavior" && o.action === "in-place") {
+                f(this.getChains());
+            }else if(o.obj.type.name === "Model" && o.action === "in-place"){
                 f(this.getChains());
                 f(this.getChains());
             }
             }
         });
         });
     }
     }
 
 
     private getChains(): SaguaroPluginModelMapType{
     private getChains(): SaguaroPluginModelMapType{
-        const structureRefList = getStructureOptions(this.plugin.getPlugin().state.data);
-        const out: Map<string,{entryId: string; chains:Array<{label:string, auth:string}>;}> = new Map<string, {entryId: string; chains:Array<{label:string, auth:string}>;}>();
+        const structureRefList = getStructureOptions(this.plugin.getPlugin());
+        const out: SaguaroPluginModelMapType = new Map<string, {entryId: string; chains: Array<{label:string;auth:string;entityId:string;title:string;type:ChainType;}>}>();
         structureRefList.forEach((structureRef,i)=>{
         structureRefList.forEach((structureRef,i)=>{
             const structure = getStructure(structureRef[0], this.plugin.getPlugin().state.data);
             const structure = getStructure(structureRef[0], this.plugin.getPlugin().state.data);
             let modelEntityId = getModelEntityOptions(structure)[0][0];
             let modelEntityId = getModelEntityOptions(structure)[0][0];
-            const chains: [{modelId:string, entryId:string},{auth:string,label:string}[]] = getChainValues(structure, modelEntityId);
+            const chains: [{modelId:string;entryId:string},{auth:string;label:string;entityId:string;title:string;type:ChainType;}[]] = getChainValues(structure, modelEntityId);
             out.set(this.getModelId(chains[0].modelId),{entryId:chains[0].entryId, chains: chains[1]});
             out.set(this.getModelId(chains[0].modelId),{entryId:chains[0].entryId, chains: chains[1]});
         });
         });
         return out;
         return out;
@@ -317,11 +320,11 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
 
 
     private mapModels(loadParams: LoadParams | Array<LoadParams>): void{
     private mapModels(loadParams: LoadParams | Array<LoadParams>): void{
         const loadParamList: Array<LoadParams> = loadParams instanceof Array ? loadParams : [loadParams];
         const loadParamList: Array<LoadParams> = loadParams instanceof Array ? loadParams : [loadParams];
-        const structureRefList = getStructureOptions(this.plugin.getPlugin().state.data);
+        const structureRefList = getStructureOptions(this.plugin.getPlugin());
         structureRefList.forEach((structureRef,i)=>{
         structureRefList.forEach((structureRef,i)=>{
             const structure = getStructure(structureRef[0], this.plugin.getPlugin().state.data);
             const structure = getStructure(structureRef[0], this.plugin.getPlugin().state.data);
             let modelEntityId = getModelEntityOptions(structure)[0][0];
             let modelEntityId = getModelEntityOptions(structure)[0][0];
-            const chains: [{modelId:string, entryId:string},{auth:string,label:string}[]] = getChainValues(structure, modelEntityId);
+            const chains: [{modelId:string, entryId:string},{auth:string,label:string;entityId:string;title:string;type:ChainType;}[]] = getChainValues(structure, modelEntityId);
             this.modelMap.set(chains[0].modelId,loadParamList[i].id);
             this.modelMap.set(chains[0].modelId,loadParamList[i].id);
             if(loadParamList[i].id!=null)
             if(loadParamList[i].id!=null)
                 this.modelMap.set(loadParamList[i].id!,chains[0].modelId);
                 this.modelMap.set(loadParamList[i].id!,chains[0].modelId);
@@ -343,20 +346,30 @@ export class MolstarPlugin extends AbstractPlugin implements SaguaroPluginInterf
 
 
 }
 }
 
 
-function getChainValues(structure: Structure, modelEntityId: string): [{modelId:string, entryId:string},{auth:string;label:string}[]] {
-    const options: {auth:string;label:string}[] = [];
+type ChainType = "polymer"|"water"|"branched"|"non-polymer"|"macrolide";
+
+function getStructureOptions(plugin: PluginContext): [string,string][] {
+    const options: [string, string][] = [];
+    plugin.managers.structure.hierarchy.current.structures.forEach(s=>{
+        options.push([s.cell.transform.ref, s.cell.obj!.data.label]);
+    })
+    return options;
+}
+
+function getChainValues(structure: Structure, modelEntityId: string): [{modelId:string, entryId:string},{auth:string;label:string;entityId:string;title:string;type:ChainType;}[]] {
+    const options: {auth:string;label:string;entityId:string;title:string;type:ChainType;}[] = [];
     const l = StructureElement.Location.create(structure);
     const l = StructureElement.Location.create(structure);
     const seen = new Set<number>();
     const seen = new Set<number>();
-    const [ modelIdx, entityId ] = splitModelEntityId(modelEntityId);
+    const [modelIdx, entityId] = splitModelEntityId(modelEntityId);
 
 
     for (const unit of structure.units) {
     for (const unit of structure.units) {
         StructureElement.Location.set(l, structure, unit, unit.elements[0]);
         StructureElement.Location.set(l, structure, unit, unit.elements[0]);
         if (structure.getModelIndex(unit.model) !== modelIdx) continue;
         if (structure.getModelIndex(unit.model) !== modelIdx) continue;
 
 
         const id = unit.chainGroupId;
         const id = unit.chainGroupId;
-        if (seen.has(id)) continue;
+        if(seen.has(id)) continue;
 
 
-        options.push({label:SP.chain.label_asym_id(l), auth:SP.chain.auth_asym_id(l)});
+        options.push({label:SP.chain.label_asym_id(l), auth:SP.chain.auth_asym_id(l), entityId: SP.entity.id(l), title: SP.entity.pdbx_description(l).join("|"), type: SP.entity.type(l)});
         seen.add(id);
         seen.add(id);
     }
     }
     const id: {modelId:string, entryId:string} = {modelId:l.unit?.model?.id, entryId: l.unit?.model?.entryId};
     const id: {modelId:string, entryId:string} = {modelId:l.unit?.model?.id, entryId: l.unit?.model?.entryId};
@@ -374,23 +387,13 @@ function getStructureWithModelId(structures: StructureRef[], modelId: string): S
     }
     }
 }
 }
 
 
-function getStructureOptions(state: State) {
-    const options: [string, string][] = [];
-    const structures = state.select(StateSelection.Generators.rootsOfType(PSO.Molecule.Structure));
-    for (const s of structures) {
-        options.push([s.transform.ref, s.obj!.data.label]);
-    }
-    if (options.length === 0) options.push(['', 'No structure']);
-    return options;
-}
-
 function getStructure(ref: string, state: State) {
 function getStructure(ref: string, state: State) {
     const cell = state.select(ref)[0];
     const cell = state.select(ref)[0];
     if (!ref || !cell || !cell.obj) return Structure.Empty;
     if (!ref || !cell || !cell.obj) return Structure.Empty;
     return (cell.obj as PSO.Molecule.Structure).data;
     return (cell.obj as PSO.Molecule.Structure).data;
 }
 }
 
 
-function getModelEntityOptions(structure: Structure) {
+function getModelEntityOptions(structure: Structure):[string, string][] {
     const options: [string, string][] = [];
     const options: [string, string][] = [];
     const l = StructureElement.Location.create(structure);
     const l = StructureElement.Location.create(structure);
     const seen = new Set<string>();
     const seen = new Set<string>();

+ 5 - 3
src/RcsbFvStructure/StructurePlugins/SaguaroPluginInterface.ts

@@ -1,7 +1,8 @@
 import {LoadMolstarInterface} from "./MolstarPlugin";
 import {LoadMolstarInterface} from "./MolstarPlugin";
 import {PluginContext} from "molstar/lib/mol-plugin/context";
 import {PluginContext} from "molstar/lib/mol-plugin/context";
+import {StructureRepresentationRegistry} from "molstar/lib/mol-repr/structure/registry";
 
 
-export type SaguaroPluginModelMapType = Map<string,{entryId: string; chains:Array<{label:string, auth:string}>;}>;
+export type SaguaroPluginModelMapType = Map<string,{entryId: string; chains:Array<{label:string, auth:string; entityId: string; title: string; type:"polymer"|"water"|"branched"|"non-polymer"|"macrolide";}>;}>;
 
 
 export interface SaguaroPluginInterface extends SaguaroPluginPublicInterface{
 export interface SaguaroPluginInterface extends SaguaroPluginPublicInterface{
     init: (elementId: string, props?: any) => void;
     init: (elementId: string, props?: any) => void;
@@ -18,8 +19,9 @@ export interface SaguaroPluginPublicInterface {
     selectRange: (modelId:string, asymId: string, x: number, y: number, mode: 'select'|'hover', operation:'set'|'add') => void;
     selectRange: (modelId:string, asymId: string, x: number, y: number, mode: 'select'|'hover', operation:'set'|'add') => void;
     selectSet: (selection: Array<{modelId:string; asymId: string; position: number;}>, mode: 'select'|'hover', operation:'add'|'set') => void;
     selectSet: (selection: Array<{modelId:string; asymId: string; position: number;}>, mode: 'select'|'hover', operation:'add'|'set') => void;
     clearSelection: (mode:'select'|'hover', option?:{modelId:string; labelAsymId:string;}) => void;
     clearSelection: (mode:'select'|'hover', option?:{modelId:string; labelAsymId:string;}) => void;
-    createComponentFromRange: (componentId: string, modelId:string, asymId: string, x: number, y: number, representationType: 'ball-and-stick' | 'spacefill' | 'gaussian-surface' | 'cartoon') => Promise<void>;
-    createComponentFromSet: (componentId: string, modelId:string, residues: Array<{asymId: string; position: number;}>, representationType: 'ball-and-stick' | 'spacefill' | 'gaussian-surface' | 'cartoon') => Promise<void>;
+    createComponent(componentId: string, modelId:string, asymId: string, begin: number, end : number, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
+    createComponent(componentId: string, modelId:string, asymId: string, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
+    createComponent(componentId: string, modelId:string, residues: Array<{asymId: string; position: number;}>, representationType: StructureRepresentationRegistry.BuiltIn): Promise<void>;
     removeComponent: (componentId?: string) => void;
     removeComponent: (componentId?: string) => void;
     isComponent: (componentId: string) => boolean;
     isComponent: (componentId: string) => boolean;
     getComponentSet: () => Set<string>;
     getComponentSet: () => Set<string>;

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor