Mercurial > repos > fubar > jbrowse2
view x/static/js/6837.a706c464.chunk.js.map @ 125:49f3d3878413 draft
planemo upload for repository https://github.com/galaxyproject/tools-iuc/tree/master/tools/jbrowse2 commit 5ea1f9c1eef1de76232e69aa6d34cda77d90d566
author | fubar |
---|---|
date | Sat, 05 Oct 2024 23:58:05 +0000 |
parents | |
children |
line wrap: on
line source
{"version":3,"file":"static/js/6837.a706c464.chunk.js","mappings":"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iB,QAAQjB,MAAMA,EAChB,CAGJ,OAAO4P,CACT,CAEA,iCAAMC,CACJL,EACAE,EACAC,GAEA,MAAMF,EAAY/P,KAAKiL,gBAAgBtC,IAAImH,GAC3C,IAAII,EAAcF,EAClB,GAAID,EACF,IAAK,MAAMtH,KAAYsH,EACrB,IACEG,QAAoBzH,EAASyH,EAAaD,EAC5C,CAAE,MAAO3P,GACPiB,QAAQjB,MAAMA,EAChB,CAGJ,OAAO4P,CACT,E,ifCznBF,SACE,OACA,kBACA,QACA,oBACA,YACA,aACA,mBACA,sBACA,0BACA,gBACA,oBACA,gBAEA,uBACA,2BACA,8BACA,qCACA,qCACA,0BACA,+BACA,iCACA,2BACA,gCACA,6BACA,0BACA,wBACA,gCACA,2BACA,gCACA,yBACA,gCACA,mCACA,gCACA,+BACA,8BACA,qCACA,6BACA,sCACA,yBACA,6BACA,8BACA,2BACA,kCACA,gCACA,kCACA,sCACA,4BACA,2BACA,wBACA,yBACA,gCACA,8BACA,gCACA,qCACA,mCACA,8BACA,yBACA,yBACA,yBACA,+BACA,0BACA,8BACA,+BACA,mCACA,yBACA,mCACA,yBACA,6BACA,mCACA,4CACA,iCACA,kCACA,iCACA,yBACA,6BACA,6BACA,0BACA,iCACA,kCACA,+BACA,mCACA,0BACA,4BACA,2BACA,2BACA,0BACA,+BACA,2BACA,sCACA,2BACA,6BACA,2BACA,6BACA,oCACA,8BACA,oCACA,kCACA,0BACA,yBACA,+BACA,kCACA,8BACA,6BACA,4BACA,4BACA,2BACA,wBACA,0BACA,8BACA,8BACA,mCACA,gCACA,8BACA,oCACA,6BACA,mCACA,yBACA,8BACA,qCACA,iCACA,sCACA,4BACA,4BACA,+BACA,0BACA,iCACA,iCACA,sBACA,2BACA,6BACA,uBACA,4BACA,yBACA,sBACA,oBACA,4BACA,uBACA,4BACA,qBACA,4BACA,+BACA,4BACA,2BACA,0BACA,iCACA,yBACA,kCACA,qBACA,yBACA,0BACA,uBACA,8BACA,4BACA,8BACA,kCACA,wBACA,uBACA,oBACA,qBACA,4BACA,0BACA,4BACA,iCACA,+BACA,0BACA,qBACA,qBACA,qBACA,2BACA,sBACA,0BACA,2BACA,+BACA,qBACA,+BACA,qBACA,yBACA,+BACA,wCACA,6BACA,8BACA,6BACA,qBACA,yBACA,yBACA,sBACA,6BACA,8BACA,2BACA,+BACA,sBACA,wBACA,uBACA,uBACA,sBACA,2BACA,uBACA,kCACA,uBACA,yBACA,uBACA,yBACA,gCACA,0BACA,gCACA,8BACA,sBACA,qBACA,2BACA,8BACA,0BACA,yBACA,wBACA,wBACA,uBACA,oBACA,sBACA,0BACA,0BACA,+BACA,4BACA,0BACA,gCACA,yBACA,+BACA,qBACA,0BACA,iCACA,6BACA,kCACA,wBACA,wBACA,2BACA,gCACA,qCACA,gCACA,yBACA,mBACA,uBACA,sCACA,+CACA,kDACA,kDACA,gDACA,iDAEA,6CACA,uEACA,0EACA,gEACA,oEACA,6DACA,8BACA,+BACA,mBACA,qBACA,2BACA,6BACA,4BACA,qCACA,wBACA,oCACA,0BACA,oDACA,2C,wNC3NF,MAAME,EAAU,CACdC,WAAWpI,EAAAA,EAAAA,OAAK,IAAM,0DACtBqI,kBAAkBrI,EAAAA,EAAAA,OAAK,IAAM,kCAC7BsI,kBAAkBtI,EAAAA,EAAAA,OAAK,IAAM,kCAC7BuI,OAAOvI,EAAAA,EAAAA,OAAK,IAAM,kCAClBwI,YAAYxI,EAAAA,EAAAA,OAAK,IAAM,kCACvByI,cAAczI,EAAAA,EAAAA,OAAK,IAAM,kCACzB0I,QAAQ1I,EAAAA,EAAAA,OAAK,IAAM,kCACnB2I,aAAa3I,EAAAA,EAAAA,OAAK,IAAM,kCACxB4I,UAAU5I,EAAAA,EAAAA,OAAK,IAAM,kCACrB6I,OAAO7I,EAAAA,EAAAA,OAAK,IAAM,kCAClB8I,KAAK9I,EAAAA,EAAAA,OAAK,IAAM,kCAChB+I,aAAa/I,EAAAA,EAAAA,OAAK,IAAM,iCACxBgJ,QAAQhJ,EAAAA,EAAAA,OAAK,IAAM,kCACnBiJ,aAAajJ,EAAAA,EAAAA,OAAK,IAAM,kCACx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","sources":["../../../packages/core/BaseFeatureWidget/configSchema.ts","../../../packages/core/BaseFeatureWidget/SequenceFeatureDetails/model.ts","../../../packages/core/BaseFeatureWidget/stateModelFactory.ts","../../../packages/core/Plugin.ts","../../../packages/core/rpc/methods/CoreGetRefNames.ts","../../../packages/core/rpc/methods/CoreGetFeatureDetails.ts","../../../packages/core/rpc/methods/CoreGetMetadata.ts","../../../packages/core/rpc/methods/CoreGetFileInfo.ts","../../../packages/core/rpc/methods/CoreGetFeatures.ts","../../../packages/core/rpc/methods/util.ts","../../../packages/core/rpc/methods/CoreRender.ts","../../../packages/core/rpc/methods/CoreFreeResources.ts","../../../packages/core/rpc/methods/CoreGetFeatureDensityStats.ts","../../../packages/core/data_adapters/CytobandAdapter/configSchema.ts","../../../packages/core/CorePlugin.ts","../../../packages/core/data_adapters/CytobandAdapter/index.ts","../../../packages/core/PluginManager.ts","../../../packages/core/ReExports/list.ts","../../../packages/core/ReExports/modules.tsx","../../../packages/core/TextSearch/BaseResults.ts","../../../packages/core/TextSearch/TextSearchManager.ts","../../../packages/core/configuration/configurationSlot.ts","../../../packages/core/configuration/configurationSchema.ts","../../../packages/core/configuration/util.ts","../../../packages/core/data_adapters/BaseAdapter/util.ts","../../../packages/core/data_adapters/BaseAdapter/BaseAdapter.ts","../../../packages/core/data_adapters/BaseAdapter/BaseFeatureDataAdapter.ts","../../../packages/core/data_adapters/BaseAdapter/BaseSequenceAdapter.ts","../../../packages/core/pluggableElementTypes/AdapterType.ts","../../../packages/core/pluggableElementTypes/AddTrackWorkflowType.ts","../../../packages/core/pluggableElementTypes/ConnectionType.ts","../../../packages/core/pluggableElementTypes/DisplayType.ts","../../../packages/core/pluggableElementTypes/InternetAccountType.ts","../../../packages/core/pluggableElementTypes/PluggableElementBase.ts","../../../packages/core/util/map-obj.ts","../../../packages/core/pluggableElementTypes/RpcMethodType.ts","../../../packages/core/pluggableElementTypes/TextSearchAdapterType.ts","../../../packages/core/pluggableElementTypes/TrackType.ts","../../../packages/core/pluggableElementTypes/ViewType.ts","../../../packages/core/pluggableElementTypes/WidgetType.ts","../../../packages/core/pluggableElementTypes/models/BaseViewModel.ts","../../../packages/core/pluggableElementTypes/models/baseConnectionConfig.ts","../../../packages/core/pluggableElementTypes/models/BaseConnectionModelFactory.ts","../../../packages/core/pluggableElementTypes/models/BaseDisplayModel.tsx","../../../packages/core/pluggableElementTypes/models/baseInternetAccountConfig.ts","../../../packages/core/pluggableElementTypes/models/InternetAccountModel.ts","../../../packages/core/pluggableElementTypes/models/BaseTrackModel.ts","../../../packages/core/pluggableElementTypes/models/baseTrackConfig.ts","../../../packages/core/pluggableElementTypes/renderers/BoxRendererType.ts","../../../packages/core/pluggableElementTypes/renderers/RpcRenderedSvgGroup.tsx","../../../packages/core/pluggableElementTypes/renderers/CircularChordRendererType.tsx","../../../packages/core/pluggableElementTypes/renderers/ComparativeServerSideRendererType.ts","../../../packages/core/pluggableElementTypes/renderers/FeatureRendererType.ts","../../../packages/core/pluggableElementTypes/renderers/RendererType.ts","../../../packages/core/pluggableElementTypes/renderers/ServerSideRenderedContent.tsx","../../../packages/core/pluggableElementTypes/renderers/ServerSideRendererType.tsx","../../../packages/core/pluggableElementTypes/renderers/util/serializableFilterChain.ts","../../../packages/core/ui/BaseTooltip.tsx","../../../packages/core/ui/CascadingMenuButton.tsx","../../../packages/core/ui/FatalErrorDialog.tsx","../../../packages/core/ui/FileSelector/LocalFileChooser.tsx","../../../packages/core/ui/FileSelector/UrlChooser.tsx","../../../packages/core/ui/LoadingEllipses.tsx","../../../packages/core/ui/RedErrorMessageBox.tsx","../../../packages/core/ui/colors.ts","../../../packages/core/util/Base1DUtils.ts","../../../packages/core/util/Base1DViewModel.ts","../../../packages/core/util/aborting.ts","../../../packages/core/util/blobToDataURL.ts","../../../packages/core/util/blockTypes.ts","../../../packages/core/util/calculateDynamicBlocks.ts","../../../packages/core/util/calculateStaticBlocks.ts","../../../packages/core/util/color/cssColorsLevel4.ts","../../../packages/core/util/color/index.ts","../../../packages/core/util/colord.ts","../../../packages/core/util/dedupe.ts","../../../packages/core/util/idMaker.ts","../../../packages/core/util/io/RemoteFileWithRangeCache.ts","../../../packages/core/util/io/index.ts","../../../packages/core/util/jexl.ts","../../../packages/core/util/jexlStrings.ts","../../../packages/core/util/layouts/GranularRectLayout.ts","../../../packages/core/util/layouts/MultiLayout.ts","../../../packages/core/util/layouts/PrecomputedLayout.ts","../../../packages/core/util/layouts/PrecomputedMultiLayout.js","../../../packages/core/util/layouts/SceneGraph.ts","../../../packages/core/util/mst-reflection.ts","../../../packages/core/util/nanoid.js","../../../packages/core/util/offscreenCanvasPonyfill.tsx","../../../packages/core/util/offscreenCanvasUtils.tsx","../../../packages/core/util/range.ts","../../../packages/core/util/rxjs.ts","../../../packages/core/util/simpleFeature.ts","../../../packages/core/util/stats.ts","../../../packages/core/util/types/index.ts","../../../packages/core/util/useMeasure.ts","../../../packages/core/util/when.ts","../../../plugins/alignments/src/MismatchParser/index.ts","../../../plugins/alignments/src/CramAdapter/configSchema.ts","../../../plugins/alignments/src/CramAdapter/index.ts","../../../plugins/alignments/src/BamAdapter/configSchema.ts","../../../plugins/alignments/src/BamAdapter/index.ts","../../../plugins/alignments/src/HtsgetBamAdapter/configSchema.ts","../../../plugins/alignments/src/HtsgetBamAdapter/index.ts","../../../plugins/alignments/src/SNPCoverageAdapter/configSchema.ts","../../../plugins/alignments/src/SNPCoverageAdapter/index.ts","../../../plugins/alignments/src/SNPCoverageRenderer/configSchema.ts","../../../plugins/alignments/src/SNPCoverageRenderer/SNPCoverageRenderer.ts","../../../plugins/alignments/src/SNPCoverageRenderer/index.ts","../../../plugins/alignments/src/PileupRenderer/PileupLayoutSession.ts","../../../plugins/alignments/src/PileupRenderer/PileupRenderer.ts","../../../plugins/alignments/src/PileupRenderer/layoutFeatures.ts","../../../plugins/alignments/src/PileupRenderer/sortUtil.ts","../../../plugins/alignments/src/PileupRenderer/layoutFeature.ts","../../../plugins/alignments/src/PileupRenderer/configSchema.ts","../../../plugins/alignments/src/PileupRenderer/components/PileupRendering.tsx","../../../plugins/alignments/src/PileupRenderer/index.ts","../../../plugins/alignments/src/LinearAlignmentsDisplay/models/util.ts","../../../plugins/alignments/src/LinearAlignmentsDisplay/models/model.tsx","../../../plugins/alignments/src/LinearAlignmentsDisplay/models/alignmentsModel.tsx","../../../plugins/alignments/src/LinearAlignmentsDisplay/components/AlignmentsDisplay.tsx","../../../plugins/alignments/src/LinearAlignmentsDisplay/index.ts","../../../plugins/alignments/src/LinearAlignmentsDisplay/models/configSchema.ts","../../../plugins/alignments/src/LinearSNPCoverageDisplay/models/model.ts","../../../plugins/alignments/src/LinearSNPCoverageDisplay/index.ts","../../../plugins/alignments/src/LinearSNPCoverageDisplay/models/configSchema.ts","../../../plugins/alignments/src/LinearReadArcsDisplay/model.ts","../../../plugins/alignments/src/LinearReadArcsDisplay/index.ts","../../../plugins/alignments/src/LinearReadArcsDisplay/configSchema.ts","../../../plugins/alignments/src/LinearReadCloudDisplay/configSchema.ts","../../../plugins/alignments/src/LinearReadCloudDisplay/model.ts","../../../plugins/alignments/src/LinearReadCloudDisplay/index.ts","../../../plugins/alignments/src/AlignmentsTrack/index.ts","../../../plugins/alignments/src/AlignmentsTrack/configSchemaF.ts","../../../plugins/alignments/src/AlignmentsFeatureDetail/configSchema.ts","../../../plugins/alignments/src/AlignmentsFeatureDetail/stateModelFactory.ts","../../../plugins/alignments/src/AlignmentsFeatureDetail/index.ts","../../../plugins/alignments/src/PileupRPC/base.ts","../../../plugins/alignments/src/PileupRPC/methods/GetReducedFeatures.ts","../../../plugins/alignments/src/PileupRPC/util.ts","../../../plugins/alignments/src/PileupRPC/methods/GetVisibleModifications.ts","../../../plugins/alignments/src/PileupRPC/methods/GetGlobalValueForTag.ts","../../../plugins/alignments/src/PileupRPC/index.ts","../../../plugins/alignments/src/GuessAlignmentsTypes/index.ts","../../../plugins/alignments/src/LinearPileupDisplay/configSchema.ts","../../../plugins/alignments/src/LinearPileupDisplay/components/LinearPileupDisplayBlurb.tsx","../../../plugins/alignments/src/LinearPileupDisplay/SharedLinearPileupDisplayMixin.ts","../../../plugins/alignments/src/LinearPileupDisplay/model.ts","../../../plugins/alignments/src/LinearPileupDisplay/index.ts","../../../plugins/alignments/src/index.ts","../../../plugins/alignments/src/shared/color.ts","../../../plugins/alignments/src/shared/index.ts","../../../plugins/alignments/src/util.ts","../../../plugins/breakpoint-split-view/src/BreakpointSplitView/util.ts","../../../plugins/circular-view/src/CircularView/models/viewportVisibleRegion.ts","../../../plugins/circular-view/src/CircularView/models/slices.ts","../../../plugins/circular-view/src/CircularView/models/model.ts","../../../plugins/circular-view/src/BaseChordDisplay/components/Loading.tsx","../../../plugins/circular-view/src/BaseChordDisplay/components/DisplayError.tsx","../../../plugins/circular-view/src/BaseChordDisplay/components/BaseChordDisplay.tsx","../../../plugins/circular-view/src/BaseChordDisplay/models/renderReaction.ts","../../../plugins/circular-view/src/BaseChordDisplay/models/configSchema.ts","../../../plugins/circular-view/src/BaseChordDisplay/models/model.tsx","../../../plugins/circular-view/src/index.ts","../../../plugins/circular-view/src/CircularView/index.ts","../../../plugins/circular-view/src/LaunchCircularView/index.ts","../../../plugins/config/src/ConfigurationEditorWidget/components/JsonEditor.tsx","../../../plugins/config/src/FromConfigAdapter/configSchema.ts","../../../plugins/config/src/FromConfigRegionsAdapter/configSchema.ts","../../../plugins/config/src/FromConfigSequenceAdapter/configSchema.ts","../../../plugins/config/src/RefNameAliasAdapter/configSchema.ts","../../../plugins/config/src/ConfigurationEditorWidget/model.ts","../../../plugins/config/src/ConfigurationEditorWidget/components/HeadingComponent.tsx","../../../plugins/config/src/ConfigurationEditorWidget/index.ts","../../../plugins/config/src/NcbiSequenceReportAliasAdapter/configSchema.ts","../../../plugins/config/src/index.ts","../../../plugins/config/src/FromConfigAdapter/index.ts","../../../plugins/config/src/FromConfigRegionsAdapter/index.ts","../../../plugins/config/src/FromConfigSequenceAdapter/index.ts","../../../plugins/config/src/RefNameAliasAdapter/index.ts","../../../plugins/config/src/NcbiSequenceReportAliasAdapter/index.ts","../../../plugins/data-management/src/AddConnectionWidget/model.ts","../../../plugins/data-management/src/AddConnectionWidget/index.ts","../../../plugins/data-management/src/AddTrackWidget/model.ts","../../../plugins/data-management/src/AddTrackWidget/index.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/components/faceted/util.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/util.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/filterTracks.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/generateHierarchy.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedUtil.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/facetedModel.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/model.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/configSchema.ts","../../../plugins/data-management/src/HierarchicalTrackSelectorWidget/index.ts","../../../plugins/data-management/src/PluginStoreWidget/model.ts","../../../plugins/data-management/src/PluginStoreWidget/index.ts","../../../plugins/data-management/src/ucsc-trackhub/configSchema.ts","../../../plugins/data-management/src/ucsc-trackhub/model.ts","../../../plugins/data-management/src/ucsc-trackhub/index.ts","../../../plugins/dotplot-view/src/DotplotView/components/util.ts","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/Block.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/BlockMsg.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/Tooltip.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/ServerSideRenderedBlockContent.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/serverSideRenderedBlock.ts","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/util.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Cytobands.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TrackLabelDragHandle.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TrackLabel.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TrackLabelContainer.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TrackRenderingContainer.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TrackContainer.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/hooks.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/components/VerticalGuide.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Rubberband.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarCoordinateTicks.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarCoordinateLabels.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/ScalebarRefNameLabels.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Scalebar.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Gridlines.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/CenterLine.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Highlight.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/TracksContainer.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/LinearGenomeView.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/OverviewScalebarPolygon.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/EndAdornment.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/AutocompleteTextField.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/index.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/RefNameAutocomplete/util.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/components/RubberbandSpan.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/util.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/consts.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGBackground.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGRegionSeparators.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTrackLabel.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGTracks.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGRuler.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGScalebar.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGHeader.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/SVGLinearGenomeView.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/svgcomponents/util.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/util.ts","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/configSchema.ts","../../../packages/core/util/compositeMap.ts","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/TrackHeightMixin.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/TooLargeMessage.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/FeatureDensityMixin.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/autorunFeatureDensityStats.ts","../../../plugins/linear-genome-view/src/BaseLinearDisplay/models/BaseLinearDisplayModel.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/LinearBlocks.tsx","../../../plugins/linear-genome-view/src/BaseLinearDisplay/components/BaseLinearDisplay.tsx","../../../plugins/linear-genome-view/src/LinearBareDisplay/configSchema.ts","../../../plugins/linear-genome-view/src/LinearBareDisplay/model.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/components/MiniControls.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/OverviewRubberband.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/OverviewHighlight.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/OverviewScalebarTickLabels.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/OverviewScalebar.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/ZoomControls.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/SearchBox.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/components/Header.tsx","../../../plugins/linear-genome-view/src/LinearGenomeView/model.ts","../../../plugins/linear-genome-view/src/LinearBasicDisplay/configSchema.ts","../../../plugins/linear-genome-view/src/LinearBasicDisplay/model.ts","../../../plugins/linear-genome-view/src/index.ts","../../../plugins/linear-genome-view/src/FeatureTrack/index.ts","../../../plugins/linear-genome-view/src/FeatureTrack/configSchema.ts","../../../plugins/linear-genome-view/src/BasicTrack/index.ts","../../../plugins/linear-genome-view/src/BasicTrack/configSchema.ts","../../../plugins/linear-genome-view/src/LinearBasicDisplay/index.ts","../../../plugins/linear-genome-view/src/LinearGenomeView/index.ts","../../../plugins/linear-genome-view/src/LinearBareDisplay/index.ts","../../../plugins/linear-genome-view/src/LaunchLinearGenomeView/index.ts","../../../plugins/linear-genome-view/src/searchUtils.ts","../../../plugins/variants/src/VcfFeature/util.ts","../../../plugins/variants/src/VcfFeature/index.ts","../../../plugins/variants/src/VcfAdapter/configSchema.ts","../../../plugins/variants/src/VcfTabixAdapter/configSchema.ts","../../../plugins/variants/src/LinearVariantDisplay/model.ts","../../../plugins/variants/src/StructuralVariantChordRenderer/configSchema.ts","../../../plugins/variants/src/StructuralVariantChordRenderer/Chord.tsx","../../../plugins/variants/src/StructuralVariantChordRenderer/ReactComponent.tsx","../../../plugins/variants/src/VariantFeatureWidget/stateModelFactory.ts","../../../plugins/variants/src/VariantFeatureWidget/configSchema.ts","../../../plugins/variants/src/index.ts","../../../plugins/variants/src/VariantTrack/index.ts","../../../plugins/variants/src/VcfAdapter/index.ts","../../../plugins/variants/src/VcfTabixAdapter/index.ts","../../../plugins/variants/src/VariantFeatureWidget/index.ts","../../../plugins/variants/src/VariantTrack/configSchema.ts","../../../plugins/variants/src/extensionPoints.ts","../../../plugins/variants/src/LinearVariantDisplay/index.ts","../../../plugins/variants/src/LinearVariantDisplay/configSchema.ts","../../../plugins/variants/src/StructuralVariantChordRenderer/index.ts","../../../plugins/variants/src/ChordVariantDisplay/index.ts","../../../plugins/variants/src/ChordVariantDisplay/models/configSchema.ts","../../../plugins/variants/src/ChordVariantDisplay/models/stateModelFactory.ts","../../../plugins/wiggle/src/LinearWiggleDisplay/components/Tooltip.tsx","../../../plugins/wiggle/src/LinearWiggleDisplay/components/WiggleDisplayComponent.tsx","../../../plugins/wiggle/src/Tooltip.tsx","../../../plugins/wiggle/src/WiggleBaseRenderer.tsx","../../../plugins/wiggle/src/BigWigAdapter/configSchema.ts","../../../plugins/wiggle/src/QuantitativeTrack/configSchema.ts","../../../plugins/wiggle/src/MultiWiggleAdapter/configSchema.ts","../../../plugins/wiggle/src/configSchema.ts","../../../plugins/wiggle/src/DensityRenderer/configSchema.ts","../../../plugins/wiggle/src/drawDensity.ts","../../../plugins/wiggle/src/DensityRenderer/DensityRenderer.ts","../../../plugins/wiggle/src/WiggleRendering.tsx","../../../plugins/wiggle/src/drawXY.ts","../../../plugins/wiggle/src/XYPlotRenderer/XYPlotRenderer.ts","../../../plugins/wiggle/src/XYPlotRenderer/configSchema.ts","../../../plugins/wiggle/src/LinePlotRenderer/configSchema.ts","../../../plugins/wiggle/src/drawLine.ts","../../../plugins/wiggle/src/LinePlotRenderer/LinePlotRenderer.ts","../../../plugins/wiggle/src/shared/configShared.ts","../../../plugins/wiggle/src/shared/modelShared.ts","../../../plugins/wiggle/src/LinearWiggleDisplay/models/model.ts","../../../plugins/wiggle/src/MultiLinearWiggleDisplay/models/model.ts","../../../plugins/wiggle/src/MultiWiggleRendering.tsx","../../../plugins/wiggle/src/MultiXYPlotRenderer/MultiXYPlotRenderer.ts","../../../plugins/wiggle/src/MultiXYPlotRenderer/configSchema.ts","../../../plugins/wiggle/src/MultiRowXYPlotRenderer/MultiRowXYPlotRenderer.ts","../../../plugins/wiggle/src/MultiRowXYPlotRenderer/configSchema.ts","../../../plugins/wiggle/src/MultiDensityRenderer/configSchema.ts","../../../plugins/wiggle/src/MultiDensityRenderer/MultiDensityRenderer.ts","../../../plugins/wiggle/src/MultiLineRenderer/MultiLineRenderer.ts","../../../plugins/wiggle/src/MultiLineRenderer/configSchema.ts","../../../plugins/wiggle/src/MultiRowLineRenderer/MultiRowLineRenderer.ts","../../../plugins/wiggle/src/MultiRowLineRenderer/configSchema.ts","../../../plugins/wiggle/src/CreateMultiWiggleExtension/index.ts","../../../plugins/wiggle/src/WiggleRPC/MultiWiggleGetSources.ts","../../../plugins/wiggle/src/WiggleRPC/WiggleGetMultiRegionQuantitativeStats.ts","../../../plugins/wiggle/src/WiggleRPC/WiggleGetGlobalQuantitativeStats.ts","../../../plugins/wiggle/src/index.ts","../../../plugins/wiggle/src/MultiWiggleAdapter/index.ts","../../../plugins/wiggle/src/BigWigAdapter/index.ts","../../../plugins/wiggle/src/QuantitativeTrack/index.ts","../../../plugins/wiggle/src/MultiQuantitativeTrack/index.ts","../../../plugins/wiggle/src/MultiQuantitativeTrack/configSchema.ts","../../../plugins/wiggle/src/LinearWiggleDisplay/index.ts","../../../plugins/wiggle/src/LinearWiggleDisplay/models/configSchema.ts","../../../plugins/wiggle/src/MultiLinearWiggleDisplay/index.ts","../../../plugins/wiggle/src/MultiLinearWiggleDisplay/models/configSchema.ts","../../../plugins/wiggle/src/LinePlotRenderer/index.ts","../../../plugins/wiggle/src/XYPlotRenderer/index.ts","../../../plugins/wiggle/src/DensityRenderer/index.ts","../../../plugins/wiggle/src/MultiXYPlotRenderer/index.ts","../../../plugins/wiggle/src/MultiRowXYPlotRenderer/index.ts","../../../plugins/wiggle/src/MultiDensityRenderer/index.ts","../../../plugins/wiggle/src/MultiLineRenderer/index.ts","../../../plugins/wiggle/src/MultiRowLineRenderer/index.ts","../../../plugins/wiggle/src/MultiWiggleAddTrackWorkflow/index.ts","../../../plugins/wiggle/src/shared/YScaleBar.tsx","../../../plugins/wiggle/src/util.ts","../../../plugins/authentication/src/OAuthModel/configSchema.ts","../../../plugins/authentication/src/OAuthModel/util.ts","../../../plugins/authentication/src/util.ts","../../../plugins/authentication/src/OAuthModel/model.tsx","../../../plugins/authentication/src/ExternalTokenModel/configSchema.ts","../../../plugins/authentication/src/ExternalTokenModel/ExternalTokenEntryForm.tsx","../../../plugins/authentication/src/ExternalTokenModel/model.tsx","../../../plugins/authentication/src/HTTPBasicModel/configSchema.ts","../../../plugins/authentication/src/HTTPBasicModel/HTTPBasicLoginForm.tsx","../../../plugins/authentication/src/HTTPBasicModel/model.tsx","../../../plugins/authentication/src/DropboxOAuthModel/configSchema.ts","../../../plugins/authentication/src/DropboxOAuthModel/util.ts","../../../plugins/authentication/src/DropboxOAuthModel/DropboxIcon.tsx","../../../plugins/authentication/src/DropboxOAuthModel/model.tsx","../../../plugins/authentication/src/GoogleDriveOAuthModel/configSchema.ts","../../../plugins/authentication/src/GoogleDriveOAuthModel/util.ts","../../../plugins/authentication/src/GoogleDriveOAuthModel/GoogleDriveFilehandle.ts","../../../plugins/authentication/src/GoogleDriveOAuthModel/GoogleDriveIcon.tsx","../../../plugins/authentication/src/GoogleDriveOAuthModel/model.tsx","../../../plugins/authentication/src/index.ts","../../../plugins/bed/src/BigBedAdapter/configSchema.ts","../../../plugins/bed/src/BedpeAdapter/configSchema.ts","../../../plugins/bed/src/BedTabixAdapter/configSchema.ts","../../../plugins/bed/src/BedAdapter/configSchema.ts","../../../plugins/bed/src/index.ts","../../../plugins/bed/src/BigBedAdapter/index.ts","../../../plugins/bed/src/BedAdapter/index.ts","../../../plugins/bed/src/BedpeAdapter/index.ts","../../../plugins/bed/src/BedTabixAdapter/index.ts","../../../plugins/breakpoint-split-view/src/BreakpointAlignmentsFeatureDetail/index.ts","../../../plugins/breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView.ts","../../../plugins/breakpoint-split-view/src/BreakpointSplitView/model.ts","../../../plugins/breakpoint-split-view/src/index.ts","../../../plugins/breakpoint-split-view/src/BreakpointSplitView/index.ts","../../../plugins/comparative-adapters/src/PAFAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/PairwiseIndexedPAFAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/MCScanAnchorsAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/MashMapAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/DeltaAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/ChainAdapter/configSchema.ts","../../../plugins/comparative-adapters/src/index.ts","../../../plugins/comparative-adapters/src/PAFAdapter/index.ts","../../../plugins/comparative-adapters/src/PairwiseIndexedPAFAdapter/index.ts","../../../plugins/comparative-adapters/src/DeltaAdapter/index.ts","../../../plugins/comparative-adapters/src/ChainAdapter/index.ts","../../../plugins/comparative-adapters/src/MCScanAnchorsAdapter/index.ts","../../../plugins/comparative-adapters/src/MCScanSimpleAnchorsAdapter/index.ts","../../../plugins/comparative-adapters/src/MashMapAdapter/index.ts","../../../plugins/dotplot-view/src/DotplotView/1dview.ts","../../../plugins/dotplot-view/src/DotplotView/model.ts","../../../plugins/dotplot-view/src/ServerSideRenderedBlockContent.tsx","../../../plugins/dotplot-view/src/DotplotDisplay/renderDotplotBlock.ts","../../../plugins/dotplot-view/src/DotplotDisplay/stateModelFactory.tsx","../../../plugins/dotplot-view/src/DotplotDisplay/components/DotplotDisplay.tsx","../../../plugins/dotplot-view/src/DotplotRenderer/components/DotplotRendering.tsx","../../../plugins/dotplot-view/src/DotplotRenderer/DotplotRenderer.ts","../../../plugins/dotplot-view/src/DotplotRenderer/configSchema.ts","../../../plugins/dotplot-view/src/ComparativeRenderer/index.ts","../../../plugins/dotplot-view/src/DotplotReadVsRef/DotplotReadVsRef.ts","../../../plugins/dotplot-view/src/index.ts","../../../plugins/dotplot-view/src/DotplotDisplay/index.ts","../../../plugins/dotplot-view/src/DotplotView/index.ts","../../../plugins/dotplot-view/src/DotplotRenderer/index.ts","../../../plugins/dotplot-view/src/LaunchDotplotView.ts","../../../plugins/dotplot-view/src/DotplotReadVsRef/index.ts","../../../plugins/gtf/src/GtfAdapter/configSchema.ts","../../../plugins/gtf/src/index.ts","../../../plugins/gff3/src/Gff3TabixAdapter/configSchema.ts","../../../plugins/gff3/src/Gff3Adapter/configSchema.ts","../../../plugins/gff3/src/index.ts","../../../plugins/gff3/src/Gff3TabixAdapter/index.ts","../../../plugins/gff3/src/Gff3Adapter/index.ts","../../../plugins/gff3/src/GuessGff3/index.ts","../../../plugins/jobs-management/src/JobsListWidget/jobModel.ts","../../../plugins/jobs-management/src/JobsListWidget/index.ts","../../../plugins/jobs-management/src/index.ts","../../../plugins/jobs-management/src/JobsListWidget/model.ts","../../../plugins/legacy-jbrowse/src/NCListAdapter/configSchema.ts","../../../plugins/legacy-jbrowse/src/JBrowse1TextSearchAdapter/configSchema.ts","../../../plugins/legacy-jbrowse/src/JBrowse1Connection/configSchema.ts","../../../plugins/legacy-jbrowse/src/JBrowse1Connection/model.ts","../../../plugins/legacy-jbrowse/src/index.ts","../../../plugins/legacy-jbrowse/src/NCListAdapter/index.ts","../../../plugins/legacy-jbrowse/src/GuessNCList/index.ts","../../../plugins/legacy-jbrowse/src/JBrowse1TextSearchAdapter/index.ts","../../../plugins/legacy-jbrowse/src/JBrowse1Connection/index.ts","../../../plugins/linear-comparative-view/src/LinearComparativeDisplay/configSchemaF.ts","../../../plugins/linear-comparative-view/src/LinearComparativeDisplay/stateModelFactory.ts","../../../plugins/linear-comparative-view/src/LinearComparativeView/model.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/model.ts","../../../plugins/linear-comparative-view/src/LGVSyntenyDisplay/model.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyView/components/Icons.tsx","../../../plugins/linear-comparative-view/src/LinearSyntenyView/model.ts","../../../plugins/linear-comparative-view/src/LaunchLinearSyntenyView.ts","../../../plugins/linear-comparative-view/src/SyntenyTrack/configSchema.ts","../../../plugins/linear-comparative-view/src/LinearReadVsRef/index.ts","../../../plugins/linear-comparative-view/src/index.tsx","../../../plugins/linear-comparative-view/src/LinearComparativeView/index.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyView/index.ts","../../../plugins/linear-comparative-view/src/LinearComparativeDisplay/index.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/index.ts","../../../plugins/linear-comparative-view/src/LinearSyntenyDisplay/configSchemaF.ts","../../../plugins/linear-comparative-view/src/LGVSyntenyDisplay/index.ts","../../../plugins/linear-comparative-view/src/LGVSyntenyDisplay/configSchemaF.ts","../../../plugins/linear-comparative-view/src/SyntenyTrack/index.tsx","../../../plugins/lollipop/src/LinearLollipopDisplay/model.ts","../../../plugins/lollipop/src/LollipopRenderer/Layout.ts","../../../plugins/lollipop/src/LollipopRenderer/LollipopRenderer.js","../../../plugins/lollipop/src/LollipopRenderer/configSchema.ts","../../../plugins/lollipop/src/index.ts","../../../plugins/lollipop/src/LollipopRenderer/index.ts","../../../plugins/lollipop/src/LinearLollipopDisplay/index.ts","../../../plugins/lollipop/src/LinearLollipopDisplay/configSchema.ts","../../../plugins/arc/src/LinearArcDisplay/model.ts","../../../plugins/arc/src/LinearPairedArcDisplay/model.ts","../../../plugins/arc/src/ArcRenderer/ArcRendering.tsx","../../../plugins/arc/src/ArcRenderer/configSchema.ts","../../../plugins/arc/src/ArcRenderer/ArcRenderer.ts","../../../plugins/arc/src/index.ts","../../../plugins/arc/src/ArcRenderer/index.ts","../../../plugins/arc/src/LinearArcDisplay/index.ts","../../../plugins/arc/src/LinearArcDisplay/configSchema.ts","../../../plugins/arc/src/LinearPairedArcDisplay/index.ts","../../../plugins/arc/src/LinearPairedArcDisplay/configSchema.ts","../../../plugins/menus/src/AboutWidget/index.ts","../../../plugins/menus/src/HelpWidget/index.ts","../../../plugins/menus/src/ImportSessionWidget/index.ts","../../../plugins/menus/src/SessionManager/index.ts","../../../plugins/menus/src/index.ts","../../../plugins/rdf/src/SPARQLAdapter/SPARQLAdapter.ts","../../../plugins/rdf/src/SPARQLAdapter/configSchema.ts","../../../plugins/rdf/src/index.ts","../../../plugins/sequence/src/TwoBitAdapter/configSchema.ts","../../../plugins/sequence/src/DivSequenceRenderer/components/DivSequenceRendering.tsx","../../../plugins/sequence/src/DivSequenceRenderer/configSchema.ts","../../../plugins/sequence/src/DivSequenceRenderer/index.ts","../../../plugins/sequence/src/BgzipFastaAdapter/configSchema.ts","../../../plugins/sequence/src/ChromSizesAdapter/configSchema.ts","../../../plugins/sequence/src/IndexedFastaAdapter/configSchema.ts","../../../plugins/sequence/src/UnindexedFastaAdapter/configSchema.ts","../../../plugins/sequence/src/SequenceSearchAdapter/configSchema.ts","../../../plugins/sequence/src/LinearReferenceSequenceDisplay/configSchema.ts","../../../plugins/sequence/src/index.ts","../../../plugins/sequence/src/TwoBitAdapter/index.ts","../../../plugins/sequence/src/BgzipFastaAdapter/index.ts","../../../plugins/sequence/src/ChromSizesAdapter/index.ts","../../../plugins/sequence/src/IndexedFastaAdapter/index.ts","../../../plugins/sequence/src/UnindexedFastaAdapter/index.ts","../../../plugins/sequence/src/SequenceSearchAdapter/index.ts","../../../plugins/sequence/src/ReferenceSequenceTrack/index.ts","../../../plugins/sequence/src/ReferenceSequenceTrack/configSchema.ts","../../../plugins/sequence/src/LinearReferenceSequenceDisplay/index.ts","../../../plugins/sequence/src/LinearReferenceSequenceDisplay/model.ts","../../../plugins/sequence/src/createExtensionPoints.ts","../../../plugins/svg/src/SvgFeatureRenderer/components/FeatureLabel.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/FeatureGlyph.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/SvgOverlay.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/Arrow.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/Box.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/Segments.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/ProcessedTranscript.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/Subfeatures.tsx","../../../plugins/svg/src/SvgFeatureRenderer/components/util.ts","../../../plugins/svg/src/SvgFeatureRenderer/components/SvgFeatureRendering.tsx","../../../plugins/svg/src/SvgFeatureRenderer/configSchema.ts","../../../plugins/svg/src/index.ts","../../../plugins/gccontent/src/GCContentAdapter/configSchema.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/shared.ts","../../../plugins/gccontent/src/index.ts","../../../plugins/gccontent/src/GCContentTrack/index.ts","../../../plugins/gccontent/src/GCContentAdapter/index.ts","../../../plugins/gccontent/src/GCContentTrack/configSchema.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/index.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/config1.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/stateModel1.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/config2.ts","../../../plugins/gccontent/src/LinearGCContentDisplay/stateModel2.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/MakeSpreadsheetColumnType.tsx","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocString.tsx","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Text.tsx","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocRef.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/Number.tsx","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/index.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocStart.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ColumnDataTypes/LocEnd.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/Row.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/StaticRowSet.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/Spreadsheet.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/ImportWizard.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/FilterControls.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/models/SpreadsheetView.ts","../../../plugins/spreadsheet-view/src/index.ts","../../../plugins/spreadsheet-view/src/SpreadsheetView/index.ts","../../../plugins/spreadsheet-view/src/LaunchSpreadsheetView/index.ts","../../../plugins/sv-inspector/src/SvInspectorView/components/CircularViewOptions.tsx","../../../plugins/sv-inspector/src/SvInspectorView/components/SvInspectorView.tsx","../../../plugins/sv-inspector/src/SvInspectorView/models/adhocFeatureUtils.ts","../../../plugins/sv-inspector/src/SvInspectorView/models/breakpointSplitViewFromTableRow.ts","../../../plugins/sv-inspector/src/SvInspectorView/index.ts","../../../plugins/sv-inspector/src/index.ts","../../../plugins/sv-inspector/src/SvInspectorView/models/SvInspectorView.ts","../../../plugins/sv-inspector/src/LaunchSvInspectorView/index.ts","../../../plugins/hic/src/HicRenderer/components/HicRendering.tsx","../../../plugins/hic/src/HicRenderer/configSchema.ts","../../../plugins/hic/src/HicRenderer/HicRenderer.tsx","../../../plugins/hic/src/LinearHicDisplay/model.ts","../../../plugins/hic/src/HicAdapter/configSchema.ts","../../../plugins/hic/src/index.ts","../../../plugins/hic/src/HicAdapter/index.ts","../../../plugins/hic/src/HicRenderer/index.ts","../../../plugins/hic/src/HicTrack/index.ts","../../../plugins/hic/src/HicTrack/configSchema.ts","../../../plugins/hic/src/LinearHicDisplay/index.ts","../../../plugins/hic/src/LinearHicDisplay/configSchema.ts","../../../plugins/trix/src/TrixTextSearchAdapter/configSchema.ts","../../../plugins/trix/src/index.ts","../../../plugins/grid-bookmark/src/GridBookmarkWidget/model.ts","../../../plugins/grid-bookmark/src/GridBookmarkWidget/components/Highlight/Highlight.tsx","../../../plugins/grid-bookmark/src/GridBookmarkWidget/components/Highlight/OverviewHighlight.tsx","../../../plugins/grid-bookmark/src/GridBookmarkWidget/index.ts","../../../plugins/grid-bookmark/src/index.ts","../../../plugins/grid-bookmark/src/GridBookmarkWidget/components/Highlight/index.tsx","corePlugins.ts"],"sourcesContent":["import { ConfigurationSchema } from '../configuration'\n\nconst configSchema = ConfigurationSchema('BaseFeatureWidget', {})\nexport { configSchema }\n","import { types, addDisposer, Instance } from 'mobx-state-tree'\nimport { autorun } from 'mobx'\n\n// locals\nimport {\n SimpleFeatureSerialized,\n localStorageGetItem,\n localStorageSetItem,\n} from '../../util'\n\nfunction localStorageGetNumber(key: string, defaultVal: number) {\n return +(localStorageGetItem(key) ?? defaultVal)\n}\n\nexport function SequenceFeatureDetailsF() {\n return types\n .model('SequenceFeatureDetails')\n .volatile(() => ({\n showCoordinatesSetting:\n localStorageGetItem('sequenceFeatureDetails-showCoordinatesSetting') ||\n 'none',\n intronBp: localStorageGetNumber('sequenceFeatureDetails-intronBp', 10),\n upDownBp: localStorageGetNumber('sequenceFeatureDetails-upDownBp', 100),\n upperCaseCDS: Boolean(\n JSON.parse(\n localStorageGetItem('sequenceFeatureDetails-upperCaseCDS') || 'true',\n ),\n ),\n charactersPerRow: 100,\n feature: undefined as SimpleFeatureSerialized | undefined,\n mode: '',\n }))\n .actions(self => ({\n /**\n * #action\n */\n setFeature(f: SimpleFeatureSerialized) {\n self.feature = f\n },\n /**\n * #action\n */\n setUpDownBp(f: number) {\n self.upDownBp = f\n },\n /**\n * #action\n */\n setIntronBp(f: number) {\n self.intronBp = f\n },\n /**\n * #action\n */\n setUpperCaseCDS(f: boolean) {\n self.upperCaseCDS = f\n },\n /**\n * #action\n */\n setShowCoordinates(f: 'none' | 'relative' | 'genomic') {\n self.showCoordinatesSetting = f\n },\n /**\n * #action\n */\n setMode(mode: string) {\n self.mode = mode\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get showCoordinates() {\n return self.showCoordinatesSetting !== 'none'\n },\n /**\n * #getter\n */\n get showGenomicCoordsOption() {\n return (\n self.mode === 'gene' ||\n self.mode === 'gene_updownstream' ||\n self.mode === 'genomic' ||\n self.mode === 'genomic_sequence_updownstream'\n )\n },\n /**\n * #getter\n */\n get hasCDS() {\n return self.feature?.subfeatures?.some(sub => sub.type === 'CDS')\n },\n /**\n * #getter\n */\n get hasExon() {\n return self.feature?.subfeatures?.some(sub => sub.type === 'exon')\n },\n /**\n * #getter\n */\n get hasExonOrCDS() {\n return this.hasExon || this.hasCDS\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n localStorageSetItem(\n 'sequenceFeatureDetails-upDownBp',\n JSON.stringify(self.upDownBp),\n )\n localStorageSetItem(\n 'sequenceFeatureDetails-intronBp',\n JSON.stringify(self.intronBp),\n )\n localStorageSetItem(\n 'sequenceFeatureDetails-upperCaseCDS',\n JSON.stringify(self.upperCaseCDS),\n )\n localStorageSetItem(\n 'sequenceFeatureDetails-showCoordinatesSetting',\n self.showCoordinatesSetting,\n )\n }),\n )\n addDisposer(\n self,\n autorun(() => {\n self.setMode(\n self.hasCDS ? 'cds' : self.hasExon ? 'cdna' : 'genomic',\n )\n }),\n )\n },\n }))\n}\n\nexport type SequenceFeatureDetailsStateModel = ReturnType<\n typeof SequenceFeatureDetailsF\n>\nexport type SequenceFeatureDetailsModel =\n Instance<SequenceFeatureDetailsStateModel>\n","import { types, addDisposer, Instance } from 'mobx-state-tree'\nimport { autorun } from 'mobx'\nimport clone from 'clone'\n\n// locals\nimport PluginManager from '../PluginManager'\nimport { getConf } from '../configuration'\nimport { getSession } from '../util'\nimport { ElementId } from '../util/types/mst'\nimport { SequenceFeatureDetailsF } from './SequenceFeatureDetails/model'\n\ninterface Feat {\n subfeatures?: Record<string, unknown>[]\n}\n\nfunction formatSubfeatures(\n obj: Feat,\n depth: number,\n parse: (obj: Record<string, unknown>) => void,\n currentDepth = 0,\n returnObj = {} as Record<string, unknown>,\n) {\n if (depth <= currentDepth) {\n return\n }\n obj.subfeatures?.map(sub => {\n formatSubfeatures(sub, depth, parse, currentDepth + 1, returnObj)\n parse(sub)\n })\n}\n\n/**\n * #stateModel BaseFeatureWidget\n * displays data about features, allowing configuration callbacks to modify the\n * contents of what is displayed\n *\n * see: formatDetails-\\>feature,formatDetails-\\>subfeatures\n */\nexport function stateModelFactory(pluginManager: PluginManager) {\n return types\n .model('BaseFeatureWidget', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('BaseFeatureWidget'),\n /**\n * #property\n */\n featureData: types.frozen(),\n /**\n * #property\n */\n formattedFields: types.frozen(),\n /**\n * #property\n */\n unformattedFeatureData: types.frozen(),\n /**\n * #property\n */\n view: types.safeReference(\n pluginManager.pluggableMstType('view', 'stateModel'),\n ),\n /**\n * #property\n */\n track: types.safeReference(\n pluginManager.pluggableMstType('track', 'stateModel'),\n ),\n /**\n * #property\n */\n trackId: types.maybe(types.string),\n /**\n * #property\n */\n trackType: types.maybe(types.string),\n /**\n * #property\n */\n maxDepth: types.maybe(types.number),\n\n /**\n * #property\n */\n sequenceFeatureDetails: types.optional(SequenceFeatureDetailsF(), {}),\n })\n .volatile(() => ({\n error: undefined as unknown,\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n setFeatureData(featureData: Record<string, unknown>) {\n self.unformattedFeatureData = featureData\n },\n /**\n * #action\n */\n clearFeatureData() {\n self.featureData = undefined\n },\n /**\n * #action\n */\n setFormattedData(feat: Record<string, unknown>) {\n self.featureData = feat\n },\n /**\n * #action\n */\n setExtra(type?: string, trackId?: string, maxDepth?: number) {\n self.trackId = trackId\n self.trackType = type\n self.maxDepth = maxDepth\n },\n /**\n * #action\n */\n setError(e: unknown) {\n self.error = e\n },\n }))\n .actions(self => ({\n afterCreate() {\n addDisposer(\n self,\n autorun(() => {\n try {\n const { unformattedFeatureData, track } = self\n const session = getSession(self)\n if (track) {\n self.setExtra(\n track.type,\n track.configuration.trackId,\n getConf(track, ['formatDetails', 'maxDepth']),\n )\n }\n if (unformattedFeatureData) {\n const feature = clone(unformattedFeatureData)\n\n const combine = (\n arg2: string,\n feature: Record<string, unknown>,\n ) => ({\n ...getConf(session, ['formatDetails', arg2], { feature }),\n ...getConf(track, ['formatDetails', arg2], { feature }),\n })\n\n if (track) {\n feature.__jbrowsefmt = combine('feature', feature)\n\n formatSubfeatures(\n feature,\n getConf(track, ['formatDetails', 'depth']),\n sub => {\n sub.__jbrowsefmt = combine('subfeatures', sub)\n },\n )\n }\n\n self.setFormattedData(feature)\n }\n } catch (e) {\n console.error(e)\n self.setError(e)\n }\n }),\n )\n },\n }))\n .preProcessSnapshot(snap => {\n // @ts-expect-error\n const { featureData, finalizedFeatureData, ...rest } = snap\n return {\n unformattedFeatureData: featureData,\n featureData: finalizedFeatureData,\n ...rest,\n }\n })\n .postProcessSnapshot(snap => {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n const { unformattedFeatureData, featureData, ...rest } = snap as Omit<\n typeof snap,\n symbol\n >\n // finalizedFeatureData avoids running formatter twice if loading from\n // snapshot\n return {\n // replacing undefined with null helps with allowing fields to be\n // hidden, setting null is not allowed by jexl so we set it to\n // undefined to hide. see config guide. this replacement happens both\n // here and when displaying the featureData in base feature widget\n finalizedFeatureData: JSON.parse(\n JSON.stringify(featureData, (_, v) => (v === undefined ? null : v)),\n ),\n ...rest,\n }\n })\n}\n\nexport type BaseFeatureWidgetStateModel = ReturnType<typeof stateModelFactory>\nexport type BaseFeatureWidgetModel = Instance<BaseFeatureWidgetStateModel>\n","import PluginManager from './PluginManager'\nimport { AnyConfigurationSchemaType } from './configuration'\n\n/**\n * base class for a JBrowse plugin\n */\nexport default abstract class Plugin {\n abstract name: string\n\n url?: string\n\n version?: string\n\n install(_pluginManager: PluginManager): void {}\n\n configure(_pluginManager: PluginManager): void {}\n\n configurationSchema?: AnyConfigurationSchemaType\n}\n\nexport type PluginConstructor = new (...args: unknown[]) => Plugin\n","import { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\n\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\n\nexport default class CoreGetRefNames extends RpcMethodType {\n name = 'CoreGetRefNames'\n\n async execute(\n args: {\n sessionId: string\n signal: RemoteAbortSignal\n adapterConfig: Record<string, unknown>\n },\n rpcDriver: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n const { sessionId, adapterConfig } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n\n if (isFeatureAdapter(dataAdapter)) {\n return dataAdapter.getRefNames(deserializedArgs)\n }\n return []\n }\n}\n","import RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\nimport { RenderArgs } from './util'\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { renameRegionsIfNeeded, getLayoutId } from '../../util'\nimport { RenderArgsSerialized } from './util'\n\n/**\n * fetches features from an adapter and call a renderer with them\n */\nexport default class CoreGetFeatureDetails extends RpcMethodType {\n name = 'CoreGetFeatureDetails'\n\n async serializeArguments(args: RenderArgs, rpcDriver: string) {\n const { rootModel } = this.pluginManager\n const assemblyManager = rootModel!.session!.assemblyManager\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, args)\n const superArgs = (await super.serializeArguments(\n renamedArgs,\n rpcDriver,\n )) as RenderArgs\n if (rpcDriver === 'MainThreadRpcDriver') {\n return superArgs\n }\n const { rendererType } = args\n const RendererType = this.pluginManager.getRendererType(rendererType)!\n // @ts-expect-error\n return RendererType.serializeArgsInClient(superArgs)\n }\n\n async execute(\n args: RenderArgsSerialized & { signal?: RemoteAbortSignal },\n rpcDriver: string,\n ) {\n let deserializedArgs = args\n if (rpcDriver !== 'MainThreadRpcDriver') {\n deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n }\n const { rendererType, featureId } = deserializedArgs\n const RendererType = this.pluginManager.getRendererType(rendererType)!\n\n return {\n // @ts-expect-error\n feature: RendererType.sessions[getLayoutId(args)]?.cachedLayout.layout\n .getDataByID(featureId)\n ?.toJSON(),\n }\n }\n}\n","import { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\n\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\n\nexport default class CoreGetMetadata extends RpcMethodType {\n name = 'CoreGetMetadata'\n\n async execute(\n args: {\n sessionId: string\n signal: RemoteAbortSignal\n adapterConfig: Record<string, unknown>\n },\n rpcDriver: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n const { sessionId, adapterConfig } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n return isFeatureAdapter(dataAdapter)\n ? dataAdapter.getMetadata(deserializedArgs)\n : null\n }\n}\n","import { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\n\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\n\nexport default class CoreGetFileInfo extends RpcMethodType {\n name = 'CoreGetInfo'\n\n async execute(\n args: {\n sessionId: string\n signal: RemoteAbortSignal\n adapterConfig: Record<string, unknown>\n },\n rpcDriver: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n const { sessionId, adapterConfig } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n return isFeatureAdapter(dataAdapter)\n ? dataAdapter.getHeader(deserializedArgs)\n : null\n }\n}\n","import { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\n\n// locals\nimport { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\nimport { RenderArgs } from './util'\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\nimport { renameRegionsIfNeeded, Region } from '../../util'\nimport SimpleFeature, {\n SimpleFeatureSerialized,\n} from '../../util/simpleFeature'\n\nexport default class CoreGetFeatures extends RpcMethodType {\n name = 'CoreGetFeatures'\n\n async deserializeReturn(\n feats: SimpleFeatureSerialized[],\n args: unknown,\n rpcDriver: string,\n ) {\n const superDeserialized = (await super.deserializeReturn(\n feats,\n args,\n rpcDriver,\n )) as SimpleFeatureSerialized[]\n return superDeserialized.map(feat => new SimpleFeature(feat))\n }\n\n async serializeArguments(args: RenderArgs, rpcDriver: string) {\n const { rootModel } = this.pluginManager\n const assemblyManager = rootModel!.session!.assemblyManager\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, args)\n return super.serializeArguments(\n renamedArgs,\n rpcDriver,\n ) as Promise<RenderArgs>\n }\n\n async execute(\n args: {\n sessionId: string\n regions: Region[]\n adapterConfig: Record<string, unknown>\n signal?: RemoteAbortSignal\n\n opts?: any\n },\n rpcDriver: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n const { signal, sessionId, adapterConfig, regions, opts } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n if (!isFeatureAdapter(dataAdapter)) {\n throw new Error('Adapter does not support retrieving features')\n }\n const ret = dataAdapter.getFeaturesInMultipleRegions(regions, {\n ...opts,\n signal,\n })\n const r = await firstValueFrom(ret.pipe(toArray()))\n return r.map(f => f.toJSON())\n }\n}\n","import { ServerSideRendererType } from '../../pluggableElementTypes'\nimport {\n RenderArgs as ServerSideRenderArgs,\n RenderArgsSerialized as ServerSideRenderArgsSerialized,\n} from '../../pluggableElementTypes/renderers/ServerSideRendererType'\nimport { Region } from '../../util'\n\nexport interface RenderArgs extends ServerSideRenderArgs {\n adapterConfig: Record<string, unknown>\n rendererType: string\n}\n\nexport interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {\n assemblyName: string\n regions: Region[]\n adapterConfig: Record<string, unknown>\n rendererType: string\n}\n\nexport function validateRendererType<T>(\n rendererType: string,\n RendererType: T,\n): ServerSideRendererType {\n // @ts-expect-error\n if (!RendererType.ReactComponent) {\n throw new Error(\n `renderer ${rendererType} has no ReactComponent, it may not be completely implemented yet`,\n )\n }\n return RendererType as unknown as ServerSideRendererType\n}\n\nexport {\n type RenderResults,\n type ResultsSerialized,\n} from '../../pluggableElementTypes/renderers/ServerSideRendererType'\n","import RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\nimport {\n RenderResults,\n ResultsSerialized,\n RenderArgs,\n RenderArgsSerialized,\n validateRendererType,\n} from './util'\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { checkAbortSignal, renameRegionsIfNeeded } from '../../util'\n\n/**\n * fetches features from an adapter and call a renderer with them\n */\nexport default class CoreRender extends RpcMethodType {\n name = 'CoreRender'\n\n async serializeArguments(args: RenderArgs, rpcDriver: string) {\n const { rootModel } = this.pluginManager\n const assemblyManager = rootModel!.session!.assemblyManager\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, args)\n\n const superArgs = (await super.serializeArguments(\n renamedArgs,\n rpcDriver,\n )) as RenderArgs\n if (rpcDriver === 'MainThreadRpcDriver') {\n return superArgs\n }\n\n const { rendererType } = args\n\n const RendererType = validateRendererType(\n rendererType,\n this.pluginManager.getRendererType(rendererType),\n )\n\n return RendererType.serializeArgsInClient(superArgs)\n }\n\n async execute(\n args: RenderArgsSerialized & { signal?: RemoteAbortSignal },\n rpcDriver: string,\n ) {\n let deserializedArgs = args\n if (rpcDriver !== 'MainThreadRpcDriver') {\n deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n }\n const { sessionId, rendererType, signal } = deserializedArgs\n if (!sessionId) {\n throw new Error('must pass a unique session id')\n }\n\n checkAbortSignal(signal)\n\n const RendererType = validateRendererType(\n rendererType,\n this.pluginManager.getRendererType(rendererType),\n )\n\n const result =\n rpcDriver === 'MainThreadRpcDriver'\n ? await RendererType.render(deserializedArgs)\n : await RendererType.renderInWorker(deserializedArgs)\n\n checkAbortSignal(signal)\n return result\n }\n\n async deserializeReturn(\n serializedReturn: RenderResults | ResultsSerialized,\n args: RenderArgs,\n rpcDriver: string,\n ): Promise<unknown> {\n const des = await super.deserializeReturn(serializedReturn, args, rpcDriver)\n if (rpcDriver === 'MainThreadRpcDriver') {\n return des\n }\n\n const { rendererType } = args\n const RendererType = validateRendererType(\n rendererType,\n this.pluginManager.getRendererType(rendererType),\n )\n return RendererType.deserializeResultsInClient(\n des as ResultsSerialized,\n args,\n )\n }\n}\n","import RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\nimport { freeAdapterResources } from '../../data_adapters/dataAdapterCache'\n\n/**\n * free up any resources (e.g. cached adapter objects)\n * that are only associated with the given track ID.\n *\n * returns number of objects deleted\n */\nexport default class CoreFreeResources extends RpcMethodType {\n name = 'CoreFreeResources'\n\n async execute(specification: Record<string, unknown>) {\n let deleteCount = 0\n\n deleteCount += freeAdapterResources(specification)\n\n // pass the freeResources hint along to all the renderers as well\n this.pluginManager.getRendererTypes().forEach(renderer => {\n const count = renderer.freeResources(/* specification */)\n if (count) {\n deleteCount += count\n }\n })\n\n return deleteCount\n }\n async serializeArguments(args: Record<string, unknown>, _rpcDriver: string) {\n return args\n }\n}\n","import { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport RpcMethodType from '../../pluggableElementTypes/RpcMethodType'\nimport { RenderArgs } from './util'\nimport { RemoteAbortSignal } from '../remoteAbortSignals'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\nimport { renameRegionsIfNeeded, Region } from '../../util'\n\nexport default class CoreGetFeatureDensityStats extends RpcMethodType {\n name = 'CoreGetFeatureDensityStats'\n\n async serializeArguments(\n args: RenderArgs & {\n signal?: AbortSignal\n statusCallback?: (arg: string) => void\n },\n rpcDriver: string,\n ) {\n const { rootModel } = this.pluginManager\n const assemblyManager = rootModel!.session!.assemblyManager\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {\n ...args,\n filters: args.filters?.toJSON().filters,\n })\n\n return super.serializeArguments(renamedArgs, rpcDriver)\n }\n\n async execute(\n args: {\n adapterConfig: Record<string, unknown>\n regions: Region[]\n signal?: RemoteAbortSignal\n headers?: Record<string, string>\n sessionId: string\n },\n rpcDriver: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n const { adapterConfig, sessionId, regions } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n\n if (!isFeatureAdapter(dataAdapter)) {\n throw new Error('Adapter does not support retrieving features')\n }\n return dataAdapter.getMultiRegionFeatureDensityStats(\n regions,\n deserializedArgs,\n )\n }\n}\n","import { ConfigurationSchema } from '../../configuration'\n\n/**\n * #config CytobandAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'CytobandAdapter',\n {\n /**\n * #slot\n */\n cytobandLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/cytoband.txt.gz' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default configSchema\n","import { lazy } from 'react'\nimport { configSchema, stateModelFactory } from './BaseFeatureWidget'\nimport Plugin from './Plugin'\nimport PluginManager from './PluginManager'\nimport * as coreRpcMethods from './rpc/coreRpcMethods'\nimport WidgetType from './pluggableElementTypes/WidgetType'\nimport CytobandAdapterF from './data_adapters/CytobandAdapter'\n\n// the core plugin, which registers types that ALL JBrowse applications are\n// expected to need.\nexport default class CorePlugin extends Plugin {\n name = 'CorePlugin'\n\n install(pluginManager: PluginManager) {\n // register all our core rpc methods\n Object.values(coreRpcMethods).forEach(RpcMethod => {\n pluginManager.addRpcMethod(() => new RpcMethod(pluginManager))\n })\n\n CytobandAdapterF(pluginManager)\n\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'BaseFeatureWidget',\n heading: 'Feature details',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(\n () => import('./BaseFeatureWidget/BaseFeatureDetail'),\n ),\n })\n })\n }\n}\n","import { AdapterType } from '../../pluggableElementTypes'\nimport PluginManager from '../../PluginManager'\nimport configSchema from './configSchema'\n\nexport default function CytobandAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'CytobandAdapter',\n configSchema,\n getAdapterClass: () => import('./CytobandAdapter').then(f => f.default),\n }),\n )\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-function-type */\nimport {\n isModelType,\n isType,\n types,\n IAnyType,\n IAnyModelType,\n} from 'mobx-state-tree'\n\n// Pluggable elements\nimport PluggableElementBase from './pluggableElementTypes/PluggableElementBase'\nimport RendererType from './pluggableElementTypes/renderers/RendererType'\nimport AdapterType from './pluggableElementTypes/AdapterType'\nimport TrackType from './pluggableElementTypes/TrackType'\nimport DisplayType from './pluggableElementTypes/DisplayType'\nimport ViewType from './pluggableElementTypes/ViewType'\nimport WidgetType from './pluggableElementTypes/WidgetType'\nimport ConnectionType from './pluggableElementTypes/ConnectionType'\nimport RpcMethodType from './pluggableElementTypes/RpcMethodType'\nimport InternetAccountType from './pluggableElementTypes/InternetAccountType'\nimport TextSearchAdapterType from './pluggableElementTypes/TextSearchAdapterType'\nimport AddTrackWorkflowType from './pluggableElementTypes/AddTrackWorkflowType'\n\nimport {\n ConfigurationSchema,\n isBareConfigurationSchemaType,\n} from './configuration'\n\nimport Plugin from './Plugin'\nimport ReExports from './ReExports'\n\nimport {\n PluggableElementType,\n PluggableElementMember,\n} from './pluggableElementTypes'\nimport { AbstractRootModel } from './util'\nimport CorePlugin from './CorePlugin'\nimport createJexlInstance from './util/jexl'\nimport { PluginDefinition } from './PluginLoader'\n\n// helper class that keeps groups of callbacks that are then run in a specified\n// order by group\nclass PhasedScheduler<PhaseName extends string> {\n phaseCallbacks = new Map<PhaseName, Function[]>()\n\n phaseOrder: PhaseName[] = []\n\n constructor(...phaseOrder: PhaseName[]) {\n this.phaseOrder = phaseOrder\n }\n\n add(phase: PhaseName, callback: Function) {\n if (!this.phaseOrder.includes(phase)) {\n throw new Error(`unknown phase ${phase}`)\n }\n let phaseCallbacks = this.phaseCallbacks.get(phase)\n if (!phaseCallbacks) {\n phaseCallbacks = []\n this.phaseCallbacks.set(phase, phaseCallbacks)\n }\n phaseCallbacks.push(callback)\n }\n\n run() {\n this.phaseOrder.forEach(phaseName => {\n this.phaseCallbacks.get(phaseName)?.forEach(callback => callback())\n })\n }\n}\n\ntype PluggableElementTypeGroup =\n | 'renderer'\n | 'adapter'\n | 'display'\n | 'track'\n | 'connection'\n | 'view'\n | 'widget'\n | 'rpc method'\n | 'internet account'\n | 'text search adapter'\n | 'add track workflow'\n\n/** internal class that holds the info for a certain element type */\nclass TypeRecord<ElementClass extends PluggableElementBase> {\n registeredTypes: Record<string, ElementClass> = {}\n\n constructor(\n public typeName: string,\n public baseClass:\n | (new (...args: unknown[]) => ElementClass)\n // covers abstract class case\n | (Function & {\n prototype: ElementClass\n }),\n ) {}\n\n add(name: string, t: ElementClass) {\n this.registeredTypes[name] = t\n }\n\n has(name: string) {\n return name in this.registeredTypes\n }\n\n get(name: string) {\n if (!this.has(name)) {\n throw new Error(\n `${this.typeName} '${name}' not found, perhaps its plugin is not loaded or its plugin has not added it.`,\n )\n }\n return this.registeredTypes[name]\n }\n\n all() {\n return Object.values(this.registeredTypes)\n }\n}\n\ntype AnyFunction = (...args: any) => any\n\n/**\n * free-form string-to-unknown mapping of metadata related to the instance of\n * this plugin. `isCore` is typically set to `Boolean(true)` if the plugin was\n * loaded as part of the \"core\" set of plugins for this application. Can also\n * use this metadata to stash other things about why the plugin is loaded, such\n * as where it came from, what plugin depends on it, etc.\n */\nexport type PluginMetadata = Record<string, unknown>\n\nexport interface PluginLoadRecord {\n metadata?: PluginMetadata\n plugin: Plugin\n}\nexport interface RuntimePluginLoadRecord extends PluginLoadRecord {\n definition: PluginDefinition\n}\n\nexport default class PluginManager {\n plugins: Plugin[] = []\n\n jexl = createJexlInstance()\n\n pluginMetadata: Record<string, PluginMetadata> = {}\n\n runtimePluginDefinitions: PluginDefinition[] = []\n\n elementCreationSchedule = new PhasedScheduler<PluggableElementTypeGroup>(\n 'renderer',\n 'adapter',\n 'text search adapter',\n 'display',\n 'track',\n 'connection',\n 'view',\n 'widget',\n 'rpc method',\n 'internet account',\n 'add track workflow',\n ) as PhasedScheduler<PluggableElementTypeGroup> | undefined\n\n rendererTypes = new TypeRecord('RendererType', RendererType)\n\n adapterTypes = new TypeRecord('AdapterType', AdapterType)\n\n textSearchAdapterTypes = new TypeRecord(\n 'TextSearchAdapterType',\n TextSearchAdapterType,\n )\n\n trackTypes = new TypeRecord('TrackType', TrackType)\n\n displayTypes = new TypeRecord('DisplayType', DisplayType)\n\n connectionTypes = new TypeRecord('ConnectionType', ConnectionType)\n\n viewTypes = new TypeRecord('ViewType', ViewType)\n\n widgetTypes = new TypeRecord('WidgetType', WidgetType)\n\n rpcMethods = new TypeRecord('RpcMethodType', RpcMethodType)\n\n addTrackWidgets = new TypeRecord('AddTrackWorkflow', AddTrackWorkflowType)\n\n internetAccountTypes = new TypeRecord(\n 'InternetAccountType',\n InternetAccountType,\n )\n\n configured = false\n\n rootModel?: AbstractRootModel\n\n extensionPoints = new Map<string, Function[]>()\n\n constructor(initialPlugins: (Plugin | PluginLoadRecord)[] = []) {\n // add the core plugin\n this.addPlugin({\n plugin: new CorePlugin(),\n metadata: {\n isCore: true,\n },\n })\n\n // add all the initial plugins\n initialPlugins.forEach(plugin => {\n this.addPlugin(plugin)\n })\n }\n\n pluginConfigurationSchemas() {\n const configurationSchemas: Record<string, unknown> = {}\n this.plugins.forEach(plugin => {\n if (plugin.configurationSchema) {\n configurationSchemas[plugin.name] = plugin.configurationSchema\n }\n })\n return configurationSchemas\n }\n\n addPlugin(load: Plugin | PluginLoadRecord | RuntimePluginLoadRecord) {\n if (this.configured) {\n throw new Error('JBrowse already configured, cannot add plugins')\n }\n\n // check for availability of 'install' and 'configure' as a proxy for being\n // an 'instanceof Plugin'\n const [plugin, metadata = {}] =\n 'install' in load && 'configure' in load\n ? [load, {}]\n : [load.plugin, load.metadata]\n\n if (this.plugins.includes(plugin)) {\n throw new Error('plugin already installed')\n }\n\n this.pluginMetadata[plugin.name] = metadata\n if ('definition' in load) {\n this.runtimePluginDefinitions.push(load.definition)\n }\n plugin.install(this)\n this.plugins.push(plugin)\n return this\n }\n\n getPlugin(name: string) {\n return this.plugins.find(p => p.name === name)\n }\n\n hasPlugin(name: string) {\n return this.getPlugin(name) !== undefined\n }\n\n createPluggableElements() {\n // run the creation callbacks for each element type in order.\n // see elementCreationSchedule above for the creation order\n if (this.elementCreationSchedule) {\n this.elementCreationSchedule.run()\n this.elementCreationSchedule = undefined\n }\n return this\n }\n\n setRootModel(rootModel: AbstractRootModel) {\n this.rootModel = rootModel\n }\n\n configure() {\n if (this.configured) {\n throw new Error('already configured')\n }\n\n this.plugins.forEach(plugin => {\n plugin.configure(this)\n })\n\n this.configured = true\n\n return this\n }\n\n getElementTypeRecord(\n groupName: PluggableElementTypeGroup,\n ): TypeRecord<PluggableElementBase> {\n switch (groupName) {\n case 'adapter':\n return this.adapterTypes\n case 'text search adapter':\n return this.textSearchAdapterTypes\n case 'connection':\n return this.connectionTypes\n case 'widget':\n return this.widgetTypes\n case 'renderer':\n return this.rendererTypes\n case 'display':\n return this.displayTypes\n case 'track':\n return this.trackTypes\n case 'view':\n return this.viewTypes\n case 'rpc method':\n return this.rpcMethods\n case 'internet account':\n return this.internetAccountTypes\n case 'add track workflow':\n return this.addTrackWidgets\n default:\n throw new Error(`invalid element type '${groupName}'`)\n }\n }\n\n addElementType(\n groupName: PluggableElementTypeGroup,\n creationCallback: (pluginManager: PluginManager) => PluggableElementType,\n ) {\n if (typeof creationCallback !== 'function') {\n throw new Error(\n 'must provide a callback function that returns the new type object',\n )\n }\n const typeRecord = this.getElementTypeRecord(groupName)\n\n this.elementCreationSchedule?.add(groupName, () => {\n const newElement = creationCallback(this)\n if (!newElement.name) {\n throw new Error(`cannot add a ${groupName} with no name`)\n }\n\n if (typeRecord.has(newElement.name)) {\n throw new Error(\n `${groupName} ${newElement.name} already registered, cannot register it again`,\n )\n }\n\n typeRecord.add(\n newElement.name,\n this.evaluateExtensionPoint(\n 'Core-extendPluggableElement',\n newElement,\n ) as PluggableElementType,\n )\n })\n\n return this\n }\n\n getElementType(groupName: PluggableElementTypeGroup, typeName: string) {\n return this.getElementTypeRecord(groupName).get(typeName)\n }\n\n getElementTypesInGroup(groupName: PluggableElementTypeGroup) {\n return this.getElementTypeRecord(groupName).all()\n }\n\n getTrackElements() {\n return this.getElementTypesInGroup('track') as TrackType[]\n }\n\n getConnectionElements() {\n return this.getElementTypesInGroup('connection') as ConnectionType[]\n }\n\n getAddTrackWorkflowElements() {\n return this.getElementTypesInGroup(\n 'add track workflow',\n ) as AddTrackWorkflowType[]\n }\n\n getRpcElements() {\n return this.getElementTypesInGroup('rpc method') as RpcMethodType[]\n }\n\n getDisplayElements() {\n return this.getElementTypesInGroup('display') as DisplayType[]\n }\n\n getAdapterElements() {\n return this.getElementTypesInGroup('adapter') as AdapterType[]\n }\n\n /** get a MST type for the union of all specified pluggable MST types */\n pluggableMstType(\n groupName: PluggableElementTypeGroup,\n fieldName: PluggableElementMember,\n fallback: IAnyType = types.maybe(types.null),\n ) {\n const pluggableTypes = this.getElementTypeRecord(groupName)\n .all()\n // @ts-expect-error\n .map(t => t[fieldName])\n .filter(t => isType(t) && isModelType(t)) as IAnyType[]\n\n // try to smooth over the case when no types are registered, mostly\n // encountered in tests\n if (pluggableTypes.length === 0 && typeof jest === 'undefined') {\n console.warn(\n `No pluggable types found matching ('${groupName}','${fieldName}')`,\n )\n return fallback\n }\n return types.union(...pluggableTypes)\n }\n\n /** get a MST type for the union of all specified pluggable config schemas */\n pluggableConfigSchemaType(\n typeGroup: PluggableElementTypeGroup,\n fieldName: PluggableElementMember = 'configSchema',\n ) {\n const pluggableTypes = this.getElementTypeRecord(typeGroup)\n .all()\n // @ts-expect-error\n .map(t => t[fieldName])\n .filter(t => isBareConfigurationSchemaType(t)) as IAnyType[]\n\n if (pluggableTypes.length === 0) {\n pluggableTypes.push(ConfigurationSchema('Null', {}))\n }\n return types.union(...pluggableTypes) as IAnyModelType\n }\n\n jbrequireCache = new Map()\n\n lib = ReExports\n\n load = <FTYPE extends AnyFunction>(lib: FTYPE): ReturnType<FTYPE> => {\n if (!this.jbrequireCache.has(lib)) {\n this.jbrequireCache.set(lib, lib(this))\n }\n return this.jbrequireCache.get(lib)\n }\n\n /**\n * Get the re-exported version of the given package name.\n * Throws an error if the package is not re-exported by the plugin manager.\n *\n * @returns the library's default export\n */\n jbrequire = (\n lib: keyof typeof ReExports | AnyFunction | { default: AnyFunction },\n ): any => {\n if (typeof lib === 'string') {\n const pack = this.lib[lib]\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!pack) {\n throw new TypeError(\n `No jbrequire re-export defined for package '${lib}'. If this package must be shared between plugins, add it to ReExports.js. If it does not need to be shared, just import it normally.`,\n )\n }\n return pack\n }\n\n if (typeof lib === 'function') {\n return this.load(lib)\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (lib.default) {\n return this.jbrequire(lib.default)\n }\n\n throw new TypeError(\n 'lib passed to jbrequire must be either a string or a function',\n )\n }\n\n getRendererType(typeName: string) {\n return this.rendererTypes.get(typeName)\n }\n\n getRendererTypes(): RendererType[] {\n return this.rendererTypes.all()\n }\n\n getAdapterType(typeName: string) {\n return this.adapterTypes.get(typeName)\n }\n\n getTextSearchAdapterType(typeName: string) {\n return this.textSearchAdapterTypes.get(typeName)\n }\n\n getTrackType(typeName: string) {\n return this.trackTypes.get(typeName)\n }\n\n getDisplayType(typeName: string) {\n return this.displayTypes.get(typeName)\n }\n\n getViewType(typeName: string) {\n return this.viewTypes.get(typeName)\n }\n\n getAddTrackWorkflow(typeName: string) {\n return this.addTrackWidgets.get(typeName)\n }\n\n getWidgetType(typeName: string) {\n return this.widgetTypes.get(typeName)\n }\n\n getConnectionType(typeName: string) {\n return this.connectionTypes.get(typeName)\n }\n\n getRpcMethodType(methodName: string) {\n return this.rpcMethods.get(methodName)\n }\n\n getInternetAccountType(name: string) {\n return this.internetAccountTypes.get(name)\n }\n\n addRendererType(cb: (pm: PluginManager) => RendererType) {\n return this.addElementType('renderer', cb)\n }\n\n addAdapterType(cb: (pm: PluginManager) => AdapterType) {\n return this.addElementType('adapter', cb)\n }\n\n addTextSearchAdapterType(cb: (pm: PluginManager) => TextSearchAdapterType) {\n return this.addElementType('text search adapter', cb)\n }\n\n addTrackType(cb: (pm: PluginManager) => TrackType) {\n // Goes through the already-created displays and registers the ones that\n // specify this track type\n const callback = () => {\n const track = cb(this)\n const displays = this.getElementTypesInGroup('display') as DisplayType[]\n displays.forEach(display => {\n // track may have already added the displayType in its cb\n if (\n display.trackType === track.name &&\n !track.displayTypes.includes(display)\n ) {\n track.addDisplayType(display)\n }\n })\n return track\n }\n return this.addElementType('track', callback)\n }\n\n addDisplayType(cb: (pluginManager: PluginManager) => DisplayType) {\n return this.addElementType('display', cb)\n }\n\n addViewType(cb: (pluginManager: PluginManager) => ViewType) {\n const callback = () => {\n const newView = cb(this)\n const displays = this.getElementTypesInGroup('display') as DisplayType[]\n displays.forEach(display => {\n // view may have already added the displayType in its callback\n // see ViewType for description of extendedName\n if (\n (display.viewType === newView.name ||\n display.viewType === newView.extendedName) &&\n !newView.displayTypes.includes(display)\n ) {\n newView.addDisplayType(display)\n }\n })\n return newView\n }\n return this.addElementType('view', callback)\n }\n\n addWidgetType(cb: (pm: PluginManager) => WidgetType) {\n return this.addElementType('widget', cb)\n }\n\n addConnectionType(cb: (pm: PluginManager) => ConnectionType) {\n return this.addElementType('connection', cb)\n }\n\n addRpcMethod(cb: (pm: PluginManager) => RpcMethodType) {\n return this.addElementType('rpc method', cb)\n }\n\n addInternetAccountType(cb: (pm: PluginManager) => InternetAccountType) {\n return this.addElementType('internet account', cb)\n }\n\n addAddTrackWorkflowType(cb: (pm: PluginManager) => AddTrackWorkflowType) {\n return this.addElementType('add track workflow', cb)\n }\n\n addToExtensionPoint<T>(\n extensionPointName: string,\n callback: (extendee: T, props: Record<string, unknown>) => T,\n ) {\n let callbacks = this.extensionPoints.get(extensionPointName)\n if (!callbacks) {\n callbacks = []\n this.extensionPoints.set(extensionPointName, callbacks)\n }\n callbacks.push(callback)\n }\n\n evaluateExtensionPoint(\n extensionPointName: string,\n extendee: unknown,\n props?: Record<string, unknown>,\n ) {\n const callbacks = this.extensionPoints.get(extensionPointName)\n let accumulator = extendee\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n accumulator = callback(accumulator, props)\n } catch (error) {\n console.error(error)\n }\n }\n }\n return accumulator\n }\n\n async evaluateAsyncExtensionPoint(\n extensionPointName: string,\n extendee: unknown,\n props?: Record<string, unknown>,\n ) {\n const callbacks = this.extensionPoints.get(extensionPointName)\n let accumulator = extendee\n if (callbacks) {\n for (const callback of callbacks) {\n try {\n accumulator = await callback(accumulator, props)\n } catch (error) {\n console.error(error)\n }\n }\n }\n return accumulator\n }\n}\n","/**\n * Used by plugin build systems to determine if a module is provided by JBrowse\n * globally and thus doesn't need to be bundled. A check in ./modules.tsx makes\n * sure this is in sync with the re-exported modules.\n */\nexport default [\n 'mobx',\n 'mobx-state-tree',\n 'react',\n 'react/jsx-runtime',\n 'react-dom',\n 'mobx-react',\n '@mui/x-data-grid',\n '@mui/material/utils',\n '@material-ui/core/utils',\n 'tss-react/mui',\n '@material-ui/core',\n '@mui/material',\n\n '@mui/material/styles',\n '@material-ui/core/styles',\n '@material-ui/core/Accordion',\n '@material-ui/core/AccordionActions',\n '@material-ui/core/AccordionDetails',\n '@material-ui/core/Alert',\n '@material-ui/core/AlertTitle',\n '@material-ui/core/Autocomplete',\n '@material-ui/core/Avatar',\n '@material-ui/core/AvatarGroup',\n '@material-ui/core/Backdrop',\n '@material-ui/core/Badge',\n '@material-ui/core/Box',\n '@material-ui/core/Breadcrumbs',\n '@material-ui/core/Button',\n '@material-ui/core/ButtonGroup',\n '@material-ui/core/Card',\n '@material-ui/core/CardActions',\n '@material-ui/core/CardActionArea',\n '@material-ui/core/CardContent',\n '@material-ui/core/CardHeader',\n '@material-ui/core/CardMedia',\n '@material-ui/core/CircularProgress',\n '@material-ui/core/Collapse',\n '@material-ui/core/ClickAwayListener',\n '@material-ui/core/Chip',\n '@material-ui/core/Checkbox',\n '@material-ui/core/Container',\n '@material-ui/core/Dialog',\n '@material-ui/core/DialogActions',\n '@material-ui/core/DialogTitle',\n '@material-ui/core/DialogContent',\n '@material-ui/core/DialogContentText',\n '@material-ui/core/Divider',\n '@material-ui/core/Drawer',\n '@material-ui/core/Fab',\n '@material-ui/core/Fade',\n '@material-ui/core/FilledInput',\n '@material-ui/core/FormLabel',\n '@material-ui/core/FormControl',\n '@material-ui/core/FormControlLabel',\n '@material-ui/core/FormHelperText',\n '@material-ui/core/FormGroup',\n '@material-ui/core/Grid',\n '@material-ui/core/Grow',\n '@material-ui/core/Icon',\n '@material-ui/core/IconButton',\n '@material-ui/core/Input',\n '@material-ui/core/InputBase',\n '@material-ui/core/InputLabel',\n '@material-ui/core/InputAdornment',\n '@material-ui/core/Link',\n '@material-ui/core/LinearProgress',\n '@material-ui/core/List',\n '@material-ui/core/ListItem',\n '@material-ui/core/ListItemAvatar',\n '@material-ui/core/ListItemSecondaryAction',\n '@material-ui/core/ListItemIcon',\n '@material-ui/core/ListSubheader',\n '@material-ui/core/ListItemText',\n '@material-ui/core/Menu',\n '@material-ui/core/MenuItem',\n '@material-ui/core/MenuList',\n '@material-ui/core/Modal',\n '@material-ui/core/NativeSelect',\n '@material-ui/core/OutlinedInput',\n '@material-ui/core/Pagination',\n '@material-ui/core/PaginationItem',\n '@material-ui/core/Paper',\n '@material-ui/core/Popover',\n '@material-ui/core/Popper',\n '@material-ui/core/Portal',\n '@material-ui/core/Radio',\n '@material-ui/core/RadioGroup',\n '@material-ui/core/Rating',\n '@material-ui/core/ScopedCssBaseline',\n '@material-ui/core/Select',\n '@material-ui/core/Skeleton',\n '@material-ui/core/Slider',\n '@material-ui/core/Snackbar',\n '@material-ui/core/SnackbarContent',\n '@material-ui/core/SpeedDial',\n '@material-ui/core/SpeedDialAction',\n '@material-ui/core/SpeedDialIcon',\n '@material-ui/core/Stack',\n '@material-ui/core/Step',\n '@material-ui/core/StepButton',\n '@material-ui/core/StepConnector',\n '@material-ui/core/StepLabel',\n '@material-ui/core/StepIcon',\n '@material-ui/core/Stepper',\n '@material-ui/core/SvgIcon',\n '@material-ui/core/Switch',\n '@material-ui/core/Tab',\n '@material-ui/core/Table',\n '@material-ui/core/TableBody',\n '@material-ui/core/TableCell',\n '@material-ui/core/TableContainer',\n '@material-ui/core/TableFooter',\n '@material-ui/core/TableHead',\n '@material-ui/core/TablePagination',\n '@material-ui/core/TableRow',\n '@material-ui/core/TableSortLabel',\n '@material-ui/core/Tabs',\n '@material-ui/core/TextField',\n '@material-ui/core/TextareaAutosize',\n '@material-ui/core/ToggleButton',\n '@material-ui/core/ToggleButtonGroup',\n '@material-ui/core/Toolbar',\n '@material-ui/core/Tooltip',\n '@material-ui/core/Typography',\n '@mui/material/Accordion',\n '@mui/material/AccordionActions',\n '@mui/material/AccordionDetails',\n '@mui/material/Alert',\n '@mui/material/AlertTitle',\n '@mui/material/Autocomplete',\n '@mui/material/Avatar',\n '@mui/material/AvatarGroup',\n '@mui/material/Backdrop',\n '@mui/material/Badge',\n '@mui/material/Box',\n '@mui/material/Breadcrumbs',\n '@mui/material/Button',\n '@mui/material/ButtonGroup',\n '@mui/material/Card',\n '@mui/material/CardActions',\n '@mui/material/CardActionArea',\n '@mui/material/CardContent',\n '@mui/material/CardHeader',\n '@mui/material/CardMedia',\n '@mui/material/CircularProgress',\n '@mui/material/Collapse',\n '@mui/material/ClickAwayListener',\n '@mui/material/Chip',\n '@mui/material/Checkbox',\n '@mui/material/Container',\n '@mui/material/Dialog',\n '@mui/material/DialogActions',\n '@mui/material/DialogTitle',\n '@mui/material/DialogContent',\n '@mui/material/DialogContentText',\n '@mui/material/Divider',\n '@mui/material/Drawer',\n '@mui/material/Fab',\n '@mui/material/Fade',\n '@mui/material/FilledInput',\n '@mui/material/FormLabel',\n '@mui/material/FormControl',\n '@mui/material/FormControlLabel',\n '@mui/material/FormHelperText',\n '@mui/material/FormGroup',\n '@mui/material/Grid',\n '@mui/material/Grow',\n '@mui/material/Icon',\n '@mui/material/IconButton',\n '@mui/material/Input',\n '@mui/material/InputBase',\n '@mui/material/InputLabel',\n '@mui/material/InputAdornment',\n '@mui/material/Link',\n '@mui/material/LinearProgress',\n '@mui/material/List',\n '@mui/material/ListItem',\n '@mui/material/ListItemAvatar',\n '@mui/material/ListItemSecondaryAction',\n '@mui/material/ListItemIcon',\n '@mui/material/ListSubheader',\n '@mui/material/ListItemText',\n '@mui/material/Menu',\n '@mui/material/MenuItem',\n '@mui/material/MenuList',\n '@mui/material/Modal',\n '@mui/material/NativeSelect',\n '@mui/material/OutlinedInput',\n '@mui/material/Pagination',\n '@mui/material/PaginationItem',\n '@mui/material/Paper',\n '@mui/material/Popover',\n '@mui/material/Popper',\n '@mui/material/Portal',\n '@mui/material/Radio',\n '@mui/material/RadioGroup',\n '@mui/material/Rating',\n '@mui/material/ScopedCssBaseline',\n '@mui/material/Select',\n '@mui/material/Skeleton',\n '@mui/material/Slider',\n '@mui/material/Snackbar',\n '@mui/material/SnackbarContent',\n '@mui/material/SpeedDial',\n '@mui/material/SpeedDialAction',\n '@mui/material/SpeedDialIcon',\n '@mui/material/Stack',\n '@mui/material/Step',\n '@mui/material/StepButton',\n '@mui/material/StepConnector',\n '@mui/material/StepLabel',\n '@mui/material/StepIcon',\n '@mui/material/Stepper',\n '@mui/material/SvgIcon',\n '@mui/material/Switch',\n '@mui/material/Tab',\n '@mui/material/Table',\n '@mui/material/TableBody',\n '@mui/material/TableCell',\n '@mui/material/TableContainer',\n '@mui/material/TableFooter',\n '@mui/material/TableHead',\n '@mui/material/TablePagination',\n '@mui/material/TableRow',\n '@mui/material/TableSortLabel',\n '@mui/material/Tabs',\n '@mui/material/TextField',\n '@mui/material/TextareaAutosize',\n '@mui/material/ToggleButton',\n '@mui/material/ToggleButtonGroup',\n '@mui/material/Toolbar',\n '@mui/material/Tooltip',\n '@mui/material/Typography',\n '@material-ui/lab/ToggleButton',\n '@material-ui/lab/ToggleButtonGroup',\n '@material-ui/lab/Autocomplete',\n '@material-ui/lab/Alert',\n '@material-ui/lab',\n '@jbrowse/core/Plugin',\n '@jbrowse/core/pluggableElementTypes',\n '@jbrowse/core/pluggableElementTypes/ViewType',\n '@jbrowse/core/pluggableElementTypes/AdapterType',\n '@jbrowse/core/pluggableElementTypes/DisplayType',\n '@jbrowse/core/pluggableElementTypes/TrackType',\n '@jbrowse/core/pluggableElementTypes/WidgetType',\n\n '@jbrowse/core/pluggableElementTypes/models',\n '@jbrowse/core/pluggableElementTypes/renderers/ServerSideRendererType',\n '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType',\n '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType',\n '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType',\n '@jbrowse/core/pluggableElementTypes/renderers/RendererType',\n '@jbrowse/core/configuration',\n '@jbrowse/core/util/types/mst',\n '@jbrowse/core/ui',\n '@jbrowse/core/util',\n '@jbrowse/core/util/color',\n '@jbrowse/core/util/layouts',\n '@jbrowse/core/util/tracks',\n '@jbrowse/core/util/Base1DViewModel',\n '@jbrowse/core/util/io',\n '@jbrowse/core/util/mst-reflection',\n '@jbrowse/core/util/rxjs',\n '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail',\n '@jbrowse/core/data_adapters/BaseAdapter',\n]\n","/* eslint-disable react-refresh/only-export-components */\n// this is all the stuff that the pluginManager re-exports for plugins to use\nimport React, { lazy, LazyExoticComponent, Suspense } from 'react'\nimport * as ReactJSXRuntime from 'react/jsx-runtime'\nimport * as ReactDom from 'react-dom'\nimport * as mobx from 'mobx'\nimport * as mst from 'mobx-state-tree'\nimport * as mxreact from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\n\nimport * as MUIStyles from '@mui/material/styles'\nimport * as MUIUtils from '@mui/material/utils'\nimport { useTheme } from '@mui/material'\nimport {\n useGridApiContext,\n useGridApiRef,\n useGridRootProps,\n} from '@mui/x-data-grid'\n\n// material-ui lab\nimport * as BaseAdapterExports from '../data_adapters/BaseAdapter'\n\nimport Base1DView from '../util/Base1DViewModel'\nimport * as pluggableElementTypes from '../pluggableElementTypes'\nimport ViewType from '../pluggableElementTypes/ViewType'\nimport AdapterType from '../pluggableElementTypes/AdapterType'\nimport DisplayType from '../pluggableElementTypes/DisplayType'\nimport TrackType from '../pluggableElementTypes/TrackType'\nimport WidgetType from '../pluggableElementTypes/WidgetType'\n\nimport * as pluggableElementTypeModels from '../pluggableElementTypes/models'\nimport * as ServerSideRendererType from '../pluggableElementTypes/renderers/ServerSideRendererType'\nimport CircularChordRendererType from '../pluggableElementTypes/renderers/CircularChordRendererType'\nimport * as BoxRendererType from '../pluggableElementTypes/renderers/BoxRendererType'\nimport * as FeatureRendererType from '../pluggableElementTypes/renderers/FeatureRendererType'\nimport * as RendererType from '../pluggableElementTypes/renderers/RendererType'\n\nimport * as Configuration from '../configuration'\nimport Plugin from '../Plugin'\nimport * as coreUi from '../ui'\nimport * as coreUtil from '../util'\nimport * as coreColor from '../util/color'\nimport * as coreLayouts from '../util/layouts'\nimport * as trackUtils from '../util/tracks'\nimport * as coreIo from '../util/io'\nimport * as coreMstReflection from '../util/mst-reflection'\nimport * as rxjs from '../util/rxjs'\nimport * as mstTypes from '../util/types/mst'\n\nimport reExportsList from './list'\n\nconst Entries = {\n Accordion: lazy(() => import('@mui/material/Accordion')),\n AccordionActions: lazy(() => import('@mui/material/AccordionActions')),\n AccordionDetails: lazy(() => import('@mui/material/AccordionDetails')),\n Alert: lazy(() => import('@mui/material/Alert')),\n AlertTitle: lazy(() => import('@mui/material/AlertTitle')),\n Autocomplete: lazy(() => import('@mui/material/Autocomplete')),\n Avatar: lazy(() => import('@mui/material/Avatar')),\n AvatarGroup: lazy(() => import('@mui/material/AvatarGroup')),\n Backdrop: lazy(() => import('@mui/material/Backdrop')),\n Badge: lazy(() => import('@mui/material/Badge')),\n Box: lazy(() => import('@mui/material/Box')),\n Breadcrumbs: lazy(() => import('@mui/material/Breadcrumbs')),\n Button: lazy(() => import('@mui/material/Button')),\n ButtonGroup: lazy(() => import('@mui/material/ButtonGroup')),\n Card: lazy(() => import('@mui/material/Card')),\n CardActions: lazy(() => import('@mui/material/CardActions')),\n CardActionArea: lazy(() => import('@mui/material/CardActionArea')),\n CardContent: lazy(() => import('@mui/material/CardContent')),\n CardHeader: lazy(() => import('@mui/material/CardHeader')),\n CardMedia: lazy(() => import('@mui/material/CardMedia')),\n CircularProgress: lazy(() => import('@mui/material/CircularProgress')),\n Collapse: lazy(() => import('@mui/material/Collapse')),\n ClickAwayListener: lazy(() => import('@mui/material/ClickAwayListener')),\n Chip: lazy(() => import('@mui/material/Chip')),\n Checkbox: lazy(() => import('@mui/material/Checkbox')),\n Container: lazy(() => import('@mui/material/Container')),\n Dialog: lazy(() => import('@mui/material/Dialog')),\n DialogActions: lazy(() => import('@mui/material/DialogActions')),\n DialogTitle: lazy(() => import('@mui/material/DialogTitle')),\n DialogContent: lazy(() => import('@mui/material/DialogContent')),\n DialogContentText: lazy(() => import('@mui/material/DialogContentText')),\n Divider: lazy(() => import('@mui/material/Divider')),\n Drawer: lazy(() => import('@mui/material/Drawer')),\n Fab: lazy(() => import('@mui/material/Fab')),\n Fade: lazy(() => import('@mui/material/Fade')),\n FilledInput: lazy(() => import('@mui/material/FilledInput')),\n FormLabel: lazy(() => import('@mui/material/FormLabel')),\n FormControl: lazy(() => import('@mui/material/FormControl')),\n FormControlLabel: lazy(() => import('@mui/material/FormControlLabel')),\n FormHelperText: lazy(() => import('@mui/material/FormHelperText')),\n FormGroup: lazy(() => import('@mui/material/FormGroup')),\n Grid: lazy(() => import('@mui/material/Grid')),\n Grow: lazy(() => import('@mui/material/Grow')),\n Icon: lazy(() => import('@mui/material/Icon')),\n IconButton: lazy(() => import('@mui/material/IconButton')),\n Input: lazy(() => import('@mui/material/Input')),\n InputBase: lazy(() => import('@mui/material/InputBase')),\n InputLabel: lazy(() => import('@mui/material/InputLabel')),\n InputAdornment: lazy(() => import('@mui/material/InputAdornment')),\n Link: lazy(() => import('@mui/material/Link')),\n LinearProgress: lazy(() => import('@mui/material/LinearProgress')),\n List: lazy(() => import('@mui/material/List')),\n ListItem: lazy(() => import('@mui/material/ListItem')),\n ListItemAvatar: lazy(() => import('@mui/material/ListItemAvatar')),\n ListItemSecondaryAction: lazy(\n () => import('@mui/material/ListItemSecondaryAction'),\n ),\n ListItemIcon: lazy(() => import('@mui/material/ListItemIcon')),\n ListSubheader: lazy(() => import('@mui/material/ListSubheader')),\n ListItemText: lazy(() => import('@mui/material/ListItemText')),\n Menu: lazy(() => import('@mui/material/Menu')),\n MenuItem: lazy(() => import('@mui/material/MenuItem')),\n MenuList: lazy(() => import('@mui/material/MenuList')),\n Modal: lazy(() => import('@mui/material/Modal')),\n NativeSelect: lazy(() => import('@mui/material/NativeSelect')),\n OutlinedInput: lazy(() => import('@mui/material/OutlinedInput')),\n Pagination: lazy(() => import('@mui/material/Pagination')),\n PaginationItem: lazy(() => import('@mui/material/PaginationItem')),\n Paper: lazy(() => import('@mui/material/Paper')),\n Popover: lazy(() => import('@mui/material/Popover')),\n Popper: lazy(() => import('@mui/material/Popper')),\n Portal: lazy(() => import('@mui/material/Portal')),\n Radio: lazy(() => import('@mui/material/Radio')),\n RadioGroup: lazy(() => import('@mui/material/RadioGroup')),\n Rating: lazy(() => import('@mui/material/Rating')),\n ScopedCssBaseline: lazy(() => import('@mui/material/ScopedCssBaseline')),\n Select: lazy(() => import('@mui/material/Select')),\n Skeleton: lazy(() => import('@mui/material/Skeleton')),\n Slider: lazy(() => import('@mui/material/Slider')),\n Snackbar: lazy(() => import('@mui/material/Snackbar')),\n SnackbarContent: lazy(() => import('@mui/material/SnackbarContent')),\n SpeedDial: lazy(() => import('@mui/material/SpeedDial')),\n SpeedDialAction: lazy(() => import('@mui/material/SpeedDialAction')),\n SpeedDialIcon: lazy(() => import('@mui/material/SpeedDialIcon')),\n Stack: lazy(() => import('@mui/material/Stack')),\n Step: lazy(() => import('@mui/material/Step')),\n StepButton: lazy(() => import('@mui/material/StepButton')),\n StepConnector: lazy(() => import('@mui/material/StepConnector')),\n StepLabel: lazy(() => import('@mui/material/StepLabel')),\n StepIcon: lazy(() => import('@mui/material/StepIcon')),\n Stepper: lazy(() => import('@mui/material/Stepper')),\n SvgIcon: lazy(() => import('@mui/material/SvgIcon')),\n Switch: lazy(() => import('@mui/material/Switch')),\n Tab: lazy(() => import('@mui/material/Tab')),\n Table: lazy(() => import('@mui/material/Table')),\n TableBody: lazy(() => import('@mui/material/TableBody')),\n TableCell: lazy(() => import('@mui/material/TableCell')),\n TableContainer: lazy(() => import('@mui/material/TableContainer')),\n TableFooter: lazy(() => import('@mui/material/TableFooter')),\n TableHead: lazy(() => import('@mui/material/TableHead')),\n TablePagination: lazy(() => import('@mui/material/TablePagination')),\n TableRow: lazy(() => import('@mui/material/TableRow')),\n TableSortLabel: lazy(() => import('@mui/material/TableSortLabel')),\n Tabs: lazy(() => import('@mui/material/Tabs')),\n TextField: lazy(() => import('@mui/material/TextField')),\n TextareaAutosize: lazy(() => import('@mui/material/TextareaAutosize')),\n ToggleButton: lazy(() => import('@mui/material/ToggleButton')),\n ToggleButtonGroup: lazy(() => import('@mui/material/ToggleButtonGroup')),\n Toolbar: lazy(() => import('@mui/material/Toolbar')),\n Tooltip: lazy(() => import('@mui/material/Tooltip')),\n Typography: lazy(() => import('@mui/material/Typography')),\n}\n\nconst LazyMUICore = Object.fromEntries(\n Object.entries(Entries).map(([key, ReactComponent]) => {\n const Component = React.forwardRef((props: any, ref) => (\n <Suspense fallback={null}>\n <ReactComponent {...props} ref={ref} />\n </Suspense>\n ))\n Component.displayName = key\n return [key, Component]\n }),\n)\n\nconst MaterialPrefixMUI = Object.fromEntries(\n Object.entries(LazyMUICore).map(([key, value]) => [\n `@material-ui/core/${key}`,\n value,\n ]),\n)\n\nconst MuiPrefixMUI = Object.fromEntries(\n Object.entries(LazyMUICore).map(([key, value]) => [\n `@mui/material/${key}`,\n value,\n ]),\n)\n\nconst Attributes = lazy(() => import('./Attributes'))\nconst FeatureDetails = lazy(() => import('./FeatureDetails'))\nconst BaseCard = lazy(() => import('./BaseCard'))\n\nconst DataGridEntries: Record<string, LazyExoticComponent<any>> = {\n DataGrid: lazy(() =>\n import('@mui/x-data-grid').then(module => ({ default: module.DataGrid })),\n ),\n GridActionsCellItem: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridActionsCellItem,\n })),\n ),\n GridAddIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridAddIcon,\n })),\n ),\n GridArrowDownwardIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridArrowDownwardIcon,\n })),\n ),\n GridArrowUpwardIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridArrowUpwardIcon,\n })),\n ),\n GridCellCheckboxForwardRef: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridCellCheckboxForwardRef,\n })),\n ),\n GridCellCheckboxRenderer: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridCellCheckboxRenderer,\n })),\n ),\n GridCheckCircleIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridCheckCircleIcon,\n })),\n ),\n GridCheckIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridCheckIcon,\n })),\n ),\n GridCloseIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridCloseIcon,\n })),\n ),\n GridColumnHeaderSeparator: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridColumnHeaderSeparator,\n })),\n ),\n GridColumnHeaderSortIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridColumnHeaderSortIcon,\n })),\n ),\n GridColumnIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridColumnIcon,\n })),\n ),\n GridColumnMenu: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridColumnMenu,\n })),\n ),\n GridColumnMenuContainer: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridColumnMenuContainer,\n })),\n ),\n GridDragIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridDragIcon,\n })),\n ),\n GridExpandMoreIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridExpandMoreIcon,\n })),\n ),\n GridFilterAltIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridFilterAltIcon,\n })),\n ),\n GridFilterForm: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridFilterForm,\n })),\n ),\n GridFilterListIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridFilterListIcon,\n })),\n ),\n GridFilterPanel: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridFilterPanel,\n })),\n ),\n GridFooter: lazy(() =>\n import('@mui/x-data-grid').then(module => ({ default: module.GridFooter })),\n ),\n GridFooterContainer: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridFooterContainer,\n })),\n ),\n GridHeader: lazy(() =>\n import('@mui/x-data-grid').then(module => ({ default: module.GridHeader })),\n ),\n GridHeaderCheckbox: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridHeaderCheckbox,\n })),\n ),\n GridKeyboardArrowRight: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridKeyboardArrowRight,\n })),\n ),\n GridLoadIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridLoadIcon,\n })),\n ),\n GridLoadingOverlay: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridLoadingOverlay,\n })),\n ),\n GridMenuIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridMenuIcon,\n })),\n ),\n GridMoreVertIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridMoreVertIcon,\n })),\n ),\n GridNoRowsOverlay: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridNoRowsOverlay,\n })),\n ),\n GridOverlay: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridOverlay,\n })),\n ),\n GridPagination: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridPagination,\n })),\n ),\n GridPanel: lazy(() =>\n import('@mui/x-data-grid').then(module => ({ default: module.GridPanel })),\n ),\n GridPanelWrapper: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridPanelWrapper,\n })),\n ),\n GridRemoveIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridRemoveIcon,\n })),\n ),\n GridRoot: lazy(() =>\n import('@mui/x-data-grid').then(module => ({ default: module.GridRoot })),\n ),\n GridRowCount: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridRowCount,\n })),\n ),\n GridSaveAltIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridSaveAltIcon,\n })),\n ),\n GridSearchIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridSearchIcon,\n })),\n ),\n GridSelectedRowCount: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridSelectedRowCount,\n })),\n ),\n GridSeparatorIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridSeparatorIcon,\n })),\n ),\n GridTableRowsIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridTableRowsIcon,\n })),\n ),\n GridToolbar: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbar,\n })),\n ),\n GridToolbarColumnsButton: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarColumnsButton,\n })),\n ),\n GridToolbarContainer: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarContainer,\n })),\n ),\n GridToolbarDensitySelector: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarDensitySelector,\n })),\n ),\n GridToolbarExport: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarExport,\n })),\n ),\n GridToolbarExportContainer: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarExportContainer,\n })),\n ),\n GridToolbarFilterButton: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridToolbarFilterButton,\n })),\n ),\n GridTripleDotsVerticalIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridTripleDotsVerticalIcon,\n })),\n ),\n GridViewHeadlineIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridViewHeadlineIcon,\n })),\n ),\n GridViewStreamIcon: lazy(() =>\n import('@mui/x-data-grid').then(module => ({\n default: module.GridViewStreamIcon,\n })),\n ),\n}\n\nconst LazyDataGridComponents = Object.fromEntries(\n Object.entries(DataGridEntries).map(([key, ReactComponent]) => {\n const Component = React.forwardRef((props: any, ref) => (\n <Suspense fallback={null}>\n <ReactComponent {...props} ref={ref} />\n </Suspense>\n ))\n Component.displayName = key\n return [key, Component]\n }),\n)\n\nconst LazyAttributes = React.forwardRef((props: any, ref) => (\n <Suspense fallback={null}>\n <Attributes {...props} ref={ref} />\n </Suspense>\n))\nLazyAttributes.displayName = 'Attributes'\n\nconst LazyFeatureDetails = React.forwardRef((props: any, ref) => (\n <Suspense fallback={null}>\n <FeatureDetails {...props} ref={ref} />\n </Suspense>\n))\nLazyFeatureDetails.displayName = 'FeatureDetails'\n\nconst LazyBaseCard = React.forwardRef((props: any, ref) => (\n <Suspense fallback={null}>\n <BaseCard {...props} ref={ref} />\n </Suspense>\n))\nLazyBaseCard.displayName = 'BaseCard'\n\nconst libs = {\n mobx,\n 'mobx-state-tree': mst,\n react: React,\n 'react/jsx-runtime': ReactJSXRuntime,\n 'react-dom': ReactDom,\n 'mobx-react': mxreact,\n '@mui/x-data-grid': {\n useGridApiContext,\n useGridApiRef,\n useGridRootProps,\n ...LazyDataGridComponents,\n },\n\n // special case so plugins can easily use @mui/icons-material; don't remove\n '@mui/material/utils': MUIUtils,\n '@material-ui/core/utils': MUIUtils,\n 'tss-react/mui': { makeStyles },\n\n '@material-ui/core': {\n ...LazyMUICore,\n useTheme,\n alpha: MUIStyles.alpha,\n\n makeStyles: (args: any) => {\n const useStyles = makeStyles()(args)\n return () => useStyles().classes\n },\n },\n '@mui/material': {\n ...LazyMUICore,\n alpha: MUIStyles.alpha,\n useTheme: MUIStyles.useTheme,\n },\n\n // end special case\n // material-ui subcomponents, should get rid of these\n '@mui/material/styles': {\n MUIStyles,\n\n makeStyles: (args: any) => {\n const useStyles = makeStyles()(args)\n return () => useStyles().classes\n },\n },\n '@material-ui/core/styles': {\n MUIStyles,\n\n makeStyles: (args: any) => {\n const useStyles = makeStyles()(args)\n return () => useStyles().classes\n },\n },\n ...MaterialPrefixMUI,\n ...MuiPrefixMUI,\n\n // these are core in @mui/material, but used to be in @material-ui/lab\n '@material-ui/lab/ToggleButton': Entries.ToggleButton,\n '@material-ui/lab/ToggleButtonGroup': Entries.ToggleButtonGroup,\n '@material-ui/lab/Autocomplete': Entries.Autocomplete,\n '@material-ui/lab/Alert': Entries.Alert,\n '@material-ui/lab': {\n Alert: Entries.Alert,\n Autocomplete: Entries.Autocomplete,\n ToggleButton: Entries.ToggleButton,\n ToggleButtonGroup: Entries.ToggleButtonGroup,\n },\n\n '@jbrowse/core/Plugin': Plugin,\n '@jbrowse/core/pluggableElementTypes': pluggableElementTypes,\n '@jbrowse/core/pluggableElementTypes/ViewType': ViewType,\n '@jbrowse/core/pluggableElementTypes/AdapterType': AdapterType,\n '@jbrowse/core/pluggableElementTypes/DisplayType': DisplayType,\n '@jbrowse/core/pluggableElementTypes/TrackType': TrackType,\n '@jbrowse/core/pluggableElementTypes/WidgetType': WidgetType,\n '@jbrowse/core/pluggableElementTypes/models': pluggableElementTypeModels,\n '@jbrowse/core/pluggableElementTypes/renderers/ServerSideRendererType':\n ServerSideRendererType,\n '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType':\n CircularChordRendererType,\n '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType':\n BoxRendererType,\n '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType':\n FeatureRendererType,\n '@jbrowse/core/pluggableElementTypes/renderers/RendererType': RendererType,\n '@jbrowse/core/configuration': Configuration,\n '@jbrowse/core/util/types/mst': mstTypes,\n '@jbrowse/core/ui': coreUi,\n '@jbrowse/core/util': coreUtil,\n '@jbrowse/core/util/color': coreColor,\n '@jbrowse/core/util/layouts': coreLayouts,\n '@jbrowse/core/util/tracks': trackUtils,\n '@jbrowse/core/util/Base1DViewModel': Base1DView,\n '@jbrowse/core/util/io': coreIo,\n '@jbrowse/core/util/mst-reflection': coreMstReflection,\n '@jbrowse/core/util/rxjs': rxjs,\n\n '@jbrowse/core/BaseFeatureWidget/BaseFeatureDetail': {\n Attributes: LazyAttributes,\n FeatureDetails: LazyFeatureDetails,\n BaseCard: LazyBaseCard,\n },\n '@jbrowse/core/data_adapters/BaseAdapter': BaseAdapterExports,\n}\n\nconst libsList = Object.keys(libs)\n\n// make sure that all the items in the ReExports/list array (used by build\n// systems and such) are included here, and vice versa\nconst inLibsOnly = libsList.filter(mod => !reExportsList.includes(mod))\nif (inLibsOnly.length > 0) {\n throw new Error(\n `The following modules are in the modules libs, but not the re-exports list: ${inLibsOnly.join(\n ', ',\n )}`,\n )\n}\nconst inReExportsOnly = reExportsList.filter(mod => !libsList.includes(mod))\nif (inReExportsOnly.length) {\n throw new Error(\n `The following modules are in the re-exports list, but not the modules libs: ${inReExportsOnly.join(\n ', ',\n )}`,\n )\n}\n\nexport default libs\n","import React from 'react'\nimport TextSearchAdapterType from '../pluggableElementTypes/TextSearchAdapterType'\nimport { SearchType } from '../data_adapters/BaseAdapter'\n\nexport interface BaseResultArgs {\n label: string\n\n displayString?: string\n\n renderingComponent?: React.ReactElement\n\n matchedAttribute?: string\n\n matchedObject?: object\n\n textSearchAdapter?: TextSearchAdapterType\n\n relevance?: SearchType\n\n locString?: string\n\n refName?: string\n\n trackId?: string\n\n score?: number\n\n results?: BaseResult[]\n}\n\nexport default class BaseResult {\n label: string\n\n renderingComponent?: React.ReactElement\n\n displayString?: string\n\n matchedAttribute?: string\n\n matchedObject?: object\n\n textSearchAdapter?: TextSearchAdapterType\n\n relevance?: SearchType\n\n trackId?: string\n\n score: number\n\n locString?: string\n\n results?: BaseResult[]\n constructor(args: BaseResultArgs) {\n this.label = args.label\n this.locString = args.locString\n this.renderingComponent = args.renderingComponent\n this.displayString = args.displayString\n this.matchedAttribute = args.matchedAttribute\n this.matchedObject = args.matchedObject\n this.textSearchAdapter = args.textSearchAdapter\n this.relevance = args.relevance\n this.trackId = args.trackId\n this.score = args.score || 1\n this.results = args.results || []\n }\n\n getLabel() {\n return this.label\n }\n\n getDisplayString() {\n return this.displayString || this.label\n }\n\n getRenderingComponent() {\n return this.renderingComponent\n }\n\n getTrackId() {\n return this.trackId\n }\n\n getScore() {\n return this.score\n }\n\n updateScore(newScore: number) {\n this.score = newScore\n return this.score\n }\n\n getId() {\n return `${this.getLabel()}-${this.getLocation()}-${this.getTrackId()}`\n }\n\n hasLocation() {\n return !!this.locString\n }\n\n getLocation() {\n return this.locString\n }\n\n getComboResults() {\n return this.results\n }\n}\n\nexport class RefSequenceResult extends BaseResult {\n refName: string\n\n constructor(args: BaseResultArgs) {\n super(args)\n this.refName = args.refName ?? ''\n }\n\n getLocation() {\n return this.refName\n }\n}\n","import BaseResult from './BaseResults'\nimport PluginManager from '../PluginManager'\nimport QuickLRU from '../util/QuickLRU'\nimport {\n BaseTextSearchAdapter,\n BaseTextSearchArgs,\n} from '../data_adapters/BaseAdapter'\nimport { readConfObject, AnyConfigurationModel } from '../configuration'\n\nexport interface SearchScope {\n includeAggregateIndexes: boolean\n assemblyName: string\n tracks?: string[]\n}\n\nexport default class TextSearchManager {\n adapterCache = new QuickLRU<string, BaseTextSearchAdapter>({\n maxSize: 15,\n })\n\n constructor(public pluginManager: PluginManager) {}\n\n loadTextSearchAdapters(searchScope: SearchScope) {\n return Promise.all(\n this.relevantAdapters(searchScope).map(async conf => {\n const adapterId = readConfObject(conf, 'textSearchAdapterId')\n const r = this.adapterCache.get(adapterId)\n if (r) {\n return r\n } else {\n const adapterType = this.pluginManager.getTextSearchAdapterType(\n conf.type,\n )!\n const AdapterClass = await adapterType.getAdapterClass()\n const adapterInstance = new AdapterClass(\n conf,\n undefined,\n this.pluginManager,\n ) as BaseTextSearchAdapter\n this.adapterCache.set(adapterId, adapterInstance)\n return adapterInstance\n }\n }),\n )\n }\n\n relevantAdapters(searchScope: SearchScope) {\n const rootModel = this.pluginManager.rootModel\n const { aggregateTextSearchAdapters } = rootModel?.jbrowse as {\n aggregateTextSearchAdapters: AnyConfigurationModel[]\n }\n const { tracks } = rootModel?.session as {\n tracks: AnyConfigurationModel[]\n }\n\n const { assemblyName } = searchScope\n\n return [\n ...this.getAdaptersWithAssembly(\n assemblyName,\n aggregateTextSearchAdapters,\n ),\n ...this.getTrackAdaptersWithAssembly(assemblyName, tracks),\n ]\n }\n\n getAdaptersWithAssembly(\n assemblyName: string,\n confs: AnyConfigurationModel[],\n ): AnyConfigurationModel[] {\n return confs.filter(c =>\n readConfObject(c, 'assemblyNames')?.includes(assemblyName),\n )\n }\n\n getTrackAdaptersWithAssembly(\n assemblyName: string,\n confs: AnyConfigurationModel[],\n ) {\n return confs\n .filter(conf =>\n readConfObject(conf, [\n 'textSearching',\n 'textSearchAdapter',\n 'assemblyNames',\n ])?.includes(assemblyName),\n )\n .map(\n conf => conf.textSearching.textSearchAdapter as AnyConfigurationModel,\n )\n }\n\n /**\n * Returns list of relevant results given a search query and options\n *\n * @param args - search options/arguments include: search query limit of\n * results to return, searchType...prefix | full | exact\", etc.\n */\n async search(\n args: BaseTextSearchArgs,\n searchScope: SearchScope,\n rankFn: (results: BaseResult[]) => BaseResult[],\n ) {\n const adapters = await this.loadTextSearchAdapters(searchScope)\n const results = await Promise.all(adapters.map(a => a.searchIndex(args)))\n return this.sortResults(results.flat(), rankFn)\n }\n\n /**\n * Returns array of revelevant and sorted results\n * @param results - array of results from all text search adapters\n * @param rankFn - function that updates results scores\n * based on more relevance\n */\n sortResults(\n results: BaseResult[],\n rankFn: (results: BaseResult[]) => BaseResult[],\n ) {\n return rankFn(\n results.sort((a, b) => -b.getLabel().localeCompare(a.getLabel())),\n ).sort((r1, r2) => r1.getScore() - r2.getScore())\n }\n}\n","import { types, IAnyModelType, IAnyComplexType } from 'mobx-state-tree'\nimport { stringToJexlExpression } from '../util/jexlStrings'\nimport { FileLocation } from '../util/types/mst'\nimport { getEnv } from '../util'\n\nfunction isValidColorString(/* str */) {\n // TODO: check all the crazy cases for whether it's a valid HTML/CSS color string\n return true\n}\nconst typeModels: Record<string, any> = {\n stringArray: types.array(types.string),\n stringArrayMap: types.map(types.array(types.string)),\n numberMap: types.map(types.number),\n boolean: types.boolean,\n color: types.refinement('Color', types.string, isValidColorString),\n integer: types.integer,\n number: types.number,\n string: types.string,\n text: types.string,\n fileLocation: FileLocation,\n frozen: types.frozen(),\n}\n\n// default values we use if the defaultValue is malformed or does not work\nconst fallbackDefaults: Record<string, any> = {\n stringArray: [],\n stringArrayMap: {},\n numberMap: {},\n boolean: true,\n color: 'black',\n integer: 1,\n number: 1,\n string: '',\n text: '',\n fileLocation: { uri: '/path/to/resource.txt', locationType: 'UriLocation' },\n frozen: {},\n}\n\nconst literalJSON = (self: { value: any }) => ({\n views: {\n get valueJSON() {\n return self.value\n },\n },\n})\n\nconst objectJSON = (self: { value: any }) => ({\n views: {\n get valueJSON() {\n return JSON.stringify(self.value)\n },\n },\n})\n\n// custom actions for modifying the value models\nconst typeModelExtensions: Record<string, (self: any) => any> = {\n fileLocation: objectJSON,\n number: literalJSON,\n integer: literalJSON,\n boolean: literalJSON,\n frozen: objectJSON,\n // special actions for working with stringArray slots\n stringArray: (self: { value: string[] }) => ({\n views: {\n get valueJSON() {\n return JSON.stringify(self.value)\n },\n },\n actions: {\n add(val: string) {\n self.value.push(val)\n },\n removeAtIndex(idx: number) {\n self.value.splice(idx, 1)\n },\n setAtIndex(idx: number, val: string) {\n self.value[idx] = val\n },\n },\n }),\n stringArrayMap: (self: { value: Map<string, string[]> }) => ({\n views: {\n get valueJSON() {\n return JSON.stringify(self.value)\n },\n },\n actions: {\n add(key: string, val: any) {\n self.value.set(key, val)\n },\n remove(key: string) {\n self.value.delete(key)\n },\n addToKey(key: string, val: string) {\n const ar = self.value.get(key)\n if (!ar) {\n throw new Error(`${key} not found`)\n }\n ar.push(val)\n },\n removeAtKeyIndex(key: string, idx: number) {\n const ar = self.value.get(key)\n if (!ar) {\n throw new Error(`${key} not found`)\n }\n ar.splice(idx, 1)\n },\n setAtKeyIndex(key: string, idx: number, val: string) {\n const ar = self.value.get(key)\n if (!ar) {\n throw new Error(`${key} not found`)\n }\n ar[idx] = val\n },\n },\n }),\n numberMap: (self: { value: Map<string, number> }) => ({\n views: {\n get valueJSON() {\n return JSON.stringify(self.value)\n },\n },\n actions: {\n add(key: string, val: number) {\n self.value.set(key, val)\n },\n remove(key: string) {\n self.value.delete(key)\n },\n },\n }),\n}\n\n// const FunctionStringType = types.refinement(\n// 'FunctionString',\n// types.string,\n// str => functionRegexp.test(str),\n// )\n\nconst JexlStringType = types.refinement('JexlString', types.string, str =>\n str.startsWith('jexl:'),\n)\nfunction json(value: any) {\n return value?.toJSON ? value.toJSON() : `\"${value}\"`\n}\nexport interface ConfigSlotDefinition {\n /** human-readable description of the slot's meaning */\n description?: string\n /** custom base MST model for the slot's value */\n model?: IAnyModelType | IAnyComplexType\n /** name of the type of slot, e.g. \"string\", \"number\", \"stringArray\" */\n type: string\n /** default value of the slot */\n defaultValue: any\n /** parameter names of the function callback */\n contextVariable?: string[]\n}\n\n/**\n * builds a MST model for a configuration slot\n *\n * @param slotName -\n * @param definition -\n */\nexport default function ConfigSlot(\n slotName: string,\n {\n description = '',\n model,\n type,\n defaultValue,\n contextVariable = [],\n }: ConfigSlotDefinition,\n) {\n if (!type) {\n throw new Error('type name required')\n }\n if (!model) {\n model = typeModels[type]\n }\n if (!model) {\n throw new Error(\n `no builtin config slot type \"${type}\", and no 'model' param provided`,\n )\n }\n\n if (defaultValue === undefined) {\n throw new Error(\"no 'defaultValue' provided\")\n }\n\n // if the `type` is something like `color`, then the model name\n // here will be `ColorConfigSlot`\n const configSlotModelName = `${slotName\n .charAt(0)\n .toUpperCase()}${slotName.slice(1)}ConfigSlot`\n let slot = types\n .model(configSlotModelName, {\n name: types.literal(slotName),\n description: types.literal(description),\n type: types.literal(type),\n value: types.optional(types.union(JexlStringType, model), defaultValue),\n })\n .volatile(() => ({\n contextVariable,\n }))\n .views(self => ({\n get isCallback() {\n return String(self.value).startsWith('jexl:')\n },\n }))\n .views(self => ({\n get expr() {\n if (self.isCallback) {\n // compile as jexl function\n const { pluginManager } = getEnv(self)\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!pluginManager && typeof jest === 'undefined') {\n console.warn(\n 'no pluginManager detected on config env (if you dynamically instantiate a config, for example in renderProps for your display model, check that you add the env argument)',\n )\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return stringToJexlExpression(String(self.value), pluginManager?.jexl)\n }\n return { evalSync: () => self.value }\n },\n\n // JS representation of the value of this slot, suitable\n // for embedding in either JSON or a JS function string.\n // many of the data types override this in typeModelExtensions\n get valueJSON(): any[] | Record<string, any> | string | undefined {\n if (self.isCallback) {\n return undefined\n }\n\n return json(self.value)\n },\n }))\n .preProcessSnapshot(val =>\n typeof val === 'object' && val.name === slotName\n ? val\n : {\n name: slotName,\n description,\n type,\n value: val,\n },\n )\n .postProcessSnapshot(snap => {\n if (typeof snap.value === 'object') {\n return JSON.stringify(snap.value) !== JSON.stringify(defaultValue)\n ? snap.value\n : undefined\n }\n return snap.value !== defaultValue ? snap.value : undefined\n })\n .actions(self => ({\n set(newVal: any) {\n self.value = newVal\n },\n reset() {\n self.value = defaultValue\n },\n convertToCallback() {\n if (self.isCallback) {\n return\n }\n self.value = `jexl:${self.valueJSON || \"''\"}`\n },\n convertToValue() {\n if (!self.isCallback) {\n return\n }\n // try calling it with no arguments\n try {\n const funcResult = self.expr.evalSync()\n if (funcResult !== undefined) {\n self.value = funcResult\n return\n }\n } catch (e) {\n /* ignore */\n }\n self.value = defaultValue\n // if it is still a callback (happens if the defaultValue is a\n // callback), then use the last-resort fallback default\n // if defaultValue has jexl: string, run this part\n if (!(type in fallbackDefaults)) {\n throw new Error(`no fallbackDefault defined for type ${type}`)\n }\n self.value = fallbackDefaults[type]\n },\n }))\n\n // if there are any type-specific extensions (views or actions)\n // to the slot, add those in\n if (typeModelExtensions[type]) {\n slot = slot.extend(typeModelExtensions[type])\n }\n\n const completeModel = types.optional(slot, {\n name: slotName,\n type,\n description,\n value: defaultValue,\n })\n const m = completeModel\n Object.defineProperty(m, 'isJBrowseConfigurationSlot', { value: true })\n return m\n}\n","import {\n types,\n isStateTreeNode,\n isType,\n isLateType,\n getSnapshot,\n IAnyType,\n SnapshotOut,\n} from 'mobx-state-tree'\n\nimport { ElementId } from '../util/types/mst'\n\nimport ConfigSlot, { ConfigSlotDefinition } from './configurationSlot'\nimport { isConfigurationSchemaType } from './util'\nimport { AnyConfigurationSchemaType } from './types'\n\nexport type {\n AnyConfigurationSchemaType,\n AnyConfigurationModel,\n AnyConfigurationSlot,\n AnyConfigurationSlotType,\n} from './types'\n\nfunction isEmptyObject(thing: unknown) {\n return (\n typeof thing === 'object' &&\n !Array.isArray(thing) &&\n thing !== null &&\n Object.keys(thing).length === 0\n )\n}\n\nfunction isEmptyArray(thing: unknown) {\n return Array.isArray(thing) && thing.length === 0\n}\n\nexport interface ConfigurationSchemaDefinition {\n [n: string]:\n | ConfigSlotDefinition\n | ConfigurationSchemaDefinition\n | string\n | number\n | IAnyType\n}\n\nexport interface ConfigurationSchemaOptions<\n BASE_SCHEMA extends AnyConfigurationSchemaType | undefined,\n EXPLICIT_IDENTIFIER extends string | undefined,\n> {\n explicitlyTyped?: boolean\n explicitIdentifier?: EXPLICIT_IDENTIFIER\n implicitIdentifier?: string | boolean\n baseConfiguration?: BASE_SCHEMA\n\n actions?: (self: unknown) => any\n views?: (self: unknown) => any\n extend?: (self: unknown) => any\n preProcessSnapshot?: (\n snapshot: Record<string, unknown>,\n ) => Record<string, unknown>\n}\n\nfunction preprocessConfigurationSchemaArguments(\n modelName: string,\n inputSchemaDefinition: ConfigurationSchemaDefinition,\n inputOptions: ConfigurationSchemaOptions<any, any> = {},\n) {\n if (typeof modelName !== 'string') {\n throw new Error(\n 'first arg must be string name of the model that this config schema goes with',\n )\n }\n\n // if we have a base configuration schema that we are\n // extending, grab the slot definitions from that\n let schemaDefinition = inputSchemaDefinition\n let options = inputOptions\n if (inputOptions.baseConfiguration?.jbrowseSchemaDefinition) {\n schemaDefinition = {\n ...inputOptions.baseConfiguration.jbrowseSchemaDefinition,\n ...schemaDefinition,\n }\n options = {\n ...inputOptions.baseConfiguration.jbrowseSchemaOptions,\n ...inputOptions,\n }\n options.baseConfiguration = undefined\n }\n return { schemaDefinition, options }\n}\n\nfunction makeConfigurationSchemaModel<\n DEFINITION extends ConfigurationSchemaDefinition,\n OPTIONS extends ConfigurationSchemaOptions<any, any>,\n>(modelName: string, schemaDefinition: DEFINITION, options: OPTIONS) {\n // now assemble the MST model of the configuration schema\n const modelDefinition: Record<string, any> = {}\n let identifier: string | undefined\n\n if (options.explicitlyTyped) {\n modelDefinition.type = types.optional(types.literal(modelName), modelName)\n }\n\n if (options.explicitIdentifier && options.implicitIdentifier) {\n throw new Error(\n `Cannot have both explicit and implicit identifiers in ${modelName}`,\n )\n }\n if (options.explicitIdentifier) {\n if (typeof options.explicitIdentifier === 'string') {\n modelDefinition[options.explicitIdentifier] = types.identifier\n identifier = options.explicitIdentifier\n } else {\n modelDefinition.id = types.identifier\n identifier = 'id'\n }\n } else if (options.implicitIdentifier) {\n if (typeof options.implicitIdentifier === 'string') {\n modelDefinition[options.implicitIdentifier] = ElementId\n identifier = options.implicitIdentifier\n } else {\n modelDefinition.id = ElementId\n identifier = 'id'\n }\n }\n\n const volatileConstants: Record<string, any> = {\n isJBrowseConfigurationSchema: true,\n jbrowseSchema: {\n modelName,\n definition: schemaDefinition,\n options,\n },\n }\n Object.entries(schemaDefinition).forEach(([slotName, slotDefinition]) => {\n if (\n (isType(slotDefinition) && isLateType(slotDefinition)) ||\n isConfigurationSchemaType(slotDefinition)\n ) {\n // this is either an MST late() type (which we assume to be a sub-configuration),\n // or an actual sub-configuration\n modelDefinition[slotName] = slotDefinition\n } else if (\n typeof slotDefinition === 'string' ||\n typeof slotDefinition === 'number'\n ) {\n volatileConstants[slotName] = slotDefinition\n } else if (typeof slotDefinition === 'object') {\n // this is a slot definition\n if (!slotDefinition.type) {\n throw new Error(`no type set for config slot ${modelName}.${slotName}`)\n }\n try {\n modelDefinition[slotName] = ConfigSlot(\n slotName,\n slotDefinition as ConfigSlotDefinition,\n )\n } catch (e) {\n throw new Error(\n `invalid config slot definition for ${modelName}.${slotName}: ${e}`,\n )\n }\n } else {\n throw new Error(\n `invalid configuration schema definition, \"${slotName}\" must be either a valid configuration slot definition, a constant, or a nested configuration schema`,\n )\n }\n })\n\n let completeModel = types\n .model(`${modelName}ConfigurationSchema`, modelDefinition)\n .actions(self => ({\n setSubschema(slotName: string, data: Record<string, unknown>) {\n if (!isConfigurationSchemaType(modelDefinition[slotName])) {\n throw new Error(`${slotName} is not a subschema, cannot replace`)\n }\n const newSchema = isStateTreeNode(data)\n ? data\n : modelDefinition[slotName].create(data)\n self[slotName] = newSchema\n return newSchema\n },\n }))\n\n if (Object.keys(volatileConstants).length) {\n completeModel = completeModel.volatile((/* self */) => volatileConstants)\n }\n if (options.actions) {\n completeModel = completeModel.actions(options.actions)\n }\n if (options.views) {\n completeModel = completeModel.views(options.views)\n }\n if (options.extend) {\n completeModel = completeModel.extend(options.extend)\n }\n\n const identifierDefault = identifier ? { [identifier]: 'placeholderId' } : {}\n const modelDefault = options.explicitlyTyped\n ? { type: modelName, ...identifierDefault }\n : identifierDefault\n\n const defaultSnap = getSnapshot(completeModel.create(modelDefault))\n completeModel = completeModel.postProcessSnapshot(snap => {\n const newSnap: SnapshotOut<typeof completeModel> = {}\n let matchesDefault = true\n // let keyCount = 0\n for (const [key, value] of Object.entries(snap)) {\n if (matchesDefault) {\n if (typeof defaultSnap[key] === 'object' && typeof value === 'object') {\n if (JSON.stringify(defaultSnap[key]) !== JSON.stringify(value)) {\n matchesDefault = false\n }\n } else if (defaultSnap[key] !== value) {\n matchesDefault = false\n }\n }\n if (\n value !== undefined &&\n volatileConstants[key] === undefined &&\n !isEmptyObject(value) &&\n !isEmptyArray(value)\n ) {\n // keyCount += 1\n newSnap[key] = value\n }\n }\n if (matchesDefault) {\n return {}\n }\n return newSnap\n })\n\n if (options.preProcessSnapshot) {\n completeModel = completeModel.preProcessSnapshot(options.preProcessSnapshot)\n }\n\n return types.optional(completeModel, modelDefault)\n}\n\nexport interface ConfigurationSchemaType<\n DEFINITION extends ConfigurationSchemaDefinition,\n OPTIONS extends ConfigurationSchemaOptions<any, any>,\n> extends ReturnType<typeof makeConfigurationSchemaModel<DEFINITION, OPTIONS>> {\n isJBrowseConfigurationSchema: boolean\n jbrowseSchemaDefinition: DEFINITION\n jbrowseSchemaOptions: OPTIONS\n type: string\n [key: string]: unknown\n}\n\nexport function ConfigurationSchema<\n DEFINITION extends ConfigurationSchemaDefinition,\n OPTIONS extends ConfigurationSchemaOptions<BASE_SCHEMA, EXPLICIT_IDENTIFIER>,\n BASE_SCHEMA extends AnyConfigurationSchemaType | undefined = undefined,\n EXPLICIT_IDENTIFIER extends string | undefined = undefined,\n>(\n modelName: string,\n inputSchemaDefinition: DEFINITION,\n inputOptions?: ConfigurationSchemaOptions<BASE_SCHEMA, EXPLICIT_IDENTIFIER>,\n): ConfigurationSchemaType<DEFINITION, OPTIONS> {\n const { schemaDefinition, options } = preprocessConfigurationSchemaArguments(\n modelName,\n inputSchemaDefinition,\n inputOptions,\n )\n const schemaType = makeConfigurationSchemaModel(\n modelName,\n schemaDefinition,\n options,\n ) as AnyConfigurationSchemaType\n // saving a couple of jbrowse-specific things in the type object. hope nobody gets mad.\n schemaType.isJBrowseConfigurationSchema = true\n schemaType.jbrowseSchemaDefinition = schemaDefinition\n schemaType.jbrowseSchemaOptions = options\n return schemaType\n}\n\nexport function ConfigurationReference<\n SCHEMATYPE extends AnyConfigurationSchemaType,\n>(schemaType: SCHEMATYPE) {\n // we cast this to SCHEMATYPE, because the reference *should* behave just\n // like the object it points to. It won't be undefined (this is a\n // `reference`, not a `safeReference`)\n return types.union(types.reference(schemaType), schemaType) as SCHEMATYPE\n}\n","import {\n isStateTreeNode,\n getSnapshot,\n getType,\n isMapType,\n isType,\n isUnionType,\n isOptionalType,\n isArrayType,\n isModelType,\n isLateType,\n} from 'mobx-state-tree'\n\nimport {\n getUnionSubTypes,\n getDefaultValue,\n getSubType,\n resolveLateType,\n} from '../util/mst-reflection'\n\nimport {\n AnyConfigurationModel,\n AnyConfigurationSchemaType,\n ConfigurationSlotName,\n ConfigurationSchemaForModel,\n} from './types'\n\n/**\n * given a configuration model (an instance of a ConfigurationSchema),\n * read the configuration variable at the given path\n *\n * @param model - instance of ConfigurationSchema\n * @param slotPaths - array of paths to read\n * @param args - extra arguments e.g. for a feature callback,\n * will be sent to each of the slotNames\n */\nexport function readConfObject<CONFMODEL extends AnyConfigurationModel>(\n confObject: CONFMODEL,\n slotPath?:\n | ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>>\n | string[],\n args: Record<string, unknown> = {},\n): any {\n if (!slotPath) {\n return JSON.parse(JSON.stringify(getSnapshot(confObject)))\n }\n if (typeof slotPath === 'string') {\n let slot = confObject[slotPath]\n // check for the subconf being a map if we don't find it immediately\n if (\n !slot &&\n isStateTreeNode(confObject) &&\n isMapType(getType(confObject))\n ) {\n slot = confObject.get(slotPath)\n }\n if (!slot) {\n return undefined\n // if we want to be very strict about config slots, we could uncomment the below\n // instead of returning undefined\n //\n // const modelType = getType(model)\n // const schemaType = model.configuration && getType(model.configuration)\n // throw new Error(\n // `no slot \"${slotName}\" found in ${modelType.name} configuration (${\n // schemaType.name\n // })`,\n // )\n }\n\n const val = slot.expr ? slot.expr.evalSync(args) : slot\n return isStateTreeNode(val)\n ? JSON.parse(JSON.stringify(getSnapshot(val)))\n : val\n }\n\n if (Array.isArray(slotPath)) {\n const slotName = slotPath[0]!\n if (slotPath.length > 1) {\n const newPath = slotPath.slice(1)\n let subConf = confObject[slotName]\n // check for the subconf being a map if we don't find it immediately\n if (\n !subConf &&\n isStateTreeNode(confObject) &&\n isMapType(getType(confObject))\n ) {\n subConf = confObject.get(slotName)\n }\n return subConf ? readConfObject(subConf, newPath, args) : undefined\n }\n return readConfObject(\n confObject,\n slotName as ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>>,\n args,\n )\n }\n throw new TypeError('slotPath must be a string or array')\n}\n\n/**\n * helper method for readConfObject, reads the config from a mst model\n *\n * @param model - object containing a 'configuration' member\n * @param slotPaths - array of paths to read\n * @param args - extra arguments e.g. for a feature callback,\n * will be sent to each of the slotNames\n */\nexport function getConf<CONFMODEL extends AnyConfigurationModel>(\n model: { configuration: CONFMODEL },\n slotPath?: Parameters<typeof readConfObject<CONFMODEL>>[1],\n args?: Parameters<typeof readConfObject<CONFMODEL>>[2],\n) {\n const { configuration } = model\n if (isConfigurationModel(configuration)) {\n return readConfObject<CONFMODEL>(configuration, slotPath, args)\n }\n throw new TypeError('cannot getConf on this model, it has no configuration')\n}\n\n/**\n * given a union of explicitly typed configuration schema types,\n * extract an array of the type names contained in the union\n *\n * @param unionType -\n * @returns Array of type names contained in the union\n */\nexport function getTypeNamesFromExplicitlyTypedUnion(maybeUnionType: unknown) {\n if (isType(maybeUnionType)) {\n maybeUnionType = resolveLateType(maybeUnionType)\n // @ts-expect-error\n if (isUnionType(maybeUnionType)) {\n const typeNames: string[] = []\n getUnionSubTypes(maybeUnionType).forEach(type => {\n type = resolveLateType(type)\n let typeName = getTypeNamesFromExplicitlyTypedUnion(type)\n if (!typeName.length) {\n const def = getDefaultValue(type)\n typeName = [def.type]\n }\n if (!typeName[0]) {\n // debugger\n throw new Error(`invalid config schema type ${type}`)\n }\n typeNames.push(...typeName)\n })\n return typeNames\n }\n }\n return []\n}\n\nexport function isBareConfigurationSchemaType(\n thing: unknown,\n): thing is AnyConfigurationSchemaType {\n if (isType(thing)) {\n if (\n isModelType(thing) &&\n ('isJBrowseConfigurationSchema' in thing ||\n thing.name.includes('ConfigurationSchema'))\n ) {\n return true\n }\n // if it's a late type, assume its a config schema\n if (isLateType(thing)) {\n return true\n }\n }\n return false\n}\n\nexport function isConfigurationSchemaType(\n thing: unknown,\n): thing is AnyConfigurationSchemaType {\n if (!isType(thing)) {\n return false\n }\n\n // written as a series of if-statements instead of a big logical OR\n // because this construction gives much better debugging backtraces.\n\n // also, note that the order of these statements matters, because\n // for example some union types are also optional types\n\n if (isBareConfigurationSchemaType(thing)) {\n return true\n }\n\n if (isUnionType(thing)) {\n return getUnionSubTypes(thing).every(\n t => isConfigurationSchemaType(t) || t.name === 'undefined',\n )\n }\n\n if (isOptionalType(thing) && isConfigurationSchemaType(getSubType(thing))) {\n return true\n }\n\n if (isArrayType(thing) && isConfigurationSchemaType(getSubType(thing))) {\n return true\n }\n\n if (isMapType(thing) && isConfigurationSchemaType(getSubType(thing))) {\n return true\n }\n\n return false\n}\n\nexport function isConfigurationModel(\n thing: unknown,\n): thing is AnyConfigurationModel {\n return isStateTreeNode(thing) && isConfigurationSchemaType(getType(thing))\n}\n\nexport function isConfigurationSlotType(thing: unknown) {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'isJBrowseConfigurationSlot' in thing\n )\n}\n","import { BaseAdapter } from './BaseAdapter'\nimport { BaseFeatureDataAdapter } from './BaseFeatureDataAdapter'\nimport { BaseRefNameAliasAdapter } from './BaseRefNameAliasAdapter'\nimport { BaseSequenceAdapter } from './BaseSequenceAdapter'\nimport { BaseTextSearchAdapter } from './BaseTextSearchAdapter'\nimport { RegionsAdapter } from './RegionsAdapter'\n\nexport type AnyDataAdapter =\n | BaseAdapter\n | BaseFeatureDataAdapter\n | BaseRefNameAliasAdapter\n | BaseTextSearchAdapter\n | RegionsAdapter\n | BaseSequenceAdapter\n\nexport function isSequenceAdapter(t: AnyDataAdapter): t is BaseSequenceAdapter {\n return 'getRegions' in t && 'getFeatures' in t\n}\n\nexport function isRegionsAdapter(t: AnyDataAdapter): t is RegionsAdapter {\n return 'getRegions' in t\n}\n\nexport function isFeatureAdapter(\n t: AnyDataAdapter,\n): t is BaseFeatureDataAdapter {\n return 'getFeatures' in t\n}\n\nexport function isRefNameAliasAdapter(t: object): t is BaseRefNameAliasAdapter {\n return 'getRefNameAliases' in t\n}\n\nexport function isTextSearchAdapter(\n t: AnyDataAdapter,\n): t is BaseTextSearchAdapter {\n return 'searchIndex' in t\n}\n","import { isStateTreeNode, getSnapshot } from 'mobx-state-tree'\n\n// locals\nimport { readConfObject, AnyConfigurationModel } from '../../configuration'\nimport { getSubAdapterType } from '../dataAdapterCache'\nimport { AugmentedRegion as Region } from '../../util/types'\nimport idMaker from '../../util/idMaker'\nimport PluginManager from '../../PluginManager'\nimport { ConfigurationSchema } from '../../configuration'\n\nconst EmptyConfig = ConfigurationSchema('empty', {})\n\nexport abstract class BaseAdapter {\n public id: string\n\n static capabilities = [] as string[]\n\n constructor(\n public config: AnyConfigurationModel = EmptyConfig.create(),\n public getSubAdapter?: getSubAdapterType,\n public pluginManager?: PluginManager,\n ) {\n // note: we use switch on jest here for more simple feature IDs\n // in test environment\n if (typeof jest === 'undefined') {\n const data = isStateTreeNode(config) ? getSnapshot(config) : config\n this.id = `${idMaker(data)}`\n } else {\n this.id = 'test'\n }\n }\n\n /**\n * Same as `readConfObject(this.config, arg)`.\n * Note: Does not offer the same TS type checking as `readConfObject`,\n * consider using that instead.\n */\n getConf(arg: string | string[]) {\n return readConfObject(this.config, arg)\n }\n\n /**\n * Called to provide a hint that data tied to a certain region will not be\n * needed for the foreseeable future and can be purged from caches, etc\n * @param region - Region\n */\n public abstract freeResources(region: Region): void\n}\n","import { Observable, firstValueFrom, merge } from 'rxjs'\nimport { toArray } from 'rxjs/operators'\n\n// locals\nimport { BaseAdapter } from './BaseAdapter'\nimport { BaseOptions } from './BaseOptions'\nimport { FeatureDensityStats } from './types'\nimport { ObservableCreate } from '../../util/rxjs'\nimport { checkAbortSignal, sum, max, min } from '../../util'\nimport { Feature } from '../../util/simpleFeature'\nimport { AugmentedRegion as Region } from '../../util/types'\nimport { blankStats, rectifyStats, scoresToStats } from '../../util/stats'\n\n/**\n * Base class for feature adapters to extend. Defines some methods that\n * subclasses must implement.\n */\nexport abstract class BaseFeatureDataAdapter extends BaseAdapter {\n /**\n * Get all reference sequence names used in the data source\n * Example:\n * public async getRefNames(opts?: BaseOptions): Promise\\<string[]\\> \\}\n * await this.setup()\n * const \\{ refNames \\} = this.metadata\n * return refNames\n * \\}\n *\n *\n * NOTE: If an adapter is unable to determine the reference sequence names,\n * the array will be empty\n * @param opts - Feature adapter options\n */\n public abstract getRefNames(opts?: BaseOptions): Promise<string[]>\n\n /**\n * Get features from the data source that overlap a region\n * Example:\n * public getFeatures(\n * region: Region,\n * opts: BaseOptions,\n * ): Observable<Feature> \\{\n * return ObservableCreate(observer =\\> \\{\n * const records = getRecords(assembly, refName, start, end)\n * records.forEach(record =\\> \\{\n * observer.next(this.recordToFeature(record))\n * \\})\n * observer.complete()\n * \\})\n * \\}\n * @param region - Region\n * @param opts - Feature adapter options\n * @returns Observable of Feature objects in the region\n */\n public abstract getFeatures(\n region: Region,\n opts?: BaseOptions,\n ): Observable<Feature>\n\n /**\n * Return \"header info\" that is fetched from the data file, or other info\n * that would not simply be in the config of the file. The return value can\n * be `{tag:string, data: any}[]` e.g. list of tags with their values which\n * is how VCF,BAM,CRAM return values for getInfo or it can be a nested JSON\n * object\n */\n public async getHeader(_opts?: BaseOptions): Promise<unknown> {\n return null\n }\n\n /**\n * Return info that is primarily used for interpreting the data that is there,\n * primarily in reference to being used for augmenting feature details panels\n */\n public async getMetadata(_opts?: BaseOptions): Promise<unknown> {\n return null\n }\n\n /**\n * Checks if the store has data for the given assembly and reference\n * sequence, and then gets the features in the region if it does.\n */\n public getFeaturesInRegion(region: Region, opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const hasData = await this.hasDataForRefName(region.refName, opts)\n checkAbortSignal(opts.signal)\n if (!hasData) {\n observer.complete()\n } else {\n this.getFeatures(region, opts).subscribe(observer)\n }\n })\n }\n\n /**\n * Checks if the store has data for the given assembly and reference\n * sequence, and then gets the features in the region if it does.\n *\n * Currently this just calls getFeatureInRegion for each region. Adapters that\n * are frequently called on multiple regions simultaneously may want to\n * implement a more efficient custom version of this method.\n *\n * Currently this just calls getFeatureInRegion for each region. Adapters that\n * are frequently called on multiple regions simultaneously may want to\n * implement a more efficient custom version of this method.\n *\n * @param regions - Regions\n * @param opts - Feature adapter options\n * @returns Observable of Feature objects in the regions\n */\n public getFeaturesInMultipleRegions(\n regions: Region[],\n opts: BaseOptions = {},\n ) {\n return merge(\n ...regions.map(region => this.getFeaturesInRegion(region, opts)),\n )\n }\n\n /**\n * Check if the store has data for the given reference name.\n * @param refName - Name of the reference sequence\n * @returns Whether data source has data for the given reference name\n */\n public async hasDataForRefName(refName: string, opts: BaseOptions = {}) {\n const refNames = await this.getRefNames(opts)\n return refNames.includes(refName)\n }\n\n /**\n * Calculates the minimum score, maximum score, and other statistics from\n * features over a region, primarily used for quantitative tracks\n */\n public async getRegionQuantitativeStats(region: Region, opts?: BaseOptions) {\n const feats = this.getFeatures(region, opts)\n return scoresToStats(region, feats)\n }\n /**\n * Calculates the minimum score, maximum score, and other statistics from\n * features over multiple regions, primarily used for quantitative tracks\n */\n public async getMultiRegionQuantitativeStats(\n regions: Region[] = [],\n opts?: BaseOptions,\n ) {\n if (!regions.length) {\n return blankStats()\n }\n const feats = await Promise.all(\n regions.map(region => this.getRegionQuantitativeStats(region, opts)),\n )\n\n const scoreMax = max(feats.map(a => a.scoreMax))\n const scoreMin = min(feats.map(a => a.scoreMin))\n const scoreSum = sum(feats.map(a => a.scoreSum))\n const scoreSumSquares = sum(feats.map(a => a.scoreSumSquares))\n const featureCount = sum(feats.map(a => a.featureCount))\n const basesCovered = sum(feats.map(a => a.basesCovered))\n\n return rectifyStats({\n scoreMin,\n scoreMax,\n featureCount,\n basesCovered,\n scoreSumSquares,\n scoreSum,\n })\n }\n\n /**\n * Calculates the \"feature density\" of a region. The primary purpose of this\n * API is to alert the user if they are going to be downloading too much\n * information, and give them a hint to zoom in to see more. The default\n * implementation samples from the regions, downloads feature data with\n * getFeatures, and returns an object with the form \\{featureDensity:number\\}\n *\n * Derived classes can override this to return alternative calculations for\n * featureDensity, or they can also return an object containing a byte size\n * calculation with the format \\{bytes:number, fetchSizeLimit:number\\} where\n * fetchSizeLimit is the adapter-defined limit for what it thinks is 'too\n * much data' (e.g. CRAM and BAM may vary on what they think too much data\n * is)\n */\n getRegionFeatureDensityStats(region: Region, opts?: BaseOptions) {\n let lastTime = +Date.now()\n const statsFromInterval = async (length: number, expansionTime: number) => {\n const { start, end } = region\n const sampleCenter = start * 0.75 + end * 0.25\n\n const features = await firstValueFrom(\n this.getFeatures(\n {\n ...region,\n start: Math.max(0, Math.round(sampleCenter - length / 2)),\n end: Math.min(Math.round(sampleCenter + length / 2), end),\n },\n opts,\n ).pipe(toArray()),\n )\n\n return maybeRecordStats(\n length,\n { featureDensity: features.length / length },\n features.length,\n expansionTime,\n )\n }\n\n const maybeRecordStats = async (\n interval: number,\n stats: FeatureDensityStats,\n statsSampleFeatures: number,\n expansionTime: number,\n ): Promise<FeatureDensityStats> => {\n const refLen = region.end - region.start\n if (statsSampleFeatures >= 70 || interval * 2 > refLen) {\n return stats\n } else if (expansionTime <= 5000) {\n const currTime = +Date.now()\n expansionTime += currTime - lastTime\n lastTime = currTime\n return statsFromInterval(interval * 2, expansionTime)\n } else {\n console.warn(\n \"Stats estimation reached timeout, or didn't get enough features\",\n )\n return { featureDensity: Number.POSITIVE_INFINITY }\n }\n }\n\n return statsFromInterval(1000, 0)\n }\n\n /**\n * Calculates the \"feature density\" of a set of regions. The primary purpose\n * of this API is to alert the user if they are going to be downloading too\n * much information, and give them a hint to zoom in to see more. The default\n * implementation samples from the regions, downloads feature data with\n * getFeatures, and returns an object with the form \\{featureDensity:number\\}\n *\n * Derived classes can override this to return alternative calculations for\n * featureDensity, or they can also return an object containing a byte size\n * calculation with the format \\{bytes:number, fetchSizeLimit:number\\} where\n * fetchSizeLimit is the adapter-defined limit for what it thinks is 'too\n * much data' (e.g. CRAM and BAM may vary on what they think too much data\n * is)\n */\n public async getMultiRegionFeatureDensityStats(\n regions: Region[],\n opts?: BaseOptions,\n ) {\n if (!regions.length) {\n throw new Error('No regions supplied')\n }\n return this.getRegionFeatureDensityStats(regions[0]!, opts)\n }\n}\n","import { NoAssemblyRegion } from '../../util'\nimport { BaseOptions } from './types'\nimport { RegionsAdapter } from '../BaseAdapter'\nimport { BaseFeatureDataAdapter } from './BaseFeatureDataAdapter'\n\nexport abstract class BaseSequenceAdapter\n extends BaseFeatureDataAdapter\n implements RegionsAdapter\n{\n async getMultiRegionFeatureDensityStats() {\n return { featureDensity: 0 }\n }\n\n /**\n * Fetches a list of 'regions' with refName, start, and extends\n */\n abstract getRegions(opts: BaseOptions): Promise<NoAssemblyRegion[]>\n}\n","import PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration'\nimport { AnyAdapter } from '../data_adapters/BaseAdapter'\n\nexport interface AdapterMetadata {\n category?: string\n hiddenFromGUI?: boolean\n description?: string\n}\n\nexport default class AdapterType extends PluggableElementBase {\n getAdapterClass: () => Promise<AnyAdapter>\n\n configSchema: AnyConfigurationSchemaType\n\n adapterCapabilities: string[]\n\n adapterMetadata?: AdapterMetadata\n\n constructor(\n stuff: {\n name: string\n configSchema: AnyConfigurationSchemaType\n displayName?: string\n adapterCapabilities?: string[]\n adapterMetadata?: AdapterMetadata\n } & (\n | {\n AdapterClass: AnyAdapter\n }\n | {\n getAdapterClass: () => Promise<AnyAdapter>\n }\n ),\n ) {\n super(stuff)\n this.getAdapterClass =\n 'AdapterClass' in stuff\n ? async () => stuff.AdapterClass\n : stuff.getAdapterClass\n this.configSchema = stuff.configSchema\n this.adapterCapabilities = stuff.adapterCapabilities || []\n this.adapterMetadata = stuff.adapterMetadata\n }\n}\n","import React from 'react'\nimport { IAnyModelType } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\n\ntype BasicComponent = React.ComponentType<{\n // TODO: can we use AbstractViewModel here?\n\n model: any\n}>\ntype AddTrackWorkflowComponentType =\n | React.LazyExoticComponent<BasicComponent>\n | BasicComponent\n\nexport default class AddTrackWorkflow extends PluggableElementBase {\n ReactComponent: AddTrackWorkflowComponentType\n\n stateModel: IAnyModelType\n\n constructor(stuff: {\n name: string\n ReactComponent: AddTrackWorkflowComponentType\n stateModel: IAnyModelType\n }) {\n super(stuff)\n this.ReactComponent = stuff.ReactComponent\n this.stateModel = stuff.stateModel\n }\n}\n","import { IAnyModelType } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration'\nimport { AnyReactComponentType } from '../util'\n\nexport default class ConnectionType extends PluggableElementBase {\n stateModel: IAnyModelType\n\n configSchema: AnyConfigurationSchemaType\n\n description: string\n\n url: string\n\n configEditorComponent?: AnyReactComponentType\n\n constructor(stuff: {\n name: string\n stateModel: IAnyModelType\n configSchema: AnyConfigurationSchemaType\n displayName: string\n description: string\n configEditorComponent?: AnyReactComponentType\n url: string\n }) {\n super(stuff)\n this.stateModel = stuff.stateModel\n this.configSchema = stuff.configSchema\n this.description = stuff.description\n this.url = stuff.url\n this.configEditorComponent = stuff.configEditorComponent\n }\n}\n","import { IAnyModelType } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport { AnyReactComponentType } from '../util'\nimport { AnyConfigurationSchemaType } from '../configuration'\n\nexport default class DisplayType extends PluggableElementBase {\n stateModel: IAnyModelType\n\n configSchema: AnyConfigurationSchemaType\n\n ReactComponent: AnyReactComponentType\n\n /**\n * The track type the display is associated with\n */\n trackType: string\n\n /*\n * Indicates that this display type can be a \"sub-display\" of another type of\n * display, e.g. in AlignmentsDisplay, has Pileup and SNPCoverage subDisplays\n */\n subDisplay?: {\n type: string\n [key: string]: unknown\n }\n\n /**\n * The view type the display is associated with\n */\n viewType: string\n\n constructor(stuff: {\n name: string\n stateModel: IAnyModelType\n trackType: string\n viewType: string\n displayName?: string\n subDisplay?: { type: string; [key: string]: unknown }\n configSchema: AnyConfigurationSchemaType\n ReactComponent: AnyReactComponentType\n }) {\n super(stuff)\n this.stateModel = stuff.stateModel\n this.subDisplay = stuff.subDisplay\n this.configSchema = stuff.configSchema\n this.ReactComponent = stuff.ReactComponent\n this.trackType = stuff.trackType\n this.viewType = stuff.viewType\n }\n}\n","import { IAnyModelType } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration/types'\n\nexport default class InternetAccountType extends PluggableElementBase {\n stateModel: IAnyModelType\n\n configSchema: AnyConfigurationSchemaType\n\n constructor(stuff: {\n name: string\n stateModel: IAnyModelType\n configSchema: AnyConfigurationSchemaType\n }) {\n super(stuff)\n this.stateModel = stuff.stateModel\n this.configSchema = stuff.configSchema\n }\n}\n","export default abstract class PluggableElementBase {\n name: string\n maybeDisplayName?: string\n\n constructor(args: { name?: string; displayName?: string }) {\n this.name = args.name || 'UNKNOWN'\n this.maybeDisplayName = args.displayName\n }\n\n get displayName() {\n return this.maybeDisplayName || this.name\n }\n}\n","// adapted from map-obj (MIT), with modifications to pass the \"whole object\"\n// from an array of objects into itself\nconst isObject = (value: unknown) => typeof value === 'object' && value !== null\n\n// Customized for this use-case\nconst isObjectCustom = (value: unknown) =>\n isObject(value) &&\n !(value instanceof RegExp) &&\n !(value instanceof Error) &&\n !(value instanceof Date) &&\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n !(globalThis.Blob && value instanceof globalThis.Blob)\n\ntype Obj = Record<string, unknown>\n\nexport default function map(\n object: Obj,\n mapper: (val: unknown) => void,\n isSeen = new WeakSet(),\n) {\n if (isSeen.has(object)) {\n return\n }\n\n isSeen.add(object)\n\n const mapArray = (array: unknown[]) => {\n array.forEach(element => {\n mapper(element)\n if (isObject(element)) {\n map(element as Record<string, unknown>, mapper, isSeen)\n }\n })\n }\n\n if (Array.isArray(object)) {\n mapArray(object)\n }\n\n for (const value of Object.values(object)) {\n mapper(value)\n\n if (isObjectCustom(value)) {\n if (Array.isArray(value)) {\n mapArray(value)\n } else {\n map(value as Obj, mapper, isSeen)\n }\n }\n }\n}\n","import mapObject from '../util/map-obj'\nimport PluginManager from '../PluginManager'\nimport PluggableElementBase from './PluggableElementBase'\nimport { setBlobMap, getBlobMap } from '../util/tracks'\nimport {\n isAppRootModel,\n isUriLocation,\n isAuthNeededException,\n RetryError,\n UriLocation,\n} from '../util/types'\n\nimport {\n deserializeAbortSignal,\n isRemoteAbortSignal,\n RemoteAbortSignal,\n} from '../rpc/remoteAbortSignals'\n\ninterface SerializedArgs {\n signal?: RemoteAbortSignal\n blobMap?: Record<string, File>\n}\nexport type RpcMethodConstructor = new (pm: PluginManager) => RpcMethodType\n\nexport default abstract class RpcMethodType extends PluggableElementBase {\n constructor(public pluginManager: PluginManager) {\n super({})\n }\n\n async serializeArguments(\n args: Record<string, unknown>,\n rpcDriverClassName: string,\n ): Promise<Record<string, unknown>> {\n const blobMap = getBlobMap()\n await this.augmentLocationObjects(args, rpcDriverClassName)\n return { ...args, blobMap }\n }\n\n async serializeNewAuthArguments(\n loc: UriLocation,\n rpcDriverClassName: string,\n ) {\n const rootModel = this.pluginManager.rootModel\n\n // args dont need auth or already have auth\n if (!isAppRootModel(rootModel) || loc.internetAccountPreAuthorization) {\n return loc\n }\n\n const account = rootModel.findAppropriateInternetAccount(loc)\n\n // mutating loc object is not allowed in MainThreadRpcDriver, and is only\n // needed for web worker RPC\n if (account && rpcDriverClassName !== 'MainThreadRpcDriver') {\n loc.internetAccountPreAuthorization =\n await account.getPreAuthorizationInformation(loc)\n }\n return loc\n }\n\n async deserializeArguments<T extends SerializedArgs>(\n serializedArgs: T,\n _rpcDriverClassName: string,\n ) {\n if (serializedArgs.blobMap) {\n setBlobMap(serializedArgs.blobMap)\n }\n const { signal } = serializedArgs\n\n return {\n ...serializedArgs,\n signal: isRemoteAbortSignal(signal)\n ? deserializeAbortSignal(signal)\n : undefined,\n }\n }\n\n abstract execute(\n serializedArgs: unknown,\n rpcDriverClassName: string,\n ): Promise<unknown>\n\n async serializeReturn(\n originalReturn: unknown,\n _args: unknown,\n _rpcDriverClassName: string,\n ) {\n return originalReturn\n }\n\n async deserializeReturn(\n serializedReturn: unknown,\n _args: unknown,\n _rpcDriverClassName: string,\n ) {\n let r: unknown\n try {\n r = await serializedReturn\n } catch (error) {\n if (isAuthNeededException(error)) {\n const retryAccount = // @ts-expect-error\n this.pluginManager.rootModel?.createEphemeralInternetAccount(\n `HTTPBasicInternetAccount-${new URL(error.url).origin}`,\n {},\n error.url,\n )\n throw new RetryError(\n 'Retrying with created internet account',\n retryAccount.internetAccountId,\n )\n }\n throw error\n }\n return r\n }\n\n private async augmentLocationObjects(\n thing: Record<string, unknown>,\n rpcDriverClassName: string,\n ) {\n const uris = [] as UriLocation[]\n\n // using map-obj avoids cycles, seen in circular view svg export\n mapObject(thing, val => {\n if (isUriLocation(val)) {\n uris.push(val)\n }\n })\n for (const uri of uris) {\n await this.serializeNewAuthArguments(uri, rpcDriverClassName)\n }\n return thing\n }\n}\n","import PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration'\nimport { AnyAdapter } from '../data_adapters/BaseAdapter'\n\nexport default class TextSearchAdapterType extends PluggableElementBase {\n getAdapterClass: () => Promise<AnyAdapter>\n\n configSchema: AnyConfigurationSchemaType\n\n description?: string\n\n constructor(\n stuff: {\n name: string\n displayName?: string\n description?: string\n configSchema: AnyConfigurationSchemaType\n } & (\n | {\n AdapterClass: AnyAdapter\n }\n | {\n getAdapterClass: () => Promise<AnyAdapter>\n }\n ),\n ) {\n super(stuff)\n this.description = stuff.description\n this.configSchema = stuff.configSchema\n this.getAdapterClass =\n 'getAdapterClass' in stuff\n ? stuff.getAdapterClass\n : async () => stuff.AdapterClass\n }\n}\n","import { IAnyModelType } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration'\nimport DisplayType from './DisplayType'\n\nexport default class TrackType extends PluggableElementBase {\n stateModel: IAnyModelType\n\n configSchema: AnyConfigurationSchemaType\n\n displayTypes: DisplayType[] = []\n\n constructor(stuff: {\n name: string\n stateModel: IAnyModelType\n displayName?: string\n configSchema: AnyConfigurationSchemaType\n }) {\n super(stuff)\n this.stateModel = stuff.stateModel\n this.configSchema = stuff.configSchema\n }\n\n addDisplayType(display: DisplayType) {\n this.displayTypes.push(display)\n }\n}\n","import React from 'react'\nimport { IAnyModelType, IAnyStateTreeNode } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport DisplayType from './DisplayType'\n\ntype BasicView = React.ComponentType<{\n // TODO: can we use AbstractViewModel here?\n\n model: any\n session?: IAnyStateTreeNode\n}>\ntype ViewComponentType = React.LazyExoticComponent<BasicView> | BasicView\n\nexport default class ViewType extends PluggableElementBase {\n ReactComponent: ViewComponentType\n\n stateModel: IAnyModelType\n\n displayTypes: DisplayType[] = []\n\n // extendedName can be used for when you extend a given view type, and want\n // to register all of that view types displays to yourself\n //\n // e.g. you create a linear-genome-view subtype, and want all the tracks that\n // are compatible display types for the linear-genome-view to be compatible\n // with your type also (without this, display types are only registered to a\n // single view type)\n extendedName?: string\n\n constructor(stuff: {\n name: string\n displayName?: string\n ReactComponent: ViewComponentType\n stateModel: IAnyModelType\n extendedName?: string\n }) {\n super(stuff)\n this.ReactComponent = stuff.ReactComponent\n this.stateModel = stuff.stateModel\n this.extendedName = stuff.extendedName\n }\n\n addDisplayType(display: DisplayType) {\n this.displayTypes.push(display)\n }\n}\n","import React, { ComponentType, LazyExoticComponent } from 'react'\nimport { IAnyModelType, IAnyStateTreeNode } from 'mobx-state-tree'\nimport PluggableElementBase from './PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../configuration'\n\ntype WidgetComponentType = LazyExoticComponent<React.FC<any>> | React.FC<any>\n\ntype HeadingComponentType = ComponentType<{ model: IAnyStateTreeNode }>\n\nexport default class WidgetType extends PluggableElementBase {\n heading?: string\n\n configSchema: AnyConfigurationSchemaType\n\n HeadingComponent?: HeadingComponentType\n\n ReactComponent: WidgetComponentType\n\n stateModel: IAnyModelType\n\n constructor(stuff: {\n name: string\n heading?: string\n HeadingComponent?: HeadingComponentType\n configSchema: AnyConfigurationSchemaType\n stateModel: IAnyModelType\n ReactComponent: WidgetComponentType\n }) {\n super(stuff)\n this.heading = stuff.heading\n this.HeadingComponent = stuff.HeadingComponent\n this.configSchema = stuff.configSchema\n this.stateModel = stuff.stateModel\n this.ReactComponent = stuff.ReactComponent\n }\n}\n","import { types, Instance } from 'mobx-state-tree'\nimport { ElementId } from '../../util/types/mst'\nimport { MenuItem } from '../../ui'\nimport { Region } from '../../util/types/mst'\n\n/**\n * #stateModel BaseViewModel\n * #category view\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BaseViewModel = types\n .model('BaseView', {\n /**\n * #property\n */\n id: ElementId,\n\n /**\n * #property\n * displayName is displayed in the header of the view, or assembly names\n * being used if none is specified\n */\n displayName: types.maybe(types.string),\n\n /**\n * #property\n */\n minimized: false,\n })\n .volatile(() => ({\n width: 800,\n }))\n .views(() => ({\n /**\n * #getter\n */\n menuItems(): MenuItem[] {\n return []\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setDisplayName(name: string) {\n self.displayName = name\n },\n\n /**\n * #action\n * width is an important attribute of the view model, when it becomes set, it\n * often indicates when the app can start drawing to it. certain views like\n * lgv are strict about this because if it tries to draw before it knows the\n * width it should draw to, it may start fetching data for regions it doesn't\n * need to\n *\n * setWidth is updated by a ResizeObserver generally, the views often need\n * to know how wide they are to properly draw genomic regions\n */\n setWidth(newWidth: number) {\n self.width = newWidth\n },\n\n /**\n * #action\n */\n setMinimized(flag: boolean) {\n self.minimized = flag\n },\n }))\n\nexport default BaseViewModel\n\nexport type IBaseViewModel = Instance<typeof BaseViewModel>\n\nexport const BaseViewModelWithDisplayedRegions = BaseViewModel.props({\n displayedRegions: types.array(Region),\n})\nexport type IBaseViewModelWithDisplayedRegions = Instance<\n typeof BaseViewModelWithDisplayedRegions\n>\n","import type { Instance } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '../../configuration'\n\n/**\n * #config BaseConnection\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BaseConnectionConfig = ConfigurationSchema(\n 'BaseConnection',\n {\n /**\n * #slot\n */\n name: {\n type: 'string',\n defaultValue: 'nameOfConnection',\n description: 'a unique name for this connection',\n },\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description: 'optional list of names of assemblies in this connection',\n },\n },\n {\n explicitlyTyped: true,\n /**\n * #identifier\n */\n explicitIdentifier: 'connectionId',\n },\n)\n\nexport default BaseConnectionConfig\nexport type BaseConnectionConfigSchema = typeof BaseConnectionConfig\nexport type BaseConnectionConfigModel = Instance<BaseConnectionConfigSchema>\n","import { cast, types } from 'mobx-state-tree'\nimport {\n AnyConfigurationModel,\n ConfigurationReference,\n} from '../../configuration'\nimport PluginManager from '../../PluginManager'\n\nimport configSchema from './baseConnectionConfig'\n\ntype TrackConf = AnyConfigurationModel | Record<string, unknown>\n\n/**\n * #stateModel BaseConnectionModel\n */\nfunction stateModelFactory(pluginManager: PluginManager) {\n return types\n .model('Connection', {\n /**\n * #property\n */\n name: types.identifier,\n /**\n * #property\n */\n tracks: types.array(pluginManager.pluggableConfigSchemaType('track')),\n\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .actions(() => ({\n /**\n * #action\n */\n connect(_arg: AnyConfigurationModel) {},\n }))\n .actions(self => ({\n afterAttach() {\n if (self.tracks.length === 0) {\n self.connect(self.configuration)\n }\n },\n /**\n * #action\n */\n addTrackConf(trackConf: TrackConf) {\n const length = self.tracks.push(trackConf)\n return self.tracks[length - 1]\n },\n /**\n * #action\n */\n addTrackConfs(trackConfs: TrackConf[]) {\n self.tracks.push(...trackConfs)\n },\n /**\n * #action\n */\n setTrackConfs(trackConfs: AnyConfigurationModel[]) {\n self.tracks = cast(trackConfs)\n },\n /**\n * #action\n */\n clear() {},\n }))\n}\n\nexport type BaseConnectionModel = ReturnType<typeof stateModelFactory>\nexport default stateModelFactory\n","import React from 'react'\nimport { getParent, Instance, types, isRoot } from 'mobx-state-tree'\n\n// locals\nimport { getConf } from '../../configuration'\nimport { MenuItem } from '../../ui'\nimport { getParentRenderProps } from '../../util/tracks'\nimport { getContainingView, getEnv } from '../../util'\nimport { ElementId } from '../../util/types/mst'\n\n/**\n * #stateModel BaseDisplay\n * #category display\n */\nfunction stateModelFactory() {\n return types\n .model('BaseDisplay', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.string,\n /**\n * #property\n */\n rpcDriverName: types.maybe(types.string),\n })\n .volatile(() => ({\n rendererTypeName: '',\n error: undefined as unknown,\n message: undefined as string | undefined,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get RenderingComponent(): React.FC<{\n model: typeof self\n onHorizontalScroll?: () => void\n blockState?: Record<string, any>\n }> {\n const { pluginManager } = getEnv(self)\n return pluginManager.getDisplayType(self.type)!\n .ReactComponent as React.FC<{\n model: typeof self\n onHorizontalScroll?: () => void\n blockState?: Record<string, any>\n }>\n },\n\n /**\n * #getter\n */\n get DisplayBlurb(): React.FC<{ model: typeof self }> | null {\n return null\n },\n\n /**\n * #getter\n */\n get adapterConfig() {\n return getConf(this.parentTrack, 'adapter')\n },\n\n /**\n * #getter\n */\n get parentTrack() {\n let track = getParent<any>(self)\n while (!(track.configuration && getConf(track, 'trackId'))) {\n if (isRoot(track)) {\n throw new Error(`No parent track found for ${self.type} ${self.id}`)\n }\n track = getParent<any>(track)\n }\n return track\n },\n\n /**\n * #method\n * the react props that are passed to the Renderer when data\n * is rendered in this display\n */\n renderProps() {\n return {\n ...getParentRenderProps(self),\n notReady: getContainingView(self).minimized,\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n }\n },\n\n /**\n * #getter\n * the pluggable element type object for this display's renderer\n */\n get rendererType() {\n const { pluginManager } = getEnv(self)\n return pluginManager.getRendererType(self.rendererTypeName)!\n },\n\n /**\n * #getter\n * if a display-level message should be displayed instead, make this\n * return a react component\n */\n get DisplayMessageComponent() {\n return undefined as undefined | React.FC<any>\n },\n /**\n * #method\n */\n trackMenuItems(): MenuItem[] {\n return []\n },\n\n /**\n * #getter\n */\n get viewMenuActions(): MenuItem[] {\n return []\n },\n /**\n * #method\n * @param region -\n * @returns falsy if the region is fine to try rendering. Otherwise,\n * return a react node + string of text. string of text describes why it\n * cannot be rendered react node allows user to force load at current\n * setting\n */\n regionCannotBeRendered(/* region */) {\n return null\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setMessage(arg?: string) {\n self.message = arg\n },\n /**\n * #action\n */\n setError(error?: unknown) {\n self.error = error\n },\n /**\n * #action\n */\n setRpcDriverName(rpcDriverName: string) {\n self.rpcDriverName = rpcDriverName\n },\n /**\n * #action\n * base display reload does nothing, see specialized displays for details\n */\n reload() {},\n }))\n}\n\nexport const BaseDisplay = stateModelFactory()\nexport type BaseDisplayStateModel = typeof BaseDisplay\nexport type BaseDisplayModel = Instance<BaseDisplayStateModel>\n","import { ConfigurationSchema } from '../../configuration'\n\n/**\n * #config BaseInternetAccount\n * the \"base\" internet account type\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport const BaseInternetAccountConfig = ConfigurationSchema(\n 'InternetAccount',\n {\n /**\n * #slot\n */\n name: {\n description: 'descriptive name of the internet account',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n description: {\n description: 'a description of the internet account',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n authHeader: {\n description: 'request header for credentials',\n type: 'string',\n defaultValue: 'Authorization',\n },\n /**\n * #slot\n */\n tokenType: {\n description: 'a custom name for a token to include in the header',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n domains: {\n description:\n 'array of valid domains the url can contain to use this account',\n type: 'stringArray',\n defaultValue: [],\n },\n },\n {\n /**\n * #identifier\n */\n explicitIdentifier: 'internetAccountId',\n explicitlyTyped: true,\n },\n)\n","import React from 'react'\nimport { Instance, types } from 'mobx-state-tree'\nimport { ConfigurationReference, getConf } from '../../configuration'\nimport { RemoteFileWithRangeCache } from '../../util/io'\nimport { ElementId } from '../../util/types/mst'\nimport { UriLocation, AnyReactComponentType } from '../../util/types'\nimport { BaseInternetAccountConfig } from './baseInternetAccountConfig'\n\nconst inWebWorker = typeof sessionStorage === 'undefined'\n\n/**\n * #stateModel BaseInternetAccountModel\n * #category internetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport const InternetAccount = types\n .model('InternetAccount', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.string,\n /**\n * #property\n */\n configuration: ConfigurationReference(BaseInternetAccountConfig),\n })\n .views(self => ({\n /**\n * #getter\n */\n get name(): string {\n return getConf(self, 'name')\n },\n /**\n * #getter\n */\n get description(): string {\n return getConf(self, 'description')\n },\n /**\n * #getter\n */\n get internetAccountId(): string {\n return getConf(self, 'internetAccountId') // NOTE: this is the explicitIdentifier of the config schema\n },\n /**\n * #getter\n */\n get authHeader(): string {\n return getConf(self, 'authHeader')\n },\n /**\n * #getter\n */\n get tokenType(): string {\n return getConf(self, 'tokenType')\n },\n /**\n * #getter\n */\n get domains(): string[] {\n return getConf(self, 'domains')\n },\n /**\n * #getter\n * Can use this to customize what is displayed in fileSelector's toggle box\n */\n get toggleContents(): React.ReactNode {\n return null\n },\n /**\n * #getter\n * Can use this to customize what the fileSelector. It takes a prop called\n * `setLocation` that should be used to set a UriLocation\n */\n get SelectorComponent(): AnyReactComponentType | undefined {\n return undefined\n },\n /**\n * #getter\n * Can use this to add a label to the UrlChooser. Has no effect if a custom\n * SelectorComponent is supplied\n */\n get selectorLabel(): string | undefined {\n return undefined\n },\n }))\n .views(self => ({\n /**\n * #method\n * Determine whether this internetAccount provides credentials for a URL\n * @param location - UriLocation of resource\n * @returns true or false\n */\n handlesLocation(location: UriLocation) {\n return self.domains.some(domain => location.uri.includes(domain))\n },\n /**\n * #getter\n * The key used to store this internetAccount's token in sessionStorage\n */\n get tokenKey() {\n return `${self.internetAccountId}-token`\n },\n }))\n .actions(self => ({\n /**\n * #action\n * Must be implemented by a model extending or composing this one. Pass the\n * user's token to `resolve`.\n * @param resolve - Pass the token to this function\n * @param reject - If there is an error getting the token, call this function\n */\n getTokenFromUser(\n _resolve: (token: string) => void,\n _reject: (error: Error) => void,\n ): void {\n throw new Error('getTokenFromUser must be implemented by extending model')\n },\n /**\n * #action\n */\n storeToken(token: string) {\n sessionStorage.setItem(self.tokenKey, token)\n },\n /**\n * #action\n */\n removeToken() {\n sessionStorage.removeItem(self.tokenKey)\n },\n /**\n * #action\n */\n retrieveToken() {\n return sessionStorage.getItem(self.tokenKey)\n },\n /**\n * #action\n * This can be used by an internetAccount to validate a token works before\n * it is used. This is run when preAuthorizationInformation is requested,\n * so it can be used to check that a token is valid before sending it to a\n * worker thread. It expects the token to be returned so that this action\n * can also be used to generate a new token (e.g. by using a refresh token)\n * if the original one was invalid. Should throw an error if a token is\n * invalid.\n *\n * @param token - Auth token\n * @param loc - UriLocation of the resource\n * @returns - Valid auth token\n */\n async validateToken(token: string, _loc: UriLocation) {\n return token\n },\n }))\n .actions(self => {\n let tokenPromise: Promise<string> | undefined = undefined\n return {\n /**\n * #action\n * Try to get the token from the location pre-auth, from local storage,\n * or from a previously cached promise. If token is not available, uses\n * `getTokenFromUser`.\n *\n * @param location - UriLocation of the resource\n * @returns A promise for the token\n */\n async getToken(location?: UriLocation): Promise<string> {\n if (tokenPromise) {\n return tokenPromise\n }\n let token = location?.internetAccountPreAuthorization?.authInfo?.token\n if (token) {\n tokenPromise = Promise.resolve(token)\n return tokenPromise\n }\n if (inWebWorker) {\n throw new Error(\n 'Did not get internet account pre-authorization info in worker',\n )\n }\n token = self.retrieveToken()\n if (token) {\n tokenPromise = Promise.resolve(token)\n return tokenPromise\n }\n tokenPromise = new Promise((resolve, reject) => {\n self.getTokenFromUser(\n token => {\n self.storeToken(token)\n resolve(token)\n },\n error => {\n self.removeToken()\n reject(error)\n },\n )\n })\n return tokenPromise\n },\n }\n })\n .actions(self => ({\n /**\n * #action\n */\n addAuthHeaderToInit(init?: RequestInit, token?: string) {\n return {\n ...init,\n headers: new Headers({\n ...init?.headers,\n ...(token\n ? {\n [self.authHeader]: self.tokenType\n ? `${self.tokenType} ${token}`\n : token,\n }\n : {}),\n }),\n }\n },\n /**\n * #action\n * Gets the token and returns it along with the information needed to\n * create a new internetAccount.\n *\n * @param location - UriLocation of the resource\n * @returns\n */\n async getPreAuthorizationInformation(location: UriLocation) {\n const authToken = await self.getToken(location)\n let validatedToken: string | undefined\n try {\n validatedToken = await self.validateToken(authToken, location)\n } catch (error) {\n self.removeToken()\n throw error\n }\n return {\n internetAccountType: self.type,\n authInfo: {\n token: validatedToken,\n configuration: getConf(self),\n },\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n * Get a fetch method that will add any needed authentication headers to\n * the request before sending it. If location is provided, it will be\n * checked to see if it includes a token in it pre-auth information.\n *\n * @param loc - UriLocation of the resource\n * @returns A function that can be used to fetch\n */\n getFetcher(loc?: UriLocation) {\n return async (input: RequestInfo, init?: RequestInit) => {\n const authToken = await self.getToken(loc)\n const newInit = self.addAuthHeaderToInit(init, authToken)\n return fetch(input, newInit)\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n * Gets a filehandle that uses a fetch that adds auth headers\n * @param location - UriLocation of the resource\n * @returns A filehandle\n */\n openLocation(location: UriLocation) {\n return new RemoteFileWithRangeCache(location.uri, {\n fetch: self.getFetcher(location),\n })\n },\n }))\n\nexport type BaseInternetAccountStateModel = typeof InternetAccount\nexport type BaseInternetAccountModel = Instance<BaseInternetAccountStateModel>\n","import { transaction } from 'mobx'\nimport {\n getRoot,\n resolveIdentifier,\n types,\n Instance,\n IAnyStateTreeNode,\n} from 'mobx-state-tree'\n\n// locals\nimport {\n getConf,\n AnyConfigurationModel,\n AnyConfigurationSchemaType,\n ConfigurationReference,\n} from '../../configuration'\nimport PluginManager from '../../PluginManager'\nimport { MenuItem } from '../../ui'\nimport { getContainingView, getEnv, getSession } from '../../util'\nimport { isSessionModelWithConfigEditing } from '../../util/types'\nimport { ElementId } from '../../util/types/mst'\n\nexport function getCompatibleDisplays(self: IAnyStateTreeNode) {\n const { pluginManager } = getEnv(self)\n const view = getContainingView(self)\n const viewType = pluginManager.getViewType(view.type)!\n const compatTypes = new Set(viewType.displayTypes.map(d => d.name))\n const displays = self.configuration.displays as AnyConfigurationModel[]\n return displays.filter(d => compatTypes.has(d.type))\n}\n\n/**\n * #stateModel BaseTrackModel\n * #category track\n *\n * these MST models only exist for tracks that are *shown*. they should contain\n * only UI state for the track, and have a reference to a track configuration.\n * note that multiple displayed tracks could use the same configuration.\n */\nexport function createBaseTrackModel(\n pm: PluginManager,\n trackType: string,\n baseTrackConfig: AnyConfigurationSchemaType,\n) {\n return types\n .model(trackType, {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal(trackType),\n /**\n * #property\n */\n configuration: ConfigurationReference(baseTrackConfig),\n /**\n * #property\n */\n minimized: false,\n /**\n * #property\n */\n displays: types.array(pm.pluggableMstType('display', 'stateModel')),\n })\n .views(self => ({\n /**\n * #getter\n * determines which webworker to send the track to, currently based on trackId\n */\n get rpcSessionId() {\n return self.configuration.trackId\n },\n /**\n * #getter\n */\n get name() {\n return getConf(self, 'name')\n },\n /**\n * #getter\n */\n get textSearchAdapter() {\n return getConf(self, 'textSearchAdapter')\n },\n\n /**\n * #getter\n */\n get adapterType() {\n const adapterConfig = getConf(self, 'adapter')\n if (!adapterConfig) {\n throw new Error(`no adapter configuration provided for ${self.type}`)\n }\n const adapterType = pm.getAdapterType(adapterConfig.type)\n if (!adapterType) {\n throw new Error(`unknown adapter type ${adapterConfig.type}`)\n }\n return adapterType\n },\n\n /**\n * #getter\n */\n get viewMenuActions(): MenuItem[] {\n return self.displays.flatMap(d => d.viewMenuActions)\n },\n\n /**\n * #getter\n */\n get canConfigure() {\n const session = getSession(self)\n const { sessionTracks, adminMode } = session\n return (\n isSessionModelWithConfigEditing(session) &&\n (adminMode ||\n sessionTracks?.find(t => t.trackId === self.configuration.trackId))\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setMinimized(flag: boolean) {\n self.minimized = flag\n },\n\n /**\n * #action\n */\n showDisplay(displayId: string, initialSnapshot = {}) {\n const schema = pm.pluggableConfigSchemaType('display')\n const conf = resolveIdentifier(schema, getRoot(self), displayId)\n const displayType = pm.getDisplayType(conf.type)\n if (!displayType) {\n throw new Error(`unknown display type ${conf.type}`)\n }\n const display = displayType.stateModel.create({\n ...initialSnapshot,\n type: conf.type,\n configuration: conf,\n })\n self.displays.push(display)\n },\n\n /**\n * #action\n */\n hideDisplay(displayId: string) {\n const schema = pm.pluggableConfigSchemaType('display')\n const conf = resolveIdentifier(schema, getRoot(self), displayId)\n const t = self.displays.filter(d => d.configuration === conf)\n transaction(() => {\n t.forEach(d => self.displays.remove(d))\n })\n return t.length\n },\n\n /**\n * #action\n */\n replaceDisplay(oldId: string, newId: string, initialSnapshot = {}) {\n const idx = self.displays.findIndex(\n d => d.configuration.displayId === oldId,\n )\n if (idx === -1) {\n throw new Error(`could not find display id ${oldId} to replace`)\n }\n const schema = pm.pluggableConfigSchemaType('display')\n const conf = resolveIdentifier(schema, getRoot(self), newId)\n const displayType = pm.getDisplayType(conf.type)\n if (!displayType) {\n throw new Error(`unknown display type ${conf.type}`)\n }\n self.displays.splice(idx, 1, {\n ...initialSnapshot,\n type: conf.type,\n configuration: conf,\n })\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n trackMenuItems() {\n const menuItems: MenuItem[] = self.displays.flatMap(d =>\n d.trackMenuItems(),\n )\n const shownId = self.displays[0].configuration.displayId\n const compatDisp = getCompatibleDisplays(self)\n\n return [\n ...menuItems,\n ...(compatDisp.length > 1\n ? [\n {\n type: 'subMenu',\n label: 'Display types',\n priority: -1000,\n subMenu: compatDisp.map(d => ({\n type: 'radio',\n label: pm.getDisplayType(d.type)!.displayName,\n checked: d.displayId === shownId,\n onClick: () => {\n self.replaceDisplay(shownId, d.displayId)\n },\n })),\n },\n ]\n : []),\n ]\n },\n }))\n}\n\nexport type BaseTrackStateModel = ReturnType<typeof createBaseTrackModel>\nexport type BaseTrackModel = Instance<BaseTrackStateModel>\n","import { types, Instance } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '../../configuration'\nimport PluginManager from '../../PluginManager'\n\n/**\n * #config BaseTrack\n */\nexport function createBaseTrackConfig(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'BaseTrack',\n {\n /**\n * #slot\n */\n name: {\n description: 'descriptive name of the track',\n type: 'string',\n defaultValue: 'Track',\n },\n /**\n * #slot\n */\n assemblyNames: {\n description: 'name of the assembly (or assemblies) track belongs to',\n type: 'stringArray',\n defaultValue: ['assemblyName'],\n },\n /**\n * #slot\n */\n description: {\n description: 'a description of the track',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n category: {\n description: 'the category and sub-categories of a track',\n type: 'stringArray',\n defaultValue: [],\n },\n /**\n * #slot\n */\n metadata: {\n type: 'frozen',\n description: 'anything to add about this track',\n defaultValue: {},\n },\n /**\n * #slot\n */\n adapter: pluginManager.pluggableConfigSchemaType('adapter'),\n\n textSearching: ConfigurationSchema('textSearching', {\n /**\n * #slot textSearching.indexedAttributes\n */\n indexingAttributes: {\n type: 'stringArray',\n description:\n 'list of which feature attributes to index for text searching',\n defaultValue: ['Name', 'ID'],\n },\n /**\n * #slot textSearching.indexingFeatureTypesToExclude\n */\n indexingFeatureTypesToExclude: {\n type: 'stringArray',\n description: 'list of feature types to exclude in text search index',\n defaultValue: ['CDS', 'exon'],\n },\n\n /**\n * #slot textSearching.textSearchAdapter\n */\n textSearchAdapter: pluginManager.pluggableConfigSchemaType(\n 'text search adapter',\n ),\n }),\n\n /**\n * #slot\n */\n displays: types.array(pluginManager.pluggableConfigSchemaType('display')),\n\n formatDetails: ConfigurationSchema('FormatDetails', {\n /**\n * #slot formatDetails.feature\n */\n feature: {\n type: 'frozen',\n description: 'adds extra fields to the feature details',\n defaultValue: {},\n contextVariable: ['feature'],\n },\n /**\n * #slot formatDetails.subfeatures\n */\n subfeatures: {\n type: 'frozen',\n description: 'adds extra fields to the subfeatures of a feature',\n defaultValue: {},\n contextVariable: ['feature'],\n },\n /**\n * #slot formatDetails.depth\n */\n depth: {\n type: 'number',\n defaultValue: 2,\n description:\n 'depth of subfeatures to iterate the formatter on formatDetails.subfeatures (e.g. you may not want to format the exon/cds subfeatures, so limited to 2',\n },\n /**\n * #slot formatDetails.maxDepth\n */\n maxDepth: {\n type: 'number',\n defaultValue: 99999,\n description: 'Maximum depth to render subfeatures',\n },\n }),\n formatAbout: ConfigurationSchema('FormatAbout', {\n /**\n * #slot formatAbout.config\n */\n config: {\n type: 'frozen',\n description: 'formats configuration object in about dialog',\n defaultValue: {},\n contextVariable: ['config'],\n },\n\n /**\n * #slot formatAbout.hideUris\n */\n hideUris: {\n type: 'boolean',\n defaultValue: false,\n },\n }),\n },\n {\n preProcessSnapshot: s2 => {\n const snap = pluginManager.evaluateExtensionPoint(\n 'Core-preProcessTrackConfig',\n JSON.parse(JSON.stringify(s2)),\n ) as {\n trackId: string\n name: string\n type: string\n displays: { type: string; displayId: string }[]\n }\n const { displays = [] } = snap\n if (snap.trackId !== 'placeholderId') {\n // Gets the displays on the track snapshot and the possible displays\n // from the track type and adds any missing possible displays to the\n // snapshot\n const configDisplayTypes = new Set(displays.map(d => d.type))\n pluginManager.getTrackType(snap.type)!.displayTypes.forEach(d => {\n if (!configDisplayTypes.has(d.name)) {\n displays.push({\n displayId: `${snap.trackId}-${d.name}`,\n type: d.name,\n })\n }\n })\n }\n return { ...snap, displays }\n },\n /**\n * #identifier\n */\n explicitIdentifier: 'trackId',\n explicitlyTyped: true,\n\n actions: (self: any) => ({\n addDisplayConf(conf: { type: string; displayId: string }) {\n const { type } = conf\n if (!type) {\n throw new Error(`unknown display type ${type}`)\n }\n const display = self.displays.find(\n (d: any) => d?.displayId === conf.displayId,\n )\n if (display) {\n return display\n }\n const length = self.displays.push(conf)\n return self.displays[length - 1]\n },\n }),\n },\n )\n}\n\nexport type BaseTrackConfigSchema = ReturnType<typeof createBaseTrackConfig>\nexport type BaseTrackConfig = Instance<BaseTrackConfigSchema>\n","import deepEqual from 'fast-deep-equal'\n\n// layouts\nimport GranularRectLayout from '../../util/layouts/GranularRectLayout'\nimport MultiLayout from '../../util/layouts/MultiLayout'\nimport { SerializedLayout, BaseLayout } from '../../util/layouts/BaseLayout'\nimport PrecomputedLayout from '../../util/layouts/PrecomputedLayout'\n\n// other\nimport FeatureRendererType, {\n RenderArgs as FeatureRenderArgs,\n RenderArgsSerialized as FeatureRenderArgsSerialized,\n RenderArgsDeserialized as FeatureRenderArgsDeserialized,\n RenderResults as FeatureRenderResults,\n ResultsSerialized as FeatureResultsSerialized,\n ResultsDeserialized as FeatureResultsDeserialized,\n} from './FeatureRendererType'\nimport { getLayoutId, Region, Feature } from '../../util'\nimport { readConfObject, AnyConfigurationModel } from '../../configuration'\nimport SerializableFilterChain from './util/serializableFilterChain'\nimport RpcManager from '../../rpc/RpcManager'\n\nexport interface LayoutSessionProps {\n config: AnyConfigurationModel\n bpPerPx: number\n filters?: SerializableFilterChain\n}\n\nexport type MyMultiLayout = MultiLayout<GranularRectLayout<unknown>, unknown>\n\nexport interface CachedLayout {\n layout: MyMultiLayout\n config: AnyConfigurationModel\n filters?: SerializableFilterChain\n}\n\nexport class LayoutSession implements LayoutSessionProps {\n config: AnyConfigurationModel\n\n bpPerPx: number\n\n filters?: SerializableFilterChain\n\n constructor(args: LayoutSessionProps) {\n this.config = args.config\n this.bpPerPx = args.bpPerPx\n this.filters = args.filters\n this.update(args)\n }\n\n update(props: LayoutSessionProps) {\n Object.assign(this, props)\n }\n\n makeLayout() {\n return new MultiLayout(GranularRectLayout, {\n maxHeight: readConfObject(this.config, 'maxHeight'),\n displayMode: readConfObject(this.config, 'displayMode'),\n pitchX: this.bpPerPx,\n pitchY: readConfObject(this.config, 'noSpacing') ? 1 : 3,\n })\n }\n\n /**\n * @param layout -\n * @returns true if the given layout is a valid one to use for this session\n */\n cachedLayoutIsValid(cachedLayout: CachedLayout) {\n return (\n cachedLayout.layout.subLayoutConstructorArgs.pitchX === this.bpPerPx &&\n deepEqual(readConfObject(this.config), cachedLayout.config) &&\n deepEqual(this.filters, cachedLayout.filters)\n )\n }\n\n cachedLayout: CachedLayout | undefined\n\n get layout(): MyMultiLayout {\n if (!this.cachedLayout || !this.cachedLayoutIsValid(this.cachedLayout)) {\n this.cachedLayout = {\n layout: this.makeLayout(),\n config: readConfObject(this.config),\n filters: this.filters,\n }\n }\n return this.cachedLayout.layout\n }\n}\nexport interface RenderArgs extends FeatureRenderArgs {\n bpPerPx: number\n layoutId: string\n}\n\nexport interface RenderArgsSerialized extends FeatureRenderArgsSerialized {\n bpPerPx: number\n}\n\nexport interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {\n bpPerPx: number\n layoutId: string\n}\n\nexport interface RenderResults extends FeatureRenderResults {\n layout: BaseLayout<Feature>\n}\n\nexport interface ResultsSerialized extends FeatureResultsSerialized {\n maxHeightReached: boolean\n layout: SerializedLayout\n}\n\nexport interface ResultsDeserialized extends FeatureResultsDeserialized {\n maxHeightReached: boolean\n layout: PrecomputedLayout<string>\n}\n\nexport default class BoxRendererType extends FeatureRendererType {\n sessions: Record<string, LayoutSession> = {}\n\n getWorkerSession(\n props: LayoutSessionProps & { sessionId: string; layoutId: string },\n ) {\n const key = getLayoutId(props)\n if (!this.sessions[key]) {\n this.sessions[key] = this.createSession(props)\n }\n const session = this.sessions[key]\n session.update(props)\n return session\n }\n\n getExpandedRegion(region: Region, renderArgs: RenderArgsDeserialized) {\n const { bpPerPx, config } = renderArgs\n const maxFeatureGlyphExpansion =\n readConfObject(config, 'maxFeatureGlyphExpansion') || 0\n const bpExpansion = Math.round(maxFeatureGlyphExpansion * bpPerPx)\n return {\n ...(region as Omit<typeof region, symbol>),\n start: Math.floor(Math.max(region.start - bpExpansion, 0)),\n end: Math.ceil(region.end + bpExpansion),\n }\n }\n\n createSession(props: LayoutSessionProps) {\n return new LayoutSession(props)\n }\n\n async freeResourcesInClient(rpcManager: RpcManager, args: RenderArgs) {\n const { regions } = args\n const key = getLayoutId(args)\n const session = this.sessions[key]\n if (session) {\n const region = regions[0]!\n session.layout.discardRange(region.refName, region.start, region.end)\n }\n return await super.freeResourcesInClient(rpcManager, args)\n }\n\n deserializeLayoutInClient(json: SerializedLayout) {\n return new PrecomputedLayout(json)\n }\n\n deserializeResultsInClient(result: ResultsSerialized, args: RenderArgs) {\n const layout = this.deserializeLayoutInClient(result.layout)\n return super.deserializeResultsInClient(\n { ...result, layout } as FeatureResultsSerialized,\n args,\n ) as ResultsDeserialized\n }\n\n createLayoutInWorker(args: RenderArgsDeserialized) {\n const { regions } = args\n const session = this.getWorkerSession(args)\n return session.layout.getSublayout(regions[0]!.refName)\n }\n\n serializeResultsInWorker(\n results: RenderResults,\n args: RenderArgsDeserialized,\n ): ResultsSerialized {\n const serialized = super.serializeResultsInWorker(\n results,\n args,\n ) as ResultsSerialized\n\n const region = args.regions[0]!\n serialized.layout = results.layout.serializeRegion(\n this.getExpandedRegion(region, args),\n )\n serialized.features = serialized.features.filter(f => {\n return Boolean(serialized.layout.rectangles[f.uniqueId])\n })\n\n serialized.maxHeightReached = serialized.layout.maxHeightReached\n return serialized\n }\n\n /**\n * gets layout and renders\n *\n * @param props - render args\n */\n async render(props: RenderArgsDeserialized): Promise<RenderResults> {\n const layout =\n (props.layout as undefined | BaseLayout<unknown>) ||\n this.createLayoutInWorker(props)\n const result = await super.render({ ...props, layout })\n return { ...result, layout }\n }\n}\n","import React, { useEffect, useRef } from 'react'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { AnyReactComponentType, Feature, rIC } from '../../util'\nimport { ThemeOptions, ThemeProvider } from '@mui/material'\nimport { createJBrowseTheme } from '../../ui'\nimport { getRoot } from 'mobx-state-tree'\n// eslint-disable-next-line react/no-deprecated\nimport { hydrate, unmountComponentAtNode } from 'react-dom'\n\ninterface Props {\n html: string\n features: Map<string, Feature>\n theme: ThemeOptions\n\n displayModel?: any\n RenderingComponent: AnyReactComponentType\n}\n\nconst NewHydrate = observer(function RpcRenderedSvgGroup(props: Props) {\n const { html, theme, RenderingComponent, ...rest } = props\n const ref = useRef<SVGGElement>(null)\n\n // this `any` is a react-dom/client::Root\n\n const rootRef = useRef<any>()\n\n const root = getRoot<any>(props.displayModel)\n const hydrateRoot = root.hydrateFn\n\n useEffect(() => {\n const renderTimeout = rIC(() => {\n if (!ref.current) {\n return\n }\n const jbrowseTheme = createJBrowseTheme(theme)\n rootRef.current =\n rootRef.current ??\n hydrateRoot(\n ref.current,\n <ThemeProvider theme={jbrowseTheme}>\n <RenderingComponent {...rest} />\n </ThemeProvider>,\n )\n })\n return () => {\n if (renderTimeout !== undefined) {\n clearTimeout(renderTimeout)\n }\n const root = rootRef.current\n rootRef.current = undefined\n\n setTimeout(() => {\n root?.unmount()\n })\n }\n // biome-ignore lint/correctness/useExhaustiveDependencies:\n }, [RenderingComponent, hydrateRoot, theme, rest])\n\n return <g ref={ref} dangerouslySetInnerHTML={{ __html: html }} />\n})\n\nconst OldHydrate = observer(function OldHydrate(props: Props) {\n const { html, RenderingComponent } = props\n const ref = useRef<SVGGElement>(null)\n useEffect(() => {\n const domNode = ref.current\n function doHydrate() {\n if (domNode && html) {\n if (domNode.innerHTML) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n unmountComponentAtNode(domNode)\n }\n\n // setting outline:none fixes react \"focusable\" element issue. see\n // https://github.com/GMOD/jbrowse-components/issues/2160\n domNode.style.outline = 'none'\n domNode.innerHTML = html\n // use requestIdleCallback to defer main-thread rendering and\n // hydration for when we have some free time. helps keep the\n // framerate up.\n rIC(() => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n hydrate(<RenderingComponent {...props} />, domNode)\n })\n }\n }\n doHydrate()\n return () => {\n if (domNode) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n unmountComponentAtNode(domNode)\n }\n }\n }, [html, RenderingComponent, props])\n\n return <g ref={ref} />\n})\n\nconst RpcRenderedSvgGroup = observer(function (props: Props) {\n const root = getRoot<any>(props.displayModel)\n return root.hydrateFn ? <NewHydrate {...props} /> : <OldHydrate {...props} />\n})\n\nexport default RpcRenderedSvgGroup\n","import React from 'react'\nimport { SimpleFeature, SimpleFeatureSerialized } from '../../util'\nimport FeatureRenderer from './FeatureRendererType'\nimport RpcRenderedSvgGroup from './RpcRenderedSvgGroup'\nimport { ThemeOptions } from '@mui/material'\n\nexport default class CircularChordRendererType extends FeatureRenderer {\n supportsSVG = true\n\n deserializeResultsInClient(\n res: { features: SimpleFeatureSerialized[]; html: string },\n args: {\n displayModel?: any\n theme: ThemeOptions\n exportSVG?: { rasterizeLayers?: boolean }\n },\n ) {\n const deserializedFeatures = new Map(\n res.features.map(f => SimpleFeature.fromJSON(f)).map(f => [f.id(), f]),\n )\n // if we are rendering svg, we skip hydration\n if (args.exportSVG) {\n // only return the res if the renderer explicitly has\n // this.supportsSVG support to avoid garbage being rendered in SVG\n // document\n return {\n ...res,\n features: deserializedFeatures,\n blockKey: 'circularChord',\n html: this.supportsSVG\n ? res.html\n : '<text y=\"12\" fill=\"black\">SVG export not supported for this track</text>',\n }\n }\n\n // hydrate res using ServerSideRenderedContent\n return {\n ...res,\n features: deserializedFeatures,\n blockKey: 'circularChord',\n reactElement: (\n <RpcRenderedSvgGroup\n {...args}\n {...res}\n features={deserializedFeatures}\n RenderingComponent={this.ReactComponent}\n />\n ),\n }\n }\n}\n","import { filter, toArray } from 'rxjs/operators'\nimport { Feature } from '../../util/simpleFeature'\nimport { Region } from '../../util/types'\nimport ServerSideRenderer, {\n RenderArgs as ServerSideRenderArgs,\n RenderArgsSerialized as ServerSideRenderArgsSerialized,\n RenderArgsDeserialized as ServerSideRenderArgsDeserialized,\n ResultsSerialized as ServerSideResultsSerialized,\n ResultsDeserialized as ServerSideResultsDeserialized,\n} from './ServerSideRendererType'\nimport RpcManager from '../../rpc/RpcManager'\nimport { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport { BaseFeatureDataAdapter } from '../../data_adapters/BaseAdapter'\nimport { dedupe, getSerializedSvg } from '../../util'\nimport { firstValueFrom } from 'rxjs'\nimport { AnyConfigurationModel } from '../../configuration'\n\nexport interface RenderArgs extends ServerSideRenderArgs {\n blockKey: string\n}\n\nexport interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {\n blockKey: string\n}\n\nexport interface RenderArgsDeserialized\n extends ServerSideRenderArgsDeserialized {\n blockKey: string\n}\n\nexport type ResultsSerialized = ServerSideResultsSerialized\n\nexport interface ResultsDeserialized extends ServerSideResultsDeserialized {\n blockKey: string\n}\n\nexport interface ResultsSerializedSvgExport extends ResultsSerialized {\n canvasRecordedData: unknown\n width: number\n height: number\n reactElement: unknown\n}\n\nfunction isSvgExport(e: ResultsSerialized): e is ResultsSerializedSvgExport {\n return 'canvasRecordedData' in e\n}\n\nexport default class ComparativeServerSideRenderer extends ServerSideRenderer {\n /**\n * directly modifies the render arguments to prepare them to be serialized\n * and sent to the worker.\n *\n * @param args - the arguments passed to render\n * @returns the same object\n */\n\n async renameRegionsIfNeeded(args: RenderArgs) {\n return args\n }\n\n serializeArgsInClient(args: RenderArgs) {\n const deserializedArgs = {\n ...args,\n displayModel: undefined,\n }\n\n return super.serializeArgsInClient(deserializedArgs)\n }\n\n // deserialize some of the results that came back from the worker\n deserializeResultsInClient(\n result: ResultsSerialized,\n args: RenderArgs,\n ): ResultsDeserialized {\n const deserialized = super.deserializeResultsInClient(result, args)\n return {\n ...deserialized,\n blockKey: args.blockKey,\n }\n }\n\n /**\n * Render method called on the client. Serializes args, then\n * calls `render` with the RPC manager.\n */\n async renderInClient(rpcManager: RpcManager, args: RenderArgs) {\n const results = (await rpcManager.call(\n args.sessionId,\n 'ComparativeRender',\n args,\n )) as ResultsSerialized\n\n if (isSvgExport(results)) {\n results.html = await getSerializedSvg(results)\n results.reactElement = undefined\n }\n return results\n }\n\n /**\n * @param renderArgs -\n * @param feature -\n * @returns true if this feature passes all configured filters\n */\n featurePassesFilters(renderArgs: RenderArgsDeserialized, feature: Feature) {\n return renderArgs.filters\n ? renderArgs.filters.passes(feature, renderArgs)\n : true\n }\n\n async getFeatures(renderArgs: {\n regions: Region[]\n sessionId: string\n adapterConfig: AnyConfigurationModel\n }) {\n const pm = this.pluginManager\n const { regions, sessionId, adapterConfig } = renderArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n const requestRegions = regions.map(r => {\n // make sure the requested region's start and end are integers, if\n // there is a region specification.\n const requestRegion = { ...r }\n if (requestRegion.start) {\n requestRegion.start = Math.floor(requestRegion.start)\n }\n if (requestRegion.end) {\n requestRegion.end = Math.floor(requestRegion.end)\n }\n return requestRegion\n })\n\n // note that getFeaturesInMultipleRegions does not do glyph expansion\n const res = await firstValueFrom(\n (dataAdapter as BaseFeatureDataAdapter)\n .getFeaturesInMultipleRegions(requestRegions, renderArgs)\n .pipe(\n // @ts-expect-error\n filter(f => this.featurePassesFilters(renderArgs, f)),\n toArray(),\n ),\n )\n\n // dedupe needed xref https://github.com/GMOD/jbrowse-components/pull/3404/\n return dedupe(res, f => f.id())\n }\n}\n\nexport { type RenderResults } from './ServerSideRendererType'\n","import { toArray } from 'rxjs/operators'\nimport clone from 'clone'\nimport { firstValueFrom } from 'rxjs'\n\n// locals\nimport { checkAbortSignal, iterMap } from '../../util'\nimport SimpleFeature, {\n Feature,\n SimpleFeatureSerialized,\n} from '../../util/simpleFeature'\nimport { AugmentedRegion as Region } from '../../util/types'\nimport { getAdapter } from '../../data_adapters/dataAdapterCache'\nimport ServerSideRendererType, {\n RenderArgs as ServerSideRenderArgs,\n RenderArgsSerialized as ServerSideRenderArgsSerialized,\n RenderArgsDeserialized as ServerSideRenderArgsDeserialized,\n RenderResults as ServerSideRenderResults,\n ResultsDeserialized as ServerSideResultsDeserialized,\n ResultsSerialized as ServerSideResultsSerialized,\n} from './ServerSideRendererType'\nimport { isFeatureAdapter } from '../../data_adapters/BaseAdapter'\nimport { AnyConfigurationModel } from '../../configuration'\n\nexport interface RenderArgs extends ServerSideRenderArgs {\n displayModel?: {\n id: string\n selectedFeatureId?: string\n }\n regions: Region[]\n blockKey: string\n}\n\nexport interface RenderArgsSerialized extends ServerSideRenderArgsSerialized {\n displayModel?: {\n id: string\n selectedFeatureId?: string\n }\n regions: Region[]\n blockKey: string\n}\n\nexport interface RenderArgsDeserialized\n extends ServerSideRenderArgsDeserialized {\n displayModel: { id: string; selectedFeatureId?: string }\n regions: Region[]\n blockKey: string\n adapterConfig: AnyConfigurationModel\n}\n\nexport interface RenderResults extends ServerSideRenderResults {\n features: Map<string, Feature>\n}\n\nexport interface ResultsSerialized extends ServerSideResultsSerialized {\n features: SimpleFeatureSerialized[]\n}\n\nexport interface ResultsDeserialized extends ServerSideResultsDeserialized {\n features: Map<string, Feature>\n blockKey: string\n}\n\nexport default class FeatureRendererType extends ServerSideRendererType {\n /**\n * replaces the `displayModel` param (which on the client is a MST model)\n * with a stub that only contains the `selectedFeature`, since this is the\n * only part of the track model that most renderers read. also serializes the\n * config and regions to JSON from MST objects.\n *\n * @param args - the arguments passed to render\n */\n serializeArgsInClient(args: RenderArgs) {\n const { regions } = args\n const serializedArgs = {\n ...args,\n displayModel: undefined,\n regions: clone(regions),\n }\n return super.serializeArgsInClient(serializedArgs)\n }\n\n /**\n * Adds feature deserialization to base server-side result deserialization\n *\n * @param results - the results of the render\n * @param args - the arguments passed to render\n */\n deserializeResultsInClient(\n result: ResultsSerialized,\n args: RenderArgs,\n ): ResultsDeserialized {\n const deserializedFeatures = new Map<string, SimpleFeature>(\n result.features.map(f => SimpleFeature.fromJSON(f)).map(f => [f.id(), f]),\n )\n\n const deserialized = super.deserializeResultsInClient(\n {\n ...result,\n features: deserializedFeatures,\n } as ServerSideResultsSerialized,\n args,\n )\n return {\n ...deserialized,\n blockKey: args.blockKey,\n features: deserializedFeatures,\n }\n }\n\n /**\n * Adds feature serialization to base server-side result serialization\n *\n * @param result - object containing the results of calling the `render`\n * method\n * @param args - deserialized render args\n */\n serializeResultsInWorker(\n result: RenderResults,\n args: RenderArgsDeserialized,\n ): ResultsSerialized {\n const serialized = super.serializeResultsInWorker(result, args)\n const { features } = result\n return {\n ...serialized,\n features: iterMap(features.values(), f => f.toJSON(), features.size),\n }\n }\n\n /**\n * will expand if soft clipping or feature glyphs are shown\n *\n * @param region - rendering region\n * @param _renderArgs - render args, unused, may be used in deriving classes\n */\n getExpandedRegion(region: Region, _renderArgs: RenderArgsDeserialized) {\n return region\n }\n\n /**\n * use the dataAdapter to fetch the features to be rendered\n *\n * @param renderArgs -\n * @returns Map of features as `{ id => feature, ... }`\n */\n async getFeatures(\n renderArgs: RenderArgsDeserialized,\n ): Promise<Map<string, Feature>> {\n const pm = this.pluginManager\n const { signal, regions, sessionId, adapterConfig } = renderArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n if (!isFeatureAdapter(dataAdapter)) {\n throw new Error('Adapter does not support retrieving features')\n }\n\n // make sure the requested region's start and end are integers, if\n // there is a region specification.\n const requestRegions = regions.map(r => {\n const requestRegion = { ...r }\n if (requestRegion.start) {\n requestRegion.start = Math.floor(requestRegion.start)\n }\n if (requestRegion.end) {\n requestRegion.end = Math.ceil(requestRegion.end)\n }\n return requestRegion\n })\n\n const region = requestRegions[0]!\n\n const featureObservable =\n requestRegions.length === 1\n ? dataAdapter.getFeatures(\n this.getExpandedRegion(region, renderArgs),\n renderArgs,\n )\n : dataAdapter.getFeaturesInMultipleRegions(requestRegions, renderArgs)\n\n const feats = await firstValueFrom(featureObservable.pipe(toArray()))\n checkAbortSignal(signal)\n return new Map<string, Feature>(\n feats\n .filter(feat => this.featurePassesFilters(renderArgs, feat))\n .map(feat => [feat.id(), feat] as const),\n )\n }\n\n /**\n * @param renderArgs -\n * @param feature -\n * @returns true if this feature passes all configured filters\n */\n featurePassesFilters(renderArgs: RenderArgsDeserialized, feature: Feature) {\n return renderArgs.filters\n ? renderArgs.filters.passes(feature, renderArgs)\n : true\n }\n\n /**\n * gets features and renders\n *\n * @param props - render args\n */\n async render(\n props: RenderArgsDeserialized & { features?: Map<string, Feature> },\n ): Promise<RenderResults> {\n const features = props.features || (await this.getFeatures(props))\n const result = await super.render({ ...props, features })\n return { ...result, features }\n }\n}\n","import React, { ReactElement } from 'react'\nimport PluggableElementBase from '../PluggableElementBase'\nimport { AnyConfigurationSchemaType } from '../../configuration'\nimport { AnyReactComponentType } from '../../util'\nimport PluginManager from '../../PluginManager'\n\nexport type RenderProps = Record<string, unknown>\n\nexport interface RenderResults {\n reactElement?: ReactElement\n html?: string\n}\n\nexport default class RendererType extends PluggableElementBase {\n ReactComponent: AnyReactComponentType\n\n supportsSVG = true\n\n configSchema: AnyConfigurationSchemaType\n\n pluginManager: PluginManager\n\n constructor(stuff: {\n name: string\n ReactComponent: AnyReactComponentType\n displayName?: string\n configSchema: AnyConfigurationSchemaType\n pluginManager: PluginManager\n }) {\n super(stuff)\n this.ReactComponent = stuff.ReactComponent\n this.configSchema = stuff.configSchema\n this.pluginManager = stuff.pluginManager\n }\n\n async render(props: RenderProps): Promise<RenderResults> {\n return {\n reactElement: React.createElement(this.ReactComponent, props, null),\n }\n }\n\n /**\n * frees resources associated with the given range, session, etc.\n * optionally returns the number of data items deleted\n */\n freeResources(/* specification: {} */): number {\n return 0\n }\n}\n","import React, { useEffect, useRef } from 'react'\nimport { ThemeProvider } from '@mui/material/styles'\n\n// locals\nimport { createJBrowseTheme } from '../../ui'\nimport { ResultsSerialized, RenderArgs } from './ServerSideRendererType'\nimport { observer } from 'mobx-react'\nimport { getRoot } from 'mobx-state-tree'\n// eslint-disable-next-line react/no-deprecated\nimport { hydrate, unmountComponentAtNode } from 'react-dom'\nimport { rIC } from '../../util'\n\ninterface Props extends ResultsSerialized, RenderArgs {\n RenderingComponent: React.ComponentType<any>\n}\n\nconst NewHydrate = observer(function ServerSideRenderedContent({\n theme,\n html,\n RenderingComponent,\n ...rest\n}: Props) {\n const ref = useRef<HTMLDivElement>(null)\n const rootRef = useRef<any>()\n const { hydrateFn } = getRoot<any>(rest.displayModel)\n\n useEffect(() => {\n // requestIdleCallback here helps to avoid hydration mismatch because it\n // provides time for dangerouslySetInnerHTML to set the innerHTML contents\n // of the node, otherwise ref.current.innerHTML can be empty\n const renderTimeout = rIC(() => {\n if (!ref.current) {\n return\n }\n const jbrowseTheme = createJBrowseTheme(theme)\n // if there is a hydration mismatch, investigate value of\n // - value of ref.current.innerHTML\n // - value of `html` variable\n // - renderToString of the below React element\n rootRef.current =\n rootRef.current ??\n hydrateFn(\n ref.current,\n <ThemeProvider theme={jbrowseTheme}>\n <RenderingComponent {...rest} />\n </ThemeProvider>,\n )\n })\n return () => {\n if (renderTimeout !== undefined) {\n clearTimeout(renderTimeout)\n }\n const root = rootRef.current\n rootRef.current = undefined\n\n setTimeout(() => {\n root?.unmount()\n })\n }\n /* biome-ignore lint/correctness/useExhaustiveDependencies: */\n }, [theme, rest, hydrateFn, RenderingComponent])\n\n return (\n <div\n data-testid=\"hydrationContainer\"\n ref={ref}\n dangerouslySetInnerHTML={{ __html: html }}\n />\n )\n})\n\nconst OldHydrate = observer(function ({\n theme,\n html,\n RenderingComponent,\n ...rest\n}: Props) {\n const ref = useRef<HTMLDivElement>(null)\n const jbrowseTheme = createJBrowseTheme(theme)\n\n useEffect(() => {\n const domNode = ref.current\n function doHydrate() {\n if (domNode) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n unmountComponentAtNode(domNode)\n domNode.innerHTML = html\n\n rIC(() => {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n hydrate(\n <ThemeProvider theme={jbrowseTheme}>\n <RenderingComponent {...rest} />\n </ThemeProvider>,\n domNode,\n )\n })\n }\n }\n\n doHydrate()\n\n return () => {\n if (domNode) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n unmountComponentAtNode(domNode)\n }\n }\n /* biome-ignore lint/correctness/useExhaustiveDependencies: */\n }, [html, jbrowseTheme, rest, RenderingComponent])\n\n return <div ref={ref} />\n})\n\nconst ServerSideRenderedContent = observer(function (props: Props) {\n const root = getRoot<any>(props.displayModel)\n return root.hydrateFn ? <NewHydrate {...props} /> : <OldHydrate {...props} />\n})\n\nexport default ServerSideRenderedContent\n","import React from 'react'\nimport { ThemeOptions } from '@mui/material'\nimport { ThemeProvider } from '@mui/material/styles'\nimport { renderToString } from 'react-dom/server'\nimport {\n SnapshotOrInstance,\n SnapshotIn,\n getSnapshot,\n isStateTreeNode,\n} from 'mobx-state-tree'\n\n// locals\nimport { checkAbortSignal, getSerializedSvg, updateStatus } from '../../util'\nimport SerializableFilterChain, {\n SerializedFilterChain,\n} from './util/serializableFilterChain'\nimport { AnyConfigurationModel } from '../../configuration'\nimport RpcManager from '../../rpc/RpcManager'\nimport { createJBrowseTheme } from '../../ui'\n\nimport RendererType, { RenderProps, RenderResults } from './RendererType'\nimport ServerSideRenderedContent from './ServerSideRenderedContent'\n\ninterface BaseRenderArgs extends RenderProps {\n sessionId: string\n // Note that signal serialization happens after serializeArgsInClient and\n // deserialization happens before deserializeArgsInWorker\n signal?: AbortSignal\n theme: ThemeOptions\n exportSVG?: {\n rasterizeLayers?: boolean\n }\n}\n\nexport interface RenderArgs extends BaseRenderArgs {\n config: SnapshotOrInstance<AnyConfigurationModel>\n filters?: SerializableFilterChain\n}\n\nexport interface RenderArgsSerialized extends BaseRenderArgs {\n statusCallback?: (arg: string) => void\n config: SnapshotIn<AnyConfigurationModel>\n filters?: SerializedFilterChain\n}\nexport interface RenderArgsDeserialized extends BaseRenderArgs {\n config: AnyConfigurationModel\n filters?: SerializableFilterChain\n}\n\nexport interface ResultsSerialized extends Omit<RenderResults, 'reactElement'> {\n html: string\n}\n\nexport interface ResultsSerializedSvgExport extends ResultsSerialized {\n canvasRecordedData: unknown\n width: number\n height: number\n reactElement: unknown\n}\n\nexport type ResultsDeserialized = RenderResults\n\nfunction isSvgExport(e: ResultsSerialized): e is ResultsSerializedSvgExport {\n return 'canvasRecordedData' in e\n}\n\nexport default class ServerSideRenderer extends RendererType {\n /**\n * directly modifies the render arguments to prepare them to be serialized and\n * sent to the worker.\n *\n * @param args - the arguments passed to render\n * @returns the same object\n */\n serializeArgsInClient(args: RenderArgs): RenderArgsSerialized {\n return {\n ...args,\n config: isStateTreeNode(args.config)\n ? getSnapshot(args.config)\n : args.config,\n filters: args.filters?.toJSON().filters,\n }\n }\n\n /**\n * Deserialize the render results from the worker in the client. Includes\n * hydrating of the React HTML string, and not hydrating the result if SVG is\n * being rendered\n *\n * @param results - the results of the render\n * @param args - the arguments passed to render\n */\n deserializeResultsInClient(\n res: ResultsSerialized,\n args: RenderArgs,\n ): ResultsDeserialized {\n // if we are rendering svg, we skip hydration\n if (args.exportSVG) {\n // only return the res if the renderer explicitly has\n // this.supportsSVG support to avoid garbage being rendered in SVG\n // document\n return {\n ...res,\n html: this.supportsSVG\n ? res.html\n : '<text y=\"12\" fill=\"black\">SVG export not supported for this track</text>',\n }\n }\n\n // get res using ServerSideRenderedContent\n return {\n ...res,\n reactElement: (\n <ServerSideRenderedContent\n {...args}\n {...res}\n RenderingComponent={this.ReactComponent}\n />\n ),\n }\n }\n\n /**\n * modifies the passed arguments object to inflate arguments as necessary.\n * called in the worker process.\n *\n * @param args - the converted arguments to modify\n */\n deserializeArgsInWorker(args: RenderArgsSerialized): RenderArgsDeserialized {\n const deserialized = { ...args } as unknown as RenderArgsDeserialized\n deserialized.config = this.configSchema.create(args.config || {}, {\n pluginManager: this.pluginManager,\n })\n deserialized.filters = args.filters\n ? new SerializableFilterChain({\n filters: args.filters,\n })\n : undefined\n\n return deserialized\n }\n\n /**\n * Serialize results of the render to send them to the client. Includes\n * rendering React to an HTML string.\n *\n * @param results - object containing the results of calling the `render`\n * method\n * @param args - deserialized render args\n */\n serializeResultsInWorker(\n results: RenderResults,\n args: RenderArgsDeserialized,\n ): ResultsSerialized {\n const html = renderToString(\n <ThemeProvider theme={createJBrowseTheme(args.theme)}>\n {results.reactElement}\n </ThemeProvider>,\n )\n results.reactElement = undefined\n return { ...results, html }\n }\n\n /**\n * Render method called on the client. Serializes args, then calls\n * \"CoreRender\" with the RPC manager.\n *\n * @param rpcManager - RPC manager\n * @param args - render args\n */\n async renderInClient(rpcManager: RpcManager, args: RenderArgs) {\n const results = (await rpcManager.call(\n args.sessionId,\n 'CoreRender',\n args,\n )) as ResultsSerialized\n\n if (isSvgExport(results)) {\n results.html = await getSerializedSvg(results)\n results.reactElement = undefined\n }\n return results\n }\n\n /**\n * Render method called on the worker. `render` is called here in server-side\n * rendering\n *\n * @param args - serialized render args\n */\n async renderInWorker(args: RenderArgsSerialized): Promise<ResultsSerialized> {\n const { signal, statusCallback = () => {} } = args\n const deserializedArgs = this.deserializeArgsInWorker(args)\n\n const results = await updateStatus('Rendering plot', statusCallback, () =>\n this.render(deserializedArgs),\n )\n checkAbortSignal(signal)\n\n // serialize the results for passing back to the main thread.\n // these will be transmitted to the main process, and will come out\n // as the result of renderRegionWithWorker.\n return updateStatus('Serializing results', statusCallback, () =>\n this.serializeResultsInWorker(results, deserializedArgs),\n )\n }\n\n async freeResourcesInClient(rpcManager: RpcManager, args: RenderArgs) {\n const serializedArgs = this.serializeArgsInClient(args)\n\n const freed = this.freeResources()\n const freedRpc = (await rpcManager.call(\n args.sessionId,\n 'CoreFreeResources',\n serializedArgs,\n )) as number\n return freed + freedRpc\n }\n}\n\nexport { type RenderResults } from './RendererType'\n","import { stringToJexlExpression } from '../../../util/jexlStrings'\n\ntype FilterExpression = (...args: Record<string, any>[] | any[]) => boolean\n\ninterface Filter {\n string: string\n expr: FilterExpression\n}\n\nexport type SerializedFilterChain = string[]\n\nexport default class SerializableFilterChain {\n filterChain: Filter[]\n\n constructor({ filters = [] }: { filters: SerializedFilterChain }) {\n this.filterChain = filters\n .map(f => f.trim())\n .filter(f => !!f)\n .map(inputFilter => {\n if (typeof inputFilter === 'string') {\n const expr = stringToJexlExpression(inputFilter) as FilterExpression\n return { expr, string: inputFilter }\n }\n throw new Error(`invalid inputFilter string \"${inputFilter}\"`)\n })\n }\n\n passes(...args: any[]) {\n for (const entry of this.filterChain) {\n if (\n // @ts-expect-error\n !entry.expr.evalSync({ feature: args[0] })\n ) {\n return false\n }\n }\n return true\n }\n\n toJSON() {\n return { filters: this.filterChain.map(f => f.string) }\n }\n\n static fromJSON(json: { filters: SerializedFilterChain }) {\n return new SerializableFilterChain(json)\n }\n}\n","import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { alpha, Portal, useTheme } from '@mui/material'\n\nimport {\n useClientPoint,\n useFloating,\n useInteractions,\n} from '@floating-ui/react'\n\nfunction round(value: number) {\n return Math.round(value * 1e5) / 1e5\n}\n\nconst useStyles = makeStyles()(theme => ({\n // these styles come from\n // https://github.com/mui-org/material-ui/blob/master/packages/material-ui/src/Tooltip/Tooltip.js\n tooltip: {\n position: 'absolute',\n pointerEvents: 'none',\n backgroundColor: alpha(theme.palette.grey[700], 0.9),\n borderRadius: theme.shape.borderRadius,\n color: theme.palette.common.white,\n fontFamily: theme.typography.fontFamily,\n padding: '4px 8px',\n fontSize: theme.typography.pxToRem(12),\n lineHeight: `${round(14 / 10)}em`,\n maxWidth: 300,\n wordWrap: 'break-word',\n },\n}))\n\nexport default function BaseTooltip({\n clientPoint: clientPointCoords,\n children,\n placement = 'right',\n}: {\n placement?: 'left' | 'right'\n clientPoint?: { x: number; y: number }\n children: React.ReactNode\n}) {\n const theme = useTheme()\n const popperTheme = theme.components?.MuiPopper\n const { classes } = useStyles()\n const { refs, floatingStyles, context } = useFloating({\n placement,\n strategy: 'fixed',\n })\n\n const clientPoint = useClientPoint(context, clientPointCoords)\n const { getFloatingProps } = useInteractions([clientPoint])\n return (\n <Portal container={popperTheme?.defaultProps?.container}>\n <div\n className={classes.tooltip}\n ref={refs.setFloating}\n style={{\n ...floatingStyles,\n zIndex: 100000,\n // workaround for tooltips flashing at top left corner of screen\n // when first appearing\n visibility:\n floatingStyles.transform === 'translate(0px, 0px)'\n ? 'hidden'\n : undefined,\n pointerEvents: 'none',\n }}\n {...getFloatingProps()}\n >\n {children}\n </div>\n </Portal>\n )\n}\n","import React, { useEffect } from 'react'\nimport CascadingMenu from '@jbrowse/core/ui/CascadingMenu'\nimport { IconButton } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport {\n bindTrigger,\n bindPopover,\n usePopupState,\n} from 'material-ui-popup-state/hooks'\nimport { MenuItem } from '@jbrowse/core/ui'\n\nconst CascadingMenuButton = observer(function CascadingMenuButton({\n children,\n menuItems,\n closeAfterItemClick = true,\n stopPropagation,\n setOpen,\n onClick: onClickExtra,\n ...rest\n}: {\n children?: React.ReactElement\n menuItems: MenuItem[]\n closeAfterItemClick?: boolean\n stopPropagation?: boolean\n onClick?: () => void\n setOpen?: (arg: boolean) => void\n [key: string]: unknown\n}) {\n const popupState = usePopupState({\n popupId: 'viewMenu',\n variant: 'popover',\n })\n const { onClick, onTouchStart, ...rest2 } = bindTrigger(popupState)\n const { isOpen } = popupState\n useEffect(() => {\n setOpen?.(isOpen)\n }, [isOpen, setOpen])\n\n return (\n <>\n <IconButton\n onClick={event => {\n if (stopPropagation) {\n event.stopPropagation()\n }\n onClick(event)\n onClickExtra?.()\n }}\n onTouchStart={event => {\n if (stopPropagation) {\n event.stopPropagation()\n }\n onTouchStart(event)\n onClickExtra?.()\n }}\n {...rest2}\n {...rest}\n disabled={menuItems.length === 0}\n >\n {children}\n </IconButton>\n <CascadingMenu\n {...bindPopover(popupState)}\n onMenuItemClick={(_: unknown, callback: () => void) => {\n callback()\n }}\n menuItems={menuItems}\n closeAfterItemClick={closeAfterItemClick}\n popupState={popupState}\n />\n </>\n )\n})\n\nexport default CascadingMenuButton\n","import React, { useState } from 'react'\nimport {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n} from '@mui/material'\nimport FactoryResetDialog from './FactoryResetDialog'\nimport ErrorMessage from './ErrorMessage'\n\nconst ResetComponent = ({\n onFactoryReset,\n resetButtonText,\n}: {\n onFactoryReset: () => void\n resetButtonText: string\n}) => {\n const [dialogOpen, setDialogOpen] = useState(false)\n\n return (\n <>\n <Button\n data-testid=\"fatal-error\"\n color=\"primary\"\n variant=\"contained\"\n onClick={() => {\n setDialogOpen(true)\n }}\n >\n {resetButtonText}\n </Button>\n <FactoryResetDialog\n onClose={() => {\n setDialogOpen(false)\n }}\n open={dialogOpen}\n onFactoryReset={onFactoryReset}\n />\n </>\n )\n}\n\nexport default function FatalErrorDialog({\n componentStack,\n error = 'No error message provided',\n onFactoryReset,\n resetButtonText = 'Factory Reset',\n}: {\n componentStack?: string\n error?: unknown\n onFactoryReset: () => void\n resetButtonText?: string\n}) {\n return (\n <Dialog maxWidth=\"xl\" open>\n <DialogTitle>Fatal error</DialogTitle>\n <DialogContent>\n <ErrorMessage error={error} />\n <pre>{componentStack}</pre>\n </DialogContent>\n <DialogActions>\n <Button\n color=\"secondary\"\n variant=\"contained\"\n onClick={() => {\n window.location.reload()\n }}\n >\n Refresh\n </Button>\n <ResetComponent\n onFactoryReset={onFactoryReset}\n resetButtonText={resetButtonText}\n />\n </DialogActions>\n </Dialog>\n )\n}\n","import React from 'react'\nimport { Box, Button, Typography, FormControl } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { isElectron } from '../../util'\nimport { LocalPathLocation, FileLocation, BlobLocation } from '../../util/types'\nimport { getBlob, storeBlobLocation } from '../../util/tracks'\n\nfunction isLocalPathLocation(loc: FileLocation): loc is LocalPathLocation {\n return 'localPath' in loc\n}\n\nfunction isBlobLocation(loc: FileLocation): loc is BlobLocation {\n return 'blobId' in loc\n}\n\nconst useStyles = makeStyles()(theme => ({\n filename: {\n marginLeft: theme.spacing(1),\n },\n}))\n\nfunction LocalFileChooser({\n location,\n setLocation,\n}: {\n location?: FileLocation\n setLocation: (arg: FileLocation) => void\n}) {\n const { classes } = useStyles()\n const filename =\n location &&\n ((isBlobLocation(location) && location.name) ||\n (isLocalPathLocation(location) && location.localPath))\n\n const needToReload =\n location && isBlobLocation(location) && !getBlob(location.blobId)\n\n return (\n <Box display=\"flex\" flexDirection=\"row\" alignItems=\"center\">\n <Box>\n <FormControl fullWidth>\n <Button variant=\"outlined\" component=\"label\">\n Choose File\n <input\n type=\"file\"\n hidden\n onChange={({ target }) => {\n const file = target.files?.[0]\n if (file) {\n if (isElectron) {\n const { webUtils } = window.require('electron')\n setLocation({\n localPath: webUtils.getPathForFile(file),\n locationType: 'LocalPathLocation',\n })\n } else {\n // @ts-expect-error\n setLocation(storeBlobLocation({ blob: file }))\n }\n }\n }}\n />\n </Button>\n </FormControl>\n </Box>\n <Box>\n <Typography\n component=\"span\"\n className={classes.filename}\n color={filename ? 'initial' : 'textSecondary'}\n >\n {filename || 'No file chosen'}\n </Typography>\n {needToReload ? (\n <Typography color=\"error\">(need to reload)</Typography>\n ) : null}\n </Box>\n </Box>\n )\n}\n\nexport default LocalFileChooser\n","import React from 'react'\nimport { TextField } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { FileLocation, isUriLocation } from '../../util/types'\n\nconst UrlChooser = observer(function ({\n location,\n setLocation,\n label,\n}: {\n location?: FileLocation\n setLocation: (arg: FileLocation) => void\n label?: string\n}) {\n return (\n <TextField\n fullWidth\n variant=\"outlined\"\n inputProps={{ 'data-testid': 'urlInput' }}\n defaultValue={location && isUriLocation(location) ? location.uri : ''}\n label={label || 'Enter URL'}\n onChange={event => {\n setLocation({\n uri: event.target.value.trim(),\n locationType: 'UriLocation',\n })\n }}\n />\n )\n})\n\nexport default UrlChooser\n","import React from 'react'\nimport { Typography, TypographyProps } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { keyframes } from 'tss-react'\n\nconst useStyles = makeStyles()({\n dots: {\n '&::after': {\n display: 'inline-block',\n content: '\"\"',\n width: '1em',\n textAlign: 'left',\n animation: `${keyframes`\n 0% {\n content: '';\n }\n 25% {\n content: '.';\n }\n 50% {\n content: '..';\n }\n 75% {\n content: '...';\n }\n `} 1.2s infinite ease-in-out`,\n },\n },\n})\n\ninterface Props extends TypographyProps {\n message?: string\n}\n\nexport default function LoadingEllipses({\n message,\n variant = 'body2',\n ...rest\n}: Props) {\n const { classes } = useStyles()\n return (\n <Typography className={classes.dots} {...rest} variant={variant}>\n {message || 'Loading'}\n </Typography>\n )\n}\n","import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\n\nconst useStyles = makeStyles()(theme => ({\n bg: {\n padding: 4,\n margin: 4,\n overflow: 'auto',\n maxHeight: 200,\n background: theme.palette.mode === 'dark' ? '#833' : '#f88',\n border: `1px solid ${theme.palette.divider}`,\n },\n}))\n\nexport default function RedErrorMessageBox({\n children,\n}: {\n children: React.ReactNode\n}) {\n const { classes } = useStyles()\n return <div className={classes.bg}>{children}</div>\n}\n","const category10 = [\n '#1f77b4',\n '#ff7f0e',\n '#2ca02c',\n '#d62728',\n '#9467bd',\n '#8c564b',\n '#e377c2',\n '#7f7f7f',\n '#bcbd22',\n '#17becf',\n]\nconst dark2 = [\n '#1b9e77',\n '#d95f02',\n '#7570b3',\n '#e7298a',\n '#66a61e',\n '#e6ab02',\n '#a6761d',\n '#666666',\n]\nconst set1 = [\n '#e41a1c',\n '#377eb8',\n '#4daf4a',\n '#984ea3',\n '#ff7f00',\n '#ffff33',\n '#a65628',\n '#f781bf',\n '#999999',\n]\nconst set2 = [\n '#66c2a5',\n '#fc8d62',\n '#8da0cb',\n '#e78ac3',\n '#a6d854',\n '#ffd92f',\n '#e5c494',\n '#b3b3b3',\n]\nconst tableau10 = [\n '#4e79a7',\n '#f28e2c',\n '#e15759',\n '#76b7b2',\n '#59a14f',\n '#edc949',\n '#af7aa1',\n '#ff9da7',\n '#9c755f',\n '#bab0ab',\n]\n\nconst ggplot2Colors6 = [\n '#F8766D',\n '#B79F00',\n '#00BA38',\n '#00BFC4',\n '#619CFF',\n '#F564E3',\n]\n\nconst ggplot2Colors5 = ['#F8766D', '#A3A500', '#00BF7D', '#00B0F6', '#E76BF3']\nconst ggplot2Colors4 = ['#F8766D', '#7CAE00', '#00BFC4', '#C77CFF']\nconst ggplot2Colors3 = ['#F8766D', '#00BA38', '#619CFF']\n\nexport {\n set1,\n set2,\n tableau10,\n dark2,\n category10,\n ggplot2Colors6,\n ggplot2Colors5,\n ggplot2Colors4,\n ggplot2Colors3,\n}\n","import { Region, ViewSnap } from './index'\n\nexport interface BpOffset {\n refName?: string\n index: number\n offset: number\n start?: number\n end?: number\n}\n\nfunction lengthBetween(self: ViewSnap, start: BpOffset, end: BpOffset) {\n let bpSoFar = 0\n const { displayedRegions } = self\n if (start.index === end.index) {\n bpSoFar += end.offset - start.offset\n } else {\n const s = displayedRegions[start.index]!\n bpSoFar += s.end - s.start - start.offset\n if (end.index - start.index >= 2) {\n for (let i = start.index + 1; i < end.index; i++) {\n const region = displayedRegions[i]!\n const len = region.end - region.start\n bpSoFar += len\n }\n }\n bpSoFar += end.offset\n }\n return bpSoFar\n}\n\nexport function moveTo(\n self: ViewSnap & {\n zoomTo: (arg: number) => number\n scrollTo: (arg: number) => void\n },\n start?: BpOffset,\n end?: BpOffset,\n) {\n if (!start || !end) {\n return\n }\n const {\n width,\n interRegionPaddingWidth,\n displayedRegions,\n bpPerPx,\n minimumBlockWidth,\n } = self\n\n const len = lengthBetween(self, start, end)\n let numBlocksWideEnough = 0\n for (let i = start.index; i < end.index; i++) {\n const r = displayedRegions[i]!\n if ((r.end - r.start) / bpPerPx > minimumBlockWidth) {\n numBlocksWideEnough++\n }\n }\n\n const targetBpPerPx =\n len / (width - interRegionPaddingWidth * numBlocksWideEnough)\n const newBpPerPx = self.zoomTo(targetBpPerPx)\n\n // If our target bpPerPx was smaller than the allowed minBpPerPx, adjust\n // the scroll so the requested range is in the middle of the screen\n let extraBp = 0\n if (targetBpPerPx < newBpPerPx) {\n extraBp = ((newBpPerPx - targetBpPerPx) * self.width) / 2\n }\n\n let bpToStart = -extraBp\n\n for (let i = 0; i < self.displayedRegions.length; i += 1) {\n const region = self.displayedRegions[i]!\n if (start.index === i) {\n bpToStart += start.offset\n break\n } else {\n bpToStart += region.end - region.start\n }\n }\n\n self.scrollTo(Math.round(bpToStart / self.bpPerPx))\n}\n\nfunction coord(r: Region, bp: number) {\n return Math.floor(r.reversed ? r.end - bp : r.start + bp) + 1\n}\n\n// manual return type since getSnapshot hard to infer here\nexport function pxToBp(\n self: ViewSnap,\n px: number,\n): {\n coord: number\n index: number\n refName: string\n oob: boolean\n assemblyName: string\n offset: number\n start: number\n end: number\n reversed?: boolean\n} {\n let bpSoFar = 0\n const {\n bpPerPx,\n offsetPx,\n displayedRegions,\n interRegionPaddingWidth,\n staticBlocks,\n } = self\n const blocks = staticBlocks.contentBlocks\n const bp = (offsetPx + px) * bpPerPx\n if (bp < 0) {\n const r = displayedRegions[0]!\n const snap = r\n return {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n ...(snap as Omit<typeof snap, symbol>),\n oob: true,\n coord: coord(r, bp),\n offset: bp,\n index: 0,\n }\n }\n\n const interRegionPaddingBp = interRegionPaddingWidth * bpPerPx\n let currBlock = 0\n for (let i = 0; i < displayedRegions.length; i++) {\n const r = displayedRegions[i]!\n const len = r.end - r.start\n const offset = bp - bpSoFar\n if (len + bpSoFar > bp && bpSoFar <= bp) {\n const snap = r\n return {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n ...(snap as Omit<typeof snap, symbol>),\n oob: false,\n offset,\n coord: coord(r, offset),\n index: i,\n }\n }\n\n // add the interRegionPaddingWidth if the boundary is in the screen e.g. in\n // a static block\n if (blocks[currBlock]?.regionNumber === i) {\n bpSoFar += len + interRegionPaddingBp\n currBlock++\n } else {\n bpSoFar += len\n }\n }\n\n if (bp >= bpSoFar && displayedRegions.length > 0) {\n const r = displayedRegions.at(-1)!\n const len = r.end - r.start\n const offset = bp - bpSoFar + len\n\n const snap = r\n return {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n ...(snap as Omit<typeof snap, symbol>),\n oob: true,\n offset,\n coord: coord(r, offset),\n index: displayedRegions.length - 1,\n }\n }\n return {\n coord: 0,\n index: 0,\n refName: '',\n oob: true,\n assemblyName: '',\n offset: 0,\n start: 0,\n end: 0,\n reversed: false,\n }\n}\n\nexport function bpToPx({\n refName,\n coord,\n regionNumber,\n self,\n}: {\n refName: string\n coord: number\n regionNumber?: number\n self: ViewSnap\n}) {\n let bpSoFar = 0\n\n const { interRegionPaddingWidth, bpPerPx, displayedRegions, staticBlocks } =\n self\n const blocks = staticBlocks.contentBlocks\n const interRegionPaddingBp = interRegionPaddingWidth * bpPerPx\n let currBlock = 0\n\n let i = 0\n for (; i < displayedRegions.length; i++) {\n const r = displayedRegions[i]!\n const len = r.end - r.start\n if (\n refName === r.refName &&\n coord >= r.start &&\n coord <= r.end &&\n (regionNumber ? regionNumber === i : true)\n ) {\n bpSoFar += r.reversed ? r.end - coord : coord - r.start\n break\n }\n\n // add the interRegionPaddingWidth if the boundary is in the screen e.g. in\n // a static block\n if (blocks[currBlock]?.regionNumber === i) {\n bpSoFar += len + interRegionPaddingBp\n currBlock++\n } else {\n bpSoFar += len\n }\n }\n const found = displayedRegions[i]\n if (found) {\n return {\n index: i,\n offsetPx: Math.round(bpSoFar / bpPerPx),\n }\n }\n\n return undefined\n}\n\nexport function bpToPxMap({\n refName,\n coord,\n regionNumber,\n self,\n}: {\n refName: string\n coord: number\n regionNumber?: number\n self: ViewSnap\n}) {\n let bpSoFar = 0\n\n const { interRegionPaddingWidth, bpPerPx, displayedRegions, staticBlocks } =\n self\n const blocks = staticBlocks.contentBlocks\n const interRegionPaddingBp = interRegionPaddingWidth * bpPerPx\n const map = {}\n let currBlock = 0\n\n let i = 0\n for (; i < displayedRegions.length; i++) {\n const r = displayedRegions[i]!\n const len = r.end - r.start\n if (\n refName === r.refName &&\n coord >= r.start &&\n coord <= r.end &&\n (regionNumber === undefined ? true : regionNumber === i)\n ) {\n bpSoFar += r.reversed ? r.end - coord : coord - r.start\n break\n }\n\n // add the interRegionPaddingWidth if the boundary is in the screen e.g. in\n // a static block\n if (blocks[currBlock]?.regionNumber === i) {\n bpSoFar += len + interRegionPaddingBp\n currBlock++\n } else {\n bpSoFar += len\n }\n }\n const found = displayedRegions[i]\n if (found) {\n return {\n index: i,\n offsetPx: Math.round(bpSoFar / bpPerPx),\n }\n }\n\n return map\n}\n","import { types, cast, Instance } from 'mobx-state-tree'\nimport { clamp, sum } from './index'\nimport { Feature } from './simpleFeature'\nimport { ElementId } from './types/mst'\nimport { Region as IRegion } from './types'\nimport calculateDynamicBlocks from './calculateDynamicBlocks'\nimport calculateStaticBlocks from './calculateStaticBlocks'\nimport { moveTo, pxToBp, bpToPx, BpOffset } from './Base1DUtils'\n\n/**\n * #stateModel Base1DView\n * used in non-lgv view representations of a 1d view e.g. the two axes of the\n * dotplot use this\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst Base1DView = types\n .model('Base1DView', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n displayedRegions: types.optional(types.frozen<IRegion[]>(), []),\n /**\n * #property\n */\n bpPerPx: 0,\n /**\n * #property\n */\n offsetPx: 0,\n /**\n * #property\n */\n interRegionPaddingWidth: types.optional(types.number, 0),\n /**\n * #property\n */\n minimumBlockWidth: types.optional(types.number, 0),\n })\n .volatile(() => ({\n features: undefined as undefined | Feature[],\n volatileWidth: 0,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setDisplayedRegions(regions: IRegion[]) {\n self.displayedRegions = cast(regions)\n },\n /**\n * #action\n */\n setBpPerPx(val: number) {\n self.bpPerPx = val\n },\n /**\n * #action\n */\n setVolatileWidth(width: number) {\n self.volatileWidth = width\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get width() {\n return self.volatileWidth\n },\n /**\n * #getter\n */\n get assemblyNames() {\n return [...new Set(self.displayedRegions.map(r => r.assemblyName))]\n },\n /**\n * #getter\n */\n get displayedRegionsTotalPx() {\n return this.totalBp / self.bpPerPx\n },\n\n /**\n * #getter\n */\n get maxOffset() {\n // objectively determined to keep the linear genome on the main screen\n const leftPadding = 10\n return this.displayedRegionsTotalPx - leftPadding\n },\n\n /**\n * #getter\n */\n get minOffset() {\n // objectively determined to keep the linear genome on the main screen\n const rightPadding = 30\n return -this.width + rightPadding\n },\n\n /**\n * #getter\n */\n get totalBp() {\n return sum(self.displayedRegions.map(a => a.end - a.start))\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get dynamicBlocks() {\n return calculateDynamicBlocks(self)\n },\n\n /**\n * #getter\n */\n get staticBlocks() {\n return calculateStaticBlocks(self)\n },\n\n /**\n * #getter\n */\n get currBp() {\n return sum(this.dynamicBlocks.map(a => a.end - a.start))\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n pxToBp(px: number) {\n return pxToBp(self, px)\n },\n\n /**\n * #method\n */\n bpToPx({\n refName,\n coord,\n regionNumber,\n }: {\n refName: string\n coord: number\n regionNumber?: number\n }) {\n return bpToPx({ refName, coord, regionNumber, self })?.offsetPx\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setFeatures(features: Feature[]) {\n self.features = features\n },\n\n /**\n * #action\n * this makes a zoomed out view that shows all displayedRegions that makes\n * the overview bar square with the scale bar\n */\n showAllRegions() {\n self.bpPerPx = self.totalBp / self.width\n self.offsetPx = 0\n },\n\n /**\n * #action\n */\n zoomOut() {\n this.zoomTo(self.bpPerPx * 2)\n },\n\n /**\n * #action\n */\n zoomIn() {\n this.zoomTo(self.bpPerPx / 2)\n },\n\n /**\n * #action\n */\n zoomTo(bpPerPx: number, offset = self.width / 2) {\n const newBpPerPx = clamp(\n bpPerPx,\n 'minBpPerPx' in self ? (self.minBpPerPx as number) : 0,\n 'maxBpPerPx' in self\n ? (self.maxBpPerPx as number)\n : Number.POSITIVE_INFINITY,\n )\n\n const oldBpPerPx = self.bpPerPx\n if (Math.abs(oldBpPerPx - newBpPerPx) < 0.000001) {\n return oldBpPerPx\n }\n\n self.bpPerPx = newBpPerPx\n\n // tweak the offset so that the center of the view remains at the same\n // coordinate\n self.offsetPx = clamp(\n Math.round(\n ((self.offsetPx + offset) * oldBpPerPx) / newBpPerPx - offset,\n ),\n self.minOffset,\n self.maxOffset,\n )\n return self.bpPerPx\n },\n\n /**\n * #action\n */\n scrollTo(offsetPx: number) {\n const newOffsetPx = clamp(offsetPx, self.minOffset, self.maxOffset)\n self.offsetPx = newOffsetPx\n return newOffsetPx\n },\n /**\n * #action\n */\n centerAt(coord: number, refName: string | undefined, regionNumber: number) {\n if (!refName) {\n return\n }\n const centerPx = self.bpToPx({\n refName,\n coord,\n regionNumber,\n })\n if (centerPx) {\n this.scrollTo(Math.round(centerPx - self.width / 2))\n }\n },\n\n /**\n * #action\n * note: the scroll is clamped to keep the view on the main screen\n */\n scroll(distance: number) {\n const oldOffsetPx = self.offsetPx\n const newOffsetPx = clamp(\n self.offsetPx + distance,\n self.minOffset,\n self.maxOffset,\n )\n self.offsetPx = newOffsetPx\n return newOffsetPx - oldOffsetPx\n },\n }))\n .actions(self => ({\n /**\n * #action\n * offset is the base-pair-offset in the displayed region, index is the\n * index of the displayed region in the linear genome view\n *\n * @param start - object as `{start, end, offset, index}`\n * @param end - object as `{start, end, offset, index}`\n */\n moveTo(start?: BpOffset, end?: BpOffset) {\n moveTo(self, start, end)\n },\n }))\n\nexport type Base1DViewStateModel = typeof Base1DView\nexport type Base1DViewModel = Instance<Base1DViewStateModel>\n\nexport default Base1DView\n","import { Observable, fromEvent } from 'rxjs'\n\nclass AbortError extends Error {\n public code: string | undefined\n}\n\n/**\n * properly check if the given AbortSignal is aborted.\n * per the standard, if the signal reads as aborted,\n * this function throws either a DOMException AbortError, or a regular error\n * with a `code` attribute set to `ERR_ABORTED`.\n *\n * for convenience, passing `undefined` is a no-op\n *\n * @param signal -\n * @returns nothing\n */\nexport function checkAbortSignal(signal?: AbortSignal): void {\n if (!signal) {\n return\n }\n\n if (!(signal instanceof AbortSignal)) {\n throw new TypeError('must pass an AbortSignal')\n }\n\n if (signal.aborted) {\n throw makeAbortError()\n }\n}\n\nfunction timeout(ms: number) {\n return new Promise(resolve => setTimeout(resolve, ms))\n}\n/**\n * Skips to the next tick, then runs `checkAbortSignal`.\n * Await this to inside an otherwise synchronous loop to\n * provide a place to break when an abort signal is received.\n */\nexport async function abortBreakPoint(signal?: AbortSignal) {\n // it was observed that an actual timeout is needed to get the aborting (wrap\n // hicrenderer in a try catch, console.error the error, and rethrow the error\n // to see). using await Promise.resolve() did not appear to allow aborting to\n // occur\n await timeout(1)\n checkAbortSignal(signal)\n}\n\nexport function makeAbortError() {\n if (typeof DOMException !== 'undefined') {\n return new DOMException('aborted', 'AbortError')\n }\n const e = new AbortError('aborted')\n e.code = 'ERR_ABORTED'\n return e\n}\n\nexport function observeAbortSignal(signal?: AbortSignal): Observable<Event> {\n if (!signal) {\n return new Observable()\n }\n return fromEvent(signal, 'abort')\n}\n\n/**\n * check if the given exception was caused by an operation being intentionally aborted\n * @param exception -\n */\nexport function isAbortException(exception: unknown): boolean {\n return (\n exception instanceof Error &&\n // DOMException\n (exception.name === 'AbortError' ||\n // standard-ish non-DOM abort exception\n (exception as AbortError).code === 'ERR_ABORTED' ||\n // message contains aborted for bubbling through RPC\n // things we have seen that we want to catch here\n // Error: aborted\n // AbortError: aborted\n // AbortError: The user aborted a request.\n !!/\\b(aborted|aborterror)\\b/i.test(exception.message))\n )\n}\n","export function blobToDataURL(blob: Blob): Promise<string> {\n const a = new FileReader()\n return new Promise((resolve, reject) => {\n a.onload = e => {\n if (e.target) {\n resolve(e.target.result as string)\n } else {\n reject(new Error('unknown result reading blob from canvas'))\n }\n }\n a.readAsDataURL(blob)\n })\n}\n","import { sum } from '.'\n\ntype Func<T> = (value: BaseBlock, index: number, array: BaseBlock[]) => T\n\nexport class BlockSet {\n constructor(public blocks: BaseBlock[] = []) {}\n\n push(block: BaseBlock) {\n if (block.type === 'ElidedBlock' && this.blocks.length > 0) {\n const lastBlock = this.blocks.at(-1)\n if (lastBlock?.type === 'ElidedBlock') {\n ;(lastBlock as ElidedBlock).push(block as ElidedBlock)\n return\n }\n }\n\n this.blocks.push(block)\n }\n\n getBlocks() {\n return this.blocks\n }\n\n getRegions() {\n return this.blocks.map(block => block.toRegion())\n }\n\n map<T, U = this>(func: Func<T>, thisarg?: U) {\n // eslint-disable-next-line unicorn/no-array-method-this-argument\n return this.blocks.map(func, thisarg)\n }\n\n forEach<T, U = this>(func: Func<T>, thisarg?: U) {\n // eslint-disable-next-line unicorn/no-array-method-this-argument\n this.blocks.forEach(func, thisarg)\n }\n\n get length() {\n return this.blocks.length\n }\n\n get totalWidthPx() {\n return this.blocks.length > 0\n ? sum(this.blocks.map(blocks => blocks.widthPx))\n : 0\n }\n\n get totalWidthPxWithoutBorders() {\n return this.blocks.length > 0\n ? sum(\n this.blocks\n .filter(block => block.variant !== 'boundary')\n .map(blocks => blocks.widthPx),\n )\n : 0\n }\n\n get offsetPx() {\n return this.blocks.length > 0 ? this.blocks[0]!.offsetPx : 0\n }\n\n get contentBlocks() {\n return this.blocks.filter(block => block.type === 'ContentBlock')\n }\n\n get totalBp() {\n return sum(this.contentBlocks.map(block => block.end - block.start))\n }\n}\n\nexport class BaseBlock {\n type = 'BaseBlock'\n\n public regionNumber?: number\n\n public reversed?: boolean\n\n public refName: string\n\n public start: number\n\n public end: number\n\n public assemblyName: string\n\n public key: string\n\n public offsetPx: number\n\n public widthPx = 0\n\n public variant?: string\n\n public isLeftEndOfDisplayedRegion?: boolean\n\n /**\n * a block that should be shown as filled with data\n */\n\n constructor(data: Record<string, any>) {\n Object.assign(this, data)\n this.assemblyName = data.assemblyName\n this.refName = data.refName\n this.start = data.start\n this.end = data.end\n this.key = data.key\n this.offsetPx = data.offsetPx\n }\n\n toRegion() {\n return {\n refName: this.refName,\n start: this.start,\n end: this.end,\n assemblyName: this.assemblyName,\n reversed: this.reversed,\n }\n }\n}\n\nexport class ContentBlock extends BaseBlock {\n type = 'ContentBlock'\n}\n\n/**\n * marker block representing one or more blocks that are\n * too small to be shown at the current zoom level\n */\nexport class ElidedBlock extends BaseBlock {\n type = 'ElidedBlock'\n\n public widthPx: number\n\n public elidedBlockCount = 0\n\n constructor(data: Record<string, any>) {\n super(data)\n this.widthPx = data.widthPx\n }\n\n push(otherBlock: ElidedBlock) {\n this.elidedBlockCount += 1\n this.refName = ''\n this.start = 0\n this.end = 0\n this.widthPx += otherBlock.widthPx\n }\n}\n\n/**\n * marker block that sits between two different displayed regions\n * and provides a thick border between them\n */\nexport class InterRegionPaddingBlock extends BaseBlock {\n type = 'InterRegionPaddingBlock'\n}\n","import { isStateTreeNode, getSnapshot } from 'mobx-state-tree'\nimport { intersection2 } from './range'\nimport { assembleLocStringFast } from '.'\nimport {\n BlockSet,\n ContentBlock,\n ElidedBlock,\n InterRegionPaddingBlock,\n} from './blockTypes'\nimport { Base1DViewModel } from './calculateStaticBlocks'\n\n/**\n * returns a BlockSet of which the `blocks` attribute is an array of 'dynamic\n * blocks', which are blocks representing only the regions that are visible in\n * the view right now. these are mostly used by tracks for which static blocks\n * are not feasible.\n *\n * each block is a plain JS object like:\n * `{ refName, start, end, offsetPx, reversed? }`\n *\n * start and end are in bp, and start is always less than end, but if reversed\n * is true, startBp will be on the right side of the visible region.\n *\n * offsetPx is the number of pixels from the left edge of the view to the left\n * edge of the region\n *\n * NOTE: start, end, and offsetPx may all be fractional!\n *\n * @returns BlockSet of `{ refName, startBp, end, offset, reversed? }`\n */\nexport default function calculateDynamicBlocks(\n model: Base1DViewModel,\n padding = true,\n elision = true,\n) {\n const {\n offsetPx,\n displayedRegions,\n bpPerPx,\n width,\n minimumBlockWidth,\n interRegionPaddingWidth,\n } = model\n\n if (!width) {\n throw new Error('view has no width, cannot calculate displayed blocks')\n }\n const blocks = new BlockSet()\n let displayedRegionLeftPx = 0\n const windowLeftPx = offsetPx\n const windowRightPx = windowLeftPx + width\n for (\n let regionNumber = 0;\n regionNumber < displayedRegions.length;\n regionNumber++\n ) {\n const region = displayedRegions[regionNumber]\n const {\n assemblyName,\n refName,\n start: regionStart,\n end: regionEnd,\n reversed,\n } = region!\n const displayedRegionRightPx =\n displayedRegionLeftPx + (regionEnd - regionStart) / bpPerPx\n\n const regionWidthPx = (regionEnd - regionStart) / bpPerPx\n const parentRegion = isStateTreeNode(region) ? getSnapshot(region) : region\n\n const [leftPx, rightPx] = intersection2(\n windowLeftPx,\n windowRightPx,\n displayedRegionLeftPx,\n displayedRegionRightPx,\n )\n if (leftPx !== undefined && rightPx !== undefined) {\n // this displayed region overlaps the view, so make a record for it\n let start: number\n let end: number\n let isLeftEndOfDisplayedRegion: boolean\n let isRightEndOfDisplayedRegion: boolean\n let blockOffsetPx: number\n if (reversed) {\n start = Math.max(\n regionStart,\n regionEnd - (rightPx - displayedRegionLeftPx) * bpPerPx,\n )\n end = regionEnd - (leftPx - displayedRegionLeftPx) * bpPerPx\n isLeftEndOfDisplayedRegion = end === regionEnd\n isRightEndOfDisplayedRegion = start === regionStart\n blockOffsetPx = displayedRegionLeftPx + (regionEnd - end) / bpPerPx\n } else {\n start = (leftPx - displayedRegionLeftPx) * bpPerPx + regionStart\n end = Math.min(\n regionEnd,\n (rightPx - displayedRegionLeftPx) * bpPerPx + regionStart,\n )\n isLeftEndOfDisplayedRegion = start === regionStart\n isRightEndOfDisplayedRegion = end === regionEnd\n blockOffsetPx = displayedRegionLeftPx + (start - regionStart) / bpPerPx\n }\n const widthPx = (end - start) / bpPerPx\n const blockData = {\n assemblyName,\n refName,\n start,\n end,\n reversed,\n offsetPx: blockOffsetPx,\n parentRegion,\n regionNumber,\n widthPx,\n isLeftEndOfDisplayedRegion,\n isRightEndOfDisplayedRegion,\n key: '',\n }\n blockData.key = `${assembleLocStringFast(blockData)}-${regionNumber}${\n reversed ? '-reversed' : ''\n }`\n\n if (padding && blocks.length === 0 && isLeftEndOfDisplayedRegion) {\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-beforeFirstRegion`,\n widthPx: -offsetPx,\n offsetPx: blockData.offsetPx + offsetPx,\n variant: 'boundary',\n }),\n )\n }\n\n if (elision && regionWidthPx < minimumBlockWidth) {\n blocks.push(new ElidedBlock(blockData))\n } else {\n blocks.push(new ContentBlock(blockData))\n }\n\n if (padding) {\n // insert a inter-region padding block if we are crossing a displayed region\n if (\n regionWidthPx >= minimumBlockWidth &&\n blockData.isRightEndOfDisplayedRegion &&\n regionNumber < displayedRegions.length - 1\n ) {\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-rightpad`,\n widthPx: interRegionPaddingWidth,\n offsetPx: blockData.offsetPx + blockData.widthPx,\n }),\n )\n displayedRegionLeftPx += interRegionPaddingWidth\n }\n\n if (\n regionNumber === displayedRegions.length - 1 &&\n blockData.isRightEndOfDisplayedRegion\n ) {\n blockOffsetPx = blockData.offsetPx + blockData.widthPx\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-afterLastRegion`,\n widthPx: width - blockOffsetPx + offsetPx,\n offsetPx: blockOffsetPx,\n variant: 'boundary',\n }),\n )\n }\n }\n }\n displayedRegionLeftPx += (regionEnd - regionStart) / bpPerPx\n }\n return blocks\n}\n","import { isStateTreeNode, getSnapshot, Instance } from 'mobx-state-tree'\nimport { assembleLocStringFast } from '.'\nimport {\n BlockSet,\n ContentBlock,\n ElidedBlock,\n InterRegionPaddingBlock,\n} from './blockTypes'\nimport { Region } from './types'\nimport type { Region as RegionModel } from './types/mst'\n\nexport interface Base1DViewModel {\n offsetPx: number\n width: number\n displayedRegions: (Region | Instance<typeof RegionModel>)[]\n bpPerPx: number\n minimumBlockWidth: number\n interRegionPaddingWidth: number\n}\n\nexport default function calculateStaticBlocks(\n model: Base1DViewModel,\n padding = true,\n elision = true,\n extra = 0,\n width = 800,\n) {\n const {\n offsetPx,\n displayedRegions,\n bpPerPx,\n minimumBlockWidth,\n interRegionPaddingWidth,\n width: modelWidth,\n } = model\n\n const windowLeftBp = offsetPx * bpPerPx\n const windowRightBp = (offsetPx + modelWidth) * bpPerPx\n const blockSizePx = width\n const blockSizeBp = Math.ceil(blockSizePx * bpPerPx)\n // for each displayed region\n let regionBpOffset = 0\n const blocks = new BlockSet()\n for (\n let regionNumber = 0;\n regionNumber < displayedRegions.length;\n regionNumber++\n ) {\n const region = displayedRegions[regionNumber]!\n const {\n assemblyName,\n refName,\n start: regionStart,\n end: regionEnd,\n reversed,\n } = region\n\n const regionBlockCount = Math.ceil((regionEnd - regionStart) / blockSizeBp)\n const parentRegion = isStateTreeNode(region) ? getSnapshot(region) : region\n\n let windowRightBlockNum =\n Math.floor((windowRightBp - regionBpOffset) / blockSizeBp) + extra\n if (windowRightBlockNum >= regionBlockCount) {\n windowRightBlockNum = regionBlockCount - 1\n }\n\n let windowLeftBlockNum =\n Math.floor((windowLeftBp - regionBpOffset) / blockSizeBp) - extra\n if (windowLeftBlockNum < 0) {\n windowLeftBlockNum = 0\n }\n\n const regionWidthPx = (regionEnd - regionStart) / bpPerPx\n\n for (\n let blockNum = windowLeftBlockNum;\n blockNum <= windowRightBlockNum;\n blockNum += 1\n ) {\n let start: number\n let end: number\n let isLeftEndOfDisplayedRegion: boolean\n let isRightEndOfDisplayedRegion: boolean\n if (reversed) {\n start = Math.max(regionStart, regionEnd - (blockNum + 1) * blockSizeBp)\n end = regionEnd - blockNum * blockSizeBp\n isLeftEndOfDisplayedRegion = end === regionEnd\n isRightEndOfDisplayedRegion = start === regionStart\n } else {\n start = regionStart + blockNum * blockSizeBp\n end = Math.min(regionEnd, regionStart + (blockNum + 1) * blockSizeBp)\n isLeftEndOfDisplayedRegion = start === regionStart\n isRightEndOfDisplayedRegion = end === regionEnd\n }\n const widthPx = (end - start) / bpPerPx\n const blockData = {\n assemblyName,\n refName,\n start,\n end,\n reversed,\n offsetPx: (regionBpOffset + blockNum * blockSizeBp) / bpPerPx,\n parentRegion,\n regionNumber,\n widthPx,\n isLeftEndOfDisplayedRegion,\n isRightEndOfDisplayedRegion,\n key: '',\n }\n blockData.key = `${assembleLocStringFast(blockData)}-${regionNumber}${\n reversed ? '-reversed' : ''\n }`\n\n if (padding && regionNumber === 0 && blockNum === 0) {\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-beforeFirstRegion`,\n widthPx: width,\n offsetPx: blockData.offsetPx - width,\n variant: 'boundary',\n }),\n )\n }\n\n if (elision && regionWidthPx < minimumBlockWidth) {\n blocks.push(new ElidedBlock(blockData))\n } else {\n blocks.push(new ContentBlock(blockData))\n }\n\n if (padding) {\n // insert a inter-region padding block if we are crossing a displayed region\n if (\n regionWidthPx >= minimumBlockWidth &&\n blockData.isRightEndOfDisplayedRegion &&\n regionNumber < displayedRegions.length - 1\n ) {\n regionBpOffset += interRegionPaddingWidth * bpPerPx\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-rightpad`,\n widthPx: interRegionPaddingWidth,\n offsetPx: blockData.offsetPx + blockData.widthPx,\n }),\n )\n }\n if (\n regionNumber === displayedRegions.length - 1 &&\n blockData.isRightEndOfDisplayedRegion\n ) {\n regionBpOffset += interRegionPaddingWidth * bpPerPx\n blocks.push(\n new InterRegionPaddingBlock({\n key: `${blockData.key}-afterLastRegion`,\n widthPx: width,\n offsetPx: blockData.offsetPx + blockData.widthPx,\n variant: 'boundary',\n }),\n )\n }\n }\n }\n regionBpOffset += regionEnd - regionStart\n }\n return blocks\n}\n","// from https://www.w3.org/TR/css-color-4/#named-colors\n\nconst colors: Record<string, string> = {\n aliceblue: '#F0F8FF',\n antiquewhite: '#FAEBD7',\n aqua: '#00FFFF',\n aquamarine: '#7FFFD4',\n azure: '#F0FFFF',\n beige: '#F5F5DC',\n bisque: '#FFE4C4',\n black: '#000000',\n blanchedalmond: '#FFEBCD',\n blue: '#0000FF',\n blueviolet: '#8A2BE2',\n brown: '#A52A2A',\n burlywood: '#DEB887',\n cadetblue: '#5F9EA0',\n chartreuse: '#7FFF00',\n chocolate: '#D2691E',\n coral: '#FF7F50',\n cornflowerblue: '#6495ED',\n cornsilk: '#FFF8DC',\n crimson: '#DC143C',\n cyan: '#00FFFF',\n darkblue: '#00008B',\n darkcyan: '#008B8B',\n darkgoldenrod: '#B8860B',\n darkgray: '#A9A9A9',\n darkgreen: '#006400',\n darkgrey: '#A9A9A9',\n darkkhaki: '#BDB76B',\n darkmagenta: '#8B008B',\n darkolivegreen: '#556B2F',\n darkorange: '#FF8C00',\n darkorchid: '#9932CC',\n darkred: '#8B0000',\n darksalmon: '#E9967A',\n darkseagreen: '#8FBC8F',\n darkslateblue: '#483D8B',\n darkslategray: '#2F4F4F',\n darkslategrey: '#2F4F4F',\n darkturquoise: '#00CED1',\n darkviolet: '#9400D3',\n deeppink: '#FF1493',\n deepskyblue: '#00BFFF',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1E90FF',\n firebrick: '#B22222',\n floralwhite: '#FFFAF0',\n forestgreen: '#228B22',\n fuchsia: '#FF00FF',\n gainsboro: '#DCDCDC',\n ghostwhite: '#F8F8FF',\n gold: '#FFD700',\n goldenrod: '#DAA520',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#ADFF2F',\n grey: '#808080',\n honeydew: '#F0FFF0',\n hotpink: '#FF69B4',\n indianred: '#CD5C5C',\n indigo: '#4B0082',\n ivory: '#FFFFF0',\n khaki: '#F0E68C',\n lavender: '#E6E6FA',\n lavenderblush: '#FFF0F5',\n lawngreen: '#7CFC00',\n lemonchiffon: '#FFFACD',\n lightblue: '#ADD8E6',\n lightcoral: '#F08080',\n lightcyan: '#E0FFFF',\n lightgoldenrodyellow: '#FAFAD2',\n lightgray: '#D3D3D3',\n lightgreen: '#90EE90',\n lightgrey: '#D3D3D3',\n lightpink: '#FFB6C1',\n lightsalmon: '#FFA07A',\n lightseagreen: '#20B2AA',\n lightskyblue: '#87CEFA',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#B0C4DE',\n lightyellow: '#FFFFE0',\n lime: '#00FF00',\n limegreen: '#32CD32',\n linen: '#FAF0E6',\n magenta: '#FF00FF',\n maroon: '#800000',\n mediumaquamarine: '#66CDAA',\n mediumblue: '#0000CD',\n mediumorchid: '#BA55D3',\n mediumpurple: '#9370DB',\n mediumseagreen: '#3CB371',\n mediumslateblue: '#7B68EE',\n mediumspringgreen: '#00FA9A',\n mediumturquoise: '#48D1CC',\n mediumvioletred: '#C71585',\n midnightblue: '#191970',\n mintcream: '#F5FFFA',\n mistyrose: '#FFE4E1',\n moccasin: '#FFE4B5',\n navajowhite: '#FFDEAD',\n navy: '#000080',\n oldlace: '#FDF5E6',\n olive: '#808000',\n olivedrab: '#6B8E23',\n orange: '#FFA500',\n orangered: '#FF4500',\n orchid: '#DA70D6',\n palegoldenrod: '#EEE8AA',\n palegreen: '#98FB98',\n paleturquoise: '#AFEEEE',\n palevioletred: '#DB7093',\n papayawhip: '#FFEFD5',\n peachpuff: '#FFDAB9',\n peru: '#CD853F',\n pink: '#FFC0CB',\n plum: '#DDA0DD',\n powderblue: '#B0E0E6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#FF0000',\n rosybrown: '#BC8F8F',\n royalblue: '#4169E1',\n saddlebrown: '#8B4513',\n salmon: '#FA8072',\n sandybrown: '#F4A460',\n seagreen: '#2E8B57',\n seashell: '#FFF5EE',\n sienna: '#A0522D',\n silver: '#C0C0C0',\n skyblue: '#87CEEB',\n slateblue: '#6A5ACD',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#FFFAFA',\n springgreen: '#00FF7F',\n steelblue: '#4682B4',\n tan: '#D2B48C',\n teal: '#008080',\n thistle: '#D8BFD8',\n tomato: '#FF6347',\n turquoise: '#40E0D0',\n violet: '#EE82EE',\n wheat: '#F5DEB3',\n white: '#FFFFFF',\n whitesmoke: '#F5F5F5',\n yellow: '#FFFF00',\n yellowgreen: '#9ACD32',\n}\n\nexport function namedColorToHex(name: string): string | undefined {\n return colors[name]\n}\n\nexport function isNamedColor(name: string): boolean {\n return !!colors[name]\n}\n","import {\n darken,\n emphasize as muiEmphasize,\n getContrastRatio,\n getLuminance as muiGetLuminance,\n lighten,\n} from '@mui/material/styles'\nimport { namedColorToHex } from './cssColorsLevel4'\n\n/**\n * Algorithmically pick a contrasting text color that will\n * be visible on top of the given background color. Either\n * black or white.\n *\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(),\n * hsl(), hsla(), or named color\n * @returns 'black' or 'white'\n */\nexport function contrastingTextColor(color: string): string {\n const luminance = getLuminance(color)\n return luminance > 0.5 ? 'black' : 'white'\n}\n\n/**\n * The relative brightness of any point in a color space,\n * normalized to 0 for darkest black and 1 for lightest white.\n * Uses MUI's `getLuminance`, but adds support for named colors\n *\n * Formula: https://www.w3.org/TR/WCAG20-TECHS/G17.html#G17-tests\n *\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(),\n * hsl(), hsla(), or named color\n * @returns The relative brightness of the color in the range 0 - 1\n */\nfunction getLuminance(color: string): number {\n const convertedColor = namedColorToHex(color)\n return muiGetLuminance(convertedColor || color)\n}\n\n/**\n * Darken or lighten a color, depending on its luminance.\n * Light colors are darkened, dark colors are lightened.\n * Uses MUI's `emphasize`, but adds support for named colors\n *\n * @param color - CSS color, i.e. one of: #nnn, #nnnnnn, rgb(), rgba(),\n * hsl(), hsla(), or named color\n * @param coefficient - multiplier in the range 0 - 1, defaults to 0.15\n * @returns A CSS color string. Hex input values are returned as rgb\n */\nexport function emphasize(color: string, coefficient = 0.15): string {\n const convertedColor = namedColorToHex(color)\n return muiEmphasize(convertedColor || color, coefficient)\n}\n\nexport function makeContrasting(\n foreground: string,\n background = 'white',\n minContrastRatio = 3,\n) {\n let convertedForeground = namedColorToHex(foreground) || foreground\n const convertedBackground = namedColorToHex(background) || background\n const backgroundLuminance = getLuminance(convertedBackground)\n let contrastRatio = getContrastRatio(convertedForeground, convertedBackground)\n const originalColor = convertedForeground\n let coefficient = 0.05\n while (contrastRatio < minContrastRatio) {\n convertedForeground =\n backgroundLuminance > 0.5\n ? darken(originalColor, coefficient)\n : lighten(originalColor, coefficient)\n coefficient += 0.05\n contrastRatio = getContrastRatio(convertedForeground, convertedBackground)\n }\n return convertedForeground\n}\n\nexport { isNamedColor, namedColorToHex } from './cssColorsLevel4'\n","import { extend } from 'colord'\nimport mix from 'colord/plugins/mix'\nimport names from 'colord/plugins/names'\nextend([mix, names])\n\nexport { Colord, colord } from 'colord'\n","type Hasher<T> = (input: T) => string\n\n// from https://github.com/seriousManual/dedupe/blob/master/LICENSE\nexport function dedupe<T>(list: T[], hasher: Hasher<T> = JSON.stringify) {\n const clone: T[] = []\n const lookup = new Set<string>()\n\n for (const entry of list) {\n const hashed = hasher(entry)\n\n if (!lookup.has(hashed)) {\n clone.push(entry)\n lookup.add(hashed)\n }\n }\n\n return clone\n}\n","import { hashCode } from './'\n\n// generates a short \"id fingerprint\" from the config passed to the base\n// feature adapter by recursively enumerating props, but if config is too big\n// does not process entire config (FromConfigAdapter for example can be large)\n\nexport default function idMaker(args: any, id = '') {\n const keys = Object.keys(args)\n for (const key of keys) {\n if (id.length > 5000) {\n break\n }\n id +=\n typeof args[key] === 'object' && args[key]\n ? idMaker(args[key], id)\n : `${key}-${args[key]};`\n }\n return hashCode(id)\n}\n","import { HttpRangeFetcher } from '@gmod/http-range-fetcher'\nimport { Buffer } from 'buffer'\nimport { RemoteFile, PolyfilledResponse } from 'generic-filehandle'\n\ntype BinaryRangeFetch = (\n url: string,\n start: number,\n end: number,\n options?: { headers?: HeadersInit; signal?: AbortSignal },\n) => Promise<BinaryRangeResponse>\n\nexport interface BinaryRangeResponse {\n headers: Record<string, string>\n requestDate: Date\n responseDate: Date\n buffer: Buffer\n}\n\nconst fetchers: Record<string, BinaryRangeFetch> = {}\n\nfunction binaryRangeFetch(\n url: string,\n start: number,\n end: number,\n options: { headers?: HeadersInit; signal?: AbortSignal } = {},\n): Promise<BinaryRangeResponse> {\n const fetcher = fetchers[url]\n if (!fetcher) {\n throw new Error(`fetch not registered for ${url}`)\n }\n return fetcher(url, start, end, options)\n}\n\nconst globalRangeCache = new HttpRangeFetcher({\n fetch: binaryRangeFetch,\n size: 500 * 1024 ** 2, // 500MiB\n chunkSize: 128 * 1024, // 128KiB\n maxFetchSize: 100 * 1024 ** 2, // 100MiB\n minimumTTL: 24 * 60 * 60 * 1000, // 1 day\n})\n\nexport function clearCache() {\n globalRangeCache.reset()\n}\n\nexport class RemoteFileWithRangeCache extends RemoteFile {\n public async fetch(\n url: RequestInfo,\n init?: RequestInit,\n ): Promise<PolyfilledResponse> {\n const str = String(url)\n if (!fetchers[str]) {\n fetchers[str] = this.fetchBinaryRange.bind(this)\n }\n // if it is a range request, route it through the range cache\n const range = new Headers(init?.headers).get('range')\n if (range) {\n const rangeParse = /bytes=(\\d+)-(\\d+)/.exec(range)\n if (rangeParse) {\n const [, start, end] = rangeParse\n const s = Number.parseInt(start!, 10)\n const e = Number.parseInt(end!, 10)\n const len = e - s\n const { buffer, headers } = (await globalRangeCache.getRange(\n url,\n s,\n len + 1,\n { signal: init?.signal },\n )) as BinaryRangeResponse\n return new Response(buffer, { status: 206, headers })\n }\n }\n return super.fetch(url, init)\n }\n\n public async fetchBinaryRange(\n url: string,\n start: number,\n end: number,\n options: { headers?: HeadersInit; signal?: AbortSignal } = {},\n ): Promise<BinaryRangeResponse> {\n const requestDate = new Date()\n const res = await super.fetch(url, {\n ...options,\n headers: {\n ...options.headers,\n range: `bytes=${start}-${end}`,\n },\n })\n const responseDate = new Date()\n if (!res.ok) {\n const errorMessage = `HTTP ${res.status} fetching ${url} bytes ${start}-${end}`\n const hint = ' (should be 206 for range requests)'\n throw new Error(`${errorMessage}${res.status === 200 ? hint : ''}`)\n }\n\n // translate the Headers object into a regular key -> value object.\n // will miss duplicate headers of course\n\n const headers: Record<string, any> = {}\n for (const [k, v] of res.headers.entries()) {\n headers[k] = v\n }\n\n // return the response headers, and the data buffer\n const arrayBuffer = await res.arrayBuffer()\n return {\n headers,\n requestDate,\n responseDate,\n buffer: Buffer.from(arrayBuffer),\n }\n }\n}\n","import {\n BlobFile,\n GenericFilehandle,\n LocalFile,\n Fetcher,\n} from 'generic-filehandle'\nimport isNode from 'detect-node'\n\n// locals\nimport { RemoteFileWithRangeCache } from './RemoteFileWithRangeCache'\nimport {\n FileLocation,\n LocalPathLocation,\n BlobLocation,\n isRootModelWithInternetAccounts,\n isUriLocation,\n AuthNeededError,\n UriLocation,\n} from '../types'\nimport { BaseInternetAccountModel } from '../../pluggableElementTypes/models'\nimport { getBlob } from '../tracks'\nimport PluginManager from '../../PluginManager'\nimport { isElectron } from '../'\n\nfunction isLocalPathLocation(\n location: FileLocation,\n): location is LocalPathLocation {\n return 'localPath' in location\n}\n\nfunction isBlobLocation(location: FileLocation): location is BlobLocation {\n return 'blobId' in location\n}\n\n/** if a UriLocation has a baseUri, resolves its uri with respect to that base */\nexport function resolveUriLocation(location: UriLocation) {\n return location.baseUri\n ? { ...location, uri: new URL(location.uri, location.baseUri).href }\n : location\n}\n\nexport function openLocation(\n location: FileLocation,\n pluginManager?: PluginManager,\n): GenericFilehandle {\n if (isLocalPathLocation(location)) {\n if (!location.localPath) {\n throw new Error('No local path provided')\n }\n\n if (isNode || isElectron) {\n return new LocalFile(location.localPath)\n } else {\n throw new Error(\"can't use local files in the browser\")\n }\n }\n if (isBlobLocation(location)) {\n // special case where blob is not directly stored on the model, use a getter\n const blob = getBlob(location.blobId)\n if (!blob) {\n throw new Error(\n `file (\"${location.name}\") was opened locally from a previous session. To restore it, go to track settings and reopen the file`,\n )\n }\n return new BlobFile(blob)\n }\n if (isUriLocation(location)) {\n // Check for empty string\n if (!location.uri) {\n throw new Error('No URI provided')\n }\n\n // Resolve any relative URLs to absolute URLs\n const absoluteLocation = resolveUriLocation(location)\n\n // If there is a plugin manager, we can try internet accounts\n if (pluginManager) {\n const internetAccount = getInternetAccount(location, pluginManager)\n // If an internetAccount was found, use it to open the location\n if (internetAccount) {\n return internetAccount.openLocation(absoluteLocation)\n }\n }\n // Otherwise fall back on usual open\n return new RemoteFileWithRangeCache(absoluteLocation.uri, {\n fetch: checkAuthNeededFetch,\n })\n }\n throw new Error('invalid fileLocation')\n}\n\nexport function getFetcher(\n location: FileLocation,\n pluginManager?: PluginManager,\n): Fetcher {\n if (!isUriLocation(location)) {\n throw new Error(`Not a valid UriLocation: ${JSON.stringify(location)}`)\n }\n if (pluginManager) {\n const internetAccount = getInternetAccount(location, pluginManager)\n if (internetAccount) {\n return internetAccount.getFetcher(location)\n }\n }\n return checkAuthNeededFetch\n}\n\nfunction getInternetAccount(\n location: UriLocation,\n pluginManager: PluginManager,\n): BaseInternetAccountModel | undefined {\n const { rootModel } = pluginManager\n // If there is an appRootModel, use it to find the internetAccount\n if (rootModel && isRootModelWithInternetAccounts(rootModel)) {\n return rootModel.findAppropriateInternetAccount(location)\n }\n // If there is no appRootModel, but there is pre-auth, create a temporary\n // internetAccount. This is typical in a worker.\n if (location.internetAccountPreAuthorization) {\n if (!location.internetAccountPreAuthorization.authInfo.token) {\n throw new Error(\n 'Failed to obtain token from internet account. Try reloading the page',\n )\n }\n return pluginManager\n .getInternetAccountType(\n location.internetAccountPreAuthorization.internetAccountType,\n )!\n .stateModel.create({\n type: location.internetAccountPreAuthorization.internetAccountType,\n configuration:\n location.internetAccountPreAuthorization.authInfo.configuration,\n })\n }\n return undefined\n}\n\n// This fetch throws a special error if the response is \"401\" and includes a\n// \"WWW-Authenticate: Basic\" header. This is so downstream code can retry if\n// needed with HTTP Basic authentication included\nasync function checkAuthNeededFetch(url: RequestInfo, opts?: RequestInit) {\n const response = await fetch(url, opts)\n if (\n response.status === 401 &&\n response.headers.get('WWW-Authenticate')?.includes('Basic')\n ) {\n throw new AuthNeededError(\n 'Accessing HTTPBasic resource without authentication',\n url.toString(),\n )\n }\n return response\n}\n\nexport { RemoteFileWithRangeCache } from './RemoteFileWithRangeCache'\n","import jexl from 'jexl'\nimport { Feature } from './simpleFeature'\n\ntype JexlWithAddFunction = typeof jexl & {\n addFunction(name: string, func: (...args: unknown[]) => unknown): void\n}\ntype JexlNonBuildable = Omit<typeof jexl, 'Jexl'>\n\nexport default function JexlF(/* config?: any*/): JexlNonBuildable {\n const j = new jexl.Jexl() as JexlWithAddFunction\n // someday will make sure all of configs callbacks are added in, including\n // ones passed in\n\n // below are core functions\n j.addFunction('get', (feature: Feature, data: string) => feature.get(data))\n j.addFunction('parent', (feature: Feature) => feature.parent())\n\n j.addFunction('id', (feature: Feature) => feature.id())\n\n // let user cast a jexl type into a javascript type\n j.addFunction('cast', (arg: unknown) => arg)\n\n // logging\n j.addFunction('log', (thing: unknown) => {\n console.log(thing) // eslint-disable-line no-console\n return thing\n })\n\n // math\n // addfunction added in jexl 2.3 but types/jexl still on 2.2\n j.addFunction('max', Math.max)\n j.addFunction('min', Math.min)\n j.addFunction('sqrt', Math.sqrt)\n j.addFunction('ceil', Math.ceil)\n j.addFunction('floor', Math.floor)\n j.addFunction('round', Math.round)\n j.addFunction('abs', Math.abs)\n j.addFunction('log10', Math.log10)\n j.addFunction('parseInt', Number.parseInt)\n j.addFunction('parseFloat', Number.parseFloat)\n\n // string\n j.addFunction('split', (s: string, char: string) => s.split(char))\n j.addFunction('charAt', (s: string, index: number) => s.charAt(index))\n j.addFunction('charCodeAt', (s: string, index: number) => s.charCodeAt(index))\n j.addFunction('codePointAt', (s: string, pos: number) => s.codePointAt(pos))\n j.addFunction('startsWith', (s: string, search: string, len?: number) =>\n s.startsWith(search, len),\n )\n j.addFunction('endsWith', (s: string, search: string, len?: number) =>\n s.endsWith(search, len),\n )\n j.addFunction('padEnd', (s: string, len: number, pad?: string) =>\n s.padEnd(len, pad),\n )\n j.addFunction('padStart', (s: string, len: number, fill?: string) =>\n s.padStart(len, fill),\n )\n j.addFunction('repeat', (s: string, count: number) => s.repeat(count))\n j.addFunction('replace', (s: string, match: string, sub: string) =>\n s.replace(match, sub),\n )\n j.addFunction('replaceAll', (s: string, match: string, sub: string) =>\n s.replaceAll(match, sub),\n )\n j.addFunction('slice', (s: string, start: number, end?: number) =>\n s.slice(start, end),\n )\n j.addFunction('startsWith', (s: string, search: string, pos?: number) =>\n s.startsWith(search, pos),\n )\n j.addFunction('substring', (s: string, start: number, end?: number) =>\n // eslint-disable-next-line unicorn/prefer-string-slice\n s.substring(start, end),\n )\n j.addFunction('toLowerCase', (s: string) => s.toLowerCase())\n j.addFunction('toUpperCase', (s: string) => s.toUpperCase())\n j.addFunction('jsonParse', (s: string) => JSON.parse(s))\n j.addFunction('trim', (s: string) => s.trim())\n j.addFunction('trimEnd', (s: string) => s.trimEnd())\n j.addFunction('trimStart', (s: string) => s.trimStart())\n\n j.addFunction('getTag', (feature: Feature, s: string) => {\n const tags = feature.get('tags')\n return tags ? tags[s] : feature.get(s)\n })\n\n j.addBinaryOp('&', 15, (a: number, b: number) => a & b)\n\n return j\n}\n","import createJexlInstance from './jexl'\n\nconst compilationCache: Record<string, any> = {}\n\n// revert function strings back to main, create a different file for\n// jexlStrings.ts pass the jexl property of the pluginManager as a param\n\n/**\n * compile a jexlExpression to a string\n *\n * @param str - string of code like `jexl:...`\n * @param options -\n */\nexport function stringToJexlExpression(str: string, jexl?: any) {\n const cacheKey = `nosig|${str}`\n if (!compilationCache[cacheKey]) {\n const match = str.startsWith('jexl:')\n if (!match) {\n throw new Error('string does not appear to be in jexl format')\n }\n const code = str.split('jexl:')[1]!\n const compiled = jexl\n ? jexl.compile(code)\n : createJexlInstance().compile(code)\n compilationCache[cacheKey] = compiled\n }\n\n return compilationCache[cacheKey]\n}\n","import {\n RectTuple,\n SerializedLayout,\n Rectangle,\n BaseLayout,\n} from './BaseLayout'\n\n/**\n * Rectangle-layout manager that lays out rectangles using bitmaps at\n * resolution that, for efficiency, may be somewhat lower than that of\n * the coordinate system for the rectangles being laid out. `pitchX`\n * and `pitchY` are the ratios of input scale resolution to internal\n * bitmap resolution.\n */\n\n// minimum excess size of the array at which we garbage collect\nconst minSizeToBotherWith = 10000\nconst maxFeaturePitchWidth = 20000\n\nfunction segmentsIntersect(\n x1: number,\n x2: number,\n y1: number,\n y2: number,\n): boolean {\n return x2 >= y1 && y2 >= x1\n}\n\ntype Bit<T> = Record<string, T> | string | undefined\n\ninterface RowState<T> {\n min: number\n max: number\n offset: number\n bits: Bit<T>[]\n}\n// a single row in the layout\nclass LayoutRow<T> {\n private padding = 1\n\n private allFilled?: Record<string, T> | string\n\n private widthLimit = 1_000_000\n\n private rowState?: RowState<T>\n\n // this.rowState.bits is the array of items in the layout row, indexed by (x - this.offset)\n // this.rowState.min is the leftmost edge of all the rectangles we have in the layout\n // this.rowState.max is the rightmost edge of all the rectangles we have in the layout\n // this.rowState.offset is the offset of the bits array relative to the genomic coordinates\n // (modified by pitchX, but we don't know that in this class)\n\n setAllFilled(data: Record<string, T> | string): void {\n this.allFilled = data\n }\n\n getItemAt(x: number): Record<string, T> | string | undefined {\n if (this.allFilled) {\n return this.allFilled\n }\n if (\n this.rowState?.min === undefined ||\n x < this.rowState.min ||\n x >= this.rowState.max\n ) {\n return undefined\n }\n return this.rowState.bits[x - this.rowState.offset]\n }\n\n isRangeClear(left: number, right: number) {\n if (this.allFilled) {\n return false\n }\n\n if (\n this.rowState === undefined ||\n right <= this.rowState.min ||\n left >= this.rowState.max\n ) {\n return true\n }\n const { min, max, offset, bits } = this.rowState\n\n const maxX = Math.min(max, right) - offset\n let flag = true\n for (let x = Math.max(min, left) - offset; x < maxX && flag; x++) {\n flag = bits[x] === undefined\n }\n\n return flag\n }\n\n // NOTE: this.rowState.min, this.rowState.max, and this.rowState.offset are\n // interbase coordinates\n initialize(left: number, right: number): RowState<T> {\n const rectWidth = right - left\n return {\n offset: left - rectWidth,\n min: left,\n max: right,\n bits: Array.from({ length: 3 * rectWidth }),\n }\n }\n\n addRect(rect: Rectangle<T>, data: Record<string, T> | string): void {\n const left = rect.l\n const right = rect.r + this.padding // only padding on the right\n if (!this.rowState) {\n this.rowState = this.initialize(left, right)\n }\n\n // or check if we need to expand to the left and/or to the right\n let oLeft = left - this.rowState.offset\n let oRight = right - this.rowState.offset\n const currLength = this.rowState.bits.length\n\n // expand rightward if necessary\n if (oRight >= this.rowState.bits.length) {\n const additionalLength = oRight + 1\n if (this.rowState.bits.length + additionalLength > this.widthLimit) {\n console.warn(\n 'Layout width limit exceeded, discarding old layout. Please be more careful about discarding unused blocks.',\n )\n this.rowState = this.initialize(left, right)\n } else if (additionalLength > 0) {\n this.rowState.bits = [\n ...this.rowState.bits,\n ...Array.from<Bit<T>>({ length: additionalLength }),\n ]\n }\n }\n\n // expand leftward if necessary\n if (left < this.rowState.offset) {\n // use math.min to avoid negative lengths\n const additionalLength = Math.min(\n currLength - oLeft,\n this.rowState.offset,\n )\n if (this.rowState.bits.length + additionalLength > this.widthLimit) {\n console.warn(\n 'Layout width limit exceeded, discarding old layout. Please be more careful about discarding unused blocks.',\n )\n\n this.rowState = this.initialize(left, right)\n } else {\n this.rowState.bits = [\n ...Array.from<Bit<T>>({ length: additionalLength }),\n ...this.rowState.bits,\n ]\n this.rowState.offset -= additionalLength\n }\n }\n oRight = right - this.rowState.offset\n oLeft = left - this.rowState.offset\n const w = oRight - oLeft\n\n if (w > maxFeaturePitchWidth) {\n console.warn(\n `Layout X pitch set too low, feature spans ${w} bits in a single row.`,\n rect,\n data,\n )\n }\n\n for (let x = oLeft; x < oRight; x += 1) {\n this.rowState.bits[x] = data\n }\n\n if (left < this.rowState.min) {\n this.rowState.min = left\n }\n if (right > this.rowState.max) {\n this.rowState.max = right\n }\n }\n\n /**\n * Given a range of interbase coordinates, deletes all data dealing with that range\n */\n discardRange(left: number, right: number): void {\n if (this.allFilled) {\n return\n } // allFilled is irrevocable currently\n\n // if we have no data, do nothing\n if (!this.rowState) {\n return\n }\n\n // if doesn't overlap at all, do nothing\n if (right <= this.rowState.min || left >= this.rowState.max) {\n return\n }\n\n // if completely encloses range, discard everything\n if (left <= this.rowState.min && right >= this.rowState.max) {\n this.rowState = undefined\n return\n }\n\n // if overlaps left edge, adjust the min\n if (right > this.rowState.min && left <= this.rowState.min) {\n this.rowState.min = right\n }\n\n // if overlaps right edge, adjust the max\n if (left < this.rowState.max && right >= this.rowState.max) {\n this.rowState.max = left\n }\n\n // now trim the left, right, or both sides of the array\n if (\n this.rowState.offset < this.rowState.min - minSizeToBotherWith &&\n this.rowState.bits.length >\n this.rowState.max + minSizeToBotherWith - this.rowState.offset\n ) {\n // trim both sides\n const leftTrimAmount = this.rowState.min - this.rowState.offset\n const rightTrimAmount =\n this.rowState.bits.length -\n 1 -\n (this.rowState.max - this.rowState.offset)\n // if (rightTrimAmount <= 0) debugger\n // if (leftTrimAmount <= 0) debugger\n // this.log(`trim both sides, ${leftTrimAmount} from left, ${rightTrimAmount} from right`)\n this.rowState.bits = this.rowState.bits.slice(\n leftTrimAmount,\n this.rowState.bits.length - rightTrimAmount,\n )\n this.rowState.offset += leftTrimAmount\n // if (this.rowState.offset > this.rowState.min) debugger\n // if (this.rowState.bits.length <= this.rowState.max - this.rowState.offset) debugger\n } else if (this.rowState.offset < this.rowState.min - minSizeToBotherWith) {\n // trim left side\n const desiredOffset =\n this.rowState.min - Math.floor(minSizeToBotherWith / 2)\n const trimAmount = desiredOffset - this.rowState.offset\n // this.log(`trim left side by ${trimAmount}`)\n this.rowState.bits.splice(0, trimAmount)\n this.rowState.offset += trimAmount\n // if (this.rowState.offset > this.rowState.min) debugger\n // if (this.rowState.bits.length <= this.rowState.max - this.rowState.offset) debugger\n } else if (\n this.rowState.bits.length >\n this.rowState.max - this.rowState.offset + minSizeToBotherWith\n ) {\n // trim right side\n const desiredLength =\n this.rowState.max -\n this.rowState.offset +\n 1 +\n Math.floor(minSizeToBotherWith / 2)\n // this.log(`trim right side by ${this.rowState.bits.length-desiredLength}`)\n // if (desiredLength > this.rowState.bits.length) debugger\n this.rowState.bits.length = desiredLength\n // if (this.rowState.offset > this.rowState.min) debugger\n // if (this.rowState.bits.length <= this.rowState.max - this.rowState.offset) debugger\n }\n\n // if (this.rowState.offset > this.rowState.min) debugger\n // if (this.rowState.bits.length <= this.rowState.max - this.rowState.offset) debugger\n\n // if range now enclosed in the new bounds, loop through and clear the bits\n const oLeft = Math.max(this.rowState.min, left) - this.rowState.offset\n // if (oLeft < 0) debugger\n // if (oLeft >= this.rowState.bits.length) debugger\n // if (oRight < 0) debugger\n // if (oRight >= this.rowState.bits.length) debugger\n\n const oRight = Math.min(right, this.rowState.max) - this.rowState.offset\n for (let x = oLeft; x >= 0 && x < oRight; x += 1) {\n this.rowState.bits[x] = undefined\n }\n }\n}\n\nexport default class GranularRectLayout<T> implements BaseLayout<T> {\n private pitchX: number\n\n private pitchY: number\n\n private hardRowLimit: number\n\n private bitmap: LayoutRow<T>[]\n\n private rectangles: Map<string, Rectangle<T>>\n\n public maxHeightReached: boolean\n\n private maxHeight: number\n\n private displayMode: string\n\n private pTotalHeight: number\n\n /**\n * pitchX - layout grid pitch in the X direction\n * pitchY - layout grid pitch in the Y direction\n * maxHeight - maximum layout height, default Infinity (no max)\n */\n constructor({\n pitchX = 10,\n pitchY = 10,\n maxHeight = 10000,\n hardRowLimit = 10000,\n displayMode = 'normal',\n }: {\n pitchX?: number\n pitchY?: number\n maxHeight?: number\n displayMode?: string\n hardRowLimit?: number\n } = {}) {\n this.pitchX = pitchX\n this.pitchY = pitchY\n this.hardRowLimit = hardRowLimit\n this.maxHeightReached = false\n this.displayMode = displayMode\n\n // reduce the pitchY to try and pack the features tighter\n if (this.displayMode === 'compact') {\n this.pitchY = Math.round(this.pitchY / 4) || 1\n this.pitchX = Math.round(this.pitchX / 4) || 1\n }\n\n this.bitmap = []\n this.rectangles = new Map()\n this.maxHeight = Math.ceil(maxHeight / this.pitchY)\n this.pTotalHeight = 0 // total height, in units of bitmap squares (px/pitchY)\n }\n\n /**\n * @returns top position for the rect, or Null if laying\n * out the rect would exceed maxHeight\n */\n addRect(\n id: string,\n left: number,\n right: number,\n height: number,\n data?: T,\n ): number | null {\n // if we have already laid it out, return its layout\n const storedRec = this.rectangles.get(id)\n if (storedRec) {\n if (storedRec.top === null) {\n return null\n }\n\n // add it to the bitmap again, since that bitmap range may have been\n // discarded\n this.addRectToBitmap(storedRec)\n return storedRec.top * this.pitchY\n }\n\n const pLeft = Math.floor(left / this.pitchX)\n const pRight = Math.floor(right / this.pitchX)\n const pHeight = Math.ceil(height / this.pitchY)\n\n const rectangle: Rectangle<T> = {\n id,\n l: pLeft,\n r: pRight,\n top: null,\n h: pHeight,\n originalHeight: height,\n data,\n }\n\n const maxTop = this.maxHeight - pHeight\n let top = 0\n if (this.displayMode !== 'collapse') {\n for (; top <= maxTop; top += 1) {\n if (!this.collides(rectangle, top)) {\n break\n }\n }\n\n if (top > maxTop) {\n rectangle.top = null\n this.rectangles.set(id, rectangle)\n this.maxHeightReached = true\n return null\n }\n }\n rectangle.top = top\n this.addRectToBitmap(rectangle)\n this.rectangles.set(id, rectangle)\n this.pTotalHeight = Math.max(this.pTotalHeight || 0, top + pHeight)\n return top * this.pitchY\n }\n\n collides(rect: Rectangle<T>, top: number) {\n const { bitmap } = this\n\n const maxY = top + rect.h\n for (let y = top; y < maxY; y += 1) {\n const row = bitmap[y]\n if (row !== undefined && !row.isRangeClear(rect.l, rect.r)) {\n return true\n }\n }\n\n return false\n }\n\n /**\n * make a subarray if it does not exist\n */\n private autovivifyRow(bitmap: LayoutRow<T>[], y: number) {\n let row = bitmap[y]\n if (!row) {\n if (y > this.hardRowLimit) {\n throw new Error(\n `layout hard limit (${\n this.hardRowLimit * this.pitchY\n }px) exceeded, aborting layout`,\n )\n }\n row = new LayoutRow()\n bitmap[y] = row\n }\n return row\n }\n\n addRectToBitmap(rect: Rectangle<T>) {\n if (rect.top === null) {\n return\n }\n\n const data = rect.id\n const yEnd = rect.top + rect.h\n if (rect.r - rect.l > maxFeaturePitchWidth) {\n // the rect is very big in relation to the view size, just pretend, for\n // the purposes of layout, that it extends infinitely. this will cause\n // weird layout if a user scrolls manually for a very, very long time\n // along the genome at the same zoom level. but most users will not do\n // that. hopefully.\n for (let y = rect.top; y < yEnd; y += 1) {\n this.autovivifyRow(this.bitmap, y).setAllFilled(data)\n }\n } else {\n for (let y = rect.top; y < yEnd; y += 1) {\n this.autovivifyRow(this.bitmap, y).addRect(rect, data)\n }\n }\n }\n\n /**\n * Given a range of X coordinates, deletes all data dealing with\n * the features.\n */\n discardRange(left: number, right: number) {\n const pLeft = Math.floor(left / this.pitchX)\n const pRight = Math.floor(right / this.pitchX)\n const { bitmap } = this\n for (const row of bitmap) {\n row.discardRange(pLeft, pRight)\n }\n }\n\n hasSeen(id: string) {\n return this.rectangles.has(id)\n }\n\n getByCoord(x: number, y: number) {\n const pY = Math.floor(y / this.pitchY)\n const row = this.bitmap[pY]\n if (!row) {\n return undefined\n }\n const pX = Math.floor(x / this.pitchX)\n return row.getItemAt(pX)\n }\n\n getByID(id: string) {\n const r = this.rectangles.get(id)\n if (r) {\n const t = r.top! * this.pitchY\n return [\n r.l * this.pitchX,\n t,\n r.r * this.pitchX,\n t + r.originalHeight,\n ] as RectTuple\n }\n\n return undefined\n }\n\n getDataByID(id: string) {\n return this.rectangles.get(id)?.data\n }\n\n cleanup() {}\n\n getTotalHeight() {\n return this.pTotalHeight * this.pitchY\n }\n\n get totalHeight() {\n return this.getTotalHeight()\n }\n\n getRectangles(): Map<string, RectTuple> {\n return new Map(\n [...this.rectangles.entries()].map(([id, rect]) => {\n const { l, r, originalHeight, top } = rect\n const t = (top || 0) * this.pitchY\n const b = t + originalHeight\n return [id, [l * this.pitchX, t, r * this.pitchX, b]] // left, top, right, bottom\n }),\n )\n }\n\n serializeRegion(region: { start: number; end: number }): SerializedLayout {\n const regionRectangles: Record<string, RectTuple> = {}\n let maxHeightReached = false\n for (const [id, rect] of this.rectangles.entries()) {\n const { l, r, originalHeight, top } = rect\n if (rect.top === null) {\n maxHeightReached = true\n } else {\n const t = (top || 0) * this.pitchY\n const b = t + originalHeight\n const y1 = l * this.pitchX\n const y2 = r * this.pitchX\n const x1 = region.start\n const x2 = region.end\n // add +/- pitchX to avoid resolution causing errors\n if (segmentsIntersect(x1, x2, y1 - this.pitchX, y2 + this.pitchX)) {\n regionRectangles[id] = [y1, t, y2, b]\n }\n }\n }\n return {\n rectangles: regionRectangles,\n containsNoTransferables: true,\n totalHeight: this.getTotalHeight(),\n maxHeightReached,\n }\n }\n\n toJSON(): SerializedLayout {\n const rectangles = Object.fromEntries(this.getRectangles())\n return {\n rectangles,\n containsNoTransferables: true,\n totalHeight: this.getTotalHeight(),\n maxHeightReached: this.maxHeightReached,\n }\n }\n}\n","import { BaseLayout, SerializedLayout } from './BaseLayout'\n\nexport default class MultiLayout<SUB_LAYOUT_CLASS extends BaseLayout<T>, T> {\n subLayouts = new Map<string, SUB_LAYOUT_CLASS>()\n\n /**\n * layout class that just keeps a number of named sub-layouts.\n * basically just a fancier\n * `{ layout1: new GranularRectLayout(), layout2: new GranularRectLayout() ...}`\n */\n constructor(\n public SubLayoutClass: new (...args: any[]) => SUB_LAYOUT_CLASS,\n public subLayoutConstructorArgs: Record<string, any> = {},\n ) {}\n\n getDataByID(id: string): unknown {\n for (const layout of this.subLayouts.values()) {\n // @ts-expect-error\n const r = layout.getDataByID(id)\n if (r) {\n return r\n }\n }\n return undefined\n }\n\n getSublayout(layoutName: string): SUB_LAYOUT_CLASS {\n let subLayout = this.subLayouts.get(layoutName)\n if (subLayout === undefined) {\n subLayout = new this.SubLayoutClass(this.subLayoutConstructorArgs)\n this.subLayouts.set(layoutName, subLayout)\n return subLayout\n }\n\n return subLayout\n }\n\n addRect(\n layoutName: string,\n id: string,\n left: number,\n right: number,\n height: number,\n data: Record<string, T> = {},\n ) {\n return this.getSublayout(layoutName).addRect(id, left, right, height, data)\n }\n\n discardRange(layoutName: string, left: number, right: number) {\n return this.subLayouts.get(layoutName)?.discardRange(left, right)\n }\n\n toJSON() {\n const data: Record<string, SerializedLayout> = {}\n for (const [layoutName, sublayout] of this.subLayouts.entries()) {\n data[layoutName] = sublayout.toJSON()\n }\n return data\n }\n}\n","import {\n RectTuple,\n SerializedLayout,\n BaseLayout,\n Rectangle,\n} from './BaseLayout'\nimport RBush from 'rbush'\n\nexport interface Layout {\n minX: number\n minY: number\n maxX: number\n maxY: number\n name: string\n}\n\nexport default class PrecomputedLayout<T> implements BaseLayout<T> {\n private rectangles: Map<string, RectTuple>\n\n private totalHeight: number\n\n public maxHeightReached: boolean\n\n private rbush: RBush<Layout>\n\n constructor({ rectangles, totalHeight, maxHeightReached }: SerializedLayout) {\n this.rectangles = new Map(Object.entries(rectangles))\n // rectangles is of the form \"featureId\": [leftPx, topPx, rightPx, bottomPx]\n this.totalHeight = totalHeight\n this.maxHeightReached = maxHeightReached\n this.rbush = new RBush()\n for (const [key, layout] of Object.entries(rectangles)) {\n this.rbush.insert({\n minX: layout[0],\n minY: layout[1],\n maxX: layout[2],\n maxY: layout[3],\n name: key,\n })\n }\n }\n\n addRect(id: string) {\n const rect = this.rectangles.get(id)\n if (!rect) {\n throw new Error(`id ${id} not found in precomputed feature layout`)\n }\n // left, top, right, bottom\n return rect[1]\n }\n\n /**\n * returns a Map of `feature id -> rectangle`\n */\n getRectangles(): Map<string, RectTuple> {\n return this.rectangles\n }\n\n getTotalHeight(): number {\n return this.totalHeight\n }\n\n collides(_rect: Rectangle<T>, _top: number): boolean {\n throw new Error('Method not implemented.')\n }\n\n getByCoord(x: number, y: number) {\n const rect = { minX: x, minY: y, maxX: x + 1, maxY: y + 1 }\n return this.rbush.collides(rect)\n ? this.rbush.search(rect)[0]!.name\n : undefined\n }\n\n getByID(id: string) {\n return this.rectangles.get(id)\n }\n\n addRectToBitmap(_rect: Rectangle<T>, _data: Record<string, T>): void {\n throw new Error('Method not implemented.')\n }\n\n discardRange(_left: number, _right: number): void {\n throw new Error('Method not implemented.')\n }\n\n serializeRegion(_region: { start: number; end: number }): SerializedLayout {\n throw new Error('Method not implemented.')\n }\n\n toJSON(): SerializedLayout {\n return {\n rectangles: Object.fromEntries(this.rectangles),\n totalHeight: this.totalHeight,\n maxHeightReached: false,\n containsNoTransferables: true,\n }\n }\n}\n","import MultiLayout from './MultiLayout'\nimport PrecomputedLayout from './PrecomputedLayout'\n\nclass ThrowingLayout {\n constructor() {\n throw new Error('invalid layout name')\n }\n}\n\nexport default class PrecomputedMultiLayout extends MultiLayout {\n constructor(json) {\n // use ThrowingLayout because there is not supposed to be any creation\n // of new layouts in a precomputed layout\n super(ThrowingLayout)\n Object.entries(json).forEach(([layoutName, sublayoutJson]) => {\n this.subLayouts.set(layoutName, new PrecomputedLayout(sublayoutJson))\n })\n }\n}\n","interface AbsoluteCache {\n dirty: boolean\n left?: number\n right?: number\n top?: number\n bottom?: number\n width?: number\n height?: number\n}\n\nexport default class SceneGraph {\n private children: Map<string, SceneGraph>\n\n private absoluteCache: AbsoluteCache\n\n public parent?: SceneGraph\n\n /**\n * note: all coordinates are inter-base or inter-pixel coordinates\n */\n constructor(\n public name: string,\n public left: number,\n public top: number,\n public width: number,\n public height: number,\n\n public data?: Record<string, any>,\n ) {\n this.children = new Map()\n this.absoluteCache = { dirty: true }\n }\n\n addChild(\n nameOrSceneGraph: string | SceneGraph,\n left: number,\n top: number,\n width: number,\n height: number,\n\n data?: Record<string, any>,\n ) {\n const child =\n nameOrSceneGraph instanceof SceneGraph\n ? nameOrSceneGraph\n : new SceneGraph(nameOrSceneGraph, left, top, width, height, data)\n\n if (!(child instanceof SceneGraph)) {\n throw new TypeError(\n 'argument to addChild must be an array or a SceneGraph',\n )\n }\n\n if (this.children.has(child.name)) {\n throw new Error(`child named \"${child.name}\" already exists`)\n }\n\n // update the bounds to match the child\n child.parent = this\n const {\n left: childLeft,\n right: childRight,\n top: childTop,\n bottom: childBottom,\n } = child.absolute\n if (\n childLeft !== undefined &&\n childRight !== undefined &&\n childTop !== undefined &&\n childBottom !== undefined\n ) {\n this.expand(childLeft, childRight, childTop, childBottom)\n this.children.set(child.name, child)\n }\n return child\n }\n\n getSubRecord(name: string) {\n return this.children.get(name)\n }\n\n /**\n * if the record does not already cover the given absolute extents, extend it\n * to cover them\n *\n * @param left -\n * @param right -\n * @param top -\n * @param bottom -\n */\n expand(newLeft: number, newRight: number, newTop: number, newBottom: number) {\n const { left, right, top, bottom } = this.absolute\n\n if (left !== undefined && newLeft < left) {\n const diff = left - newLeft\n this.width += diff\n this.left -= diff\n }\n if (right !== undefined && newRight > right) {\n this.width += newRight - right\n }\n if (top !== undefined && newTop < top) {\n const diff = top - newTop\n this.height += diff\n this.top -= diff\n }\n if (bottom !== undefined && newBottom > bottom) {\n this.height += newBottom - bottom\n }\n if (this.parent) {\n this.parent.expand(newLeft, newRight, newTop, newBottom)\n }\n this.absoluteCache.dirty = true\n }\n\n get bottom() {\n return this.top + this.height\n }\n\n get right() {\n return this.left + this.width\n }\n\n walkParents(callback: (arg: SceneGraph) => void) {\n if (this.parent) {\n callback(this.parent)\n this.parent.walkParents(callback)\n }\n }\n\n walkChildren(callback: (c: SceneGraph) => void) {\n for (const sub of this.children.values()) {\n callback(sub)\n sub.walkChildren(callback)\n }\n }\n\n get absolute() {\n if (this.absoluteCache.dirty) {\n let xOffset = 0\n let yOffset = 0\n this.walkParents((node: SceneGraph) => {\n xOffset += node.left\n yOffset += node.top\n })\n this.absoluteCache = {\n dirty: false,\n left: this.left + xOffset,\n right: this.right + xOffset,\n top: this.top + yOffset,\n bottom: this.bottom + yOffset,\n width: this.width,\n height: this.height,\n }\n }\n return this.absoluteCache\n }\n\n move(x: number, y: number) {\n this.left += x\n this.top += y\n\n this.absoluteCache.dirty = true\n this.walkChildren(c => {\n c.absoluteCache.dirty = true\n })\n const { left, right, top, bottom } = this.absolute\n if (\n left !== undefined &&\n right !== undefined &&\n top !== undefined &&\n bottom !== undefined\n ) {\n this.expand(left, right, top, bottom)\n }\n }\n}\n","import {\n isOptionalType,\n isUnionType,\n isArrayType,\n isMapType,\n isLateType,\n IAnyType,\n IModelReflectionPropertiesData,\n IAnyComplexType,\n ISimpleType,\n UnionStringArray,\n} from 'mobx-state-tree'\n\nexport interface ILiteralType<T> extends ISimpleType<T> {\n value: T\n}\n\n/**\n * get the inner type of an MST optional, array, or late type object\n */\nexport function getSubType(type: IAnyType): IAnyType {\n let t: IAnyType\n if (isOptionalType(type)) {\n // @ts-expect-error\n t = type._subtype || type.type\n } else if (isArrayType(type) || isMapType(type)) {\n // @ts-expect-error\n t = type._subtype || type._subType || type.subType\n // @ts-expect-error\n } else if (typeof type.getSubType === 'function') {\n // @ts-expect-error\n return type.getSubType()\n } else {\n throw new TypeError('unsupported mst type')\n }\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!t) {\n throw new Error('failed to get subtype')\n }\n return t\n}\n\n/**\n * get the array of the subtypes in a union\n */\nexport function getUnionSubTypes(unionType: IAnyType): IAnyType[] {\n if (!isUnionType(unionType)) {\n throw new TypeError('not an MST union type')\n }\n const t =\n // @ts-expect-error\n unionType._types ||\n // @ts-expect-error\n unionType.types ||\n // @ts-expect-error\n getSubType(unionType)._types ||\n // @ts-expect-error\n getSubType(unionType).types\n if (!t) {\n // debugger\n throw new Error('failed to extract subtypes from mst union')\n }\n return t\n}\n\n/**\n * get the type of one of the properties of the given MST model type\n */\nexport function getPropertyType(\n type: IModelReflectionPropertiesData,\n propertyName: string,\n) {\n return type.properties[propertyName]!\n}\n\n/**\n * get the base type from inside an MST optional type\n */\nexport function getDefaultValue(type: IAnyType) {\n if (!isOptionalType(type)) {\n throw new TypeError('type must be an optional type')\n }\n // @ts-expect-error\n return type._defaultValue || type.defaultValue\n}\n\nexport type IEnumerationType<T extends string> = ISimpleType<\n UnionStringArray<T[]>\n>\n\n/** get the string values of an MST enumeration type */\nexport function getEnumerationValues(type: IAnyComplexType) {\n const subtypes = getUnionSubTypes(type) as ILiteralType<string>[]\n // the subtypes should all be literals with a value member\n return subtypes.map(t => t.value)\n}\n\nexport function resolveLateType(maybeLate: IAnyType) {\n if (\n !isUnionType(maybeLate) &&\n !isArrayType(maybeLate) &&\n isLateType(maybeLate)\n ) {\n // @ts-expect-error\n return maybeLate.getSubType()\n }\n return maybeLate\n}\n","// This file replaces `index.js` in bundlers like webpack or Rollup,\n// according to `browser` config in `package.json`.\n\n// This alphabet uses `A-Za-z0-9_-` symbols.\n// The order of characters is optimized for better gzip and brotli compression.\n// Same as in non-secure/index.js\nexport const urlAlphabet =\n 'useandom-26T198340PX75pxJACKVERYMINDBUSHWOLF_GQZbfghjklqvwyzrict'\n\nexport const random = bytes => crypto.getRandomValues(new Uint8Array(bytes))\n\nexport const customRandom = (alphabet, defaultSize, getRandom) => {\n // First, a bitmask is necessary to generate the ID. The bitmask makes bytes\n // values closer to the alphabet size. The bitmask calculates the closest\n // `2^31 - 1` number, which exceeds the alphabet size.\n // For example, the bitmask for the alphabet size 30 is 31 (00011111).\n // `Math.clz32` is not used, because it is not available in browsers.\n const mask = (2 << (Math.log(alphabet.length - 1) / Math.LN2)) - 1\n // Though, the bitmask solution is not perfect since the bytes exceeding\n // the alphabet size are refused. Therefore, to reliably generate the ID,\n // the random bytes redundancy has to be satisfied.\n\n // Note: every hardware random generator call is performance expensive,\n // because the system call for entropy collection takes a lot of time.\n // So, to avoid additional system calls, extra bytes are requested in advance.\n\n // Next, a step determines how many random bytes to generate.\n // The number of random bytes gets decided upon the ID size, mask,\n // alphabet size, and magic number 1.6 (using 1.6 peaks at performance\n // according to benchmarks).\n\n // `-~f => Math.ceil(f)` if f is a float\n // `-~i => i + 1` if i is an integer\n const step = -~((1.6 * mask * defaultSize) / alphabet.length)\n\n return (size = defaultSize) => {\n let id = ''\n while (true) {\n const bytes = getRandom(step)\n // A compact alternative for `for (var i = 0; i < step; i++)`.\n let j = step\n while (j--) {\n // Adding `|| ''` refuses a random byte that exceeds the alphabet size.\n id += alphabet[bytes[j] & mask] || ''\n if (id.length === size) {\n return id\n }\n }\n }\n }\n}\n\nexport const customAlphabet = (alphabet, size = 21) =>\n customRandom(alphabet, size, random)\n\nexport const nanoid = (size = 21) =>\n crypto.getRandomValues(new Uint8Array(size)).reduce((id, byte) => {\n // It is incorrect to use bytes exceeding the alphabet size.\n // The following mask reduces the random byte in the 0-255 value\n // range to the 0-63 value range. Therefore, adding hacks, such\n // as empty string fallback or magic numbers, is unnecessary because\n // the bitmask trims bytes down to the alphabet size.\n byte &= 63\n if (byte < 36) {\n // `0-9a-z`\n id += byte.toString(36)\n } else if (byte < 62) {\n // `A-Z`\n id += (byte - 26).toString(36).toUpperCase()\n } else if (byte > 62) {\n id += '-'\n } else {\n id += '_'\n }\n return id\n }, '')\n","/* eslint-disable react-refresh/only-export-components */\n// This file is a ponyfill for the HTML5 OffscreenCanvas API.\n\nimport isNode from 'detect-node'\n\nimport { CanvasSequence } from 'canvas-sequencer'\n\ntype AbstractCanvas = any\n\ntype AbstractImageBitmap = any\n\nexport let createCanvas: (width: number, height: number) => AbstractCanvas\nexport let createImageBitmap: (\n canvas: AbstractCanvas,\n) => Promise<AbstractImageBitmap>\n\n/** the JS class (constructor) for offscreen-generated image bitmap data */\nexport let ImageBitmapType: unknown\n\nexport function drawImageOntoCanvasContext(\n imageData: any,\n context: CanvasRenderingContext2D,\n) {\n if (imageData.serializedCommands) {\n const seq = new CanvasSequence(imageData.serializedCommands)\n seq.execute(context)\n } else {\n context.drawImage(imageData as CanvasImageSource, 0, 0)\n }\n}\n\nconst weHave = {\n realOffscreenCanvas: typeof OffscreenCanvas === 'function',\n node: isNode,\n}\n\nif (weHave.realOffscreenCanvas) {\n createCanvas = (width, height) => new OffscreenCanvas(width, height)\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n createImageBitmap = window.createImageBitmap || self.createImageBitmap\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n ImageBitmapType = window.ImageBitmap || self.ImageBitmap\n} else if (weHave.node) {\n // use node-canvas if we are running in node (i.e. automated tests)\n createCanvas = (...args) => {\n // @ts-expect-error\n return nodeCreateCanvas(...args)\n }\n createImageBitmap = async canvas => {\n const dataUri = canvas.toDataURL()\n // @ts-expect-error\n const img = new nodeImage()\n return new Promise((resolve, reject) => {\n // need onload for jest\n img.onload = () => {\n resolve(img)\n }\n img.onerror = reject\n img.src = dataUri\n })\n }\n} else {\n createCanvas = (width: number, height: number) => {\n const context = new CanvasSequence()\n return {\n width,\n height,\n getContext() {\n return context\n },\n }\n }\n createImageBitmap = async canvas => {\n const ctx = canvas.getContext('2d')\n return {\n height: canvas.height,\n width: canvas.width,\n serializedCommands: ctx.toJSON(),\n containsNoTransferables: true,\n }\n }\n ImageBitmapType = String\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport React from 'react'\nimport { CanvasSequence } from 'canvas-sequencer'\n\n// locals\nimport { createCanvas, createImageBitmap } from './offscreenCanvasPonyfill'\nimport { blobToDataURL } from './blobToDataURL'\n\nexport type RenderReturn = Record<string, unknown> | undefined\n\ntype RendererRet = Promise<RenderReturn> | RenderReturn\n\nexport async function renderToAbstractCanvas(\n width: number,\n height: number,\n opts: {\n exportSVG?: { rasterizeLayers?: boolean; scale?: number }\n highResolutionScaling?: number\n },\n cb: (ctx: CanvasRenderingContext2D) => RendererRet,\n) {\n const { exportSVG, highResolutionScaling = 1 } = opts\n\n if (exportSVG) {\n if (!exportSVG.rasterizeLayers) {\n const fakeCtx = new CanvasSequence()\n const result = await cb(fakeCtx)\n return {\n ...result,\n canvasRecordedData: fakeCtx.toJSON(),\n }\n } else {\n const s = exportSVG.scale || highResolutionScaling\n const canvas = createCanvas(Math.ceil(width * s), height * s)\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('2d canvas rendering not supported on this platform')\n }\n ctx.scale(s, s)\n const result = await cb(ctx)\n\n // two methods needed for converting canvas to PNG, one for webworker\n // offscreen canvas, one for main thread\n return {\n ...result,\n reactElement: (\n <image\n width={width}\n height={height}\n xlinkHref={\n 'convertToBlob' in canvas\n ? await blobToDataURL(\n await canvas.convertToBlob({\n type: 'image/png',\n }),\n )\n : canvas.toDataURL('image/png')\n }\n />\n ),\n }\n }\n } else {\n const s = highResolutionScaling\n const canvas = createCanvas(Math.ceil(width * s), height * s)\n const ctx = canvas.getContext('2d')\n if (!ctx) {\n throw new Error('2d canvas rendering not supported on this platform')\n }\n ctx.scale(s, s)\n const result = await cb(ctx)\n return { ...result, imageData: await createImageBitmap(canvas) }\n }\n}\n\nexport async function getSerializedSvg(results: {\n width: number\n height: number\n canvasRecordedData: unknown\n}) {\n const { width, height, canvasRecordedData } = results\n\n // @ts-ignore needs to be ignore not expect error, produces error in build step\n const C2S = await import('canvas2svg')\n const ctx = new C2S.default(width, height)\n const seq = new CanvasSequence(canvasRecordedData)\n seq.execute(ctx)\n\n // innerHTML strips the outer <svg> element from returned data, we add\n // our own <svg> element in the view's SVG export\n return ctx.getSvg().innerHTML as string\n}\n\nexport function ReactRendering({\n rendering,\n}: {\n rendering: {\n reactElement?: React.ReactNode\n html?: string\n }\n}) {\n return React.isValidElement(rendering.reactElement) ? (\n rendering.reactElement\n ) : (\n <g dangerouslySetInnerHTML={{ __html: rendering.html || '' }} />\n )\n}\n","/**\n * fast low-level intersection of 2 coordinate ranges. assumes interbase coordinates.\n *\n * assumes `left <= right` for both ranges\n *\n * @returns array of [left, right], or [] if the ranges do not intersect. the choice of [] is because it allows destructuring array assignment without check for undefined return\n */\nexport function intersection2(\n left1: number,\n right1: number,\n left2: number,\n right2: number,\n): [number, number] | [] {\n // this code is verbose because \"if\" statements are faster than Math.min and Math.max\n if (right1 > left2 && left1 < right2 && right2 - left2 && right1 - left1) {\n if (left1 > left2) {\n if (right1 < right2) {\n // 1 |-------|\n // |------------|\n return [left1, right1]\n }\n // 2 |----|\n // |------|\n return [left1, right2]\n }\n if (right1 < right2) {\n // 3 |-----|\n // |------|\n return [left2, right1]\n }\n // 4 |------------|\n // |-------|\n return [left2, right2]\n }\n return []\n}\n\n/**\n * Return whether 2 interbase coordinate ranges intersect.\n *\n * @param left1 -\n * @param right1 -\n * @param left2 -\n * @param right2 -\n *\n * @returns true if the two ranges intersect\n */\nexport function doesIntersect2(\n left1: number,\n right1: number,\n left2: number,\n right2: number,\n) {\n return right1 > left2 && left1 < right2\n}\n\n/**\n * Return whether the first region is completely contained within the second region\n *\n * @param left1 - candidate inner region left\n * @param right1 - candidate inner region right\n * @param left2 - candidate outer region left\n * @param right2 - candidate outer region right\n */\nexport function isContainedWithin(\n left1: number,\n right1: number,\n left2: number,\n right2: number,\n) {\n return left2 <= left1 && right2 >= right1\n}\n","import { Observable, Observer } from 'rxjs'\nimport { takeUntil } from 'rxjs/operators'\nimport { observeAbortSignal } from '.'\n\n/**\n * Wrapper for rxjs Observable.create with improved error handling and\n * aborting support\n * @param func - observer function, could be async\n */\nexport function ObservableCreate<T>(\n func: (arg: Observer<T>) => void | Promise<void>,\n signal?: AbortSignal,\n): Observable<T> {\n return new Observable((observer: Observer<T>) => {\n try {\n const ret = func(observer)\n if (ret?.catch) {\n ret.catch((error: unknown) => {\n observer.error(error)\n })\n }\n } catch (error) {\n observer.error(error)\n }\n }).pipe(takeUntil(observeAbortSignal(signal)))\n}\n","/**\n * Abstract feature object\n */\nexport interface Feature {\n /**\n * Get a piece of data about the feature. All features must have\n * 'start' and 'end', but everything else is optional.\n */\n get(name: 'refName'): string\n get(name: 'start' | 'end'): number\n get(name: 'subfeatures'): Feature[] | undefined\n\n get(name: string): any\n\n /**\n * Set an item of data.\n */\n\n set(name: string, val: any): void\n\n /**\n * Get an array listing which data keys are present in this feature.\n */\n tags(): string[]\n\n /**\n * Get the unique ID of this feature.\n */\n id(): string\n\n /**\n * Get this feature's parent feature, or undefined if none.\n */\n parent(): Feature | undefined\n\n /**\n * Get an array of child features, or undefined if none.\n */\n children(): Feature[] | undefined\n\n /**\n * Convert to JSON\n */\n toJSON(): SimpleFeatureSerialized\n}\n\nexport function isFeature(thing: unknown): thing is Feature {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n typeof (thing as Feature).get === 'function' &&\n typeof (thing as Feature).id === 'function'\n )\n}\n\nexport interface SimpleFeatureArgs {\n /** key-value data, must include 'start' and 'end' */\n data: Record<string, unknown>\n /** optional parent feature */\n parent?: Feature\n /** unique identifier. can also be in data.uniqueId */\n id: string | number // thing that can be stringified easily\n}\n\n// subfeatures do not have to have uniqueId\nexport interface SimpleFeatureSerializedNoId {\n [key: string]: unknown\n parentId?: string\n start: number\n end: number\n refName: string\n type?: string\n subfeatures?: SimpleFeatureSerializedNoId[]\n}\n\n// base serialized feature has to have a uniqueId\nexport interface SimpleFeatureSerialized extends SimpleFeatureSerializedNoId {\n subfeatures?: SimpleFeatureSerializedNoId[]\n uniqueId: string\n}\n\nfunction isSimpleFeatureSerialized(\n args: SimpleFeatureSerialized | SimpleFeatureArgs,\n): args is SimpleFeatureSerialized {\n return 'uniqueId' in args && typeof args.data !== 'object'\n}\n\n/**\n * Simple implementation of a feature object.\n */\nexport default class SimpleFeature implements Feature {\n private data: Record<string, any>\n\n private subfeatures?: SimpleFeature[]\n\n private parentHandle?: Feature\n\n private uniqueId: string\n\n /**\n * @param args - SimpleFeature args\n *\n * Note: args.data.subfeatures can be an array of these same args,\n * which will be inflated to more instances of this class.\n */\n public constructor(args: SimpleFeatureArgs | SimpleFeatureSerialized) {\n if (isSimpleFeatureSerialized(args)) {\n this.data = args\n } else {\n this.data = args.data\n // load handle from args.parent (not args.data.parent) this reason is\n // because if args is an object, it likely isn't properly loaded with\n // parent as a Feature reference (probably a raw parent ID or something\n // instead)\n this.parentHandle = args.parent\n }\n\n // the feature id comes from args.id, args.data.uniqueId, or args.uniqueId\n // due to this initialization\n const id = isSimpleFeatureSerialized(args) ? args.uniqueId : args.id\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (id === undefined || id === null) {\n throw new Error(\n 'SimpleFeature requires a unique `id` or `data.uniqueId` attribute',\n )\n }\n this.uniqueId = String(id)\n\n if (!(this.data.aliases || this.data.end - this.data.start >= 0)) {\n throw new Error(\n `invalid feature data, end less than start. end: ${this.data.end} start: ${this.data.start}`,\n )\n }\n if (this.data.subfeatures) {\n this.subfeatures = this.data.subfeatures?.map((f: any, i: number) =>\n typeof f.get !== 'function'\n ? new SimpleFeature({\n id: f.uniqueId || `${id}-${i}`,\n data: {\n strand: this.data.strand,\n ...f,\n } as Record<string, any>,\n parent: this,\n })\n : f,\n )\n }\n }\n\n /**\n * Get a piece of data about the feature. All features must have\n * 'start' and 'end', but everything else is optional.\n */\n\n public get(name: string): any {\n return name === 'subfeatures'\n ? this.subfeatures\n : name === 'parent'\n ? this.parent()\n : this.data[name]\n }\n\n /**\n * Set an item of data.\n */\n\n public set(name: string, val: any): void {\n this.data[name] = val\n }\n\n /**\n * Get an array listing which data keys are present in this feature.\n */\n public tags(): string[] {\n return Object.keys(this.data)\n }\n\n /**\n * Get the unique ID of this feature.\n */\n public id(): string {\n return this.uniqueId\n }\n\n /**\n * Get this feature's parent feature, or undefined if none.\n */\n public parent(): Feature | undefined {\n return this.parentHandle\n }\n\n /**\n * Get an array of child features, or undefined if none.\n */\n public children(): Feature[] | undefined {\n return this.get('subfeatures')\n }\n\n public toJSON(): SimpleFeatureSerialized {\n const d = { ...this.data, uniqueId: this.id() } as SimpleFeatureSerialized\n const p = this.parent()\n if (p) {\n d.parentId = p.id()\n }\n const c = this.children()\n if (c) {\n d.subfeatures = c.map(child => child.toJSON())\n }\n return d\n }\n\n public static fromJSON(json: SimpleFeatureSerialized) {\n return new SimpleFeature({ ...json })\n }\n}\n","import { firstValueFrom, Observable } from 'rxjs'\nimport { reduce } from 'rxjs/operators'\n\n// locals\nimport { NoAssemblyRegion } from './types'\nimport { Feature } from './simpleFeature'\n\nexport interface UnrectifiedQuantitativeStats {\n scoreMin: number\n scoreMax: number\n scoreSum: number\n scoreSumSquares: number\n featureCount: number\n basesCovered: number\n}\nexport interface QuantitativeStats extends UnrectifiedQuantitativeStats {\n featureDensity: number\n scoreMean: number\n scoreStdDev: number\n}\n\n/**\n * calculate standard deviation using the 'shortcut method' that accepts\n * the sum and the sum squares of the elements\n *\n * @param sum - sum(i, 1..n)\n * @param sumSquares - sum(i^2, 1..n)\n * @param n - number of elements\n * @param population - boolean: use population instead of sample correction\n * @returns - the estimated std deviation\n */\nexport function calcStdFromSums(\n sum: number,\n sumSquares: number,\n n: number,\n population = false,\n): number {\n if (n === 0) {\n return 0\n }\n let variance: number\n if (population) {\n variance = sumSquares / n - (sum * sum) / (n * n)\n } else {\n // sample correction is n-1\n variance = sumSquares - (sum * sum) / n\n if (n > 1) {\n variance /= n - 1\n }\n }\n\n return variance < 0 ? 0 : Math.sqrt(variance)\n}\n\n/**\n * @param stats - a summary stats object with scoreSum, featureCount,\n * scoreSumSquares, and basesCovered\n * @returns - a summary stats object with\n * scoreMean, scoreStdDev, and featureDensity added\n */\nexport function rectifyStats(s: UnrectifiedQuantitativeStats) {\n return {\n ...s,\n scoreMean: (s.scoreSum || 0) / (s.featureCount || s.basesCovered || 1),\n scoreStdDev: calcStdFromSums(\n s.scoreSum,\n s.scoreSumSquares,\n s.featureCount || s.basesCovered,\n ),\n featureDensity: (s.featureCount || 1) / s.basesCovered,\n } as QuantitativeStats\n}\n\n/**\n * calculates per-base scores for variable width features over a region\n *\n * @param region - object contains start, end\n * @param features - list of features with start, end, score\n * @returns array of numeric scores\n */\nexport function calcPerBaseStats(\n region: NoAssemblyRegion,\n features: Feature[],\n): number[] {\n const { start, end } = region\n const scores = []\n const feats = features.sort((a, b) => a.get('start') - b.get('start'))\n let pos = start\n let currentFeat = 0\n let i = 0\n\n while (pos < end) {\n while (\n currentFeat < feats.length &&\n pos >= feats[currentFeat]!.get('end')\n ) {\n currentFeat += 1\n }\n const f = feats[currentFeat]\n if (!f) {\n scores[i] = 0\n } else if (pos >= f.get('start') && pos < f.get('end')) {\n scores[i] = f.get('score')\n } else {\n scores[i] = 0\n }\n i += 1\n pos += 1\n }\n return scores\n}\n\n/**\n * transform a list of scores to summary statistics\n *\n * @param region - object with start, end\n * @param features - array of features which are possibly summary features\n * @returns - object with scoreMax, scoreMin, scoreSum, scoreSumSquares, etc\n */\nexport async function scoresToStats(\n region: NoAssemblyRegion,\n feats: Observable<Feature>,\n) {\n const { start, end } = region\n const seed = {\n scoreMin: Number.MAX_VALUE,\n scoreMax: Number.MIN_VALUE,\n scoreSum: 0,\n scoreSumSquares: 0,\n featureCount: 0,\n }\n let found = false\n\n const { scoreMin, scoreMax, scoreSum, scoreSumSquares, featureCount } =\n await firstValueFrom(\n feats.pipe(\n reduce((acc, f) => {\n const s = f.get('score')\n const summary = f.get('summary')\n const { scoreMax, scoreMin } = acc\n acc.scoreMax = Math.max(scoreMax, summary ? f.get('maxScore') : s)\n acc.scoreMin = Math.min(scoreMin, summary ? f.get('minScore') : s)\n acc.scoreSum += s\n acc.scoreSumSquares += s * s\n acc.featureCount += 1\n found = true\n\n return acc\n }, seed),\n ),\n )\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n return found\n ? rectifyStats({\n scoreMax,\n scoreMin,\n scoreSum,\n scoreSumSquares,\n featureCount,\n basesCovered: end - start + 1,\n })\n : blankStats()\n}\n\nexport function blankStats() {\n return {\n scoreMin: 0,\n scoreMax: 0,\n scoreMean: 0,\n scoreStdDev: 0,\n scoreSum: 0,\n scoreSumSquares: 0,\n featureCount: 0,\n featureDensity: 0,\n basesCovered: 0,\n } as QuantitativeStats\n}\n","/* eslint-disable @typescript-eslint/no-unsafe-function-type */\nimport React from 'react'\nimport {\n isStateTreeNode,\n Instance,\n SnapshotIn,\n IAnyStateTreeNode,\n IStateTreeNode,\n IType,\n} from 'mobx-state-tree'\nimport { ThemeOptions } from '@mui/material'\nimport { AnyConfigurationModel } from '../../configuration'\nimport TextSearchManager from '../../TextSearch/TextSearchManager'\nimport { MenuItem } from '../../ui'\nimport RpcManager from '../../rpc/RpcManager'\nimport { Feature } from '../simpleFeature'\nimport { BaseInternetAccountModel } from '../../pluggableElementTypes/models'\n// types\nimport type assemblyManager from '../../assemblyManager'\nimport type {\n NoAssemblyRegion as MUNoAssemblyRegion,\n Region as MUIRegion,\n LocalPathLocation as MULocalPathLocation,\n UriLocation as MUUriLocation,\n BlobLocation as MUBlobLocation,\n} from './mst'\n\nexport * from './util'\n\n/** abstract type for a model that contains multiple views */\nexport interface AbstractViewContainer\n extends IStateTreeNode<IType<any, unknown, any>> {\n views: AbstractViewModel[]\n removeView(view: AbstractViewModel): void\n addView(\n typeName: string,\n initialState?: Record<string, unknown>,\n ): AbstractViewModel\n}\nexport function isViewContainer(\n thing: unknown,\n): thing is AbstractViewContainer {\n return (\n isStateTreeNode(thing) &&\n 'removeView' in thing &&\n 'addView' in thing &&\n 'views' in thing\n )\n}\n\nexport type NotificationLevel = 'error' | 'info' | 'warning' | 'success'\nexport interface SnackAction {\n name: React.ReactElement\n onClick: () => void\n}\n\nexport type AssemblyManager = Instance<ReturnType<typeof assemblyManager>>\n\nexport interface BasePlugin {\n version?: string\n name: string\n url?: string\n}\n\nexport interface JBrowsePlugin {\n name: string\n authors: string[]\n description: string\n location: string\n url?: string\n umdUrl?: string\n esmUrl?: string\n cjsUrl?: string\n license: string\n image?: string\n}\n\nexport type DialogComponentType =\n | React.LazyExoticComponent<React.FC<any>>\n | React.FC<any>\n\n/** minimum interface that all session state models must implement */\nexport interface AbstractSessionModel extends AbstractViewContainer {\n jbrowse: IAnyStateTreeNode\n drawerPosition?: string\n configuration: AnyConfigurationModel\n rpcManager: RpcManager\n assemblyNames: string[]\n assemblies: AnyConfigurationModel[]\n selection?: unknown\n focusedViewId?: string\n themeName?: string\n hovered: unknown\n setHovered: (arg: unknown) => void\n setFocusedViewId?: (id: string) => void\n allThemes?: () => Record<string, ThemeOptions>\n setSelection: (feature: Feature) => void\n setSession?: (arg: { name: string; [key: string]: unknown }) => void\n clearSelection: () => void\n duplicateCurrentSession?: () => void\n notify: (\n message: string,\n level?: NotificationLevel,\n action?: SnackAction,\n ) => void\n notifyError: (message: string, error?: unknown, extra?: unknown) => void\n assemblyManager: AssemblyManager\n version: string\n getTrackActionMenuItems?: Function\n addAssembly?: Function\n removeAssembly?: Function\n textSearchManager?: TextSearchManager\n connections: AnyConfigurationModel[]\n deleteConnection?: Function\n temporaryAssemblies?: unknown[]\n addTemporaryAssembly?: (arg: Record<string, unknown>) => void\n removeTemporaryAssembly?: (arg: string) => void\n sessionConnections?: AnyConfigurationModel[]\n sessionTracks?: AnyConfigurationModel[]\n connectionInstances?: {\n name: string\n tracks: AnyConfigurationModel[]\n configuration: AnyConfigurationModel\n }[]\n makeConnection?: Function\n breakConnection?: Function\n\n prepareToBreakConnection?: (arg: AnyConfigurationModel) => any\n adminMode?: boolean\n showWidget?: Function\n addWidget?: Function\n\n DialogComponent?: DialogComponentType\n\n DialogProps: any\n queueDialog<T extends DialogComponentType>(\n callback: (doneCallback: () => void) => [T, React.ComponentProps<T>],\n ): void\n name: string\n id?: string\n tracks: AnyConfigurationModel[]\n}\nexport function isSessionModel(thing: unknown): thing is AbstractSessionModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'rpcManager' in thing &&\n 'configuration' in thing\n )\n}\n\n/** abstract interface for a session allows editing configurations */\nexport interface SessionWithConfigEditing extends AbstractSessionModel {\n editConfiguration(configuration: AnyConfigurationModel): void\n}\nexport function isSessionModelWithConfigEditing(\n thing: unknown,\n): thing is SessionWithConfigEditing {\n return isSessionModel(thing) && 'editConfiguration' in thing\n}\n\n/** abstract interface for a session allows adding tracks */\nexport interface SessionWithConfigEditing extends AbstractSessionModel {\n addTrackConf(\n configuration: AnyConfigurationModel | SnapshotIn<AnyConfigurationModel>,\n ): void\n}\nexport function isSessionWithAddTracks(\n thing: unknown,\n): thing is SessionWithConfigEditing {\n return (\n // @ts-expect-error\n isSessionModel(thing) && 'addTrackConf' in thing && !thing.disableAddTracks\n )\n}\n\n/** abstract interface for a session allows adding tracks */\nexport interface SessionWithShareURL extends AbstractSessionModel {\n shareURL: string\n}\nexport function isSessionWithShareURL(\n thing: unknown,\n): thing is SessionWithShareURL {\n return isSessionModel(thing) && 'shareURL' in thing && !!thing.shareURL\n}\n\nexport interface Widget {\n type: string\n id: string\n}\n\n/** abstract interface for a session that manages widgets */\nexport interface SessionWithWidgets extends AbstractSessionModel {\n minimized: boolean\n visibleWidget?: Widget\n widgets: Map<string | number, Widget>\n activeWidgets: Map<string | number, Widget>\n hideAllWidgets: () => void\n addWidget(\n typeName: string,\n id: string,\n initialState?: Record<string, unknown>,\n configuration?: { type: string },\n ): Widget\n showWidget(widget: unknown): void\n hideWidget(widget: unknown): void\n}\n\n/* only some sessions with widgets use a drawer widget */\nexport interface SessionWithDrawerWidgets extends SessionWithWidgets {\n drawerWidth: number\n resizeDrawer(arg: number): number\n minimizeWidgetDrawer(): void\n showWidgetDrawer: () => void\n drawerPosition: string\n setDrawerPosition(arg: string): void\n}\n\nexport function isSessionModelWithWidgets(\n thing: unknown,\n): thing is SessionWithWidgets {\n return isSessionModel(thing) && 'widgets' in thing\n}\ninterface SessionWithConnections {\n makeConnection: (arg: AnyConfigurationModel) => void\n}\nexport function isSessionModelWithConnections(\n thing: unknown,\n): thing is SessionWithConnections {\n return isSessionModel(thing) && 'makeConnection' in thing\n}\n\ninterface SessionWithConnectionEditing {\n addConnectionConf: (arg: AnyConfigurationModel) => void\n}\n\nexport function isSessionModelWithConnectionEditing(\n thing: unknown,\n): thing is SessionWithConnectionEditing {\n return isSessionModel(thing) && 'addConnectionConf' in thing\n}\n\nexport interface SessionWithSessionPlugins extends AbstractSessionModel {\n sessionPlugins: JBrowsePlugin[]\n addSessionPlugin: Function\n removeSessionPlugin: Function\n}\nexport function isSessionWithSessionPlugins(\n thing: unknown,\n): thing is SessionWithSessionPlugins {\n return isSessionModel(thing) && 'sessionPlugins' in thing\n}\n\n/** abstract interface for a session that manages a global selection */\nexport interface SelectionContainer extends AbstractSessionModel {\n selection?: unknown\n setSelection(thing: unknown): void\n}\nexport function isSelectionContainer(\n thing: unknown,\n): thing is SelectionContainer {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'selection' in thing &&\n 'setSelection' in thing\n )\n}\n\n/** abstract interface for a session allows applying focus to views and widgets */\nexport interface SessionWithFocusedViewAndDrawerWidgets\n extends SessionWithDrawerWidgets {\n focusedViewId: string | undefined\n setFocusedViewId(id: string): void\n}\n\n/** minimum interface that all view state models must implement */\nexport interface AbstractViewModel {\n id: string\n type: string\n width: number\n minimized: boolean\n setWidth(width: number): void\n setMinimized(flag: boolean): void\n displayName: string | undefined\n setDisplayName: (arg: string) => void\n menuItems: () => MenuItem[]\n}\nexport function isViewModel(thing: unknown): thing is AbstractViewModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'width' in thing &&\n 'setWidth' in thing\n )\n}\n\nexport interface AbstractTrackModel {\n displays: AbstractDisplayModel[]\n configuration: AnyConfigurationModel\n}\n\nexport function isTrackModel(thing: unknown): thing is AbstractTrackModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'configuration' in thing &&\n // @ts-expect-error\n thing.configuration.trackId\n )\n}\n\nexport interface AbstractDisplayModel {\n id: string\n parentTrack: AbstractTrackModel\n renderDelay: number\n rendererType: any\n cannotBeRenderedReason?: string\n}\nexport function isDisplayModel(thing: unknown): thing is AbstractDisplayModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'configuration' in thing &&\n // @ts-expect-error\n thing.configuration.displayId\n )\n}\n\nexport interface TrackViewModel extends AbstractViewModel {\n showTrack(trackId: string): void\n hideTrack(trackId: string): void\n}\nexport function isTrackViewModel(thing: unknown): thing is TrackViewModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'showTrack' in thing &&\n 'hideTrack' in thing\n )\n}\n\n/** minimum interface for the root MST model of a JBrowse app */\nexport interface AbstractRootModel {\n jbrowse: IAnyStateTreeNode\n session?: AbstractSessionModel\n setDefaultSession?(): void\n adminMode?: boolean\n error?: unknown\n}\n\n/** root model with more included for the heavier JBrowse web and desktop app */\nexport interface AppRootModel extends AbstractRootModel {\n internetAccounts: BaseInternetAccountModel[]\n findAppropriateInternetAccount(\n location: UriLocation,\n ): BaseInternetAccountModel | undefined\n}\n\nexport function isAppRootModel(thing: unknown): thing is AppRootModel {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'findAppropriateInternetAccount' in thing\n )\n}\n\nexport interface RootModelWithInternetAccounts extends AbstractRootModel {\n internetAccounts: BaseInternetAccountModel[]\n findAppropriateInternetAccount(\n location: UriLocation,\n ): BaseInternetAccountModel | undefined\n}\n\nexport function isRootModelWithInternetAccounts(\n thing: unknown,\n): thing is RootModelWithInternetAccounts {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'internetAccounts' in thing &&\n 'findAppropriateInternetAccount' in thing\n )\n}\n\n/** a root model that manages global menus */\nexport interface AbstractMenuManager {\n appendMenu(menuName: string): void\n insertMenu(menuName: string, position: number): number\n insertInMenu(menuName: string, menuItem: MenuItem, position: number): number\n appendToMenu(menuName: string, menuItem: MenuItem): number\n appendToSubMenu(menuPath: string[], menuItem: MenuItem): number\n insertInSubMenu(\n menuPath: string[],\n menuItem: MenuItem,\n position: number,\n ): number\n}\nexport function isAbstractMenuManager(\n thing: unknown,\n): thing is AbstractMenuManager {\n return (\n typeof thing === 'object' &&\n thing !== null &&\n 'appendMenu' in thing &&\n 'appendToSubMenu' in thing\n )\n}\n\n// Empty interfaces required by mobx-state-tree\n// See https://mobx-state-tree.js.org/tips/typescript#using-a-mst-type-at-design-time\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface NoAssemblyRegion\n extends SnapshotIn<typeof MUNoAssemblyRegion> {}\n\n/**\n * a description of a specific genomic region. assemblyName, refName, start,\n * end, and reversed\n */\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface Region extends SnapshotIn<typeof MUIRegion> {}\n\nexport interface AugmentedRegion extends Region {\n originalRefName?: string\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface LocalPathLocation\n extends SnapshotIn<typeof MULocalPathLocation> {}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface UriLocation extends SnapshotIn<typeof MUUriLocation> {}\n\nexport function isUriLocation(location: unknown): location is UriLocation {\n return (\n typeof location === 'object' &&\n location !== null &&\n 'uri' in location &&\n !!location.uri\n )\n}\nexport function isLocalPathLocation(\n location: unknown,\n): location is LocalPathLocation {\n return (\n typeof location === 'object' &&\n location !== null &&\n 'localPath' in location &&\n !!location.localPath\n )\n}\n\nexport function isBlobLocation(location: unknown): location is BlobLocation {\n return (\n typeof location === 'object' &&\n location !== null &&\n 'blobId' in location &&\n !!location.blobId\n )\n}\nexport class AuthNeededError extends Error {\n constructor(\n public message: string,\n public url: string,\n ) {\n super(message)\n this.name = 'AuthNeededError'\n\n Object.setPrototypeOf(this, AuthNeededError.prototype)\n }\n}\n\nexport class RetryError extends Error {\n constructor(\n public message: string,\n public internetAccountId: string,\n ) {\n super(message)\n this.name = 'RetryError'\n }\n}\n\nexport function isAuthNeededException(\n exception: unknown,\n): exception is AuthNeededError {\n return (\n exception instanceof Error &&\n // DOMException\n (exception.name === 'AuthNeededError' ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (exception as AuthNeededError).url !== undefined)\n )\n}\n\nexport function isRetryException(exception: Error): boolean {\n return (\n // DOMException\n exception.name === 'RetryError' ||\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n (exception as RetryError).internetAccountId !== undefined\n )\n}\n\n// eslint-disable-next-line @typescript-eslint/no-empty-object-type\nexport interface BlobLocation extends SnapshotIn<typeof MUBlobLocation> {}\n\nexport type FileLocation = LocalPathLocation | UriLocation | BlobLocation\n\n// These types are slightly different than the MST models representing a\n// location because a blob cannot be stored in a MST, so this is the\n// pre-processed file location\nexport interface PreUriLocation {\n uri: string\n}\nexport interface PreLocalPathLocation {\n localPath: string\n}\nexport interface PreBlobLocation {\n blob: File\n}\nexport type PreFileLocation =\n | PreUriLocation\n | PreLocalPathLocation\n | PreBlobLocation\n\nexport { default as TextSearchManager } from '../../TextSearch/TextSearchManager'\n","import { useState, useEffect, useRef } from 'react'\n\nexport default function useMeasure() {\n const ref = useRef<HTMLDivElement>(null)\n const [dims, setDims] = useState<{ width?: number; height?: number }>({\n width: undefined,\n height: undefined,\n })\n useEffect(() => {\n if (!ref.current) {\n return\n }\n const RS =\n typeof window !== 'undefined' && 'ResizeObserver' in window\n ? window.ResizeObserver\n : undefined\n\n if (!RS) {\n return\n }\n const observer = new RS(entries => {\n setDims({\n width: entries[0]!.contentRect.width,\n height: entries[0]!.contentRect.height,\n })\n })\n observer.observe(ref.current)\n\n // Callback fired when component is unmounted\n return () => {\n observer.disconnect()\n }\n }, [])\n\n return [ref, dims] as const\n}\n","import { when as mobxWhen, IWhenOptions } from 'mobx'\nimport { makeAbortError } from './aborting'\n\ninterface WhenOpts extends IWhenOptions {\n signal?: AbortSignal\n}\n\n/**\n * Wrapper for mobx `when` that adds timeout and aborting support.\n */\nexport function when(\n getter: () => boolean,\n { timeout, signal, name }: WhenOpts = {},\n) {\n return new Promise((resolve, reject) => {\n let finished = false\n\n const whenPromise = mobxWhen(getter)\n\n // set up timeout\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n let finishTimeout = () => {}\n if (timeout) {\n timeoutId = setTimeout(() => {\n if (!finished) {\n finished = true\n whenPromise.cancel()\n reject(new Error(`timed out waiting for ${name || 'whenPresent'}`))\n }\n }, timeout)\n finishTimeout = () => {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n }\n }\n\n // set up aborting\n if (signal) {\n signal.addEventListener('abort', () => {\n if (!finished) {\n finished = true\n\n // mobx when supports a cancel method\n whenPromise.cancel()\n finishTimeout()\n\n reject(makeAbortError())\n }\n })\n }\n\n whenPromise\n .then(() => {\n if (!finished) {\n finished = true\n finishTimeout()\n\n resolve(true)\n }\n })\n .catch((err: unknown) => {\n if (!finished) {\n finished = true\n finishTimeout()\n // eslint-disable-next-line @typescript-eslint/prefer-promise-reject-errors\n reject(err)\n }\n })\n })\n}\n\n/**\n * Wrapper for mobx `when` that makes a promise for the return value\n * of the given function at the point in time when it becomes not\n * undefined and not null.\n */\nexport async function whenPresent<FUNCTION extends () => unknown>(\n getter: FUNCTION,\n opts: WhenOpts = {},\n): Promise<NonNullable<ReturnType<FUNCTION>>> {\n await when(() => {\n const val = getter()\n return val !== undefined && val !== null\n }, opts)\n\n return getter() as NonNullable<ReturnType<FUNCTION>>\n}\n","import { revcom, Feature } from '@jbrowse/core/util'\nimport type { Buffer } from 'buffer'\nimport { getTagAlt } from '../util'\n\nexport interface Mismatch {\n qual?: number\n start: number\n length: number\n type: string\n base: string\n altbase?: string\n seq?: string\n cliplen?: number\n}\nconst mdRegex = new RegExp(/(\\d+|\\^[a-z]+|[a-z])/gi)\nconst modificationRegex = new RegExp(/([A-Z])([-+])([^,.?]+)([.?])?/)\nconst cigarRegex = new RegExp(/([MIDNSHPX=])/)\nconst startClip = new RegExp(/(\\d+)[SH]$/)\nconst endClip = new RegExp(/^(\\d+)([SH])/)\n\nexport function parseCigar(cigar = '') {\n return cigar.split(cigarRegex).slice(0, -1)\n}\n\nexport function cigarToMismatches(\n ops: string[],\n seq?: string,\n ref?: string,\n qual?: Buffer,\n) {\n let roffset = 0 // reference offset\n let soffset = 0 // seq offset\n const mismatches: Mismatch[] = []\n const hasRefAndSeq = ref && seq\n for (let i = 0; i < ops.length; i += 2) {\n const len = +ops[i]!\n const op = ops[i + 1]!\n\n if (op === 'M' || op === '=' || op === 'E') {\n if (hasRefAndSeq) {\n for (let j = 0; j < len; j++) {\n if (\n // @ts-ignore in the full yarn build of the repo, this says that object is possibly undefined for some reason, ignored\n seq[soffset + j].toUpperCase() !== ref[roffset + j].toUpperCase()\n ) {\n mismatches.push({\n start: roffset + j,\n type: 'mismatch',\n base: seq[soffset + j]!,\n altbase: ref[roffset + j]!,\n length: 1,\n })\n }\n }\n }\n soffset += len\n }\n if (op === 'I') {\n mismatches.push({\n start: roffset,\n type: 'insertion',\n base: `${len}`,\n length: 0,\n })\n soffset += len\n } else if (op === 'D') {\n mismatches.push({\n start: roffset,\n type: 'deletion',\n base: '*',\n length: len,\n })\n } else if (op === 'N') {\n mismatches.push({\n start: roffset,\n type: 'skip',\n base: 'N',\n length: len,\n })\n } else if (op === 'X') {\n const r = seq?.slice(soffset, soffset + len) || []\n const q = qual?.subarray(soffset, soffset + len) || []\n\n for (let j = 0; j < len; j++) {\n mismatches.push({\n start: roffset + j,\n type: 'mismatch',\n base: r[j]!,\n qual: q[j]!,\n length: 1,\n })\n }\n soffset += len\n } else if (op === 'H') {\n mismatches.push({\n start: roffset,\n type: 'hardclip',\n base: `H${len}`,\n cliplen: len,\n length: 1,\n })\n } else if (op === 'S') {\n mismatches.push({\n start: roffset,\n type: 'softclip',\n base: `S${len}`,\n cliplen: len,\n length: 1,\n })\n soffset += len\n }\n\n if (op !== 'I' && op !== 'S' && op !== 'H') {\n roffset += len\n }\n }\n return mismatches\n}\n\n/**\n * parse a SAM MD tag to find mismatching bases of the template versus the\n * reference @returns array of mismatches and their positions\n */\nexport function mdToMismatches(\n mdstring: string,\n ops: string[],\n cigarMismatches: Mismatch[],\n seq: string,\n qual?: Buffer,\n) {\n let curr: Mismatch = { start: 0, base: '', length: 0, type: 'mismatch' }\n let lastCigar = 0\n let lastTemplateOffset = 0\n let lastRefOffset = 0\n let lastSkipPos = 0\n const mismatchRecords: Mismatch[] = []\n const skips = cigarMismatches.filter(cigar => cigar.type === 'skip')\n\n // convert a position on the reference sequence to a position\n // on the template sequence, taking into account hard and soft\n // clipping of reads\n\n function nextRecord(): void {\n mismatchRecords.push(curr)\n\n // get a new mismatch record ready\n curr = {\n start: curr.start + curr.length,\n length: 0,\n base: '',\n type: 'mismatch',\n }\n }\n\n function getTemplateCoordLocal(refCoord: number): number {\n let templateOffset = lastTemplateOffset\n let refOffset = lastRefOffset\n for (\n let i = lastCigar;\n i < ops.length && refOffset <= refCoord;\n i += 2, lastCigar = i\n ) {\n const len = +ops[i]!\n const op = ops[i + 1]!\n\n if (op === 'S' || op === 'I') {\n templateOffset += len\n } else if (op === 'D' || op === 'P' || op === 'N') {\n refOffset += len\n } else if (op !== 'H') {\n templateOffset += len\n refOffset += len\n }\n }\n lastTemplateOffset = templateOffset\n lastRefOffset = refOffset\n\n return templateOffset - (refOffset - refCoord)\n }\n\n // now actually parse the MD string\n const md = mdstring.match(mdRegex) || []\n for (const token of md) {\n const num = +token\n if (!Number.isNaN(num)) {\n curr.start += num\n } else if (token.startsWith('^')) {\n curr.start += token.length - 1\n } else {\n // mismatch\n // eslint-disable-next-line @typescript-eslint/prefer-for-of\n for (let j = 0; j < token.length; j += 1) {\n curr.length = 1\n\n while (lastSkipPos < skips.length) {\n const mismatch = skips[lastSkipPos]!\n if (curr.start >= mismatch.start) {\n curr.start += mismatch.length\n lastSkipPos++\n } else {\n break\n }\n }\n const s = getTemplateCoordLocal(curr.start)\n curr.base = seq[s] || 'X'\n curr.qual = qual?.[s]\n curr.altbase = token\n nextRecord()\n }\n }\n }\n return mismatchRecords\n}\n\nexport function getMismatches(\n cigar: string,\n md?: string,\n seq?: string,\n ref?: string,\n qual?: Buffer,\n) {\n let mismatches: Mismatch[] = []\n const ops = parseCigar(cigar)\n\n // parse the CIGAR tag if it has one\n if (cigar) {\n mismatches = mismatches.concat(cigarToMismatches(ops, seq, ref, qual))\n }\n\n // now let's look for CRAM or MD mismatches\n if (md && seq) {\n mismatches = mismatches.concat(\n mdToMismatches(md, ops, mismatches, seq, qual),\n )\n }\n\n return mismatches\n}\n// get relative reference sequence positions for positions given relative to\n// the read sequence\nexport function* getNextRefPos(cigarOps: string[], positions: number[]) {\n let readPos = 0\n let refPos = 0\n let currPos = 0\n\n for (let i = 0; i < cigarOps.length && currPos < positions.length; i += 2) {\n const len = +cigarOps[i]!\n const op = cigarOps[i + 1]!\n if (op === 'S' || op === 'I') {\n for (let i = 0; i < len && currPos < positions.length; i++) {\n if (positions[currPos] === readPos + i) {\n currPos++\n }\n }\n readPos += len\n } else if (op === 'D' || op === 'N') {\n refPos += len\n } else if (op === 'M' || op === 'X' || op === '=') {\n for (let i = 0; i < len && currPos < positions.length; i++) {\n if (positions[currPos] === readPos + i) {\n yield refPos + i\n currPos++\n }\n }\n readPos += len\n refPos += len\n }\n }\n}\n\nexport function getModificationProbabilities(feature: Feature) {\n const m = (getTagAlt(feature, 'ML', 'Ml') as number[] | string) || []\n return m\n ? (typeof m === 'string' ? m.split(',').map(e => +e) : m).map(e => e / 255)\n : (getTagAlt(feature, 'MP', 'Mp') as string | undefined)\n ?.split('')\n .map(s => s.charCodeAt(0) - 33)\n .map(elt => Math.min(1, elt / 50))\n}\n\nexport function getMethBins(feature: Feature) {\n const fstart = feature.get('start')\n const fend = feature.get('end')\n const fstrand = feature.get('strand') as -1 | 0 | 1\n const flen = fend - fstart\n const mm = (getTagAlt(feature, 'MM', 'Mm') as string | undefined) || ''\n const methBins = new Array<number>(flen)\n const methProbs = new Array<number>(flen)\n const seq = feature.get('seq') as string | undefined\n if (seq) {\n const ops = parseCigar(feature.get('CIGAR'))\n const probabilities = getModificationProbabilities(feature)\n const modifications = getModificationPositions(mm, seq, fstrand)\n let probIndex = 0\n for (const { type, positions } of modifications) {\n if (type === 'm') {\n for (const ref of getNextRefPos(ops, positions)) {\n const prob = probabilities?.[probIndex] || 0\n probIndex++\n if (ref >= 0 && ref < flen) {\n methBins[ref] = 1\n methProbs[ref] = prob\n }\n }\n }\n }\n }\n return { methBins, methProbs }\n}\n\nexport function getModificationPositions(\n mm: string,\n fseq: string,\n fstrand: number,\n) {\n const seq = fstrand === -1 ? revcom(fseq) : fseq\n const mods = mm.split(';').filter(mod => !!mod)\n const result = []\n for (const mod of mods) {\n const [basemod, ...skips] = mod.split(',')\n\n // regexes based on parse_mm.pl from hts-specs\n const matches = modificationRegex.exec(basemod!)\n if (!matches) {\n throw new Error('bad format for MM tag')\n }\n const [, base, strand, typestr] = matches\n\n // can be a multi e.g. C+mh for both meth (m) and hydroxymeth (h) so\n // split, and they can also be chemical codes (ChEBI) e.g. C+16061\n const types = typestr!.split(/(\\d+|.)/).filter(f => !!f)\n\n if (strand === '-') {\n console.warn('unsupported negative strand modifications')\n // make sure to return a somewhat matching type even in this case\n result.push({ type: 'unsupported', positions: [] as number[] })\n }\n\n // this logic also based on parse_mm.pl from hts-specs is that in the\n // sequence of the read, if we have a modification type e.g. C+m;2 and a\n // sequence ACGTACGTAC we skip the two instances of C and go to the last\n // C\n for (const type of types) {\n let i = 0\n const positions = []\n for (const d of skips) {\n let delta = +d\n do {\n if (base === 'N' || base === seq[i]) {\n delta--\n }\n i++\n } while (delta >= 0 && i < seq.length)\n\n const temp = i - 1\n positions.push(fstrand === -1 ? seq.length - 1 - temp : temp)\n }\n if (fstrand === -1) {\n positions.sort((a, b) => a - b)\n }\n result.push({\n type,\n positions,\n })\n }\n }\n return result\n}\n\nexport function getModificationTypes(mm: string) {\n return mm\n .split(';')\n .filter(mod => !!mod)\n .flatMap(mod => {\n const basemod = mod.split(',')[0]!\n\n const matches = modificationRegex.exec(basemod)\n if (!matches) {\n throw new Error(`bad format for MM tag: ${mm}`)\n }\n const typestr = matches[3]!\n\n // can be a multi e.g. C+mh for both meth (m) and hydroxymeth (h) so\n // split, and they can also be chemical codes (ChEBI) e.g. C+16061\n return typestr.split(/(\\d+|.)/).filter(f => !!f)\n })\n}\n\nexport function getOrientedCigar(flip: boolean, cigar: string[]) {\n if (flip) {\n const ret = []\n for (let i = 0; i < cigar.length; i += 2) {\n const len = cigar[i]!\n let op = cigar[i + 1]!\n if (op === 'D') {\n op = 'I'\n } else if (op === 'I') {\n op = 'D'\n }\n ret.push(len, op)\n }\n return ret\n }\n return cigar\n}\n\nexport function getOrientedMismatches(flip: boolean, cigar: string) {\n const p = parseCigar(cigar)\n return cigarToMismatches(flip ? getOrientedCigar(flip, p) : p)\n}\n\nexport function getLengthOnRef(cigar: string) {\n const cigarOps = parseCigar(cigar)\n let lengthOnRef = 0\n for (let i = 0; i < cigarOps.length; i += 2) {\n const len = +cigarOps[i]!\n const op = cigarOps[i + 1]\n if (op !== 'H' && op !== 'S' && op !== 'I') {\n lengthOnRef += len\n }\n }\n return lengthOnRef\n}\n\nexport function getLength(cigar: string) {\n const cigarOps = parseCigar(cigar)\n let length = 0\n for (let i = 0; i < cigarOps.length; i += 2) {\n const len = +cigarOps[i]!\n const op = cigarOps[i + 1]\n if (op !== 'D' && op !== 'N') {\n length += len\n }\n }\n return length\n}\n\nexport function getLengthSansClipping(cigar: string) {\n const cigarOps = parseCigar(cigar)\n let length = 0\n for (let i = 0; i < cigarOps.length; i += 2) {\n const len = +cigarOps[i]!\n const op = cigarOps[i + 1]\n if (op !== 'H' && op !== 'S' && op !== 'D' && op !== 'N') {\n length += len\n }\n }\n return length\n}\n\nexport function getClip(cigar: string, strand: number) {\n return strand === -1\n ? +(startClip.exec(cigar) || [])[1]! || 0\n : +(endClip.exec(cigar) || [])[1]! || 0\n}\n\nexport function getTag(f: Feature, tag: string) {\n const tags = f.get('tags')\n return tags ? tags[tag] : f.get(tag)\n}\n\n// produces a list of \"feature-like\" object from parsing supplementary\n// alignments in the SA tag\n//\n// @param normalize - used specifically in the linear-read-vs-ref context, it\n// flips features around relative to the original feature. other contexts of\n// usage can keep this false\nexport function featurizeSA(\n SA: string | undefined,\n id: string,\n strand: number,\n readName: string,\n normalize?: boolean,\n) {\n return (\n SA?.split(';')\n .filter(aln => !!aln)\n .map((aln, index) => {\n const ret = aln.split(',')\n const saRef = ret[0]!\n const saStart = ret[1]!\n const saStrand = ret[2]!\n const saCigar = ret[3]!\n const saLengthOnRef = getLengthOnRef(saCigar)\n const saLength = getLength(saCigar)\n const saLengthSansClipping = getLengthSansClipping(saCigar)\n const saStrandNormalized = saStrand === '-' ? -1 : 1\n const saClipPos = getClip(\n saCigar,\n (normalize ? strand : 1) * saStrandNormalized,\n )\n const saRealStart = +saStart - 1\n return {\n refName: saRef,\n start: saRealStart,\n end: saRealStart + saLengthOnRef,\n seqLength: saLength,\n clipPos: saClipPos,\n CIGAR: saCigar,\n strand: (normalize ? strand : 1) * saStrandNormalized,\n uniqueId: `${id}_SA${index}`,\n mate: {\n start: saClipPos,\n end: saClipPos + saLengthSansClipping,\n refName: readName,\n },\n }\n }) || []\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config CramAdapter\n * used to configure CRAM adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'CramAdapter',\n {\n /**\n * #slot fetchSizeLimit\n */\n fetchSizeLimit: {\n type: 'number',\n description:\n 'size in bytes over which to display a warning to the user that too much data will be fetched',\n defaultValue: 3_000_000,\n },\n\n /**\n * #slot cramLocation\n */\n cramLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.cram',\n locationType: 'UriLocation',\n },\n },\n\n /**\n * #slot craiLocation\n */\n craiLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.cram.crai',\n locationType: 'UriLocation',\n },\n },\n\n /**\n * #slot sequenceAdapter\n * generally refers to the reference genome assembly's sequence adapter\n * currently needs to be manually added\n */\n sequenceAdapter: {\n type: 'frozen',\n description: 'sequence data adapter',\n defaultValue: null,\n },\n },\n { explicitlyTyped: true },\n)\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\n// locals\nimport configSchema from './configSchema'\n\nexport default function CramAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(() => {\n return new AdapterType({\n name: 'CramAdapter',\n displayName: 'CRAM adapter',\n configSchema,\n getAdapterClass: () => import('./CramAdapter').then(r => r.default),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config BamAdapter\n * used to configure BAM adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'BamAdapter',\n {\n /**\n * #slot\n */\n bamLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bam', locationType: 'UriLocation' },\n },\n\n index: ConfigurationSchema('BamIndex', {\n /**\n * #slot index.indexType\n */\n indexType: {\n model: types.enumeration('IndexType', ['BAI', 'CSI']),\n type: 'stringEnum',\n defaultValue: 'BAI',\n },\n /**\n * #slot index.location\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bam.bai',\n locationType: 'UriLocation',\n },\n },\n }),\n /**\n * #slot\n */\n fetchSizeLimit: {\n type: 'number',\n description:\n 'size to fetch in bytes over which to display a warning to the user that too much data will be fetched',\n defaultValue: 5_000_000,\n },\n /**\n * #slot\n * generally refers to the reference genome assembly's sequence adapter\n * currently needs to be manually added\n */\n sequenceAdapter: {\n type: 'frozen',\n description:\n 'sequence data adapter, used to calculate SNPs when BAM reads lacking MD tags',\n defaultValue: null,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function BamAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(() => {\n return new AdapterType({\n name: 'BamAdapter',\n displayName: 'BAM adapter',\n configSchema,\n getAdapterClass: () => import('./BamAdapter').then(r => r.default),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n/**\n * #config HtsgetBamAdapter\n * Used to fetch data from Htsget endpoints in BAM format, using the gmod/bam library\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst HtsgetBamAdapter = ConfigurationSchema(\n 'HtsgetBamAdapter',\n {\n /**\n * #slot\n */\n htsgetBase: {\n type: 'string',\n description: 'the base URL to fetch from',\n defaultValue: '',\n },\n /**\n * #slot\n */\n htsgetTrackId: {\n type: 'string',\n description: 'the trackId, which is appended to the base URL',\n defaultValue: '',\n },\n /**\n * #slot\n */\n sequenceAdapter: {\n type: 'frozen',\n description:\n 'sequence data adapter, used to calculate SNPs when BAM reads lacking MD tags',\n defaultValue: null,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default HtsgetBamAdapter\n","import configSchema from './configSchema'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nexport default function HtsgetBamAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(() => {\n return new AdapterType({\n name: 'HtsgetBamAdapter',\n displayName: 'Htsget BAM adapter',\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n configSchema,\n getAdapterClass: () => import('./HtsgetBamAdapter').then(r => r.default),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config SNPCoverageAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'SNPCoverageAdapter',\n {\n /**\n * #slot\n * normally refers to a BAM or CRAM adapter\n */\n subadapter: {\n type: 'frozen',\n defaultValue: null,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function SNPCoverageAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(() => {\n return new AdapterType({\n name: 'SNPCoverageAdapter',\n displayName: 'SNPCoverage adapter',\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./SNPCoverageAdapter').then(r => r.default),\n configSchema,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config SNPCoverageRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst SNPCoverageRenderer = ConfigurationSchema(\n 'SNPCoverageRenderer',\n {\n /**\n * #slot\n */\n clipColor: {\n type: 'color',\n description: 'the color of the clipping marker',\n defaultValue: 'red',\n },\n /**\n * #slot\n */\n indicatorThreshold: {\n type: 'number',\n description:\n 'the proportion of reads containing a insertion/clip indicator',\n defaultValue: 0.4,\n },\n /**\n * #slot\n */\n drawArcs: {\n type: 'boolean',\n description: 'Draw sashimi-style arcs for intron features',\n defaultValue: true,\n },\n /**\n * #slot\n */\n drawInterbaseCounts: {\n type: 'boolean',\n description:\n 'draw count \"upsidedown histogram\" of the interbase events that don\\'t contribute to the coverage count so are not drawn in the normal histogram',\n defaultValue: true,\n },\n /**\n * #slot\n */\n drawIndicators: {\n type: 'boolean',\n description:\n 'draw a triangular indicator where an event has been detected',\n defaultValue: true,\n },\n\n color: {\n type: 'color',\n description: 'Background color for the SNPCoverage renderer',\n defaultValue: '#d3d3d3',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default SNPCoverageRenderer\n","import { createJBrowseTheme } from '@jbrowse/core/ui'\nimport { featureSpanPx, bpSpanPx, Feature } from '@jbrowse/core/util'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { RenderArgsDeserialized as FeatureRenderArgsDeserialized } from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'\nimport {\n getOrigin,\n getScale,\n ScaleOpts,\n WiggleBaseRenderer,\n YSCALEBAR_LABEL_OFFSET,\n} from '@jbrowse/plugin-wiggle'\n\nexport interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {\n bpPerPx: number\n height: number\n highResolutionScaling: number\n scaleOpts: ScaleOpts\n}\n\nexport interface RenderArgsDeserializedWithFeatures\n extends RenderArgsDeserialized {\n features: Map<string, Feature>\n ticks: { values: number[] }\n displayCrossHatches: boolean\n modificationTagMap?: Record<string, string>\n}\n\ntype Counts = Record<string, { total: number; strands: Record<string, number> }>\n\ninterface SNPInfo {\n cov: Counts\n noncov: Counts\n total: number\n}\n\nconst fudgeFactor = 0.6\n\nexport default class SNPCoverageRenderer extends WiggleBaseRenderer {\n // note: the snps are drawn on linear scale even if the data is drawn in log\n // scape hence the two different scales being used\n async draw(\n ctx: CanvasRenderingContext2D,\n props: RenderArgsDeserializedWithFeatures,\n ) {\n const {\n features,\n regions,\n bpPerPx,\n displayCrossHatches,\n modificationTagMap = {},\n scaleOpts,\n height: unadjustedHeight,\n theme: configTheme,\n config: cfg,\n ticks,\n } = props\n const theme = createJBrowseTheme(configTheme)\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n\n // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the\n // wiggle display, and makes the height of the actual drawn area add\n // \"padding\" to the top and bottom of the display\n const offset = YSCALEBAR_LABEL_OFFSET\n const height = unadjustedHeight - offset * 2\n\n const opts = { ...scaleOpts, range: [0, height] }\n const viewScale = getScale(opts)\n\n // clipping and insertion indicators, uses a smaller height/2 scale\n const indicatorViewScale = getScale({\n ...opts,\n range: [0, height / 2],\n scaleType: 'linear',\n })\n const originY = getOrigin(scaleOpts.scaleType)\n const originLinear = getOrigin('linear')\n\n const indicatorThreshold = readConfObject(cfg, 'indicatorThreshold')\n const drawInterbaseCounts = readConfObject(cfg, 'drawInterbaseCounts')\n const drawArcs = readConfObject(cfg, 'drawArcs')\n const drawIndicators = readConfObject(cfg, 'drawIndicators')\n\n // get the y coordinate that we are plotting at, this can be log scale\n const toY = (n: number) => height - (viewScale(n) || 0) + offset\n const toHeight = (n: number) => toY(originY) - toY(n)\n // used specifically for indicator\n const toY2 = (n: number) => height - (indicatorViewScale(n) || 0) + offset\n const toHeight2 = (n: number) => toY2(originLinear) - toY2(n)\n\n const { bases } = theme.palette\n const colorForBase: Record<string, string> = {\n A: bases.A.main,\n C: bases.C.main,\n G: bases.G.main,\n T: bases.T.main,\n insertion: 'purple',\n softclip: 'blue',\n hardclip: 'red',\n total: readConfObject(cfg, 'color'),\n meth: 'red',\n unmeth: 'blue',\n }\n\n const feats = [...features.values()]\n const coverage = feats.filter(f => f.get('type') !== 'skip')\n const skips = feats.filter(f => f.get('type') === 'skip')\n\n // Use two pass rendering, which helps in visualizing the SNPs at higher\n // bpPerPx First pass: draw the gray background\n ctx.fillStyle = colorForBase.total!\n for (const feature of coverage) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n const w = rightPx - leftPx + fudgeFactor\n const score = feature.get('score') as number\n ctx.fillRect(leftPx, toY(score), w, toHeight(score))\n }\n\n // Keep track of previous total which we will use it to draw the interbase\n // indicator (if there is a sudden clip, there will be no read coverage but\n // there will be \"clip\" coverage) at that position beyond the read. if the\n // clip is right at a block boundary then prevTotal will not be available,\n // so this is a best attempt to plot interbase indicator at the \"cliffs\"\n let prevTotal = 0\n\n // extraHorizontallyFlippedOffset is used to draw interbase items, which\n // are located to the left when forward and right when reversed\n const extraHorizontallyFlippedOffset = region.reversed ? 1 / bpPerPx : 0\n\n // Second pass: draw the SNP data, and add a minimum feature width of 1px\n // which can be wider than the actual bpPerPx This reduces overdrawing of\n // the grey background over the SNPs\n\n for (const feature of coverage) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n\n const score = feature.get('score') as number\n const snpinfo = feature.get('snpinfo') as SNPInfo\n const w = Math.max(rightPx - leftPx, 1)\n const totalScore = snpinfo.total\n const keys = Object.keys(snpinfo.cov).sort()\n\n let curr = 0\n for (const base of keys) {\n const { total } = snpinfo.cov[base]!\n ctx.fillStyle =\n colorForBase[base] ||\n modificationTagMap[base.replace('mod_', '')] ||\n 'black'\n\n const height = toHeight(score)\n const bottom = toY(score) + height\n ctx.fillRect(\n Math.round(leftPx),\n bottom - ((total + curr) / score) * height,\n w,\n (total / score) * height,\n )\n curr += total\n }\n\n const interbaseEvents = Object.keys(snpinfo.noncov)\n const indicatorHeight = 4.5\n if (drawInterbaseCounts) {\n let curr = 0\n for (const base of interbaseEvents) {\n const { total } = snpinfo.noncov[base]!\n const r = 0.6\n ctx.fillStyle = colorForBase[base]!\n ctx.fillRect(\n leftPx - r + extraHorizontallyFlippedOffset,\n indicatorHeight + toHeight2(curr),\n r * 2,\n toHeight2(total),\n )\n curr += total\n }\n }\n\n if (drawIndicators) {\n let accum = 0\n let max = 0\n let maxBase = ''\n for (const base of interbaseEvents) {\n const { total } = snpinfo.noncov[base]!\n accum += total\n if (total > max) {\n max = total\n maxBase = base\n }\n }\n\n // avoid drawing a bunch of indicators if coverage is very low e.g.\n // less than 7, uses the prev total in the case of the \"cliff\"\n const indicatorComparatorScore = Math.max(totalScore, prevTotal)\n if (\n accum > indicatorComparatorScore * indicatorThreshold &&\n indicatorComparatorScore > 7\n ) {\n ctx.fillStyle = colorForBase[maxBase]!\n ctx.beginPath()\n const l = leftPx + extraHorizontallyFlippedOffset\n ctx.moveTo(l - 3.5, 0)\n ctx.lineTo(l + 3.5, 0)\n ctx.lineTo(l, indicatorHeight)\n ctx.fill()\n }\n }\n prevTotal = totalScore\n }\n\n if (drawArcs) {\n for (const f of skips) {\n const [left, right] = bpSpanPx(\n f.get('start'),\n f.get('end'),\n region,\n bpPerPx,\n )\n\n ctx.beginPath()\n const str = f.get('strand') as number\n const xs = f.get('xs') as string\n const pos = 'rgba(255,200,200,0.7)'\n const neg = 'rgba(200,200,255,0.7)'\n const neutral = 'rgba(200,200,200,0.7)'\n\n if (xs === '+') {\n ctx.strokeStyle = pos\n } else if (xs === '-') {\n ctx.strokeStyle = neg\n } else if (str === 1) {\n ctx.strokeStyle = pos\n } else if (str === -1) {\n ctx.strokeStyle = neg\n } else {\n ctx.strokeStyle = neutral\n }\n\n ctx.lineWidth = Math.log(f.get('score') + 1)\n ctx.moveTo(left, height - offset * 2)\n ctx.bezierCurveTo(left, 0, right, 0, right, height - offset * 2)\n ctx.stroke()\n }\n }\n\n if (displayCrossHatches) {\n ctx.lineWidth = 1\n ctx.strokeStyle = 'rgba(140,140,140,0.8)'\n ticks.values.forEach(tick => {\n ctx.beginPath()\n ctx.moveTo(0, Math.round(toY(tick)))\n ctx.lineTo(width, Math.round(toY(tick)))\n ctx.stroke()\n })\n }\n return undefined\n }\n}\n","import configSchema from './configSchema'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport SNPCoverageRenderer from './SNPCoverageRenderer'\n\nimport { WiggleRendering } from '@jbrowse/plugin-wiggle'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new SNPCoverageRenderer({\n name: 'SNPCoverageRenderer',\n ReactComponent: WiggleRendering,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import deepEqual from 'fast-deep-equal'\nimport { LayoutSession } from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport GranularRectLayout from '@jbrowse/core/util/layouts/GranularRectLayout'\nimport MultiLayout from '@jbrowse/core/util/layouts/MultiLayout'\nimport { readConfObject } from '@jbrowse/core/configuration'\n\nexport interface PileupLayoutSessionProps {\n config: AnyConfigurationModel\n bpPerPx: number\n filters: SerializableFilterChain\n filterBy: unknown\n sortedBy: unknown\n showSoftClip: unknown\n}\n\ntype MyMultiLayout = MultiLayout<GranularRectLayout<unknown>, unknown>\ninterface CachedPileupLayout {\n layout: MyMultiLayout\n config: AnyConfigurationModel\n filters?: SerializableFilterChain\n filterBy: unknown\n sortedBy: unknown\n showSoftClip: boolean\n}\n\n// The pileup layout session adds\n// - sorting and revealing soft clip changes the layout of pileup renderer\n// - extra conditions to see if cached layout is valid\nexport class PileupLayoutSession extends LayoutSession {\n sortedBy: unknown\n filterBy: unknown\n\n showSoftClip = false\n\n constructor(args: PileupLayoutSessionProps) {\n super(args)\n this.config = args.config\n }\n\n cachedLayoutIsValid(cachedLayout: CachedPileupLayout) {\n return (\n super.cachedLayoutIsValid(cachedLayout) &&\n this.showSoftClip === cachedLayout.showSoftClip &&\n deepEqual(this.sortedBy, cachedLayout.sortedBy) &&\n deepEqual(this.filterBy, cachedLayout.filterBy)\n )\n }\n\n cachedLayout: CachedPileupLayout | undefined\n\n get layout(): MyMultiLayout {\n if (!this.cachedLayout || !this.cachedLayoutIsValid(this.cachedLayout)) {\n this.cachedLayout = {\n layout: this.makeLayout(),\n config: readConfObject(this.config),\n filters: this.filters,\n filterBy: this.filterBy,\n sortedBy: this.sortedBy,\n showSoftClip: this.showSoftClip,\n }\n }\n return this.cachedLayout.layout\n }\n}\n","import BoxRendererType, {\n RenderArgsDeserialized as BoxRenderArgsDeserialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'\nimport {\n Feature,\n Region,\n notEmpty,\n renderToAbstractCanvas,\n} from '@jbrowse/core/util'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { BaseLayout } from '@jbrowse/core/util/layouts/BaseLayout'\nimport { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport {\n PileupLayoutSession,\n PileupLayoutSessionProps,\n} from './PileupLayoutSession'\nimport { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\n\n// locals\nimport { fetchSequence, shouldFetchReferenceSequence } from '../util'\nimport { layoutFeats } from './layoutFeatures'\n\nexport interface RenderArgsDeserialized extends BoxRenderArgsDeserialized {\n colorBy?: { type: string; tag?: string }\n colorTagMap?: Record<string, string>\n modificationTagMap?: Record<string, string>\n sortedBy?: {\n type: string\n pos: number\n refName: string\n assemblyName: string\n tag?: string\n }\n showSoftClip: boolean\n highResolutionScaling: number\n}\n\nexport interface RenderArgsDeserializedWithFeaturesAndLayout\n extends RenderArgsDeserialized {\n features: Map<string, Feature>\n layout: BaseLayout<Feature>\n regionSequence?: string\n}\n\nexport default class PileupRenderer extends BoxRendererType {\n supportsSVG = true\n\n async fetchSequence(renderProps: RenderArgsDeserialized) {\n const { sessionId, regions, adapterConfig } = renderProps\n const { sequenceAdapter } = adapterConfig\n if (!sequenceAdapter) {\n return undefined\n }\n const pm = this.pluginManager\n const { dataAdapter } = await getAdapter(pm, sessionId, sequenceAdapter)\n const region = regions[0]!\n return fetchSequence(region, dataAdapter as BaseFeatureDataAdapter)\n }\n\n getExpandedRegion(region: Region, renderArgs: RenderArgsDeserialized) {\n const { config, showSoftClip } = renderArgs\n const { start, end } = region\n const maxClippingSize = readConfObject(config, 'maxClippingSize')\n const bpExpansion = showSoftClip ? Math.round(maxClippingSize) : 0\n\n return {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n ...(region as Omit<typeof region, symbol>),\n start: Math.floor(Math.max(start - bpExpansion, 0)),\n end: Math.ceil(end + bpExpansion),\n }\n }\n\n async render(renderProps: RenderArgsDeserialized) {\n const features = await this.getFeatures(renderProps)\n const layout = this.createLayoutInWorker(renderProps)\n const { regions, bpPerPx } = renderProps\n const region = regions[0]!\n\n const layoutRecords = layoutFeats({\n ...renderProps,\n features,\n layout,\n })\n\n // only need reference sequence if there are features and only for some\n // cases\n const regionSequence =\n features.size && shouldFetchReferenceSequence(renderProps.colorBy?.type)\n ? await this.fetchSequence(renderProps)\n : undefined\n const width = (region.end - region.start) / bpPerPx\n const height = Math.max(layout.getTotalHeight(), 1)\n\n const { makeImageData } = await import('./makeImageData')\n const res = await renderToAbstractCanvas(\n width,\n height,\n renderProps,\n ctx => {\n makeImageData({\n ctx,\n layoutRecords: layoutRecords.filter(notEmpty),\n canvasWidth: width,\n renderArgs: {\n ...renderProps,\n layout,\n features,\n regionSequence,\n },\n })\n return undefined\n },\n )\n\n const results = await super.render({\n ...renderProps,\n ...res,\n features,\n layout,\n height,\n width,\n })\n\n return {\n ...results,\n ...res,\n features: new Map(),\n layout,\n height,\n width,\n maxHeightReached: layout.maxHeightReached,\n }\n }\n\n createSession(args: PileupLayoutSessionProps) {\n return new PileupLayoutSession(args)\n }\n}\n\nexport {\n type RenderArgs,\n type RenderResults,\n type RenderArgsSerialized,\n type ResultsSerialized,\n type ResultsDeserialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'\n","import { readConfObject } from '@jbrowse/core/configuration'\nimport { iterMap } from '@jbrowse/core/util'\n\n// locals\nimport { layoutFeature } from './layoutFeature'\nimport { RenderArgsDeserializedWithFeaturesAndLayout } from './PileupRenderer'\nimport { sortFeature } from './sortUtil'\n\n// layout determines the height of the canvas that we use to render\nexport function layoutFeats(\n props: RenderArgsDeserializedWithFeaturesAndLayout,\n) {\n const { layout, features, sortedBy, config, bpPerPx, showSoftClip, regions } =\n props\n const region = regions[0]!\n const featureMap =\n sortedBy?.type && region.start === sortedBy.pos\n ? sortFeature(features, sortedBy)\n : features\n\n const heightPx = readConfObject(config, 'height')\n const displayMode = readConfObject(config, 'displayMode')\n return iterMap(\n featureMap.values(),\n feature =>\n layoutFeature({\n feature,\n layout,\n bpPerPx,\n region,\n showSoftClip,\n heightPx,\n displayMode,\n }),\n featureMap.size,\n )\n}\n","import { doesIntersect2, Feature } from '@jbrowse/core/util'\nimport { Mismatch } from '../MismatchParser'\n\ninterface SortObject {\n pos: number\n type: string\n tag?: string\n}\nexport const sortFeature = (\n features: Map<string, Feature>,\n sortedBy: SortObject,\n) => {\n const featureArray = Array.from(features.values())\n const featuresInCenterLine: Feature[] = []\n const featuresOutsideCenter: Feature[] = []\n const { pos, type } = sortedBy\n\n // only sort on features that intersect center line, append those outside post-sort\n featureArray.forEach(innerArray => {\n const feature = innerArray\n const start = feature.get('start')\n const end = feature.get('end')\n if (doesIntersect2(pos - 1, pos, start, end)) {\n featuresInCenterLine.push(innerArray)\n } else {\n featuresOutsideCenter.push(innerArray)\n }\n })\n\n const isCram = featureArray.length ? featureArray[0]!.get('tags') : false\n switch (type) {\n case 'Start location': {\n featuresInCenterLine.sort((a, b) => a.get('start') - b.get('start'))\n break\n }\n\n case 'tag': {\n const tag = sortedBy.tag!\n const getTag = (f: Feature, t: string) => {\n return isCram ? f.get('tags')[t] : f.get(t)\n }\n const isString =\n featuresInCenterLine[0] &&\n typeof getTag(featuresInCenterLine[0], tag) === 'string'\n if (isString) {\n featuresInCenterLine.sort((a, b) =>\n getTag(b, tag).localeCompare(getTag(a, tag)),\n )\n } else {\n featuresInCenterLine.sort(\n (a, b) => (getTag(b, tag) || 0) - (getTag(a, tag) || 0),\n )\n }\n break\n }\n\n // first sort all mismatches, then all reference bases at the end\n case 'Base pair': {\n const baseSortArray: [string, Mismatch][] = []\n featuresInCenterLine.forEach(feature => {\n const mismatches: Mismatch[] = feature.get('mismatches')\n mismatches.forEach(mismatch => {\n const start = feature.get('start')\n const offset = start + mismatch.start + 1\n const consuming =\n mismatch.type === 'insertion' || mismatch.type === 'softclip'\n const len = consuming ? 0 : mismatch.length\n if (pos >= offset && pos < offset + len) {\n baseSortArray.push([feature.id(), mismatch])\n }\n })\n })\n\n const baseMap = new Map(baseSortArray)\n featuresInCenterLine.sort((a, b) => {\n const aMismatch = baseMap.get(a.id())\n const bMismatch = baseMap.get(b.id())\n const acode = bMismatch?.base.toUpperCase()\n const bcode = aMismatch?.base.toUpperCase()\n if (acode === bcode && acode === '*') {\n // @ts-expect-error\n return aMismatch.length - bMismatch.length\n }\n return (\n (acode ? acode.charCodeAt(0) : 0) - (bcode ? bcode.charCodeAt(0) : 0)\n )\n })\n\n break\n }\n\n // sorts positive strands then negative strands\n case 'Read strand': {\n featuresInCenterLine.sort((a, b) =>\n a.get('strand') <= b.get('strand') ? 1 : -1,\n )\n break\n }\n }\n\n return new Map(\n [...featuresInCenterLine, ...featuresOutsideCenter].map(feature => [\n feature.id(),\n feature,\n ]),\n )\n}\n","import { bpSpanPx, Feature, Region } from '@jbrowse/core/util'\nimport { BaseLayout } from '@jbrowse/core/util/layouts'\n// locals\nimport { Mismatch } from '../MismatchParser'\n\nexport interface LayoutRecord {\n feature: Feature\n leftPx: number\n rightPx: number\n topPx: number\n heightPx: number\n}\n\nexport function layoutFeature({\n feature,\n layout,\n bpPerPx,\n region,\n showSoftClip,\n heightPx,\n displayMode,\n}: {\n feature: Feature\n layout: BaseLayout<Feature>\n bpPerPx: number\n region: Region\n showSoftClip?: boolean\n heightPx: number\n displayMode: string\n}): LayoutRecord | null {\n let expansionBefore = 0\n let expansionAfter = 0\n\n // Expand the start and end of feature when softclipping enabled\n if (showSoftClip) {\n const mismatches = feature.get('mismatches') as Mismatch[]\n const seq = feature.get('seq') as string\n if (seq) {\n for (const { type, start, cliplen = 0 } of mismatches) {\n if (type === 'softclip') {\n if (start === 0) {\n expansionBefore = cliplen\n } else {\n expansionAfter = cliplen\n }\n }\n }\n }\n }\n\n const [leftPx, rightPx] = bpSpanPx(\n feature.get('start') - expansionBefore,\n feature.get('end') + expansionAfter,\n region,\n bpPerPx,\n )\n\n if (displayMode === 'compact') {\n heightPx /= 3\n }\n if (feature.get('refName') !== region.refName) {\n throw new Error(\n `feature ${feature.id()} is not on the current region's reference sequence ${\n region.refName\n }`,\n )\n }\n const topPx = layout.addRect(\n feature.id(),\n feature.get('start') - expansionBefore,\n feature.get('end') + expansionAfter,\n heightPx,\n feature,\n )\n if (topPx === null) {\n return null\n }\n\n return {\n feature,\n leftPx,\n rightPx,\n topPx: displayMode === 'collapse' ? 0 : topPx,\n heightPx,\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config PileupRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst PileupRenderer = ConfigurationSchema(\n 'PileupRenderer',\n {\n /**\n * #slot\n * default magenta here is used to detect the user has not customized this\n */\n color: {\n type: 'color',\n description: 'the color of each feature in a pileup alignment',\n defaultValue: '#f0f',\n contextVariable: ['feature'],\n },\n\n /**\n * #slot\n */\n orientationType: {\n type: 'stringEnum',\n model: types.enumeration('orientationType', ['fr', 'rf', 'ff']),\n defaultValue: 'fr',\n description:\n 'read sequencer orientation. fr is normal \"reads pointing at each other ---> <--- while some other sequencers can use other options',\n },\n /**\n * #slot\n */\n displayMode: {\n type: 'stringEnum',\n model: types.enumeration('displayMode', [\n 'normal',\n 'compact',\n 'collapse',\n ]),\n description: 'Alternative display modes',\n defaultValue: 'normal',\n },\n /**\n * #slot\n */\n minSubfeatureWidth: {\n type: 'number',\n description:\n 'the minimum width in px for a pileup mismatch feature. use for increasing/decreasing mismatch marker widths when zoomed out, e.g. 0 or 1',\n defaultValue: 1,\n },\n /**\n * #slot\n */\n maxHeight: {\n type: 'integer',\n description: 'the maximum height to be used in a pileup rendering',\n defaultValue: 1200,\n },\n /**\n * #slot\n */\n maxClippingSize: {\n type: 'integer',\n description: 'the max clip size to be used in a pileup rendering',\n defaultValue: 10000,\n },\n /**\n * #slot\n */\n height: {\n type: 'number',\n description: 'the height of each feature in a pileup alignment',\n defaultValue: 7,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n noSpacing: {\n type: 'boolean',\n description: 'remove spacing between features',\n defaultValue: false,\n },\n /**\n * #slot\n */\n largeInsertionIndicatorScale: {\n type: 'number',\n description:\n 'scale at which to draw the large insertion indicators (bp/pixel)',\n defaultValue: 10,\n },\n /**\n * #slot\n */\n mismatchAlpha: {\n type: 'boolean',\n defaultValue: false,\n description: 'Fade low quality mismatches',\n },\n },\n { explicitlyTyped: true },\n)\nexport default PileupRenderer\n","import React, { useRef, useState, useEffect } from 'react'\nimport { Region } from '@jbrowse/core/util/types'\nimport { PrerenderedCanvas } from '@jbrowse/core/ui'\nimport { bpSpanPx } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\nimport type { BaseLinearDisplayModel } from '@jbrowse/plugin-linear-genome-view'\n\nconst PileupRendering = observer(function (props: {\n blockKey: string\n displayModel?: BaseLinearDisplayModel\n width: number\n height: number\n regions: Region[]\n bpPerPx: number\n sortedBy?: {\n type: string\n pos: number\n refName: string\n }\n colorBy?: {\n type: string\n tag?: string\n }\n filterBy?: {\n tagFilter?: { tag: string }\n }\n onMouseMove?: (event: React.MouseEvent, featureId?: string) => void\n}) {\n const {\n onMouseMove,\n blockKey,\n displayModel,\n width,\n height,\n regions,\n bpPerPx,\n sortedBy,\n colorBy,\n filterBy,\n } = props\n const { selectedFeatureId, featureIdUnderMouse, contextMenuFeature } =\n displayModel || {}\n const [firstRender, setFirstRender] = useState(false)\n useEffect(() => {\n setFirstRender(true)\n }, [])\n\n const region = regions[0]!\n const ref = useRef<HTMLDivElement>(null)\n const [mouseIsDown, setMouseIsDown] = useState(false)\n const [movedDuringLastMouseDown, setMovedDuringLastMouseDown] =\n useState(false)\n const selectedRect = selectedFeatureId\n ? displayModel?.getFeatureByID(blockKey, selectedFeatureId)\n : undefined\n\n const highlightedFeature = featureIdUnderMouse || contextMenuFeature?.id()\n const highlightedRect = highlightedFeature\n ? displayModel?.getFeatureByID(blockKey, highlightedFeature)\n : undefined\n\n function makeRect(r: [number, number, number, number], offset = 2) {\n const [leftBp, topPx, rightBp, bottomPx] = r\n const [leftPx, rightPx] = bpSpanPx(leftBp, rightBp, region, bpPerPx)\n const rectTop = Math.round(topPx)\n const rectHeight = Math.round(bottomPx - topPx)\n return {\n left: leftPx - offset,\n top: rectTop - offset,\n width: rightPx - leftPx,\n height: rectHeight,\n }\n }\n const selected = selectedRect ? makeRect(selectedRect) : undefined\n const highlight = highlightedRect ? makeRect(highlightedRect, 0) : undefined\n\n function onMouseDown(event: React.MouseEvent) {\n setMouseIsDown(true)\n setMovedDuringLastMouseDown(false)\n callMouseHandler('MouseDown', event)\n }\n\n function onMouseEnter(event: React.MouseEvent) {\n callMouseHandler('MouseEnter', event)\n }\n\n function onMouseOut(event: React.MouseEvent) {\n callMouseHandler('MouseOut', event)\n callMouseHandler('MouseLeave', event)\n }\n\n function onMouseOver(event: React.MouseEvent) {\n callMouseHandler('MouseOver', event)\n }\n\n function onMouseUp(event: React.MouseEvent) {\n setMouseIsDown(false)\n callMouseHandler('MouseUp', event)\n }\n\n function onClick(event: React.MouseEvent) {\n if (!movedDuringLastMouseDown) {\n callMouseHandler('Click', event)\n }\n }\n\n function onMouseLeave(event: React.MouseEvent) {\n callMouseHandler('MouseOut', event)\n callMouseHandler('MouseLeave', event)\n }\n\n function onContextMenu(event: React.MouseEvent) {\n callMouseHandler('ContextMenu', event)\n }\n\n function mouseMove(event: React.MouseEvent) {\n if (!ref.current) {\n return\n }\n if (mouseIsDown) {\n setMovedDuringLastMouseDown(true)\n }\n const rect = ref.current.getBoundingClientRect()\n const offsetX = event.clientX - rect.left\n const offsetY = event.clientY - rect.top\n const px = region.reversed ? width - offsetX : offsetX\n const clientBp = region.start + bpPerPx * px\n\n onMouseMove?.(\n event,\n displayModel?.getFeatureOverlapping(blockKey, clientBp, offsetY),\n )\n }\n\n function callMouseHandler(handlerName: string, event: React.MouseEvent) {\n // @ts-expect-error\n const featureHandler = props[`onFeature${handlerName}`]\n // @ts-expect-error\n const canvasHandler = props[`on${handlerName}`]\n if (featureHandler && featureIdUnderMouse) {\n featureHandler(event, featureIdUnderMouse)\n } else if (canvasHandler) {\n canvasHandler(event, featureIdUnderMouse)\n }\n }\n\n const canvasWidth = Math.ceil(width)\n // need to call this in render so we get the right observer behavior\n return (\n <div\n ref={ref}\n data-testid={[\n 'pileup-overlay',\n sortedBy?.type,\n colorBy?.type,\n colorBy?.tag,\n filterBy?.tagFilter?.tag,\n ]\n .filter(f => !!f)\n .join('-')}\n style={{ position: 'relative', width: canvasWidth, height }}\n onMouseDown={event => {\n onMouseDown(event)\n }}\n onMouseEnter={event => {\n onMouseEnter(event)\n }}\n onMouseOut={event => {\n onMouseOut(event)\n }}\n onMouseOver={event => {\n onMouseOver(event)\n }}\n onMouseUp={event => {\n onMouseUp(event)\n }}\n onMouseLeave={event => {\n onMouseLeave(event)\n }}\n onMouseMove={event => {\n mouseMove(event)\n }}\n onClick={event => {\n onClick(event)\n }}\n onContextMenu={event => {\n onContextMenu(event)\n }}\n onFocus={() => {}}\n onBlur={() => {}}\n >\n <PrerenderedCanvas\n {...props}\n style={{ position: 'absolute', left: 0, top: 0 }}\n />\n {firstRender && highlight ? (\n <div\n style={{\n position: 'absolute',\n backgroundColor: '#0003',\n pointerEvents: 'none',\n ...highlight,\n }}\n />\n ) : null}\n {firstRender && selected ? (\n <div\n style={{\n position: 'absolute',\n border: '2px solid #00b8ff',\n boxSizing: 'content-box',\n pointerEvents: 'none',\n ...selected,\n }}\n />\n ) : null}\n </div>\n )\n})\n\nexport default PileupRendering\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport PileupRenderer from './PileupRenderer'\nimport configSchema from './configSchema'\nimport ReactComponent from './components/PileupRendering'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addRendererType(() => {\n return new PileupRenderer({\n name: 'PileupRenderer',\n displayName: 'Pileup renderer',\n ReactComponent,\n configSchema,\n pluginManager,\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nexport function getLowerPanelDisplays(pluginManager: PluginManager) {\n return pluginManager\n .getDisplayElements()\n .filter(f => f.subDisplay?.type === 'LinearAlignmentsDisplay')\n .filter(f => f.subDisplay?.lowerPanel)\n}\n","import React from 'react'\nimport { autorun, when } from 'mobx'\nimport {\n addDisposer,\n getSnapshot,\n isAlive,\n types,\n Instance,\n IStateTreeNode,\n} from 'mobx-state-tree'\nimport deepEqual from 'fast-deep-equal'\n\n// jbrowse\nimport {\n AnyConfigurationModel,\n AnyConfigurationSchemaType,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport { FeatureDensityStats } from '@jbrowse/core/data_adapters/BaseAdapter'\n\n// locals\nimport { LinearAlignmentsDisplayMixin } from './alignmentsModel'\nimport { getLowerPanelDisplays } from './util'\nimport { IFilter } from '../../shared'\n\nconst minDisplayHeight = 20\n\nfunction deepSnap<T extends IStateTreeNode, U extends IStateTreeNode>(\n x1?: T,\n x2?: U,\n) {\n return deepEqual(\n x1 ? getSnapshot(x1) : undefined,\n x2 ? getSnapshot(x2) : undefined,\n )\n}\n\nfunction preCheck(self: LinearAlignmentsDisplayModel) {\n const { PileupDisplay, SNPCoverageDisplay } = self\n return (\n PileupDisplay ||\n isAlive(PileupDisplay) ||\n SNPCoverageDisplay ||\n isAlive(SNPCoverageDisplay)\n )\n}\n\nfunction propagateColorBy(self: LinearAlignmentsDisplayModel) {\n const { PileupDisplay, SNPCoverageDisplay } = self\n if (!preCheck(self) || !PileupDisplay.colorBy) {\n return\n }\n if (!deepSnap(PileupDisplay.colorBy, SNPCoverageDisplay.colorBy)) {\n SNPCoverageDisplay.setColorBy(getSnapshot(PileupDisplay.colorBy))\n }\n}\n\nfunction propagateFilterBy(self: LinearAlignmentsDisplayModel) {\n const { PileupDisplay, SNPCoverageDisplay } = self\n if (!preCheck(self) || !PileupDisplay.filterBy) {\n return\n }\n if (!deepSnap(PileupDisplay.filterBy, SNPCoverageDisplay.filterBy)) {\n SNPCoverageDisplay.setFilterBy(getSnapshot(PileupDisplay.filterBy))\n }\n}\n\n/**\n * #stateModel LinearAlignmentsDisplay\n * extends\n * - [BaseDisplay](../basedisplay)\n * - [LinearAlignmentsDisplayMixin](../linearalignmentsdisplaymixin)\n */\nfunction stateModelFactory(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'LinearAlignmentsDisplay',\n BaseDisplay,\n LinearAlignmentsDisplayMixin(pluginManager, configSchema),\n )\n .volatile(() => ({\n scrollTop: 0,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setScrollTop(scrollTop: number) {\n self.scrollTop = scrollTop\n },\n\n /**\n * #action\n */\n setSNPCoverageHeight(n: number) {\n self.snpCovHeight = n\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get height() {\n return self.heightPreConfig ?? getConf(self, 'height')\n },\n\n /**\n * #getter\n */\n get featureIdUnderMouse() {\n return (\n self.PileupDisplay.featureIdUnderMouse ||\n self.SNPCoverageDisplay.featureIdUnderMouse\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get pileupConf() {\n const conf = getConf(self, 'pileupDisplay')\n return {\n ...conf,\n type: self.lowerPanelType,\n displayId: `${self.configuration.displayId}_${self.lowerPanelType}_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this\n }\n },\n\n /**\n * #method\n */\n getFeatureByID(blockKey: string, id: string) {\n return self.PileupDisplay.getFeatureByID(blockKey, id)\n },\n /**\n * #method\n */\n searchFeatureByID(id: string) {\n return self.PileupDisplay.searchFeatureByID?.(id)\n },\n\n /**\n * #getter\n */\n get features() {\n return self.PileupDisplay.features\n },\n\n /**\n * #getteralignmentsdisplaymodel\n */\n get DisplayBlurb() {\n return self.PileupDisplay?.DisplayBlurb\n },\n\n /**\n * #getter\n */\n get sortedBy() {\n return self.PileupDisplay.sortedBy\n },\n\n /**\n * #getter\n */\n get coverageConf() {\n const conf = getConf(self, 'snpCoverageDisplay')\n return {\n ...conf,\n displayId: `${self.configuration.displayId}_snpcoverage_xyz`, // xyz to avoid someone accidentally naming the displayId similar to this\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setSNPCoverageDisplay(configuration: AnyConfigurationModel) {\n self.SNPCoverageDisplay = {\n type: 'LinearSNPCoverageDisplay',\n configuration,\n height: self.snpCovHeight,\n }\n },\n /**\n * #action\n */\n setFeatureDensityStatsLimit(stats?: FeatureDensityStats) {\n self.PileupDisplay.setFeatureDensityStatsLimit(stats)\n self.SNPCoverageDisplay.setFeatureDensityStatsLimit(stats)\n },\n\n /**\n * #action\n */\n setPileupDisplay(configuration: AnyConfigurationModel) {\n self.PileupDisplay = {\n type: configuration.type || 'LinearPileupDisplay',\n configuration,\n }\n },\n /**\n * #action\n */\n setHeight(n: number) {\n self.heightPreConfig = Math.max(n, minDisplayHeight)\n return self.heightPreConfig\n },\n /**\n * #action\n */\n setFilterBy(filter: IFilter) {\n self.PileupDisplay.setFilterBy(filter)\n self.SNPCoverageDisplay.setFilterBy(filter)\n },\n /**\n * #action\n */\n setLowerPanelType(type: string) {\n self.lowerPanelType = type\n },\n /**\n * #action\n */\n resizeHeight(distance: number) {\n const oldHeight = self.height\n const newHeight = this.setHeight(self.height + distance)\n return newHeight - oldHeight\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n const {\n SNPCoverageDisplay,\n PileupDisplay,\n coverageConf,\n pileupConf,\n } = self\n\n if (!SNPCoverageDisplay) {\n self.setSNPCoverageDisplay(coverageConf)\n } else if (\n !deepEqual(\n coverageConf,\n getSnapshot(SNPCoverageDisplay.configuration),\n )\n ) {\n SNPCoverageDisplay.setHeight(self.snpCovHeight)\n SNPCoverageDisplay.setConfig(self.coverageConf)\n }\n\n if (!PileupDisplay || self.lowerPanelType !== PileupDisplay.type) {\n self.setPileupDisplay(pileupConf)\n } else if (\n !deepEqual(pileupConf, getSnapshot(PileupDisplay.configuration))\n ) {\n PileupDisplay.setConfig(self.pileupConf)\n }\n\n propagateColorBy(self as LinearAlignmentsDisplayModel)\n propagateFilterBy(self as LinearAlignmentsDisplayModel)\n }),\n )\n\n addDisposer(\n self,\n autorun(() => {\n self.setSNPCoverageHeight(self.SNPCoverageDisplay.height)\n }),\n )\n\n addDisposer(\n self,\n autorun(() => {\n self.PileupDisplay.setHeight(\n self.height - self.SNPCoverageDisplay.height,\n )\n }),\n )\n },\n /**\n * #action\n */\n async renderSvg(opts: { rasterizeLayers?: boolean }) {\n const pileupHeight = self.height - self.SNPCoverageDisplay.height\n await when(\n () =>\n !self.PileupDisplay.renderProps().notReady &&\n !self.SNPCoverageDisplay.renderProps().notReady,\n )\n return (\n <>\n <g>{await self.SNPCoverageDisplay.renderSvg(opts)}</g>\n <g transform={`translate(0 ${self.SNPCoverageDisplay.height})`}>\n {await self.PileupDisplay.renderSvg({\n ...opts,\n overrideHeight: pileupHeight,\n })}\n </g>\n </>\n )\n },\n }))\n .views(self => {\n const { trackMenuItems: superTrackMenuItems } = self\n return {\n /**\n * #method\n */\n trackMenuItems(): MenuItem[] {\n if (!self.PileupDisplay) {\n return []\n }\n const extra = getLowerPanelDisplays(pluginManager).map(d => ({\n type: 'radio',\n label: d.displayName,\n checked: d.name === self.PileupDisplay.type,\n onClick: () => {\n self.setLowerPanelType(d.name)\n },\n }))\n return [\n ...superTrackMenuItems(),\n {\n type: 'subMenu',\n label: 'Pileup settings',\n subMenu: self.PileupDisplay.trackMenuItems(),\n },\n {\n type: 'subMenu',\n label: 'SNPCoverage settings',\n subMenu: self.SNPCoverageDisplay.trackMenuItems(),\n },\n {\n type: 'subMenu',\n label: 'Replace lower panel with...',\n subMenu: extra,\n },\n ]\n },\n }\n })\n .preProcessSnapshot(snap => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!snap) {\n return snap\n }\n // @ts-expect-error\n const { height, ...rest } = snap\n return { heightPreConfig: height, ...rest }\n })\n}\n\nexport default stateModelFactory\n\nexport type LinearAlignmentsDisplayStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearAlignmentsDisplayModel =\n Instance<LinearAlignmentsDisplayStateModel>\n","import { types } from 'mobx-state-tree'\n\n// jbrowse\nimport {\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { getLowerPanelDisplays } from './util'\n\n/**\n * #stateModel LinearAlignmentsDisplayMixin\n */\nexport function LinearAlignmentsDisplayMixin(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types.model({\n /**\n * #property\n * refers to LinearPileupDisplay sub-display model\n */\n PileupDisplay: types.maybe(\n types.union(\n ...getLowerPanelDisplays(pluginManager).map(f => f.stateModel),\n ),\n ),\n /**\n * #property\n * refers to LinearSNPCoverageDisplay sub-display model\n */\n SNPCoverageDisplay: types.maybe(\n pluginManager.getDisplayType('LinearSNPCoverageDisplay')!.stateModel,\n ),\n /**\n * #property\n */\n snpCovHeight: 45,\n /**\n * #property\n */\n type: types.literal('LinearAlignmentsDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n heightPreConfig: types.maybe(types.number),\n /**\n * #property\n */\n userFeatureScreenDensity: types.maybe(types.number),\n /**\n * #property\n */\n lowerPanelType: 'LinearPileupDisplay',\n })\n}\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { ResizeHandle } from '@jbrowse/core/ui'\n\n// locals\nimport { LinearAlignmentsDisplayModel } from '../models/model'\n\nconst useStyles = makeStyles()({\n resizeHandle: {\n height: 5,\n position: 'absolute',\n zIndex: 2,\n },\n})\n\nconst AlignmentsDisplay = observer(function AlignmentsDisplay({\n model,\n}: {\n model: LinearAlignmentsDisplayModel\n}) {\n const { PileupDisplay, SNPCoverageDisplay } = model\n const { classes } = useStyles()\n if (!SNPCoverageDisplay) {\n return null\n }\n const top = SNPCoverageDisplay.height ?? 100\n return (\n <div\n data-testid={`display-${getConf(model, 'displayId')}`}\n style={{ position: 'relative' }}\n >\n <div data-testid=\"Blockset-snpcoverage\">\n <SNPCoverageDisplay.RenderingComponent model={SNPCoverageDisplay} />\n </div>\n <ResizeHandle\n onDrag={delta => {\n SNPCoverageDisplay.setHeight(SNPCoverageDisplay.height + delta)\n return delta\n }}\n className={classes.resizeHandle}\n style={{ top: top - 4 }}\n />\n\n <div\n data-testid=\"Blockset-pileup\"\n style={{\n position: 'absolute',\n top,\n }}\n >\n <PileupDisplay.RenderingComponent model={PileupDisplay} />\n </div>\n </div>\n )\n})\n\nexport default AlignmentsDisplay\n","import DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n// locals\nimport configSchemaFactory from './models/configSchema'\nimport modelFactory from './models/model'\nimport ReactComponent from './components/AlignmentsDisplay'\n\nexport default function LinearAlignmentsDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearAlignmentsDisplay',\n displayName: 'Alignments display (combination)',\n configSchema,\n stateModel: modelFactory(pluginManager, configSchema),\n trackType: 'AlignmentsTrack',\n viewType: 'LinearGenomeView',\n ReactComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearAlignmentsDisplay\n * has a \"pileup\" sub-display, where you can see individual reads and a\n * quantitative \"snpcoverage\" sub-display track showing SNP frequencies\n */\nexport default function configModelFactory(pm: PluginManager) {\n return ConfigurationSchema(\n 'LinearAlignmentsDisplay',\n {\n /**\n * #slot\n */\n pileupDisplay: pm.getDisplayType('LinearPileupDisplay')!.configSchema,\n\n /**\n * #slot\n */\n snpCoverageDisplay: pm.getDisplayType('LinearSNPCoverageDisplay')!\n .configSchema,\n\n /**\n * #slot\n */\n height: {\n type: 'number',\n defaultValue: 250,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import { lazy } from 'react'\nimport { types, cast, getEnv, getSnapshot, isAlive } from 'mobx-state-tree'\nimport { observable } from 'mobx'\n\n// jbrowse\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport {\n getConf,\n readConfObject,\n AnyConfigurationSchemaType,\n AnyConfigurationModel,\n} from '@jbrowse/core/configuration'\nimport { linearWiggleDisplayModelFactory } from '@jbrowse/plugin-wiggle'\nimport { getContainingView } from '@jbrowse/core/util'\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\n\n// locals\nimport { FilterModel, IFilter, getUniqueModificationValues } from '../../shared'\nimport { createAutorun, modificationColors } from '../../util'\nimport { randomColor } from '../../util'\n\n// lazies\nconst Tooltip = lazy(() => import('../components/Tooltip'))\n\n// using a map because it preserves order\nconst rendererTypes = new Map([['snpcoverage', 'SNPCoverageRenderer']])\n\ntype LGV = LinearGenomeViewModel\n\n/**\n * #stateModel LinearSNPCoverageDisplay\n * extends\n * - [LinearWiggleDisplay](../linearwiggledisplay)\n */\nfunction stateModelFactory(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'LinearSNPCoverageDisplay',\n linearWiggleDisplayModelFactory(pluginManager, configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearSNPCoverageDisplay'),\n /**\n * #property\n */\n drawInterbaseCounts: types.maybe(types.boolean),\n /**\n * #property\n */\n drawIndicators: types.maybe(types.boolean),\n /**\n * #property\n */\n drawArcs: types.maybe(types.boolean),\n /**\n * #property\n */\n filterBy: types.optional(FilterModel, {}),\n /**\n * #property\n */\n colorBy: types.maybe(\n types.model({\n type: types.string,\n tag: types.maybe(types.string),\n }),\n ),\n /**\n * #property\n */\n jexlFilters: types.optional(types.array(types.string), []),\n }),\n )\n .volatile(() => ({\n modificationTagMap: observable.map<string, string>({}),\n modificationsReady: false,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setConfig(configuration: AnyConfigurationModel) {\n self.configuration = configuration\n },\n /**\n * #action\n */\n setFilterBy(filter: IFilter) {\n self.filterBy = cast(filter)\n },\n /**\n * #action\n */\n setColorBy(colorBy?: { type: string; tag?: string }) {\n self.colorBy = cast(colorBy)\n },\n /**\n * #action\n */\n setJexlFilters(filters: string[]) {\n self.jexlFilters = cast(filters)\n },\n\n /**\n * #action\n */\n updateModificationColorMap(uniqueModifications: string[]) {\n uniqueModifications.forEach(value => {\n if (!self.modificationTagMap.has(value)) {\n self.modificationTagMap.set(\n value,\n modificationColors[value] || randomColor(),\n )\n }\n })\n },\n }))\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #getter\n */\n get rendererConfig() {\n const configBlob =\n getConf(self, ['renderers', self.rendererTypeName]) || {}\n\n return self.rendererType.configSchema.create(\n {\n ...configBlob,\n drawInterbaseCounts:\n self.drawInterbaseCounts ?? configBlob.drawInterbaseCounts,\n drawIndicators: self.drawIndicators ?? configBlob.drawIndicators,\n drawArcs: self.drawArcs ?? configBlob.drawArcs,\n },\n getEnv(self),\n )\n },\n /**\n * #getter\n */\n get drawArcsSetting() {\n return (\n self.drawArcs ?? readConfObject(this.rendererConfig, 'drawArcs')\n )\n },\n /**\n * #getter\n */\n get drawInterbaseCountsSetting() {\n return (\n self.drawInterbaseCounts ??\n readConfObject(this.rendererConfig, 'drawInterbaseCounts')\n )\n },\n /**\n * #getter\n */\n get drawIndicatorsSetting() {\n return (\n self.drawIndicators ??\n readConfObject(this.rendererConfig, 'drawIndicators')\n )\n },\n\n /**\n * #getter\n */\n get autorunReady() {\n const view = getContainingView(self) as LGV\n return (\n view.initialized &&\n self.featureDensityStatsReady &&\n !self.regionTooLarge &&\n !self.error\n )\n },\n\n get renderReady() {\n const superProps = superRenderProps()\n return !superProps.notReady && self.modificationsReady\n },\n\n get ready() {\n return this.renderReady\n },\n\n /**\n * #method\n */\n renderProps() {\n const superProps = superRenderProps()\n const { colorBy, filterBy, modificationTagMap } = self\n return {\n ...superProps,\n notReady: !this.ready,\n filters: self.filters,\n modificationTagMap: Object.fromEntries(modificationTagMap.toJSON()),\n\n // must use getSnapshot because otherwise changes to e.g. just the\n // colorBy.type are not read\n colorBy: colorBy ? getSnapshot(colorBy) : undefined,\n filterBy: getSnapshot(filterBy),\n }\n },\n }\n })\n .actions(self => ({\n /**\n * #action\n */\n setModificationsReady(flag: boolean) {\n self.modificationsReady = flag\n },\n /**\n * #action\n */\n toggleDrawIndicators() {\n self.drawIndicators = !self.drawIndicatorsSetting\n },\n /**\n * #action\n */\n toggleDrawInterbaseCounts() {\n self.drawInterbaseCounts = !self.drawInterbaseCountsSetting\n },\n /**\n * #action\n */\n toggleDrawArcs() {\n self.drawArcs = !self.drawArcsSetting\n },\n }))\n .actions(self => ({\n afterAttach() {\n createAutorun(\n self,\n async () => {\n self.setModificationsReady(false)\n if (!self.autorunReady) {\n return\n }\n const view = getContainingView(self) as LGV\n const { staticBlocks } = view\n const { colorBy } = self\n if (colorBy?.type === 'modifications') {\n const adapter = getConf(self.parentTrack, 'adapter')\n const vals = await getUniqueModificationValues({\n self,\n adapterConfig: adapter,\n blocks: staticBlocks,\n })\n if (isAlive(self)) {\n self.updateModificationColorMap(vals)\n self.setModificationsReady(true)\n }\n } else {\n self.setModificationsReady(true)\n }\n },\n { delay: 1000 },\n )\n },\n }))\n\n .views(self => {\n const { trackMenuItems: superTrackMenuItems } = self\n return {\n /**\n * #getter\n */\n get TooltipComponent() {\n return Tooltip\n },\n\n /**\n * #getter\n */\n get adapterConfig() {\n const subadapter = getConf(self.parentTrack, 'adapter')\n return {\n type: 'SNPCoverageAdapter',\n subadapter,\n }\n },\n\n /**\n * #getter\n */\n get rendererTypeName() {\n return rendererTypes.get('snpcoverage')\n },\n\n /**\n * #getter\n */\n get needsScalebar() {\n return true\n },\n\n /**\n * #method\n */\n contextMenuItems() {\n return []\n },\n\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Draw insertion/clipping indicators',\n type: 'checkbox',\n checked: self.drawIndicatorsSetting,\n onClick: () => {\n self.toggleDrawIndicators()\n },\n },\n {\n label: 'Draw insertion/clipping counts',\n type: 'checkbox',\n checked: self.drawInterbaseCountsSetting,\n onClick: () => {\n self.toggleDrawInterbaseCounts()\n },\n },\n {\n label: 'Draw arcs',\n type: 'checkbox',\n checked: self.drawArcsSetting,\n onClick: () => {\n self.toggleDrawArcs()\n },\n },\n ]\n },\n\n /**\n * #getter\n */\n get filters() {\n return new SerializableFilterChain({ filters: self.jexlFilters })\n },\n }\n })\n}\n\nexport type SNPCoverageDisplayModel = ReturnType<typeof stateModelFactory>\n\nexport default stateModelFactory\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaFactory from './models/configSchema'\nimport modelFactory from './models/model'\nimport { LinearWiggleDisplayReactComponent } from '@jbrowse/plugin-wiggle'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearSNPCoverageDisplay',\n displayName: 'SNPCoverage display',\n configSchema,\n stateModel: modelFactory(pluginManager, configSchema),\n trackType: 'AlignmentsTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: LinearWiggleDisplayReactComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearSNPCoverageDisplay\n *\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default function SNPCoverageConfigFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearSNPCoverageDisplay',\n {\n /**\n * #slot\n */\n autoscale: {\n type: 'stringEnum',\n defaultValue: 'local',\n model: types.enumeration('Autoscale type', ['local']),\n description:\n 'performs local autoscaling (no other options for SNP Coverage available)',\n },\n /**\n * #slot\n */\n minScore: {\n type: 'number',\n defaultValue: Number.MIN_VALUE,\n description: 'minimum value for the y-scale',\n },\n /**\n * #slot\n */\n maxScore: {\n type: 'number',\n description: 'maximum value for the y-scale',\n defaultValue: Number.MAX_VALUE,\n },\n /**\n * #slot\n */\n scaleType: {\n type: 'stringEnum',\n model: types.enumeration('Scale type', ['linear', 'log']), // todo zscale\n description: 'The type of scale to use',\n defaultValue: 'linear',\n },\n /**\n * #slot\n */ inverted: {\n type: 'boolean',\n description: 'draw upside down',\n defaultValue: false,\n },\n /**\n * #slot\n */\n multiTicks: {\n type: 'boolean',\n description: 'Display multiple values for the ticks',\n defaultValue: false,\n },\n /**\n * #slot\n */\n renderers: ConfigurationSchema('RenderersConfiguration', {\n SNPCoverageRenderer: pluginManager.getRendererType(\n 'SNPCoverageRenderer',\n )!.configSchema,\n }),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import React, { lazy } from 'react'\nimport { cast, types, Instance } from 'mobx-state-tree'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes'\nimport {\n FeatureDensityMixin,\n TrackHeightMixin,\n} from '@jbrowse/plugin-linear-genome-view'\n\n// icons\nimport PaletteIcon from '@mui/icons-material/Palette'\nimport FilterListIcon from '@mui/icons-material/ClearAll'\n\n// locals\nimport { FilterModel, IFilter } from '../shared'\nimport { ChainData } from '../shared/fetchChains'\n\n// async\nconst FilterByTagDialog = lazy(() => import('../shared/FilterByTagDialog'))\n\n/**\n * #stateModel LinearReadArcsDisplay\n * the arc display is a non-block-based track, so draws to a single canvas and\n * can connect multiple regions\n * extends\n * - [BaseDisplay](../basedisplay)\n * - [TrackHeightMixin](../trackheightmixin)\n * - [FeatureDensityMixin](../featuredensitymixin)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearReadArcsDisplay',\n BaseDisplay,\n TrackHeightMixin(),\n FeatureDensityMixin(),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearReadArcsDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n\n /**\n * #property\n */\n filterBy: types.optional(FilterModel, {}),\n\n /**\n * #property\n */\n lineWidth: types.maybe(types.number),\n\n /**\n * #property\n */\n jitter: types.maybe(types.number),\n\n /**\n * #property\n */\n colorBy: types.maybe(\n types.model({\n type: types.string,\n tag: types.maybe(types.string),\n extra: types.frozen(),\n }),\n ),\n\n /**\n * #property\n */\n drawInter: true,\n\n /**\n * #property\n */\n drawLongRange: true,\n }),\n )\n .volatile(() => ({\n loading: false,\n chainData: undefined as ChainData | undefined,\n lastDrawnOffsetPx: undefined as number | undefined,\n lastDrawnBpPerPx: 0,\n ref: null as HTMLCanvasElement | null,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setLastDrawnOffsetPx(n: number) {\n self.lastDrawnOffsetPx = n\n },\n /**\n * #action\n */\n setLastDrawnBpPerPx(n: number) {\n self.lastDrawnBpPerPx = n\n },\n /**\n * #action\n */\n setLoading(f: boolean) {\n self.loading = f\n },\n\n /**\n * #action\n */\n reload() {\n self.error = undefined\n },\n /**\n * #action\n * internal, a reference to a HTMLCanvas because we use a autorun to draw\n * the canvas\n */\n setRef(ref: HTMLCanvasElement | null) {\n self.ref = ref\n },\n\n /**\n * #action\n */\n setColorScheme(s: { type: string }) {\n self.colorBy = cast(s)\n },\n\n /**\n * #action\n */\n setChainData(args: ChainData) {\n self.chainData = args\n },\n\n /**\n * #action\n */\n setDrawInter(f: boolean) {\n self.drawInter = f\n },\n\n /**\n * #action\n */\n setDrawLongRange(f: boolean) {\n self.drawLongRange = f\n },\n\n /**\n * #action\n */\n setFilterBy(filter: IFilter) {\n self.filterBy = cast(filter)\n },\n\n /**\n * #action\n * thin, bold, extrabold, etc\n */\n setLineWidth(n: number) {\n self.lineWidth = n\n },\n\n /**\n * #action\n * jitter val, helpful to jitter the x direction so you see better\n * evidence when e.g. 100 long reads map to same x position\n */\n setJitter(n: number) {\n self.jitter = n\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get drawn() {\n return self.lastDrawnOffsetPx !== undefined\n },\n /**\n * #getter\n */\n get lineWidthSetting() {\n return self.lineWidth ?? getConf(self, 'lineWidth')\n },\n\n /**\n * #getter\n */\n get jitterVal(): number {\n return self.jitter ?? getConf(self, 'jitter')\n },\n }))\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderProps: superRenderProps,\n } = self\n return {\n /**\n * #method\n * only used to tell system it's ready for export\n */\n renderProps() {\n return {\n ...superRenderProps(),\n notReady: !self.chainData,\n }\n },\n\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Filter by',\n icon: FilterListIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n FilterByTagDialog,\n { model: self, handleClose },\n ])\n },\n },\n {\n label: 'Line width',\n subMenu: [\n {\n label: 'Thin',\n onClick: () => {\n self.setLineWidth(1)\n },\n },\n {\n label: 'Bold',\n onClick: () => {\n self.setLineWidth(2)\n },\n },\n {\n label: 'Extra bold',\n onClick: () => {\n self.setLineWidth(5)\n },\n },\n ],\n },\n {\n label: 'Jitter x-positions',\n subMenu: [\n {\n type: 'checkbox',\n checked: self.jitterVal === 0,\n label: 'None',\n onClick: () => {\n self.setJitter(0)\n },\n },\n {\n type: 'checkbox',\n checked: self.jitterVal === 2,\n label: 'Small',\n onClick: () => {\n self.setJitter(2)\n },\n },\n {\n type: 'checkbox',\n checked: self.jitterVal === 10,\n label: 'Large',\n onClick: () => {\n self.setJitter(10)\n },\n },\n ],\n },\n {\n label: 'Draw inter-region vertical lines',\n type: 'checkbox',\n checked: self.drawInter,\n onClick: () => {\n self.setDrawInter(!self.drawInter)\n },\n },\n {\n label: 'Draw long range connections',\n type: 'checkbox',\n checked: self.drawLongRange,\n onClick: () => {\n self.setDrawLongRange(!self.drawLongRange)\n },\n },\n {\n label: 'Color scheme',\n icon: PaletteIcon,\n subMenu: [\n {\n label: 'Insert size ± 3σ and orientation',\n onClick: () => {\n self.setColorScheme({ type: 'insertSizeAndOrientation' })\n },\n },\n {\n label: 'Insert size ± 3σ',\n onClick: () => {\n self.setColorScheme({ type: 'insertSize' })\n },\n },\n {\n label: 'Orientation',\n onClick: () => {\n self.setColorScheme({ type: 'orientation' })\n },\n },\n {\n label: 'Insert size gradient',\n onClick: () => {\n self.setColorScheme({ type: 'gradient' })\n },\n },\n ],\n },\n ]\n },\n }\n })\n .views(self => ({\n /**\n * #method\n */\n async renderSvg(opts: {\n rasterizeLayers?: boolean\n }): Promise<React.ReactNode> {\n const { renderSvg } = await import('../shared/renderSvg')\n const { drawFeats } = await import('./drawFeats')\n return renderSvg(self as LinearReadArcsDisplayModel, opts, drawFeats)\n },\n }))\n .actions(self => ({\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n const { doAfterAttach } = await import('../shared/afterAttach')\n const { drawFeats } = await import('./drawFeats')\n doAfterAttach(self, drawFeats)\n } catch (e) {\n console.error(e)\n self.setError(e)\n }\n })()\n },\n }))\n}\n\nexport type LinearReadArcsDisplayStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearReadArcsDisplayModel =\n Instance<LinearReadArcsDisplayStateModel>\n\nexport default stateModelFactory\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\n// locals\nimport configSchemaF from './configSchema'\nimport stateModelF from './model'\nimport { lazy } from 'react'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new DisplayType({\n name: 'LinearReadArcsDisplay',\n displayName: 'Arc display',\n configSchema,\n stateModel: stateModelF(configSchema),\n trackType: 'AlignmentsTrack',\n viewType: 'LinearGenomeView',\n subDisplay: { type: 'LinearAlignmentsDisplay', lowerPanel: true },\n ReactComponent: lazy(() => import('./components/ReactComponent')),\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config LinearReadArcsDisplay\n */\nfunction configSchemaF(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearReadArcsDisplay',\n {\n /**\n * #slot\n */\n maxFeatureScreenDensity: {\n type: 'number',\n description: 'maximum features per pixel that is displayed in the view',\n defaultValue: 5,\n },\n\n /**\n * #slot\n */\n lineWidth: {\n type: 'number',\n description: 'set arc line width',\n defaultValue: 1,\n },\n\n /**\n * #slot\n */\n jitter: {\n type: 'number',\n description:\n 'jitters the x position so e.g. if many reads map to exact same x position, jittering makes it easy to see that there are many of them',\n defaultValue: 0,\n },\n\n /**\n * #slot\n */\n colorScheme: {\n type: 'stringEnum',\n model: types.enumeration('colorScheme', [\n 'strand',\n 'normal',\n 'insertSize',\n 'insertSizeAndOrientation',\n 'mappingQuality',\n 'tag',\n ]),\n description: 'color scheme to use',\n defaultValue: 'normal',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: linearBasicDisplayConfigSchemaFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaF\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config LinearReadCloudDisplay\n */\nfunction configSchemaF(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearReadCloudDisplay',\n {\n /**\n * #slot\n */\n maxFeatureScreenDensity: {\n type: 'number',\n description: 'maximum features per pixel that is displayed in the view',\n defaultValue: 5,\n },\n\n /**\n * #slot\n */\n featureHeight: {\n type: 'number',\n defaultValue: 7,\n },\n\n /**\n * #slot\n */\n colorScheme: {\n type: 'stringEnum',\n model: types.enumeration('colorScheme', [\n 'strand',\n 'normal',\n 'insertSize',\n 'insertSizeAndOrientation',\n 'mappingQuality',\n 'tag',\n ]),\n description: 'color scheme to use',\n defaultValue: 'normal',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: linearBasicDisplayConfigSchemaFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaF\n","import React, { lazy } from 'react'\nimport { cast, types, Instance } from 'mobx-state-tree'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport {\n FeatureDensityMixin,\n TrackHeightMixin,\n} from '@jbrowse/plugin-linear-genome-view'\n\n// icons\nimport PaletteIcon from '@mui/icons-material/Palette'\nimport FilterListIcon from '@mui/icons-material/ClearAll'\n\n// locals\nimport { FilterModel, IFilter } from '../shared'\nimport { ChainData } from '../shared/fetchChains'\n\n// async\nconst FilterByTagDialog = lazy(() => import('../shared/FilterByTagDialog'))\n\n/**\n * #stateModel LinearReadCloudDisplay\n * it is not a block based track, hence not BaseLinearDisplay\n * extends\n * - [BaseDisplay](../basedisplay)\n * - [TrackHeightMixin](../trackheightmixin)\n * - [FeatureDensityMixin](../featuredensitymixin)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearReadCloudDisplay',\n BaseDisplay,\n TrackHeightMixin(),\n FeatureDensityMixin(),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearReadCloudDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n\n /**\n * #property\n */\n filterBy: types.optional(FilterModel, {}),\n\n /**\n * #property\n */\n colorBy: types.maybe(\n types.model({\n type: types.string,\n tag: types.maybe(types.string),\n extra: types.frozen(),\n }),\n ),\n\n /**\n * #property\n */\n drawSingletons: true,\n }),\n )\n .volatile(() => ({\n loading: false,\n chainData: undefined as ChainData | undefined,\n lastDrawnOffsetPx: undefined as number | undefined,\n lastDrawnBpPerPx: 0,\n ref: null as HTMLCanvasElement | null,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setDrawSingletons(f: boolean) {\n self.drawSingletons = f\n },\n /**\n * #action\n */\n setLastDrawnOffsetPx(n: number) {\n self.lastDrawnOffsetPx = n\n },\n /**\n * #action\n */\n setLastDrawnBpPerPx(n: number) {\n self.lastDrawnBpPerPx = n\n },\n\n /**\n * #action\n */\n setLoading(f: boolean) {\n self.loading = f\n },\n /**\n * #action\n */\n reload() {\n self.error = undefined\n },\n /**\n * #action\n * internal, a reference to a HTMLCanvas because we use a autorun to draw\n * the canvas\n */\n setRef(ref: HTMLCanvasElement | null) {\n self.ref = ref\n },\n\n setColorScheme(s: { type: string }) {\n self.colorBy = cast(s)\n },\n\n /**\n * #action\n */\n setChainData(args: ChainData) {\n self.chainData = args\n },\n\n /**\n * #action\n */\n setFilterBy(filter: IFilter) {\n self.filterBy = cast(filter)\n },\n }))\n .views(self => ({\n get drawn() {\n return self.lastDrawnOffsetPx !== undefined\n },\n }))\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderProps: superRenderProps,\n } = self\n\n return {\n // we don't use a server side renderer, so this fills in minimal\n // info so as not to crash\n renderProps() {\n return {\n ...superRenderProps(),\n notReady: !self.chainData,\n }\n },\n\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Draw singletons',\n type: 'checkbox',\n checked: self.drawSingletons,\n onClick: () => {\n self.setDrawSingletons(!self.drawSingletons)\n },\n },\n {\n label: 'Filter by',\n icon: FilterListIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n FilterByTagDialog,\n { model: self, handleClose },\n ])\n },\n },\n\n {\n label: 'Color scheme',\n icon: PaletteIcon,\n subMenu: [\n {\n label: 'Insert size ± 3σ and orientation',\n onClick: () => {\n self.setColorScheme({ type: 'insertSizeAndOrientation' })\n },\n },\n {\n label: 'Insert size ± 3σ',\n onClick: () => {\n self.setColorScheme({ type: 'insertSize' })\n },\n },\n {\n label: 'Orientation',\n onClick: () => {\n self.setColorScheme({ type: 'orientation' })\n },\n },\n {\n label: 'Insert size gradient',\n onClick: () => {\n self.setColorScheme({ type: 'gradient' })\n },\n },\n ],\n },\n ]\n },\n\n /**\n * #method\n */\n async renderSvg(opts: {\n rasterizeLayers?: boolean\n }): Promise<React.ReactNode> {\n const { renderSvg } = await import('../shared/renderSvg')\n const { drawFeats } = await import('./drawFeats')\n return renderSvg(self as LinearReadCloudDisplayModel, opts, drawFeats)\n },\n }\n })\n .actions(self => ({\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n const { doAfterAttach } = await import('../shared/afterAttach')\n const { drawFeats } = await import('./drawFeats')\n doAfterAttach(self, drawFeats)\n } catch (e) {\n console.error(e)\n self.setError(e)\n }\n })()\n },\n }))\n}\n\nexport type LinearReadCloudDisplayStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearReadCloudDisplayModel =\n Instance<LinearReadCloudDisplayStateModel>\n\nexport default stateModelFactory\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\n// locals\nimport configSchemaF from './configSchema'\nimport stateModelF from './model'\nimport { lazy } from 'react'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new DisplayType({\n name: 'LinearReadCloudDisplay',\n displayName: 'Read cloud display',\n configSchema,\n stateModel: stateModelF(configSchema),\n trackType: 'AlignmentsTrack',\n viewType: 'LinearGenomeView',\n subDisplay: { type: 'LinearAlignmentsDisplay', lowerPanel: true },\n ReactComponent: lazy(() => import('./components/ReactComponent')),\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport configSchemaF from './configSchemaF'\n\nexport default function register(pm: PluginManager) {\n pm.addTrackType(() => {\n const configSchema = configSchemaF(pm)\n const track = new TrackType({\n name: 'AlignmentsTrack',\n displayName: 'Alignments track',\n configSchema,\n stateModel: createBaseTrackModel(pm, 'AlignmentsTrack', configSchema),\n })\n const linearAlignmentsDisplay = pm.getDisplayType(\n 'LinearAlignmentsDisplay',\n )!\n // Add LinearAlignmentsDisplay here so that it has priority over the other\n // linear displays (defaults to order the displays are added, but we have\n // to add the Pileup and SNPCoverage displays first).\n track.addDisplayType(linearAlignmentsDisplay)\n return track\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config AlignmentsTrack\n * has very little config; most config and state logic is on the display\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default function configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'AlignmentsTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nexport const configSchema = ConfigurationSchema('AlignmentsFeatureWidget', {})\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { Instance, types } from 'mobx-state-tree'\nimport { stateModelFactory as baseModelFactory } from '@jbrowse/core/BaseFeatureWidget'\n\nexport function stateModelFactory(pluginManager: PluginManager) {\n const baseModel = baseModelFactory(pluginManager)\n return types.compose(\n baseModel,\n types.model('AlignmentsFeatureWidget', {\n type: types.literal('AlignmentsFeatureWidget'),\n }),\n )\n}\n\nexport type AlignmentFeatureWidgetStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type AlignmentFeatureWidgetModel =\n Instance<AlignmentFeatureWidgetStateModel>\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport WidgetType from '@jbrowse/core/pluggableElementTypes/WidgetType'\nimport { configSchema } from './configSchema'\nimport { stateModelFactory } from './stateModelFactory'\n\nexport default function AlignmentFeatureDetailsF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(\n () =>\n new WidgetType({\n name: 'AlignmentsFeatureWidget',\n heading: 'Feature details',\n configSchema: configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./AlignmentsFeatureDetail')),\n }),\n )\n}\n","import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'\nimport { renameRegionsIfNeeded } from '@jbrowse/core/util'\nimport { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'\n\n// specialized get features to return limited data about alignments\nexport default abstract class PileupBaseRPC extends RpcMethodType {\n async serializeArguments(\n args: RenderArgs & {\n signal?: AbortSignal\n statusCallback?: (arg: string) => void\n },\n rpcDriver: string,\n ) {\n const { rootModel } = this.pluginManager\n const assemblyManager = rootModel?.session?.assemblyManager\n if (!assemblyManager) {\n throw new Error('no assembly manager available')\n }\n\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, args)\n\n return super.serializeArguments(renamedArgs, rpcDriver)\n }\n}\n","import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { Region, dedupe, groupBy } from '@jbrowse/core/util'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\n// locals\nimport { filterForPairs, getInsertSizeStats } from '../util'\nimport PileupBaseRPC from '../base'\nimport { getTag } from '../../util'\n\n// specialized get features to return limited data about alignments\nexport default class PileupGetReducedFeatures extends PileupBaseRPC {\n name = 'PileupGetReducedFeatures'\n\n async execute(\n args: {\n adapterConfig: Record<string, unknown>\n signal?: RemoteAbortSignal\n headers?: Record<string, string>\n regions: Region[]\n sessionId: string\n tag: string\n },\n rpcDriver: string,\n ) {\n const des = await this.deserializeArguments(args, rpcDriver)\n const { adapterConfig, sessionId, regions } = des\n const dataAdapter = (\n await getAdapter(this.pluginManager, sessionId, adapterConfig)\n ).dataAdapter as BaseFeatureDataAdapter\n\n const featuresArray = await firstValueFrom(\n dataAdapter.getFeaturesInMultipleRegions(regions, des).pipe(toArray()),\n )\n\n const reduced = dedupe(\n featuresArray.map(f => ({\n id: f.id(),\n refName: f.get('refName'),\n name: f.get('name'),\n start: f.get('start'),\n strand: f.get('strand'),\n end: f.get('end'),\n flags: f.get('flags'),\n tlen: f.get('template_length'),\n pair_orientation: f.get('pair_orientation'),\n next_ref: f.get('next_ref'),\n next_pos: f.get('next_pos'),\n clipPos: f.get('clipPos'),\n SA: getTag(f, 'SA'),\n })),\n f => f.id,\n )\n\n const filtered = filterForPairs(reduced)\n const stats = filtered.length ? getInsertSizeStats(filtered) : undefined\n const chains = groupBy(reduced, f => f.name)\n\n return {\n chains: Object.values(chains),\n stats,\n hasPaired: !!stats,\n containsNoTransferables: true,\n }\n }\n}\n","import { ReducedFeature } from '../shared/fetchChains'\n\nexport function getInsertSizeStats(features: ReducedFeature[]) {\n const filtered = features.map(f => Math.abs(f.tlen))\n const sum = filtered.reduce((a, b) => a + b, 0)\n const sum2 = filtered.map(a => a * a).reduce((a, b) => a + b, 0)\n const total = filtered.length\n const avg = sum / total\n const sd = Math.sqrt((total * sum2 - sum * sum) / (total * total))\n const upper = avg + 4 * sd\n const lower = avg - 3 * sd\n return { upper, lower, avg, sd }\n}\n\nexport function filterForPairs(features: ReducedFeature[]) {\n return features.filter(\n f => f.flags & 2 && !(f.flags & 256) && !(f.flags & 2048),\n )\n}\n","import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { Region } from '@jbrowse/core/util'\nimport { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\n\n// locals\nimport { getModificationTypes } from '../../MismatchParser'\nimport PileupBaseRPC from '../base'\nimport { getTagAlt } from '../../util'\n\nexport default class PileupGetVisibleModifications extends PileupBaseRPC {\n name = 'PileupGetVisibleModifications'\n\n async execute(\n args: {\n adapterConfig: Record<string, unknown>\n signal?: RemoteAbortSignal\n headers?: Record<string, string>\n regions: Region[]\n sessionId: string\n tag: string\n },\n rpcDriver: string,\n ) {\n const { adapterConfig, sessionId, regions } =\n await this.deserializeArguments(args, rpcDriver)\n const dataAdapter = (\n await getAdapter(this.pluginManager, sessionId, adapterConfig)\n ).dataAdapter as BaseFeatureDataAdapter\n\n const featuresArray = await firstValueFrom(\n dataAdapter.getFeaturesInMultipleRegions(regions).pipe(toArray()),\n )\n\n const uniqueValues = new Set<string>()\n featuresArray.forEach(f => {\n getModificationTypes(getTagAlt(f, 'MM', 'Mm') || '').forEach(t =>\n uniqueValues.add(t),\n )\n })\n return [...uniqueValues]\n }\n}\n","import { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { Region } from '@jbrowse/core/util'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\n\n// locals\nimport PileupBaseRPC from '../base'\nimport { getTag } from '../../util'\n\nexport default class PileupGetGlobalValueForTag extends PileupBaseRPC {\n name = 'PileupGetGlobalValueForTag'\n\n async execute(\n args: {\n adapterConfig: Record<string, unknown>\n signal?: RemoteAbortSignal\n headers?: Record<string, string>\n regions: Region[]\n sessionId: string\n tag: string\n },\n rpcDriver: string,\n ) {\n const { adapterConfig, sessionId, regions, tag } =\n await this.deserializeArguments(args, rpcDriver)\n\n const dataAdapter = (\n await getAdapter(this.pluginManager, sessionId, adapterConfig)\n ).dataAdapter as BaseFeatureDataAdapter\n\n const features = dataAdapter.getFeaturesInMultipleRegions(regions)\n const featuresArray = await firstValueFrom(features.pipe(toArray()))\n return [\n ...new Set(\n featuresArray\n .map(feature => getTag(feature, tag))\n .filter(f => f !== undefined)\n .map(f => `${f}`),\n ),\n ]\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport {\n PileupGetGlobalValueForTag,\n PileupGetVisibleModifications,\n PileupGetReducedFeatures,\n} from './rpcMethods'\n\nexport default function PileupRPCMethodsF(pm: PluginManager) {\n pm.addRpcMethod(() => new PileupGetGlobalValueForTag(pm))\n pm.addRpcMethod(() => new PileupGetVisibleModifications(pm))\n pm.addRpcMethod(() => new PileupGetReducedFeatures(pm))\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n makeIndex,\n makeIndexType,\n getFileName,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default function GuessAlignmentsTypesF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.cram$/i\n const adapterName = 'CramAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n cramLocation: file,\n craiLocation: index || makeIndex(file, '.crai'),\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.bam$/i\n const adapterName = 'BamAdapter'\n const fileName = getFileName(file)\n const indexName = index && getFileName(index)\n\n const obj = {\n type: adapterName,\n bamLocation: file,\n index: {\n location: index || makeIndex(file, '.bai'),\n indexType: makeIndexType(indexName, 'CSI', 'BAI'),\n },\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'BamAdapter' || adapterName === 'CramAdapter') {\n return 'AlignmentsTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearPileupDisplay\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nfunction configSchemaF(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearPileupDisplay',\n {\n /**\n * #slot\n */\n defaultRendering: {\n type: 'stringEnum',\n model: types.enumeration('Rendering', ['pileup']),\n defaultValue: 'pileup',\n },\n /**\n * #slot\n */\n renderers: ConfigurationSchema('RenderersConfiguration', {\n PileupRenderer:\n pluginManager.getRendererType('PileupRenderer')!.configSchema,\n }),\n /**\n * #slot\n */\n maxFeatureScreenDensity: {\n type: 'number',\n description: 'maximum features per pixel that is displayed in the view',\n defaultValue: 5,\n },\n\n /**\n * #slot\n */\n colorScheme: {\n type: 'stringEnum',\n model: types.enumeration('colorScheme', [\n 'strand',\n 'normal',\n 'insertSize',\n 'insertSizeAndOrientation',\n 'mappingQuality',\n 'tag',\n ]),\n description: 'color scheme to use',\n defaultValue: 'normal',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: linearBasicDisplayConfigSchemaFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaF\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { Typography } from '@mui/material'\n\nconst LinearPileupDisplayBlurb = observer(function ({\n model,\n}: {\n model: {\n sortedBy?: {\n pos: number\n refName: number\n type: string\n tag?: string\n }\n }\n}) {\n const { sortedBy } = model\n return sortedBy ? (\n <div data-testid={`blurb-${sortedBy}`}>\n <Typography color=\"secondary\" variant=\"caption\">\n {`Sorted by ${sortedBy.tag ?? sortedBy.type} at ${\n sortedBy.refName\n }:${sortedBy.pos}`}\n </Typography>\n </div>\n ) : null\n})\n\nexport default LinearPileupDisplayBlurb\n","import { lazy } from 'react'\nimport { autorun, observable } from 'mobx'\nimport { cast, types, addDisposer, getSnapshot } from 'mobx-state-tree'\nimport copy from 'copy-to-clipboard'\nimport {\n AnyConfigurationModel,\n AnyConfigurationSchemaType,\n ConfigurationReference,\n readConfObject,\n getConf,\n} from '@jbrowse/core/configuration'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport {\n getEnv,\n getSession,\n isSessionModelWithWidgets,\n getContainingView,\n SimpleFeature,\n SimpleFeatureSerialized,\n Feature,\n getContainingTrack,\n} from '@jbrowse/core/util'\n\nimport {\n LinearGenomeViewModel,\n BaseLinearDisplay,\n} from '@jbrowse/plugin-linear-genome-view'\n\n// icons\nimport { ContentCopy as ContentCopyIcon } from '@jbrowse/core/ui/Icons'\nimport MenuOpenIcon from '@mui/icons-material/MenuOpen'\nimport FilterListIcon from '@mui/icons-material/ClearAll'\n\n// locals\nimport LinearPileupDisplayBlurb from './components/LinearPileupDisplayBlurb'\nimport { getUniqueTagValues, FilterModel, IFilter } from '../shared'\nimport { createAutorun } from '../util'\nimport { ColorByModel, ExtraColorBy } from '../shared/color'\n\n// lazies\nconst FilterByTagDialog = lazy(() => import('../shared/FilterByTagDialog'))\nconst ColorByTagDialog = lazy(() => import('./components/ColorByTagDialog'))\nconst SetFeatureHeightDialog = lazy(\n () => import('./components/SetFeatureHeightDialog'),\n)\nconst SetMaxHeightDialog = lazy(() => import('./components/SetMaxHeightDialog'))\n\n// using a map because it preserves order\nconst rendererTypes = new Map([\n ['pileup', 'PileupRenderer'],\n ['svg', 'SvgFeatureRenderer'],\n])\n\ntype LGV = LinearGenomeViewModel\n\n/**\n * #stateModel SharedLinearPileupDisplayMixin\n * #category display\n * extends `BaseLinearDisplay`\n */\nexport function SharedLinearPileupDisplayMixin(\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n featureHeight: types.maybe(types.number),\n /**\n * #property\n */\n noSpacing: types.maybe(types.boolean),\n /**\n * #property\n */\n fadeLikelihood: types.maybe(types.boolean),\n /**\n * #property\n */\n trackMaxHeight: types.maybe(types.number),\n /**\n * #property\n */\n colorBy: ColorByModel,\n /**\n * #property\n */\n filterBy: types.optional(FilterModel, {}),\n /**\n * #property\n */\n jexlFilters: types.optional(types.array(types.string), []),\n }),\n )\n .volatile(() => ({\n colorTagMap: observable.map<string, string>({}),\n featureUnderMouseVolatile: undefined as undefined | Feature,\n tagsReady: false,\n }))\n .views(self => ({\n get autorunReady() {\n const view = getContainingView(self) as LGV\n return (\n view.initialized &&\n self.featureDensityStatsReady &&\n !self.regionTooLarge\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setTagsReady(flag: boolean) {\n self.tagsReady = flag\n },\n\n /**\n * #action\n */\n setMaxHeight(n?: number) {\n self.trackMaxHeight = n\n },\n\n /**\n * #action\n */\n setFeatureHeight(n?: number) {\n self.featureHeight = n\n },\n\n /**\n * #action\n */\n setNoSpacing(flag?: boolean) {\n self.noSpacing = flag\n },\n\n /**\n * #action\n */\n setColorScheme(colorScheme: {\n type: string\n tag?: string\n extra?: ExtraColorBy\n }) {\n self.colorTagMap = observable.map({}) // clear existing mapping\n self.colorBy = cast(colorScheme)\n if (colorScheme.tag) {\n self.tagsReady = false\n }\n },\n\n /**\n * #action\n */\n updateColorTagMap(uniqueTag: string[]) {\n // pale color scheme\n // https://cran.r-project.org/web/packages/khroma/vignettes/tol.html\n // e.g. \"tol_light\"\n const colorPalette = [\n '#BBCCEE',\n 'pink',\n '#CCDDAA',\n '#EEEEBB',\n '#FFCCCC',\n 'lightblue',\n 'lightgreen',\n 'tan',\n '#CCEEFF',\n 'lightsalmon',\n ]\n\n uniqueTag.forEach(value => {\n if (!self.colorTagMap.has(value)) {\n const totalKeys = [...self.colorTagMap.keys()].length\n self.colorTagMap.set(value, colorPalette[totalKeys]!)\n }\n })\n },\n\n /**\n * #action\n */\n setFeatureUnderMouse(feat?: Feature) {\n self.featureUnderMouseVolatile = feat\n },\n\n /**\n * #action\n */\n selectFeature(feature: Feature) {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const featureWidget = session.addWidget(\n 'AlignmentsFeatureWidget',\n 'alignmentFeature',\n {\n featureData: feature.toJSON(),\n view: getContainingView(self),\n track: getContainingTrack(self),\n },\n )\n session.showWidget(featureWidget)\n }\n session.setSelection(feature)\n },\n\n /**\n * #action\n * uses copy-to-clipboard and generates notification\n */\n copyFeatureToClipboard(feature: Feature) {\n const { uniqueId, ...rest } = feature.toJSON()\n const session = getSession(self)\n copy(JSON.stringify(rest, null, 4))\n session.notify('Copied to clipboard', 'success')\n },\n\n /**\n * #action\n */\n setConfig(conf: AnyConfigurationModel) {\n self.configuration = conf\n },\n\n /**\n * #action\n */\n setFilterBy(filter: IFilter) {\n self.filterBy = cast(filter)\n },\n\n /**\n * #action\n */\n setJexlFilters(filters: string[]) {\n self.jexlFilters = cast(filters)\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get rendererConfig() {\n const { featureHeight, noSpacing, trackMaxHeight, rendererTypeName } =\n self\n const configBlob = getConf(self, ['renderers', rendererTypeName]) || {}\n return self.rendererType.configSchema.create(\n {\n ...configBlob,\n ...(featureHeight !== undefined ? { height: featureHeight } : {}),\n ...(noSpacing !== undefined ? { noSpacing } : {}),\n ...(trackMaxHeight !== undefined\n ? { maxHeight: trackMaxHeight }\n : {}),\n },\n getEnv(self),\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get maxHeight() {\n return readConfObject(self.rendererConfig, 'maxHeight')\n },\n\n /**\n * #getter\n */\n get featureHeightSetting() {\n return readConfObject(self.rendererConfig, 'height')\n },\n /**\n * #getter\n */\n get featureUnderMouse() {\n return self.featureUnderMouseVolatile\n },\n /**\n * #getter\n */\n renderReady() {\n return self.tagsReady\n },\n /**\n * #getter\n */\n get filters() {\n return new SerializableFilterChain({ filters: self.jexlFilters })\n },\n }))\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderProps: superRenderProps,\n } = self\n\n return {\n /**\n * #getter\n */\n get rendererTypeName() {\n const viewName = getConf(self, 'defaultRendering')\n const rendererType = rendererTypes.get(viewName)\n if (!rendererType) {\n throw new Error(`unknown alignments view name ${viewName}`)\n }\n return rendererType\n },\n\n /**\n * #method\n */\n contextMenuItems() {\n const feat = self.contextMenuFeature\n return feat\n ? [\n {\n label: 'Open feature details',\n icon: MenuOpenIcon,\n onClick: (): void => {\n self.clearFeatureSelection()\n self.selectFeature(feat)\n },\n },\n {\n label: 'Copy info to clipboard',\n icon: ContentCopyIcon,\n onClick: (): void => {\n self.copyFeatureToClipboard(feat)\n },\n },\n ]\n : []\n },\n\n /**\n * #getter\n */\n get DisplayBlurb() {\n return LinearPileupDisplayBlurb\n },\n /**\n * #method\n */\n renderPropsPre() {\n const { colorTagMap, colorBy, filterBy, rpcDriverName } = self\n\n const superProps = superRenderProps()\n return {\n ...superProps,\n notReady: superProps.notReady || !self.renderReady(),\n rpcDriverName,\n displayModel: self,\n colorBy: colorBy ? getSnapshot(colorBy) : undefined,\n filterBy: JSON.parse(JSON.stringify(filterBy)),\n filters: self.filters,\n colorTagMap: Object.fromEntries(colorTagMap.toJSON()),\n config: self.rendererConfig,\n async onFeatureClick(_: unknown, featureId?: string) {\n const session = getSession(self)\n const { rpcManager } = session\n try {\n const f = featureId || self.featureIdUnderMouse\n if (!f) {\n self.clearFeatureSelection()\n } else {\n const sessionId = getRpcSessionId(self)\n const { feature } = (await rpcManager.call(\n sessionId,\n 'CoreGetFeatureDetails',\n {\n featureId: f,\n sessionId,\n layoutId: getContainingView(self).id,\n rendererType: 'PileupRenderer',\n },\n )) as { feature: SimpleFeatureSerialized | undefined }\n\n if (feature) {\n self.selectFeature(new SimpleFeature(feature))\n }\n }\n } catch (e) {\n console.error(e)\n session.notify(`${e}`)\n }\n },\n\n onClick() {\n self.clearFeatureSelection()\n },\n // similar to click but opens a menu with further options\n async onFeatureContextMenu(_: unknown, featureId?: string) {\n const session = getSession(self)\n const { rpcManager } = session\n try {\n const f = featureId || self.featureIdUnderMouse\n if (!f) {\n self.clearFeatureSelection()\n } else {\n const sessionId = getRpcSessionId(self)\n const { feature } = (await rpcManager.call(\n sessionId,\n 'CoreGetFeatureDetails',\n {\n featureId: f,\n sessionId,\n layoutId: getContainingView(self).id,\n rendererType: 'PileupRenderer',\n },\n )) as { feature: SimpleFeatureSerialized | undefined }\n\n if (feature) {\n self.setContextMenuFeature(new SimpleFeature(feature))\n }\n }\n } catch (e) {\n console.error(e)\n session.notify(`${e}`)\n }\n },\n }\n },\n\n /**\n * #method\n */\n colorSchemeSubMenuItems() {\n return [\n {\n label: 'Normal',\n onClick: () => {\n self.setColorScheme({ type: 'normal' })\n },\n },\n {\n label: 'Mapping quality',\n onClick: () => {\n self.setColorScheme({ type: 'mappingQuality' })\n },\n },\n {\n label: 'Strand',\n onClick: () => {\n self.setColorScheme({ type: 'strand' })\n },\n },\n {\n label: 'Per-base quality',\n onClick: () => {\n self.setColorScheme({ type: 'perBaseQuality' })\n },\n },\n {\n label: 'Per-base lettering',\n onClick: () => {\n self.setColorScheme({ type: 'perBaseLettering' })\n },\n },\n {\n label: 'First-of-pair strand',\n onClick: () => {\n self.setColorScheme({ type: 'stranded' })\n },\n },\n {\n label: 'Color by tag...',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ColorByTagDialog,\n {\n model: self,\n handleClose,\n },\n ])\n },\n },\n ]\n },\n\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n\n {\n label: 'Set feature height...',\n priority: 1,\n subMenu: [\n {\n label: 'Normal',\n onClick: () => {\n self.setFeatureHeight(7)\n self.setNoSpacing(false)\n },\n },\n {\n label: 'Compact',\n onClick: () => {\n self.setFeatureHeight(2)\n self.setNoSpacing(true)\n },\n },\n {\n label: 'Manually set height',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetFeatureHeightDialog,\n {\n model: self,\n handleClose,\n },\n ])\n },\n },\n ],\n },\n {\n label: 'Set max height...',\n priority: -1,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetMaxHeightDialog,\n {\n model: self,\n handleClose,\n },\n ])\n },\n },\n {\n label: 'Filter by...',\n icon: FilterListIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n FilterByTagDialog,\n {\n model: self,\n handleClose,\n },\n ])\n },\n },\n ]\n },\n }\n })\n .views(self => ({\n renderProps() {\n return self.renderPropsPre()\n },\n }))\n .actions(self => ({\n afterAttach() {\n createAutorun(\n self,\n async () => {\n const view = getContainingView(self) as LGV\n if (!self.autorunReady) {\n return\n }\n\n const { colorBy, tagsReady } = self\n const { staticBlocks } = view\n if (colorBy?.tag && !tagsReady) {\n const vals = await getUniqueTagValues({\n self,\n tag: colorBy.tag,\n blocks: staticBlocks,\n })\n self.updateColorTagMap(vals)\n }\n self.setTagsReady(true)\n },\n { delay: 1000 },\n )\n\n // autorun synchronizes featureUnderMouse with featureIdUnderMouse\n // asynchronously. this is needed due to how we do not serialize all\n // features from the BAM/CRAM over the rpc\n addDisposer(\n self,\n autorun(async () => {\n const session = getSession(self)\n try {\n const featureId = self.featureIdUnderMouse\n if (self.featureUnderMouse?.id() !== featureId) {\n if (!featureId) {\n self.setFeatureUnderMouse(undefined)\n } else {\n const sessionId = getRpcSessionId(self)\n const view = getContainingView(self)\n const { feature } = (await session.rpcManager.call(\n sessionId,\n 'CoreGetFeatureDetails',\n {\n featureId,\n sessionId,\n layoutId: view.id,\n rendererType: 'PileupRenderer',\n },\n )) as { feature: SimpleFeatureSerialized | undefined }\n\n // check featureIdUnderMouse is still the same as the\n // feature.id that was returned e.g. that the user hasn't\n // moused over to a new position during the async operation\n // above\n if (\n feature &&\n self.featureIdUnderMouse === feature.uniqueId\n ) {\n self.setFeatureUnderMouse(new SimpleFeature(feature))\n }\n }\n }\n } catch (e) {\n console.error(e)\n session.notifyError(`${e}`, e)\n }\n }),\n )\n },\n }))\n}\n","import { lazy } from 'react'\nimport { types, Instance } from 'mobx-state-tree'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n readConfObject,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { getEnv, getSession, getContainingView } from '@jbrowse/core/util'\nimport { getUniqueModificationValues } from '../shared'\n\nimport { createAutorun, randomColor, modificationColors } from '../util'\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\n// icons\nimport VisibilityIcon from '@mui/icons-material/Visibility'\nimport SortIcon from '@mui/icons-material/Sort'\nimport WorkspacesIcon from '@mui/icons-material/Workspaces'\nimport ColorLensIcon from '@mui/icons-material/ColorLens'\n\n// locals\nimport { SharedLinearPileupDisplayMixin } from './SharedLinearPileupDisplayMixin'\nimport { observable } from 'mobx'\n\n// lazies\nconst SortByTagDialog = lazy(() => import('./components/SortByTagDialog'))\nconst GroupByDialog = lazy(() => import('./components/GroupByDialog'))\nconst ModificationsDialog = lazy(\n () => import('./components/ColorByModificationsDialog'),\n)\n\ntype LGV = LinearGenomeViewModel\n\n/**\n * #stateModel LinearPileupDisplay\n * #category display\n * extends\n * - [SharedLinearPileupDisplayMixin](../sharedlinearpileupdisplaymixin)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearPileupDisplay',\n SharedLinearPileupDisplayMixin(configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearPileupDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n showSoftClipping: false,\n /**\n * #property\n */\n mismatchAlpha: types.maybe(types.boolean),\n\n /**\n * #property\n */\n sortedBy: types.maybe(\n types.model({\n type: types.string,\n pos: types.number,\n tag: types.maybe(types.string),\n refName: types.string,\n assemblyName: types.string,\n }),\n ),\n }),\n )\n .volatile(() => ({\n sortReady: false,\n currSortBpPerPx: 0,\n modificationTagMap: observable.map<string, string>({}),\n modificationsReady: false,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setCurrSortBpPerPx(n: number) {\n self.currSortBpPerPx = n\n },\n /**\n * #action\n */\n updateModificationColorMap(uniqueModifications: string[]) {\n uniqueModifications.forEach(value => {\n if (!self.modificationTagMap.has(value)) {\n self.modificationTagMap.set(\n value,\n modificationColors[value] || randomColor(),\n )\n }\n })\n },\n /**\n * #action\n */\n setModificationsReady(flag: boolean) {\n self.modificationsReady = flag\n },\n /**\n * #action\n */\n setSortReady(flag: boolean) {\n self.sortReady = flag\n },\n /**\n * #action\n */\n clearSelected() {\n self.sortedBy = undefined\n },\n /**\n * #action\n */\n toggleSoftClipping() {\n self.showSoftClipping = !self.showSoftClipping\n },\n /**\n * #action\n */\n toggleMismatchAlpha() {\n self.mismatchAlpha = !self.mismatchAlpha\n },\n /**\n * #action\n */\n setSortedBy(type: string, tag?: string) {\n const { centerLineInfo } = getContainingView(self) as LGV\n if (!centerLineInfo) {\n return\n }\n const { refName, assemblyName, offset } = centerLineInfo\n const centerBp = Math.round(offset) + 1\n\n if (centerBp < 0 || !refName) {\n return\n }\n\n self.sortReady = false\n self.sortedBy = {\n type,\n pos: centerBp,\n refName,\n assemblyName,\n tag,\n }\n },\n /**\n * #action\n * overrides base from SharedLinearPileupDisplay to make sortReady false\n * since changing feature height destroys the sort-induced layout\n */\n setFeatureHeight(n?: number) {\n self.sortReady = false\n self.featureHeight = n\n },\n }))\n .actions(self => {\n // resets the sort object and refresh whole display on reload\n const superReload = self.reload\n\n return {\n /**\n * #action\n */\n reload() {\n self.clearSelected()\n superReload()\n },\n }\n })\n\n .views(self => ({\n /**\n * #getter\n */\n get rendererConfig() {\n const {\n featureHeight,\n noSpacing,\n trackMaxHeight,\n mismatchAlpha,\n rendererTypeName,\n } = self\n const configBlob = getConf(self, ['renderers', rendererTypeName]) || {}\n return self.rendererType.configSchema.create(\n {\n ...configBlob,\n ...(featureHeight !== undefined ? { height: featureHeight } : {}),\n ...(noSpacing !== undefined ? { noSpacing } : {}),\n ...(mismatchAlpha !== undefined ? { mismatchAlpha } : {}),\n ...(trackMaxHeight !== undefined\n ? { maxHeight: trackMaxHeight }\n : {}),\n },\n getEnv(self),\n )\n },\n }))\n .views(self => {\n const { renderReady: superRenderReady } = self\n return {\n /**\n * #getter\n */\n get mismatchAlphaSetting() {\n return readConfObject(self.rendererConfig, 'mismatchAlpha')\n },\n /**\n * #method\n */\n renderReady() {\n const view = getContainingView(self) as LGV\n return (\n self.modificationsReady &&\n self.currSortBpPerPx === view.bpPerPx &&\n superRenderReady()\n )\n },\n }\n })\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderPropsPre: superRenderPropsPre,\n renderProps: superRenderProps,\n colorSchemeSubMenuItems: superColorSchemeSubMenuItems,\n } = self\n\n return {\n /**\n * #method\n */\n renderPropsPre() {\n const { sortedBy, showSoftClipping, modificationTagMap } = self\n const superProps = superRenderPropsPre()\n return {\n ...superProps,\n showSoftClip: showSoftClipping,\n sortedBy,\n modificationTagMap: Object.fromEntries(modificationTagMap.toJSON()),\n }\n },\n /**\n * #method\n */\n renderProps() {\n const { sortReady } = self\n const result = superRenderProps()\n return {\n ...result,\n notReady: result.notReady || !sortReady,\n }\n },\n\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n\n {\n label: 'Sort by...',\n icon: SortIcon,\n disabled: self.showSoftClipping,\n subMenu: [\n ...['Start location', 'Read strand', 'Base pair'].map(\n option => ({\n label: option,\n onClick: () => {\n self.setSortedBy(option)\n },\n }),\n ),\n {\n label: 'Sort by tag...',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SortByTagDialog,\n {\n model: self,\n handleClose,\n },\n ])\n },\n },\n {\n label: 'Clear sort',\n onClick: () => {\n self.clearSelected()\n },\n },\n ],\n },\n {\n label: 'Color by...',\n icon: ColorLensIcon,\n subMenu: [\n {\n label: 'Pair orientation',\n onClick: () => {\n self.setColorScheme({ type: 'pairOrientation' })\n },\n },\n {\n label: 'Modifications or methylation',\n onClick: () => {\n getSession(self).queueDialog(doneCallback => [\n ModificationsDialog,\n {\n model: self,\n handleClose: doneCallback,\n },\n ])\n },\n },\n {\n label: 'Insert size',\n onClick: () => {\n self.setColorScheme({ type: 'insertSize' })\n },\n },\n ...superColorSchemeSubMenuItems(),\n ],\n },\n {\n label: 'Group by...',\n icon: WorkspacesIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n GroupByDialog,\n { model: self, handleClose },\n ])\n },\n },\n {\n label: 'Show soft clipping',\n icon: VisibilityIcon,\n type: 'checkbox',\n checked: self.showSoftClipping,\n onClick: () => {\n self.toggleSoftClipping()\n // if toggling from off to on, will break sort for this track\n // so clear it\n if (self.showSoftClipping) {\n self.clearSelected()\n }\n },\n },\n {\n label: 'Fade mismatches by quality',\n type: 'checkbox',\n checked: self.mismatchAlphaSetting,\n onClick: () => {\n self.toggleMismatchAlpha()\n },\n },\n ] as const\n },\n }\n })\n .actions(self => ({\n afterAttach() {\n createAutorun(\n self,\n async () => {\n const view = getContainingView(self) as LGV\n if (!self.autorunReady) {\n return\n }\n\n self.setCurrSortBpPerPx(view.bpPerPx)\n },\n { delay: 1000 },\n )\n createAutorun(\n self,\n async () => {\n const { rpcManager } = getSession(self)\n const view = getContainingView(self) as LGV\n if (!self.autorunReady) {\n return\n }\n\n const { sortedBy, adapterConfig, rendererType, sortReady } = self\n const { bpPerPx } = view\n\n if (\n sortedBy &&\n (!sortReady || self.currSortBpPerPx === view.bpPerPx)\n ) {\n const { pos, refName, assemblyName } = sortedBy\n // render just the sorted region first\n // @ts-expect-error\n await self.rendererType.renderInClient(rpcManager, {\n assemblyName,\n regions: [\n {\n start: pos,\n end: pos + 1,\n refName,\n assemblyName,\n },\n ],\n adapterConfig,\n rendererType: rendererType.name,\n sessionId: getRpcSessionId(self),\n layoutId: view.id,\n timeout: 1_000_000,\n ...self.renderPropsPre(),\n })\n }\n self.setCurrSortBpPerPx(bpPerPx)\n self.setSortReady(true)\n },\n { delay: 1000 },\n )\n\n createAutorun(self, async () => {\n if (!self.autorunReady) {\n return\n }\n const { parentTrack, colorBy } = self\n const { staticBlocks } = getContainingView(self) as LGV\n if (colorBy?.type === 'modifications') {\n const adapter = getConf(parentTrack, ['adapter'])\n const vals = await getUniqueModificationValues({\n self,\n adapterConfig: adapter,\n blocks: staticBlocks,\n })\n self.updateModificationColorMap(vals)\n }\n self.setModificationsReady(true)\n })\n },\n }))\n}\n\nexport type LinearPileupDisplayStateModel = ReturnType<typeof stateModelFactory>\nexport type LinearPileupDisplayModel = Instance<LinearPileupDisplayStateModel>\nexport default stateModelFactory\n","import configSchemaFactory from './configSchema'\nimport modelFactory from './model'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function register(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearPileupDisplay',\n displayName: 'Pileup display',\n configSchema,\n stateModel: modelFactory(configSchema),\n subDisplay: { type: 'LinearAlignmentsDisplay', lowerPanel: true },\n trackType: 'AlignmentsTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n\nexport { default as linearPileupDisplayStateModelFactory } from './model'\nexport { default as linearPileupDisplayConfigSchemaFactory } from './configSchema'\nexport { SharedLinearPileupDisplayMixin } from './SharedLinearPileupDisplayMixin'\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport BamAdapterF from './CramAdapter'\nimport CramAdapterF from './BamAdapter'\nimport HtsgetBamAdapterF from './HtsgetBamAdapter'\nimport SNPCoverageAdapterF from './SNPCoverageAdapter'\nimport SNPCoverageRendererF from './SNPCoverageRenderer'\nimport PileupRendererF from './PileupRenderer'\nimport LinearAlignmentsDisplayF from './LinearAlignmentsDisplay'\nimport LinearSNPCoverageDisplayF from './LinearSNPCoverageDisplay'\nimport LinearReadArcsDisplayF from './LinearReadArcsDisplay'\nimport LinearReadCloudDisplayF from './LinearReadCloudDisplay'\nimport AlignmentsTrackF from './AlignmentsTrack'\nimport AlignmentsFeatureWidgetF from './AlignmentsFeatureDetail'\nimport PileupRPCMethodsF from './PileupRPC'\nimport GuessAlignmentsTypesF from './GuessAlignmentsTypes'\nimport LinearPileupDisplayF from './LinearPileupDisplay'\n\nexport default class AlignmentsPlugin extends Plugin {\n name = 'AlignmentsPlugin'\n\n install(pluginManager: PluginManager) {\n ;[\n CramAdapterF,\n BamAdapterF,\n LinearPileupDisplayF,\n LinearSNPCoverageDisplayF,\n AlignmentsTrackF,\n SNPCoverageAdapterF,\n HtsgetBamAdapterF,\n PileupRendererF,\n PileupRPCMethodsF,\n SNPCoverageRendererF,\n LinearReadArcsDisplayF,\n LinearReadCloudDisplayF,\n LinearAlignmentsDisplayF,\n AlignmentsFeatureWidgetF,\n GuessAlignmentsTypesF,\n ].map(f => {\n f(pluginManager)\n })\n }\n}\n\nexport {\n linearPileupDisplayStateModelFactory,\n linearPileupDisplayConfigSchemaFactory,\n SharedLinearPileupDisplayMixin,\n} from './LinearPileupDisplay'\nexport { type LinearPileupDisplayModel } from './LinearPileupDisplay/model'\nexport * as MismatchParser from './MismatchParser'\n","import { types, Instance } from 'mobx-state-tree'\n\nimport { orientationTypes, pairMap } from '../util'\nimport { ChainStats } from './fetchChains'\n\nexport const fillColor = {\n color_fwd_strand_not_proper: '#ECC8C8',\n color_rev_strand_not_proper: '#BEBED8',\n color_fwd_strand: '#EC8B8B',\n color_rev_strand: '#8F8FD8',\n color_fwd_missing_mate: '#D11919',\n color_rev_missing_mate: '#1919D1',\n color_fwd_diff_chr: '#000',\n color_rev_diff_chr: '#969696',\n color_pair_lr: '#c8c8c8',\n color_pair_rr: 'navy',\n color_pair_rl: 'teal',\n color_pair_ll: 'green',\n color_nostrand: '#c8c8c8',\n color_interchrom: 'purple',\n color_longinsert: 'red',\n color_shortinsert: 'pink',\n color_unknown: 'grey',\n}\n\n// manually calculated by running\n// const color = require('color')\n// Object.fromEntries(Object.entries(fillColor).map(([key,val])=>{\n// return [key, color(val).darken('0.3').hex()]\n// }))\n// this avoids (expensive) use of Color module at runtime\nexport const strokeColor = {\n color_fwd_strand_not_proper: '#CA6767',\n color_rev_strand_not_proper: '#7272AA',\n color_fwd_strand: '#DC2A2A',\n color_rev_strand: '#4141BA',\n color_fwd_missing_mate: '#921111',\n color_rev_missing_mate: '#111192',\n color_fwd_diff_chr: '#000000',\n color_rev_diff_chr: '#696969',\n color_pair_lr: '#8C8C8C',\n color_pair_rr: '#00005A',\n color_pair_rl: '#005A5A',\n color_pair_ll: '#005A00',\n color_nostrand: '#8C8C8C',\n color_interchrom: '#5A005A',\n color_longinsert: '#B30000',\n color_shortinsert: '#FF3A5C',\n color_unknown: 'grey',\n}\n\nexport function getPairedInsertSizeColor(\n f1: { refName: string; tlen?: number },\n f2: { refName: string },\n stats?: ChainStats,\n) {\n const sameRef = f1.refName === f2.refName\n const tlen = Math.abs(f1.tlen || 0)\n if (sameRef && tlen > (stats?.upper || 0)) {\n return [fillColor.color_longinsert, strokeColor.color_longinsert] as const\n } else if (sameRef && tlen < (stats?.lower || 0)) {\n return [fillColor.color_shortinsert, strokeColor.color_shortinsert] as const\n } else if (!sameRef) {\n return [fillColor.color_interchrom, strokeColor.color_interchrom] as const\n } else {\n return undefined\n }\n}\n\nconst defaultColor = [fillColor.color_unknown, fillColor.color_unknown] as const\n\n// return color scheme with both insert size and orientation coloring,\n// prioritzing orientation coloring\nexport function getPairedInsertSizeAndOrientationColor(\n f1: { refName: string; pair_orientation?: string; tlen?: number },\n f2: { refName: string },\n stats?: ChainStats,\n) {\n return (\n getPairedOrientationColorOrDefault(f1) ||\n getPairedInsertSizeColor(f1, f2, stats) ||\n defaultColor\n )\n}\n\nexport function getPairedOrientationColorOrDefault(f: {\n pair_orientation?: string\n}) {\n const type = orientationTypes.fr\n const r = type[f.pair_orientation || ''] as keyof typeof pairMap\n const type2 = pairMap[r] as keyof typeof fillColor\n return r === 'LR'\n ? undefined\n : ([fillColor[type2], strokeColor[type2]] as const)\n}\n\nexport function getPairedOrientationColor(f: { pair_orientation?: string }) {\n return getPairedOrientationColorOrDefault(f) || defaultColor\n}\n\nexport interface ExtraColorBy {\n custom?: Record<string, string>\n}\n\nexport const ColorByModel = types.maybe(\n types.model({\n type: types.string,\n tag: types.maybe(types.string),\n extra: types.frozen(),\n }),\n)\n\nexport type IColorByModel = Instance<typeof ColorByModel>\n","import { types, IAnyStateTreeNode } from 'mobx-state-tree'\nimport { BlockSet } from '@jbrowse/core/util/blockTypes'\nimport { getSession } from '@jbrowse/core/util'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\nexport async function getUniqueTagValues({\n self,\n tag,\n blocks,\n opts,\n}: {\n self: IAnyStateTreeNode & { adapterConfig: AnyConfigurationModel }\n tag: string\n blocks: BlockSet\n opts?: {\n headers?: Record<string, string>\n signal?: AbortSignal\n filters: string[]\n }\n}) {\n const { rpcManager } = getSession(self)\n const { adapterConfig } = self\n const sessionId = getRpcSessionId(self)\n const values = await rpcManager.call(\n getRpcSessionId(self),\n 'PileupGetGlobalValueForTag',\n {\n adapterConfig,\n tag,\n sessionId,\n regions: blocks.contentBlocks,\n ...opts,\n },\n )\n return values as string[]\n}\n\ntype Track = IAnyStateTreeNode & { configuration: AnyConfigurationModel }\n\nexport async function getUniqueModificationValues({\n self,\n adapterConfig,\n blocks,\n opts,\n}: {\n self: IAnyStateTreeNode & {\n parentTrack: Track\n }\n adapterConfig: AnyConfigurationModel\n blocks: BlockSet\n opts?: {\n headers?: Record<string, string>\n signal?: AbortSignal\n filters: string[]\n }\n}) {\n const { rpcManager } = getSession(self)\n const sessionId = getRpcSessionId(self)\n const values = await rpcManager.call(\n sessionId,\n 'PileupGetVisibleModifications',\n {\n adapterConfig,\n sessionId,\n regions: blocks.contentBlocks,\n ...opts,\n },\n )\n return values as string[]\n}\n\nexport const FilterModel = types.model({\n flagInclude: types.optional(types.number, 0),\n flagExclude: types.optional(types.number, 1540),\n readName: types.maybe(types.string),\n tagFilter: types.maybe(\n types.model({\n tag: types.string,\n value: types.maybe(types.string),\n }),\n ),\n})\n\nexport interface IFilter {\n flagExclude: number\n flagInclude: number\n readName?: string\n tagFilter?: {\n tag: string\n value?: string\n }\n}\n","import { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { Feature, AugmentedRegion } from '@jbrowse/core/util'\nimport { toArray } from 'rxjs/operators'\nimport { firstValueFrom } from 'rxjs'\nimport { IAnyStateTreeNode, addDisposer, isAlive } from 'mobx-state-tree'\nimport { IAutorunOptions, autorun } from 'mobx'\n\n// get tag from BAM or CRAM feature, where CRAM uses feature.get('tags') and\n// BAM does not\nexport function getTag(feature: Feature, tag: string) {\n const tags = feature.get('tags')\n return tags !== undefined ? tags[tag] : feature.get(tag)\n}\n\n// use fallback alt tag, used in situations where upper case/lower case tags\n// exist e.g. Mm/MM for base modifications\nexport function getTagAlt(feature: Feature, tag: string, alt: string) {\n return getTag(feature, tag) ?? getTag(feature, alt)\n}\n\n// orientation definitions from igv.js, see also\n// https://software.broadinstitute.org/software/igv/interpreting_pair_orientations\nexport const orientationTypes = {\n fr: {\n F1R2: 'LR',\n F2R1: 'LR',\n\n F1F2: 'LL',\n F2F1: 'LL',\n\n R1R2: 'RR',\n R2R1: 'RR',\n\n R1F2: 'RL',\n R2F1: 'RL',\n } as Record<string, string>,\n\n rf: {\n R1F2: 'LR',\n R2F1: 'LR',\n\n R1R2: 'LL',\n R2R1: 'LL',\n\n F1F2: 'RR',\n F2F1: 'RR',\n\n F1R2: 'RL',\n F2R1: 'RL',\n } as Record<string, string>,\n\n ff: {\n F2F1: 'LR',\n R1R2: 'LR',\n\n F2R1: 'LL',\n R1F2: 'LL',\n\n R2F1: 'RR',\n F1R2: 'RR',\n\n R2R1: 'RL',\n F1F2: 'RL',\n } as Record<string, string>,\n}\n\nexport const pairMap = {\n LR: 'color_pair_lr',\n LL: 'color_pair_ll',\n RR: 'color_pair_rr',\n RL: 'color_pair_rl',\n} as const\n\nexport function getColorWGBS(strand: number, base: string) {\n if (strand === 1) {\n if (base === 'C') {\n return '#f00'\n }\n if (base === 'T') {\n return '#00f'\n }\n } else if (strand === -1) {\n if (base === 'G') {\n return '#f00'\n }\n if (base === 'A') {\n return '#00f'\n }\n }\n return '#888'\n}\n\n// fetches region sequence augmenting by +/- 1bp for CpG on either side of\n// requested region\nexport async function fetchSequence(\n region: AugmentedRegion,\n adapter: BaseFeatureDataAdapter,\n) {\n const { start, end, originalRefName, refName } = region\n\n const feats = await firstValueFrom(\n adapter\n .getFeatures({\n ...region,\n refName: originalRefName || refName,\n end: end + 1,\n start: Math.max(0, start - 1),\n })\n .pipe(toArray()),\n )\n return feats[0]?.get('seq')\n}\n\n// has to check underlying C-G (aka CpG) on the reference sequence\nexport function shouldFetchReferenceSequence(type?: string) {\n return type === 'methylation'\n}\n\n// adapted from IGV\n// https://github.com/igvteam/igv/blob/e803e3af2d8c9ea049961dfd4628146bdde9a574/src/main/java/org/broad/igv/sam/mods/BaseModificationColors.java#L27\nexport const modificationColors = {\n m: 'rgb(255,0,0)',\n h: 'rgb(11, 132, 165)',\n o: 'rgb(111, 78, 129)',\n f: 'rgb(246, 200, 95)',\n c: 'rgb(157, 216, 102)',\n g: 'rgb(255, 160, 86)',\n e: 'rgb(141, 221, 208)',\n b: 'rgb(202, 71, 47)',\n} as Record<string, string>\n\ntype DisplayModel = IAnyStateTreeNode & { setError: (arg: unknown) => void }\n\nexport function createAutorun(\n self: DisplayModel,\n cb: () => Promise<void>,\n opts?: IAutorunOptions,\n) {\n addDisposer(\n self,\n autorun(async () => {\n try {\n await cb()\n } catch (e) {\n if (isAlive(self)) {\n self.setError(e)\n }\n }\n }, opts),\n )\n}\nexport function randomColor() {\n return `hsl(${Math.random() * 200}, 50%, 50%)`\n}\n","import { useState, useEffect } from 'react'\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport { clamp } from '@jbrowse/core/util'\n\n// locals\nimport { LayoutRecord } from './model'\n\ntype LGV = LinearGenomeViewModel\n\ninterface Display {\n height: number\n scrollTop: number\n SNPCoverageDisplay?: { height: number }\n}\n\ninterface Track {\n displays: Display[]\n}\n\nconst [, TOP, , BOTTOM] = [0, 1, 2, 3] as const\n\nfunction cheight(chunk: LayoutRecord) {\n return chunk[BOTTOM] - chunk[TOP]\n}\n\nexport function heightFromSpecificLevel(\n views: LGV[],\n trackId: string,\n level: number,\n getYPosOverride?: (trackId: string, level: number) => number,\n) {\n return getYPosOverride\n ? getYPosOverride(trackId, level)\n : views[level]!.trackRefs[trackId]?.getBoundingClientRect().top || 0\n}\n\nexport function getPxFromCoordinate(view: LGV, refName: string, coord: number) {\n return (view.bpToPx({ refName, coord })?.offsetPx || 0) - view.offsetPx\n}\n\n// get's the yposition of a layout record in a track\nexport function yPos(\n trackId: string,\n level: number,\n views: LGV[],\n tracks: Track[],\n c: LayoutRecord,\n getYPosOverride?: (trackId: string, level: number) => number,\n) {\n const display = tracks[level]!.displays[0]!\n const min = 0\n const max = display.height\n let offset = 0\n const { SNPCoverageDisplay } = display\n if (SNPCoverageDisplay) {\n offset = SNPCoverageDisplay.height\n }\n const yPos = getYPosOverride ? 0 : display.scrollTop\n return (\n clamp(c[TOP] - yPos + cheight(c) / 2 + offset, min, max) +\n heightFromSpecificLevel(views, trackId, level, getYPosOverride) +\n display.scrollTop\n )\n}\n\n// we combo a useEffect and useState combo to force rerender on snap changing.\n// the setup of this being a useEffect+useState makes it re-render once the\n// useEffect is called, which is generally the \"next frame\". If we removed the\n// below use\nexport const useNextFrame = (variable: unknown) => {\n const [, setNextFrameState] = useState<unknown>()\n useEffect(() => {\n setNextFrameState(variable)\n }, [variable])\n}\n\n// https://stackoverflow.com/a/49186706/2129219 the array-intersection package\n// on npm has a large kb size, and we are just intersecting open track ids so\n// simple is better\nexport function intersect<T>(\n cb: (l: T) => string,\n a1: T[] = [],\n a2: T[] = [],\n ...rest: T[][]\n): T[] {\n const ids = new Set(a2.map(elt => cb(elt)))\n const a12 = a1.filter(value => ids.has(cb(value)))\n return rest.length === 0 ? a12 : intersect(cb, a12, ...rest)\n}\n","function findCircleIntersectionX(\n y: number,\n cx: number,\n cy: number,\n r: number,\n resultArray: [number, number][],\n) {\n const d = Math.abs(y - cy)\n if (d > r) {\n return\n }\n if (d === r) {\n resultArray.push([cx, y])\n }\n const solution = Math.sqrt(r * r - d * d)\n resultArray.push([cx - solution, y], [cx + solution, y])\n}\n\nfunction findCircleIntersectionY(\n x: number,\n cx: number,\n cy: number,\n r: number,\n resultArray: [number, number][],\n) {\n const d = Math.abs(x - cx)\n if (d > r) {\n return\n }\n if (d === r) {\n resultArray.push([x, cy])\n }\n const solution = Math.sqrt(r * r - d * d)\n resultArray.push([x, cy - solution], [x, cy + solution])\n}\n\nfunction cartesianToTheta(x: number, y: number) {\n let theta = (Math.atan(y / x) + 2 * Math.PI) % (2 * Math.PI)\n if (x < 0) {\n if (y <= 0) {\n theta += Math.PI\n } else {\n theta -= Math.PI\n }\n }\n return theta\n}\n\nexport function cartesianToPolar(x: number, y: number) {\n const rho = Math.sqrt(x * x + y * y)\n if (rho === 0) {\n return [0, 0] as const\n }\n const theta = cartesianToTheta(x, y)\n return [rho, theta] as const\n}\n\nconst twoPi = 2 * Math.PI\nexport function thetaRangesOverlap(\n r1start: number,\n r1length: number,\n r2start: number,\n r2length: number,\n) {\n if (r1length <= 0 || r2length <= 0) {\n return false\n }\n if (r1length + 0.0001 >= twoPi || r2length + 0.0001 >= twoPi) {\n return true\n }\n\n // put both range starts between 2Ï€ and 4Ï€\n r1start = (((r1start % twoPi) + twoPi) % twoPi) + twoPi\n r2start = (((r2start % twoPi) + twoPi) % twoPi) + twoPi\n\n if (r1start < r2start + r2length && r1start + r1length > r2start) {\n return true\n }\n\n // move r2 2Ï€ to the left and check\n r2start -= twoPi\n if (r1start < r2start + r2length && r1start + r1length > r2start) {\n return true\n }\n\n // move it 2Ï€ to the right and check\n r2start += twoPi + twoPi\n return r1start < r2start + r2length && r1start + r1length > r2start\n}\n\n// return which arc range has any part of the circle visible in the viewport\nexport function viewportVisibleSection(\n viewSides: [number, number, number, number],\n circleCenter: [number, number],\n circleRadius: number,\n) {\n let [viewL, viewR, viewT, viewB] = viewSides\n const [cx, cy] = circleCenter\n\n // transform coordinate system to center of circle\n viewL -= cx\n viewR -= cx\n viewT -= cy\n viewB -= cy\n\n const centerIsInsideViewport =\n viewL < 0 && viewR > 0 && viewT < 0 && viewB > 0\n\n if (centerIsInsideViewport) {\n const vertices = [\n [viewL, viewT],\n [viewR, viewT],\n [viewL, viewB],\n [viewR, viewB],\n ] as const\n let maxRho = Number.NEGATIVE_INFINITY\n for (const [x, y] of vertices) {\n const rho = Math.sqrt(x * x + y * y)\n if (rho > maxRho) {\n maxRho = rho\n }\n }\n return {\n rho: [0, Math.min(circleRadius, maxRho)] as [number, number],\n theta: [0, 2 * Math.PI] as [number, number],\n }\n }\n // const viewportCompletelyContainsCircle =\n // circleCenter[0] - viewL >= circleRadius &&\n // viewR - circleCenter[0] >= circleRadius &&\n // circleCenter[1] - viewT >= circleRadius &&\n // viewB - circleCenter[1] >= circleRadius\n\n // if (viewportCompletelyContainsCircle) {\n // return [0, 2 * Math.PI]\n // }\n\n // const distToCenterSquared = ([x, y]) => {\n // const [cx, cy] = circleCenter\n // const sq = n => n * n\n // return sq(x - cx) + sq(y - cy)\n // }\n // const circleRadiusSquared = circleRadius * circleRadius\n\n // const tlInside = distToCenterSquared([viewL, viewT]) <= circleRadiusSquared\n // const trInside = distToCenterSquared([viewR, viewT]) <= circleRadiusSquared\n // const blInside = distToCenterSquared([viewL, viewB]) <= circleRadiusSquared\n // const brInside = distToCenterSquared([viewR, viewB]) <= circleRadiusSquared\n\n // const noIntersection = !tlInside && !trInside && !blInside && !brInside\n // if (noIntersection) return undefined\n\n // const circleCompletelyContainsViewport =\n // tlInside && trInside && blInside && brInside\n // if (circleCompletelyContainsViewport) {\n // // viewport is in the circle, but the center is not in it, so take max\n // // and min of thetas to the center\n // const thetas = [\n // Math.atan(viewT / viewL),\n // Math.atan(viewT / viewR),\n // Math.atan(viewB / viewL),\n // Math.atan(viewB / viewR),\n // ]\n\n // return [Math.min(...thetas), Math.max(...thetas)]\n // }\n\n // if we get here, the viewport is partly in, partly out of the circle\n\n // const viewLIntersects = Math.abs(viewL - circleCenter[0]) <= circleRadius\n // const viewRIntersects = Math.abs(viewR - circleCenter[0]) <= circleRadius\n // const viewTIntersects = Math.abs(viewT - circleCenter[1]) <= circleRadius\n // const viewBIntersects = Math.abs(viewB - circleCenter[1]) <= circleRadius\n\n // const numIntersectingSides =\n // Number(viewLIntersects) +\n // Number(viewRIntersects) +\n // Number(viewTIntersects) +\n // Number(viewBIntersects)\n\n // if (numIntersectingSides === 4) return [0, 2 * Math.PI]\n // if (numIntersectingSides === 3) {\n // // TODO calculate the thetas of the\n // } else if (numIntersectingSides === 2) {\n // // TODO calculate the thetas of the 2 intersection points\n // } else if (numIntersectingSides === 1) {\n // // TODO calculate the thetas of the 1-2 intersection points of the line, and the angle between\n // }\n\n // make a list of vertices-of-interest that lie inside both shapes to examine\n // to determine the range covered by their intersection\n\n // transform coordinates to have the circle as the origin and find the intersections\n // of the circle and the view rectangle\n const vertices: [number, number][] = [\n [viewL, viewT],\n [viewR, viewT],\n [viewL, viewB],\n [viewR, viewB],\n ]\n findCircleIntersectionY(viewL, 0, 0, circleRadius, vertices)\n findCircleIntersectionY(viewR, 0, 0, circleRadius, vertices)\n findCircleIntersectionX(viewT, 0, 0, circleRadius, vertices)\n findCircleIntersectionX(viewB, 0, 0, circleRadius, vertices)\n\n // for each edge, also look at the closest point to center if it is inside the circle\n if (-viewL < circleRadius) {\n vertices.push([viewL, 0])\n }\n if (viewR < circleRadius) {\n vertices.push([viewR, 0])\n }\n if (-viewT < circleRadius) {\n vertices.push([0, viewT])\n }\n if (viewB < circleRadius) {\n vertices.push([0, viewB])\n }\n\n // const verticesOriginal = vertices.map(([x, y]) => [x + cx, y + cy])\n\n // now convert them all to polar and take the max and min of rho and theta\n\n // const viewportCenterTheta = cartesianToTheta(viewR + viewL, viewT + viewB)\n const reflect = viewL >= 0 ? -1 : 1\n // viewportCenterTheta < Math.PI / 2 || viewportCenterTheta > 1.5 * Math.PI\n // ? -1\n // : 1\n let rhoMin = Number.POSITIVE_INFINITY\n let rhoMax = Number.NEGATIVE_INFINITY\n let thetaMin = Number.POSITIVE_INFINITY\n let thetaMax = Number.NEGATIVE_INFINITY\n for (const [vx, vy] of vertices) {\n // ignore vertex if outside the viewport\n if (vx >= viewL && vx <= viewR && vy >= viewT && vy <= viewB) {\n const [rho, theta] = cartesianToPolar(vx * reflect, vy * reflect)\n // ignore vertex if outside the circle\n if (rho <= circleRadius + 0.001) {\n // ignore theta if rho is 0\n if (theta < thetaMin && rho > 0.0001) {\n thetaMin = theta\n }\n if (theta > thetaMax && rho > 0.0001) {\n thetaMax = theta\n }\n if (rho < rhoMin) {\n rhoMin = rho\n }\n if (rho > rhoMax) {\n rhoMax = rho\n }\n }\n }\n }\n\n if (reflect === -1) {\n thetaMin += Math.PI\n thetaMax += Math.PI\n }\n\n if (thetaMin > 2 * Math.PI && thetaMax > 2 * Math.PI) {\n thetaMin -= 2 * Math.PI\n thetaMax -= 2 * Math.PI\n }\n\n return {\n rho: [rhoMin, Math.min(circleRadius, rhoMax)] as [number, number],\n theta: [thetaMin, thetaMax] as [number, number],\n }\n}\n","import { polarToCartesian, assembleLocString, Region } from '@jbrowse/core/util'\nimport { thetaRangesOverlap } from './viewportVisibleRegion'\n\nexport interface SliceElidedRegion {\n elided: true\n widthBp: number\n regions: Region[]\n}\n\nexport interface SliceNonElidedRegion {\n elided: false\n widthBp: number\n start: number\n end: number\n refName: string\n assemblyName: string\n}\nexport type SliceRegion = SliceNonElidedRegion | SliceElidedRegion\n\nexport class Slice {\n key: string\n\n startRadians: number\n\n endRadians: number\n\n bpPerRadian: number\n\n flipped: boolean\n\n constructor(\n view: { bpPerRadian: number },\n public region: SliceRegion,\n public offsetRadians: number,\n public radianWidth: number,\n ) {\n const { bpPerRadian } = view\n this.key =\n 'regions' in region\n ? JSON.stringify(region.regions)\n : assembleLocString(region)\n this.bpPerRadian = bpPerRadian\n this.flipped = false\n\n this.startRadians = offsetRadians\n this.endRadians = region.widthBp / this.bpPerRadian + offsetRadians\n Object.freeze(this)\n }\n\n bpToXY(bp: number, radiusPx: number) {\n let offsetBp: number | undefined\n if (this.region.elided) {\n offsetBp = this.region.widthBp / 2\n } else if (this.flipped) {\n offsetBp = this.region.end - bp\n } else {\n offsetBp = bp - this.region.start\n }\n const totalRadians = offsetBp / this.bpPerRadian + this.offsetRadians\n return polarToCartesian(radiusPx, totalRadians)\n }\n\n toJSON() {\n return Object.fromEntries(Object.entries(this))\n }\n}\n\nfunction calculateStaticSlices(self: {\n elidedRegions: readonly SliceRegion[]\n bpPerRadian: number\n spacingPx: number\n pxPerRadian: number\n}) {\n const slices = []\n let currentRadianOffset = 0\n const { bpPerRadian, spacingPx, pxPerRadian } = self\n for (const region of self.elidedRegions) {\n const radianWidth = region.widthBp / bpPerRadian + spacingPx / pxPerRadian\n slices.push(new Slice(self, region, currentRadianOffset, radianWidth))\n currentRadianOffset += radianWidth\n }\n return slices\n}\n\nfunction sliceIsVisible(\n self: { offsetRadians: number; visibleSection: { theta: [number, number] } },\n slice: Slice,\n) {\n const {\n theta: [visibleThetaMin, visibleThetaMax],\n } = self.visibleSection\n\n return thetaRangesOverlap(\n slice.offsetRadians + self.offsetRadians,\n slice.radianWidth,\n visibleThetaMin,\n visibleThetaMax - visibleThetaMin,\n )\n}\n\nexport { calculateStaticSlices, sliceIsVisible }\n","import React, { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport {\n cast,\n getRoot,\n resolveIdentifier,\n types,\n SnapshotOrInstance,\n Instance,\n} from 'mobx-state-tree'\nimport { Region } from '@jbrowse/core/util/types/mst'\nimport { transaction } from 'mobx'\nimport { saveAs } from 'file-saver'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport {\n getSession,\n clamp,\n isSessionModelWithWidgets,\n} from '@jbrowse/core/util'\nimport { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera'\n\n// locals\nimport { calculateStaticSlices, sliceIsVisible, SliceRegion } from './slices'\nimport { viewportVisibleSection } from './viewportVisibleRegion'\n\n// lazies\nconst ExportSvgDialog = lazy(() => import('../components/ExportSvgDialog'))\n\nexport interface ExportSvgOptions {\n rasterizeLayers?: boolean\n filename?: string\n Wrapper?: React.FC<{ children: React.ReactNode }>\n themeName?: string\n}\n\n/**\n * #stateModel CircularView\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nfunction stateModelFactory(pluginManager: PluginManager) {\n const minHeight = 40\n const minWidth = 100\n const defaultHeight = 400\n return types\n .compose(\n 'CircularView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n type: types.literal('CircularView'),\n /**\n * #property\n * similar to offsetPx in linear genome view\n */\n offsetRadians: -Math.PI / 2,\n /**\n * #property\n */\n bpPerPx: 200,\n /**\n * #property\n */\n tracks: types.array(\n pluginManager.pluggableMstType('track', 'stateModel'),\n ),\n\n /**\n * #property\n */\n hideVerticalResizeHandle: false,\n /**\n * #property\n */\n hideTrackSelectorButton: false,\n /**\n * #property\n */\n lockedFitToWindow: true,\n /**\n * #property\n */\n disableImportForm: false,\n\n /**\n * #property\n */\n height: types.optional(\n types.refinement('trackHeight', types.number, n => n >= minHeight),\n defaultHeight,\n ),\n /**\n * #property\n */\n displayedRegions: types.array(Region),\n /**\n * #property\n */\n scrollX: 0,\n /**\n * #property\n */\n scrollY: 0,\n\n /**\n * #property\n */\n minimumRadiusPx: 25,\n /**\n * #property\n */\n spacingPx: 10,\n /**\n * #property\n */\n paddingPx: 80,\n /**\n * #property\n */\n lockedPaddingPx: 100,\n /**\n * #property\n */\n minVisibleWidth: 6,\n /**\n * #property\n */\n minimumBlockWidth: 20,\n /**\n * #property\n */\n trackSelectorType: 'hierarchical',\n }),\n )\n .volatile(() => ({\n volatileWidth: undefined as number | undefined,\n error: undefined as unknown,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get width() {\n if (self.volatileWidth === undefined) {\n throw new Error(\n 'wait for view to be initialized first before accessing width',\n )\n }\n return self.volatileWidth\n },\n\n /**\n * #getter\n */\n get visibleSection() {\n const { scrollX, scrollY, width, height } = self\n return viewportVisibleSection(\n [scrollX, scrollX + width, scrollY, scrollY + height],\n this.centerXY,\n this.radiusPx,\n )\n },\n /**\n * #getter\n */\n get circumferencePx() {\n let elidedBp = 0\n\n for (const r of this.elidedRegions) {\n elidedBp += r.widthBp\n }\n return (\n elidedBp / self.bpPerPx + self.spacingPx * this.elidedRegions.length\n )\n },\n /**\n * #getter\n */\n get radiusPx() {\n return this.circumferencePx / (2 * Math.PI)\n },\n /**\n * #getter\n */\n get bpPerRadian() {\n return self.bpPerPx * this.radiusPx\n },\n /**\n * #getter\n */\n get pxPerRadian() {\n return this.radiusPx\n },\n /**\n * #getter\n */\n get centerXY(): [number, number] {\n return [this.radiusPx + self.paddingPx, this.radiusPx + self.paddingPx]\n },\n /**\n * #getter\n */\n get totalBp() {\n let total = 0\n for (const region of self.displayedRegions) {\n total += region.end - region.start\n }\n return total\n },\n /**\n * #getter\n */\n get maximumRadiusPx() {\n return self.lockedFitToWindow\n ? Math.min(self.width, self.height) / 2 - self.lockedPaddingPx\n : 1000000\n },\n /**\n * #getter\n */\n get maxBpPerPx() {\n const minCircumferencePx = 2 * Math.PI * self.minimumRadiusPx\n return this.totalBp / minCircumferencePx\n },\n /**\n * #getter\n */\n get minBpPerPx() {\n // min depends on window dimensions, clamp between old min(0.01) and max\n const maxCircumferencePx = 2 * Math.PI * this.maximumRadiusPx\n return clamp(\n this.totalBp / maxCircumferencePx,\n 0.0000000001,\n this.maxBpPerPx,\n )\n },\n /**\n * #getter\n */\n get atMaxBpPerPx() {\n return self.bpPerPx >= this.maxBpPerPx\n },\n /**\n * #getter\n */\n get atMinBpPerPx() {\n return self.bpPerPx <= this.minBpPerPx\n },\n /**\n * #getter\n */\n get tooSmallToLock() {\n return this.minBpPerPx <= 0.0000000001\n },\n /**\n * #getter\n */\n get figureDimensions(): [number, number] {\n return [\n this.radiusPx * 2 + 2 * self.paddingPx,\n this.radiusPx * 2 + 2 * self.paddingPx,\n ]\n },\n /**\n * #getter\n */\n get figureWidth() {\n return this.figureDimensions[0]\n },\n /**\n * #getter\n */\n get figureHeight() {\n return this.figureDimensions[1]\n },\n /**\n * #getter\n * this is displayedRegions, post-processed to elide regions that are too\n * small to see reasonably\n */\n get elidedRegions() {\n const visible: SliceRegion[] = []\n self.displayedRegions.forEach(region => {\n const widthBp = region.end - region.start\n const widthPx = widthBp / self.bpPerPx\n if (widthPx < self.minVisibleWidth) {\n // too small to see, collapse into a single elision region\n const lastVisible = visible.at(-1)\n if (lastVisible?.elided) {\n lastVisible.regions.push({ ...region })\n lastVisible.widthBp += widthBp\n } else {\n visible.push({\n elided: true,\n widthBp,\n regions: [{ ...region }],\n })\n }\n } else {\n // big enough to see, display it\n visible.push({ ...region, widthBp, elided: false })\n }\n })\n\n // remove any single-region elisions\n for (let i = 0; i < visible.length; i += 1) {\n const v = visible[i]!\n if (v.elided && v.regions.length === 1) {\n visible[i] = { ...v, ...v.regions[0]!, elided: false }\n }\n }\n return visible\n },\n /**\n * #getter\n */\n get assemblyNames() {\n const assemblyNames: string[] = []\n self.displayedRegions.forEach(displayedRegion => {\n if (!assemblyNames.includes(displayedRegion.assemblyName)) {\n assemblyNames.push(displayedRegion.assemblyName)\n }\n })\n return assemblyNames\n },\n /**\n * #getter\n */\n get initialized() {\n const { assemblyManager } = getSession(self)\n return (\n self.volatileWidth !== undefined &&\n this.assemblyNames.every(a => assemblyManager.get(a)?.initialized)\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get staticSlices() {\n return calculateStaticSlices(self)\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get visibleStaticSlices() {\n return self.staticSlices.filter(s => sliceIsVisible(self, s))\n },\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.volatileWidth = Math.max(newWidth, minWidth)\n return self.volatileWidth\n },\n /**\n * #action\n */\n setHeight(newHeight: number) {\n self.height = Math.max(newHeight, minHeight)\n return self.height\n },\n /**\n * #action\n */\n resizeHeight(distance: number) {\n const oldHeight = self.height\n const newHeight = this.setHeight(self.height + distance)\n this.setModelViewWhenAdjust(!self.tooSmallToLock)\n return newHeight - oldHeight\n },\n /**\n * #action\n */\n resizeWidth(distance: number) {\n const oldWidth = self.width\n const newWidth = this.setWidth(self.width + distance)\n this.setModelViewWhenAdjust(!self.tooSmallToLock)\n return newWidth - oldWidth\n },\n /**\n * #action\n */\n rotateClockwiseButton() {\n this.rotateClockwise(Math.PI / 6)\n },\n\n /**\n * #action\n */\n rotateCounterClockwiseButton() {\n this.rotateCounterClockwise(Math.PI / 6)\n },\n\n /**\n * #action\n */\n rotateClockwise(distance = 0.17) {\n self.offsetRadians += distance\n },\n\n /**\n * #action\n */\n rotateCounterClockwise(distance = 0.17) {\n self.offsetRadians -= distance\n },\n\n /**\n * #action\n */\n zoomInButton() {\n this.setBpPerPx(self.bpPerPx / 1.4)\n },\n\n /**\n * #action\n */\n zoomOutButton() {\n this.setBpPerPx(self.bpPerPx * 1.4)\n },\n\n /**\n * #action\n */\n setBpPerPx(newVal: number) {\n self.bpPerPx = clamp(newVal, self.minBpPerPx, self.maxBpPerPx)\n },\n\n /**\n * #action\n */\n setModelViewWhenAdjust(secondCondition: boolean) {\n if (self.lockedFitToWindow && secondCondition) {\n this.setBpPerPx(self.minBpPerPx)\n }\n },\n\n /**\n * #action\n */\n setDisplayedRegions(regions: SnapshotOrInstance<typeof Region>[]) {\n const previouslyEmpty = self.displayedRegions.length === 0\n self.displayedRegions = cast(regions)\n\n if (previouslyEmpty) {\n this.setBpPerPx(self.minBpPerPx)\n } else {\n this.setBpPerPx(self.bpPerPx)\n }\n },\n\n /**\n * #action\n */\n activateTrackSelector() {\n if (self.trackSelectorType === 'hierarchical') {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const selector = session.addWidget(\n 'HierarchicalTrackSelectorWidget',\n 'hierarchicalTrackSelector',\n { view: self },\n )\n session.showWidget(selector)\n return selector\n }\n }\n throw new Error(`invalid track selector type ${self.trackSelectorType}`)\n },\n\n /**\n * #action\n */\n toggleTrack(trackId: string) {\n const hiddenCount = this.hideTrack(trackId)\n if (!hiddenCount) {\n this.showTrack(trackId)\n return true\n }\n return false\n },\n\n /**\n * #action\n */\n setError(error: unknown) {\n self.error = error\n },\n\n /**\n * #action\n */\n showTrack(trackId: string, initialSnapshot = {}) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n const trackType = pluginManager.getTrackType(conf.type)\n if (!trackType) {\n throw new Error(`unknown track type ${conf.type}`)\n }\n const viewType = pluginManager.getViewType(self.type)!\n const supportedDisplays = new Set(\n viewType.displayTypes.map(d => d.name),\n )\n const displayConf = conf.displays.find((d: AnyConfigurationModel) =>\n supportedDisplays.has(d.type),\n )\n const track = trackType.stateModel.create({\n ...initialSnapshot,\n type: conf.type,\n configuration: conf,\n displays: [{ type: displayConf.type, configuration: displayConf }],\n })\n self.tracks.push(track)\n },\n\n /**\n * #action\n */\n addTrackConf(configuration: AnyConfigurationModel, initialSnapshot = {}) {\n const { type } = configuration\n const name = readConfObject(configuration, 'name')\n const trackType = pluginManager.getTrackType(type)\n if (!trackType) {\n throw new Error(`unknown track type ${type}`)\n }\n const viewType = pluginManager.getViewType(self.type)!\n const supportedDisplays = new Set(\n viewType.displayTypes.map(d => d.name),\n )\n const displayConf = configuration.displays.find(\n (d: AnyConfigurationModel) => supportedDisplays.has(d.type),\n )\n self.tracks.push(\n trackType.stateModel.create({\n ...initialSnapshot,\n name,\n type,\n configuration,\n displays: [{ type: displayConf.type, configuration: displayConf }],\n }),\n )\n },\n\n /**\n * #action\n */\n hideTrack(trackId: string) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n const t = self.tracks.filter(t => t.configuration === conf)\n transaction(() => {\n t.forEach(t => self.tracks.remove(t))\n })\n return t.length\n },\n\n /**\n * #action\n */\n toggleFitToWindowLock() {\n // when going unlocked -> locked and circle is cut off, set to the\n // locked minBpPerPx\n self.lockedFitToWindow = !self.lockedFitToWindow\n this.setModelViewWhenAdjust(self.atMinBpPerPx)\n return self.lockedFitToWindow\n },\n /**\n * #action\n * creates an svg export and save using FileSaver\n */\n async exportSvg(opts: ExportSvgOptions = {}) {\n const { renderToSvg } = await import('../svgcomponents/SVGCircularView')\n const html = await renderToSvg(self as CircularViewModel, opts)\n const blob = new Blob([html], { type: 'image/svg+xml' })\n saveAs(blob, opts.filename || 'image.svg')\n },\n }))\n .views(self => ({\n /**\n * #method\n * return the view menu items\n */\n menuItems(): MenuItem[] {\n return [\n {\n label: 'Return to import form',\n onClick: () => {\n self.setDisplayedRegions([])\n },\n icon: FolderOpenIcon,\n },\n {\n label: 'Export SVG',\n icon: PhotoCameraIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n {\n label: 'Open track selector',\n onClick: self.activateTrackSelector,\n icon: TrackSelectorIcon,\n },\n ]\n },\n }))\n}\n\nexport type CircularViewStateModel = ReturnType<typeof stateModelFactory>\nexport type CircularViewModel = Instance<CircularViewStateModel>\n\nexport default stateModelFactory\n","import React, { useState, useEffect } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\nconst useStyles = makeStyles()(theme => {\n const offset = 2\n const duration = 1.4\n\n const { primary, secondary, tertiary, quaternary } = theme.palette\n return {\n path: {\n strokeDasharray: 187,\n strokeDashoffset: 50,\n animation: `$dash ${duration}s ease-in-out infinite, $colors ${\n duration * 4\n }s ease-in-out infinite`,\n },\n '@keyframes colors': {\n '0%': {\n stroke: primary.light,\n },\n '25%': {\n stroke: secondary.light,\n },\n '50%': {\n stroke: tertiary.light,\n },\n '75%': {\n stroke: quaternary.light,\n },\n '100%': {\n stroke: primary.light,\n },\n },\n\n '@keyframes dash': {\n '0%': {\n strokeDashoffset: offset,\n },\n '50%': {\n strokeDashoffset: offset / 4,\n transform: 'rotate(135deg)',\n },\n '100%': {\n strokeDashoffset: offset,\n transform: 'rotate(720deg)',\n },\n },\n }\n})\n\nconst Loading = observer(function ({\n model: {\n renderProps: { radius },\n },\n}: {\n model: { renderProps: { radius: number } }\n}) {\n const { classes } = useStyles()\n\n // only show the loading message after 400ms to prevent excessive flickering\n const [shown, setShown] = useState(false)\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShown(true)\n }, 400)\n return () => {\n clearTimeout(timeout)\n }\n })\n\n return !shown ? null : (\n <g>\n <defs>\n <pattern\n id=\"diagonalHatch\"\n width=\"10\"\n height=\"10\"\n patternTransform=\"rotate(45 0 0)\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"10\"\n style={{ stroke: 'rgba(255,255,255,0.5)', strokeWidth: 10 }}\n />\n </pattern>\n </defs>\n <circle cx=\"0\" cy=\"0\" r={radius} fill=\"#f1f1f1\" />\n <circle cx=\"0\" cy=\"0\" r={radius} fill=\"url(#diagonalHatch)\" />\n <text\n x=\"0\"\n y=\"0\"\n transform=\"rotate(90 0 0)\"\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n >\n Loading…\n </text>\n <circle\n className={classes.path}\n fill=\"none\"\n strokeWidth=\"4\"\n strokeLinecap=\"round\"\n cx=\"0\"\n cy=\"0\"\n r=\"60\"\n />\n </g>\n )\n})\n\nexport default Loading\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\nconst DisplayError = observer(function ({\n model,\n}: {\n model: { renderProps: { radius: number }; error: unknown }\n}) {\n const {\n renderProps: { radius },\n error,\n } = model\n return (\n <g>\n <defs>\n <pattern\n id=\"diagonalHatch\"\n width=\"10\"\n height=\"10\"\n patternTransform=\"rotate(45 0 0)\"\n patternUnits=\"userSpaceOnUse\"\n >\n <line\n x1=\"0\"\n y1=\"0\"\n x2=\"0\"\n y2=\"10\"\n style={{ stroke: 'rgba(255,0,0,0.5)', strokeWidth: 10 }}\n />\n </pattern>\n </defs>\n <circle cx=\"0\" cy=\"0\" r={radius} fill=\"#ffb4b4\" />\n <circle cx=\"0\" cy=\"0\" r={radius} fill=\"url(#diagonalHatch)\" />\n <text\n x=\"0\"\n y=\"0\"\n transform=\"rotate(90 0 0)\"\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n >\n {String(error)}\n </text>\n </g>\n )\n})\n\nexport default DisplayError\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\n// locals\nimport Loading from './Loading'\nimport DisplayError from './DisplayError'\n\nconst BaseChordDisplay = observer(function ({\n display,\n}: {\n display: {\n filled: boolean\n error: unknown\n reactElement: React.ReactElement\n renderProps: { radius: number }\n }\n}) {\n if (display.error) {\n return <DisplayError model={display} />\n }\n if (!display.filled) {\n return <Loading model={display} />\n }\n\n return display.reactElement\n})\n\nexport default BaseChordDisplay\n","import clone from 'clone'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { getSession, getContainingView } from '@jbrowse/core/util'\nimport { CircularViewModel } from '../../CircularView/models/model'\n\nexport function renderReactionData(self: any) {\n const view = getContainingView(self) as CircularViewModel\n const { rendererType } = self\n const { rpcManager } = getSession(view)\n\n return {\n rendererType,\n rpcManager,\n renderProps: self.renderProps(),\n renderArgs: {\n assemblyName: view.displayedRegions[0]!.assemblyName,\n adapterConfig: clone(self.adapterConfig),\n rendererType: rendererType.name,\n regions: clone(view.displayedRegions),\n blockDefinitions: self.blockDefinitions,\n sessionId: getRpcSessionId(self),\n timeout: 1000000,\n },\n }\n}\n\nexport async function renderReactionEffect(\n props: any,\n signal: AbortSignal | undefined,\n self: any,\n) {\n if (!props) {\n throw new Error('cannot render with no props')\n }\n\n const {\n rendererType,\n rpcManager,\n cannotBeRenderedReason,\n renderArgs,\n renderProps,\n exportSVG,\n } = props\n\n if (cannotBeRenderedReason) {\n return { message: cannotBeRenderedReason }\n }\n\n // don't try to render 0 or NaN radius or no regions\n if (!renderProps.radius || !renderArgs.regions?.length) {\n return { message: 'Skipping render' }\n }\n\n // check renderertype compatibility\n if (!self.isCompatibleWithRenderer(rendererType)) {\n throw new Error(\n `renderer ${rendererType.name} is not compatible with this display type`,\n )\n }\n\n const { html, ...data } = await rendererType.renderInClient(rpcManager, {\n ...renderArgs,\n ...renderProps,\n exportSVG,\n })\n\n return {\n html,\n data,\n reactElement: data.reactElement,\n renderingComponent: rendererType.ReactComponent,\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BaseChordDisplay\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst baseChordDisplayConfig = ConfigurationSchema(\n 'BaseChordDisplay',\n {\n /**\n * #slot\n */\n onChordClick: {\n type: 'boolean',\n description:\n 'callback that should be run when a chord in the track is clicked',\n defaultValue: false,\n contextVariable: ['feature', 'track', 'pluginManager'],\n },\n },\n {\n /**\n * #identifier\n */\n explicitIdentifier: 'displayId',\n },\n)\n\nexport { baseChordDisplayConfig }\n","import React from 'react'\nimport clone from 'clone'\nimport { getParent, isAlive, types } from 'mobx-state-tree'\n\n// jbrowse\nimport { ConfigurationReference, getConf } from '@jbrowse/core/configuration'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'\nimport CircularChordRendererType from '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType'\nimport RendererType from '@jbrowse/core/pluggableElementTypes/renderers/RendererType'\nimport {\n getContainingView,\n getSession,\n getEnv,\n isFeature,\n makeAbortableReaction,\n AnyReactComponentType,\n Feature,\n ReactRendering,\n} from '@jbrowse/core/util'\nimport {\n getParentRenderProps,\n getRpcSessionId,\n getTrackAssemblyNames,\n} from '@jbrowse/core/util/tracks'\n\n// locals\nimport { renderReactionData, renderReactionEffect } from './renderReaction'\nimport {\n CircularViewModel,\n ExportSvgOptions,\n} from '../../CircularView/models/model'\nimport { ThemeOptions } from '@mui/material'\nimport { baseChordDisplayConfig } from './configSchema'\n\n/**\n * #stateModel BaseChordDisplay\n * extends\n * - [BaseDisplay](../basedisplay)\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport const BaseChordDisplayModel = types\n .compose(\n 'BaseChordDisplay',\n BaseDisplay,\n types.model({\n /**\n * #property\n */\n bezierRadiusRatio: 0.1,\n /**\n * #property\n */\n assemblyName: types.maybe(types.string),\n /**\n * #property\n */\n configuration: ConfigurationReference(baseChordDisplayConfig),\n }),\n )\n .volatile(() => ({\n // NOTE: all this volatile stuff has to be filled in at once\n // so that it stays consistent\n filled: false,\n reactElement: undefined as React.ReactElement | undefined,\n data: undefined,\n html: undefined as string | undefined,\n message: '',\n renderingComponent: undefined as undefined | AnyReactComponentType,\n refNameMap: undefined as Record<string, string> | undefined,\n }))\n .actions(self => {\n const { pluginManager } = getEnv(self)\n const track = self\n return {\n /**\n * #action\n */\n onChordClick(feature: Feature) {\n getConf(self, 'onChordClick', { feature, track, pluginManager })\n },\n }\n })\n .views(self => ({\n /**\n * #getter\n */\n get blockDefinitions() {\n const view = getContainingView(self) as CircularViewModel\n const origSlices = view.staticSlices\n if (!self.refNameMap) {\n return origSlices\n }\n\n const slices = clone(origSlices)\n\n slices.forEach(slice => {\n const regions = slice.region.elided\n ? slice.region.regions\n : [slice.region]\n regions.forEach(region => {\n const renamed = self.refNameMap?.[region.refName]\n if (renamed && region.refName !== renamed) {\n region.refName = renamed\n }\n })\n })\n return slices\n },\n\n /**\n * #method\n */\n renderProps() {\n const view = getContainingView(self) as CircularViewModel\n return {\n ...getParentRenderProps(self),\n rpcDriverName: self.rpcDriverName,\n bezierRadius: view.radiusPx * self.bezierRadiusRatio,\n radius: view.radiusPx,\n blockDefinitions: this.blockDefinitions,\n onChordClick: self.onChordClick,\n }\n },\n\n /**\n * #getter\n * the pluggable element type object for this display's renderer\n */\n get rendererType() {\n return getEnv(self).pluginManager.getRendererType(self.rendererTypeName)\n },\n\n /**\n * #method\n */\n isCompatibleWithRenderer(renderer: RendererType) {\n return !!(renderer instanceof CircularChordRendererType)\n },\n\n /**\n * #getter\n * returns a string feature ID if the globally-selected object\n * is probably a feature\n */\n get selectedFeatureId() {\n if (!isAlive(self)) {\n return undefined\n }\n const session = getSession(self)\n const { selection } = session\n // does it quack like a feature?\n if (isFeature(selection)) {\n return selection.id()\n }\n return undefined\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n renderStarted() {\n self.filled = false\n self.message = ''\n self.reactElement = undefined\n self.data = undefined\n self.html = undefined\n self.error = undefined\n self.renderingComponent = undefined\n },\n /**\n * #action\n */\n renderSuccess({\n message,\n data,\n reactElement,\n html,\n renderingComponent,\n }: {\n message: string\n data: any\n html: string\n reactElement: React.ReactElement\n renderingComponent: AnyReactComponentType\n }) {\n if (message) {\n self.filled = false\n self.message = message\n self.reactElement = undefined\n self.data = undefined\n self.html = undefined\n self.error = undefined\n self.renderingComponent = undefined\n } else {\n self.filled = true\n self.message = ''\n self.reactElement = reactElement\n self.data = data\n self.html = html\n self.error = undefined\n self.renderingComponent = renderingComponent\n }\n },\n /**\n * #action\n */\n renderError(error: unknown) {\n console.error(error)\n // the rendering failed for some reason\n self.filled = false\n self.message = ''\n self.reactElement = undefined\n self.html = undefined\n self.data = undefined\n self.error = error\n self.renderingComponent = undefined\n },\n\n /**\n * #action\n */\n setRefNameMap(refNameMap: Record<string, string>) {\n self.refNameMap = refNameMap\n },\n }))\n .actions(self => ({\n afterAttach() {\n makeAbortableReaction(\n self,\n renderReactionData,\n\n // @ts-expect-error\n renderReactionEffect,\n {\n name: `${self.type} ${self.id} rendering`,\n // delay: self.renderDelay || 300,\n fireImmediately: true,\n },\n self.renderStarted,\n self.renderSuccess,\n self.renderError,\n )\n\n makeAbortableReaction(\n self,\n () => ({\n assemblyNames: getTrackAssemblyNames(self.parentTrack),\n\n adapter: getConf(getParent<any>(self, 2), 'adapter'),\n assemblyManager: getSession(self).assemblyManager,\n }),\n\n async ({ assemblyNames, adapter, assemblyManager }: any, signal) => {\n return assemblyManager.getRefNameMapForAdapter(\n adapter,\n assemblyNames[0],\n { signal, sessionId: getRpcSessionId(self) },\n )\n },\n {\n name: `${self.type} ${self.id} getting refNames`,\n fireImmediately: true,\n },\n () => {},\n refNameMap => {\n self.setRefNameMap(refNameMap)\n },\n error => {\n console.error(error)\n self.setError(error)\n },\n )\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n async renderSvg(\n opts: ExportSvgOptions & {\n theme?: ThemeOptions\n },\n ) {\n const data = renderReactionData(self)\n const rendering = await renderReactionEffect(\n {\n ...data,\n exportSVG: opts,\n theme: opts.theme || data.renderProps.theme,\n },\n undefined,\n self,\n )\n return <ReactRendering rendering={rendering} />\n },\n }))\n","import { AbstractSessionModel, isAbstractMenuManager } from '@jbrowse/core/util'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\n\n// locals\n\nimport CircularViewF from './CircularView'\nimport LaunchCircularViewF from './LaunchCircularView'\n\n// icons\nimport DataUsageIcon from '@mui/icons-material/DataUsage'\n\nexport default class CircularViewPlugin extends Plugin {\n name = 'CircularViewPlugin'\n\n install(pluginManager: PluginManager) {\n CircularViewF(pluginManager)\n LaunchCircularViewF(pluginManager)\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToSubMenu(['Add'], {\n label: 'Circular view',\n icon: DataUsageIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('CircularView', {})\n },\n })\n }\n }\n}\n\nexport {\n baseChordDisplayConfig,\n BaseChordDisplayModel,\n BaseChordDisplayComponent,\n} from './BaseChordDisplay'\n\nexport {\n type CircularViewModel,\n type CircularViewStateModel,\n} from './CircularView/models/model'\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\nimport stateModelFactory from './models/model'\n\nexport default function CircularViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(\n () =>\n new ViewType({\n ReactComponent: lazy(() => import('./components/CircularView')),\n stateModel: stateModelFactory(pluginManager),\n name: 'CircularView',\n displayName: 'Circular view',\n }),\n )\n}\n","import { when } from 'mobx'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport { CircularViewModel } from '../CircularView/models/model'\n\ntype CGV = CircularViewModel\n\nexport default function LaunchCircularViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-CircularView',\n // @ts-expect-error\n async ({\n session,\n assembly,\n tracks = [],\n }: {\n session: AbstractSessionModel\n assembly?: string\n loc: string\n tracks?: string[]\n }) => {\n const { assemblyManager } = session\n const view = session.addView('CircularView', {}) as CGV\n\n await when(() => view.initialized)\n\n if (!assembly) {\n throw new Error(\n 'No assembly provided when launching circular genome view',\n )\n }\n\n const asm = await assemblyManager.waitForAssembly(assembly)\n if (!asm) {\n throw new Error(\n `Assembly \"${assembly}\" not found when launching circular genome view`,\n )\n }\n\n view.setDisplayedRegions(asm.regions || [])\n\n tracks.forEach(track => {\n view.showTrack(track)\n })\n },\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { InputLabel, TextField } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// fontSize and fontFamily have to match between Editor and SyntaxHighlighter\nconst fontSize = '12px'\n// Optimize by using system default fonts: https://css-tricks.com/snippets/css/font-stacks/\nconst fontFamily =\n 'Consolas, \"Andale Mono WT\", \"Andale Mono\", \"Lucida Console\", \"Lucida Sans Typewriter\", \"DejaVu Sans Mono\", \"Bitstream Vera Sans Mono\", \"Liberation Mono\", \"Nimbus Mono L\", Monaco, \"Courier New\", Courier, monospace'\n\nconst useStyles = makeStyles()(theme => ({\n error: {\n color: 'red',\n fontSize: '0.8em',\n },\n callbackEditor: {\n fontFamily,\n fontSize,\n background: theme.palette.background.default,\n width: 800,\n marginTop: '16px',\n border: '1px solid rgba(0,0,0,0.42)',\n },\n callbackContainer: {\n width: '100%',\n overflowX: 'auto',\n },\n textAreaFont: {\n fontFamily,\n },\n}))\n\nconst JsonEditor = observer(function JsonEditor({\n slot,\n}: {\n slot: {\n name: string\n description: string\n value: unknown\n set: (arg: unknown) => void\n }\n}) {\n const { classes } = useStyles()\n const [contents, setContents] = useState(JSON.stringify(slot.value, null, 2))\n const [error, setError] = useState<unknown>()\n\n useEffect(() => {\n try {\n setError(undefined)\n slot.set(JSON.parse(contents))\n } catch (e) {\n console.error({ e })\n setError(e)\n }\n }, [contents, slot])\n\n return (\n <>\n {error ? <p className={classes.error}>{`${error}`}</p> : null}\n <div className={classes.callbackContainer}>\n <InputLabel shrink htmlFor=\"json-editor\">\n {slot.name}\n </InputLabel>\n <TextField\n id=\"json-editor\"\n className={classes.callbackEditor}\n value={contents}\n helperText={slot.description}\n multiline\n onChange={event => {\n setContents(event.target.value)\n }}\n style={{ background: error ? '#fdd' : undefined }}\n InputProps={{\n classes: {\n input: classes.textAreaFont,\n },\n }}\n />\n </div>\n </>\n )\n})\n\nexport default JsonEditor\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config FromConfigAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'FromConfigAdapter',\n {\n /**\n * #slot\n */\n features: {\n type: 'frozen',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true, implicitIdentifier: 'adapterId' },\n)\n\nexport default configSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n/**\n * #config FromConfigRegionsAdapter\n * used for specifying refNames+sizes of an assembly\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst regionsConfigSchema = ConfigurationSchema(\n 'FromConfigRegionsAdapter',\n {\n /**\n * #slot\n */\n features: {\n type: 'frozen',\n defaultValue: [],\n },\n },\n {\n explicitlyTyped: true,\n implicitIdentifier: 'adapterId',\n },\n)\nexport default regionsConfigSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n/**\n * #config FromConfigSequenceAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst sequenceConfigSchema = ConfigurationSchema(\n 'FromConfigSequenceAdapter',\n {\n /**\n * #slot\n */\n features: {\n type: 'frozen',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true, implicitIdentifier: 'adapterId' },\n)\n\nexport default sequenceConfigSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config RefNameAliasAdapter\n * can read \"chromAliases\" type files from UCSC or any tab separated file of\n * refName aliases\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst RefNameAliasAdapter = ConfigurationSchema(\n 'RefNameAliasAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my/aliases.txt',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n * by default, the \"ref names that match the fasta\" are assumed to be in the\n * first column (0), change this variable if needed\n */\n refNameColumn: {\n type: 'number',\n defaultValue: 0,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default RefNameAliasAdapter\n","import { types } from 'mobx-state-tree'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function stateModelFactory(pluginManager: PluginManager) {\n return types\n .model('ConfigurationEditorWidget', {\n id: ElementId,\n type: types.literal('ConfigurationEditorWidget'),\n // If you add different types of targets, don't forget to account for that\n // in the key of ./components/ConfigurationEditor.js\n target: types.safeReference(\n pluginManager.pluggableConfigSchemaType('track'),\n ),\n })\n .actions(self => ({\n setTarget(newTarget: any) {\n self.target = newTarget\n },\n }))\n}\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { isStateTreeNode, getType } from 'mobx-state-tree'\n\nconst HeadingComponent = observer(function ({\n model,\n}: {\n model?: {\n target: {\n type: string\n }\n }\n}) {\n if (model?.target) {\n if (model.target.type) {\n return `${model.target.type} settings`\n }\n if (isStateTreeNode(model.target)) {\n const type = getType(model.target)\n if (type.name) {\n return `${type.name.replace('ConfigurationSchema', '')} settings`\n }\n }\n }\n return <>Settings</>\n})\n\nexport default HeadingComponent\n","import { lazy } from 'react'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport stateModelFactory from './model'\nimport HeadingComponent from './components/HeadingComponent'\n\nconst configSchema = ConfigurationSchema('ConfigurationEditorWidget', {})\n\nconst LazyConfigurationEditorComponent = lazy(\n () => import('./components/ConfigurationEditor'),\n)\n\nexport default function registerConfigurationEditorWidget(\n pluginManager: PluginManager,\n) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'ConfigurationEditorWidget',\n HeadingComponent,\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: LazyConfigurationEditorComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config NcbiSequenceReportAliasAdapter\n * can read \"sequence_report.tsv\" type files from NCBI\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst NcbiSequenceReportAliasAdapterConfigSchema = ConfigurationSchema(\n 'NcbiSequenceReportAliasAdapter',\n {\n /**\n * #slot\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my/sequence_report.tsv',\n locationType: 'UriLocation',\n },\n },\n\n useUcscNameOverride: {\n type: 'boolean',\n defaultValue: true,\n description:\n 'forces usage of the UCSC names over the NCBI style names from a FASTA',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default NcbiSequenceReportAliasAdapterConfigSchema\n","import { lazy } from 'react'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport FromConfigAdapterF from './FromConfigAdapter'\nimport FromConfigRegionsAdapterF from './FromConfigRegionsAdapter'\nimport FromConfigSequenceAdapterF from './FromConfigSequenceAdapter'\nimport RefNameAliasAdapterF from './RefNameAliasAdapter'\nimport ConfigurationEditorWidgetF from './ConfigurationEditorWidget'\nimport NcbiSequenceReportAliasAdapterF from './NcbiSequenceReportAliasAdapter'\n\nconst LazyConfigurationEditorComponent = lazy(\n () => import('./ConfigurationEditorWidget/components/ConfigurationEditor'),\n)\n\nexport default class ConfigurationPlugin extends Plugin {\n name = 'ConfigurationPlugin'\n\n install(pluginManager: PluginManager) {\n FromConfigAdapterF(pluginManager)\n FromConfigRegionsAdapterF(pluginManager)\n FromConfigSequenceAdapterF(pluginManager)\n RefNameAliasAdapterF(pluginManager)\n ConfigurationEditorWidgetF(pluginManager)\n NcbiSequenceReportAliasAdapterF(pluginManager)\n }\n}\n\nexport { default as JsonEditor } from './ConfigurationEditorWidget/components/JsonEditor'\n\nexport { LazyConfigurationEditorComponent as ConfigurationEditor }\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\n\nexport default function FromConfigAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'FromConfigAdapter',\n configSchema,\n getAdapterClass: () =>\n import('./FromConfigAdapter').then(r => r.default),\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n }),\n )\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\n\nexport default function FromConfigRegionsAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'FromConfigRegionsAdapter',\n configSchema,\n getAdapterClass: () =>\n import('./FromConfigRegionsAdapter').then(r => r.default),\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n }),\n )\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport configSchema from './configSchema'\n\nexport default function FromConfigSequenceAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'FromConfigSequenceAdapter',\n configSchema,\n getAdapterClass: () =>\n import('./FromConfigSequenceAdapter').then(r => r.default),\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n }),\n )\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport configSchema from './configSchema'\n\nexport default function RefNameAliasAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'RefNameAliasAdapter',\n configSchema,\n getAdapterClass: () =>\n import('./RefNameAliasAdapter').then(r => r.default),\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n }),\n )\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport configSchema from './configSchema'\n\nexport default function NcbiSequenceReportAliasAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(() => {\n return new AdapterType({\n name: 'NcbiSequenceReportAliasAdapter',\n configSchema,\n getAdapterClass: () =>\n import('./NcbiSequenceReportAliasAdapter').then(r => r.default),\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n })\n })\n}\n","import { types } from 'mobx-state-tree'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\n\nexport default types.model('AddConnectionModel', {\n id: ElementId,\n type: types.literal('AddConnectionWidget'),\n})\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { lazy } from 'react'\n\nimport stateModel from './model'\nconst configSchema = ConfigurationSchema('AddConnectionWidget', {})\n\nexport default function AddConnectionWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'AddConnectionWidget',\n heading: 'Add a connection',\n configSchema,\n stateModel,\n ReactComponent: lazy(() => import('./components/AddConnectionWidget')),\n })\n })\n}\n","import { types, Instance } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n guessAdapter,\n guessTrackType,\n getFileName,\n UNSUPPORTED,\n} from '@jbrowse/core/util/tracks'\n\nfunction isAbsoluteUrl(url = '') {\n try {\n new URL(url)\n return true\n } catch (error) {\n return url.startsWith('/')\n }\n}\ninterface IndexingAttr {\n attributes: string[]\n exclude: string[]\n}\n\n/**\n * #stateModel AddTrackModel\n */\nexport default function f(pluginManager: PluginManager) {\n return types\n .model('AddTrackModel', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('AddTrackWidget'),\n /**\n * #property\n */\n view: types.safeReference(\n pluginManager.pluggableMstType('view', 'stateModel'),\n ),\n })\n .volatile(() => ({\n trackSource: 'fromFile',\n trackData: undefined as FileLocation | undefined,\n indexTrackData: undefined as FileLocation | undefined,\n\n // alts\n altAssemblyName: '',\n altTrackName: '',\n altTrackType: '',\n\n adapterHint: '',\n textIndexTrack: true,\n textIndexingConf: undefined as IndexingAttr | undefined,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setAdapterHint(obj: string) {\n self.adapterHint = obj\n },\n /**\n * #action\n */\n setTrackSource(str: string) {\n self.trackSource = str\n },\n /**\n * #action\n */\n setTextIndexingConf(conf: IndexingAttr) {\n self.textIndexingConf = conf\n },\n /**\n * #action\n */\n setTextIndexTrack(flag: boolean) {\n self.textIndexTrack = flag\n },\n /**\n * #action\n */\n setTrackData(obj: FileLocation) {\n self.trackData = obj\n },\n /**\n * #action\n */\n setIndexTrackData(obj: FileLocation) {\n self.indexTrackData = obj\n },\n /**\n * #action\n */\n setAssembly(str: string) {\n self.altAssemblyName = str\n },\n /**\n * #action\n */\n setTrackName(str: string) {\n self.altTrackName = str\n },\n /**\n * #action\n */\n setTrackType(str: string) {\n self.altTrackType = str\n },\n /**\n * #action\n */\n clearData() {\n self.trackSource = ''\n self.altTrackName = ''\n self.altTrackType = ''\n self.altAssemblyName = ''\n self.adapterHint = ''\n self.indexTrackData = undefined\n self.trackData = undefined\n self.textIndexingConf = undefined\n self.textIndexTrack = true\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get trackAdapter() {\n const { trackData, indexTrackData, adapterHint } = self\n\n return trackData\n ? guessAdapter(trackData, indexTrackData, adapterHint, self)\n : undefined\n },\n\n /**\n * #getter\n */\n get trackName() {\n return (\n self.altTrackName ||\n (self.trackData ? getFileName(self.trackData) : '')\n )\n },\n\n /**\n * #getter\n */\n get isFtp() {\n const { trackData: track, indexTrackData: index } = self\n return !!(\n // @ts-expect-error\n (index?.uri?.startsWith('ftp://') || track?.uri?.startsWith('ftp://'))\n )\n },\n\n /**\n * #getter\n */\n get isRelativeTrackUrl() {\n // @ts-expect-error\n const uri = self.trackData?.uri\n return uri ? !isAbsoluteUrl(uri) : false\n },\n /**\n * #getter\n */\n get isRelativeIndexUrl() {\n // @ts-expect-error\n const uri = self.indexTrackData?.uri\n return uri ? !isAbsoluteUrl(uri) : false\n },\n /**\n * #getter\n */\n get isRelativeUrl() {\n return this.isRelativeIndexUrl || this.isRelativeTrackUrl\n },\n\n /**\n * #getter\n */\n get trackHttp() {\n // @ts-expect-error\n return self.trackData?.uri?.startsWith('http://')\n },\n /**\n * #getter\n */\n get indexHttp() {\n // @ts-expect-error\n return self.indexTrackData?.uri?.startsWith('http://')\n },\n\n /**\n * #getter\n */\n get wrongProtocol() {\n return (\n window.location.protocol === 'https:' &&\n (this.trackHttp || this.indexHttp)\n )\n },\n\n /**\n * #getter\n */\n get unsupported() {\n return this.trackAdapter?.type === UNSUPPORTED\n },\n\n /**\n * #getter\n */\n get assembly() {\n return self.altAssemblyName || self.view.assemblyNames?.[0]\n },\n\n /**\n * #getter\n */\n get trackType() {\n return (\n self.altTrackType ||\n (this.trackAdapter\n ? guessTrackType(this.trackAdapter.type, self)\n : '')\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get warningMessage() {\n if (self.isFtp) {\n return 'Warning: JBrowse cannot access files using the ftp protocol'\n } else if (self.isRelativeUrl) {\n return `Warning: one or more of your files do not provide the protocol e.g.\n https://, please provide an absolute URL unless you are sure a\n relative URL is intended.`\n } else if (self.wrongProtocol) {\n return `Warning: You entered a http:// resources but we cannot access HTTP\n resources from JBrowse when it is running on https. Please use an\n https URL for your track, or access the JBrowse app from the http\n protocol`\n }\n return ''\n },\n }))\n}\n\nexport type AddTrackStateModel = ReturnType<typeof f>\nexport type AddTrackModel = Instance<AddTrackStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { lazy } from 'react'\n\nimport stateModelFactory from './model'\nconst configSchema = ConfigurationSchema('AddTrackWidget', {})\n\nexport default function AddTrackWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'AddTrackWidget',\n heading: 'Add a track',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/AddTrackWidget')),\n })\n })\n}\n","export interface Row {\n id: string\n metadata?: Record<string, unknown>\n [key: string]: unknown\n}\n\nexport function getRowStr(facet: string, row: Row) {\n return `${\n (facet.startsWith('metadata.')\n ? row.metadata?.[facet.replace('metadata.', '')]\n : row[facet]) || ''\n }`\n}\n","import {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\n\nexport function hasAnyOverlap<T>(a1: T[] = [], a2: T[] = []) {\n // shortcut case is that arrays are single entries, and are equal\n // long case is that we use a set\n if (a1[0] === a2[0]) {\n return true\n } else {\n const s1 = new Set(a1)\n return a2.some(a => s1.has(a))\n }\n}\n\nexport function hasAllOverlap<T>(a1: T[] = [], a2: T[] = []) {\n const s1 = new Set(a1)\n return a2.every(a => s1.has(a))\n}\n\nexport function matches(\n query: string,\n conf: AnyConfigurationModel,\n session: AbstractSessionModel,\n) {\n const categories = (readConfObject(conf, 'category') || []) as string[]\n const queryLower = query.toLowerCase()\n return (\n getTrackName(conf, session).toLowerCase().includes(queryLower) ||\n !!categories.filter(c => c.toLowerCase().includes(queryLower)).length\n )\n}\n\ninterface Node {\n children: Node[]\n id: string\n}\n\nexport function findSubCategories(obj: Node[], paths: string[], depth = 0) {\n let hasSubs = false\n for (const elt of obj) {\n if (elt.children.length) {\n const hasSubCategories = findSubCategories(elt.children, paths, depth + 1)\n // avoid pushing the root \"Tracks\" node by checking depth>0\n if (hasSubCategories && depth > 0) {\n paths.push(elt.id)\n }\n } else {\n hasSubs = true\n }\n }\n return hasSubs\n}\n\nexport function findTopLevelCategories(obj: Node[], paths: string[]) {\n for (const elt of obj) {\n if (elt.children.length) {\n paths.push(elt.id)\n }\n }\n}\n","import {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { getEnv, getSession, notEmpty } from '@jbrowse/core/util'\nimport { hasAllOverlap, hasAnyOverlap } from './util'\n\nexport function filterTracks(\n tracks: AnyConfigurationModel[],\n self: {\n view?: {\n type: string\n trackSelectorAnyOverlap?: boolean\n }\n assemblyNames: string[]\n },\n) {\n const { assemblyManager } = getSession(self)\n const { pluginManager } = getEnv(self)\n const { view } = self\n\n if (!view) {\n return []\n }\n const trackListAssemblies = self.assemblyNames\n .map(a => assemblyManager.get(a))\n .filter(notEmpty)\n return tracks\n .filter(c => {\n const trackAssemblyNames = readConfObject(c, 'assemblyNames') as\n | string[]\n | undefined\n const trackAssemblies = trackAssemblyNames\n ?.map(name => assemblyManager.get(name))\n .filter(notEmpty)\n return view.trackSelectorAnyOverlap\n ? hasAnyOverlap(trackAssemblies, trackListAssemblies)\n : hasAllOverlap(trackAssemblies, trackListAssemblies)\n })\n .filter(c => {\n const { displayTypes } = pluginManager.getViewType(view.type)!\n const compatDisplays = displayTypes.map(d => d.name)\n const trackDisplays = c.displays.map((d: { type: string }) => d.type)\n return hasAnyOverlap(compatDisplays, trackDisplays)\n })\n}\n","import {\n readConfObject,\n AnyConfigurationModel,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\n\n// locals\nimport { matches } from './util'\nimport { MenuItem } from '@jbrowse/core/ui'\n\nfunction sortConfs(\n confs: AnyConfigurationModel[],\n sortNames: boolean,\n sortCategories: boolean,\n) {\n // uses readConfObject instead of getTrackName so that the undefined\n // reference sequence track is sorted to the top\n const ret = confs.map(c => [\n c,\n readConfObject(c, 'name'),\n readConfObject(c, 'category')?.[0] || '',\n readConfObject(c, 'category')?.[1] || '',\n readConfObject(c, 'category')?.[2] || '',\n ])\n if (sortNames) {\n ret.sort((a, b) => a[1].localeCompare(b[1]))\n }\n if (sortCategories) {\n // sort up to three sub-category levels, harder to code it to go deeper\n // than this and likely rarely used\n ret.sort((a, b) => {\n if (a[2] !== b[2]) {\n return a[2].localeCompare(b[2])\n } else if (a[3] !== b[3]) {\n return a[3].localeCompare(b[3])\n } else if (a[4] !== b[4]) {\n return a[4].localeCompare(b[4])\n }\n return 0\n })\n }\n return ret.map(a => a[0])\n}\n\nexport interface TreeTrackNode {\n name: string\n id: string\n trackId: string\n conf: AnyConfigurationModel\n checked: boolean\n children: TreeNode[] // empty\n type: 'track'\n}\n\nexport interface TreeCategoryNode {\n name: string\n id: string\n isOpenByDefault: boolean\n children: TreeNode[]\n type: 'category'\n}\n\nexport type TreeNode = TreeTrackNode | TreeCategoryNode\n\nexport function generateHierarchy({\n model,\n trackConfs,\n extra,\n noCategories,\n menuItems,\n}: {\n model: {\n filterText: string\n activeSortTrackNames: boolean\n activeSortCategories: boolean\n collapsed: Map<string | number, boolean>\n view?: {\n tracks: { configuration: AnyConfigurationModel }[]\n }\n }\n noCategories?: boolean\n menuItems?: MenuItem[]\n trackConfs: AnyConfigurationModel[]\n extra?: string\n}): TreeNode[] {\n const hierarchy = { children: [] as TreeNode[] } as TreeNode\n const {\n collapsed,\n filterText,\n activeSortTrackNames,\n activeSortCategories,\n view,\n } = model\n if (!view) {\n return []\n }\n const session = getSession(model)\n const viewTracks = view.tracks\n const confs = trackConfs.filter(conf => matches(filterText, conf, session))\n\n // uses getConf\n for (const conf of sortConfs(\n confs,\n activeSortTrackNames,\n activeSortCategories,\n )) {\n // copy the categories since this array can be mutated downstream\n const categories = [...(readConfObject(conf, 'category') || [])]\n\n // hack where if trackId ends with sessionTrack, then push it to a\n // category that starts with a space to force sort to the top\n if (conf.trackId.endsWith('sessionTrack')) {\n categories.unshift(' Session tracks')\n }\n\n let currLevel = hierarchy\n\n if (!noCategories) {\n // find existing category to put track into or create it\n for (let i = 0; i < categories.length; i++) {\n const category = categories[i]\n const ret = currLevel.children.find(c => c.name === category)\n const id = [extra, categories.slice(0, i + 1).join(',')]\n .filter(f => !!f)\n .join('-')\n if (!ret) {\n const n = {\n children: [],\n name: category,\n id,\n isOpenByDefault: !collapsed.get(id),\n menuItems,\n type: 'category' as const,\n }\n currLevel.children.push(n)\n currLevel = n\n } else {\n currLevel = ret\n }\n }\n }\n\n // uses splice to try to put all leaf nodes above \"category nodes\" if you\n // change the splice to a simple push and open\n // test_data/test_order/config.json you will see the weirdness\n const r = currLevel.children.findIndex(elt => elt.children.length)\n const idx = r === -1 ? currLevel.children.length : r\n currLevel.children.splice(idx, 0, {\n id: [extra, conf.trackId].filter(f => !!f).join(','),\n trackId: conf.trackId,\n name: getTrackName(conf, session),\n conf,\n checked: viewTracks.some(f => f.configuration === conf),\n children: [],\n type: 'track' as const,\n })\n }\n\n return hierarchy.children\n}\n","export function findNonSparseKeys(\n keys: readonly string[],\n rows: Record<string, unknown>[],\n cb: (row: Record<string, unknown>, f: string) => unknown,\n) {\n return keys.filter(f => rows.map(r => cb(r, f)).filter(f => !!f).length > 5)\n}\n\nexport function getRootKeys(obj: Record<string, unknown>) {\n return Object.entries(obj)\n .map(([key, val]) => (typeof val === 'string' ? key : ''))\n .filter(f => !!f)\n}\n","import { Instance, addDisposer, getParent, types } from 'mobx-state-tree'\nimport { matches } from './util'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\nimport { getSession, localStorageGetItem } from '@jbrowse/core/util'\nimport { autorun, observable } from 'mobx'\nimport { getRootKeys, findNonSparseKeys } from './facetedUtil'\nimport { getRowStr } from './components/faceted/util'\n\nconst nonMetadataKeys = ['category', 'adapter', 'description'] as const\n\n/**\n * #stateModel FacetedModel\n */\nexport function facetedStateTreeF() {\n return types\n .model('FacetedModel', {\n /**\n * #property\n */\n filterText: types.optional(types.string, ''),\n /**\n * #property\n */\n showSparse: types.optional(types.boolean, () =>\n JSON.parse(localStorageGetItem('facet-showSparse') || 'false'),\n ),\n /**\n * #property\n */\n showFilters: types.optional(types.boolean, () =>\n JSON.parse(localStorageGetItem('facet-showFilters') || 'true'),\n ),\n\n /**\n * #property\n */\n showOptions: types.optional(types.boolean, () =>\n JSON.parse(localStorageGetItem('facet-showTableOptions') || 'false'),\n ),\n\n /**\n * #property\n */\n panelWidth: types.optional(types.number, () =>\n JSON.parse(localStorageGetItem('facet-panelWidth') || '400'),\n ),\n })\n .volatile(() => ({\n visible: {} as Record<string, boolean>,\n useShoppingCart: false,\n filters: observable.map<string, string[]>(),\n }))\n .actions(self => ({\n /**\n * #action\n */\n setFilter(key: string, value: string[]) {\n self.filters.set(key, value)\n },\n /**\n * #action\n */\n setPanelWidth(width: number) {\n self.panelWidth = width\n return self.panelWidth\n },\n /**\n * #action\n */\n setUseShoppingCart(f: boolean) {\n self.useShoppingCart = f\n },\n /**\n * #action\n */\n setFilterText(str: string) {\n self.filterText = str\n },\n /**\n * #action\n */\n setShowSparse(f: boolean) {\n self.showSparse = f\n },\n /**\n * #action\n */\n setShowOptions(f: boolean) {\n self.showOptions = f\n },\n /**\n * #action\n */\n setShowFilters(f: boolean) {\n self.showFilters = f\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get allTrackConfigurations() {\n return getParent<{ allTrackConfigurations: AnyConfigurationModel[] }>(\n self,\n ).allTrackConfigurations\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get rows() {\n const session = getSession(self)\n const { allTrackConfigurations, filterText } = self\n return allTrackConfigurations\n .filter(conf => matches(filterText, conf, session))\n .map(track => {\n return {\n id: track.trackId as string,\n conf: track,\n name: getTrackName(track, session),\n category: readConfObject(track, 'category')?.join(', ') as string,\n adapter: readConfObject(track, 'adapter')?.type as string,\n description: readConfObject(track, 'description') as string,\n metadata: readConfObject(track, 'metadata') as Record<\n string,\n unknown\n >,\n } as const\n })\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get filteredNonMetadataKeys() {\n return self.showSparse\n ? nonMetadataKeys\n : findNonSparseKeys(nonMetadataKeys, self.rows, (r, f) => r[f])\n },\n /**\n * #getter\n */\n get metadataKeys() {\n return [...new Set(self.rows.flatMap(row => getRootKeys(row.metadata)))]\n },\n get filteredMetadataKeys() {\n return self.showSparse\n ? this.metadataKeys\n : findNonSparseKeys(\n this.metadataKeys,\n self.rows,\n // @ts-expect-error\n (r, f) => r.metadata[f],\n )\n },\n /**\n * #getter\n */\n get fields() {\n return [\n 'name',\n ...this.filteredNonMetadataKeys,\n ...this.filteredMetadataKeys.map(m => `metadata.${m}`),\n ]\n },\n /**\n * #getter\n */\n get filteredRows() {\n const arrFilters = [...self.filters.entries()]\n .filter(f => f[1].length > 0)\n .map(([key, val]) => [key, new Set(val)] as const)\n return self.rows.filter(row =>\n arrFilters.every(([key, val]) => val.has(getRowStr(key, row))),\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setVisible(args: Record<string, boolean>) {\n self.visible = args\n },\n\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n this.setVisible(Object.fromEntries(self.fields.map(c => [c, true])))\n }),\n )\n },\n }))\n}\n\nexport type FacetedStateModel = ReturnType<typeof facetedStateTreeF>\nexport type FacetedModel = Instance<FacetedStateModel>\n","import { types, addDisposer, Instance } from 'mobx-state-tree'\nimport { autorun, observable } from 'mobx'\nimport {\n getConf,\n readConfObject,\n AnyConfigurationModel,\n} from '@jbrowse/core/configuration'\nimport {\n dedupe,\n getSession,\n localStorageGetItem,\n localStorageSetItem,\n notEmpty,\n} from '@jbrowse/core/util'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport { filterTracks } from './filterTracks'\nimport { generateHierarchy } from './generateHierarchy'\nimport { findSubCategories, findTopLevelCategories } from './util'\nimport { facetedStateTreeF } from './facetedModel'\n\ntype MaybeAnyConfigurationModel = AnyConfigurationModel | undefined\n\ntype MaybeBoolean = boolean | undefined\n\ntype MaybeCollapsedKeys = [string, boolean][] | undefined\n\n// for settings that are config dependent\nfunction keyConfigPostFix() {\n return typeof window !== 'undefined'\n ? [\n window.location.pathname,\n new URLSearchParams(window.location.search).get('config'),\n ]\n .filter(f => !!f)\n .join('-')\n : 'empty'\n}\n\nfunction recentlyUsedK(assemblyNames: string[]) {\n return ['recentlyUsedTracks', keyConfigPostFix(), assemblyNames.join(',')]\n .filter(f => !!f)\n .join('-')\n}\n\n// this has a extra } at the end because that's how it was initially\n// released\nfunction favoritesK() {\n return `favoriteTracks-${keyConfigPostFix()}}`\n}\n\nfunction collapsedK(assemblyNames: string[], viewType: string) {\n return [\n 'collapsedCategories',\n keyConfigPostFix(),\n assemblyNames.join(','),\n viewType,\n ].join('-')\n}\n\nfunction sortTrackNamesK() {\n return 'sortTrackNames'\n}\n\nfunction sortCategoriesK() {\n return 'sortCategories'\n}\n\nfunction localStorageGetJSON<T>(key: string, defaultValue: T) {\n const val = localStorageGetItem(key)\n return val !== undefined && val !== null && val\n ? (JSON.parse(val) as T)\n : defaultValue\n}\n\nfunction localStorageSetJSON(key: string, val: unknown) {\n if (val !== undefined && val !== null) {\n localStorageSetItem(key, JSON.stringify(val))\n }\n}\n\nconst MAX_RECENTLY_USED = 10\n\n/**\n * #stateModel HierarchicalTrackSelectorWidget\n */\nexport default function stateTreeFactory(pluginManager: PluginManager) {\n return types\n .model('HierarchicalTrackSelectorWidget', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('HierarchicalTrackSelectorWidget'),\n\n /**\n * #property\n */\n view: types.safeReference(\n pluginManager.pluggableMstType('view', 'stateModel'),\n ),\n /**\n * #property\n */\n faceted: types.optional(facetedStateTreeF(), {}),\n })\n .volatile(() => ({\n /**\n * #volatile\n */\n favorites: localStorageGetJSON<string[]>(favoritesK(), []),\n /**\n * #volatile\n */\n recentlyUsed: [] as string[],\n /**\n * #volatile\n */\n selection: [] as AnyConfigurationModel[],\n /**\n * #volatile\n */\n sortTrackNames: localStorageGetJSON<MaybeBoolean>(\n sortTrackNamesK(),\n undefined,\n ),\n /**\n * #volatile\n */\n sortCategories: localStorageGetJSON<MaybeBoolean>(\n sortCategoriesK(),\n undefined,\n ),\n /**\n * #volatile\n */\n collapsed: observable.map<string, boolean>(),\n /**\n * #volatile\n */\n filterText: '',\n /**\n * #volatile\n */\n recentlyUsedCounter: 0,\n /**\n * #volatile\n */\n favoritesCounter: 0,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get shownTrackIds() {\n return new Set<string>(\n self.view?.tracks?.map(\n (t: { configuration: { trackId: string } }) =>\n t.configuration.trackId,\n ),\n )\n },\n /**\n * #getter\n */\n get selectionSet() {\n return new Set(self.selection)\n },\n /**\n * #getter\n */\n get favoritesSet() {\n return new Set(self.favorites)\n },\n /**\n * #getter\n */\n get recentlyUsedSet() {\n return new Set(self.recentlyUsed)\n },\n /**\n * #getter\n */\n get assemblyNames(): string[] {\n return self.view?.assemblyNames || []\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setSortTrackNames(val: boolean) {\n self.sortTrackNames = val\n },\n /**\n * #action\n */\n setSortCategories(val: boolean) {\n self.sortCategories = val\n },\n /**\n * #action\n */\n setSelection(elt: AnyConfigurationModel[]) {\n self.selection = elt\n },\n /**\n * #action\n */\n addToSelection(elt: AnyConfigurationModel[]) {\n self.selection = dedupe([...self.selection, ...elt], e => e.trackId)\n },\n /**\n * #action\n */\n removeFromSelection(elt: AnyConfigurationModel[]) {\n const s = new Set(elt)\n self.selection = self.selection.filter(f => !s.has(f))\n },\n /**\n * #action\n */\n clearSelection() {\n self.selection = []\n },\n\n /**\n * #action\n */\n addToFavorites(trackId: string) {\n self.favoritesCounter += 1\n self.favorites = [...self.favorites, trackId]\n },\n /**\n * #action\n */\n removeFromFavorites(trackId: string) {\n self.favorites = self.favorites.filter(f => f !== trackId)\n },\n /**\n * #action\n */\n clearFavorites() {\n self.favorites = []\n },\n\n /**\n * #action\n */\n setRecentlyUsedCounter(val: number) {\n self.recentlyUsedCounter = val\n },\n /**\n * #action\n */\n setRecentlyUsed(str: string[]) {\n self.recentlyUsed = str\n },\n /**\n * #action\n */\n setFavorites(str: string[]) {\n self.favorites = str\n },\n /**\n * #action\n */\n setFavoritesCounter(val: number) {\n self.favoritesCounter = val\n },\n /**\n * #action\n */\n addToRecentlyUsed(id: string) {\n if (!self.recentlyUsed.includes(id)) {\n self.recentlyUsedCounter = Math.min(\n self.recentlyUsedCounter + 1,\n MAX_RECENTLY_USED,\n )\n self.recentlyUsed =\n self.recentlyUsed.length >= MAX_RECENTLY_USED\n ? [...self.recentlyUsed.slice(1), id]\n : [...self.recentlyUsed, id]\n }\n },\n /**\n * #action\n */\n clearRecentlyUsed() {\n self.recentlyUsed = []\n },\n /**\n * #action\n */\n setView(view: unknown) {\n self.view = view\n },\n /**\n * #action\n */\n toggleCategory(pathName: string) {\n self.collapsed.set(pathName, !self.collapsed.get(pathName))\n },\n /**\n * #action\n */\n setCategoryCollapsed(pathName: string, status: boolean) {\n self.collapsed.set(pathName, status)\n },\n /**\n * #action\n */\n expandAllCategories() {\n self.collapsed.clear()\n },\n /**\n * #action\n */\n setCollapsedCategories(str: [string, boolean][]) {\n self.collapsed.replace(str)\n },\n /**\n * #action\n */\n clearFilterText() {\n self.filterText = ''\n },\n /**\n * #action\n */\n setFilterText(newText: string) {\n self.filterText = newText\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n isSelected(track: AnyConfigurationModel) {\n return self.selectionSet.has(track)\n },\n /**\n * #method\n */\n isFavorite(trackId: string) {\n return self.favoritesSet.has(trackId)\n },\n /**\n * #method\n */\n isRecentlyUsed(trackId: string) {\n return self.recentlyUsedSet.has(trackId)\n },\n /**\n * #method\n */\n getRefSeqTrackConf(assemblyName: string): MaybeAnyConfigurationModel {\n const { assemblyManager } = getSession(self)\n const assembly = assemblyManager.get(assemblyName)\n const trackConf = assembly?.configuration.sequence\n const viewType = pluginManager.getViewType(self.view.type)!\n if (trackConf) {\n for (const display of trackConf.displays) {\n if (viewType.displayTypes.some(d => d.name === display.type)) {\n return trackConf\n }\n }\n }\n return undefined\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get activeSortTrackNames() {\n return (\n self.sortTrackNames ??\n getConf(getSession(self), ['hierarchical', 'sort', 'trackNames'])\n )\n },\n /**\n * #getter\n */\n get activeSortCategories() {\n return (\n self.sortCategories ??\n getConf(getSession(self), ['hierarchical', 'sort', 'categories'])\n )\n },\n\n /**\n * #getter\n * filter out tracks that don't match the current assembly/display types\n */\n get configAndSessionTrackConfigurations() {\n return [\n ...self.assemblyNames.map(a => self.getRefSeqTrackConf(a)),\n ...filterTracks(getSession(self).tracks, self),\n ].filter(notEmpty)\n },\n /**\n * #getter\n */\n get allTrackConfigurations() {\n const { connectionInstances = [] } = getSession(self)\n return [\n ...this.configAndSessionTrackConfigurations,\n ...connectionInstances.flatMap(c => c.tracks),\n ]\n },\n\n /**\n * #getter\n */\n get allTrackConfigurationTrackIdSet() {\n return new Map(this.allTrackConfigurations.map(t => [t.trackId, t]))\n },\n }))\n .views(self => ({\n /**\n * #getter\n * filters out tracks that are not in the favorites group\n */\n get favoriteTracks() {\n return self.favorites\n .filter(t => self.allTrackConfigurationTrackIdSet.has(t))\n .map(t => self.allTrackConfigurationTrackIdSet.get(t)!)\n },\n\n /**\n * #getter\n * filters out tracks that are not in the recently used group\n */\n get recentlyUsedTracks() {\n return self.recentlyUsed\n .filter(t => self.allTrackConfigurationTrackIdSet.has(t))\n .map(t => self.allTrackConfigurationTrackIdSet.get(t)!)\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get allTracks() {\n const { connectionInstances = [] } = getSession(self)\n return [\n {\n group: 'Tracks',\n tracks: self.configAndSessionTrackConfigurations,\n noCategories: false,\n menuItems: [],\n },\n ...connectionInstances.flatMap(c => ({\n group: getConf(c, 'name'),\n tracks: c.tracks,\n noCategories: false,\n menuItems: [],\n })),\n ]\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get hierarchy() {\n return {\n name: 'Root',\n id: 'Root',\n isOpenByDefault: true,\n type: 'category' as const,\n children: self.allTracks.map(s => ({\n name: s.group,\n id: s.group,\n type: 'category' as const,\n isOpenByDefault: !self.collapsed.get(s.group),\n menuItems: s.menuItems,\n children: generateHierarchy({\n // @ts-expect-error conflict between IMSTMap and Map types in typescript 5.6\n model: self,\n trackConfs: s.tracks,\n extra: s.group,\n noCategories: s.noCategories,\n }),\n })),\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n collapseSubCategories() {\n const paths = [] as string[]\n findSubCategories(self.hierarchy.children, paths)\n for (const path of paths) {\n self.setCategoryCollapsed(path, true)\n }\n },\n /**\n * #action\n */\n collapseTopLevelCategories() {\n const paths = [] as string[]\n for (const trackGroups of self.hierarchy.children) {\n if (trackGroups.children.length) {\n findTopLevelCategories(trackGroups.children, paths)\n }\n }\n for (const path of paths) {\n self.setCategoryCollapsed(path, true)\n }\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get hasAnySubcategories() {\n return self.allTracks.some(group =>\n group.tracks.some(t => readConfObject(t, 'category')?.length > 1),\n )\n },\n }))\n .actions(self => ({\n afterAttach() {\n // this should be the first autorun to properly initialize\n addDisposer(\n self,\n autorun(() => {\n const { assemblyNames, view } = self\n self.setRecentlyUsed(\n localStorageGetJSON<string[]>(recentlyUsedK(assemblyNames), []),\n )\n if (view) {\n const lc = localStorageGetJSON<MaybeCollapsedKeys>(\n collapsedK(assemblyNames, view.type),\n undefined,\n )\n const r = ['hierarchical', 'defaultCollapsed']\n const session = getSession(self)\n if (!lc) {\n self.expandAllCategories()\n if (getConf(session, [...r, 'topLevelCategories'])) {\n self.collapseTopLevelCategories()\n }\n if (getConf(session, [...r, 'subCategories'])) {\n self.collapseSubCategories()\n }\n for (const elt of getConf(session, [...r, 'categoryNames'])) {\n self.setCategoryCollapsed(`Tracks-${elt}`, true)\n }\n } else {\n self.setCollapsedCategories(lc)\n }\n }\n }),\n )\n // this should be the second autorun\n addDisposer(\n self,\n autorun(() => {\n const {\n sortTrackNames,\n sortCategories,\n favorites,\n recentlyUsed,\n assemblyNames,\n collapsed,\n view,\n } = self\n localStorageSetJSON(recentlyUsedK(assemblyNames), recentlyUsed)\n localStorageSetJSON(favoritesK(), favorites)\n localStorageSetJSON(sortTrackNamesK(), sortTrackNames)\n localStorageSetJSON(sortCategoriesK(), sortCategories)\n if (view) {\n localStorageSetJSON(\n collapsedK(assemblyNames, view.type),\n collapsed,\n )\n }\n }),\n )\n },\n }))\n}\n\nexport type HierarchicalTrackSelectorStateModel = ReturnType<\n typeof stateTreeFactory\n>\nexport type HierarchicalTrackSelectorModel =\n Instance<HierarchicalTrackSelectorStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nconst configSchema = ConfigurationSchema('HierarchicalTrackSelectorWidget', {})\nexport default configSchema\n","import stateModelFactory from './model'\nimport configSchema from './configSchema'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport { lazy } from 'react'\n\nexport default function HierarchicalTrackSelectorWidgetF(\n pluginManager: PluginManager,\n) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'HierarchicalTrackSelectorWidget',\n heading: 'Available tracks',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(\n () => import('./components/HierarchicalTrackSelector'),\n ),\n })\n })\n}\n\nexport {\n type HierarchicalTrackSelectorModel,\n default as stateModelFactory,\n} from './model'\nexport { default as configSchema } from './configSchema'\n","import { types, Instance } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\n\nexport default function stateModelFactory(pluginManager: PluginManager) {\n return types\n .model('PluginStoreModel', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('PluginStoreWidget'),\n /**\n * #property\n */\n filterText: '',\n /**\n * #property\n */\n view: types.safeReference(\n pluginManager.pluggableMstType('view', 'stateModel'),\n ),\n })\n .actions(self => ({\n /**\n * #action\n */\n clearFilterText() {\n self.filterText = ''\n },\n /**\n * #action\n */\n setFilterText(newText: string) {\n self.filterText = newText\n },\n }))\n}\n\nexport type PluginStoreStateModel = ReturnType<typeof stateModelFactory>\nexport type PluginStoreModel = Instance<PluginStoreStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { lazy } from 'react'\n\nimport stateModelFactory from './model'\nconst configSchema = ConfigurationSchema('PluginStoreWidget', {})\n\nexport default function PluginStoreWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'PluginStoreWidget',\n heading: 'Plugin store',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/PluginStoreWidget')),\n })\n })\n}\n","import { baseConnectionConfig } from '@jbrowse/core/pluggableElementTypes/models'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config UCSCTrackHubConnection\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst UCSCTrackHubConnection = ConfigurationSchema(\n 'UCSCTrackHubConnection',\n {\n /**\n * #slot\n */\n hubTxtLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: 'http://mysite.com/path/to/hub.txt',\n locationType: 'UriLocation',\n },\n description: 'location of the hub file (usually called hub.txt)',\n },\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'optional list of genomes to import from this track hub, if empty all genomes will be imported',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseConnectionConfig,\n },\n)\n\nexport default UCSCTrackHubConnection\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models'\nimport { ConfigurationReference } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n// locals\nimport configSchema from './configSchema'\n\n/**\n * #stateModel UCSCTrackHubConnection\n * extends BaseConnectionModel\n */\nexport default function UCSCTrackHubConnection(pluginManager: PluginManager) {\n return types\n .compose(\n 'UCSCTrackHubConnection',\n BaseConnectionModelFactory(pluginManager),\n types.model({\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n type: types.literal('UCSCTrackHubConnection'),\n }),\n )\n .actions(self => ({\n /**\n * #action\n */\n async connect() {\n const { doConnect } = await import('./doConnect')\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n doConnect(self)\n },\n }))\n}\n","import { ConnectionType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport stateModelFactory from './model'\nimport configSchema from './configSchema'\n\nexport default function UCSCTrackHubConnectionF(pluginManager: PluginManager) {\n pluginManager.addConnectionType(\n () =>\n new ConnectionType({\n name: 'UCSCTrackHubConnection',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n displayName: 'UCSC Track Hub',\n description: 'A track or assembly hub in the Track Hub format',\n url: '//genome.ucsc.edu/goldenPath/help/hgTrackHubHelp.html#Intro',\n }),\n )\n}\n","import { BaseBlock } from '@jbrowse/core/util/blockTypes'\nimport { Dotplot1DViewModel } from '../model'\n\nexport function locstr(\n px: number,\n view: Dotplot1DViewModel,\n includeAsm = true,\n) {\n const { assemblyName, refName, start, offset, oob } = view.pxToBp(px)\n const coord = Math.floor(start + offset)\n return oob\n ? 'out of bounds'\n : `${\n includeAsm ? `{${assemblyName}}` : ''\n }${refName}:${coord.toLocaleString('en-US')}`\n}\n\nexport function getBlockLabelKeysToHide(\n blocks: BaseBlock[],\n length: number,\n viewOffsetPx: number,\n) {\n const blockLabelKeysToHide = new Set<string>()\n const sortedBlocks = [...blocks].sort((a, b) => {\n const alen = a.end - a.start\n const blen = b.end - b.start\n return blen - alen\n })\n const positions = Array.from({ length: Math.round(length) })\n for (const { key, offsetPx } of sortedBlocks) {\n const y = Math.round(length - offsetPx + viewOffsetPx)\n const labelBounds = [Math.max(y - 12, 0), y]\n if (y === 0 || positions.slice(...labelBounds).some(Boolean)) {\n blockLabelKeysToHide.add(key)\n } else {\n positions.fill(true, ...labelBounds)\n }\n }\n return blockLabelKeysToHide\n}\n/**\n * Given a scale ( bp/px ) and minimum distances (px) between major and minor\n * gridlines, return an object like `{ majorPitch: bp, minorPitch: bp }` giving\n * the gridline pitches to use.\n */\nexport function chooseGridPitch(\n scale: number,\n minMajorPitchPx: number,\n minMinorPitchPx: number,\n) {\n scale = Math.abs(scale)\n const minMajorPitchBp = minMajorPitchPx * scale\n const majorMagnitude = +Number(minMajorPitchBp)\n .toExponential()\n .split(/e/i)[1]!\n\n let majorPitch = 10 ** majorMagnitude\n while (majorPitch < minMajorPitchBp) {\n majorPitch *= 2\n if (majorPitch >= minMajorPitchBp) {\n break\n }\n majorPitch *= 2.5\n }\n\n majorPitch = Math.max(majorPitch, 5)\n\n const majorPitchPx = majorPitch / scale\n\n let minorPitch = 0\n if (!(majorPitch % 10) && majorPitchPx / 10 >= minMinorPitchPx) {\n minorPitch = majorPitch / 10\n } else if (!(majorPitch % 5) && majorPitchPx / 5 >= minMinorPitchPx) {\n minorPitch = majorPitch / 5\n } else if (!(majorPitch % 2) && majorPitchPx / 2 >= minMinorPitchPx) {\n minorPitch = majorPitch / 2\n }\n\n return { majorPitch, minorPitch }\n}\n\nexport function makeTicks(\n regions: BaseBlock[],\n bpPerPx: number,\n emitMajor = true,\n emitMinor = true,\n) {\n const ticks = []\n const gridPitch = chooseGridPitch(bpPerPx, 60, 15)\n const iterPitch = gridPitch.minorPitch || gridPitch.majorPitch\n for (const { start, end, refName } of regions) {\n let index = 0\n\n const minBase = start\n const maxBase = end\n\n for (\n let base = Math.floor(minBase / iterPitch) * iterPitch;\n base < Math.ceil(maxBase / iterPitch) * iterPitch + 1;\n base += iterPitch\n ) {\n if (emitMinor && base % gridPitch.majorPitch) {\n ticks.push({ type: 'minor', base: base - 1, index, refName })\n index += 1\n } else if (emitMajor && Math.abs(base - start) > gridPitch.minorPitch) {\n ticks.push({ type: 'major', base: base - 1, index, refName })\n index += 1\n }\n }\n }\n return ticks\n}\n","import React from 'react'\nimport { BaseBlock } from '@jbrowse/core/util/blockTypes'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\nconst useStyles = makeStyles()(theme => ({\n contentBlock: {\n position: 'relative',\n minHeight: '100%',\n boxSizing: 'border-box',\n whiteSpace: 'nowrap',\n overflow: 'hidden',\n },\n elidedBlock: {\n minHeight: '100%',\n boxSizing: 'border-box',\n backgroundColor: '#999',\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent 1px, rgba(255,255,255,.5) 1px, rgba(255,255,255,.5) 3px)',\n },\n interRegionPaddingBlock: {\n minHeight: '100%',\n backgroundColor: theme.palette.text.disabled,\n },\n boundaryPaddingBlock: {\n minHeight: '100%',\n backgroundColor: theme.palette.action.disabledBackground,\n },\n}))\n\nconst ContentBlock = observer(function ({\n block,\n children,\n}: {\n block: BaseBlock\n children: React.ReactNode\n}) {\n const { classes } = useStyles()\n const { widthPx } = block\n return (\n <div style={{ width: widthPx }} className={classes.contentBlock}>\n {children}\n </div>\n )\n})\n\nfunction ElidedBlock({ width }: { width: number }) {\n const { classes } = useStyles()\n return <div className={classes.elidedBlock} style={{ width }} />\n}\n\nfunction InterRegionPaddingBlock({\n boundary,\n width,\n style = {},\n}: {\n boundary: boolean\n width: number\n style?: React.CSSProperties\n}) {\n const { classes } = useStyles()\n return (\n <div\n style={{\n ...style,\n width,\n }}\n className={\n boundary\n ? classes.boundaryPaddingBlock\n : classes.interRegionPaddingBlock\n }\n />\n )\n}\n\nexport { ContentBlock, ElidedBlock, InterRegionPaddingBlock }\n","import React from 'react'\nimport { Tooltip, Alert, AlertColor } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\nconst useStyles = makeStyles()({\n ellipses: {\n textOverflow: 'ellipsis',\n overflow: 'hidden',\n },\n})\n\nexport default function BlockMsg({\n message,\n severity,\n action,\n}: {\n message: string\n severity?: AlertColor\n action?: React.ReactNode\n}) {\n const { classes } = useStyles()\n return (\n <Alert\n severity={severity}\n action={action}\n classes={{ message: classes.ellipses }}\n >\n <Tooltip title={message}>\n <div>{message}</div>\n </Tooltip>\n </Alert>\n )\n}\n","import React, { lazy, Suspense } from 'react'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { SanitizedHTML } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n// locals\nimport { BaseLinearDisplayModel } from '../models/BaseLinearDisplayModel'\n\nconst BaseTooltip = lazy(() => import('@jbrowse/core/ui/BaseTooltip'))\n\ninterface Props {\n message: React.ReactNode | string\n}\nconst TooltipContents = React.forwardRef<HTMLDivElement, Props>(\n function TooltipContents2({ message }, ref) {\n return (\n <div ref={ref}>\n {React.isValidElement(message) ? (\n message\n ) : message ? (\n <SanitizedHTML html={String(message)} />\n ) : null}\n </div>\n )\n },\n)\n\ntype Coord = [number, number]\nconst Tooltip = observer(function ({\n model,\n clientMouseCoord,\n}: {\n model: BaseLinearDisplayModel\n clientMouseCoord: Coord\n}) {\n const { featureUnderMouse } = model\n const x = clientMouseCoord[0] + 15\n const y = clientMouseCoord[1]\n\n const contents = featureUnderMouse\n ? getConf(model, 'mouseover', { feature: featureUnderMouse })\n : undefined\n\n return featureUnderMouse && contents ? (\n <Suspense fallback={null}>\n <BaseTooltip clientPoint={{ x, y }}>\n <TooltipContents message={contents} />\n </BaseTooltip>\n </Suspense>\n ) : null\n})\n\nexport default Tooltip\n","import React, { lazy } from 'react'\nimport { Tooltip, IconButton } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { getParent } from 'mobx-state-tree'\nimport { LoadingEllipses } from '@jbrowse/core/ui'\nimport { getSession } from '@jbrowse/core/util'\n\n// icons\nimport RefreshIcon from '@mui/icons-material/Refresh'\nimport ReportIcon from '@mui/icons-material/Report'\n\n// locals\nimport BlockMsg from './BlockMsg'\n\nconst ErrorMessageStackTraceDialog = lazy(\n () => import('@jbrowse/core/ui/ErrorMessageStackTraceDialog'),\n)\n\nconst useStyles = makeStyles()(theme => {\n const bg = theme.palette.action.disabledBackground\n return {\n loading: {\n paddingLeft: '0.6em',\n backgroundColor: theme.palette.background.default,\n backgroundImage: `repeating-linear-gradient(45deg, transparent, transparent 5px, ${bg} 5px, ${bg} 10px)`,\n textAlign: 'center',\n },\n }\n})\n\nconst LoadingMessage = observer(({ model }: { model: { status?: string } }) => {\n const { classes } = useStyles()\n const { status: blockStatus } = model\n const { message: displayStatus } = getParent<{ message?: string }>(model, 2)\n const status = displayStatus || blockStatus\n return (\n <div className={classes.loading}>\n <LoadingEllipses message={status} />\n </div>\n )\n})\n\nconst ServerSideRenderedBlockContent = observer(function ({\n model,\n}: {\n model: {\n error?: unknown\n reload: () => void\n message: React.ReactNode\n filled?: boolean\n status?: string\n reactElement?: React.ReactElement\n }\n}) {\n if (model.error) {\n return (\n <BlockMsg\n message={`${model.error}`}\n severity=\"error\"\n action={\n <>\n <Tooltip title=\"Reload track\">\n <IconButton\n data-testid=\"reload_button\"\n onClick={() => {\n model.reload()\n }}\n >\n <RefreshIcon />\n </IconButton>\n </Tooltip>\n <Tooltip title=\"Show stack trace\">\n <IconButton\n onClick={() => {\n getSession(model).queueDialog(onClose => [\n ErrorMessageStackTraceDialog,\n { onClose, error: model.error as Error },\n ])\n }}\n >\n <ReportIcon />\n </IconButton>\n </Tooltip>\n </>\n }\n />\n )\n } else if (model.message) {\n // the message can be a fully rendered react component, e.g. the region too large message\n return React.isValidElement(model.message) ? (\n model.message\n ) : (\n <BlockMsg message={`${model.message}`} severity=\"info\" />\n )\n } else if (!model.filled) {\n return <LoadingMessage model={model} />\n } else {\n return model.reactElement\n }\n})\n\nexport default ServerSideRenderedBlockContent\n","import React from 'react'\nimport {\n types,\n getParent,\n isAlive,\n cast,\n Instance,\n getSnapshot,\n} from 'mobx-state-tree'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport {\n assembleLocString,\n getSession,\n getContainingDisplay,\n getContainingView,\n getViewParams,\n makeAbortableReaction,\n Feature,\n} from '@jbrowse/core/util'\nimport { Region } from '@jbrowse/core/util/types/mst'\nimport {\n AbstractDisplayModel,\n isRetryException,\n} from '@jbrowse/core/util/types'\n\nimport {\n getTrackAssemblyNames,\n getRpcSessionId,\n} from '@jbrowse/core/util/tracks'\n\n// locals\nimport ServerSideRenderedBlockContent from '../components/ServerSideRenderedBlockContent'\n\n// the MST state of a single server-side-rendered block in a display\nconst blockState = types\n .model('BlockState', {\n key: types.string,\n region: Region,\n reloadFlag: 0,\n isLeftEndOfDisplayedRegion: false,\n isRightEndOfDisplayedRegion: false,\n })\n // NOTE: all this volatile stuff has to be filled in at once, so that it stays consistent\n .volatile(() => ({\n renderInProgress: undefined as AbortController | undefined,\n filled: false,\n reactElement: undefined as React.ReactElement | undefined,\n features: undefined as Map<string, Feature> | undefined,\n layout: undefined as any,\n status: '',\n error: undefined as unknown,\n message: undefined as string | undefined,\n maxHeightReached: false,\n ReactComponent: ServerSideRenderedBlockContent,\n renderProps: undefined as any,\n }))\n .actions(self => {\n let renderInProgress: undefined | AbortController\n return {\n doReload() {\n self.reloadFlag = self.reloadFlag + 1\n },\n afterAttach() {\n const display = getContainingDisplay(self)\n setTimeout(() => {\n if (isAlive(self)) {\n makeAbortableReaction(\n self as any,\n renderBlockData,\n renderBlockEffect, // reaction doesn't expect async here\n {\n name: `${display.id}/${assembleLocString(\n self.region,\n )} rendering`,\n delay: display.renderDelay,\n fireImmediately: true,\n },\n this.setLoading,\n this.setRendered,\n this.setError,\n )\n }\n }, display.renderDelay)\n },\n setStatus(message: string) {\n self.status = message\n },\n setLoading(abortController: AbortController) {\n if (\n renderInProgress !== undefined &&\n !renderInProgress.signal.aborted\n ) {\n renderInProgress.abort()\n }\n self.filled = false\n self.message = undefined\n self.reactElement = undefined\n self.features = undefined\n self.layout = undefined\n self.error = undefined\n self.maxHeightReached = false\n self.renderProps = undefined\n renderInProgress = abortController\n },\n setMessage(messageText: string) {\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n self.filled = false\n self.message = messageText\n self.reactElement = undefined\n self.features = undefined\n self.layout = undefined\n self.error = undefined\n self.maxHeightReached = false\n self.renderProps = undefined\n renderInProgress = undefined\n },\n setRendered(\n props:\n | {\n reactElement: React.ReactElement\n features: Map<string, Feature>\n layout: any\n maxHeightReached: boolean\n renderProps: any\n }\n | undefined,\n ) {\n if (!props) {\n return\n }\n const {\n reactElement,\n features,\n layout,\n maxHeightReached,\n renderProps,\n } = props\n self.filled = true\n self.message = undefined\n self.reactElement = reactElement\n self.features = features\n self.layout = layout\n self.error = undefined\n self.maxHeightReached = maxHeightReached\n self.renderProps = renderProps\n renderInProgress = undefined\n },\n setError(error: unknown) {\n console.error(error)\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n // the rendering failed for some reason\n self.filled = false\n self.message = undefined\n self.reactElement = undefined\n self.features = undefined\n self.layout = undefined\n self.maxHeightReached = false\n self.error = error\n self.renderProps = undefined\n renderInProgress = undefined\n if (isRetryException(error as Error)) {\n this.reload()\n }\n },\n reload() {\n self.renderInProgress = undefined\n self.filled = false\n self.reactElement = undefined\n self.features = undefined\n self.layout = undefined\n self.error = undefined\n self.message = undefined\n self.maxHeightReached = false\n self.ReactComponent = ServerSideRenderedBlockContent\n self.renderProps = undefined\n getParent<any>(self, 2).reload()\n },\n beforeDestroy() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n const display = getContainingDisplay(self)\n const { rpcManager } = getSession(self)\n const { rendererType } = display\n const { renderArgs } = renderBlockData(cast(self))\n // renderArgs can be undefined if an error occurred in this block\n if (renderArgs) {\n await rendererType.freeResourcesInClient(\n rpcManager,\n JSON.parse(JSON.stringify(renderArgs)),\n )\n }\n } catch (e) {\n console.error('Error while destroying block', e)\n }\n })()\n },\n }\n })\n\nexport default blockState\nexport type BlockStateModel = typeof blockState\nexport type BlockModel = Instance<BlockStateModel>\n\n// calls the render worker to render the block content not using a flow for\n// this, because the flow doesn't work with autorun\nexport function renderBlockData(\n self: BlockModel,\n optDisplay?: AbstractDisplayModel,\n) {\n try {\n const display = optDisplay || (getContainingDisplay(self) as any)\n const { assemblyManager, rpcManager } = getSession(display)\n const { adapterConfig, rendererType, error, parentTrack } = display\n const assemblyNames = getTrackAssemblyNames(parentTrack)\n const regionAsm = self.region.assemblyName\n if (\n !assemblyNames.includes(regionAsm) &&\n !assemblyNames.some(name => assemblyManager.get(name)?.hasName(regionAsm))\n ) {\n throw new Error(\n `region assembly (${regionAsm}) does not match track assemblies (${assemblyNames})`,\n )\n }\n\n const renderProps = display.renderProps()\n const { config } = renderProps\n\n // This line is to trigger the mobx reaction when the config changes\n // It won't trigger the reaction if it doesn't think we're accessing it\n readConfObject(config)\n\n const sessionId = getRpcSessionId(display)\n const layoutId = getContainingView(display).id\n const cannotBeRenderedReason = display.regionCannotBeRendered(self.region)\n\n return {\n rendererType,\n rpcManager,\n renderProps,\n cannotBeRenderedReason,\n displayError: error,\n renderArgs: {\n statusCallback: (message: string) => {\n if (isAlive(self)) {\n self.setStatus(message)\n }\n },\n assemblyName: self.region.assemblyName,\n regions: [getSnapshot(self.region)],\n adapterConfig,\n rendererType: rendererType.name,\n sessionId,\n layoutId,\n blockKey: self.key,\n reloadFlag: self.reloadFlag,\n timeout: 1000000, // 10000,\n },\n }\n } catch (e) {\n return { displayError: e }\n }\n}\n\nasync function renderBlockEffect(\n props: ReturnType<typeof renderBlockData> | undefined,\n signal: AbortSignal,\n self: BlockModel,\n) {\n if (!props) {\n return\n }\n const {\n rendererType,\n renderProps,\n rpcManager,\n renderArgs,\n cannotBeRenderedReason,\n displayError,\n } = props\n if (!isAlive(self)) {\n return undefined\n }\n\n if (displayError) {\n self.setError(displayError)\n return undefined\n }\n if (cannotBeRenderedReason) {\n self.setMessage(cannotBeRenderedReason)\n return undefined\n }\n\n if (renderProps.notReady) {\n return undefined\n }\n\n const { reactElement, features, layout, maxHeightReached } =\n await rendererType.renderInClient(rpcManager, {\n ...renderArgs,\n ...renderProps,\n viewParams: getViewParams(self),\n signal,\n })\n return {\n reactElement,\n features,\n layout,\n maxHeightReached,\n renderProps,\n }\n}\n","import { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { FeatureDensityStats } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { getContainingView, getSession } from '@jbrowse/core/util'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { IAnyStateTreeNode, isAlive } from 'mobx-state-tree'\nimport { LinearGenomeViewModel } from '../../LinearGenomeView'\n\nexport interface RenderProps {\n rendererType: any\n renderArgs: Record<string, any>\n renderProps: Record<string, any>\n displayError: unknown\n rpcManager: { call: (...args: unknown[]) => void }\n cannotBeRenderedReason: string\n}\n\nexport interface ErrorProps {\n displayError: string\n}\n\nexport function getDisplayStr(totalBytes: number) {\n if (Math.floor(totalBytes / 1000000) > 0) {\n return `${Number.parseFloat((totalBytes / 1000000).toPrecision(3))} Mb`\n } else if (Math.floor(totalBytes / 1000) > 0) {\n return `${Number.parseFloat((totalBytes / 1000).toPrecision(3))} Kb`\n } else {\n return `${Math.floor(totalBytes)} bytes`\n }\n}\n\n// stabilize clipid under test for snapshot\nexport function getId(id: string, index: number) {\n const notJest = typeof jest === 'undefined'\n return ['clip', notJest ? id : 'jest', index, notJest ? Math.random() : '']\n .filter(f => !!f)\n .join('-')\n}\n\nexport async function getFeatureDensityStatsPre(\n self: IAnyStateTreeNode & {\n adapterConfig?: AnyConfigurationModel\n setMessage: (arg: string) => void\n },\n) {\n const view = getContainingView(self) as LinearGenomeViewModel\n const regions = view.staticBlocks.contentBlocks\n\n const { rpcManager } = getSession(self)\n const { adapterConfig } = self\n if (!adapterConfig) {\n // A track extending the base track might not have an adapter config\n // e.g. Apollo tracks don't use adapters\n return {}\n }\n const sessionId = getRpcSessionId(self)\n\n return rpcManager.call(sessionId, 'CoreGetFeatureDensityStats', {\n sessionId,\n regions,\n adapterConfig,\n statusCallback: (message: string) => {\n if (isAlive(self)) {\n self.setMessage(message)\n }\n },\n }) as Promise<FeatureDensityStats>\n}\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\n// core\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport { ContentBlock } from '@jbrowse/core/util/blockTypes'\nimport { Assembly } from '@jbrowse/core/assemblyManager/assembly'\nimport { getFillProps } from '@jbrowse/core/util'\n\n// locals\nimport { getCytobands } from './util'\nimport { HEADER_OVERVIEW_HEIGHT } from '../consts'\n\n// rounded rect from https://stackoverflow.com/a/45889603/2129219\nfunction rightRoundedRect(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n return `M${x},${y}h${width - radius}a${radius},${radius} 0 0 1 ${radius},${radius}v${height - 2 * radius}a${radius},${radius} 0 0 1 ${-radius},${radius}h${radius - width}z`\n}\n\nfunction leftRoundedRect(\n x: number,\n y: number,\n width: number,\n height: number,\n radius: number,\n) {\n return `M${x + radius},${y}h${width - radius}v${height}h${radius - width}a${radius},${radius} 0 0 1 ${-radius},${-radius}v${2 * radius - height}a${radius},${radius} 0 0 1 ${radius},${-radius}z`\n}\n\nfunction leftTriangle(x: number, y: number, width: number, height: number) {\n return [\n [x, 0],\n [x + width, height / 2],\n [x, height],\n ].toString()\n}\n\nfunction rightTriangle(x: number, y: number, width: number, height: number) {\n return [\n [x, height / 2],\n [x + width, 0],\n [x + width, height],\n ].toString()\n}\n\nconst colorMap: Record<string, string> = {\n gneg: 'rgb(227,227,227)',\n gpos25: 'rgb(142,142,142)',\n gpos50: 'rgb(85,85,85)',\n gpos100: 'rgb(0,0,0)',\n gpos75: 'rgb(57,57,57)',\n gvar: 'rgb(0,0,0)',\n stalk: 'rgb(127,127,127)',\n acen: '#800',\n}\n\nconst Cytobands = observer(function ({\n overview,\n block,\n assembly,\n}: {\n overview: Base1DViewModel\n assembly?: Assembly\n block: ContentBlock\n}) {\n const { offsetPx, reversed } = block\n const cytobands = getCytobands(assembly, block.refName)\n const lcap = reversed ? cytobands.length - 1 : 0\n const rcap = reversed ? 0 : cytobands.length - 1\n\n const h = HEADER_OVERVIEW_HEIGHT\n let centromereSeen = false\n return (\n <g transform={`translate(-${offsetPx})`}>\n {cytobands.map((args, index) => {\n const k = JSON.stringify(args)\n const { refName, type, start, end } = args\n const s = overview.bpToPx({ refName, coord: start }) || 0\n const e = overview.bpToPx({ refName, coord: end }) || 0\n const l = Math.min(s, e)\n const w = Math.abs(e - s)\n const c = colorMap[type] || 'black'\n if (type === 'acen' && !centromereSeen) {\n centromereSeen = true // the next acen entry is drawn with different right triangle\n return (\n <polygon\n key={k}\n points={\n reversed\n ? rightTriangle(s - w, 0, w, h)\n : leftTriangle(s, 0, w, h)\n }\n {...getFillProps(c)}\n />\n )\n }\n if (type === 'acen' && centromereSeen) {\n return (\n <polygon\n key={k}\n points={\n reversed\n ? leftTriangle(s - w, 0, w, h)\n : rightTriangle(s, 0, w, h)\n }\n {...getFillProps(c)}\n />\n )\n }\n if (lcap === index) {\n return (\n <path\n key={k}\n d={leftRoundedRect(l, 0, w, h, 8)}\n {...getFillProps(c)}\n />\n )\n }\n if (rcap === index) {\n return (\n <path\n key={k}\n d={rightRoundedRect(l, 0, w, h, 8)}\n {...getFillProps(c)}\n />\n )\n }\n return (\n <rect key={k} x={l} y={0} width={w} height={h} {...getFillProps(c)} />\n )\n })}\n </g>\n )\n})\n\nexport default Cytobands\n","import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\n\n// icons\nimport DragIcon from '@mui/icons-material/DragIndicator'\n\nimport { LinearGenomeViewModel } from '..'\n\nconst useStyles = makeStyles()({\n dragHandle: {\n cursor: 'grab',\n },\n dragHandleIcon: {\n display: 'inline-block',\n verticalAlign: 'middle',\n pointerEvents: 'none',\n },\n})\n\nfunction TrackLabelDragHandle({\n trackId,\n view,\n track,\n}: {\n trackId: string\n track: BaseTrackModel\n view: LinearGenomeViewModel\n}) {\n const { classes } = useStyles()\n return (\n <span\n draggable\n className={classes.dragHandle}\n onDragStart={event => {\n const target = event.currentTarget\n if (target.parentNode) {\n const parent = target.parentNode as HTMLElement\n event.dataTransfer.setDragImage(parent, 20, 20)\n view.setDraggingTrackId(track.id)\n }\n }}\n onDragEnd={() => {\n view.setDraggingTrackId(undefined)\n }}\n data-testid={`dragHandle-${view.id}-${trackId}`}\n >\n <DragIcon className={classes.dragHandleIcon} fontSize=\"small\" />\n </span>\n )\n}\n\nexport default TrackLabelDragHandle\n","import React from 'react'\nimport { IconButton, Paper, Typography, alpha } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { getSession, getContainingView } from '@jbrowse/core/util'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\nimport { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { SanitizedHTML } from '@jbrowse/core/ui'\nimport CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'\n\n// icons\nimport MoreVertIcon from '@mui/icons-material/MoreVert'\nimport CloseIcon from '@mui/icons-material/Close'\nimport MinimizeIcon from '@mui/icons-material/Minimize'\nimport AddIcon from '@mui/icons-material/Add'\nimport KeyboardDoubleArrowDownIcon from '@mui/icons-material/KeyboardDoubleArrowDown'\nimport KeyboardDoubleArrowUpIcon from '@mui/icons-material/KeyboardDoubleArrowUp'\nimport KeyboardArrowDownIcon from '@mui/icons-material/KeyboardArrowDown'\nimport KeyboardArrowUpIcon from '@mui/icons-material/KeyboardArrowUp'\n\nimport { LinearGenomeViewModel } from '..'\nimport TrackLabelDragHandle from './TrackLabelDragHandle'\n\nconst useStyles = makeStyles()(theme => ({\n root: {\n background: alpha(theme.palette.background.paper, 0.8),\n '&:hover': {\n background: theme.palette.background.paper,\n },\n },\n trackName: {\n fontSize: '0.8rem',\n },\n iconButton: {\n padding: theme.spacing(1),\n },\n}))\n\ntype LGV = LinearGenomeViewModel\n\ninterface Props {\n track: BaseTrackModel\n className?: string\n}\n\nconst TrackLabel = observer(\n React.forwardRef<HTMLDivElement, Props>(function TrackLabel2(\n { track, className },\n ref,\n ) {\n const { classes, cx } = useStyles()\n const view = getContainingView(track) as LGV\n const session = getSession(track)\n const trackConf = track.configuration\n const minimized = track.minimized\n const trackId = getConf(track, 'trackId')\n const trackName = getTrackName(trackConf, session)\n const items = [\n {\n label: 'Track order',\n type: 'subMenu',\n priority: 2000,\n subMenu: [\n {\n label: minimized ? 'Restore track' : 'Minimize track',\n icon: minimized ? AddIcon : MinimizeIcon,\n onClick: () => {\n track.setMinimized(!minimized)\n },\n },\n {\n label: 'Move track to top',\n icon: KeyboardDoubleArrowUpIcon,\n onClick: () => {\n view.moveTrackToTop(track.id)\n },\n },\n\n {\n label: 'Move track up',\n icon: KeyboardArrowUpIcon,\n onClick: () => {\n view.moveTrackUp(track.id)\n },\n },\n {\n label: 'Move track down',\n icon: KeyboardArrowDownIcon,\n onClick: () => {\n view.moveTrackDown(track.id)\n },\n },\n {\n label: 'Move track to bottom',\n icon: KeyboardDoubleArrowDownIcon,\n onClick: () => {\n view.moveTrackToBottom(track.id)\n },\n },\n ],\n },\n ...(session.getTrackActionMenuItems?.(trackConf) || []),\n ...track.trackMenuItems(),\n ].sort((a, b) => (b?.priority || 0) - (a?.priority || 0))\n\n return (\n <Paper ref={ref} className={cx(className, classes.root)}>\n <TrackLabelDragHandle track={track} trackId={trackId} view={view} />\n <IconButton\n onClick={() => view.hideTrack(trackId)}\n className={classes.iconButton}\n title=\"close this track\"\n >\n <CloseIcon fontSize=\"small\" />\n </IconButton>\n\n <Typography\n variant=\"body1\"\n component=\"span\"\n className={classes.trackName}\n onMouseDown={event => {\n // avoid becoming a click-and-drag action on the lgv\n event.stopPropagation()\n }}\n >\n <SanitizedHTML\n html={[trackName, minimized ? '(minimized)' : '']\n .filter(f => !!f)\n .join(' ')}\n />\n </Typography>\n\n <CascadingMenuButton menuItems={items} data-testid=\"track_menu_icon\">\n <MoreVertIcon fontSize=\"small\" />\n </CascadingMenuButton>\n </Paper>\n )\n }),\n)\n\nexport default TrackLabel\n","import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// jbrowse core\nimport { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport TrackLabel from './TrackLabel'\n\nconst useStyles = makeStyles()({\n trackLabel: {\n zIndex: 3,\n },\n\n trackLabelOffset: {\n position: 'relative',\n display: 'inline-block',\n },\n trackLabelOverlap: {\n position: 'absolute',\n },\n})\n\ntype LGV = LinearGenomeViewModel\n\nconst TrackLabelContainer = observer(function ({\n track,\n view,\n}: {\n track: BaseTrackModel\n view: LGV\n}) {\n const { classes, cx } = useStyles()\n const display = track.displays[0]\n const { trackLabel, trackLabelOverlap, trackLabelOffset } = classes\n const labelStyle =\n view.trackLabelsSetting !== 'overlapping' || display.prefersOffset\n ? trackLabelOffset\n : trackLabelOverlap\n\n return view.trackLabelsSetting !== 'hidden' ? (\n <TrackLabel track={track} className={cx(trackLabel, labelStyle)} />\n ) : null\n})\n\nexport default TrackLabelContainer\n","import React, { Suspense, useEffect, useRef } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// jbrowse core\nimport { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { LoadingEllipses } from '@jbrowse/core/ui'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\n\nconst useStyles = makeStyles()({\n // aligns with block boundaries. check for example the breakpoint split view\n // demo to see if features align if wanting to change things\n renderingComponentContainer: {\n position: 'absolute',\n // -1 offset because of the 1px border of the Paper\n left: -1,\n height: '100%',\n width: '100%',\n },\n\n trackRenderingContainer: {\n overflowY: 'auto',\n overflowX: 'hidden',\n whiteSpace: 'nowrap',\n position: 'relative',\n background: 'none',\n zIndex: 2,\n },\n})\n\ntype LGV = LinearGenomeViewModel\n\nconst TrackRenderingContainer = observer(function ({\n model,\n track,\n onDragEnter,\n}: {\n model: LGV\n track: BaseTrackModel\n onDragEnter: () => void\n}) {\n const { classes } = useStyles()\n const display = track.displays[0]\n const { height, RenderingComponent, DisplayBlurb } = display\n const { trackRefs, id, scaleFactor } = model\n const trackId = getConf(track, 'trackId')\n const ref = useRef<HTMLDivElement>(null)\n const minimized = track.minimized\n\n useEffect(() => {\n if (ref.current) {\n trackRefs[trackId] = ref.current\n }\n return () => {\n delete trackRefs[trackId]\n }\n }, [trackRefs, trackId])\n\n return (\n <div\n className={classes.trackRenderingContainer}\n style={{\n height: minimized ? 20 : height,\n }}\n onScroll={evt => display.setScrollTop(evt.currentTarget.scrollTop)}\n onDragEnter={onDragEnter}\n data-testid={`trackRenderingContainer-${id}-${trackId}`}\n >\n {!minimized ? (\n <>\n <div\n ref={ref}\n className={classes.renderingComponentContainer}\n style={{\n transform:\n scaleFactor !== 1 ? `scaleX(${scaleFactor})` : undefined,\n }}\n >\n <Suspense fallback={<LoadingEllipses />}>\n <RenderingComponent\n model={display}\n onHorizontalScroll={model.horizontalScroll}\n />\n </Suspense>\n </div>\n\n {DisplayBlurb ? (\n <div\n style={{\n position: 'absolute',\n left: 0,\n top: display.height - 20,\n }}\n >\n <DisplayBlurb model={display} />\n </div>\n ) : null}\n </>\n ) : null}\n </div>\n )\n})\n\nexport default TrackRenderingContainer\n","import React, { useRef } from 'react'\nimport { Paper } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { isAlive } from 'mobx-state-tree'\nimport { ErrorBoundary } from 'react-error-boundary'\n\n// jbrowse core\nimport { BaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { ResizeHandle, ErrorMessage } from '@jbrowse/core/ui'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport TrackLabelContainer from './TrackLabelContainer'\nimport TrackRenderingContainer from './TrackRenderingContainer'\n\nconst useStyles = makeStyles()({\n root: {\n marginTop: 2,\n },\n resizeHandle: {\n height: 3,\n boxSizing: 'border-box',\n position: 'relative',\n zIndex: 2,\n },\n})\n\ntype LGV = LinearGenomeViewModel\n\nconst TrackContainer = observer(function ({\n model,\n track,\n}: {\n model: LGV\n track: BaseTrackModel\n}) {\n const { classes } = useStyles()\n const display = track.displays[0]\n const { draggingTrackId, showTrackOutlines } = model\n const ref = useRef<HTMLDivElement>(null)\n\n return (\n <Paper\n ref={ref}\n className={classes.root}\n variant={showTrackOutlines ? 'outlined' : undefined}\n elevation={showTrackOutlines ? undefined : 0}\n onClick={event => {\n if (event.detail === 2 && !track.displays[0].featureIdUnderMouse) {\n const left = ref.current?.getBoundingClientRect().left || 0\n model.zoomTo(model.bpPerPx / 2, event.clientX - left, true)\n }\n }}\n >\n <TrackLabelContainer track={track} view={model} />\n <ErrorBoundary FallbackComponent={e => <ErrorMessage error={e.error} />}>\n <TrackRenderingContainer\n model={model}\n track={track}\n onDragEnter={() => {\n if (\n isAlive(display) &&\n draggingTrackId !== undefined &&\n draggingTrackId !== display.id\n ) {\n model.moveTrack(draggingTrackId, track.id)\n }\n }}\n />\n </ErrorBoundary>\n <ResizeHandle\n onDrag={display.resizeHeight}\n className={classes.resizeHandle}\n />\n </Paper>\n )\n})\n\nexport default TrackContainer\n","import React, { useRef, useEffect, useState } from 'react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport { getRelativeX } from './util'\n\ntype LGV = LinearGenomeViewModel\ntype Timer = ReturnType<typeof setTimeout>\n\nexport function useSideScroll(model: LGV) {\n const [mouseDragging, setMouseDragging] = useState(false)\n // refs are to store these variables to avoid repeated rerenders associated\n // with useState/setState\n const scheduled = useRef(false)\n\n const prevX = useRef<number>(0)\n\n useEffect(() => {\n let cleanup = () => {}\n\n function globalMouseMove(event: MouseEvent) {\n event.preventDefault()\n const currX = event.clientX\n const distance = currX - prevX.current\n if (distance) {\n // use rAF to make it so multiple event handlers aren't fired per-frame\n // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/\n if (!scheduled.current) {\n scheduled.current = true\n window.requestAnimationFrame(() => {\n model.horizontalScroll(-distance)\n scheduled.current = false\n prevX.current = event.clientX\n })\n }\n }\n }\n\n function globalMouseUp() {\n prevX.current = 0\n if (mouseDragging) {\n setMouseDragging(false)\n }\n }\n\n if (mouseDragging) {\n window.addEventListener('mousemove', globalMouseMove, true)\n window.addEventListener('mouseup', globalMouseUp, true)\n cleanup = () => {\n window.removeEventListener('mousemove', globalMouseMove, true)\n window.removeEventListener('mouseup', globalMouseUp, true)\n }\n }\n return cleanup\n }, [model, mouseDragging])\n\n function mouseDown(event: React.MouseEvent) {\n if (event.shiftKey) {\n return\n }\n // check if clicking a draggable element or a resize handle\n const target = event.target as HTMLElement\n if (target.draggable || target.dataset.resizer) {\n return\n }\n\n // otherwise do click and drag scroll\n if (event.button === 0) {\n prevX.current = event.clientX\n setMouseDragging(true)\n }\n }\n\n // this local mouseup is used in addition to the global because sometimes\n // the global add/remove are not called in time, resulting in issue #533\n function mouseUp(event: React.MouseEvent) {\n event.preventDefault()\n setMouseDragging(false)\n }\n return { mouseDown, mouseUp }\n}\n\ninterface AnchorPosition {\n offsetX: number\n clientX: number\n clientY: number\n}\n\nexport function useRangeSelect(\n ref: React.RefObject<HTMLDivElement>,\n model: LGV,\n shiftOnly?: boolean,\n) {\n const [startX, setStartX] = useState<number>()\n const [currentX, setCurrentX] = useState<number>()\n\n // clientX and clientY used for anchorPosition for menu\n // offsetX used for calculations about width of selection\n const [anchorPosition, setAnchorPosition] = useState<AnchorPosition>()\n const [guideX, setGuideX] = useState<number>()\n const mouseDragging = startX !== undefined && anchorPosition === undefined\n\n useEffect(() => {\n function computeOffsets(offsetX: number) {\n if (startX === undefined) {\n return\n }\n const leftPx = Math.min(startX, offsetX)\n const rightPx = Math.max(startX, offsetX)\n return {\n leftOffset: model.pxToBp(leftPx),\n rightOffset: model.pxToBp(rightPx),\n }\n }\n\n function globalMouseMove(event: MouseEvent) {\n if (ref.current && mouseDragging) {\n const relativeX = getRelativeX(event, ref.current)\n setCurrentX(relativeX)\n }\n }\n\n function globalMouseUp(event: MouseEvent) {\n if (startX !== undefined && ref.current) {\n const { clientX, clientY } = event\n const offsetX = getRelativeX(event, ref.current)\n // as stated above, store both clientX/Y and offsetX for different\n // purposes\n setAnchorPosition({\n offsetX,\n clientX,\n clientY,\n })\n const args = computeOffsets(offsetX)\n if (args) {\n model.setOffsets(args.leftOffset, args.rightOffset)\n }\n setGuideX(undefined)\n }\n }\n if (mouseDragging) {\n window.addEventListener('mousemove', globalMouseMove)\n window.addEventListener('mouseup', globalMouseUp)\n return () => {\n window.removeEventListener('mousemove', globalMouseMove)\n window.removeEventListener('mouseup', globalMouseUp)\n }\n }\n return () => {}\n }, [startX, mouseDragging, model, ref])\n\n useEffect(() => {\n if (\n !mouseDragging &&\n currentX !== undefined &&\n startX !== undefined &&\n Math.abs(currentX - startX) <= 3\n ) {\n handleClose()\n }\n }, [mouseDragging, currentX, startX])\n\n function mouseDown(event: React.MouseEvent<HTMLDivElement>) {\n if (shiftOnly && !event.shiftKey) {\n return\n }\n\n event.preventDefault()\n event.stopPropagation()\n const relativeX = getRelativeX(event, ref.current)\n setStartX(relativeX)\n setCurrentX(relativeX)\n }\n\n function mouseMove(event: React.MouseEvent<HTMLDivElement>) {\n if (shiftOnly) {\n if (event.shiftKey) {\n setGuideX(getRelativeX(event, ref.current))\n } else {\n setGuideX(undefined)\n }\n } else {\n setGuideX(getRelativeX(event, ref.current))\n }\n }\n\n function mouseOut() {\n setGuideX(undefined)\n model.setOffsets(undefined, undefined)\n }\n\n function handleClose() {\n setAnchorPosition(undefined)\n setStartX(undefined)\n setCurrentX(undefined)\n }\n\n function handleMenuItemClick(_: unknown, callback: () => void) {\n callback()\n handleClose()\n }\n\n const open = Boolean(anchorPosition)\n if (startX === undefined) {\n return {\n open,\n guideX,\n mouseDown,\n mouseMove,\n mouseOut,\n handleMenuItemClick,\n }\n }\n const right = anchorPosition ? anchorPosition.offsetX : currentX || 0\n const left = right < startX ? right : startX\n const width = Math.abs(right - startX)\n const leftBpOffset = model.pxToBp(left)\n const rightBpOffset = model.pxToBp(left + width)\n const numOfBpSelected = Math.ceil(width * model.bpPerPx)\n\n return {\n open,\n rubberbandOn: true,\n mouseDown,\n mouseMove,\n mouseOut,\n handleClose,\n handleMenuItemClick,\n leftBpOffset,\n rightBpOffset,\n anchorPosition,\n numOfBpSelected,\n width,\n left,\n }\n}\n\nexport function useWheelScroll(\n ref: React.RefObject<HTMLDivElement>,\n model: {\n bpPerPx: number\n zoomTo: (arg: number, arg2?: number) => void\n setScaleFactor: (arg: number) => void\n horizontalScroll: (arg: number) => void\n },\n) {\n const delta = useRef(0)\n const timeout = useRef<Timer>()\n const scheduled = useRef(false)\n useEffect(() => {\n const curr = ref.current\n\n // if ctrl is held down, zoom in with y-scroll\n // else scroll horizontally with x-scroll\n function onWheel(event: WheelEvent) {\n if (event.ctrlKey) {\n event.preventDefault()\n delta.current += event.deltaY / 500\n model.setScaleFactor(\n delta.current < 0 ? 1 - delta.current : 1 / (1 + delta.current),\n )\n if (timeout.current) {\n clearTimeout(timeout.current)\n }\n timeout.current = setTimeout(() => {\n model.setScaleFactor(1)\n model.zoomTo(\n delta.current > 0\n ? model.bpPerPx * (1 + delta.current)\n : model.bpPerPx / (1 - delta.current),\n event.clientX - (curr?.getBoundingClientRect().left || 0),\n )\n delta.current = 0\n }, 300)\n } else {\n // this is needed to stop the event from triggering \"back button\n // action\" on MacOSX etc. but is a heuristic to avoid preventing the\n // inner-track scroll behavior\n if (Math.abs(event.deltaX) > Math.abs(2 * event.deltaY)) {\n event.preventDefault()\n }\n delta.current += event.deltaX\n if (!scheduled.current) {\n // use rAF to make it so multiple event handlers aren't fired per-frame\n // see https://calendar.perfplanet.com/2013/the-runtime-performance-checklist/\n scheduled.current = true\n window.requestAnimationFrame(() => {\n model.horizontalScroll(delta.current)\n delta.current = 0\n scheduled.current = false\n })\n }\n }\n }\n if (curr) {\n curr.addEventListener('wheel', onWheel)\n return () => {\n curr.removeEventListener('wheel', onWheel)\n }\n }\n return () => {}\n }, [model, ref])\n}\n","import React from 'react'\nimport { Tooltip } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { stringify } from '@jbrowse/core/util'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n guide: {\n pointerEvents: 'none',\n height: '100%',\n width: 1,\n position: 'absolute',\n zIndex: 10,\n },\n})\n\nconst VerticalGuide = observer(function VerticalGuide({\n model,\n coordX,\n}: {\n model: LGV\n coordX: number\n}) {\n const { classes } = useStyles()\n return (\n <Tooltip open placement=\"top\" title={stringify(model.pxToBp(coordX))} arrow>\n <div\n className={classes.guide}\n style={{\n left: coordX,\n background: 'red',\n }}\n />\n </Tooltip>\n )\n})\n\nexport default VerticalGuide\n","import React, { useRef } from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { Menu } from '@jbrowse/core/ui'\n\n// locals\nimport VerticalGuide from './VerticalGuide'\nimport RubberbandSpan from './RubberbandSpan'\nimport { useRangeSelect } from './hooks'\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n rubberbandControl: {\n cursor: 'crosshair',\n width: '100%',\n minHeight: 8,\n },\n})\n\nconst Rubberband = observer(function ({\n model,\n ControlComponent = <div />,\n}: {\n model: LGV\n ControlComponent?: React.ReactElement\n}) {\n const ref = useRef<HTMLDivElement>(null)\n const { classes } = useStyles()\n\n const {\n guideX,\n rubberbandOn,\n leftBpOffset,\n rightBpOffset,\n numOfBpSelected,\n width,\n left,\n anchorPosition,\n handleMenuItemClick,\n open,\n handleClose,\n mouseMove,\n mouseDown,\n mouseOut,\n } = useRangeSelect(ref, model)\n\n return (\n <>\n {guideX !== undefined ? (\n <VerticalGuide model={model} coordX={guideX} />\n ) : rubberbandOn ? (\n <RubberbandSpan\n leftBpOffset={leftBpOffset}\n rightBpOffset={rightBpOffset}\n numOfBpSelected={numOfBpSelected}\n width={width}\n left={left}\n />\n ) : null}\n {anchorPosition ? (\n <Menu\n anchorReference=\"anchorPosition\"\n anchorPosition={{\n left: anchorPosition.clientX,\n top: anchorPosition.clientY,\n }}\n onMenuItemClick={handleMenuItemClick}\n open={open}\n onClose={handleClose}\n menuItems={model.rubberBandMenuItems()}\n />\n ) : null}\n <div\n data-testid=\"rubberband_controls\"\n className={classes.rubberbandControl}\n ref={ref}\n onMouseDown={mouseDown}\n onMouseMove={mouseMove}\n onMouseOut={mouseOut}\n >\n {ControlComponent}\n </div>\n </>\n )\n})\n\nexport default Rubberband\n","import { Typography } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { ContentBlock } from '@jbrowse/core/util/blockTypes'\nimport React from 'react'\nimport { getTickDisplayStr } from '@jbrowse/core/util'\n\n// locals\nimport { ContentBlock as ContentBlockComponent } from '../../BaseLinearDisplay/components/Block'\nimport { makeTicks } from '../util'\n\nconst useStyles = makeStyles()(theme => ({\n majorTickLabel: {\n fontSize: 11,\n zIndex: 1,\n background: theme.palette.background.paper,\n lineHeight: 'normal',\n pointerEvents: 'none',\n },\n tick: {\n position: 'absolute',\n width: 0,\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n },\n}))\n\nconst ScalebarCoordinateTicks = function ({\n block,\n bpPerPx,\n}: {\n block: ContentBlock\n bpPerPx: number\n}) {\n const { classes } = useStyles()\n const { reversed, start, end } = block\n const ticks = makeTicks(start, end, bpPerPx, true, false)\n\n return (\n <ContentBlockComponent block={block}>\n {ticks.map(({ type, base }) => {\n if (type === 'major') {\n const x = (reversed ? end - base : base - start) / bpPerPx\n const baseNumber = base + 1\n return (\n <div key={base} className={classes.tick} style={{ left: x }}>\n {baseNumber ? (\n <Typography className={classes.majorTickLabel}>\n {getTickDisplayStr(baseNumber, bpPerPx)}\n </Typography>\n ) : null}\n </div>\n )\n }\n return null\n })}\n </ContentBlockComponent>\n )\n}\n\nexport default ScalebarCoordinateTicks\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport {\n ElidedBlock as ElidedBlockComponent,\n InterRegionPaddingBlock as InterRegionPaddingBlockComponent,\n} from '../../BaseLinearDisplay/components/Block'\nimport ScalebarCoordinateTicks from './ScalebarCoordinateTicks'\n\ntype LGV = LinearGenomeViewModel\n\nconst ScalebarCoordinateLabels = observer(function ({ model }: { model: LGV }) {\n const { staticBlocks, bpPerPx } = model\n return (\n <>\n {staticBlocks.map((b, idx) => {\n const { key, widthPx } = b\n const k = `${key}-${idx}`\n if (b.type === 'ContentBlock') {\n return <ScalebarCoordinateTicks key={k} block={b} bpPerPx={bpPerPx} />\n } else if (b.type === 'ElidedBlock') {\n return <ElidedBlockComponent key={k} width={widthPx} />\n } else if (b.type === 'InterRegionPaddingBlock') {\n return (\n <InterRegionPaddingBlockComponent\n key={k}\n width={widthPx}\n style={{ background: 'none' }}\n boundary={b.variant === 'boundary'}\n />\n )\n } else {\n return null\n }\n })}\n </>\n )\n})\n\nexport default ScalebarCoordinateLabels\n","import React from 'react'\nimport { Typography } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()(theme => ({\n refLabel: {\n fontSize: 11,\n position: 'absolute',\n left: 2,\n top: -1,\n fontWeight: 'bold',\n lineHeight: 'normal',\n zIndex: 1,\n background: theme.palette.background.paper,\n },\n b0: {\n left: 0,\n zIndex: 100,\n },\n}))\n\nconst ScalebarRefNameLabels = observer(function ({ model }: { model: LGV }) {\n const { classes, cx } = useStyles()\n const { staticBlocks, offsetPx, scaleBarDisplayPrefix } = model\n\n // find the block that needs pinning to the left side for context\n let lastLeftBlock = 0\n staticBlocks.forEach((block, i) => {\n if (block.offsetPx - offsetPx < 0) {\n lastLeftBlock = i\n }\n })\n const val = scaleBarDisplayPrefix()\n const b0 = staticBlocks.blocks[0]\n return (\n <>\n {b0?.type !== 'ContentBlock' && val ? (\n <Typography className={cx(classes.b0, classes.refLabel)}>\n {val}\n </Typography>\n ) : null}\n {staticBlocks.map((block, index) => {\n const {\n offsetPx: blockOffsetPx,\n isLeftEndOfDisplayedRegion,\n key,\n type,\n refName,\n } = block\n const last = (index = lastLeftBlock)\n return type === 'ContentBlock' &&\n (isLeftEndOfDisplayedRegion || last) ? (\n <Typography\n key={`refLabel-${key}-${index}`}\n style={{\n left: last\n ? Math.max(0, -offsetPx)\n : blockOffsetPx - offsetPx - 1,\n paddingLeft: last ? 0 : 1,\n }}\n className={classes.refLabel}\n data-testid={`refLabel-${refName}`}\n >\n {last && val ? `${val}:` : ''}\n {refName}\n </Typography>\n ) : null\n })}\n </>\n )\n})\n\nexport default ScalebarRefNameLabels\n","import { Paper } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport React from 'react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport ScalebarCoordinateLabels from './ScalebarCoordinateLabels'\nimport ScalebarRefNameLabels from './ScalebarRefNameLabels'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n container: {\n overflow: 'hidden',\n position: 'relative',\n },\n zoomContainer: {\n position: 'relative',\n zIndex: 1,\n },\n scalebar: {\n position: 'absolute',\n display: 'flex',\n pointerEvents: 'none',\n },\n})\n\ninterface ScalebarProps {\n model: LGV\n style?: React.CSSProperties\n className?: string\n}\n\nconst Scalebar = observer(\n React.forwardRef<HTMLDivElement, ScalebarProps>(function Scalebar2(\n { model, style, className, ...other },\n ref,\n ) {\n const { classes, cx } = useStyles()\n const { staticBlocks, offsetPx, scaleFactor } = model\n const offsetLeft = staticBlocks.offsetPx - offsetPx\n return (\n <Paper\n data-resizer=\"true\" // used to avoid click-and-drag scrolls on trackscontainer\n className={cx(classes.container, className)}\n variant=\"outlined\"\n ref={ref}\n style={style}\n {...other}\n >\n <div\n className={classes.zoomContainer}\n style={{\n transform: scaleFactor !== 1 ? `scaleX(${scaleFactor})` : undefined,\n }}\n >\n <div\n className={classes.scalebar}\n style={{\n left: offsetLeft - 1,\n width: staticBlocks.totalWidthPx,\n ...style,\n }}\n >\n <ScalebarCoordinateLabels model={model} />\n </div>\n </div>\n <ScalebarRefNameLabels model={model} />\n </Paper>\n )\n }),\n)\n\nexport default Scalebar\n","import React from 'react'\nimport { ContentBlock } from '@jbrowse/core/util/blockTypes'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { LinearGenomeViewModel } from '..'\nimport {\n ContentBlock as ContentBlockComponent,\n ElidedBlock as ElidedBlockComponent,\n InterRegionPaddingBlock as InterRegionPaddingBlockComponent,\n} from '../../BaseLinearDisplay/components/Block'\n\nimport { makeTicks } from '../util'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()(theme => ({\n verticalGuidesZoomContainer: {\n position: 'absolute',\n height: '100%',\n width: '100%',\n zIndex: 1,\n pointerEvents: 'none',\n },\n verticalGuidesContainer: {\n position: 'absolute',\n height: '100%',\n zIndex: 1,\n pointerEvents: 'none',\n display: 'flex',\n },\n tick: {\n position: 'absolute',\n height: '100%',\n width: 1,\n },\n majorTick: {\n background: theme.palette.action.disabled,\n },\n minorTick: {\n background: theme.palette.divider,\n },\n}))\n\nfunction RenderedBlockLines({\n block,\n bpPerPx,\n}: {\n block: ContentBlock\n bpPerPx: number\n}) {\n const { classes, cx } = useStyles()\n const ticks = makeTicks(block.start, block.end, bpPerPx)\n return (\n <ContentBlockComponent block={block}>\n {ticks.map(({ type, base }) => {\n const x =\n (block.reversed ? block.end - base : base - block.start) / bpPerPx\n return (\n <div\n key={base}\n className={cx(\n classes.tick,\n type === 'major' || type === 'labeledMajor'\n ? classes.majorTick\n : classes.minorTick,\n )}\n style={{ left: x }}\n />\n )\n })}\n </ContentBlockComponent>\n )\n}\nconst RenderedVerticalGuides = observer(({ model }: { model: LGV }) => {\n const { staticBlocks, bpPerPx } = model\n return (\n <>\n {staticBlocks.map((block, index) => {\n const k = `${block.key}-${index}`\n if (block.type === 'ContentBlock') {\n return <RenderedBlockLines key={k} block={block} bpPerPx={bpPerPx} />\n } else if (block.type === 'ElidedBlock') {\n return <ElidedBlockComponent key={k} width={block.widthPx} />\n } else if (block.type === 'InterRegionPaddingBlock') {\n return (\n <InterRegionPaddingBlockComponent\n key={k}\n width={block.widthPx}\n boundary={block.variant === 'boundary'}\n />\n )\n }\n return null\n })}\n </>\n )\n})\nconst Gridlines = observer(function ({ model }: { model: LGV }) {\n const { classes } = useStyles()\n // find the block that needs pinning to the left side for context\n const offsetLeft = model.staticBlocks.offsetPx - model.offsetPx\n return (\n <div\n className={classes.verticalGuidesZoomContainer}\n style={{\n transform:\n model.scaleFactor !== 1 ? `scaleX(${model.scaleFactor})` : undefined,\n }}\n >\n <div\n className={classes.verticalGuidesContainer}\n style={{\n left: offsetLeft,\n width: model.staticBlocks.totalWidthPx,\n }}\n >\n <RenderedVerticalGuides model={model} />\n </div>\n </div>\n )\n})\n\nexport default Gridlines\n","import React, { useRef } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()(theme => ({\n centerLineContainer: {\n background: 'transparent',\n height: '100%',\n zIndex: 5, // above the track but under menu\n position: 'absolute',\n border: `1px ${theme.palette.action.active} dashed`,\n borderTop: 'none',\n borderBottom: 'none',\n pointerEvents: 'none',\n },\n centerLineText: {\n position: 'absolute',\n pointerEvents: 'none',\n whiteSpace: 'nowrap',\n fontWeight: 'bold',\n },\n}))\n\nconst CenterLine = observer(function ({ model }: { model: LGV }) {\n const { bpPerPx, centerLineInfo, trackHeights, tracks, width } = model\n const ref = useRef<HTMLDivElement>(null)\n const { classes } = useStyles()\n const startingPosition = width / 2\n\n return tracks.length ? (\n <div\n data-testid=\"centerline_container\"\n className={classes.centerLineContainer}\n role=\"presentation\"\n ref={ref}\n style={{\n left: `${startingPosition}px`,\n width: Math.max(1 / bpPerPx, 1),\n }}\n >\n {centerLineInfo && (\n <div\n // text that indicates what bp is center, positioned\n // at the bottom right of the center line\n data-testid=\"centerline_text\"\n className={classes.centerLineText}\n role=\"presentation\"\n style={{\n left: Math.max(1 / bpPerPx, 1) + 5,\n top: trackHeights,\n }}\n >\n {/* change bp to refName */}\n {centerLineInfo.refName}:{' '}\n {Math.max(Math.round(centerLineInfo.offset) + 1, 0)}\n </div>\n )}\n </div>\n ) : null\n})\n\nexport default CenterLine\n","import React, { useRef, useState } from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { colord } from '@jbrowse/core/util/colord'\nimport { Region, SessionWithWidgets, getSession } from '@jbrowse/core/util'\nimport { Menu } from '@jbrowse/core/ui'\nimport { IconButton, Tooltip } from '@mui/material'\n\n// icons\nimport LinkIcon from '@mui/icons-material/Link'\nimport CloseIcon from '@mui/icons-material/Close'\nimport BookmarkIcon from '@mui/icons-material/Bookmark'\n\n// locals\nimport { LinearGenomeViewModel } from '../model'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()(theme => ({\n highlight: {\n height: '100%',\n position: 'absolute',\n overflow: 'hidden',\n background: colord(theme.palette.highlight.main).alpha(0.35).toRgbString(),\n },\n linkIcon: {\n color: colord(theme.palette.highlight.main).darken(0.2).toRgbString(),\n },\n}))\n\nconst Highlight = observer(function Highlight({\n model,\n highlight,\n}: {\n model: LGV\n highlight: {\n assemblyName: string\n refName: string\n start: number\n end: number\n }\n}) {\n const { classes } = useStyles()\n const [open, setOpen] = useState(false)\n const anchorEl = useRef(null)\n const session = getSession(model) as SessionWithWidgets\n const { assemblyManager } = session\n\n const dismissHighlight = () => {\n model.removeHighlight(highlight)\n }\n\n function handleClose() {\n setOpen(false)\n }\n\n // coords\n const mapCoords = (r: {\n assemblyName: string\n refName: string\n start: number\n end: number\n }) => {\n const s = model.bpToPx({\n refName: r.refName,\n coord: r.start,\n })\n const e = model.bpToPx({\n refName: r.refName,\n coord: r.end,\n })\n return s && e\n ? {\n width: Math.max(Math.abs(e.offsetPx - s.offsetPx), 3),\n left: Math.min(s.offsetPx, e.offsetPx) - model.offsetPx,\n }\n : undefined\n }\n\n const asm = assemblyManager.get(highlight.assemblyName)\n\n const h = mapCoords({\n ...highlight,\n refName: asm?.getCanonicalRefName(highlight.refName) ?? highlight.refName,\n })\n\n return h ? (\n <div\n className={classes.highlight}\n style={{\n left: h.left,\n width: h.width,\n }}\n >\n <Tooltip title=\"Highlighted from URL parameter\" arrow>\n <IconButton\n ref={anchorEl}\n onClick={() => {\n setOpen(true)\n }}\n style={{ zIndex: 3 }}\n >\n <LinkIcon fontSize=\"small\" className={classes.linkIcon} />\n </IconButton>\n </Tooltip>\n <Menu\n anchorEl={anchorEl.current}\n onMenuItemClick={(_event, callback) => {\n callback(session)\n handleClose()\n }}\n open={open}\n onClose={handleClose}\n menuItems={[\n {\n label: 'Dismiss highlight',\n icon: CloseIcon,\n onClick: () => {\n dismissHighlight()\n },\n },\n {\n label: 'Bookmark highlighted region',\n icon: BookmarkIcon,\n onClick: () => {\n let bookmarkWidget = session.widgets.get('GridBookmark')\n if (!bookmarkWidget) {\n bookmarkWidget = session.addWidget(\n 'GridBookmarkWidget',\n 'GridBookmark',\n )\n }\n // @ts-expect-error\n bookmarkWidget.addBookmark(highlight as Region)\n dismissHighlight()\n },\n },\n ]}\n />\n </div>\n ) : null\n})\n\nconst HighlightGroup = observer(function HighlightGroup({\n model,\n}: {\n model: LGV\n}) {\n return model.highlight.map((highlight, idx) => (\n <Highlight\n key={`${JSON.stringify(highlight)}-${idx}`}\n model={model}\n highlight={highlight}\n />\n ))\n})\n\nexport default HighlightGroup\n","import React, { useRef } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { Menu } from '@jbrowse/core/ui'\nimport { getEnv } from '@jbrowse/core/util'\n\n// local utils\nimport { LinearGenomeViewModel } from '..'\nimport { useSideScroll, useRangeSelect, useWheelScroll } from './hooks'\n\n// local components\nimport Rubberband from './Rubberband'\nimport Scalebar from './Scalebar'\nimport Gridlines from './Gridlines'\nimport CenterLine from './CenterLine'\nimport VerticalGuide from './VerticalGuide'\nimport RubberbandSpan from './RubberbandSpan'\nimport HighlightGroup from './Highlight'\nimport { SCALE_BAR_HEIGHT } from '../consts'\n\nconst useStyles = makeStyles()({\n tracksContainer: {\n position: 'relative',\n overflow: 'hidden',\n },\n})\n\ntype LGV = LinearGenomeViewModel\n\nconst TracksContainer = observer(function TracksContainer({\n children,\n model,\n}: {\n children: React.ReactNode\n model: LGV\n}) {\n const { classes } = useStyles()\n const { pluginManager } = getEnv(model)\n const { mouseDown: mouseDown1, mouseUp } = useSideScroll(model)\n const ref = useRef<HTMLDivElement>(null)\n const {\n guideX,\n rubberbandOn,\n leftBpOffset,\n rightBpOffset,\n numOfBpSelected,\n width,\n left,\n anchorPosition,\n open,\n handleMenuItemClick,\n handleClose,\n mouseMove,\n mouseDown: mouseDown2,\n } = useRangeSelect(ref, model, true)\n useWheelScroll(ref, model)\n\n const additional = pluginManager.evaluateExtensionPoint(\n 'LinearGenomeView-TracksContainerComponent',\n undefined,\n { model },\n ) as React.ReactNode\n\n return (\n <div\n ref={ref}\n data-testid=\"trackContainer\"\n className={classes.tracksContainer}\n onMouseDown={event => {\n mouseDown1(event)\n mouseDown2(event)\n }}\n onMouseMove={mouseMove}\n onMouseUp={mouseUp}\n >\n {model.showGridlines ? <Gridlines model={model} /> : null}\n {model.showCenterLine ? <CenterLine model={model} /> : null}\n {guideX !== undefined ? (\n <VerticalGuide model={model} coordX={guideX} />\n ) : rubberbandOn ? (\n <RubberbandSpan\n leftBpOffset={leftBpOffset}\n rightBpOffset={rightBpOffset}\n numOfBpSelected={numOfBpSelected}\n width={width}\n left={left}\n />\n ) : null}\n {anchorPosition ? (\n <Menu\n anchorReference=\"anchorPosition\"\n anchorPosition={{\n left: anchorPosition.clientX,\n top: anchorPosition.clientY,\n }}\n onMenuItemClick={handleMenuItemClick}\n open={open}\n onClose={handleClose}\n menuItems={model.rubberBandMenuItems()}\n />\n ) : null}\n\n <Rubberband\n model={model}\n ControlComponent={\n <Scalebar\n model={model}\n style={{\n height: SCALE_BAR_HEIGHT,\n boxSizing: 'border-box',\n }}\n />\n }\n />\n <HighlightGroup model={model} />\n {additional}\n {children}\n </div>\n )\n})\n\nexport default TracksContainer\n","import React, { lazy, Suspense, useEffect, useRef } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { LoadingEllipses } from '@jbrowse/core/ui'\nimport { getSession } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport TrackContainer from './TrackContainer'\nimport TracksContainer from './TracksContainer'\n\nconst ImportForm = lazy(() => import('./ImportForm'))\nconst NoTracksActiveButton = lazy(() => import('./NoTracksActiveButton'))\n\nconst useStyles = makeStyles()(theme => ({\n note: {\n textAlign: 'center',\n paddingTop: theme.spacing(1),\n paddingBottom: theme.spacing(1),\n },\n rel: {\n position: 'relative',\n },\n top: {\n zIndex: 1000,\n },\n}))\n\nconst LinearGenomeView = observer(function ({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const { tracks, error, initialized, hasDisplayedRegions } = model\n const ref = useRef<HTMLDivElement>(null)\n const session = getSession(model)\n const { classes } = useStyles()\n useEffect(() => {\n // sets the focused view id based on a click within the LGV;\n // necessary for subviews to be focused properly\n function handleSelectView(e: Event) {\n if (e.target instanceof Element && ref.current?.contains(e.target)) {\n session.setFocusedViewId?.(model.id)\n }\n }\n\n document.addEventListener('mousedown', handleSelectView)\n document.addEventListener('keydown', handleSelectView)\n return () => {\n document.removeEventListener('mousedown', handleSelectView)\n document.removeEventListener('keydown', handleSelectView)\n }\n }, [session, model])\n\n if (!initialized && !error) {\n return <LoadingEllipses variant=\"h6\" />\n }\n if (!hasDisplayedRegions || error) {\n return <ImportForm model={model} />\n }\n\n const MiniControlsComponent = model.MiniControlsComponent()\n const HeaderComponent = model.HeaderComponent()\n\n return (\n <div\n className={classes.rel}\n ref={ref}\n onMouseLeave={() => {\n session.setHovered(undefined)\n }}\n onMouseMove={event => {\n const c = ref.current\n if (!c) {\n return\n }\n const { tracks } = model\n const leftPx = event.clientX - c.getBoundingClientRect().left\n const hoverPosition = model.pxToBp(leftPx)\n const hoverFeature = tracks.find(t => t.displays[0].featureUnderMouse)\n session.setHovered({ hoverPosition, hoverFeature })\n }}\n >\n <HeaderComponent model={model} />\n <MiniControlsComponent model={model} />\n <TracksContainer model={model}>\n {!tracks.length ? (\n <Suspense fallback={<React.Fragment />}>\n <NoTracksActiveButton model={model} />\n </Suspense>\n ) : (\n tracks.map(track => (\n <TrackContainer key={track.id} model={model} track={track} />\n ))\n )}\n </TracksContainer>\n </div>\n )\n})\n\nexport default LinearGenomeView\n","import React from 'react'\nimport { useTheme, alpha } from '@mui/material'\nimport { observer } from 'mobx-react'\n\n// core\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport { getFillProps, getStrokeProps } from '@jbrowse/core/util'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport { HEADER_BAR_HEIGHT } from '../consts'\n\nconst OverviewScalebarPolygon = observer(function ({\n model,\n overview,\n useOffset = true,\n}: {\n model: LinearGenomeViewModel\n overview: Base1DViewModel\n useOffset?: boolean\n}) {\n const theme = useTheme()\n const multiplier = Number(useOffset)\n const { interRegionPaddingWidth, offsetPx, dynamicBlocks, cytobandOffset } =\n model\n const { contentBlocks, totalWidthPxWithoutBorders } = dynamicBlocks\n const polygonColor = theme.palette.tertiary.light\n\n // catches possible null from at's below\n if (!contentBlocks.length) {\n return null\n }\n const first = contentBlocks.at(0)!\n const last = contentBlocks.at(-1)!\n const topLeft =\n (overview.bpToPx({\n ...first,\n coord: first.reversed ? first.end : first.start,\n }) || 0) +\n cytobandOffset * multiplier\n const topRight =\n (overview.bpToPx({\n ...last,\n coord: last.reversed ? last.start : last.end,\n }) || 0) +\n cytobandOffset * multiplier\n\n const startPx = Math.max(0, -offsetPx)\n const endPx =\n startPx +\n totalWidthPxWithoutBorders +\n (contentBlocks.length * interRegionPaddingWidth) / 2\n\n const points = [\n [startPx, HEADER_BAR_HEIGHT],\n [endPx, HEADER_BAR_HEIGHT],\n [topRight, 0],\n [topLeft, 0],\n ]\n\n return (\n <polygon\n points={points.toString()}\n {...getFillProps(alpha(polygonColor, 0.3))}\n {...getStrokeProps(alpha(polygonColor, 0.8))}\n />\n )\n})\n\nexport default OverviewScalebarPolygon\n","import React, { Suspense, lazy, useState } from 'react'\n\nimport { IconButton, InputAdornment } from '@mui/material'\n\n// icons\nimport SearchIcon from '@mui/icons-material/Search'\nimport HelpIcon from '@mui/icons-material/Help'\n\n// lazy\nconst HelpDialog = lazy(() => import('./HelpDialog'))\n\nfunction HelpAdornment() {\n const [isHelpDialogDisplayed, setHelpDialogDisplayed] = useState(false)\n return (\n <>\n <IconButton\n onClick={() => {\n setHelpDialogDisplayed(true)\n }}\n size=\"small\"\n >\n <HelpIcon fontSize=\"small\" />\n </IconButton>\n {isHelpDialogDisplayed ? (\n <Suspense fallback={null}>\n <HelpDialog\n handleClose={() => {\n setHelpDialogDisplayed(false)\n }}\n />\n </Suspense>\n ) : null}\n </>\n )\n}\n\nexport default function EndAdornment({\n showHelp,\n endAdornment,\n}: {\n showHelp?: boolean\n endAdornment: React.ReactNode\n}) {\n return (\n <>\n <InputAdornment position=\"end\" style={{ marginRight: 7 }}>\n <SearchIcon fontSize=\"small\" />\n {showHelp ? <HelpAdornment /> : null}\n </InputAdornment>\n {endAdornment}\n </>\n )\n}\n","import React from 'react'\nimport {\n AutocompleteRenderInputParams,\n TextField,\n TextFieldProps as TFP,\n} from '@mui/material'\n\n// locals\nimport EndAdornment from './EndAdornment'\n\nexport default function AutocompleteTextField({\n TextFieldProps,\n inputBoxVal,\n params,\n showHelp,\n setInputValue,\n setCurrentSearch,\n}: {\n TextFieldProps: TFP\n inputBoxVal: string\n showHelp?: boolean\n params: AutocompleteRenderInputParams\n setInputValue: (arg: string) => void\n setCurrentSearch: (arg: string) => void\n}) {\n // eslint-disable-next-line @typescript-eslint/no-deprecated\n const { helperText, InputProps = {} } = TextFieldProps\n return (\n <TextField\n onBlur={() => {\n // this is used to restore a refName or the non-user-typed input\n // to the box on blurring\n setInputValue(inputBoxVal)\n }}\n {...params}\n {...TextFieldProps}\n size=\"small\"\n helperText={helperText}\n slotProps={{\n input: {\n ...params.InputProps,\n ...InputProps,\n\n endAdornment: (\n <EndAdornment\n showHelp={showHelp}\n endAdornment={params.InputProps.endAdornment}\n />\n ),\n },\n }}\n placeholder=\"Search for location\"\n onChange={e => {\n setCurrentSearch(e.target.value)\n }}\n />\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { observer } from 'mobx-react'\nimport { getSession, useDebounce, measureText } from '@jbrowse/core/util'\nimport BaseResult, {\n RefSequenceResult,\n} from '@jbrowse/core/TextSearch/BaseResults'\nimport { Autocomplete, TextFieldProps as TFP } from '@mui/material'\n\n// locals\nimport { LinearGenomeViewModel } from '../../model'\nimport { getDeduplicatedResult, getFiltered, Option } from './util'\nimport AutocompleteTextField from './AutocompleteTextField'\n\nconst RefNameAutocomplete = observer(function ({\n model,\n onSelect,\n assemblyName,\n style,\n fetchResults,\n onChange,\n value,\n showHelp = true,\n minWidth = 200,\n maxWidth = 550,\n TextFieldProps = {},\n}: {\n model: LinearGenomeViewModel\n onSelect?: (region: BaseResult) => void\n onChange?: (val: string) => void\n assemblyName?: string\n value?: string\n fetchResults: (query: string) => Promise<BaseResult[]>\n style?: React.CSSProperties\n minWidth?: number\n maxWidth?: number\n showHelp?: boolean\n TextFieldProps?: TFP\n}) {\n const session = getSession(model)\n const { assemblyManager } = session\n const [open, setOpen] = useState(false)\n const [loaded, setLoaded] = useState(true)\n const [currentSearch, setCurrentSearch] = useState('')\n const [inputValue, setInputValue] = useState('')\n const [searchOptions, setSearchOptions] = useState<Option[]>()\n const debouncedSearch = useDebounce(currentSearch, 300)\n const assembly = assemblyName ? assemblyManager.get(assemblyName) : undefined\n const { coarseVisibleLocStrings, hasDisplayedRegions } = model\n\n useEffect(() => {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n if (debouncedSearch === '' || !assemblyName) {\n return\n }\n\n setLoaded(false)\n const results = await fetchResults(debouncedSearch)\n setLoaded(true)\n setSearchOptions(getDeduplicatedResult(results))\n } catch (e) {\n console.error(e)\n session.notifyError(`${e}`, e)\n }\n })()\n }, [assemblyName, fetchResults, debouncedSearch, session])\n\n const inputBoxVal = coarseVisibleLocStrings || value || ''\n\n // heuristic, text width + 60 accommodates help icon and search icon\n const width = Math.min(\n Math.max(measureText(inputBoxVal, 14) + 100, minWidth),\n maxWidth,\n )\n\n const refNames = assembly?.refNames\n const regionOptions =\n refNames?.map(refName => ({\n result: new RefSequenceResult({\n refName,\n label: refName,\n matchedAttribute: 'refName',\n }),\n })) || []\n\n // notes on implementation:\n // The selectOnFocus setting helps highlight the field when clicked\n return (\n <Autocomplete\n data-testid=\"autocomplete\"\n disableListWrap\n disableClearable\n disabled={!assemblyName}\n freeSolo\n includeInputInList\n selectOnFocus\n style={{ ...style, width }}\n value={inputBoxVal}\n loading={!loaded}\n inputValue={inputValue}\n onInputChange={(_event, newInputValue) => {\n setInputValue(newInputValue)\n onChange?.(newInputValue)\n }}\n loadingText=\"loading results\"\n open={open}\n onOpen={() => {\n setOpen(true)\n }}\n onClose={() => {\n setOpen(false)\n setLoaded(true)\n if (hasDisplayedRegions) {\n setCurrentSearch('')\n setSearchOptions(undefined)\n }\n }}\n onChange={(_event, selectedOption) => {\n if (!selectedOption || !assemblyName) {\n return\n }\n\n if (typeof selectedOption === 'string') {\n // handles string inputs on keyPress enter\n onSelect?.(new BaseResult({ label: selectedOption }))\n } else {\n onSelect?.(selectedOption.result)\n }\n setInputValue(inputBoxVal)\n }}\n options={searchOptions?.length ? searchOptions : regionOptions}\n getOptionDisabled={option => option.group === 'limitOption'}\n filterOptions={(opts, { inputValue }) => getFiltered(opts, inputValue)}\n renderInput={params => (\n <AutocompleteTextField\n showHelp={showHelp}\n params={params}\n inputBoxVal={inputBoxVal}\n TextFieldProps={TextFieldProps}\n setCurrentSearch={setCurrentSearch}\n setInputValue={setInputValue}\n />\n )}\n getOptionLabel={opt =>\n typeof opt === 'string' ? opt : opt.result.getDisplayString()\n }\n />\n )\n})\n\nexport default RefNameAutocomplete\n","import BaseResult from '@jbrowse/core/TextSearch/BaseResults'\n\nexport interface Option {\n group?: string\n result: BaseResult\n}\n\n// filter so don't need re-filtering\nfunction filterOptions(options: Option[], searchQuery: string) {\n return options.filter(\n ({ result }) =>\n result.getLabel().toLowerCase().includes(searchQuery) ||\n result.matchedObject,\n )\n}\n\n// the logic of this method is to only apply a filter to RefSequenceResults\n// because they do not have a matchedObject. the trix search results already\nexport function getFiltered(opts: Option[], inputValue: string) {\n const filtered = filterOptions(opts, inputValue.toLocaleLowerCase())\n return [\n ...filtered.slice(0, 100),\n ...(filtered.length > 100\n ? [\n {\n group: 'limitOption',\n result: new BaseResult({\n label: 'keep typing for more results',\n }),\n },\n ]\n : []),\n ]\n}\n\nexport function aggregateResults(results: BaseResult[]) {\n const m: Record<string, BaseResult[]> = {}\n\n for (const result of results) {\n const displayString = result.getDisplayString()\n if (!m[displayString]) {\n m[displayString] = []\n }\n m[displayString].push(result)\n }\n return m\n}\n\nexport function getDeduplicatedResult(results: BaseResult[]) {\n return Object.entries(aggregateResults(results)).map(\n ([displayString, results]) =>\n results.length === 1\n ? {\n result: results[0]!,\n }\n : {\n // deduplicate a \"multi-result\"\n result: new BaseResult({\n displayString,\n results,\n label: displayString,\n }),\n },\n )\n}\n","import React, { useRef } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { Popover, Typography, alpha } from '@mui/material'\nimport { stringify, toLocale } from '@jbrowse/core/util'\n\nconst useStyles = makeStyles()(theme => {\n const { tertiary } = theme.palette\n const background = alpha(tertiary.light, 0.7)\n return {\n rubberband: {\n height: '100%',\n background,\n position: 'absolute',\n zIndex: 10,\n textAlign: 'center',\n overflow: 'hidden',\n },\n rubberbandControl: {\n cursor: 'crosshair',\n width: '100%',\n minHeight: 8,\n },\n rubberbandText: {\n color: tertiary.contrastText,\n },\n popover: {\n mouseEvents: 'none',\n cursor: 'crosshair',\n },\n paper: {\n paddingLeft: theme.spacing(1),\n paddingRight: theme.spacing(1),\n },\n }\n})\n\ninterface Offset {\n coord: number\n refName?: string\n oob?: boolean\n}\n\nexport default function RubberbandSpan({\n leftBpOffset,\n rightBpOffset,\n numOfBpSelected,\n left,\n width,\n}: {\n leftBpOffset: Offset\n rightBpOffset: Offset\n numOfBpSelected?: number\n left: number\n width: number\n}) {\n const ref = useRef<HTMLDivElement>(null)\n const { classes } = useStyles()\n return (\n <>\n {ref.current ? (\n <>\n <Popover\n className={classes.popover}\n classes={{ paper: classes.paper }}\n open\n anchorEl={ref.current}\n anchorOrigin={{ vertical: 'top', horizontal: 'left' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'right' }}\n keepMounted\n disableRestoreFocus\n >\n <Typography>{stringify(leftBpOffset)}</Typography>\n </Popover>\n <Popover\n className={classes.popover}\n classes={{ paper: classes.paper }}\n open\n anchorEl={ref.current}\n anchorOrigin={{ vertical: 'top', horizontal: 'right' }}\n transformOrigin={{ vertical: 'bottom', horizontal: 'left' }}\n keepMounted\n disableRestoreFocus\n >\n <Typography>{stringify(rightBpOffset)}</Typography>\n </Popover>\n </>\n ) : null}\n <div ref={ref} className={classes.rubberband} style={{ left, width }}>\n {numOfBpSelected ? (\n <Typography variant=\"h6\" className={classes.rubberbandText}>\n {toLocale(numOfBpSelected)} bp\n </Typography>\n ) : null}\n </div>\n </>\n )\n}\n","import { Assembly } from '@jbrowse/core/assemblyManager/assembly'\nimport { SearchType } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SearchScope } from '@jbrowse/core/TextSearch/TextSearchManager'\nimport { dedupe, TextSearchManager } from '@jbrowse/core/util'\nimport BaseResult from '@jbrowse/core/TextSearch/BaseResults'\n\nexport async function fetchResults({\n queryString,\n searchType,\n searchScope,\n rankSearchResults,\n textSearchManager,\n assembly,\n}: {\n queryString: string\n searchScope: SearchScope\n rankSearchResults: (results: BaseResult[]) => BaseResult[]\n searchType?: SearchType\n textSearchManager?: TextSearchManager\n assembly?: Assembly\n}) {\n if (!textSearchManager) {\n console.warn('No text search manager')\n }\n\n const textSearchResults = await textSearchManager?.search(\n {\n queryString,\n searchType,\n },\n searchScope,\n rankSearchResults,\n )\n\n const refNameResults = assembly?.allRefNames\n ?.filter(ref => ref.toLowerCase().startsWith(queryString.toLowerCase()))\n .slice(0, 10)\n .map(r => new BaseResult({ label: r }))\n\n return dedupe(\n [...(refNameResults || []), ...(textSearchResults || [])],\n elt => elt.getId(),\n )\n}\n\n// splits on the last instance of a character\nexport function splitLast(str: string, split: string): [string, string] {\n const lastIndex = str.lastIndexOf(split)\n if (lastIndex === -1) {\n return [str, '']\n } else {\n const before = str.slice(0, lastIndex)\n const after = str.slice(lastIndex + 1)\n return [before, after]\n }\n}\n\nexport function getRelativeX(\n event: { clientX: number; target: EventTarget | null },\n element: HTMLElement | null,\n) {\n return event.clientX - (element?.getBoundingClientRect().left || 0)\n}\n\nexport function getCytobands(assembly: Assembly | undefined, refName: string) {\n return (\n assembly?.cytobands\n ?.map(f => ({\n refName:\n assembly.getCanonicalRefName(f.get('refName')) || f.get('refName'),\n start: f.get('start'),\n end: f.get('end'),\n type: f.get('type') as string,\n }))\n .filter(f => f.refName === refName) || []\n )\n}\n","export const HEADER_BAR_HEIGHT = 48\nexport const HEADER_OVERVIEW_HEIGHT = 20\nexport const SCALE_BAR_HEIGHT = 17\nexport const RESIZE_HANDLE_HEIGHT = 3\nexport const INTER_REGION_PADDING_WIDTH = 2\nexport const SPACING = 7\nexport const WIDGET_HEIGHT = 32\n","import React from 'react'\nimport { useTheme } from '@mui/material'\nimport { stripAlpha } from '@jbrowse/core/util'\n\nexport default function SVGBackground({\n width,\n height,\n shift,\n}: {\n width: number\n height: number\n shift: number\n}) {\n const theme = useTheme()\n return (\n <rect\n width={width + shift * 2}\n height={height}\n fill={stripAlpha(theme.palette.background.default)}\n />\n )\n}\n","import React from 'react'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\n// SVG component, region separator\nexport default function SVGRegionSeparators({\n model,\n height,\n}: {\n height: number\n model: LGV\n}) {\n const { dynamicBlocks, offsetPx, interRegionPaddingWidth } = model\n return (\n <>\n {dynamicBlocks.contentBlocks.slice(1).map(block => (\n <rect\n key={block.key}\n x={block.offsetPx - offsetPx - interRegionPaddingWidth}\n width={interRegionPaddingWidth}\n y={0}\n height={height}\n fill=\"grey\"\n />\n ))}\n </>\n )\n}\n","import React from 'react'\nimport { useTheme } from '@mui/material'\nimport { coarseStripHTML, stripAlpha } from '@jbrowse/core/util'\n\nexport default function SVGTrackLabel({\n trackLabels,\n trackName,\n fontSize,\n trackLabelOffset,\n x,\n}: {\n trackName: string\n trackLabels: string\n fontSize: number\n trackLabelOffset: number\n x: number\n}) {\n const theme = useTheme()\n const fill = stripAlpha(theme.palette.text.primary)\n const xoff = trackLabels === 'overlay' ? 5 : 0\n const yoff = trackLabels === 'offset' ? 5 : 0\n const name = coarseStripHTML(trackName)\n return trackLabels !== 'none' ? (\n <g>\n {trackLabels === 'left' ? (\n <text\n x={trackLabelOffset - 40}\n y={20}\n fill={fill}\n fontSize={fontSize}\n dominantBaseline=\"hanging\"\n textAnchor=\"end\"\n >\n {name}\n </text>\n ) : (\n <text\n x={x + xoff}\n y={yoff}\n fill={fill}\n fontSize={fontSize}\n dominantBaseline=\"hanging\"\n >\n {name}\n </text>\n )}\n </g>\n ) : null\n}\n","import React from 'react'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\nimport { getSession } from '@jbrowse/core/util'\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport SVGRegionSeparators from './SVGRegionSeparators'\nimport SVGTrackLabel from './SVGTrackLabel'\n\ntype LGV = LinearGenomeViewModel\n\ninterface DisplayResult {\n track: {\n configuration: AnyConfigurationModel\n displays: { height: number }[]\n }\n result: string\n}\n\n// SVG component, tracks\nexport default function SVGTracks({\n displayResults,\n model,\n offset,\n textHeight,\n fontSize,\n trackLabels = 'offset',\n trackLabelOffset = 0,\n}: {\n displayResults: DisplayResult[]\n model: LGV\n offset: number\n textHeight: number\n fontSize: number\n trackLabels?: string\n trackLabelOffset?: number\n}) {\n const session = getSession(model)\n const textOffset = trackLabels === 'offset' ? textHeight : 0\n return (\n <>\n {displayResults.map(({ track, result }) => {\n const current = offset\n const conf = track.configuration\n const trackName = getTrackName(conf, session)\n const display = track.displays[0]!\n const x = Math.max(-model.offsetPx, 0)\n offset += display.height + textOffset\n return (\n <g key={conf.trackId} transform={`translate(0 ${current})`}>\n <g transform={`translate(${trackLabelOffset} ${textOffset})`}>\n <SVGRegionSeparators model={model} height={display.height} />\n {result}\n </g>\n <SVGTrackLabel\n trackName={trackName}\n fontSize={fontSize}\n trackLabels={trackLabels}\n trackLabelOffset={trackLabelOffset}\n x={x}\n />\n </g>\n )\n })}\n </>\n )\n}\n","import React from 'react'\nimport { getTickDisplayStr, stripAlpha } from '@jbrowse/core/util'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport { makeTicks } from '../util'\n\nimport { LinearGenomeViewModel } from '..'\nimport SVGRegionSeparators from './SVGRegionSeparators'\n\ntype LGV = LinearGenomeViewModel\n\nfunction Ruler({\n start,\n end,\n bpPerPx,\n reversed = false,\n major = true,\n minor = true,\n hideText = false,\n}: {\n start: number\n end: number\n bpPerPx: number\n reversed?: boolean\n major?: boolean\n minor?: boolean\n hideText?: boolean\n}) {\n const ticks = makeTicks(start, end, bpPerPx, major, minor)\n const theme = useTheme()\n const c = stripAlpha(theme.palette.text.secondary)\n return (\n <>\n {ticks.map(tick => {\n const x = (reversed ? end - tick.base : tick.base - start) / bpPerPx\n return (\n <line\n key={`tick-${tick.base}`}\n x1={x}\n x2={x}\n y1={0}\n y2={tick.type === 'major' ? 6 : 4}\n strokeWidth={1}\n stroke={c}\n />\n )\n })}\n {!hideText\n ? ticks\n .filter(tick => tick.type === 'major')\n .map(tick => {\n const x =\n (reversed ? end - tick.base : tick.base - start) / bpPerPx\n return (\n <text\n key={`label-${tick.base}`}\n x={x - 3}\n y={7 + 11}\n fontSize={11}\n fill={c}\n >\n {getTickDisplayStr(tick.base + 1, bpPerPx)}\n </text>\n )\n })\n : null}\n </>\n )\n}\n\nexport default function SVGRuler({\n model,\n fontSize,\n}: {\n model: LGV\n fontSize: number\n}) {\n const {\n dynamicBlocks: { contentBlocks },\n offsetPx: viewOffsetPx,\n bpPerPx,\n } = model\n const renderRuler = contentBlocks.length < 5\n const theme = useTheme()\n const c = stripAlpha(theme.palette.text.primary)\n return (\n <>\n <SVGRegionSeparators model={model} height={30} />\n {contentBlocks.map(block => {\n const { start, end, key, reversed, offsetPx, refName, widthPx } = block\n const offset = offsetPx - viewOffsetPx\n const clipid = `clip-${key}`\n return (\n <g key={key}>\n <defs>\n <clipPath id={clipid}>\n <rect x={0} y={0} width={widthPx} height={100} />\n </clipPath>\n </defs>\n <g transform={`translate(${offset} 0)`}>\n <g clipPath={`url(#${clipid})`}>\n <text x={4} y={fontSize} fontSize={fontSize} fill={c}>\n {refName}\n </text>\n <g transform=\"translate(0 20)\">\n <Ruler\n hideText={!renderRuler}\n start={start}\n end={end}\n bpPerPx={bpPerPx}\n reversed={reversed}\n />\n </g>\n </g>\n </g>\n </g>\n )\n })}\n </>\n )\n}\n","import React from 'react'\nimport { getBpDisplayStr, stripAlpha } from '@jbrowse/core/util'\nimport { useTheme } from '@mui/material'\nimport { LinearGenomeViewModel } from '..'\n\ntype LGV = LinearGenomeViewModel\n\nexport default function SVGScalebar({\n model,\n fontSize,\n}: {\n model: LGV\n fontSize: number\n}) {\n const {\n offsetPx,\n dynamicBlocks: { totalWidthPxWithoutBorders: totalWidthPx, totalBp },\n } = model\n const theme = useTheme()\n const displayBp = getBpDisplayStr(totalBp)\n const x0 = Math.max(-offsetPx, 0)\n const x1 = x0 + totalWidthPx\n const c = stripAlpha(theme.palette.text.secondary)\n const x = x0 + (x1 - x0) / 2\n const y = fontSize\n return (\n <>\n <line x1={x0} x2={x1} y1={10} y2={10} stroke={c} />\n <line x1={x0} x2={x0} y1={5} y2={15} stroke={c} />\n <line x1={x1} x2={x1} y1={5} y2={15} stroke={c} />\n <text\n x={x}\n y={y}\n textAnchor=\"middle\"\n dominantBaseline=\"hanging\"\n fontSize={fontSize}\n fill={c}\n >\n {displayBp}\n </text>\n </>\n )\n}\n","import React from 'react'\nimport { getSession, stripAlpha } from '@jbrowse/core/util'\nimport Base1DView from '@jbrowse/core/util/Base1DViewModel'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport Cytobands from '../components/Cytobands'\nimport SVGRuler from './SVGRuler'\nimport SVGScalebar from './SVGScalebar'\nimport OverviewScalebarPolygon from '../components/OverviewScalebarPolygon'\nimport { HEADER_OVERVIEW_HEIGHT } from '../consts'\n\nexport default function SVGHeader({\n model,\n fontSize,\n cytobandHeight,\n rulerHeight,\n}: {\n model: LinearGenomeViewModel\n rulerHeight: number\n fontSize: number\n cytobandHeight: number\n}) {\n const { width, assemblyNames, showCytobands, displayedRegions } = model\n const { assemblyManager } = getSession(model)\n const assemblyName = assemblyNames.length > 1 ? '' : assemblyNames[0]!\n const assembly = assemblyManager.get(assemblyName)\n const theme = useTheme()\n const c = stripAlpha(theme.palette.text.primary)\n const overview = Base1DView.create({\n displayedRegions: JSON.parse(JSON.stringify(displayedRegions)),\n interRegionPaddingWidth: 0,\n minimumBlockWidth: model.minimumBlockWidth,\n })\n const visibleRegions = model.dynamicBlocks.contentBlocks\n if (!visibleRegions.length) {\n return null\n }\n\n overview.setVolatileWidth(width)\n overview.showAllRegions()\n const block = overview.dynamicBlocks.contentBlocks[0]!\n const first = visibleRegions.at(0)!\n const last = visibleRegions.at(-1)!\n const firstOverviewPx =\n overview.bpToPx({\n ...first,\n coord: first.reversed ? first.end : first.start,\n }) || 0\n\n const lastOverviewPx =\n overview.bpToPx({\n ...last,\n coord: last.reversed ? last.start : last.end,\n }) || 0\n const y = +showCytobands * cytobandHeight\n return (\n <g id=\"header\">\n <text x={0} y={0} dominantBaseline=\"hanging\" fontSize={fontSize} fill={c}>\n {assemblyName}\n </text>\n\n {showCytobands ? (\n <g transform={`translate(0 ${rulerHeight})`}>\n <Cytobands overview={overview} assembly={assembly} block={block} />\n <rect\n stroke=\"red\"\n fill=\"rgb(255,0,0)\"\n fillOpacity={0.1}\n width={Math.max(lastOverviewPx - firstOverviewPx, 0.5)}\n height={HEADER_OVERVIEW_HEIGHT - 1}\n x={firstOverviewPx}\n y={0.5}\n />\n <g transform={`translate(0,${HEADER_OVERVIEW_HEIGHT})`}>\n <OverviewScalebarPolygon\n overview={overview}\n model={model}\n useOffset={false}\n />\n </g>\n </g>\n ) : null}\n\n <g transform={`translate(0 ${fontSize + y})`}>\n <SVGScalebar model={model} fontSize={fontSize} />\n </g>\n <g transform={`translate(0 ${rulerHeight + y})`}>\n <SVGRuler model={model} fontSize={fontSize} />\n </g>\n </g>\n )\n}\n","/* eslint-disable react-refresh/only-export-components */\nimport React from 'react'\nimport { when } from 'mobx'\nimport {\n getSession,\n max,\n measureText,\n renderToStaticMarkup,\n} from '@jbrowse/core/util'\nimport { ThemeProvider } from '@mui/material'\nimport { createJBrowseTheme } from '@jbrowse/core/ui'\nimport { getTrackName } from '@jbrowse/core/util/tracks'\nimport { getRoot } from 'mobx-state-tree'\n\n// locals\nimport { LinearGenomeViewModel, ExportSvgOptions } from '..'\nimport SVGBackground from './SVGBackground'\nimport SVGTracks from './SVGTracks'\nimport SVGHeader from './SVGHeader'\nimport { totalHeight } from './util'\n\ntype LGV = LinearGenomeViewModel\n\n// render LGV to SVG\nexport async function renderToSvg(model: LGV, opts: ExportSvgOptions) {\n await when(() => model.initialized)\n const {\n textHeight = 18,\n headerHeight = 40,\n rulerHeight = 50,\n fontSize = 13,\n cytobandHeight = 100,\n trackLabels = 'offset',\n themeName = 'default',\n Wrapper = ({ children }) => children,\n } = opts\n const session = getSession(model)\n const { allThemes } = session\n\n const { createRootFn } = getRoot<any>(model)\n const theme = allThemes?.()[themeName]\n const { width, tracks, showCytobands } = model\n const shift = 50\n const c = +showCytobands * cytobandHeight\n const offset = headerHeight + rulerHeight + c + 10\n const height = totalHeight(tracks, textHeight, trackLabels) + offset + 100\n const displayResults = await Promise.all(\n tracks.map(async track => {\n const display = track.displays[0]\n await when(() => !display.renderProps().notReady)\n return { track, result: await display.renderSvg({ ...opts, theme }) }\n }),\n )\n const trackLabelMaxLen =\n max(\n tracks.map(t =>\n measureText(getTrackName(t.configuration, session), fontSize),\n ),\n 0,\n ) + 40\n const trackLabelOffset = trackLabels === 'left' ? trackLabelMaxLen : 0\n const w = width + trackLabelOffset\n\n // the xlink namespace is used for rendering <image> tag\n return renderToStaticMarkup(\n <ThemeProvider theme={createJBrowseTheme(theme)}>\n <Wrapper>\n <svg\n width={w}\n height={height}\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlnsXlink=\"http://www.w3.org/1999/xlink\"\n viewBox={[0, 0, w + shift * 2, height].toString()}\n >\n <SVGBackground width={w} height={height} shift={shift} />\n <g transform={`translate(${shift} 0)`}>\n <g transform={`translate(${trackLabelOffset})`}>\n <SVGHeader\n model={model}\n fontSize={fontSize}\n rulerHeight={rulerHeight}\n cytobandHeight={cytobandHeight}\n />\n </g>\n <SVGTracks\n textHeight={textHeight}\n fontSize={fontSize}\n model={model}\n displayResults={displayResults}\n offset={offset}\n trackLabels={trackLabels}\n trackLabelOffset={trackLabelOffset}\n />\n </g>\n </svg>\n </Wrapper>\n </ThemeProvider>,\n createRootFn,\n )\n}\n\nexport { default as SVGRuler } from './SVGRuler'\nexport { default as SVGTracks } from './SVGTracks'\n","import { sum } from '@jbrowse/core/util'\n\ninterface Display {\n height: number\n}\ninterface Track {\n displays: Display[]\n}\n\nexport function totalHeight(\n tracks: Track[],\n textHeight: number,\n trackLabels: string,\n) {\n return sum(\n tracks.map(\n t =>\n t.displays[0]!.height +\n (['none', 'left'].includes(trackLabels) ? 0 : textHeight),\n ),\n )\n}\n","import {\n AssemblyManager,\n ParsedLocString,\n parseLocString,\n} from '@jbrowse/core/util'\n\n/**\n * Given a scale ( bp/px ) and minimum distances (px) between major and minor\n * gridlines, return an object like `{ majorPitch: bp, minorPitch: bp }` giving\n * the gridline pitches to use.\n */\nexport function chooseGridPitch(\n scale: number,\n minMajorPitchPx: number,\n minMinorPitchPx: number,\n) {\n scale = Math.abs(scale)\n const minMajorPitchBp = minMajorPitchPx * scale\n const majorMagnitude = Number.parseInt(\n Number(minMajorPitchBp).toExponential().split(/e/i)[1]!,\n 10,\n )\n\n let majorPitch = 10 ** majorMagnitude\n while (majorPitch < minMajorPitchBp) {\n majorPitch *= 2\n if (majorPitch >= minMajorPitchBp) {\n break\n }\n majorPitch *= 2.5\n }\n\n majorPitch = Math.max(majorPitch, 5)\n\n const majorPitchPx = majorPitch / scale\n\n let minorPitch = 0\n if (!(majorPitch % 10) && majorPitchPx / 10 >= minMinorPitchPx) {\n minorPitch = majorPitch / 10\n } else if (!(majorPitch % 5) && majorPitchPx / 5 >= minMinorPitchPx) {\n minorPitch = majorPitch / 5\n } else if (!(majorPitch % 2) && majorPitchPx / 2 >= minMinorPitchPx) {\n minorPitch = majorPitch / 2\n }\n\n return { majorPitch, minorPitch }\n}\n\nexport function makeTicks(\n start: number,\n end: number,\n bpPerPx: number,\n emitMajor = true,\n emitMinor = true,\n) {\n const gridPitch = chooseGridPitch(bpPerPx, 60, 15)\n\n let minBase = start\n let maxBase = end\n\n if (bpPerPx < 0) {\n ;[minBase, maxBase] = [maxBase, minBase]\n }\n\n // add 20px additional on the right and left to allow us to draw the ends\n // of labels that lie a little outside our region\n minBase -= Math.abs(20 * bpPerPx) - 1\n maxBase += Math.abs(20 * bpPerPx) + 1\n\n const iterPitch = gridPitch.minorPitch || gridPitch.majorPitch\n let index = 0\n const ticks = []\n for (\n let base = Math.floor(minBase / iterPitch) * iterPitch;\n base < Math.ceil(maxBase / iterPitch) * iterPitch + 1;\n base += iterPitch\n ) {\n if (emitMinor && base % (gridPitch.majorPitch * 2)) {\n ticks.push({ type: 'minor', base: base - 1, index })\n index += 1\n } else if (emitMajor && !(base % (gridPitch.majorPitch * 2))) {\n ticks.push({ type: 'major', base: base - 1, index })\n index += 1\n }\n }\n return ticks\n}\n\n/**\n * Generate location objects for a set of parsed locstrings, which includes\n * translating the refNames to assembly-canonical refNames and adding the\n * 'parentRegion'\n *\n * Used by navToLocations and navToLocString\n */\nexport async function generateLocations(\n regions: ParsedLocString[],\n assemblyManager: AssemblyManager,\n assemblyName?: string,\n) {\n return Promise.all(\n regions.map(async region => {\n const asmName = region.assemblyName || assemblyName\n if (!asmName) {\n throw new Error('no assembly provided')\n }\n const asm = await assemblyManager.waitForAssembly(asmName)\n const { refName } = region\n if (!asm) {\n throw new Error(`assembly ${asmName} not found`)\n }\n const { regions } = asm\n if (!regions) {\n throw new Error(`regions not loaded yet for ${asmName}`)\n }\n const canonicalRefName = asm.getCanonicalRefName(region.refName)\n if (!canonicalRefName) {\n throw new Error(`Could not find refName ${refName} in ${asm.name}`)\n }\n const parentRegion = regions.find(r => r.refName === canonicalRefName)\n if (!parentRegion) {\n throw new Error(`Could not find refName ${refName} in ${asmName}`)\n }\n\n return {\n ...(region as Omit<typeof region, symbol>),\n assemblyName: asmName,\n parentRegion,\n }\n }),\n )\n}\n\n/**\n * Parses locString or space separated set of locStrings into location objects\n * Example inputs:\n * \"chr1\"\n * \"chr1:1-100\"\n * \"chr1:1..100\"\n * \"chr1 chr2\"\n * \"chr1:1-100 chr2:1-100\"\n * \"chr1 100 200\" equivalent to \"chr1:1-100\"\n *\n * Used by navToLocString\n */\nexport function parseLocStrings(\n input: string,\n assemblyName: string,\n isValidRefName: (str: string, assemblyName: string) => boolean,\n) {\n const inputs = input\n .split(/(\\s+)/)\n .map(f => f.trim())\n .filter(f => !!f)\n // first try interpreting as a whitespace-separated sequence of\n // multiple locstrings\n try {\n return inputs.map(loc =>\n parseLocString(loc, ref => isValidRefName(ref, assemblyName)),\n )\n } catch (e) {\n // if this fails, try interpreting as a whitespace-separated refname,\n // start, end if start and end are integer inputs\n const [refName, start, end] = inputs\n if (\n /Unknown reference sequence/.exec(`${e}`) &&\n Number.isInteger(+start!) &&\n Number.isInteger(+end!)\n ) {\n return [\n parseLocString(`${refName}:${start}..${end}`, ref =>\n isValidRefName(ref, assemblyName),\n ),\n ]\n }\n throw e\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BaseLinearDisplay\n * #category display\n *\n * `BaseLinearDisplay` is a \"base\" config that is extended by other configs including\n * - `LinearBasicDisplay` (used for feature tracks, etc)\n * - `LinearBareDisplay` (more stripped down than even the basic display, not\n * commonly used)\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst baseLinearDisplayConfigSchema = ConfigurationSchema(\n 'BaseLinearDisplay',\n {\n /**\n * #slot\n */\n maxFeatureScreenDensity: {\n type: 'number',\n description:\n 'maximum features per pixel that is displayed in the view, used if byte size estimates not available',\n defaultValue: 0.3,\n },\n /**\n * #slot\n */\n fetchSizeLimit: {\n type: 'number',\n defaultValue: 1_000_000,\n description:\n \"maximum data to attempt to download for a given track, used if adapter doesn't specify one\",\n },\n /**\n * #slot\n */\n height: {\n type: 'number',\n defaultValue: 100,\n description: 'default height for the track',\n },\n /**\n * #slot\n */\n mouseover: {\n type: 'string',\n description: 'text to display when the cursor hovers over a feature',\n defaultValue: `jexl:get(feature,'name')`,\n\n contextVariable: ['feature'],\n },\n /**\n * #slot\n * config jexlFilters are deferred evaluated so they are prepended with\n * jexl at runtime rather than being stored with jexl in the config\n */\n jexlFilters: {\n type: 'stringArray',\n description:\n 'default set of jexl filters to apply to a track. note: these do not use the jexl prefix because they have a deferred evaluation system',\n defaultValue: [],\n },\n },\n {\n /**\n * #identifier\n */\n explicitIdentifier: 'displayId',\n },\n)\n\nexport default baseLinearDisplayConfigSchema\n","// takes an array or Map or Set (anything iterable with values()) of Maps and\n// lets you query them as one Map\nexport default class CompositeMap<T, U> {\n constructor(private submaps: Map<T, U>[]) {}\n\n has(id: T) {\n for (const submap of this.submaps.values()) {\n if (submap.has(id)) {\n return true\n }\n }\n return false\n }\n\n get(id: T) {\n for (const submap of this.submaps.values()) {\n if (submap.has(id)) {\n return submap.get(id)\n }\n }\n return undefined\n }\n\n *values() {\n for (const key of this.keys()) {\n yield this.get(key) as U\n }\n }\n\n *keys() {\n const keys = new Set<T>()\n for (const submap of this.submaps.values()) {\n for (const key of submap.keys()) {\n keys.add(key)\n }\n }\n for (const key of keys) {\n yield key\n }\n }\n\n find<V>(f: (arg0: U) => V) {\n for (const submap of this.submaps.values()) {\n for (const value of submap.values()) {\n const found = f(value)\n if (found) {\n return value\n }\n }\n }\n return undefined\n }\n\n *[Symbol.iterator]() {\n for (const key of this.keys()) {\n yield [key, this.get(key)]\n }\n }\n\n *entries() {\n for (const k of this.keys()) {\n yield [k, this.get(k)]\n }\n }\n}\n","import { getConf } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\nconst minDisplayHeight = 20\n\n/**\n * #stateModel TrackHeightMixin\n * #category display\n */\nexport default function TrackHeightMixin() {\n return types\n .model({\n /**\n * #property\n */\n heightPreConfig: types.maybe(\n types.refinement(\n 'displayHeight',\n types.number,\n n => n >= minDisplayHeight,\n ),\n ),\n })\n .volatile(() => ({\n /**\n * #property\n */\n scrollTop: 0,\n }))\n .views(self => ({\n get height() {\n // @ts-expect-error\n return self.heightPreConfig ?? (getConf(self, 'height') as number)\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setScrollTop(scrollTop: number) {\n self.scrollTop = scrollTop\n },\n /**\n * #action\n */\n setHeight(displayHeight: number) {\n self.heightPreConfig = Math.max(displayHeight, minDisplayHeight)\n return self.height\n },\n /**\n * #action\n */\n resizeHeight(distance: number) {\n const oldHeight = self.height\n const newHeight = this.setHeight(self.height + distance)\n return newHeight - oldHeight\n },\n }))\n}\n","import React from 'react'\nimport { FeatureDensityStats } from '@jbrowse/core/data_adapters/BaseAdapter'\n\n// locals\nimport BlockMsg from '../components/BlockMsg'\nimport { Button } from '@mui/material'\n\nfunction TooLargeMessage({\n model,\n}: {\n model: {\n regionTooLargeReason: string\n featureDensityStats?: FeatureDensityStats\n setFeatureDensityStatsLimit: (s?: FeatureDensityStats) => void\n reload: () => void\n }\n}) {\n const { regionTooLargeReason } = model\n return (\n <BlockMsg\n severity=\"warning\"\n action={\n <Button\n onClick={() => {\n model.setFeatureDensityStatsLimit(model.featureDensityStats)\n model.reload()\n }}\n >\n Force load\n </Button>\n }\n message={[\n regionTooLargeReason,\n 'Zoom in to see features or force load (may be slow)',\n ]\n .filter(f => !!f)\n .join('. ')}\n />\n )\n}\n\nexport default TooLargeMessage\n","import React from 'react'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { getContainingView } from '@jbrowse/core/util'\nimport { FeatureDensityStats } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { Region } from '@jbrowse/core/util/types'\nimport { autorun } from 'mobx'\nimport { addDisposer, isAlive, types } from 'mobx-state-tree'\n\n// locals\nimport { LinearGenomeViewModel } from '../../LinearGenomeView'\nimport TooLargeMessage from '../components/TooLargeMessage'\nimport { getDisplayStr, getFeatureDensityStatsPre } from './util'\nimport autorunFeatureDensityStats from './autorunFeatureDensityStats'\n\ntype LGV = LinearGenomeViewModel\n\n/**\n * #stateModel FeatureDensityMixin\n * #category display\n */\nexport default function FeatureDensityMixin() {\n return types\n .model({\n /**\n * #property\n */\n userBpPerPxLimit: types.maybe(types.number),\n /**\n * #property\n */\n\n userByteSizeLimit: types.maybe(types.number),\n })\n .volatile(() => ({\n featureDensityStatsP: undefined as\n | undefined\n | Promise<FeatureDensityStats>,\n featureDensityStats: undefined as undefined | FeatureDensityStats,\n currStatsBpPerPx: 0,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get currentBytesRequested() {\n return self.featureDensityStats?.bytes || 0\n },\n\n /**\n * #getter\n */\n get currentFeatureScreenDensity() {\n const view = getContainingView(self) as LGV\n return (self.featureDensityStats?.featureDensity || 0) * view.bpPerPx\n },\n\n /**\n * #getter\n */\n get maxFeatureScreenDensity() {\n // @ts-expect-error\n return getConf(self, 'maxFeatureScreenDensity')\n },\n /**\n * #getter\n */\n get featureDensityStatsReady() {\n const view = getContainingView(self) as LGV\n return (\n self.currStatsBpPerPx === view.bpPerPx &&\n (!!self.featureDensityStats || !!self.userBpPerPxLimit)\n )\n },\n\n /**\n * #getter\n */\n get maxAllowableBytes() {\n return (\n self.userByteSizeLimit ||\n self.featureDensityStats?.fetchSizeLimit ||\n // @ts-expect-error\n (getConf(self, 'fetchSizeLimit') as number)\n )\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(() => autorunFeatureDensityStats(self as any)),\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setCurrStatsBpPerPx(n: number) {\n self.currStatsBpPerPx = n\n },\n /**\n * #action\n */\n setFeatureDensityStatsLimit(stats?: FeatureDensityStats) {\n const view = getContainingView(self) as LGV\n if (stats?.bytes) {\n self.userByteSizeLimit = stats.bytes\n } else {\n self.userBpPerPxLimit = view.bpPerPx\n }\n },\n /**\n * #action\n */\n getFeatureDensityStats() {\n if (!self.featureDensityStatsP) {\n self.featureDensityStatsP = getFeatureDensityStatsPre(\n self as any,\n ).catch((e: unknown) => {\n if (isAlive(self)) {\n this.setFeatureDensityStatsP(undefined)\n }\n throw e\n })\n }\n return self.featureDensityStatsP\n },\n\n /**\n * #action\n */\n setFeatureDensityStatsP(arg: any) {\n self.featureDensityStatsP = arg\n },\n\n /**\n * #action\n */\n setFeatureDensityStats(featureDensityStats?: FeatureDensityStats) {\n self.featureDensityStats = featureDensityStats\n },\n /**\n * #action\n */\n clearFeatureDensityStats() {\n self.featureDensityStatsP = undefined\n self.featureDensityStats = undefined\n },\n }))\n .views(self => ({\n /**\n * #getter\n * region is too large if:\n * - stats are ready\n * - region is greater than 20kb (don't warn when zoomed in less than that)\n * - and bytes is greater than max allowed bytes or density greater than max\n * density\n */\n get regionTooLarge() {\n const view = getContainingView(self) as LGV\n if (\n !self.featureDensityStatsReady ||\n view.dynamicBlocks.totalBp < 20_000\n ) {\n return false\n }\n return (\n self.currentBytesRequested > self.maxAllowableBytes ||\n (self.userBpPerPxLimit\n ? view.bpPerPx > self.userBpPerPxLimit\n : self.currentFeatureScreenDensity > self.maxFeatureScreenDensity)\n )\n },\n\n /**\n * #getter\n * only shows a message of bytes requested is defined, the feature density\n * based stats don't produce any helpful message besides to zoom in\n */\n get regionTooLargeReason() {\n const req = self.currentBytesRequested\n const max = self.maxAllowableBytes\n\n return req && req > max\n ? `Requested too much data (${getDisplayStr(req)})`\n : ''\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n regionCannotBeRenderedText(_region: Region) {\n return self.regionTooLarge ? 'Force load to see features' : ''\n },\n\n /**\n * #method\n * @param region -\n * @returns falsy if the region is fine to try rendering. Otherwise,\n * return a react node + string of text.\n * string of text describes why it cannot be rendered\n * react node allows user to force load at current setting\n */\n regionCannotBeRendered(_region: Region) {\n return self.regionTooLarge ? (\n <TooLargeMessage model={self as any} />\n ) : null\n },\n }))\n}\n","import { getContainingView, isAbortException } from '@jbrowse/core/util'\nimport { LinearGenomeViewModel } from '../../LinearGenomeView'\nimport { isAlive } from 'mobx-state-tree'\nimport { BaseLinearDisplayModel } from './BaseLinearDisplayModel'\n\n// stats estimation autorun calls getFeatureDensityStats against the data\n// adapter which by default uses featureDensity, but can also respond with a\n// byte size estimate and fetch size limit (data adapter can define what is too\n// much data)\nexport default async function autorunFeatureDensityStats(\n self: BaseLinearDisplayModel,\n) {\n try {\n const view = getContainingView(self) as LinearGenomeViewModel\n\n // extra check for contentBlocks.length\n // https://github.com/GMOD/jbrowse-components/issues/2694\n if (\n !view.initialized ||\n !view.staticBlocks.contentBlocks.length ||\n view.bpPerPx === self.currStatsBpPerPx ||\n self.error\n ) {\n return\n }\n\n // don't re-estimate featureDensity even if zoom level changes,\n // jbrowse1-style assume it's sort of representative\n if (self.featureDensityStats?.featureDensity !== undefined) {\n self.setCurrStatsBpPerPx(view.bpPerPx)\n return\n }\n\n self.clearFeatureDensityStats()\n self.setCurrStatsBpPerPx(view.bpPerPx)\n const stats = await self.getFeatureDensityStats()\n if (isAlive(self)) {\n self.setFeatureDensityStats(stats)\n }\n } catch (e) {\n if (!isAbortException(e) && isAlive(self)) {\n console.error(e)\n self.setError(e)\n }\n }\n}\n","import React, { lazy } from 'react'\nimport { ThemeOptions } from '@mui/material'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'\nimport { ConfigurationReference } from '@jbrowse/core/configuration'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport {\n getContainingView,\n getContainingTrack,\n getSession,\n isSelectionContainer,\n isSessionModelWithWidgets,\n isFeature,\n Feature,\n AnyReactComponentType,\n} from '@jbrowse/core/util'\nimport { BaseBlock } from '@jbrowse/core/util/blockTypes'\nimport CompositeMap from '@jbrowse/core/util/compositeMap'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport { autorun } from 'mobx'\nimport { addDisposer, isAlive, types, Instance } from 'mobx-state-tree'\n\n// icons\nimport MenuOpenIcon from '@mui/icons-material/MenuOpen'\nimport CenterFocusStrongIcon from '@mui/icons-material/CenterFocusStrong'\n\n// locals\nimport { LinearGenomeViewModel, ExportSvgOptions } from '../../LinearGenomeView'\nimport BlockState from './serverSideRenderedBlock'\nimport configSchema from './configSchema'\nimport TrackHeightMixin from './TrackHeightMixin'\nimport FeatureDensityMixin from './FeatureDensityMixin'\n\n// lazies\nconst Tooltip = lazy(() => import('../components/Tooltip'))\n\ntype LGV = LinearGenomeViewModel\n\nexport interface Layout {\n minX: number\n minY: number\n maxX: number\n maxY: number\n name: string\n}\n\ntype LayoutRecord = [number, number, number, number]\n\nexport interface ExportSvgDisplayOptions extends ExportSvgOptions {\n overrideHeight: number\n theme: ThemeOptions\n}\n\n/**\n * #stateModel BaseLinearDisplay\n * #category display\n *\n * BaseLinearDisplay is used as the basis for many linear genome view tracks.\n * It is block based, and can use 'static blocks' or 'dynamic blocks'\n *\n * extends\n * - [BaseDisplay](../basedisplay)\n * - [TrackHeightMixin](../trackheightmixin)\n * - [FeatureDensityMixin](../featuredensitymixin)\n */\nfunction stateModelFactory() {\n return types\n .compose(\n 'BaseLinearDisplay',\n BaseDisplay,\n TrackHeightMixin(),\n FeatureDensityMixin(),\n types.model({\n /**\n * #property\n * updated via autorun\n */\n blockState: types.map(BlockState),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n .volatile(() => ({\n featureIdUnderMouse: undefined as undefined | string,\n contextMenuFeature: undefined as undefined | Feature,\n }))\n .views(self => ({\n /**\n * #getter\n * if a display-level message should be displayed instead of the blocks,\n * make this return a react component\n */\n get DisplayMessageComponent(): undefined | React.FC<any> {\n return undefined\n },\n /**\n * #getter\n */\n get blockType(): 'staticBlocks' | 'dynamicBlocks' {\n return 'staticBlocks'\n },\n /**\n * #getter\n */\n get blockDefinitions() {\n const view = getContainingView(self) as LGV\n if (!view.initialized) {\n throw new Error('view not initialized yet')\n }\n return view[this.blockType]\n },\n }))\n .views(self => ({\n /**\n * #getter\n * how many milliseconds to wait for the display to\n * \"settle\" before re-rendering a block\n */\n get renderDelay() {\n return 50\n },\n\n /**\n * #getter\n */\n get TooltipComponent(): AnyReactComponentType {\n return Tooltip as AnyReactComponentType\n },\n\n /**\n * #getter\n * returns a string feature ID if the globally-selected object\n * is probably a feature\n */\n get selectedFeatureId() {\n if (isAlive(self)) {\n const { selection } = getSession(self)\n // does it quack like a feature?\n if (isFeature(selection)) {\n return selection.id()\n }\n }\n return undefined\n },\n }))\n .views(self => ({\n /**\n * #getter\n * a CompositeMap of `featureId -> feature obj` that\n * just looks in all the block data for that feature\n */\n get features() {\n const featureMaps = []\n for (const block of self.blockState.values()) {\n if (block.features) {\n featureMaps.push(block.features)\n }\n }\n return new CompositeMap(featureMaps)\n },\n\n /**\n * #getter\n */\n get featureUnderMouse() {\n const feat = self.featureIdUnderMouse\n return feat ? this.features.get(feat) : undefined\n },\n\n /**\n * #getter\n */\n getFeatureOverlapping(\n blockKey: string,\n x: number,\n y: number,\n ): string | undefined {\n return self.blockState.get(blockKey)?.layout?.getByCoord(x, y)\n },\n\n /**\n * #getter\n */\n getFeatureByID(blockKey: string, id: string): LayoutRecord | undefined {\n return self.blockState.get(blockKey)?.layout?.getByID(id)\n },\n\n /**\n * #getter\n */\n searchFeatureByID(id: string): LayoutRecord | undefined {\n let ret: LayoutRecord | undefined\n self.blockState.forEach(block => {\n const val = block.layout?.getByID(id)\n if (val) {\n ret = val\n }\n })\n return ret\n },\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n addBlock(key: string, block: BaseBlock) {\n self.blockState.set(\n key,\n BlockState.create({\n key,\n region: block.toRegion(),\n }),\n )\n },\n\n /**\n * #action\n */\n deleteBlock(key: string) {\n self.blockState.delete(key)\n },\n /**\n * #action\n */\n selectFeature(feature: Feature) {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const featureWidget = session.addWidget(\n 'BaseFeatureWidget',\n 'baseFeature',\n {\n view: getContainingView(self),\n track: getContainingTrack(self),\n featureData: feature.toJSON(),\n },\n )\n\n session.showWidget(featureWidget)\n }\n if (isSelectionContainer(session)) {\n session.setSelection(feature)\n }\n },\n /**\n * #action\n */\n navToFeature(feature: Feature) {\n const view = getContainingView(self) as LGV\n view.navTo({\n refName: feature.get('refName'),\n start: feature.get('start'),\n end: feature.get('end'),\n })\n },\n /**\n * #action\n */\n clearFeatureSelection() {\n getSession(self).clearSelection()\n },\n /**\n * #action\n */\n setFeatureIdUnderMouse(feature?: string) {\n self.featureIdUnderMouse = feature\n },\n\n /**\n * #action\n */\n setContextMenuFeature(feature?: Feature) {\n self.contextMenuFeature = feature\n },\n }))\n\n .actions(self => {\n const { reload: superReload } = self\n\n return {\n /**\n * #action\n */\n async reload() {\n self.setError()\n self.setCurrStatsBpPerPx(0)\n self.clearFeatureDensityStats()\n ;[...self.blockState.values()].forEach(val => {\n val.doReload()\n })\n superReload()\n },\n }\n })\n\n .views(self => ({\n /**\n * #method\n */\n trackMenuItems(): MenuItem[] {\n return []\n },\n\n /**\n * #method\n */\n contextMenuItems(): MenuItem[] {\n return [\n ...(self.contextMenuFeature\n ? [\n {\n label: 'Open feature details',\n icon: MenuOpenIcon,\n onClick: () => {\n if (self.contextMenuFeature) {\n self.selectFeature(self.contextMenuFeature)\n }\n },\n },\n {\n label: 'Zoom to feature',\n icon: CenterFocusStrongIcon,\n onClick: () => {\n if (self.contextMenuFeature) {\n self.navToFeature(self.contextMenuFeature)\n }\n },\n },\n ]\n : []),\n ]\n },\n /**\n * #method\n */\n renderProps() {\n return {\n ...getParentRenderProps(self),\n notReady: !self.featureDensityStatsReady,\n rpcDriverName: self.rpcDriverName,\n\n displayModel: self,\n onFeatureClick(_: unknown, featureId?: string) {\n const f = featureId || self.featureIdUnderMouse\n if (!f) {\n self.clearFeatureSelection()\n } else {\n const feature = self.features.get(f)\n if (feature) {\n self.selectFeature(feature)\n }\n }\n },\n onClick() {\n self.clearFeatureSelection()\n },\n // similar to click but opens a menu with further options\n onFeatureContextMenu(_: unknown, featureId?: string) {\n const f = featureId || self.featureIdUnderMouse\n if (!f) {\n self.clearFeatureSelection()\n } else {\n // feature id under mouse passed to context menu\n self.setContextMenuFeature(self.features.get(f))\n }\n },\n\n onMouseMove(_: unknown, featureId?: string) {\n self.setFeatureIdUnderMouse(featureId)\n },\n\n onMouseLeave(_: unknown) {\n self.setFeatureIdUnderMouse(undefined)\n },\n\n onContextMenu() {\n self.setContextMenuFeature(undefined)\n self.clearFeatureSelection()\n },\n }\n },\n }))\n .actions(self => ({\n /**\n * #method\n */\n async renderSvg(opts: ExportSvgDisplayOptions) {\n const { renderBaseLinearDisplaySvg } = await import('./renderSvg')\n return renderBaseLinearDisplaySvg(self as BaseLinearDisplayModel, opts)\n },\n afterAttach() {\n // watch the parent's blocks to update our block state when they change,\n // then we recreate the blocks on our own model (creating and deleting to\n // match the parent blocks)\n addDisposer(\n self,\n autorun(() => {\n const blocksPresent: Record<string, boolean> = {}\n const view = getContainingView(self) as LGV\n if (!view.initialized) {\n return\n }\n self.blockDefinitions.contentBlocks.forEach(block => {\n blocksPresent[block.key] = true\n if (!self.blockState.has(block.key)) {\n self.addBlock(block.key, block)\n }\n })\n self.blockState.forEach((_, key) => {\n if (!blocksPresent[key]) {\n self.deleteBlock(key as string)\n }\n })\n }),\n )\n },\n }))\n .preProcessSnapshot(snap => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!snap) {\n return snap\n }\n // rewrite \"height\" from older snapshots to \"heightPreConfig\", this allows\n // us to maintain a height \"getter\" going forward\n // @ts-expect-error\n const { height, ...rest } = snap\n return { heightPreConfig: height, ...rest }\n })\n .postProcessSnapshot(snap => {\n // xref https://github.com/mobxjs/mobx-state-tree/issues/1524 for Omit\n const r = snap as Omit<typeof snap, symbol>\n const { blockState, ...rest } = r\n return rest\n })\n}\n\nexport const BaseLinearDisplay = stateModelFactory()\n\nexport type BaseLinearDisplayStateModel = typeof BaseLinearDisplay\nexport type BaseLinearDisplayModel = Instance<BaseLinearDisplayStateModel>\n","import React from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { getContainingView } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\nimport { BaseLinearDisplayModel } from '../models/BaseLinearDisplayModel'\n\nimport {\n ContentBlock as ContentBlockComponent,\n ElidedBlock as ElidedBlockComponent,\n InterRegionPaddingBlock as InterRegionPaddingBlockComponent,\n} from './Block'\nimport { LinearGenomeViewModel } from '../../LinearGenomeView'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n linearBlocks: {\n whiteSpace: 'nowrap',\n textAlign: 'left',\n position: 'absolute',\n minHeight: '100%',\n display: 'flex',\n },\n heightOverflowed: {\n position: 'absolute',\n color: 'rgb(77,77,77)',\n borderBottom: '2px solid rgb(77,77,77)',\n textShadow: 'white 0px 0px 1px',\n whiteSpace: 'nowrap',\n width: '100%',\n fontWeight: 'bold',\n textAlign: 'center',\n zIndex: 2000,\n boxSizing: 'border-box',\n },\n})\n\nconst RenderedBlocks = observer(function ({\n model,\n}: {\n model: BaseLinearDisplayModel\n}) {\n const { classes } = useStyles()\n const { blockDefinitions, blockState } = model\n return (\n <>\n {blockDefinitions.map(block => {\n const key = `${model.id}-${block.key}`\n if (block.type === 'ContentBlock') {\n const state = blockState.get(block.key)\n return (\n <ContentBlockComponent block={block} key={key}>\n {state?.ReactComponent ? (\n <state.ReactComponent model={state} />\n ) : null}\n {state?.maxHeightReached ? (\n <div\n className={classes.heightOverflowed}\n style={{\n top: state.layout.getTotalHeight() - 16,\n pointerEvents: 'none',\n height: 16,\n }}\n >\n Max height reached\n </div>\n ) : null}\n </ContentBlockComponent>\n )\n }\n if (block.type === 'ElidedBlock') {\n return <ElidedBlockComponent key={key} width={block.widthPx} />\n }\n if (block.type === 'InterRegionPaddingBlock') {\n return (\n <InterRegionPaddingBlockComponent\n key={key}\n width={block.widthPx}\n style={{ background: 'none' }}\n boundary={block.variant === 'boundary'}\n />\n )\n }\n throw new Error(`invalid block type ${JSON.stringify(block)}`)\n })}\n </>\n )\n})\n\nexport { RenderedBlocks }\n\nconst LinearBlocks = observer(function ({\n model,\n}: {\n model: BaseLinearDisplayModel\n}) {\n const { classes } = useStyles()\n const { blockDefinitions } = model\n const viewModel = getContainingView(model) as LGV\n return (\n <div\n className={classes.linearBlocks}\n style={{\n left: blockDefinitions.offsetPx - viewModel.offsetPx,\n }}\n >\n <RenderedBlocks model={model} />\n </div>\n )\n})\n\nexport default LinearBlocks\n","import React, { useState, useRef, Suspense } from 'react'\nimport { observer } from 'mobx-react'\nimport { useTheme } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { getConf } from '@jbrowse/core/configuration'\nimport { Menu } from '@jbrowse/core/ui'\n\n// locals\n\nimport LinearBlocks from './LinearBlocks'\nimport { BaseLinearDisplayModel } from '../models/BaseLinearDisplayModel'\n\nconst useStyles = makeStyles()({\n display: {\n position: 'relative',\n whiteSpace: 'nowrap',\n textAlign: 'left',\n width: '100%',\n minHeight: '100%',\n },\n})\n\ntype Coord = [number, number]\n\nconst BaseLinearDisplay = observer(function (props: {\n model: BaseLinearDisplayModel\n children?: React.ReactNode\n}) {\n const { classes } = useStyles()\n const theme = useTheme()\n const ref = useRef<HTMLDivElement>(null)\n const [clientRect, setClientRect] = useState<DOMRect>()\n const [offsetMouseCoord, setOffsetMouseCoord] = useState<Coord>([0, 0])\n const [clientMouseCoord, setClientMouseCoord] = useState<Coord>([0, 0])\n const [contextCoord, setContextCoord] = useState<Coord>()\n const { model, children } = props\n const { TooltipComponent, DisplayMessageComponent, height } = model\n const items = model.contextMenuItems()\n return (\n <div\n ref={ref}\n data-testid={`display-${getConf(model, 'displayId')}`}\n className={classes.display}\n onContextMenu={event => {\n event.preventDefault()\n if (contextCoord) {\n // There's already a context menu open, so close it\n setContextCoord(undefined)\n } else if (ref.current) {\n setContextCoord([event.clientX, event.clientY])\n }\n }}\n onMouseMove={event => {\n if (!ref.current) {\n return\n }\n const rect = ref.current.getBoundingClientRect()\n const { left, top } = rect\n setOffsetMouseCoord([event.clientX - left, event.clientY - top])\n setClientMouseCoord([event.clientX, event.clientY])\n setClientRect(rect)\n }}\n >\n {DisplayMessageComponent ? (\n <DisplayMessageComponent model={model} />\n ) : (\n <LinearBlocks {...props} />\n )}\n {children}\n\n <Suspense fallback={null}>\n <TooltipComponent\n model={model}\n height={height}\n offsetMouseCoord={offsetMouseCoord}\n clientMouseCoord={clientMouseCoord}\n clientRect={clientRect}\n mouseCoord={offsetMouseCoord}\n />\n </Suspense>\n\n <Menu\n open={Boolean(contextCoord) && items.length > 0}\n onMenuItemClick={(_, callback) => {\n callback()\n setContextCoord(undefined)\n }}\n onClose={() => {\n setContextCoord(undefined)\n model.setContextMenuFeature(undefined)\n }}\n TransitionProps={{\n onExit: () => {\n setContextCoord(undefined)\n model.setContextMenuFeature(undefined)\n },\n }}\n anchorReference=\"anchorPosition\"\n anchorPosition={\n contextCoord\n ? { top: contextCoord[1], left: contextCoord[0] }\n : undefined\n }\n style={{\n zIndex: theme.zIndex.tooltip,\n }}\n menuItems={items}\n />\n </div>\n )\n})\n\nexport default BaseLinearDisplay\n\nexport { default as Tooltip } from './Tooltip'\nexport { default as BlockMsg } from './BlockMsg'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '../BaseLinearDisplay'\n\n/**\n * #config LinearBareDisplay\n * #category display\n */\nfunction configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearBareDisplay',\n {\n /**\n * #slot\n */\n renderer: pluginManager.pluggableConfigSchemaType('renderer'),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n\nexport { configSchemaFactory }\n","import {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n} from '@jbrowse/core/configuration'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport { types } from 'mobx-state-tree'\nimport { BaseLinearDisplay } from '../BaseLinearDisplay'\n\n/**\n * #stateModel LinearBareDisplay\n * #category display\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nexport function stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearBareDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearBareDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #method\n */\n renderProps() {\n return {\n ...superRenderProps(),\n ...getParentRenderProps(self),\n rpcDriverName: self.rpcDriverName,\n config: self.configuration.renderer,\n }\n },\n\n /**\n * #getter\n */\n get rendererTypeName() {\n return self.configuration.renderer.type\n },\n }\n })\n}\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { IconButton, Paper, alpha } from '@mui/material'\nimport CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'\nimport { makeStyles } from 'tss-react/mui'\nimport { getSession } from '@jbrowse/core/util'\n\n// icons\nimport ZoomIn from '@mui/icons-material/ZoomIn'\nimport ZoomOut from '@mui/icons-material/ZoomOut'\nimport ArrowDown from '@mui/icons-material/KeyboardArrowDown'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\n\nconst useStyles = makeStyles()(theme => ({\n background: {\n position: 'absolute',\n right: 0,\n zIndex: 1001,\n background: theme.palette.background.paper,\n },\n focusedBackground: {\n background: alpha(theme.palette.secondary.light, 0.2),\n },\n}))\n\nconst MiniControls = observer(function ({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const { classes } = useStyles()\n const { id, bpPerPx, maxBpPerPx, minBpPerPx, scaleFactor, hideHeader } = model\n const { focusedViewId } = getSession(model)\n return hideHeader ? (\n <Paper className={classes.background}>\n <Paper\n className={focusedViewId === id ? classes.focusedBackground : undefined}\n >\n <CascadingMenuButton menuItems={model.menuItems()}>\n <ArrowDown fontSize=\"small\" />\n </CascadingMenuButton>\n <IconButton\n data-testid=\"zoom_out\"\n onClick={() => {\n model.zoom(bpPerPx * 2)\n }}\n disabled={bpPerPx >= maxBpPerPx - 0.0001 || scaleFactor !== 1}\n >\n <ZoomOut fontSize=\"small\" />\n </IconButton>\n <IconButton\n data-testid=\"zoom_in\"\n onClick={() => {\n model.zoom(bpPerPx / 2)\n }}\n disabled={bpPerPx <= minBpPerPx + 0.0001 || scaleFactor !== 1}\n >\n <ZoomIn fontSize=\"small\" />\n </IconButton>\n </Paper>\n </Paper>\n ) : null\n})\n\nexport default MiniControls\n","import React, { useRef, useEffect, useState } from 'react'\nimport { Tooltip } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { getSession, stringify } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport RubberbandSpan from './RubberbandSpan'\nimport { getRelativeX } from './util'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n rubberbandControl: {\n cursor: 'crosshair',\n width: '100%',\n minHeight: 8,\n },\n guide: {\n pointerEvents: 'none',\n height: '100%',\n width: 1,\n position: 'absolute',\n zIndex: 10,\n },\n rel: {\n position: 'relative',\n },\n})\n\nconst HoverTooltip = observer(function ({\n model,\n open,\n guideX,\n overview,\n}: {\n model: LGV\n open: boolean\n guideX: number\n overview: Base1DViewModel\n}) {\n const { classes } = useStyles()\n const { cytobandOffset } = model\n const { assemblyManager } = getSession(model)\n\n const px = overview.pxToBp(guideX - cytobandOffset)\n const assembly = assemblyManager.get(px.assemblyName)\n const cytoband = assembly?.cytobands?.find(\n f =>\n px.coord > f.get('start') &&\n px.coord < f.get('end') &&\n px.refName === assembly.getCanonicalRefName(f.get('refName')),\n )\n\n return (\n <Tooltip\n open={open}\n placement=\"top\"\n title={[stringify(px), cytoband?.get('name')].join(' ')}\n arrow\n >\n <div className={classes.guide} style={{ left: guideX }} />\n </Tooltip>\n )\n})\n\nconst OverviewRubberband = observer(function OverviewRubberband({\n model,\n overview,\n ControlComponent = <div />,\n}: {\n model: LGV\n overview: Base1DViewModel\n ControlComponent?: React.ReactElement\n}) {\n const { cytobandOffset } = model\n const [startX, setStartX] = useState<number>()\n const [currentX, setCurrentX] = useState<number>()\n const [guideX, setGuideX] = useState<number>()\n const controlsRef = useRef<HTMLDivElement>(null)\n const { classes } = useStyles()\n const mouseDragging = startX !== undefined\n\n useEffect(() => {\n function globalMouseMove(event: MouseEvent) {\n const ref = controlsRef.current\n if (ref && mouseDragging) {\n setCurrentX(getRelativeX(event, ref))\n }\n }\n\n function globalMouseUp() {\n // click and drag\n if (startX !== undefined && currentX !== undefined) {\n if (Math.abs(currentX - startX) > 3) {\n const left = Math.min(startX, currentX)\n const right = Math.max(startX, currentX)\n model.moveTo(\n overview.pxToBp(left - cytobandOffset),\n overview.pxToBp(right - cytobandOffset),\n )\n }\n }\n\n // just a click\n if (startX !== undefined && currentX === undefined) {\n const click = overview.pxToBp(startX - cytobandOffset)\n if (!click.refName) {\n getSession(model).notify('unknown position clicked')\n console.error('unknown position clicked', click)\n } else {\n model.centerAt(Math.round(click.coord), click.refName, click.index)\n }\n }\n setStartX(undefined)\n setCurrentX(undefined)\n\n if (startX !== undefined) {\n setGuideX(undefined)\n }\n }\n\n function globalKeyDown(event: KeyboardEvent) {\n if (event.key === 'Escape') {\n setStartX(undefined)\n setCurrentX(undefined)\n }\n }\n\n if (mouseDragging) {\n window.addEventListener('mousemove', globalMouseMove, true)\n window.addEventListener('mouseup', globalMouseUp, true)\n window.addEventListener('keydown', globalKeyDown, true)\n return () => {\n window.removeEventListener('mousemove', globalMouseMove, true)\n window.removeEventListener('mouseup', globalMouseUp, true)\n window.removeEventListener('keydown', globalKeyDown, true)\n }\n }\n return () => {}\n }, [mouseDragging, currentX, startX, model, overview, cytobandOffset])\n\n function mouseDown(event: React.MouseEvent<HTMLDivElement>) {\n event.preventDefault()\n event.stopPropagation()\n setStartX(getRelativeX(event, controlsRef.current))\n }\n\n function mouseMove(event: React.MouseEvent<HTMLDivElement>) {\n setGuideX(getRelativeX(event, controlsRef.current))\n }\n\n function mouseOut() {\n setGuideX(undefined)\n }\n\n if (startX === undefined) {\n return (\n <div className={classes.rel}>\n {guideX !== undefined ? (\n <HoverTooltip\n model={model}\n open={!mouseDragging}\n overview={overview}\n guideX={guideX}\n />\n ) : null}\n <div\n className={classes.rubberbandControl}\n ref={controlsRef}\n onMouseDown={mouseDown}\n onMouseOut={mouseOut}\n onMouseMove={mouseMove}\n >\n {ControlComponent}\n </div>\n </div>\n )\n }\n\n let left = startX || 0\n let width = 0\n if (currentX !== undefined) {\n left = currentX < startX ? currentX : startX\n width = currentX - startX\n }\n // calculate the start and end bp of drag\n let leftBpOffset: ReturnType<typeof overview.pxToBp> | undefined\n let rightBpOffset: ReturnType<typeof overview.pxToBp> | undefined\n if (startX) {\n leftBpOffset = overview.pxToBp(startX - cytobandOffset)\n rightBpOffset = overview.pxToBp(startX + width - cytobandOffset)\n if (currentX !== undefined && currentX < startX) {\n ;[leftBpOffset, rightBpOffset] = [rightBpOffset, leftBpOffset]\n }\n }\n\n return (\n <div className={classes.rel}>\n {leftBpOffset && rightBpOffset ? (\n <RubberbandSpan\n leftBpOffset={leftBpOffset}\n rightBpOffset={rightBpOffset}\n width={Math.abs(width)}\n left={left}\n />\n ) : null}\n <div\n data-testid=\"rubberband_controls\"\n className={classes.rubberbandControl}\n ref={controlsRef}\n onMouseDown={mouseDown}\n onMouseOut={mouseOut}\n onMouseMove={mouseMove}\n >\n {ControlComponent}\n </div>\n </div>\n )\n})\n\nexport default OverviewRubberband\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { colord } from '@jbrowse/core/util/colord'\nimport { SessionWithWidgets, getSession, notEmpty } from '@jbrowse/core/util'\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\n\n// locals\nimport { LinearGenomeViewModel } from '../model'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()(theme => ({\n highlight: {\n height: '100%',\n position: 'absolute',\n background: colord(theme.palette.highlight.main).alpha(0.35).toRgbString(),\n borderLeft: `1px solid ${theme.palette.highlight.main}`,\n borderRight: `1px solid ${theme.palette.highlight.main}`,\n },\n}))\n\nconst OverviewHighlight = observer(function OverviewHighlight({\n model,\n overview,\n}: {\n model: LGV\n overview: Base1DViewModel\n}) {\n const { classes } = useStyles()\n const { highlight, cytobandOffset } = model\n\n const session = getSession(model) as SessionWithWidgets\n const { assemblyManager } = session\n return highlight\n .map(r => {\n const asm = assemblyManager.get(r.assemblyName)\n const refName = asm?.getCanonicalRefName(r.refName) ?? r.refName\n const s = overview.bpToPx({\n ...r,\n refName,\n coord: r.start,\n })\n const e = overview.bpToPx({\n ...r,\n refName,\n coord: r.end,\n })\n return s !== undefined && e !== undefined\n ? {\n width: Math.abs(e - s),\n left: s + cytobandOffset,\n }\n : undefined\n })\n .filter(notEmpty)\n .map(({ left, width }, idx) => (\n <div\n /* biome-ignore lint/suspicious/noArrayIndexKey: */\n key={`${left}_${width}_${idx}`}\n className={classes.highlight}\n style={{\n width: width,\n left: left,\n }}\n />\n ))\n})\n\nexport default OverviewHighlight\n","import React from 'react'\nimport { Typography } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// core\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport { getSession, getTickDisplayStr } from '@jbrowse/core/util'\nimport { ContentBlock } from '@jbrowse/core/util/blockTypes'\n\n// locals\nimport type { LinearGenomeViewModel } from '..'\nimport { chooseGridPitch } from '../util'\nimport { HEADER_OVERVIEW_HEIGHT } from '../consts'\n\nconst useStyles = makeStyles()({\n scalebarLabel: {\n height: HEADER_OVERVIEW_HEIGHT,\n position: 'absolute',\n display: 'flex',\n justifyContent: 'center',\n pointerEvents: 'none',\n },\n})\n\nconst OverviewScalebarTickLabels = observer(function ({\n block,\n scale,\n overview,\n model,\n}: {\n model: LinearGenomeViewModel\n scale: number\n block: ContentBlock\n overview: Base1DViewModel\n}) {\n const { classes } = useStyles()\n const { start, end, reversed, refName, assemblyName } = block\n const { majorPitch } = chooseGridPitch(scale, 120, 15)\n const { assemblyManager } = getSession(model)\n const assembly = assemblyManager.get(assemblyName)\n const refNameColor = assembly?.getRefNameColor(refName)\n\n const tickLabels = []\n for (let i = 0; i < Math.floor((end - start) / majorPitch); i++) {\n const offsetLabel = (i + 1) * majorPitch\n tickLabels.push(reversed ? end - offsetLabel : start + offsetLabel)\n }\n return tickLabels.map((tickLabel, labelIdx) => (\n <Typography\n key={`${JSON.stringify(block)}-${tickLabel}-${labelIdx}`}\n className={classes.scalebarLabel}\n variant=\"body2\"\n style={{\n left: ((labelIdx + 1) * majorPitch) / scale,\n pointerEvents: 'none',\n color: refNameColor,\n }}\n >\n {getTickDisplayStr(tickLabel, overview.bpPerPx)}\n </Typography>\n ))\n})\n\nexport default OverviewScalebarTickLabels\n","import React, { useMemo } from 'react'\nimport { Typography, useTheme, alpha } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\n\n// core\nimport Base1DView, { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport { getEnv, getSession } from '@jbrowse/core/util'\nimport { ContentBlock } from '@jbrowse/core/util/blockTypes'\n\n// locals\nimport type { LinearGenomeViewModel } from '..'\nimport { getCytobands } from './util'\nimport OverviewRubberband from './OverviewRubberband'\nimport Cytobands from './Cytobands'\nimport OverviewScalebarPolygon from './OverviewScalebarPolygon'\nimport OverviewHighlight from './OverviewHighlight'\nimport OverviewScalebarTickLabels from './OverviewScalebarTickLabels'\nimport { HEADER_BAR_HEIGHT, HEADER_OVERVIEW_HEIGHT } from '../consts'\n\nconst wholeSeqSpacer = 2\n\nconst useStyles = makeStyles()(theme => ({\n scalebar: {\n height: HEADER_OVERVIEW_HEIGHT,\n },\n scalebarBorder: {\n border: '1px solid',\n },\n scalebarContig: {\n backgroundColor: theme.palette.background.default,\n position: 'absolute',\n top: 0,\n height: HEADER_OVERVIEW_HEIGHT,\n overflow: 'hidden',\n },\n scalebarContigForward: {\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 9'%3E%3Cpath d='M-.1 0L6 4.5L-.1 9' fill='none' stroke='${theme.palette.divider}'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'repeat',\n },\n scalebarContigReverse: {\n backgroundImage: `url(\"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 15 9'%3E%3Cpath d='M6 0L0 4.5L6 9' fill='none' stroke='${theme.palette.divider}'/%3E%3C/svg%3E\")`,\n backgroundRepeat: 'repeat',\n },\n\n scalebarRefName: {\n position: 'absolute',\n fontWeight: 'bold',\n pointerEvents: 'none',\n zIndex: 100,\n },\n scalebarVisibleRegion: {\n position: 'absolute',\n height: HEADER_OVERVIEW_HEIGHT,\n pointerEvents: 'none',\n zIndex: 100,\n border: '1px solid',\n },\n overview: {\n height: HEADER_BAR_HEIGHT,\n position: 'relative',\n },\n overviewSvg: {\n pointerEvents: 'none',\n width: '100%',\n position: 'absolute',\n },\n}))\n\ntype LGV = LinearGenomeViewModel\n\nconst OverviewBox = observer(function ({\n scale,\n model,\n block,\n overview,\n}: {\n scale: number\n model: LGV\n block: ContentBlock\n overview: Base1DViewModel\n}) {\n const { classes, cx } = useStyles()\n const theme = useTheme()\n const { cytobandOffset, showCytobands } = model\n const { reversed, refName, assemblyName } = block\n const { assemblyManager } = getSession(model)\n const assembly = assemblyManager.get(assemblyName)\n const refNameColor = assembly?.getRefNameColor(refName)\n\n const canDisplayCytobands =\n showCytobands && getCytobands(assembly, block.refName).length\n\n return (\n <div>\n {/* name of sequence */}\n <Typography\n style={{\n left: block.offsetPx + 3,\n color: canDisplayCytobands\n ? theme.palette.text.primary\n : refNameColor,\n }}\n className={classes.scalebarRefName}\n >\n {refName}\n </Typography>\n <div\n className={cx(\n classes.scalebarContig,\n canDisplayCytobands\n ? undefined\n : reversed\n ? classes.scalebarContigReverse\n : classes.scalebarContigForward,\n !canDisplayCytobands ? classes.scalebarBorder : undefined,\n )}\n style={{\n left: block.offsetPx + cytobandOffset,\n width: block.widthPx,\n borderColor: refNameColor,\n }}\n >\n {canDisplayCytobands ? (\n <svg style={{ width: '100%' }}>\n <Cytobands overview={overview} assembly={assembly} block={block} />\n </svg>\n ) : (\n <OverviewScalebarTickLabels\n model={model}\n overview={overview}\n scale={scale}\n block={block}\n />\n )}\n </div>\n </div>\n )\n})\n\nconst Scalebar = observer(function ({\n model,\n scale,\n overview,\n}: {\n model: LGV\n overview: Base1DViewModel\n scale: number\n}) {\n const { classes } = useStyles()\n const theme = useTheme()\n const { dynamicBlocks, showCytobands, cytobandOffset } = model\n const { pluginManager } = getEnv(model)\n const visibleRegions = dynamicBlocks.contentBlocks\n const overviewVisibleRegions = overview.dynamicBlocks\n const scalebarColor = theme.palette.tertiary.light\n // catches possible null from at's below\n if (!visibleRegions.length) {\n return null\n }\n\n const first = visibleRegions.at(0)!\n const last = visibleRegions.at(-1)!\n\n const firstOverviewPx =\n overview.bpToPx({\n ...first,\n coord: first.reversed ? first.end : first.start,\n }) || 0\n\n const lastOverviewPx =\n overview.bpToPx({\n ...last,\n coord: last.reversed ? last.start : last.end,\n }) || 0\n\n const color = showCytobands ? '#f00' : scalebarColor\n const transparency = showCytobands ? 0.1 : 0.3\n\n const additional = pluginManager.evaluateExtensionPoint(\n 'LinearGenomeView-OverviewScalebarComponent',\n undefined,\n { model, overview },\n ) as React.ReactNode\n\n return (\n <div className={classes.scalebar}>\n <div\n className={classes.scalebarVisibleRegion}\n style={{\n width: lastOverviewPx - firstOverviewPx,\n left: firstOverviewPx + cytobandOffset,\n background: alpha(color, transparency),\n borderColor: color,\n }}\n />\n {/* this is the entire scale bar */}\n {overviewVisibleRegions.map((block, idx) => {\n return !(block.type === 'ContentBlock') ? (\n <div\n key={`${JSON.stringify(block)}-${idx}`}\n className={classes.scalebarContig}\n style={{\n width: block.widthPx,\n left: block.offsetPx,\n backgroundColor: '#999',\n backgroundImage:\n 'repeating-linear-gradient(90deg, transparent, transparent 1px, rgba(255,255,255,.5) 1px, rgba(255,255,255,.5) 3px)',\n }}\n />\n ) : (\n <OverviewBox\n scale={scale}\n block={block}\n model={model}\n overview={overview}\n key={`${JSON.stringify(block)}-${idx}`}\n />\n )\n })}\n <OverviewHighlight model={model} overview={overview} />\n {additional}\n </div>\n )\n})\n\nconst OverviewScalebar = observer(function ({\n model,\n children,\n}: {\n model: LGV\n children: React.ReactNode\n}) {\n const { classes } = useStyles()\n const {\n minimumBlockWidth,\n totalBp,\n width,\n cytobandOffset,\n displayedRegions,\n } = model\n\n const modWidth = width - cytobandOffset\n const str = JSON.stringify(displayedRegions)\n const overview = useMemo(() => {\n const overview = Base1DView.create({\n displayedRegions: JSON.parse(str),\n interRegionPaddingWidth: 0,\n minimumBlockWidth,\n })\n\n overview.setVolatileWidth(modWidth)\n overview.showAllRegions()\n return overview\n }, [str, minimumBlockWidth, modWidth])\n\n const scale =\n totalBp / (modWidth - (displayedRegions.length - 1) * wholeSeqSpacer)\n\n return (\n <div>\n <OverviewRubberband\n model={model}\n overview={overview}\n ControlComponent={\n <Scalebar model={model} overview={overview} scale={scale} />\n }\n />\n <div className={classes.overview}>\n <svg height={HEADER_BAR_HEIGHT} className={classes.overviewSvg}>\n <OverviewScalebarPolygon model={model} overview={overview} />\n </svg>\n {children}\n </div>\n </div>\n )\n})\n\nexport default OverviewScalebar\n","import React, { useState, useEffect } from 'react'\nimport { observer } from 'mobx-react'\nimport { Slider, IconButton } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport ZoomIn from '@mui/icons-material/ZoomIn'\nimport ZoomOut from '@mui/icons-material/ZoomOut'\nimport { LinearGenomeViewModel } from '..'\n\nconst useStyles = makeStyles()(theme => ({\n container: {\n display: 'flex',\n flexDirection: 'row',\n alignItems: 'center',\n },\n slider: {\n width: 70,\n color: theme.palette.text.secondary,\n },\n}))\n\nconst ZoomControls = observer(function ({\n model,\n}: {\n model: LinearGenomeViewModel\n}) {\n const { classes } = useStyles()\n const { maxBpPerPx, minBpPerPx, bpPerPx } = model\n const [value, setValue] = useState(-Math.log2(bpPerPx) * 100)\n useEffect(() => {\n setValue(-Math.log2(bpPerPx) * 100)\n }, [bpPerPx])\n\n return (\n <div className={classes.container}>\n <IconButton\n data-testid=\"zoom_out\"\n onClick={() => {\n model.zoom(bpPerPx * 2)\n }}\n disabled={bpPerPx >= maxBpPerPx - 0.0001}\n size=\"large\"\n >\n <ZoomOut />\n </IconButton>\n\n <Slider\n size=\"small\"\n className={classes.slider}\n value={value}\n min={-Math.log2(maxBpPerPx) * 100}\n max={-Math.log2(minBpPerPx) * 100}\n onChange={(_, val) => {\n setValue(val as number)\n }}\n onChangeCommitted={() => model.zoomTo(2 ** (-value / 100))}\n />\n <IconButton\n data-testid=\"zoom_in\"\n onClick={() => {\n model.zoom(model.bpPerPx / 2)\n }}\n disabled={bpPerPx <= minBpPerPx + 0.0001}\n size=\"large\"\n >\n <ZoomIn />\n </IconButton>\n </div>\n )\n})\n\nexport default ZoomControls\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { useTheme, alpha } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { getSession } from '@jbrowse/core/util'\n\n// locals\nimport RefNameAutocomplete from './RefNameAutocomplete'\nimport { fetchResults } from './util'\nimport { LinearGenomeViewModel } from '..'\nimport { handleSelectedRegion, navToOption } from '../../searchUtils'\nimport { SPACING, WIDGET_HEIGHT } from '../consts'\n\nconst useStyles = makeStyles()(() => ({\n headerRefName: {\n minWidth: 100,\n },\n}))\n\nconst SearchBox = observer(function ({\n model,\n showHelp,\n}: {\n showHelp?: boolean\n model: LinearGenomeViewModel\n}) {\n const { classes } = useStyles()\n const theme = useTheme()\n const session = getSession(model)\n\n const { textSearchManager, assemblyManager } = session\n const { assemblyNames, rankSearchResults } = model\n const assemblyName = assemblyNames[0]!\n const assembly = assemblyManager.get(assemblyName)\n const searchScope = model.searchScope(assemblyName)\n\n return (\n <RefNameAutocomplete\n showHelp={showHelp}\n onSelect={async option => {\n try {\n if (option.hasLocation()) {\n await navToOption({ option, model, assemblyName })\n } else if (option.results?.length) {\n model.setSearchResults(option.results, option.getLabel())\n } else if (assembly) {\n await handleSelectedRegion({\n input: option.getLabel(),\n assembly,\n model,\n })\n }\n } catch (e) {\n console.error(e)\n getSession(model).notify(`${e}`, 'warning')\n }\n }}\n assemblyName={assemblyName}\n fetchResults={queryString =>\n fetchResults({\n queryString,\n searchScope,\n rankSearchResults,\n textSearchManager,\n assembly,\n })\n }\n model={model}\n minWidth={175}\n TextFieldProps={{\n variant: 'outlined',\n className: classes.headerRefName,\n style: {\n margin: SPACING,\n },\n InputProps: {\n style: {\n padding: 0,\n height: WIDGET_HEIGHT,\n background: alpha(theme.palette.background.paper, 0.8),\n },\n },\n }}\n />\n )\n})\n\nexport default SearchBox\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { Button, IconButton, FormGroup, Typography, alpha } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { getBpDisplayStr } from '@jbrowse/core/util'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\nimport ArrowForwardIcon from '@mui/icons-material/ArrowForward'\nimport ArrowBackIcon from '@mui/icons-material/ArrowBack'\n\n// locals\nimport { LinearGenomeViewModel } from '..'\nimport OverviewScalebar from './OverviewScalebar'\nimport ZoomControls from './ZoomControls'\nimport SearchBox from './SearchBox'\nimport { SPACING } from '../consts'\n\ntype LGV = LinearGenomeViewModel\nconst useStyles = makeStyles()(theme => ({\n headerBar: {\n display: 'flex',\n },\n headerForm: {\n flexWrap: 'nowrap',\n marginRight: 7,\n },\n spacer: {\n flexGrow: 1,\n },\n\n panButton: {\n background: alpha(theme.palette.background.paper, 0.8),\n color: theme.palette.text.primary,\n margin: SPACING,\n },\n bp: {\n display: 'flex',\n alignItems: 'center',\n marginLeft: 5,\n },\n toggleButton: {\n height: 44,\n border: 'none',\n marginLeft: theme.spacing(4),\n },\n buttonSpacer: {\n marginRight: theme.spacing(2),\n },\n}))\n\nconst HeaderButtons = observer(({ model }: { model: LGV }) => {\n const { classes } = useStyles()\n return (\n <IconButton\n onClick={model.activateTrackSelector}\n className={classes.toggleButton}\n title=\"Open track selector\"\n value=\"track_select\"\n >\n <TrackSelectorIcon className={classes.buttonSpacer} />\n </IconButton>\n )\n})\n\nfunction PanControls({ model }: { model: LGV }) {\n const { classes } = useStyles()\n return (\n <>\n <Button\n variant=\"outlined\"\n className={classes.panButton}\n onClick={() => {\n model.slide(-0.9)\n }}\n >\n <ArrowBackIcon />\n </Button>\n <Button\n variant=\"outlined\"\n className={classes.panButton}\n onClick={() => {\n model.slide(0.9)\n }}\n >\n <ArrowForwardIcon />\n </Button>\n </>\n )\n}\n\nconst RegionWidth = observer(function ({ model }: { model: LGV }) {\n const { classes } = useStyles()\n const { coarseTotalBp } = model\n return (\n <Typography variant=\"body2\" color=\"textSecondary\" className={classes.bp}>\n {getBpDisplayStr(coarseTotalBp)}\n </Typography>\n )\n})\n\nconst Controls = ({ model }: { model: LGV }) => {\n const { classes } = useStyles()\n return (\n <div className={classes.headerBar}>\n <HeaderButtons model={model} />\n <div className={classes.spacer} />\n <FormGroup row className={classes.headerForm}>\n <PanControls model={model} />\n <SearchBox model={model} />\n </FormGroup>\n <RegionWidth model={model} />\n <ZoomControls model={model} />\n <div className={classes.spacer} />\n </div>\n )\n}\n\nconst LinearGenomeViewHeader = observer(function ({ model }: { model: LGV }) {\n const { hideHeader, hideHeaderOverview } = model\n return !hideHeader ? (\n hideHeaderOverview ? (\n <Controls model={model} />\n ) : (\n <OverviewScalebar model={model}>\n <Controls model={model} />\n </OverviewScalebar>\n )\n ) : null\n})\n\nexport default LinearGenomeViewHeader\n","import React, { lazy } from 'react'\nimport { getConf, AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { Region } from '@jbrowse/core/util/types'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { Region as IRegion } from '@jbrowse/core/util/types'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport {\n assembleLocString,\n clamp,\n findLast,\n getSession,\n isSessionModelWithWidgets,\n isSessionWithAddTracks,\n localStorageGetItem,\n localStorageSetItem,\n measureText,\n springAnimate,\n sum,\n ParsedLocString,\n} from '@jbrowse/core/util'\nimport BaseResult from '@jbrowse/core/TextSearch/BaseResults'\nimport { BlockSet, BaseBlock } from '@jbrowse/core/util/blockTypes'\nimport calculateDynamicBlocks from '@jbrowse/core/util/calculateDynamicBlocks'\nimport calculateStaticBlocks from '@jbrowse/core/util/calculateStaticBlocks'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport { when, transaction, autorun } from 'mobx'\nimport {\n addDisposer,\n cast,\n getSnapshot,\n getRoot,\n resolveIdentifier,\n types,\n Instance,\n getParent,\n} from 'mobx-state-tree'\n\nimport Base1DView from '@jbrowse/core/util/Base1DViewModel'\nimport { moveTo, pxToBp, bpToPx } from '@jbrowse/core/util/Base1DUtils'\nimport { saveAs } from 'file-saver'\nimport clone from 'clone'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\nimport SyncAltIcon from '@mui/icons-material/SyncAlt'\nimport VisibilityIcon from '@mui/icons-material/Visibility'\nimport LabelIcon from '@mui/icons-material/Label'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera'\nimport ZoomInIcon from '@mui/icons-material/ZoomIn'\nimport MenuOpenIcon from '@mui/icons-material/MenuOpen'\nimport PaletteIcon from '@mui/icons-material/Palette'\nimport SearchIcon from '@mui/icons-material/Search'\n\nimport MiniControls from './components/MiniControls'\nimport Header from './components/Header'\nimport { generateLocations, parseLocStrings } from './util'\nimport { Assembly } from '@jbrowse/core/assemblyManager/assembly'\nimport { handleSelectedRegion } from '../searchUtils'\nimport {\n HEADER_BAR_HEIGHT,\n HEADER_OVERVIEW_HEIGHT,\n INTER_REGION_PADDING_WIDTH,\n RESIZE_HANDLE_HEIGHT,\n SCALE_BAR_HEIGHT,\n} from './consts'\n\n// lazies\nconst ReturnToImportFormDialog = lazy(\n () => import('@jbrowse/core/ui/ReturnToImportFormDialog'),\n)\nconst SequenceSearchDialog = lazy(\n () => import('./components/SequenceSearchDialog'),\n)\nconst ExportSvgDialog = lazy(() => import('./components/ExportSvgDialog'))\nconst GetSequenceDialog = lazy(() => import('./components/GetSequenceDialog'))\nconst SearchResultsDialog = lazy(\n () => import('./components/SearchResultsDialog'),\n)\n\nexport interface BpOffset {\n refName?: string\n index: number\n offset: number\n start?: number\n end?: number\n coord?: number\n reversed?: boolean\n assemblyName?: string\n oob?: boolean\n}\nexport interface ExportSvgOptions {\n rasterizeLayers?: boolean\n filename?: string\n Wrapper?: React.FC<{ children: React.ReactNode }>\n fontSize?: number\n rulerHeight?: number\n textHeight?: number\n paddingHeight?: number\n headerHeight?: number\n cytobandHeight?: number\n trackLabels?: string\n themeName?: string\n}\n\nexport interface HighlightType {\n start: number\n end: number\n assemblyName: string\n refName: string\n}\n\nfunction calculateVisibleLocStrings(contentBlocks: BaseBlock[]) {\n if (!contentBlocks.length) {\n return ''\n }\n const isSingleAssemblyName = contentBlocks.every(\n b => b.assemblyName === contentBlocks[0]!.assemblyName,\n )\n const locs = contentBlocks.map(block =>\n assembleLocString({\n ...block,\n start: Math.round(block.start),\n end: Math.round(block.end),\n assemblyName: isSingleAssemblyName ? undefined : block.assemblyName,\n }),\n )\n return locs.join(' ')\n}\n\nexport interface NavLocation {\n refName: string\n start?: number\n end?: number\n assemblyName?: string\n}\n\n/**\n * #stateModel LinearGenomeView\n * #category view\n *\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nexport function stateModelFactory(pluginManager: PluginManager) {\n return types\n .compose(\n 'LinearGenomeView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n\n /**\n * #property\n * this is a string instead of the const literal 'LinearGenomeView' to\n * reduce some typescripting strictness, but you should pass the string\n * 'LinearGenomeView' to the model explicitly\n */\n type: types.literal('LinearGenomeView') as unknown as string,\n\n /**\n * #property\n * corresponds roughly to the horizontal scroll of the LGV\n */\n offsetPx: 0,\n\n /**\n * #property\n * corresponds roughly to the zoom level, base-pairs per pixel\n */\n bpPerPx: 1,\n\n /**\n * #property\n * currently displayed regions, can be a single chromosome, arbitrary\n * subsections, or the entire set of chromosomes in the genome, but it not\n * advised to use the entire set of chromosomes if your assembly is very\n * fragmented\n */\n displayedRegions: types.optional(types.frozen<IRegion[]>(), []),\n\n /**\n * #property\n * array of currently displayed tracks state models instances\n */\n tracks: types.array(\n pluginManager.pluggableMstType('track', 'stateModel'),\n ),\n\n /**\n * #property\n */\n hideHeader: false,\n\n /**\n * #property\n */\n hideHeaderOverview: false,\n\n /**\n * #property\n */\n hideNoTracksActive: false,\n\n /**\n * #property\n */\n trackSelectorType: types.optional(\n types.enumeration(['hierarchical']),\n 'hierarchical',\n ),\n /**\n * #property\n * show the \"center line\"\n */\n showCenterLine: types.optional(types.boolean, () =>\n Boolean(\n JSON.parse(localStorageGetItem('lgv-showCenterLine') || 'false'),\n ),\n ),\n\n /**\n * #property\n * show the \"cytobands\" in the overview scale bar\n */\n showCytobandsSetting: types.optional(types.boolean, () =>\n Boolean(\n JSON.parse(localStorageGetItem('lgv-showCytobands') || 'true'),\n ),\n ),\n\n /**\n * #property\n * how to display the track labels, can be \"overlapping\", \"offset\", or\n * \"hidden\", or empty string \"\" (which results in conf being used). see\n * LinearGenomeViewPlugin\n * https://jbrowse.org/jb2/docs/config/lineargenomeviewplugin/ docs for\n * how conf is used\n */\n trackLabels: types.optional(\n types.string,\n () => localStorageGetItem('lgv-trackLabels') || '',\n ),\n\n /**\n * #property\n * show the \"gridlines\" in the track area\n */\n showGridlines: true,\n\n /**\n * #property\n * highlights on the LGV from the URL parameters\n */\n highlight: types.optional(\n types.array(types.frozen<HighlightType>()),\n [],\n ),\n\n /**\n * #property\n * color by CDS\n */\n colorByCDS: types.optional(types.boolean, () =>\n Boolean(JSON.parse(localStorageGetItem('lgv-colorByCDS') || 'false')),\n ),\n\n /**\n * #property\n * color by CDS\n */\n showTrackOutlines: types.optional(types.boolean, () =>\n Boolean(\n JSON.parse(localStorageGetItem('lgv-showTrackOutlines') || 'true'),\n ),\n ),\n }),\n )\n .volatile(() => ({\n volatileWidth: undefined as number | undefined,\n minimumBlockWidth: 3,\n draggingTrackId: undefined as undefined | string,\n volatileError: undefined as unknown,\n\n // array of callbacks to run after the next set of the displayedRegions,\n // which is basically like an onLoad\n afterDisplayedRegionsSetCallbacks: [] as (() => void)[],\n scaleFactor: 1,\n trackRefs: {} as Record<string, HTMLDivElement>,\n coarseDynamicBlocks: [] as BaseBlock[],\n coarseTotalBp: 0,\n leftOffset: undefined as undefined | BpOffset,\n rightOffset: undefined as undefined | BpOffset,\n }))\n .views(self => ({\n /**\n * #getter\n * this is the effective value of the track labels setting, incorporating\n * both the config and view state. use this instead of view.trackLabels\n */\n get trackLabelsSetting() {\n const sessionSetting = getConf(getSession(self), [\n 'LinearGenomeViewPlugin',\n 'trackLabels',\n ])\n return self.trackLabels || sessionSetting\n },\n /**\n * #getter\n */\n get width(): number {\n if (self.volatileWidth === undefined) {\n throw new Error(\n 'width undefined, make sure to check for model.initialized',\n )\n }\n return self.volatileWidth\n },\n /**\n * #getter\n */\n get interRegionPaddingWidth() {\n return INTER_REGION_PADDING_WIDTH\n },\n\n /**\n * #getter\n */\n get assemblyNames() {\n return [\n ...new Set(self.displayedRegions.map(region => region.assemblyName)),\n ]\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n scaleBarDisplayPrefix() {\n return getParent<any>(self, 2).type === 'LinearSyntenyView'\n ? self.assemblyNames[0]\n : ''\n },\n /**\n * #method\n */\n\n MiniControlsComponent(): React.FC<any> {\n return MiniControls\n },\n\n /**\n * #method\n */\n\n HeaderComponent(): React.FC<any> {\n return Header\n },\n\n /**\n * #getter\n */\n get assemblyErrors() {\n const { assemblyManager } = getSession(self)\n return self.assemblyNames\n .map(a => assemblyManager.get(a)?.error)\n .filter(f => !!f)\n .join(', ')\n },\n\n /**\n * #getter\n */\n get assembliesInitialized() {\n const { assemblyManager } = getSession(self)\n const { assemblyNames } = self\n return assemblyNames.every(a => assemblyManager.get(a)?.initialized)\n },\n\n /**\n * #getter\n */\n get initialized() {\n return self.volatileWidth !== undefined && this.assembliesInitialized\n },\n\n /**\n * #getter\n */\n get hasDisplayedRegions() {\n return self.displayedRegions.length > 0\n },\n\n /**\n * #getter\n */\n get scaleBarHeight() {\n return SCALE_BAR_HEIGHT + RESIZE_HANDLE_HEIGHT\n },\n\n /**\n * #getter\n */\n get headerHeight() {\n if (self.hideHeader) {\n return 0\n }\n if (self.hideHeaderOverview) {\n return HEADER_BAR_HEIGHT\n }\n return HEADER_BAR_HEIGHT + HEADER_OVERVIEW_HEIGHT\n },\n\n /**\n * #getter\n */\n get trackHeights() {\n return sum(self.tracks.map(t => t.displays[0].height))\n },\n\n /**\n * #getter\n */\n get trackHeightsWithResizeHandles() {\n return this.trackHeights + self.tracks.length * RESIZE_HANDLE_HEIGHT\n },\n\n /**\n * #getter\n */\n get height() {\n return (\n this.trackHeightsWithResizeHandles +\n this.headerHeight +\n this.scaleBarHeight\n )\n },\n\n /**\n * #getter\n */\n get totalBp() {\n return sum(self.displayedRegions.map(r => r.end - r.start))\n },\n\n /**\n * #getter\n */\n get maxBpPerPx() {\n return this.totalBp / (self.width * 0.9)\n },\n\n /**\n * #getter\n */\n get minBpPerPx() {\n return 1 / 50\n },\n\n /**\n * #getter\n */\n get error(): unknown {\n return self.volatileError || this.assemblyErrors\n },\n\n /**\n * #getter\n */\n get maxOffset() {\n // objectively determined to keep the linear genome on the main screen\n const leftPadding = 10\n return this.displayedRegionsTotalPx - leftPadding\n },\n\n /**\n * #getter\n */\n get minOffset() {\n // objectively determined to keep the linear genome on the main screen\n const rightPadding = 30\n return -self.width + rightPadding\n },\n\n /**\n * #getter\n */\n get displayedRegionsTotalPx() {\n return this.totalBp / self.bpPerPx\n },\n\n /**\n * #method\n */\n renderProps() {\n return {\n ...getParentRenderProps(self),\n bpPerPx: self.bpPerPx,\n colorByCDS: self.colorByCDS,\n }\n },\n\n /**\n * #method\n */\n searchScope(assemblyName: string) {\n return {\n assemblyName,\n includeAggregateIndexes: true,\n tracks: self.tracks,\n }\n },\n\n /**\n * #method\n */\n getTrack(id: string) {\n return self.tracks.find(t => t.configuration.trackId === id)\n },\n\n /**\n * #method\n */\n rankSearchResults(results: BaseResult[]) {\n // order of rank\n const openTrackIds = new Set(\n self.tracks.map(track => track.configuration.trackId),\n )\n for (const result of results) {\n if (openTrackIds.has(result.trackId)) {\n result.updateScore(result.getScore() + 1)\n }\n }\n return results\n },\n\n /**\n * #method\n * modifies view menu action onClick to apply to all tracks of same type\n */\n rewriteOnClicks(trackType: string, viewMenuActions: MenuItem[]) {\n viewMenuActions.forEach(action => {\n // go to lowest level menu\n if ('subMenu' in action) {\n this.rewriteOnClicks(trackType, action.subMenu)\n }\n if ('onClick' in action) {\n const holdOnClick = action.onClick\n action.onClick = (...args: unknown[]) => {\n self.tracks.forEach(track => {\n if (track.type === trackType) {\n holdOnClick.apply(track, [track, ...args])\n }\n })\n }\n }\n })\n },\n /**\n * #getter\n */\n get trackTypeActions() {\n const allActions = new Map<string, MenuItem[]>()\n self.tracks.forEach(track => {\n const trackInMap = allActions.get(track.type)\n if (!trackInMap) {\n const viewMenuActions = clone(track.viewMenuActions)\n this.rewriteOnClicks(track.type, viewMenuActions)\n allActions.set(track.type, viewMenuActions)\n }\n })\n\n return allActions\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setShowTrackOutlines(arg: boolean) {\n self.showTrackOutlines = arg\n },\n /**\n * #action\n */\n setColorByCDS(flag: boolean) {\n self.colorByCDS = flag\n },\n /**\n * #action\n */\n setShowCytobands(flag: boolean) {\n self.showCytobandsSetting = flag\n },\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.volatileWidth = newWidth\n },\n /**\n * #action\n */\n setError(error: unknown) {\n self.volatileError = error\n },\n /**\n * #action\n */\n setHideHeader(b: boolean) {\n self.hideHeader = b\n },\n /**\n * #action\n */\n setHideHeaderOverview(b: boolean) {\n self.hideHeaderOverview = b\n },\n /**\n * #action\n */\n setHideNoTracksActive(b: boolean) {\n self.hideNoTracksActive = b\n },\n /**\n * #action\n */\n setShowGridlines(b: boolean) {\n self.showGridlines = b\n },\n /**\n * #action\n */\n addToHighlights(highlight: HighlightType) {\n self.highlight.push(highlight)\n },\n /**\n * #action\n */\n setHighlight(highlight?: HighlightType[]) {\n self.highlight = cast(highlight)\n },\n /**\n * #action\n */\n removeHighlight(highlight: HighlightType) {\n self.highlight.remove(highlight)\n },\n /**\n * #action\n */\n scrollTo(offsetPx: number) {\n const newOffsetPx = clamp(offsetPx, self.minOffset, self.maxOffset)\n self.offsetPx = newOffsetPx\n return newOffsetPx\n },\n\n /**\n * #action\n */\n zoomTo(bpPerPx: number, offset = self.width / 2, centerAtOffset = false) {\n const newBpPerPx = clamp(bpPerPx, self.minBpPerPx, self.maxBpPerPx)\n if (newBpPerPx === self.bpPerPx) {\n return newBpPerPx\n }\n const oldBpPerPx = self.bpPerPx\n\n if (Math.abs(oldBpPerPx - newBpPerPx) < 0.000001) {\n console.warn('zoomTo bpPerPx rounding error')\n return oldBpPerPx\n }\n self.bpPerPx = newBpPerPx\n\n // tweak the offset so that the center of the view remains at the same\n // coordinate\n this.scrollTo(\n Math.round(\n ((self.offsetPx + offset) * oldBpPerPx) / newBpPerPx -\n (centerAtOffset ? self.width / 2 : offset),\n ),\n )\n return newBpPerPx\n },\n\n /**\n * #action\n * sets offsets of rubberband, used in the get sequence dialog can call\n * view.getSelectedRegions(view.leftOffset,view.rightOffset) to compute\n * the selected regions from the offsets\n */\n setOffsets(left?: BpOffset, right?: BpOffset) {\n self.leftOffset = left\n self.rightOffset = right\n },\n\n /**\n * #action\n */\n setSearchResults(\n searchResults: BaseResult[],\n searchQuery: string,\n assemblyName?: string,\n ) {\n getSession(self).queueDialog(handleClose => [\n SearchResultsDialog,\n {\n model: self as LinearGenomeViewModel,\n searchResults,\n searchQuery,\n handleClose,\n assemblyName,\n },\n ])\n },\n\n /**\n * #action\n */\n setNewView(bpPerPx: number, offsetPx: number) {\n this.zoomTo(bpPerPx)\n this.scrollTo(offsetPx)\n },\n\n /**\n * #action\n */\n horizontallyFlip() {\n self.displayedRegions = cast(\n [...self.displayedRegions]\n .reverse()\n .map(region => ({ ...region, reversed: !region.reversed })),\n )\n this.scrollTo(self.totalBp / self.bpPerPx - self.offsetPx - self.width)\n },\n\n /**\n * #action\n */\n showTrack(\n trackId: string,\n initialSnapshot = {},\n displayInitialSnapshot = {},\n ) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n if (!conf) {\n throw new Error(`Could not resolve identifier \"${trackId}\"`)\n }\n const trackType = pluginManager.getTrackType(conf?.type)\n if (!trackType) {\n throw new Error(`Unknown track type ${conf.type}`)\n }\n const viewType = pluginManager.getViewType(self.type)!\n const supportedDisplays = new Set(\n viewType.displayTypes.map(d => d.name),\n )\n const displayConf = conf.displays.find((d: AnyConfigurationModel) =>\n supportedDisplays.has(d.type),\n )\n if (!displayConf) {\n throw new Error(\n `Could not find a compatible display for view type ${self.type}`,\n )\n }\n\n const t = self.tracks.filter(t => t.configuration === conf)\n if (t.length === 0) {\n const track = trackType.stateModel.create({\n ...initialSnapshot,\n type: conf.type,\n configuration: conf,\n displays: [\n {\n type: displayConf.type,\n configuration: displayConf,\n ...displayInitialSnapshot,\n },\n ],\n })\n self.tracks.push(track)\n return track\n }\n return t[0]\n },\n /**\n * #action\n */\n hideTrack(trackId: string) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n const t = self.tracks.filter(t => t.configuration === conf)\n transaction(() => {\n t.forEach(t => self.tracks.remove(t))\n })\n return t.length\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n moveTrackDown(id: string) {\n const idx = self.tracks.findIndex(v => v.id === id)\n if (idx === -1) {\n return\n }\n\n if (idx !== -1 && idx < self.tracks.length - 1) {\n self.tracks.splice(idx, 2, self.tracks[idx + 1], self.tracks[idx])\n }\n },\n /**\n * #action\n */\n moveTrackUp(id: string) {\n const idx = self.tracks.findIndex(track => track.id === id)\n if (idx > 0) {\n self.tracks.splice(idx - 1, 2, self.tracks[idx], self.tracks[idx - 1])\n }\n },\n /**\n * #action\n */\n moveTrackToTop(id: string) {\n const idx = self.tracks.findIndex(track => track.id === id)\n self.tracks = cast([\n self.tracks[idx],\n ...self.tracks.filter(track => track.id !== id),\n ])\n },\n /**\n * #action\n */\n moveTrackToBottom(id: string) {\n const idx = self.tracks.findIndex(track => track.id === id)\n self.tracks = cast([\n ...self.tracks.filter(track => track.id !== id),\n self.tracks[idx],\n ])\n },\n /**\n * #action\n */\n moveTrack(movingId: string, targetId: string) {\n const oldIndex = self.tracks.findIndex(track => track.id === movingId)\n if (oldIndex === -1) {\n throw new Error(`Track ID ${movingId} not found`)\n }\n const newIndex = self.tracks.findIndex(track => track.id === targetId)\n if (newIndex === -1) {\n throw new Error(`Track ID ${targetId} not found`)\n }\n\n const tracks = self.tracks.filter((_, idx) => idx !== oldIndex)\n tracks.splice(newIndex, 0, self.tracks[oldIndex])\n self.tracks = cast(tracks)\n },\n\n /**\n * #action\n */\n toggleTrack(trackId: string) {\n // if we have any tracks with that configuration, turn them off\n const hiddenCount = self.hideTrack(trackId)\n // if none had that configuration, turn one on\n if (!hiddenCount) {\n self.showTrack(trackId)\n return true\n }\n return false\n },\n\n /**\n * #action\n */\n setTrackLabels(setting: 'overlapping' | 'offset' | 'hidden') {\n localStorage.setItem('lgv-trackLabels', setting)\n self.trackLabels = setting\n },\n\n /**\n * #action\n */\n setShowCenterLine(b: boolean) {\n self.showCenterLine = b\n },\n\n /**\n * #action\n */\n setDisplayedRegions(regions: Region[]) {\n self.displayedRegions = cast(regions)\n self.zoomTo(self.bpPerPx)\n },\n\n /**\n * #action\n */\n activateTrackSelector() {\n if (self.trackSelectorType === 'hierarchical') {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const selector = session.addWidget(\n 'HierarchicalTrackSelectorWidget',\n 'hierarchicalTrackSelector',\n { view: self },\n )\n session.showWidget(selector)\n return selector\n }\n }\n throw new Error(`invalid track selector type ${self.trackSelectorType}`)\n },\n\n /**\n * #method\n * Helper method for the fetchSequence.\n * Retrieves the corresponding regions that were selected by the\n * rubberband\n *\n * @param leftOffset - `object as {start, end, index, offset}`, offset = start\n * of user drag\n * @param rightOffset - `object as {start, end, index, offset}`,\n * offset = end of user drag\n * @returns array of Region[]\n */\n getSelectedRegions(leftOffset?: BpOffset, rightOffset?: BpOffset) {\n const snap = getSnapshot(self)\n const simView = Base1DView.create({\n ...snap,\n interRegionPaddingWidth: self.interRegionPaddingWidth,\n })\n\n simView.setVolatileWidth(self.width)\n simView.moveTo(leftOffset, rightOffset)\n\n return simView.dynamicBlocks.contentBlocks.map(region => ({\n ...region,\n start: Math.floor(region.start),\n end: Math.ceil(region.end),\n }))\n },\n\n /**\n * #action\n * schedule something to be run after the next time displayedRegions is\n * set\n */\n afterDisplayedRegionsSet(cb: () => void) {\n self.afterDisplayedRegionsSetCallbacks.push(cb)\n },\n\n /**\n * #action\n */\n horizontalScroll(distance: number) {\n const oldOffsetPx = self.offsetPx\n // newOffsetPx is the actual offset after the scroll is clamped\n const newOffsetPx = self.scrollTo(self.offsetPx + distance)\n return newOffsetPx - oldOffsetPx\n },\n\n /**\n * #action\n */\n center() {\n const centerBp = self.totalBp / 2\n const centerPx = centerBp / self.bpPerPx\n self.scrollTo(Math.round(centerPx - self.width / 2))\n },\n\n /**\n * #action\n */\n showAllRegions() {\n self.zoomTo(self.maxBpPerPx)\n this.center()\n },\n\n /**\n * #action\n */\n showAllRegionsInAssembly(assemblyName?: string) {\n const session = getSession(self)\n const { assemblyManager } = session\n if (!assemblyName) {\n const names = new Set(self.displayedRegions.map(r => r.assemblyName))\n if (names.size > 1) {\n session.notify(\n `Can't perform operation with multiple assemblies currently`,\n )\n return\n }\n ;[assemblyName] = [...names]\n }\n const assembly = assemblyManager.get(assemblyName!)\n if (assembly) {\n const { regions } = assembly\n if (regions) {\n this.setDisplayedRegions(regions)\n self.zoomTo(self.maxBpPerPx)\n this.center()\n }\n }\n },\n\n /**\n * #action\n */\n setDraggingTrackId(idx?: string) {\n self.draggingTrackId = idx\n },\n\n /**\n * #action\n */\n setScaleFactor(factor: number) {\n self.scaleFactor = factor\n },\n\n /**\n * #action\n * this \"clears the view\" and makes the view return to the import form\n */\n clearView() {\n this.setDisplayedRegions([])\n self.tracks.clear()\n // it is necessary to run these after setting displayed regions empty\n // or else model.offsetPx gets set to Infinity and breaks\n // mobx-state-tree snapshot\n self.scrollTo(0)\n self.zoomTo(10)\n },\n\n /**\n * #method\n * creates an svg export and save using FileSaver\n */\n async exportSvg(opts: ExportSvgOptions = {}) {\n const { renderToSvg } = await import(\n './svgcomponents/SVGLinearGenomeView'\n )\n const html = await renderToSvg(self as LinearGenomeViewModel, opts)\n const blob = new Blob([html], { type: 'image/svg+xml' })\n saveAs(blob, opts.filename || 'image.svg')\n },\n }))\n .actions(self => {\n let cancelLastAnimation = () => {}\n\n /**\n * #action\n * perform animated slide\n */\n function slide(viewWidths: number) {\n const [animate, cancelAnimation] = springAnimate(\n self.offsetPx,\n self.offsetPx + self.width * viewWidths,\n self.scrollTo,\n undefined,\n undefined,\n 200,\n )\n cancelLastAnimation()\n cancelLastAnimation = cancelAnimation!\n animate!()\n }\n\n return { slide }\n })\n .actions(self => {\n let cancelLastAnimation = () => {}\n\n /**\n * #action\n * perform animated zoom\n */\n function zoom(targetBpPerPx: number) {\n self.zoomTo(self.bpPerPx)\n if (\n // already zoomed all the way in\n (targetBpPerPx < self.bpPerPx && self.bpPerPx === self.minBpPerPx) ||\n // already zoomed all the way out\n (targetBpPerPx > self.bpPerPx && self.bpPerPx === self.maxBpPerPx)\n ) {\n return\n }\n const factor = self.bpPerPx / targetBpPerPx\n const [animate, cancelAnimation] = springAnimate(\n 1,\n factor,\n self.setScaleFactor,\n () => {\n self.zoomTo(targetBpPerPx)\n self.setScaleFactor(1)\n },\n )\n cancelLastAnimation()\n cancelLastAnimation = cancelAnimation!\n animate!()\n }\n\n return { zoom }\n })\n .views(self => ({\n /**\n * #getter\n */\n get canShowCytobands() {\n return self.displayedRegions.length === 1 && this.anyCytobandsExist\n },\n /**\n * #getter\n */\n get showCytobands() {\n return this.canShowCytobands && self.showCytobandsSetting\n },\n /**\n * #getter\n */\n get anyCytobandsExist() {\n const { assemblyManager } = getSession(self)\n return self.assemblyNames.some(\n a => assemblyManager.get(a)?.cytobands?.length,\n )\n },\n /**\n * #getter\n * the cytoband is displayed to the right of the chromosome name, and\n * that offset is calculated manually with this method\n */\n get cytobandOffset() {\n return this.showCytobands\n ? measureText(self.displayedRegions[0]?.refName || '', 12) + 15\n : 0\n },\n }))\n .views(self => ({\n /**\n * #method\n * return the view menu items\n */\n menuItems(): MenuItem[] {\n const { canShowCytobands, showCytobands } = self\n const session = getSession(self)\n const menuItems: MenuItem[] = [\n {\n label: 'Return to import form',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ReturnToImportFormDialog,\n { model: self, handleClose },\n ])\n },\n icon: FolderOpenIcon,\n },\n ...(isSessionWithAddTracks(session)\n ? [\n {\n label: 'Sequence search',\n icon: SearchIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SequenceSearchDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n : []),\n {\n label: 'Export SVG',\n icon: PhotoCameraIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n {\n label: 'Open track selector',\n onClick: self.activateTrackSelector,\n icon: TrackSelectorIcon,\n },\n {\n label: 'Horizontally flip',\n icon: SyncAltIcon,\n onClick: self.horizontallyFlip,\n },\n {\n label: 'Color by CDS',\n type: 'checkbox',\n checked: self.colorByCDS,\n icon: PaletteIcon,\n onClick: () => {\n self.setColorByCDS(!self.colorByCDS)\n },\n },\n {\n label: 'Show...',\n icon: VisibilityIcon,\n subMenu: [\n {\n label: 'Show all regions in assembly',\n onClick: self.showAllRegionsInAssembly,\n },\n {\n label: 'Show center line',\n type: 'checkbox',\n checked: self.showCenterLine,\n onClick: () => {\n self.setShowCenterLine(!self.showCenterLine)\n },\n },\n {\n label: 'Show header',\n type: 'checkbox',\n checked: !self.hideHeader,\n onClick: () => {\n self.setHideHeader(!self.hideHeader)\n },\n },\n\n {\n label: 'Show track outlines',\n type: 'checkbox',\n checked: self.showTrackOutlines,\n onClick: () => {\n self.setShowTrackOutlines(!self.showTrackOutlines)\n },\n },\n {\n label: 'Show header overview',\n type: 'checkbox',\n checked: !self.hideHeaderOverview,\n onClick: () => {\n self.setHideHeaderOverview(!self.hideHeaderOverview)\n },\n disabled: self.hideHeader,\n },\n {\n label: 'Show no tracks active button',\n type: 'checkbox',\n checked: !self.hideNoTracksActive,\n onClick: () => {\n self.setHideNoTracksActive(!self.hideNoTracksActive)\n },\n },\n {\n label: 'Show guidelines',\n type: 'checkbox',\n checked: self.showGridlines,\n onClick: () => {\n self.setShowGridlines(!self.showGridlines)\n },\n },\n ...(canShowCytobands\n ? [\n {\n label: 'Show ideogram',\n type: 'checkbox' as const,\n checked: self.showCytobands,\n onClick: () => {\n self.setShowCytobands(!showCytobands)\n },\n },\n ]\n : []),\n ],\n },\n {\n label: 'Track labels',\n icon: LabelIcon,\n subMenu: [\n {\n label: 'Overlapping',\n icon: VisibilityIcon,\n type: 'radio',\n checked: self.trackLabelsSetting === 'overlapping',\n onClick: () => {\n self.setTrackLabels('overlapping')\n },\n },\n {\n label: 'Offset',\n icon: VisibilityIcon,\n type: 'radio',\n checked: self.trackLabelsSetting === 'offset',\n onClick: () => {\n self.setTrackLabels('offset')\n },\n },\n {\n label: 'Hidden',\n icon: VisibilityIcon,\n type: 'radio',\n checked: self.trackLabelsSetting === 'hidden',\n onClick: () => {\n self.setTrackLabels('hidden')\n },\n },\n ],\n },\n ]\n\n // add track's view level menu options\n for (const [key, value] of self.trackTypeActions.entries()) {\n if (value.length) {\n menuItems.push(\n { type: 'divider' },\n { type: 'subHeader', label: key },\n )\n value.forEach(action => menuItems.push(action))\n }\n }\n\n return menuItems\n },\n }))\n .views(self => {\n let currentlyCalculatedStaticBlocks: BlockSet | undefined\n let stringifiedCurrentlyCalculatedStaticBlocks = ''\n return {\n /**\n * #getter\n * static blocks are an important concept jbrowse uses to avoid\n * re-rendering when you scroll to the side. when you horizontally\n * scroll to the right, old blocks to the left may be removed, and new\n * blocks may be instantiated on the right. tracks may use the static\n * blocks to render their data for the region represented by the block\n */\n get staticBlocks() {\n const ret = calculateStaticBlocks(self)\n const sret = JSON.stringify(ret)\n if (stringifiedCurrentlyCalculatedStaticBlocks !== sret) {\n currentlyCalculatedStaticBlocks = ret\n stringifiedCurrentlyCalculatedStaticBlocks = sret\n }\n return currentlyCalculatedStaticBlocks!\n },\n /**\n * #getter\n * dynamic blocks represent the exact coordinates of the currently\n * visible genome regions on the screen. they are similar to static\n * blocks, but static blocks can go offscreen while dynamic blocks\n * represent exactly what is on screen\n */\n get dynamicBlocks() {\n return calculateDynamicBlocks(self)\n },\n /**\n * #getter\n * rounded dynamic blocks are dynamic blocks without fractions of bp\n */\n get roundedDynamicBlocks() {\n return this.dynamicBlocks.contentBlocks.map(\n block =>\n ({\n ...block,\n start: Math.floor(block.start),\n end: Math.ceil(block.end),\n }) as BaseBlock,\n )\n },\n\n /**\n * #getter\n * a single \"combo-locstring\" representing all the regions visible on\n * the screen\n */\n get visibleLocStrings() {\n return calculateVisibleLocStrings(this.dynamicBlocks.contentBlocks)\n },\n\n /**\n * #getter\n * same as visibleLocStrings, but only updated every 300ms\n */\n get coarseVisibleLocStrings() {\n return calculateVisibleLocStrings(self.coarseDynamicBlocks)\n },\n }\n })\n .actions(self => ({\n /**\n * #action\n */\n setCoarseDynamicBlocks(blocks: BlockSet) {\n self.coarseDynamicBlocks = blocks.contentBlocks\n self.coarseTotalBp = blocks.totalBp\n },\n\n afterAttach() {\n addDisposer(\n self,\n autorun(\n () => {\n if (self.initialized) {\n this.setCoarseDynamicBlocks(self.dynamicBlocks)\n }\n },\n { delay: 150 },\n ),\n )\n\n addDisposer(\n self,\n autorun(() => {\n const s = (s: unknown) => JSON.stringify(s)\n const { showCytobandsSetting, showCenterLine, colorByCDS } = self\n localStorageSetItem('lgv-showCytobands', s(showCytobandsSetting))\n localStorageSetItem('lgv-showCenterLine', s(showCenterLine))\n localStorageSetItem('lgv-colorByCDS', s(colorByCDS))\n }),\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n * offset is the base-pair-offset in the displayed region, index is the\n * index of the displayed region in the linear genome view\n *\n * @param start - object as `{start, end, offset, index}`\n * @param end - object as `{start, end, offset, index}`\n */\n moveTo(start?: BpOffset, end?: BpOffset) {\n moveTo(self, start, end)\n },\n\n /**\n * #action\n * Navigate to the given locstring, will change displayed regions if\n * needed, and wait for assemblies to be initialized\n *\n * @param input - e.g. \"chr1:1-100\", \"chr1:1-100 chr2:1-100\", \"chr 1 100\"\n * @param optAssemblyName - (optional) the assembly name to use when\n * navigating to the locstring\n */\n async navToLocString(input: string, optAssemblyName?: string) {\n const { assemblyNames } = self\n const { assemblyManager } = getSession(self)\n const assemblyName = optAssemblyName || assemblyNames[0]!\n if (assemblyName) {\n await assemblyManager.waitForAssembly(assemblyName)\n }\n\n return this.navToLocations(\n parseLocStrings(input, assemblyName, (ref, asm) =>\n assemblyManager.isValidRefName(ref, asm),\n ),\n assemblyName,\n )\n },\n\n /**\n * #action\n * Performs a text index search, and navigates to it immediately if a\n * single result is returned. Will pop up a search dialog if multiple\n * results are returned\n */\n async navToSearchString({\n input,\n assembly,\n }: {\n input: string\n assembly: Assembly\n }) {\n await handleSelectedRegion({\n input,\n assembly,\n model: self as LinearGenomeViewModel,\n })\n },\n\n /**\n * #action\n * Similar to `navToLocString`, but accepts parsed location objects\n * instead of strings. Will try to perform `setDisplayedRegions` if\n * changing regions\n */\n async navToLocations(\n parsedLocStrings: ParsedLocString[],\n assemblyName?: string,\n ) {\n const { assemblyManager } = getSession(self)\n await when(() => self.volatileWidth !== undefined)\n\n const locations = await generateLocations(\n parsedLocStrings,\n assemblyManager,\n assemblyName,\n )\n\n if (locations.length === 1) {\n const loc = locations[0]!\n const { reversed, parentRegion, start, end } = loc\n self.setDisplayedRegions([{ reversed, ...parentRegion }])\n\n this.navTo({\n ...loc,\n start: clamp(start ?? 0, 0, parentRegion.end),\n end: clamp(end ?? parentRegion.end, 0, parentRegion.end),\n })\n } else {\n self.setDisplayedRegions(\n // @ts-expect-error\n locations.map(r => (r.start === undefined ? r.parentRegion : r)),\n )\n self.showAllRegions()\n }\n },\n\n /**\n * #action\n * Navigate to a location based on its refName and optionally start, end,\n * and assemblyName. Will not try to change displayed regions, use\n * `navToLocations` instead. Only navigates to a location if it is\n * entirely within a displayedRegion. Navigates to the first matching\n * location encountered.\n *\n * Throws an error if navigation was unsuccessful\n *\n * @param query - a proposed location to navigate to\n */\n navTo(query: NavLocation) {\n this.navToMultiple([query])\n },\n\n /**\n * #action\n * Navigate to a location based on its refName and optionally start, end,\n * and assemblyName. Will not try to change displayed regions, use\n * navToLocations instead. Only navigates to a location if it is entirely\n * within a displayedRegion. Navigates to the first matching location\n * encountered.\n *\n * Throws an error if navigation was unsuccessful\n *\n * @param locations - proposed location to navigate to\n */\n navToMultiple(locations: NavLocation[]) {\n if (\n locations.some(\n l =>\n l.start !== undefined && l.end !== undefined && l.start > l.end,\n )\n ) {\n throw new Error('found start greater than end')\n }\n const f1 = locations.at(0)\n const f2 = locations.at(-1)\n if (!f1 || !f2) {\n return\n }\n const a = self.assemblyNames[0]!\n const { assemblyManager } = getSession(self)\n const assembly1 = assemblyManager.get(f1.assemblyName || a)\n const assembly2 = assemblyManager.get(f2.assemblyName || a)\n const ref1 = assembly1?.getCanonicalRefName(f1.refName) || f1.refName\n const ref2 = assembly2?.getCanonicalRefName(f2.refName) || f2.refName\n const r1 = self.displayedRegions.find(r => r.refName === ref1)\n const r2 = findLast(self.displayedRegions, r => r.refName === ref2)\n if (!r1) {\n throw new Error(`could not find a region with refName \"${ref1}\"`)\n }\n if (!r2) {\n throw new Error(`could not find a region with refName \"${ref2}\"`)\n }\n\n const s1 = f1.start === undefined ? r1.start : f1.start\n const e1 = f1.end === undefined ? r1.end : f1.end\n const s2 = f2.start === undefined ? r2.start : f2.start\n const e2 = f2.end === undefined ? r2.end : f2.end\n\n const index = self.displayedRegions.findIndex(\n r =>\n ref1 === r.refName &&\n s1 >= r.start &&\n s1 <= r.end &&\n e1 <= r.end &&\n e1 >= r.start,\n )\n\n const index2 = self.displayedRegions.findIndex(\n r =>\n ref2 === r.refName &&\n s2 >= r.start &&\n s2 <= r.end &&\n e2 <= r.end &&\n e2 >= r.start,\n )\n\n if (index === -1 || index2 === -1) {\n throw new Error(\n `could not find a region that contained \"${locations.map(l =>\n assembleLocString(l),\n )}\"`,\n )\n }\n\n const sd = self.displayedRegions[index]!\n const ed = self.displayedRegions[index2]!\n\n this.moveTo(\n {\n index,\n offset: sd.reversed ? sd.end - e1 : s1 - sd.start,\n },\n {\n index: index2,\n offset: ed.reversed ? ed.end - s2 : e2 - ed.start,\n },\n )\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n rubberBandMenuItems(): MenuItem[] {\n return [\n {\n label: 'Zoom to region',\n icon: ZoomInIcon,\n onClick: () => {\n self.moveTo(self.leftOffset, self.rightOffset)\n },\n },\n {\n label: 'Get sequence',\n icon: MenuOpenIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n GetSequenceDialog,\n\n { model: self as any, handleClose },\n ])\n },\n },\n ]\n },\n\n /**\n * #method\n */\n bpToPx({\n refName,\n coord,\n regionNumber,\n }: {\n refName: string\n coord: number\n regionNumber?: number\n }) {\n return bpToPx({ refName, coord, regionNumber, self })\n },\n\n /**\n * #method\n * scrolls the view to center on the given bp. if that is not in any of\n * the displayed regions, does nothing\n *\n * @param coord - basepair at which you want to center the view\n * @param refName - refName of the displayedRegion you are centering at\n * @param regionNumber - index of the displayedRegion\n */\n centerAt(coord: number, refName: string, regionNumber?: number) {\n const centerPx = this.bpToPx({\n refName,\n coord,\n regionNumber,\n })\n if (centerPx !== undefined) {\n self.scrollTo(Math.round(centerPx.offsetPx - self.width / 2))\n }\n },\n\n /**\n * #method\n */\n pxToBp(px: number) {\n return pxToBp(self, px)\n },\n\n /**\n * #getter\n */\n get centerLineInfo() {\n return self.displayedRegions.length > 0\n ? this.pxToBp(self.width / 2)\n : undefined\n },\n }))\n .actions(self => ({\n afterCreate() {\n function handler(e: KeyboardEvent) {\n const session = getSession(self)\n if (session.focusedViewId === self.id && (e.ctrlKey || e.metaKey)) {\n if (e.code === 'ArrowLeft') {\n e.preventDefault()\n self.slide(-0.9)\n } else if (e.code === 'ArrowRight') {\n e.preventDefault()\n self.slide(0.9)\n } else if (e.code === 'ArrowUp' && self.scaleFactor === 1) {\n e.preventDefault()\n self.zoom(self.bpPerPx / 2)\n } else if (e.code === 'ArrowDown' && self.scaleFactor === 1) {\n e.preventDefault()\n self.zoom(self.bpPerPx * 2)\n }\n }\n }\n document.addEventListener('keydown', handler)\n addDisposer(self, () => {\n document.removeEventListener('keydown', handler)\n })\n },\n }))\n .preProcessSnapshot(snap => {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (!snap) {\n return snap\n }\n const { highlight, ...rest } = snap\n return {\n highlight:\n Array.isArray(highlight) || highlight === undefined\n ? highlight\n : [highlight],\n ...rest,\n }\n })\n}\n\nexport type LinearGenomeViewStateModel = ReturnType<typeof stateModelFactory>\nexport type LinearGenomeViewModel = Instance<LinearGenomeViewStateModel>\n\nexport {\n default as ReactComponent,\n default as LinearGenomeView,\n} from './components/LinearGenomeView'\n\nexport { default as RefNameAutocomplete } from './components/RefNameAutocomplete'\nexport { default as SearchBox } from './components/SearchBox'\nexport { default as ZoomControls } from './components/ZoomControls'\n\nexport { renderToSvg } from './svgcomponents/SVGLinearGenomeView'\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { baseLinearDisplayConfigSchema } from '../BaseLinearDisplay'\n\n/**\n * #config LinearBasicDisplay\n * #category display\n */\nfunction configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearBasicDisplay',\n {\n /**\n * #slot\n */\n renderer: pluginManager.pluggableConfigSchemaType('renderer'),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaFactory\n","import { lazy } from 'react'\nimport {\n getConf,\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport { types, getEnv, Instance, cast } from 'mobx-state-tree'\n\n// icons\nimport VisibilityIcon from '@mui/icons-material/Visibility'\n\n// locals\nimport { BaseLinearDisplay } from '../BaseLinearDisplay'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\n\nconst SetMaxHeightDialog = lazy(() => import('./components/SetMaxHeightDialog'))\nconst AddFiltersDialog = lazy(() => import('./components/AddFiltersDialog'))\n\n/**\n * #stateModel LinearBasicDisplay\n * #category display\n * used by `FeatureTrack`, has simple settings like \"show/hide feature labels\",\n * etc.\n *\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearBasicDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearBasicDisplay'),\n /**\n * #property\n */\n trackShowLabels: types.maybe(types.boolean),\n /**\n * #property\n */\n trackShowDescriptions: types.maybe(types.boolean),\n /**\n * #property\n */\n trackDisplayMode: types.maybe(types.string),\n /**\n * #property\n */\n trackMaxHeight: types.maybe(types.number),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n jexlFilters: types.maybe(types.array(types.string)),\n }),\n )\n .views(self => ({\n /**\n * #getter\n */\n get activeFilters() {\n // config jexlFilters are deferred evaluated so they are prepended with\n // jexl at runtime rather than being stored with jexl in the config\n return (\n self.jexlFilters ??\n getConf(self, 'jexlFilters').map((r: string) => `jexl:${r}`)\n )\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return getConf(self, ['renderer', 'type'])\n },\n\n /**\n * #getter\n */\n get showLabels() {\n return self.trackShowLabels ?? getConf(self, ['renderer', 'showLabels'])\n },\n\n /**\n * #getter\n */\n get showDescriptions() {\n return (\n self.trackShowDescriptions ??\n getConf(self, ['renderer', 'showDescriptions'])\n )\n },\n\n /**\n * #getter\n */\n get maxHeight() {\n return self.trackMaxHeight ?? getConf(self, ['renderer', 'maxHeight'])\n },\n\n /**\n * #getter\n */\n get displayMode() {\n return (\n self.trackDisplayMode ?? getConf(self, ['renderer', 'displayMode'])\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get rendererConfig() {\n const configBlob = getConf(self, ['renderer']) || {}\n const config = configBlob as Omit<typeof configBlob, symbol>\n\n return self.rendererType.configSchema.create(\n {\n ...config,\n showLabels: self.showLabels,\n showDescriptions: self.showDescriptions,\n displayMode: self.displayMode,\n maxHeight: self.maxHeight,\n },\n getEnv(self),\n )\n },\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n setJexlFilters(f?: string[]) {\n self.jexlFilters = cast(f)\n },\n /**\n * #action\n */\n toggleShowLabels() {\n self.trackShowLabels = !self.showLabels\n },\n /**\n * #action\n */\n toggleShowDescriptions() {\n self.trackShowDescriptions = !self.showDescriptions\n },\n /**\n * #action\n */\n setDisplayMode(val: string) {\n self.trackDisplayMode = val\n },\n /**\n * #action\n */\n setMaxHeight(val?: number) {\n self.trackMaxHeight = val\n },\n }))\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderProps: superRenderProps,\n } = self\n return {\n /**\n * #method\n */\n renderProps() {\n const superProps = superRenderProps()\n return {\n ...(superProps as Omit<typeof superProps, symbol>),\n config: self.rendererConfig,\n filters: new SerializableFilterChain({\n filters: self.activeFilters,\n }),\n }\n },\n\n /**\n * #method\n */\n trackMenuItems(): MenuItem[] {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Show labels',\n icon: VisibilityIcon,\n type: 'checkbox',\n checked: self.showLabels,\n onClick: () => {\n self.toggleShowLabels()\n },\n },\n {\n label: 'Show descriptions',\n icon: VisibilityIcon,\n type: 'checkbox',\n checked: self.showDescriptions,\n onClick: () => {\n self.toggleShowDescriptions()\n },\n },\n {\n label: 'Display mode',\n icon: VisibilityIcon,\n subMenu: [\n 'compact',\n 'reducedRepresentation',\n 'normal',\n 'collapse',\n ].map(val => ({\n label: val,\n onClick: () => {\n self.setDisplayMode(val)\n },\n })),\n },\n {\n label: 'Set max height',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetMaxHeightDialog,\n { model: self, handleClose },\n ])\n },\n },\n {\n label: 'Edit filters',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n AddFiltersDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }\n })\n}\n\nexport type FeatureTrackStateModel = ReturnType<typeof stateModelFactory>\nexport type FeatureTrackModel = Instance<FeatureTrackStateModel>\n\nexport default stateModelFactory\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel, isAbstractMenuManager } from '@jbrowse/core/util'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n// icons\nimport LineStyleIcon from '@mui/icons-material/LineStyle'\n\n// locals\nimport {\n BaseLinearDisplay,\n BaseLinearDisplayComponent,\n baseLinearDisplayConfigSchema,\n} from './BaseLinearDisplay'\nimport LinearBareDisplayF from './LinearBareDisplay'\nimport LinearGenomeViewF, {\n SearchBox,\n ZoomControls,\n LinearGenomeView,\n} from './LinearGenomeView'\n\nimport LinearBasicDisplayF from './LinearBasicDisplay'\nimport FeatureTrackF from './FeatureTrack'\nimport BasicTrackF from './BasicTrack'\nimport LaunchLinearGenomeViewF from './LaunchLinearGenomeView'\n\nexport default class LinearGenomeViewPlugin extends Plugin {\n name = 'LinearGenomeViewPlugin'\n\n exports = {\n BaseLinearDisplayComponent,\n BaseLinearDisplay,\n baseLinearDisplayConfigSchema,\n SearchBox,\n ZoomControls,\n LinearGenomeView,\n }\n\n /**\n * #config LinearGenomeViewConfigSchema\n */\n configurationSchema = ConfigurationSchema('LinearGenomeViewConfigSchema', {\n /**\n * #slot configuration.LinearGenomeViewPlugin.trackLabels\n */\n trackLabels: {\n type: 'string',\n defaultValue: 'overlapping',\n model: types.enumeration('trackLabelOptions', [\n 'offset',\n 'overlapping',\n 'hidden',\n ]),\n },\n })\n\n install(pluginManager: PluginManager) {\n FeatureTrackF(pluginManager)\n BasicTrackF(pluginManager)\n LinearBasicDisplayF(pluginManager)\n LinearGenomeViewF(pluginManager)\n LinearBareDisplayF(pluginManager)\n LaunchLinearGenomeViewF(pluginManager)\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToSubMenu(['Add'], {\n label: 'Linear genome view',\n icon: LineStyleIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('LinearGenomeView', {})\n },\n })\n }\n }\n}\n\nexport type {\n ExportSvgDisplayOptions,\n BaseLinearDisplayModel,\n BlockModel,\n} from './BaseLinearDisplay'\n\nexport { configSchemaFactory as linearBareDisplayConfigSchemaFactory } from './LinearBareDisplay'\nexport {\n baseLinearDisplayConfigSchema,\n BaseLinearDisplay,\n BlockMsg,\n BaseLinearDisplayComponent,\n TrackHeightMixin,\n FeatureDensityMixin,\n TooLargeMessage,\n} from './BaseLinearDisplay'\nexport {\n type LinearGenomeViewModel,\n type LinearGenomeViewStateModel,\n RefNameAutocomplete,\n SearchBox,\n} from './LinearGenomeView'\nexport {\n renderToSvg,\n SVGTracks,\n SVGRuler,\n} from './LinearGenomeView/svgcomponents/SVGLinearGenomeView'\nexport { totalHeight } from './LinearGenomeView/svgcomponents/util'\nexport {\n configSchema as linearBasicDisplayConfigSchemaFactory,\n modelFactory as linearBasicDisplayModelFactory,\n} from './LinearBasicDisplay'\n","import {\n createBaseTrackModel,\n TrackType,\n} from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaF from './configSchema'\n\nexport default function FeatureTrackF(pm: PluginManager) {\n pm.addTrackType(() => {\n const configSchema = configSchemaF(pm)\n return new TrackType({\n name: 'FeatureTrack',\n displayName: 'Feature track',\n configSchema,\n stateModel: createBaseTrackModel(pm, 'FeatureTrack', configSchema),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config FeatureTrack\n * #category track\n * used for basic gene and feature tracks, generally used with LinearBasicDisplay\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'FeatureTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n /**\n * #identifier\n */\n explicitIdentifier: 'trackId',\n },\n )\n\nexport default configSchema\n","import {\n createBaseTrackModel,\n TrackType,\n} from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaF from './configSchema'\n\nexport default function BasicTrackF(pm: PluginManager) {\n pm.addTrackType(() => {\n const configSchema = configSchemaF(pm)\n\n return new TrackType({\n name: 'BasicTrack',\n configSchema,\n stateModel: createBaseTrackModel(pm, 'BasicTrack', configSchema),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config BasicTrack\n * #category track\n * synonym for FeatureTrack\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'BasicTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n explicitIdentifier: 'trackId',\n },\n )\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport { BaseLinearDisplayComponent } from '../BaseLinearDisplay'\n\n// locals\nimport configSchema from './configSchema'\nimport modelFactory from './model'\n\nexport default function LinearBasicDisplay(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const config = configSchema(pluginManager)\n return new DisplayType({\n name: 'LinearBasicDisplay',\n displayName: 'Basic feature display',\n configSchema: config,\n stateModel: modelFactory(config),\n trackType: 'FeatureTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n\nexport { default as modelFactory } from './model'\nexport { default as configSchema } from './configSchema'\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ViewType } from '@jbrowse/core/pluggableElementTypes'\nimport { stateModelFactory } from './model'\n\nexport default function LinearGenomeViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'LinearGenomeView',\n displayName: 'Linear genome view',\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/LinearGenomeView')),\n })\n })\n}\n\nexport * from './model'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { DisplayType } from '@jbrowse/core/pluggableElementTypes'\n\n// locals\nimport { configSchemaFactory } from './configSchema'\nimport { stateModelFactory } from './model'\nimport { BaseLinearDisplayComponent } from '../BaseLinearDisplay/'\n\nexport default function LinearBareDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearBareDisplay',\n configSchema,\n displayName: 'Bare feature display',\n stateModel: stateModelFactory(configSchema),\n trackType: 'BasicTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n\nexport { configSchemaFactory } from './configSchema'\nexport { stateModelFactory } from './model'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel, when, parseLocString } from '@jbrowse/core/util'\n// locals\nimport { LinearGenomeViewModel } from '../LinearGenomeView'\nimport { handleSelectedRegion } from '../searchUtils'\n\ntype LGV = LinearGenomeViewModel\n\nexport default function LaunchLinearGenomeViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-LinearGenomeView',\n // @ts-expect-error\n async ({\n session,\n assembly,\n loc,\n tracks = [],\n tracklist,\n nav,\n highlight,\n }: {\n session: AbstractSessionModel\n assembly?: string\n loc: string\n tracks?: string[]\n tracklist?: boolean\n nav?: boolean\n highlight?: string[]\n }) => {\n try {\n const { assemblyManager } = session\n\n const { isValidRefName } = assemblyManager\n\n const view = session.addView('LinearGenomeView', {}) as LGV\n\n await when(() => !!view.volatileWidth)\n\n if (!assembly) {\n throw new Error(\n 'No assembly provided when launching linear genome view',\n )\n }\n\n const asm = await assemblyManager.waitForAssembly(assembly)\n if (!asm) {\n throw new Error(\n `Assembly \"${assembly}\" not found when launching linear genome view`,\n )\n }\n\n if (tracklist) {\n view.activateTrackSelector()\n }\n if (nav !== undefined) {\n view.setHideHeader(!nav)\n }\n if (highlight !== undefined) {\n highlight.forEach(async h => {\n const p = parseLocString(h, refName =>\n isValidRefName(refName, assembly),\n )\n const { start, end } = p\n if (start !== undefined && end !== undefined) {\n view.addToHighlights({\n ...p,\n start,\n end,\n assemblyName: assembly,\n })\n }\n })\n }\n\n await handleSelectedRegion({ input: loc, model: view, assembly: asm })\n\n const idsNotFound = [] as string[]\n tracks.forEach(track => {\n tryTrack(view, track, idsNotFound)\n })\n if (idsNotFound.length) {\n throw new Error(\n `Could not resolve identifiers: ${idsNotFound.join(',')}`,\n )\n }\n } catch (e) {\n session.notifyError(`${e}`, e)\n throw e\n }\n },\n )\n}\n\nfunction tryTrack(\n model: {\n showTrack: (arg: string) => void\n },\n trackId: string,\n idsNotFound: string[],\n) {\n try {\n model.showTrack(trackId)\n } catch (e) {\n if (/Could not resolve identifier/.exec(`${e}`)) {\n idsNotFound.push(trackId)\n } else {\n throw e\n }\n }\n}\n","import { getSession } from '@jbrowse/core/util'\nimport BaseResult from '@jbrowse/core/TextSearch/BaseResults'\nimport { Assembly } from '@jbrowse/core/assemblyManager/assembly'\nimport { SearchType } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { SearchScope } from '@jbrowse/core/TextSearch/TextSearchManager'\nimport { dedupe, TextSearchManager } from '@jbrowse/core/util'\n\n// locals\nimport { LinearGenomeViewModel } from './LinearGenomeView'\n\nexport async function navToOption({\n option,\n model,\n assemblyName,\n}: {\n model: LinearGenomeViewModel\n option: BaseResult\n assemblyName: string\n}) {\n const location = option.getLocation()\n const trackId = option.getTrackId()\n if (location) {\n await model.navToLocString(location, assemblyName)\n if (trackId) {\n model.showTrack(trackId)\n }\n }\n}\n\n// gets a string as input, or use stored option results from previous query,\n// then re-query and\n// 1) if it has multiple results: pop a dialog\n// 2) if it's a single result navigate to it\n// 3) else assume it's a locstring and navigate to it\nexport async function handleSelectedRegion({\n input,\n model,\n assembly,\n}: {\n input: string\n model: LinearGenomeViewModel\n assembly: Assembly\n}) {\n const allRefs = assembly.allRefNamesWithLowerCase || []\n const assemblyName = assembly.name\n if (input.split(' ').every(entry => checkRef(entry, allRefs))) {\n await model.navToLocString(input, assembly.name)\n } else {\n const searchScope = model.searchScope(assemblyName)\n const { textSearchManager } = getSession(model)\n const results = await fetchResults({\n queryString: input,\n searchType: 'exact',\n searchScope,\n rankSearchResults: model.rankSearchResults,\n textSearchManager,\n assembly,\n })\n\n if (results.length > 1) {\n model.setSearchResults(results, input.toLowerCase(), assemblyName)\n } else if (results.length === 1) {\n await navToOption({\n option: results[0]!,\n model,\n assemblyName,\n })\n } else {\n await model.navToLocString(input, assemblyName)\n }\n }\n}\n\nexport function checkRef(str: string, allRefs: string[]) {\n const [ref, rest] = splitLast(str, ':')\n return (\n allRefs.includes(str) ||\n (allRefs.includes(ref) && !Number.isNaN(Number.parseInt(rest, 10)))\n )\n}\n\nexport async function fetchResults({\n queryString,\n searchType,\n searchScope,\n rankSearchResults,\n textSearchManager,\n assembly,\n}: {\n queryString: string\n searchScope: SearchScope\n rankSearchResults: (results: BaseResult[]) => BaseResult[]\n searchType?: SearchType\n textSearchManager?: TextSearchManager\n assembly?: Assembly\n}) {\n if (!textSearchManager) {\n console.warn('No text search manager')\n }\n\n const textSearchResults = await textSearchManager?.search(\n {\n queryString,\n searchType,\n },\n searchScope,\n rankSearchResults,\n )\n\n const refNameResults = assembly?.allRefNames\n ?.filter(ref => ref.toLowerCase().startsWith(queryString.toLowerCase()))\n .slice(0, 10)\n .map(r => new BaseResult({ label: r }))\n\n return dedupe(\n [...(refNameResults || []), ...(textSearchResults || [])],\n elt => elt.getId(),\n )\n}\n\n// splits on the last instance of a character\nexport function splitLast(str: string, split: string): [string, string] {\n const lastIndex = str.lastIndexOf(split)\n if (lastIndex === -1) {\n return [str, '']\n }\n const before = str.slice(0, lastIndex)\n const after = str.slice(lastIndex + 1)\n return [before, after]\n}\n","import VCF, { parseBreakend } from '@gmod/vcf'\n\nconst altTypeToSO: Record<string, string> = {\n DEL: 'deletion',\n INS: 'insertion',\n DUP: 'duplication',\n INV: 'inversion',\n INVDUP: 'inverted_duplication',\n CNV: 'copy_number_variation',\n TRA: 'translocation',\n 'DUP:TANDEM': 'tandem_duplication',\n NON_REF: 'sequence_variant',\n '*': 'sequence_variant',\n}\n\n/**\n * Get a sequence ontology (SO) term that describes the variant type\n */\nexport function getSOTermAndDescription(\n ref: string,\n alt: string[] | undefined,\n parser: VCF,\n): string[] {\n // it's just a remark if there are no alternate alleles\n if (!alt || alt.length === 0) {\n return ['remark', 'no alternative alleles']\n }\n\n const soTerms = new Set<string>()\n let descriptions = new Set<string>()\n alt.forEach(a => {\n let [soTerm, description] = getSOAndDescFromAltDefs(a, parser)\n if (!soTerm) {\n ;[soTerm, description] = getSOAndDescByExamination(ref, a)\n }\n if (soTerm && description) {\n soTerms.add(soTerm)\n descriptions.add(description)\n }\n })\n\n // Combine descriptions like [\"SNV G -> A\", \"SNV G -> T\"] to [\"SNV G -> A,T\"]\n if (descriptions.size > 1) {\n const descs = [...descriptions]\n const prefixes = new Set(\n descs\n .map(desc => {\n const prefix = desc.split('->')\n return prefix[1] ? prefix[0] : desc\n })\n .filter((f): f is string => !!f),\n )\n\n descriptions = new Set(\n [...prefixes]\n .map(r => r.trim())\n .map(prefix => {\n const suffixes = descs\n .map(desc => desc.split('->').map(r => r.trim()))\n .map(pref => (pref[1] && pref[0] === prefix ? pref[1] : ''))\n .filter(f => !!f)\n\n return suffixes.length ? `${prefix} -> ${suffixes.join(',')}` : prefix\n }),\n )\n }\n if (soTerms.size) {\n return [[...soTerms].join(','), [...descriptions].join(',')]\n }\n return []\n}\n\nexport function getSOAndDescFromAltDefs(alt: string, parser: VCF): string[] {\n if (typeof alt === 'string' && !alt.startsWith('<')) {\n return []\n }\n\n // look for a definition with an SO type for this\n let soTerm = altTypeToSO[alt]\n // if no SO term but ALT is in metadata, assume sequence_variant\n if (!soTerm && parser.getMetadata('ALT', alt)) {\n soTerm = 'sequence_variant'\n }\n if (soTerm) {\n return [soTerm, alt]\n }\n\n // try to look for a definition for a parent term if we can\n const modAlt = alt.split(':')\n if (modAlt.length > 1) {\n return getSOAndDescFromAltDefs(`<${modAlt.slice(0, -1).join(':')}>`, parser)\n }\n\n // no parent\n return []\n}\n\n// note: term SNV is used instead of SNP because SO definition of SNP says\n// abundance must be at least 1% in population, and can't be sure we meet\n// that\nexport function getSOAndDescByExamination(ref: string, alt: string) {\n const bnd = parseBreakend(alt)\n if (bnd) {\n return ['breakend', alt]\n }\n if (ref.length === 1 && alt.length === 1) {\n return ['SNV', makeDescriptionString('SNV', ref, alt)]\n }\n if (alt === '<INS>') {\n return ['insertion', alt]\n }\n if (alt === '<DEL>') {\n return ['deletion', alt]\n }\n if (alt === '<DUP>') {\n return ['duplication', alt]\n }\n if (alt === '<CNV>') {\n return ['cnv', alt]\n }\n if (alt === '<INV>') {\n return ['inversion', alt]\n }\n if (alt === '<TRA>') {\n return ['translocation', alt]\n }\n if (alt.includes('<')) {\n return ['sv', alt]\n }\n if (ref.length === alt.length) {\n return ref.split('').reverse().join('') === alt\n ? ['inversion', makeDescriptionString('inversion', ref, alt)]\n : ['substitution', makeDescriptionString('substitution', ref, alt)]\n }\n if (ref.length <= alt.length) {\n const len = alt.length - ref.length\n const lena = len.toLocaleString('en-US')\n return [\n 'insertion',\n len > 5 ? `${lena}bp INS` : makeDescriptionString('insertion', ref, alt),\n ]\n }\n if (ref.length > alt.length) {\n const len = ref.length - alt.length\n const lena = len.toLocaleString('en-US')\n return [\n 'deletion',\n len > 5 ? `${lena}bp DEL` : makeDescriptionString('deletion', ref, alt),\n ]\n }\n\n return ['indel', makeDescriptionString('indel', ref, alt)]\n}\n\nfunction makeDescriptionString(soTerm: string, ref: string, alt: string) {\n return `${soTerm} ${ref} -> ${alt}`\n}\n","import { Feature } from '@jbrowse/core/util'\nimport VCF from '@gmod/vcf'\n\n// locals\nimport { getSOTermAndDescription } from './util'\n\ntype Samples = Record<\n string,\n Record<string, { values: string[] | number[] | null }>\n>\n\ninterface FeatureData {\n [key: string]: unknown\n refName: string\n start: number\n end: number\n description?: string\n type?: string\n name?: string\n aliases?: string[]\n samples?: Samples\n}\n\nexport default class VCFFeature implements Feature {\n private variant: any\n\n private parser: VCF\n\n private data: FeatureData\n\n private _id: string\n\n constructor(args: { variant: any; parser: VCF; id: string }) {\n this.variant = args.variant\n this.parser = args.parser\n this.data = this.dataFromVariant(this.variant)\n this._id = args.id\n }\n\n get(field: string): any {\n return field === 'samples'\n ? this.variant.SAMPLES\n : (this.data[field] ?? this.variant[field])\n }\n\n set() {}\n\n parent() {\n return undefined\n }\n\n children() {\n return undefined\n }\n\n tags() {\n return [...Object.keys(this.data), ...Object.keys(this.variant), 'samples']\n }\n\n id() {\n return this._id\n }\n\n dataFromVariant(variant: {\n REF: string\n POS: number\n ALT?: string[]\n CHROM: string\n INFO: any\n ID?: string[]\n }): FeatureData {\n const { REF, ALT, POS, CHROM, INFO, ID } = variant\n const start = POS - 1\n const [type, description] = getSOTermAndDescription(REF, ALT, this.parser)\n const isTRA = ALT?.includes('<TRA>')\n const isSymbolic = ALT?.some(f => f.includes('<'))\n\n return {\n refName: CHROM,\n start,\n end: isSymbolic && INFO.END && !isTRA ? +INFO.END[0] : start + REF.length,\n description,\n type,\n name: ID?.join(','),\n aliases: ID && ID.length > 1 ? ID.slice(1) : undefined,\n }\n }\n\n toJSON(): any {\n return {\n uniqueId: this._id,\n ...this.variant,\n ...this.data,\n samples: this.variant.SAMPLES,\n }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config VcfAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst VcfAdapter = ConfigurationSchema(\n 'VcfAdapter',\n {\n /**\n * #slot\n */\n vcfLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.vcf', locationType: 'UriLocation' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default VcfAdapter\n","import { types } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config VcfTabixAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst VcfTabixAdapter = ConfigurationSchema(\n 'VcfTabixAdapter',\n {\n /**\n * #slot\n */\n vcfGzLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.vcf.gz', locationType: 'UriLocation' },\n },\n index: ConfigurationSchema('VcfIndex', {\n /**\n * #slot index.indexType\n */\n indexType: {\n model: types.enumeration('IndexType', ['TBI', 'CSI']),\n type: 'stringEnum',\n defaultValue: 'TBI',\n },\n /**\n * #slot index.location\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.vcf.gz.tbi',\n locationType: 'UriLocation',\n },\n },\n }),\n },\n { explicitlyTyped: true },\n)\n\nexport default VcfTabixAdapter\n","import { getConf, ConfigurationReference } from '@jbrowse/core/configuration'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport {\n getContainingTrack,\n getSession,\n getContainingView,\n isSessionModelWithWidgets,\n Feature,\n} from '@jbrowse/core/util'\n\nimport { linearBasicDisplayModelFactory } from '@jbrowse/plugin-linear-genome-view'\nimport { Instance, types } from 'mobx-state-tree'\nimport { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #stateModel LinearVariantDisplay\n * similar to basic display, but provides custom widget on feature click\n * extends\n *\n * - [LinearBasicDisplay](../linearbasicdisplay)\n */\nexport default function stateModelFactory(\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'LinearVariantDisplay',\n linearBasicDisplayModelFactory(configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearVariantDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n\n .actions(self => ({\n /**\n * #action\n */\n async selectFeature(feature: Feature) {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const { rpcManager } = session\n const sessionId = getRpcSessionId(self)\n const track = getContainingTrack(self)\n const view = getContainingView(self)\n const adapterConfig = getConf(track, 'adapter')\n const descriptions = await rpcManager.call(\n sessionId,\n 'CoreGetMetadata',\n {\n adapterConfig,\n },\n )\n session.showWidget(\n session.addWidget('VariantFeatureWidget', 'variantFeature', {\n featureData: feature.toJSON(),\n view,\n track,\n descriptions,\n }),\n )\n }\n\n session.setSelection(feature)\n },\n }))\n}\n\nexport type LinearVariantDisplayStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearVariantDisplayModel = Instance<LinearVariantDisplayStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n/**\n * #config StructuralVariantChordRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'StructuralVariantChordRenderer',\n {\n /**\n * #slot\n */\n strokeColor: {\n type: 'color',\n description: 'the line color of each arc',\n defaultValue: 'rgba(255,133,0,0.32)',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n strokeColorSelected: {\n type: 'color',\n description: 'the line color of an arc that has been selected',\n defaultValue: 'black',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n strokeColorHover: {\n type: 'color',\n description:\n 'the line color of an arc that is being hovered over with the mouse',\n defaultValue: '#555',\n contextVariable: ['feature'],\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default configSchema\n","import React, { useState } from 'react'\nimport { observer } from 'mobx-react'\nimport { polarToCartesian, Feature, getStrokeProps } from '@jbrowse/core/util'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { parseBreakend } from '@gmod/vcf'\n\nexport interface Region {\n end: number\n start: number\n refName: string\n elided?: false\n}\n\nexport interface ElidedRegion {\n elided: true\n regions: Region[]\n}\n\nexport type AnyRegion = Region | ElidedRegion\n\nexport interface Block {\n flipped: boolean\n bpPerRadian: number\n startRadians: number\n region: AnyRegion\n}\n\nfunction bpToRadians(block: Block, pos: number) {\n const blockStart = block.region.elided ? 0 : block.region.start\n const blockEnd = block.region.elided ? 0 : block.region.end\n const bpOffset = block.flipped ? blockEnd - pos : pos - blockStart\n return bpOffset / block.bpPerRadian + block.startRadians\n}\n\nconst Chord = observer(function Chord({\n feature,\n blocksForRefs,\n radius,\n config,\n bezierRadius,\n selected,\n onClick,\n}: {\n feature: Feature\n blocksForRefs: Record<string, Block>\n radius: number\n config: AnyConfigurationModel\n bezierRadius: number\n selected: boolean\n onClick: (feat: Feature, reg: AnyRegion, end: AnyRegion, evt: unknown) => void\n}) {\n const [hovered, setHovered] = useState(false)\n // find the blocks that our start and end points belong to\n const startBlock = blocksForRefs[feature.get('refName')]\n if (!startBlock) {\n return null\n }\n let svType: string | undefined\n if (feature.get('INFO')) {\n ;[svType] = feature.get('INFO').SVTYPE || []\n } else if (feature.get('mate')) {\n svType = 'mate'\n }\n let endPosition: number\n let endBlock: Block | undefined\n const alt = feature.get('ALT')?.[0]\n const bnd = alt && parseBreakend(alt)\n const startPos = feature.get('start')\n if (bnd) {\n // VCF BND\n const matePosition = bnd.MatePosition.split(':')\n endPosition = +matePosition[1]\n endBlock = blocksForRefs[matePosition[0]]\n } else if (alt === '<TRA>') {\n // VCF TRA\n const chr2 = feature.get('INFO')?.CHR2?.[0]\n const end = feature.get('INFO')?.END?.[0]\n endPosition = Number.parseInt(end, 10)\n endBlock = blocksForRefs[chr2]\n } else if (svType === 'mate') {\n // generic simplefeatures arcs\n const mate = feature.get('mate')\n const chr2 = mate.refName\n endPosition = mate.start\n endBlock = blocksForRefs[chr2]\n } else {\n console.warn('unknown sv type', svType)\n endPosition = startPos + 1\n }\n\n if (endBlock) {\n const startRadians = bpToRadians(startBlock, startPos)\n const endRadians = bpToRadians(endBlock, endPosition)\n const startXY = polarToCartesian(radius, startRadians)\n const endXY = polarToCartesian(radius, endRadians)\n const controlXY = polarToCartesian(\n bezierRadius,\n (endRadians + startRadians) / 2,\n )\n\n const strokeColor = selected\n ? readConfObject(config, 'strokeColorSelected', { feature })\n : readConfObject(config, 'strokeColor', { feature })\n\n const hoverStrokeColor = readConfObject(config, 'strokeColorHover', {\n feature,\n })\n return (\n <path\n data-testid={`chord-${feature.id()}`}\n cursor=\"crosshair\"\n fill=\"none\"\n d={['M', ...startXY, 'Q', ...controlXY, ...endXY].join(' ')}\n {...getStrokeProps(hovered ? hoverStrokeColor : strokeColor)}\n strokeWidth={hovered ? 3 : 1}\n onClick={evt => {\n onClick(feature, startBlock.region, endBlock.region, evt)\n }}\n onMouseOver={() => {\n if (!selected) {\n setHovered(true)\n }\n }}\n onMouseOut={() => {\n if (!selected) {\n setHovered(false)\n }\n }}\n />\n )\n }\n\n return null\n})\n\nexport default Chord\n","import React, { useMemo } from 'react'\nimport { observer } from 'mobx-react'\nimport { Feature } from '@jbrowse/core/util'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\n// locals\nimport Chord, { Block, AnyRegion } from './Chord'\n\nconst StructuralVariantChordsReactComponent = observer(function ({\n features,\n config,\n blockDefinitions,\n radius,\n bezierRadius,\n displayModel,\n onChordClick,\n}: {\n features: Map<string, Feature>\n radius: number\n config: AnyConfigurationModel\n displayModel?: {\n id: string\n selectedFeatureId: string\n }\n blockDefinitions: Block[]\n bezierRadius: number\n onChordClick: (\n feature: Feature,\n reg: AnyRegion,\n endBlock: AnyRegion,\n evt: unknown,\n ) => void\n}) {\n const { selectedFeatureId } = displayModel || {}\n const blocksForRefsMemo = useMemo(() => {\n const blocksForRefs = {} as Record<string, Block>\n for (const block of blockDefinitions) {\n const regions = block.region.elided\n ? block.region.regions\n : [block.region]\n for (const region of regions) {\n blocksForRefs[region.refName] = block\n }\n }\n return blocksForRefs\n }, [blockDefinitions])\n\n return (\n <g data-testid=\"structuralVariantChordRenderer\">\n {[...features.values()].map(feature => {\n const id = feature.id()\n const selected = String(selectedFeatureId) === String(id)\n return (\n <Chord\n key={id}\n feature={feature}\n config={config}\n radius={radius}\n bezierRadius={bezierRadius}\n blocksForRefs={blocksForRefsMemo}\n selected={selected}\n onClick={onChordClick}\n />\n )\n })}\n </g>\n )\n})\n\nexport default StructuralVariantChordsReactComponent\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { Instance, types } from 'mobx-state-tree'\nimport { stateModelFactory as baseModelFactory } from '@jbrowse/core/BaseFeatureWidget'\n\nexport function stateModelFactory(pluginManager: PluginManager) {\n const baseModel = baseModelFactory(pluginManager)\n return types.compose(\n baseModel,\n types.model('VariantFeatureWidget', {\n type: types.literal('VariantFeatureWidget'),\n descriptions: types.frozen(),\n }),\n )\n}\n\nexport type VariantFeatureWidgetStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type VariantFeatureWidgetModel = Instance<VariantFeatureWidgetStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nexport const configSchema = ConfigurationSchema('VariantFeatureWidget', {})\n","import VcfAdapterF from './VcfAdapter'\nimport VcfTabixAdapterF from './VcfTabixAdapter'\nimport ExtensionPointsF from './extensionPoints'\nimport VariantTrackF from './VariantTrack'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport ChordVariantDisplayF from './ChordVariantDisplay'\nimport LinearVariantDisplayF from './LinearVariantDisplay'\nimport StructuralVariantChordRendererF from './StructuralVariantChordRenderer'\nimport VariantFeatureWidgetF from './VariantFeatureWidget'\n\nexport default class VariantsPlugin extends Plugin {\n name = 'VariantsPlugin'\n\n install(pluginManager: PluginManager) {\n VcfAdapterF(pluginManager)\n VcfTabixAdapterF(pluginManager)\n VariantFeatureWidgetF(pluginManager)\n VariantTrackF(pluginManager)\n ExtensionPointsF(pluginManager)\n LinearVariantDisplayF(pluginManager)\n StructuralVariantChordRendererF(pluginManager)\n ChordVariantDisplayF(pluginManager)\n }\n}\n\nexport { default as VcfFeature } from './VcfFeature'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport configSchemaF from './configSchema'\n\nexport default function VariantTrackF(pm: PluginManager) {\n pm.addTrackType(() => {\n const configSchema = configSchemaF(pm)\n return new TrackType({\n name: 'VariantTrack',\n displayName: 'Variant track',\n configSchema,\n stateModel: createBaseTrackModel(pm, 'VariantTrack', configSchema),\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function VcfAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'VcfAdapter',\n displayName: 'VCF adapter',\n configSchema,\n getAdapterClass: () => import('./VcfAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport { default as configSchema } from './configSchema'\n\nexport default function VcfTabixAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'VcfTabixAdapter',\n displayName: 'VCF tabix adapter',\n configSchema,\n getAdapterClass: () => import('./VcfTabixAdapter').then(r => r.default),\n }),\n )\n}\n","import { lazy } from 'react'\nimport WidgetType from '@jbrowse/core/pluggableElementTypes/WidgetType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { stateModelFactory } from './stateModelFactory'\nimport { configSchema } from './configSchema'\n\nexport default function VariantFeatureWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(\n () =>\n new WidgetType({\n name: 'VariantFeatureWidget',\n heading: 'Feature details',\n configSchema: configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./VariantFeatureWidget')),\n }),\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config VariantTrack\n * Mostly similar to feature track, but has `ChordDisplayType` registered to it,\n * and custom feature details in `LinearVariantDisplay`\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'VariantTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n makeIndex,\n makeIndexType,\n getFileName,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default function ExtensionPointsF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.vcf\\.b?gz$/i\n const adapterName = 'VcfTabixAdapter'\n const fileName = getFileName(file)\n const indexName = index && getFileName(index)\n const obj = {\n type: adapterName,\n vcfGzLocation: file,\n index: {\n location: index || makeIndex(file, '.tbi'),\n indexType: makeIndexType(indexName, 'CSI', 'TBI'),\n },\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'VcfTabixAdapter' || adapterName === 'VcfAdapter') {\n return 'VariantTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.vcf$/i\n const adapterName = 'VcfAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n vcfLocation: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport stateModelFactory from './model'\nimport configSchemaF from './configSchema'\n\nexport default function LinearVariantDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new DisplayType({\n name: 'LinearVariantDisplay',\n displayName: 'Variant display',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'VariantTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { linearBasicDisplayConfigSchemaFactory } from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #config LinearVariantDisplay\n * mostly empty, this display type is very much\n * like a `FeatureTrack` with a `LinearBasicDisplay` except it has a custom\n * feature details widget\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default function configSchemaF(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearVariantDisplay',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: linearBasicDisplayConfigSchemaFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport type LinearVariantDisplayConfigModel = ReturnType<typeof configSchemaF>\nexport type LinearVariantDisplayConfig =\n Instance<LinearVariantDisplayConfigModel>\n","import ChordRendererType from '@jbrowse/core/pluggableElementTypes/renderers/CircularChordRendererType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\nimport ReactComponent from './ReactComponent'\n\nexport default function StructuralVariantChordRendererF(\n pluginManager: PluginManager,\n) {\n pluginManager.addRendererType(\n () =>\n new ChordRendererType({\n name: 'StructuralVariantChordRenderer',\n displayName: 'SV chord renderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseChordDisplayComponent } from '@jbrowse/plugin-circular-view'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\n// locals\nimport configSchemaF from './models/configSchema'\nimport stateModelF from './models/stateModelFactory'\n\nexport default function ChordVariantDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n const stateModel = stateModelF(configSchema)\n return new DisplayType({\n name: 'ChordVariantDisplay',\n displayName: 'Chord variant display',\n configSchema,\n stateModel,\n trackType: 'VariantTrack',\n viewType: 'CircularView',\n ReactComponent: BaseChordDisplayComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { baseChordDisplayConfig } from '@jbrowse/plugin-circular-view'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config ChordVariantDisplay\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nfunction stateModelFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'ChordVariantDisplay',\n {\n /**\n * #slot\n */\n renderer: types.optional(\n pluginManager.pluggableConfigSchemaType('renderer'),\n { type: 'StructuralVariantChordRenderer' },\n ),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseChordDisplayConfig,\n explicitlyTyped: true,\n },\n )\n}\n\nexport default stateModelFactory\n","import {\n BaseChordDisplayModel,\n CircularViewModel,\n} from '@jbrowse/plugin-circular-view'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n} from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport { Feature, getContainingView } from '@jbrowse/core/util'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\n\n/**\n * #stateModel ChordVariantDisplay\n * extends\n * - [BaseChordDisplay](../basechorddisplay)\n */\nconst stateModelFactory = (configSchema: AnyConfigurationSchemaType) => {\n return types\n .compose(\n 'ChordVariantDisplay',\n BaseChordDisplayModel,\n types.model({\n /**\n * #property\n */\n type: types.literal('ChordVariantDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n .views(self => ({\n /**\n * #getter\n */\n get rendererTypeName() {\n return self.configuration.renderer.type\n },\n\n /**\n * #method\n */\n renderProps(): Record<string, unknown> {\n const view = getContainingView(self) as CircularViewModel\n return {\n ...getParentRenderProps(self),\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n bezierRadius: view.radiusPx * self.bezierRadiusRatio,\n radius: view.radiusPx,\n blockDefinitions: self.blockDefinitions,\n config: self.configuration.renderer,\n onChordClick: (arg: Feature) => {\n self.onChordClick(arg)\n },\n }\n },\n }))\n}\n\n// http://localhost:3000/test_data/hs37d5.HG002-SequelII-CCS.sv.vcf.gz.tbi\n\n// render request is for 1.5x the current viewing window\n\n// tracks all have a height\n//\nexport default stateModelFactory\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { Feature } from '@jbrowse/core/util'\n\n// locals\nimport Tooltip, { TooltipContentsComponent } from '../../Tooltip'\nimport { toP } from '../../util'\n\nconst en = (n: number) => n.toLocaleString('en-US')\n\ninterface Props {\n feature: Feature\n}\n\nconst TooltipContents = React.forwardRef<HTMLDivElement, Props>(\n function TooltipContents2({ feature }, ref) {\n const start = feature.get('start')\n const end = feature.get('end')\n const refName = feature.get('refName')\n const name = feature.get('name')\n const loc = [\n refName,\n name,\n start === end ? en(start) : `${en(start)}..${en(end)}`,\n ]\n .filter(f => !!f)\n .join(':')\n\n return feature.get('summary') !== undefined ? (\n <div ref={ref}>\n {loc}\n <br />\n Max: {toP(feature.get('maxScore'))}\n <br />\n Avg: {toP(feature.get('score'))}\n <br />\n Min: {toP(feature.get('minScore'))}\n </div>\n ) : (\n <div ref={ref}>\n {loc}\n <br />\n {`${toP(feature.get('score'))}`}\n </div>\n )\n },\n)\n\ntype Coord = [number, number]\n\nconst WiggleTooltip = observer(function (props: {\n model: {\n featureUnderMouse?: Feature\n }\n height: number\n offsetMouseCoord: Coord\n clientMouseCoord: Coord\n clientRect?: DOMRect\n TooltipContents?: TooltipContentsComponent\n}) {\n return <Tooltip TooltipContents={TooltipContents} {...props} />\n})\nexport default WiggleTooltip\n\nexport { default as Tooltip } from '../../Tooltip'\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport {\n measureText,\n getContainingView,\n getContainingTrack,\n} from '@jbrowse/core/util'\nimport { getConf } from '@jbrowse/core/configuration'\nimport {\n BaseLinearDisplayComponent,\n LinearGenomeViewModel,\n} from '@jbrowse/plugin-linear-genome-view'\n\n// locals\nimport { WiggleDisplayModel } from '../models/model'\nimport YScaleBar from '../../shared/YScaleBar'\n\ntype LGV = LinearGenomeViewModel\n\nconst LinearWiggleDisplay = observer((props: { model: WiggleDisplayModel }) => {\n const { model } = props\n const { stats, height, needsScalebar } = model\n\n const { trackLabels } = getContainingView(model) as LGV\n const track = getContainingTrack(model)\n const left =\n trackLabels === 'overlapping'\n ? measureText(getConf(track, 'name'), 12.8) + 100\n : 50\n return (\n <div>\n <BaseLinearDisplayComponent {...props} />\n {stats && needsScalebar ? (\n <svg\n style={{\n position: 'absolute',\n top: 0,\n left,\n pointerEvents: 'none',\n height,\n width: 50,\n }}\n >\n <YScaleBar model={model} />\n </svg>\n ) : null}\n </div>\n )\n})\n\nexport default LinearWiggleDisplay\n","import React, { Suspense } from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { Feature } from '@jbrowse/core/util'\nimport BaseTooltip from '@jbrowse/core/ui/BaseTooltip'\n// locals\nimport { YSCALEBAR_LABEL_OFFSET } from './util'\n\nconst useStyles = makeStyles()({\n hoverVertical: {\n background: '#333',\n border: 'none',\n width: 1,\n height: '100%',\n top: YSCALEBAR_LABEL_OFFSET,\n cursor: 'default',\n position: 'absolute',\n pointerEvents: 'none',\n },\n})\n\ntype Coord = [number, number]\n\n// React.forwardRef component for the tooltip, the ref is used for measuring\n// the size of the tooltip\nexport type TooltipContentsComponent = React.ForwardRefExoticComponent<\n { feature: Feature; model: any } & React.RefAttributes<HTMLDivElement>\n>\n\nconst Tooltip = observer(function Tooltip({\n model,\n height,\n clientMouseCoord,\n offsetMouseCoord,\n clientRect,\n TooltipContents,\n useClientY,\n}: {\n model: { featureUnderMouse?: Feature }\n useClientY?: boolean\n height: number\n clientMouseCoord: Coord\n offsetMouseCoord: Coord\n clientRect?: DOMRect\n TooltipContents: TooltipContentsComponent\n}) {\n const { featureUnderMouse } = model\n const { classes } = useStyles()\n\n const x = clientMouseCoord[0] + 5\n const y = useClientY ? clientMouseCoord[1] : clientRect?.top || 0\n return featureUnderMouse ? (\n <>\n <Suspense fallback={null}>\n <BaseTooltip clientPoint={{ x, y }}>\n <TooltipContents model={model} feature={featureUnderMouse} />\n </BaseTooltip>\n </Suspense>\n\n <div\n className={classes.hoverVertical}\n style={{\n left: offsetMouseCoord[0],\n height: height - YSCALEBAR_LABEL_OFFSET * 2,\n }}\n />\n </>\n ) : null\n})\n\nexport default Tooltip\n","import FeatureRendererType, {\n RenderArgs as FeatureRenderArgs,\n RenderArgsDeserialized as FeatureRenderArgsDeserialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'\nimport { renderToAbstractCanvas, Feature } from '@jbrowse/core/util'\nimport { ThemeOptions } from '@mui/material'\n\n// locals\nimport { ScaleOpts, Source } from './util'\n\nexport interface RenderArgs extends FeatureRenderArgs {\n scaleOpts: ScaleOpts\n}\n\nexport interface RenderArgsDeserialized extends FeatureRenderArgsDeserialized {\n bpPerPx: number\n height: number\n highResolutionScaling: number\n scaleOpts: ScaleOpts\n displayCrossHatches: boolean\n ticks: { values: number[] }\n themeOptions: ThemeOptions\n}\n\nexport interface RenderArgsDeserializedWithFeatures\n extends RenderArgsDeserialized {\n features: Map<string, Feature>\n}\n\nexport interface MultiRenderArgsDeserialized\n extends RenderArgsDeserializedWithFeatures {\n sources: Source[]\n}\n\nexport default abstract class WiggleBaseRenderer extends FeatureRendererType {\n supportsSVG = true\n\n async render(renderProps: RenderArgsDeserialized) {\n const features = await this.getFeatures(renderProps)\n const { height, regions, bpPerPx } = renderProps\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n\n // @ts-expect-error\n const { reducedFeatures, ...rest } = await renderToAbstractCanvas(\n width,\n height,\n renderProps,\n ctx =>\n this.draw(ctx, {\n ...renderProps,\n features,\n }),\n )\n\n const results = await super.render({\n ...renderProps,\n ...rest,\n features,\n height,\n width,\n })\n\n return {\n ...results,\n ...rest,\n features: reducedFeatures\n ? new Map<string, Feature>(\n reducedFeatures.map((r: Feature) => [r.id(), r]),\n )\n : results.features,\n height,\n width,\n containsNoTransferables: true,\n }\n }\n\n /**\n * draw features to context given props, to be used by derived renderer\n * classes\n */\n abstract draw<T extends RenderArgsDeserializedWithFeatures>(\n ctx: CanvasRenderingContext2D,\n\n props: T,\n ): Promise<Record<string, unknown> | undefined>\n}\n\nexport {\n type RenderArgsSerialized,\n type RenderResults,\n type ResultsDeserialized,\n type ResultsSerialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BigWigAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BigWigAdapter = ConfigurationSchema(\n 'BigWigAdapter',\n {\n /**\n * #slot\n */\n bigWigLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bw',\n locationType: 'UriLocation',\n },\n },\n\n /**\n * #slot\n */\n source: {\n type: 'string',\n defaultValue: '',\n description: 'Used for multiwiggle',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default BigWigAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes/models'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config QuantitativeTrack\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nfunction configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'QuantitativeTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n}\n\nexport default configSchemaFactory\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config MultiWiggleAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst MultiWiggleAdapter = ConfigurationSchema(\n 'MultiWiggleAdapter',\n {\n /**\n * #slot\n */\n subadapters: {\n type: 'frozen',\n defaultValue: [],\n description: 'array of subadapter JSON objects',\n },\n /**\n * #slot\n */\n bigWigs: {\n type: 'frozen',\n description:\n 'array of bigwig filenames, alternative to the subadapters slot',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default MultiWiggleAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config WiggleRenderer\n * this is the \"base wiggle renderer config schema\"\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst WiggleRenderer = ConfigurationSchema(\n 'WiggleRenderer',\n {\n /**\n * #slot\n */\n color: {\n type: 'color',\n description: 'the color of track, overrides posColor and negColor',\n defaultValue: '#f0f',\n },\n /**\n * #slot\n */\n posColor: {\n type: 'color',\n description: 'the color to use when the score is positive',\n defaultValue: 'blue',\n },\n /**\n * #slot\n */\n negColor: {\n type: 'color',\n description: 'the color to use when the score is negative',\n defaultValue: 'red',\n },\n /**\n * #slot\n */\n clipColor: {\n type: 'color',\n description: 'the color of the clipping marker',\n defaultValue: 'red',\n },\n /**\n * #slot\n */\n bicolorPivot: {\n type: 'stringEnum',\n model: types.enumeration('Scale type', [\n 'numeric',\n 'mean',\n 'z_score',\n 'none',\n ]),\n description: 'type of bicolor pivot',\n defaultValue: 'numeric',\n },\n /**\n * #slot\n */\n bicolorPivotValue: {\n type: 'number',\n defaultValue: 0,\n description: 'value to use for bicolor pivot',\n },\n },\n { explicitlyTyped: true },\n)\nexport default WiggleRenderer\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config DensityRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'DensityRenderer',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { featureSpanPx, Feature, Region } from '@jbrowse/core/util'\n\n// locals\nimport { fillRectCtx, getScale, ScaleOpts } from './util'\n\nconst fudgeFactor = 0.3\nconst clipHeight = 2\n\nexport function drawDensity(\n ctx: CanvasRenderingContext2D,\n props: {\n features: Map<string, Feature> | Feature[]\n regions: Region[]\n bpPerPx: number\n scaleOpts: ScaleOpts\n height: number\n ticks: { values: number[] }\n displayCrossHatches: boolean\n config: AnyConfigurationModel\n },\n) {\n const { features, regions, bpPerPx, scaleOpts, height, config } = props\n const region = regions[0]!\n const pivot = readConfObject(config, 'bicolorPivot')\n const pivotValue = readConfObject(config, 'bicolorPivotValue')\n const negColor = readConfObject(config, 'negColor')\n const posColor = readConfObject(config, 'posColor')\n const color = readConfObject(config, 'color')\n const clipColor = readConfObject(config, 'clipColor')\n const crossing = pivot !== 'none' && scaleOpts.scaleType !== 'log'\n const scale = getScale({\n ...scaleOpts,\n pivotValue: crossing ? pivotValue : undefined,\n range: crossing ? [negColor, 'white', posColor] : ['white', posColor],\n })\n\n const scale2 = getScale({ ...scaleOpts, range: [0, height] })\n const cb =\n color === '#f0f'\n ? (_: Feature, score: number) => scale(score)\n : (feature: Feature, score: number) =>\n readConfObject(config, 'color', { feature, score })\n const domain = scale2.domain()\n const niceMin = domain[0]!\n const niceMax = domain[1]!\n\n let prevLeftPx = Number.NEGATIVE_INFINITY\n let hasClipping = false\n const reducedFeatures = []\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n\n // create reduced features, avoiding multiple features per px\n if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {\n reducedFeatures.push(feature)\n prevLeftPx = leftPx\n }\n const score = feature.get('score')\n hasClipping = hasClipping || score > niceMax || score < niceMin\n const w = rightPx - leftPx + fudgeFactor\n ctx.fillStyle = cb(feature, score)\n ctx.fillRect(leftPx, 0, w, height)\n }\n\n // second pass: draw clipping\n // avoid persisting the red fillstyle with save/restore\n ctx.save()\n if (hasClipping) {\n ctx.fillStyle = clipColor\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n const w = rightPx - leftPx + fudgeFactor\n const score = feature.get('score')\n if (score > niceMax) {\n fillRectCtx(leftPx, 0, w, clipHeight, ctx)\n } else if (score < niceMin && scaleOpts.scaleType !== 'log') {\n fillRectCtx(leftPx, 0, w, clipHeight, ctx)\n }\n }\n }\n ctx.restore()\n\n return { reducedFeatures }\n}\n","import { drawDensity } from '../drawDensity'\n\nimport WiggleBaseRenderer, {\n RenderArgsDeserializedWithFeatures,\n} from '../WiggleBaseRenderer'\n\nexport default class DensityRenderer extends WiggleBaseRenderer {\n async draw(\n ctx: CanvasRenderingContext2D,\n props: RenderArgsDeserializedWithFeatures,\n ) {\n return drawDensity(ctx, props)\n }\n}\n","import { observer } from 'mobx-react'\nimport React, { useRef } from 'react'\n\nimport { Region } from '@jbrowse/core/util/types'\nimport { Feature } from '@jbrowse/core/util'\nimport { PrerenderedCanvas } from '@jbrowse/core/ui'\n\nconst WiggleRendering = observer(function (props: {\n regions: Region[]\n features: Map<string, Feature>\n bpPerPx: number\n width: number\n height: number\n blockKey: string\n onMouseLeave?: (event: React.MouseEvent) => void\n onMouseMove?: (event: React.MouseEvent, arg?: string) => void\n onFeatureClick?: (event: React.MouseEvent, arg?: string) => void\n}) {\n const {\n regions,\n features,\n bpPerPx,\n width,\n height,\n onMouseLeave,\n onMouseMove,\n onFeatureClick,\n } = props\n const region = regions[0]!\n const ref = useRef<HTMLDivElement>(null)\n\n function getFeatureUnderMouse(eventClientX: number) {\n // calculates feature under mouse\n let offset = 0\n if (ref.current) {\n offset = ref.current.getBoundingClientRect().left\n }\n const offsetX = eventClientX - offset\n const px = region.reversed ? width - offsetX : offsetX\n const clientBp = region.start + bpPerPx * px\n let featureUnderMouse: Feature | undefined\n for (const feature of features.values()) {\n // bpPerPx added to the end to accommodate \"reduced features\" (one feature per px)\n if (\n clientBp <= feature.get('end') + bpPerPx &&\n clientBp >= feature.get('start')\n ) {\n featureUnderMouse = feature\n break\n }\n }\n return featureUnderMouse\n }\n return (\n <div\n ref={ref}\n data-testid=\"wiggle-rendering-test\"\n onMouseMove={e => onMouseMove?.(e, getFeatureUnderMouse(e.clientX)?.id())}\n onClick={e => onFeatureClick?.(e, getFeatureUnderMouse(e.clientX)?.id())}\n onMouseLeave={e => onMouseLeave?.(e)}\n style={{\n overflow: 'visible',\n position: 'relative',\n height,\n }}\n >\n <PrerenderedCanvas {...props} />\n </div>\n )\n})\n\nexport default WiggleRendering\n","import {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { colord, Colord } from '@jbrowse/core/util/colord'\n// required to import this for typescript purposes\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport mix from 'colord/plugins/mix'\n\nimport { clamp, featureSpanPx, Feature, Region } from '@jbrowse/core/util'\n\n// locals\nimport { fillRectCtx, getOrigin, getScale, ScaleOpts } from './util'\n\nfunction lighten(color: Colord, amount: number) {\n const hslColor = color.toHsl()\n const l = hslColor.l * (1 + amount)\n return colord({ ...hslColor, l: clamp(l, 0, 100) })\n}\n\nfunction darken(color: Colord, amount: number) {\n const hslColor = color.toHsl()\n const l = hslColor.l * (1 - amount)\n return colord({ ...hslColor, l: clamp(l, 0, 100) })\n}\n\nconst fudgeFactor = 0.3\nconst clipHeight = 2\n\nexport function drawXY(\n ctx: CanvasRenderingContext2D,\n props: {\n features: Map<string, Feature> | Feature[]\n bpPerPx: number\n regions: Region[]\n scaleOpts: ScaleOpts\n height: number\n ticks: { values: number[] }\n config: AnyConfigurationModel\n displayCrossHatches: boolean\n offset?: number\n colorCallback: (f: Feature, score: number) => string\n },\n) {\n const {\n features,\n bpPerPx,\n regions,\n scaleOpts,\n height: unadjustedHeight,\n config,\n ticks,\n displayCrossHatches,\n offset = 0,\n colorCallback,\n } = props\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n\n // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the\n // wiggle display, and makes the height of the actual drawn area add\n // \"padding\" to the top and bottom of the display\n const height = unadjustedHeight - offset * 2\n\n const filled = readConfObject(config, 'filled')\n const clipColor = readConfObject(config, 'clipColor')\n const summaryScoreMode = readConfObject(config, 'summaryScoreMode')\n const pivotValue = readConfObject(config, 'bicolorPivotValue')\n const minSize = readConfObject(config, 'minSize')\n\n const scale = getScale({ ...scaleOpts, range: [0, height] })\n const originY = getOrigin(scaleOpts.scaleType)\n const domain = scale.domain()\n const niceMin = domain[0]!\n const niceMax = domain[1]!\n\n const toY = (n: number) => clamp(height - (scale(n) || 0), 0, height) + offset\n const toOrigin = (n: number) => toY(originY) - toY(n)\n const getHeight = (n: number) => (filled ? toOrigin(n) : Math.max(minSize, 1))\n let hasClipping = false\n\n let prevLeftPx = Number.NEGATIVE_INFINITY\n const reducedFeatures = []\n const crossingOrigin = niceMin < pivotValue && niceMax > pivotValue\n\n // we handle whiskers separately to render max row, min row, and avg in three\n // passes. this reduces subpixel rendering issues. note: for stylistic\n // reasons, clipping indicator is only drawn for score, not min/max score\n if (summaryScoreMode === 'whiskers') {\n let lastCol: string | undefined\n let lastMix: string | undefined\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n if (feature.get('summary')) {\n const w = Math.max(rightPx - leftPx + fudgeFactor, minSize)\n const max = feature.get('maxScore')\n const c = colorCallback(feature, max)\n const effectiveC = crossingOrigin\n ? c\n : c === lastCol\n ? lastMix\n : (lastMix = lighten(colord(c), 0.4).toHex())\n fillRectCtx(leftPx, toY(max), w, getHeight(max), ctx, effectiveC)\n lastCol = c\n }\n }\n lastMix = undefined\n lastCol = undefined\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n const score = feature.get('score')\n const max = feature.get('maxScore')\n const min = feature.get('minScore')\n const summary = feature.get('summary')\n const c = colorCallback(feature, score)\n const effectiveC =\n crossingOrigin && summary\n ? c === lastCol\n ? lastMix\n : (lastMix = colord(colorCallback(feature, max))\n .mix(colord(colorCallback(feature, min)))\n .toString())\n : c\n const w = Math.max(rightPx - leftPx + fudgeFactor, minSize)\n // create reduced features, avoiding multiple features per px\n if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {\n reducedFeatures.push(feature)\n prevLeftPx = leftPx\n }\n hasClipping = hasClipping || score < niceMin || score > niceMax\n fillRectCtx(leftPx, toY(score), w, getHeight(score), ctx, effectiveC)\n lastCol = c\n }\n lastMix = undefined\n lastCol = undefined\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n\n if (feature.get('summary')) {\n const min = feature.get('minScore')\n const c = colorCallback(feature, min)\n const w = Math.max(rightPx - leftPx + fudgeFactor, minSize)\n const effectiveC = crossingOrigin\n ? c\n : c === lastCol\n ? lastMix\n : (lastMix = darken(colord(c), 0.4).toHex())\n\n fillRectCtx(leftPx, toY(min), w, getHeight(min), ctx, effectiveC)\n lastCol = c\n }\n }\n } else {\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n\n // create reduced features, avoiding multiple features per px\n if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {\n reducedFeatures.push(feature)\n prevLeftPx = leftPx\n }\n\n const score = feature.get('score')\n const c = colorCallback(feature, score)\n\n hasClipping = hasClipping || score < niceMin || score > niceMax\n const w = Math.max(rightPx - leftPx + fudgeFactor, minSize)\n\n if (summaryScoreMode === 'max') {\n const s = feature.get('summary') ? feature.get('maxScore') : score\n fillRectCtx(leftPx, toY(s), w, getHeight(s), ctx, c)\n } else if (summaryScoreMode === 'min') {\n const s = feature.get('summary') ? feature.get('minScore') : score\n fillRectCtx(leftPx, toY(s), w, getHeight(s), ctx, c)\n } else {\n fillRectCtx(leftPx, toY(score), w, getHeight(score), ctx, c)\n }\n }\n }\n\n // second pass: draw clipping\n // avoid persisting the red fillstyle with save/restore\n ctx.save()\n if (hasClipping) {\n ctx.fillStyle = clipColor\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n const w = rightPx - leftPx + fudgeFactor\n const score = feature.get('score')\n if (score > niceMax) {\n fillRectCtx(leftPx, offset, w, clipHeight, ctx)\n } else if (score < niceMin && scaleOpts.scaleType !== 'log') {\n fillRectCtx(leftPx, unadjustedHeight, w, clipHeight, ctx)\n }\n }\n }\n ctx.restore()\n\n if (displayCrossHatches) {\n ctx.lineWidth = 1\n ctx.strokeStyle = 'rgba(200,200,200,0.5)'\n ticks.values.forEach(tick => {\n ctx.beginPath()\n ctx.moveTo(0, Math.round(toY(tick)))\n ctx.lineTo(width, Math.round(toY(tick)))\n ctx.stroke()\n })\n }\n\n return { reducedFeatures }\n}\n","import { readConfObject } from '@jbrowse/core/configuration'\nimport { Feature } from '@jbrowse/core/util'\nimport { drawXY } from '../drawXY'\nimport WiggleBaseRenderer, {\n RenderArgsDeserializedWithFeatures,\n} from '../WiggleBaseRenderer'\nimport { YSCALEBAR_LABEL_OFFSET } from '../util'\n\nexport default class XYPlotRenderer extends WiggleBaseRenderer {\n async draw(\n ctx: CanvasRenderingContext2D,\n props: RenderArgsDeserializedWithFeatures,\n ) {\n const { features, config } = props\n\n // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the\n // wiggle display, and makes the height of the actual drawn area add\n // \"padding\" to the top and bottom of the display\n const pivotValue = readConfObject(config, 'bicolorPivotValue')\n const negColor = readConfObject(config, 'negColor')\n const posColor = readConfObject(config, 'posColor')\n\n return drawXY(ctx, {\n ...props,\n colorCallback:\n readConfObject(config, 'color') === '#f0f'\n ? (_: Feature, score: number) =>\n score < pivotValue ? negColor : posColor\n : (feature: Feature, _score: number) =>\n readConfObject(config, 'color', { feature }),\n offset: YSCALEBAR_LABEL_OFFSET,\n features: [...features.values()],\n })\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport baseWiggleRendererConfigSchema from '../configSchema'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config XYPlotRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'XYPlotRenderer',\n {\n /**\n * #slot\n */\n filled: {\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n /**\n * #slot\n */\n summaryScoreMode: {\n type: 'stringEnum',\n model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),\n description:\n 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',\n defaultValue: 'whiskers',\n },\n /**\n * #slot\n */\n minSize: {\n type: 'number',\n defaultValue: 0,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config LinePlotRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'LinePlotRenderer',\n {\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { clamp, featureSpanPx, Feature, Region } from '@jbrowse/core/util'\n\n// locals\nimport { getScale, ScaleOpts } from './util'\n\nconst fudgeFactor = 0.3\nconst clipHeight = 2\n\nexport function drawLine(\n ctx: CanvasRenderingContext2D,\n props: {\n features: Map<string, Feature> | Feature[]\n regions: Region[]\n bpPerPx: number\n scaleOpts: ScaleOpts\n height: number\n ticks: { values: number[] }\n displayCrossHatches: boolean\n colorCallback: (f: Feature, score: number) => string\n config: AnyConfigurationModel\n offset?: number\n },\n) {\n const {\n features,\n regions,\n bpPerPx,\n scaleOpts,\n height: unadjustedHeight,\n ticks: { values },\n displayCrossHatches,\n colorCallback,\n config,\n offset = 0,\n } = props\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n\n // the adjusted height takes into account YSCALEBAR_LABEL_OFFSET from the\n // wiggle display, and makes the height of the actual drawn area add\n // \"padding\" to the top and bottom of the display\n const height = unadjustedHeight - offset * 2\n const clipColor = readConfObject(config, 'clipColor')\n const scale = getScale({ ...scaleOpts, range: [0, height] })\n const domain = scale.domain()\n const niceMin = domain[0]!\n const niceMax = domain[1]!\n const toY = (n: number) => clamp(height - (scale(n) || 0), 0, height) + offset\n\n let lastVal: number | undefined\n let prevLeftPx = Number.NEGATIVE_INFINITY\n const reducedFeatures = []\n for (const feature of features.values()) {\n const [leftPx, rightPx] = featureSpanPx(feature, region, bpPerPx)\n\n // create reduced features, avoiding multiple features per px\n if (Math.floor(leftPx) !== Math.floor(prevLeftPx)) {\n reducedFeatures.push(feature)\n prevLeftPx = leftPx\n }\n const score = feature.get('score')\n const lowClipping = score < niceMin\n const highClipping = score > niceMax\n const w = rightPx - leftPx + fudgeFactor\n\n const c = colorCallback(feature, score)\n\n ctx.beginPath()\n ctx.strokeStyle = c\n const startPos = lastVal !== undefined ? lastVal : score\n if (!region.reversed) {\n ctx.moveTo(leftPx, toY(startPos))\n ctx.lineTo(leftPx, toY(score))\n ctx.lineTo(rightPx, toY(score))\n } else {\n ctx.moveTo(rightPx, toY(startPos))\n ctx.lineTo(rightPx, toY(score))\n ctx.lineTo(leftPx, toY(score))\n }\n ctx.stroke()\n lastVal = score\n\n if (highClipping) {\n ctx.fillStyle = clipColor\n ctx.fillRect(leftPx, offset, w, clipHeight)\n } else if (lowClipping && scaleOpts.scaleType !== 'log') {\n ctx.fillStyle = clipColor\n ctx.fillRect(leftPx, height - clipHeight, w, height)\n }\n }\n\n if (displayCrossHatches) {\n ctx.lineWidth = 1\n ctx.strokeStyle = 'rgba(200,200,200,0.5)'\n values.forEach(tick => {\n ctx.beginPath()\n ctx.moveTo(0, Math.round(toY(tick)))\n ctx.lineTo(width, Math.round(toY(tick)))\n ctx.stroke()\n })\n }\n return { reducedFeatures }\n}\n","import { readConfObject } from '@jbrowse/core/configuration'\nimport { Feature } from '@jbrowse/core/util'\nimport WiggleBaseRenderer, {\n RenderArgsDeserializedWithFeatures,\n} from '../WiggleBaseRenderer'\n\nimport { YSCALEBAR_LABEL_OFFSET } from '../util'\nimport { drawLine } from '../drawLine'\n\nexport default class LinePlotRenderer extends WiggleBaseRenderer {\n async draw(\n ctx: CanvasRenderingContext2D,\n props: RenderArgsDeserializedWithFeatures,\n ) {\n const { config } = props\n const c = readConfObject(config, 'color')\n return drawLine(ctx, {\n ...props,\n offset: YSCALEBAR_LABEL_OFFSET,\n colorCallback:\n c === '#f0f'\n ? () => 'grey'\n : (feature: Feature) => readConfObject(config, 'color', { feature }),\n })\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config SharedWiggleDisplay\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nexport default function sharedWiggleConfigFactory() {\n return ConfigurationSchema(\n 'SharedWiggleDisplay',\n {\n /**\n * #slot\n */\n autoscale: {\n type: 'stringEnum',\n defaultValue: 'local',\n model: types.enumeration('Autoscale type', [\n 'global',\n 'local',\n 'globalsd',\n 'localsd',\n 'zscore',\n ]),\n description:\n 'global/local using their min/max values or w/ standard deviations (globalsd/localsd)',\n },\n\n /**\n * #slot\n */\n minimalTicks: {\n type: 'boolean',\n defaultValue: false,\n description: 'use the minimal amount of ticks',\n },\n\n /**\n * #slot\n */\n minScore: {\n type: 'number',\n defaultValue: Number.MIN_VALUE,\n description: 'minimum value for the y-scale',\n },\n /**\n * #slot\n */\n maxScore: {\n type: 'number',\n description: 'maximum value for the y-scale',\n defaultValue: Number.MAX_VALUE,\n },\n /**\n * #slot\n */\n numStdDev: {\n type: 'number',\n description:\n 'number of standard deviations to use for autoscale types globalsd or localsd',\n defaultValue: 3,\n },\n /**\n * #slot\n */\n scaleType: {\n type: 'stringEnum',\n model: types.enumeration('Scale type', ['linear', 'log']), // todo zscale\n description: 'The type of scale to use',\n defaultValue: 'linear',\n },\n\n /**\n * #slot\n */\n inverted: {\n type: 'boolean',\n description: 'draw upside down',\n defaultValue: false,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n getConf,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport {\n Feature,\n getEnv,\n getSession,\n isSelectionContainer,\n} from '@jbrowse/core/util'\nimport { BaseLinearDisplay } from '@jbrowse/plugin-linear-genome-view'\nimport { types } from 'mobx-state-tree'\n\n// locals\nimport { getNiceDomain } from '../util'\nimport { lazy } from 'react'\n\n// lazies\nconst SetMinMaxDialog = lazy(() => import('./SetMinMaxDialog'))\n\n/**\n * #stateModel SharedWiggleMixin\n */\nexport default function SharedWiggleMixin(\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n selectedRendering: types.optional(types.string, ''),\n /**\n * #property\n */\n resolution: types.optional(types.number, 1),\n /**\n * #property\n */\n fill: types.maybe(types.boolean),\n /**\n * #property\n */\n minSize: types.maybe(types.number),\n /**\n * #property\n */\n color: types.maybe(types.string),\n /**\n * #property\n */\n posColor: types.maybe(types.string),\n /**\n * #property\n */\n negColor: types.maybe(types.string),\n /**\n * #property\n */\n summaryScoreMode: types.maybe(types.string),\n /**\n * #property\n */\n rendererTypeNameState: types.maybe(types.string),\n /**\n * #property\n */\n scale: types.maybe(types.string),\n /**\n * #property\n */\n autoscale: types.maybe(types.string),\n /**\n * #property\n */\n displayCrossHatches: types.maybe(types.boolean),\n /**\n * #property\n */\n constraints: types.optional(\n types.model({\n max: types.maybe(types.number),\n min: types.maybe(types.number),\n }),\n {},\n ),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n .volatile(() => ({\n message: undefined as undefined | string,\n stats: undefined as { scoreMin: number; scoreMax: number } | undefined,\n statsFetchInProgress: undefined as undefined | AbortController,\n }))\n .actions(self => ({\n /**\n * #action\n */\n updateQuantitativeStats(stats: { scoreMin: number; scoreMax: number }) {\n const { scoreMin, scoreMax } = stats\n const EPSILON = 0.000001\n if (!self.stats) {\n self.stats = { scoreMin, scoreMax }\n } else if (\n Math.abs(self.stats.scoreMax - scoreMax) > EPSILON ||\n Math.abs(self.stats.scoreMin - scoreMin) > EPSILON\n ) {\n self.stats = { scoreMin, scoreMax }\n }\n },\n /**\n * #action\n */\n setColor(color?: string) {\n self.color = color\n },\n /**\n * #action\n */\n setPosColor(color?: string) {\n self.posColor = color\n },\n /**\n * #action\n */\n setNegColor(color?: string) {\n self.negColor = color\n },\n\n /**\n * #action\n */\n setLoading(aborter: AbortController) {\n const { statsFetchInProgress: statsFetch } = self\n if (statsFetch !== undefined && !statsFetch.signal.aborted) {\n statsFetch.abort()\n }\n self.statsFetchInProgress = aborter\n },\n\n /**\n * #action\n * this overrides the BaseLinearDisplayModel to avoid popping up a\n * feature detail display, but still sets the feature selection on the\n * model so listeners can detect a click\n */\n selectFeature(feature: Feature) {\n const session = getSession(self)\n if (isSelectionContainer(session)) {\n session.setSelection(feature)\n }\n },\n\n /**\n * #action\n */\n setResolution(res: number) {\n self.resolution = res\n },\n\n /**\n * #action\n */\n setFill(fill: number) {\n if (fill === 0) {\n self.fill = true\n self.minSize = 0\n } else if (fill === 1) {\n self.fill = false\n self.minSize = 1\n } else if (fill === 2) {\n self.fill = false\n self.minSize = 2\n }\n },\n\n /**\n * #action\n */\n toggleLogScale() {\n self.scale = self.scale === 'log' ? 'linear' : 'log'\n },\n\n /**\n * #action\n */\n setScaleType(scale?: string) {\n self.scale = scale\n },\n\n /**\n * #action\n */\n setSummaryScoreMode(val: string) {\n self.summaryScoreMode = val\n },\n\n /**\n * #action\n */\n setAutoscale(val: string) {\n self.autoscale = val\n },\n\n /**\n * #action\n */\n setMaxScore(val?: number) {\n self.constraints.max = val\n },\n\n /**\n * #action\n */\n setRendererType(val: string) {\n self.rendererTypeNameState = val\n },\n\n /**\n * #action\n */\n setMinScore(val?: number) {\n self.constraints.min = val\n },\n\n /**\n * #action\n */\n toggleCrossHatches() {\n self.displayCrossHatches = !self.displayCrossHatches\n },\n\n /**\n * #action\n */\n setCrossHatches(cross: boolean) {\n self.displayCrossHatches = cross\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get adapterTypeName() {\n return self.adapterConfig.type\n },\n\n /**\n * #getter\n */\n get rendererTypeNameSimple() {\n return self.rendererTypeNameState ?? getConf(self, 'defaultRendering')\n },\n\n /**\n * #getter\n * subclasses can define these, as snpcoverage track does\n */\n get filters() {\n return undefined\n },\n\n /**\n * #getter\n */\n get scaleType() {\n return self.scale ?? getConf(self, 'scaleType')\n },\n\n /**\n * #getter\n */\n get maxScore() {\n return self.constraints.max ?? getConf(self, 'maxScore')\n },\n\n /**\n * #getter\n */\n get minScore() {\n return self.constraints.min ?? getConf(self, 'minScore')\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get adapterCapabilities() {\n const type = self.adapterTypeName\n const { pluginManager } = getEnv(self)\n return pluginManager.getAdapterType(type)!.adapterCapabilities\n },\n /**\n * #getter\n */\n get rendererConfig() {\n const {\n color,\n displayCrossHatches,\n fill,\n minSize,\n negColor,\n posColor,\n summaryScoreMode,\n scaleType,\n rendererTypeName,\n } = self\n const configBlob = getConf(self, ['renderers', rendererTypeName]) || {}\n return self.rendererType.configSchema.create(\n {\n ...configBlob,\n ...(scaleType ? { scaleType } : {}),\n ...(fill !== undefined ? { filled: fill } : {}),\n ...(displayCrossHatches !== undefined\n ? { displayCrossHatches }\n : {}),\n ...(summaryScoreMode !== undefined ? { summaryScoreMode } : {}),\n ...(color !== undefined ? { color } : {}),\n ...(negColor !== undefined ? { negColor } : {}),\n ...(posColor !== undefined ? { posColor } : {}),\n ...(minSize !== undefined ? { minSize } : {}),\n },\n getEnv(self),\n )\n },\n\n /**\n * #getter\n */\n get autoscaleType() {\n return self.autoscale ?? getConf(self, 'autoscale')\n },\n }))\n .views(self => {\n let oldDomain: [number, number] = [0, 0]\n return {\n /**\n * #getter\n */\n get domain() {\n const { stats, scaleType, minScore, maxScore } = self\n if (!stats) {\n return undefined\n }\n\n const ret = getNiceDomain({\n domain: [stats.scoreMin, stats.scoreMax],\n bounds: [minScore, maxScore],\n scaleType,\n })\n\n // avoid weird scalebar if log value and empty region displayed\n if (scaleType === 'log' && ret[1] === Number.MIN_VALUE) {\n return [0, Number.MIN_VALUE]\n }\n\n // avoid returning a new object if it matches the old value\n if (JSON.stringify(oldDomain) !== JSON.stringify(ret)) {\n oldDomain = ret\n }\n\n return oldDomain\n },\n }\n })\n .views(self => ({\n /**\n * #getter\n */\n get filled(): boolean {\n const { fill, rendererConfig } = self\n return fill ?? readConfObject(rendererConfig, 'filled')\n },\n /**\n * #getter\n */\n get summaryScoreModeSetting(): string {\n const { summaryScoreMode: mode, rendererConfig } = self\n return mode ?? readConfObject(rendererConfig, 'summaryScoreMode')\n },\n\n /**\n * #getter\n */\n get scaleOpts() {\n return {\n domain: self.domain,\n stats: self.stats,\n autoscaleType: self.autoscaleType,\n scaleType: self.scaleType,\n inverted: getConf(self, 'inverted'),\n }\n },\n\n /**\n * #getter\n */\n get canHaveFill() {\n return self.rendererTypeName === 'XYPlotRenderer'\n },\n\n /**\n * #getter\n */\n get displayCrossHatchesSetting(): boolean {\n const { displayCrossHatches: hatches, rendererConfig } = self\n return hatches ?? readConfObject(rendererConfig, 'displayCrossHatches')\n },\n /**\n * #getter\n */\n get hasResolution() {\n return self.adapterCapabilities.includes('hasResolution')\n },\n\n /**\n * #getter\n */\n get hasGlobalStats() {\n return self.adapterCapabilities.includes('hasGlobalStats')\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n scoreTrackMenuItems() {\n return [\n ...(self.hasResolution\n ? [\n {\n label: 'Resolution',\n subMenu: [\n {\n label: 'Finer resolution',\n onClick: () => {\n self.setResolution(self.resolution * 5)\n },\n },\n {\n label: 'Coarser resolution',\n onClick: () => {\n self.setResolution(self.resolution / 5)\n },\n },\n ],\n },\n {\n label: 'Summary score mode',\n subMenu: ['min', 'max', 'avg', 'whiskers'].map(elt => ({\n label: elt,\n type: 'radio',\n checked: self.summaryScoreModeSetting === elt,\n onClick: () => {\n self.setSummaryScoreMode(elt)\n },\n })),\n },\n ]\n : []),\n {\n label:\n self.scaleType === 'log' ? 'Set linear scale' : 'Set log scale',\n onClick: () => {\n self.toggleLogScale()\n },\n },\n {\n label: 'Autoscale type',\n subMenu: [\n ['local', 'Local'],\n ...(self.hasGlobalStats\n ? ([\n ['global', 'Global'],\n ['globalsd', 'Global ± 3σ'],\n ] as const)\n : []),\n ['localsd', 'Local ± 3σ'],\n ].map(([val, label]) => ({\n label,\n type: 'radio',\n checked: self.autoscaleType === val,\n onClick: () => {\n self.setAutoscale(val)\n },\n })),\n },\n {\n label: 'Set min/max score',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetMinMaxDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }))\n .actions(self => {\n const { reload: superReload } = self\n return {\n /**\n * #action\n */\n async reload() {\n self.setError()\n superReload()\n },\n }\n })\n}\n","import { lazy } from 'react'\nimport {\n AnyConfigurationSchemaType,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { AnyReactComponentType, getSession } from '@jbrowse/core/util'\nimport { types, Instance } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { axisPropsFromTickScale } from 'react-d3-axis-mod'\nimport { ExportSvgDisplayOptions } from '@jbrowse/plugin-linear-genome-view'\n\n// locals\nimport { getScale, YSCALEBAR_LABEL_OFFSET } from '../../util'\nimport SharedWiggleMixin from '../../shared/modelShared'\n\n// lazies\nconst Tooltip = lazy(() => import('../components/Tooltip'))\nconst SetColorDialog = lazy(() => import('../components/SetColorDialog'))\n\n// using a map because it preserves order\nconst rendererTypes = new Map([\n ['xyplot', 'XYPlotRenderer'],\n ['density', 'DensityRenderer'],\n ['line', 'LinePlotRenderer'],\n])\n\n/**\n * #stateModel LinearWiggleDisplay\n * extends\n * - [SharedWiggleMixin](../sharedwigglemixin)\n */\nfunction stateModelFactory(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'LinearWiggleDisplay',\n SharedWiggleMixin(configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearWiggleDisplay'),\n }),\n )\n\n .views(self => ({\n /**\n * #getter\n */\n get TooltipComponent() {\n return Tooltip as AnyReactComponentType\n },\n\n /**\n * #getter\n */\n get rendererTypeName() {\n const name = self.rendererTypeNameSimple\n const rendererType = rendererTypes.get(name)\n if (!rendererType) {\n throw new Error(`unknown renderer ${name}`)\n }\n return rendererType\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get ticks() {\n const { scaleType, domain, height } = self\n const minimalTicks = getConf(self, 'minimalTicks')\n const inverted = getConf(self, 'inverted')\n const range = [height - YSCALEBAR_LABEL_OFFSET, YSCALEBAR_LABEL_OFFSET]\n if (!domain) {\n return undefined\n }\n const scale = getScale({\n scaleType,\n domain,\n range,\n inverted,\n })\n const ticks = axisPropsFromTickScale(scale, 4)\n return height < 100 || minimalTicks\n ? { ...ticks, values: domain }\n : ticks\n },\n }))\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #method\n */\n renderProps() {\n const superProps = superRenderProps()\n const { filters, ticks, height, resolution, scaleOpts } = self\n return {\n ...superProps,\n notReady: superProps.notReady || !self.stats,\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n config: self.rendererConfig,\n displayCrossHatches: self.displayCrossHatchesSetting,\n scaleOpts,\n resolution,\n height,\n ticks,\n filters,\n }\n },\n\n /**\n * #getter\n */\n get needsScalebar() {\n const { rendererTypeName: type } = self\n return type === 'XYPlotRenderer' || type === 'LinePlotRenderer'\n },\n /**\n * #getter\n */\n get fillSetting() {\n if (self.filled) {\n return 0\n } else if (self.minSize === 1) {\n return 1\n } else {\n return 2\n }\n },\n }\n })\n .views(self => {\n const { trackMenuItems: superTrackMenuItems } = self\n const hasRenderings = getConf(self, 'defaultRendering')\n return {\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Score',\n subMenu: self.scoreTrackMenuItems(),\n },\n\n ...(self.canHaveFill\n ? [\n {\n label: 'Fill mode',\n subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map(\n (elt, idx) => ({\n label: elt,\n type: 'radio',\n checked: self.fillSetting === idx,\n onClick: () => {\n self.setFill(idx)\n },\n }),\n ),\n },\n ]\n : []),\n\n ...(self.needsScalebar\n ? [\n {\n type: 'checkbox',\n label: 'Draw cross hatches',\n checked: self.displayCrossHatchesSetting,\n onClick: () => {\n self.toggleCrossHatches()\n },\n },\n ]\n : []),\n\n ...(hasRenderings\n ? [\n {\n label: 'Renderer type',\n subMenu: ['xyplot', 'density', 'line'].map(key => ({\n label: key,\n type: 'radio',\n checked: self.rendererTypeNameSimple === key,\n onClick: () => {\n self.setRendererType(key)\n },\n })),\n },\n ]\n : []),\n\n {\n label: 'Set color',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetColorDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }\n })\n .actions(self => {\n const { renderSvg: superRenderSvg } = self\n\n return {\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n const { quantitativeStatsAutorun } = await import('../../util')\n quantitativeStatsAutorun(self)\n })()\n },\n /**\n * #action\n */\n async renderSvg(opts: ExportSvgDisplayOptions) {\n const { renderSvg } = await import('./renderSvg')\n return renderSvg(self, opts, superRenderSvg)\n },\n }\n })\n}\n\nexport type WiggleDisplayStateModel = ReturnType<typeof stateModelFactory>\nexport type WiggleDisplayModel = Instance<WiggleDisplayStateModel>\n\nexport default stateModelFactory\n","import { lazy } from 'react'\nimport { addDisposer, isAlive, types, Instance } from 'mobx-state-tree'\nimport { autorun } from 'mobx'\nimport { axisPropsFromTickScale } from 'react-d3-axis-mod'\nimport deepEqual from 'fast-deep-equal'\n\n// jbrowse imports\nimport {\n AnyConfigurationSchemaType,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { getSession, Feature, AnyReactComponentType } from '@jbrowse/core/util'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { set1 as colors } from '@jbrowse/core/ui/colors'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ExportSvgDisplayOptions } from '@jbrowse/plugin-linear-genome-view'\n\n// locals\nimport { getScale, YSCALEBAR_LABEL_OFFSET } from '../../util'\nimport SharedWiggleMixin from '../../shared/modelShared'\n\nconst randomColor = () =>\n '#000000'.replaceAll('0', () => (~~(Math.random() * 16)).toString(16))\n\n// lazies\nconst Tooltip = lazy(() => import('../components/Tooltip'))\nconst SetColorDialog = lazy(() => import('../components/SetColorDialog'))\n\n// using a map because it preserves order\nconst rendererTypes = new Map([\n ['xyplot', 'MultiXYPlotRenderer'],\n ['multirowxy', 'MultiRowXYPlotRenderer'],\n ['multirowdensity', 'MultiDensityRenderer'],\n ['multiline', 'MultiLineRenderer'],\n ['multirowline', 'MultiRowLineRenderer'],\n])\n\ninterface Source {\n name: string\n color?: string\n group?: string\n}\n\n/**\n * #stateModel MultiLinearWiggleDisplay\n * extends\n * - [SharedWiggleMixin](../sharedwigglemixin)\n */\nexport function stateModelFactory(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'MultiLinearWiggleDisplay',\n SharedWiggleMixin(configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('MultiLinearWiggleDisplay'),\n\n /**\n * #property\n */\n layout: types.optional(types.frozen<Source[]>(), []),\n }),\n )\n .volatile(() => ({\n featureUnderMouseVolatile: undefined as Feature | undefined,\n sourcesVolatile: undefined as Source[] | undefined,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setLayout(layout: Source[]) {\n self.layout = layout\n },\n /**\n * #action\n */\n clearLayout() {\n self.layout = []\n },\n\n /**\n * #action\n */\n setSources(sources: Source[]) {\n if (!deepEqual(sources, self.sourcesVolatile)) {\n self.sourcesVolatile = sources\n }\n },\n\n /**\n * #action\n */\n setFeatureUnderMouse(f?: Feature) {\n self.featureUnderMouseVolatile = f\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get featureUnderMouse() {\n return self.featureUnderMouseVolatile\n },\n /**\n * #getter\n */\n get TooltipComponent() {\n return Tooltip as AnyReactComponentType\n },\n\n /**\n * #getter\n */\n get rendererTypeName() {\n const name = self.rendererTypeNameSimple\n const rendererType = rendererTypes.get(name)\n if (!rendererType) {\n throw new Error(`unknown renderer ${name}`)\n }\n return rendererType\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get needsScalebar() {\n return (\n self.rendererTypeName === 'MultiXYPlotRenderer' ||\n self.rendererTypeName === 'MultiRowXYPlotRenderer' ||\n self.rendererTypeName === 'MultiLineRenderer' ||\n self.rendererTypeName === 'MultiRowLineRenderer'\n )\n },\n /**\n * #getter\n */\n get needsFullHeightScalebar() {\n return (\n self.rendererTypeName === 'MultiXYPlotRenderer' ||\n self.rendererTypeName === 'MultiLineRenderer'\n )\n },\n /**\n * #getter\n */\n get isMultiRow() {\n return (\n self.rendererTypeName === 'MultiRowXYPlotRenderer' ||\n self.rendererTypeName === 'MultiRowLineRenderer' ||\n self.rendererTypeName === 'MultiDensityRenderer'\n )\n },\n /**\n * #getter\n * can be used to give it a \"color scale\" like a R heatmap, not\n * implemented like this yet but flag can be used for this\n */\n get needsCustomLegend() {\n return self.rendererTypeName === 'MultiDensityRenderer'\n },\n\n get canHaveFill() {\n return (\n self.rendererTypeName === 'MultiXYPlotRenderer' ||\n self.rendererTypeName === 'MultiRowXYPlotRenderer'\n )\n },\n /**\n * #getter\n * the multirowxy and multiline don't need to use colors on the legend\n * boxes since their track is drawn with the color. sort of a stylistic\n * choice\n */\n get renderColorBoxes() {\n return !(\n self.rendererTypeName === 'MultiRowLineRenderer' ||\n self.rendererTypeName === 'MultiRowXYPlotRenderer'\n )\n },\n /**\n * #getter\n * positions multi-row below the tracklabel even if using overlap\n * tracklabels for everything else\n */\n get prefersOffset() {\n return this.isMultiRow\n },\n /**\n * #getter\n */\n get sources() {\n const sources = Object.fromEntries(\n self.sourcesVolatile?.map(s => [s.name, s]) || [],\n )\n const iter = self.layout.length ? self.layout : self.sourcesVolatile\n return iter\n ?.map(s => ({\n ...sources[s.name],\n ...s,\n }))\n .map((s, i) => ({\n ...s,\n color:\n s.color ||\n (!this.isMultiRow ? colors[i] || randomColor() : 'blue'),\n }))\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get rowHeight() {\n const { sources, height, isMultiRow } = self\n return isMultiRow ? height / (sources?.length || 1) : height\n },\n /**\n * #getter\n */\n get rowHeightTooSmallForScalebar() {\n return this.rowHeight < 70\n },\n\n /**\n * #getter\n */\n get useMinimalTicks() {\n return (\n getConf(self, 'minimalTicks') || this.rowHeightTooSmallForScalebar\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get ticks() {\n const { scaleType, domain, isMultiRow, rowHeight, useMinimalTicks } =\n self\n\n if (!domain) {\n return undefined\n }\n\n const offset = isMultiRow ? 0 : YSCALEBAR_LABEL_OFFSET\n const ticks = axisPropsFromTickScale(\n getScale({\n scaleType,\n domain,\n range: [rowHeight - offset, offset],\n inverted: getConf(self, 'inverted') as boolean,\n }),\n 4,\n )\n return useMinimalTicks ? { ...ticks, values: domain } : ticks\n },\n\n /**\n * #getter\n */\n get colors() {\n return [\n 'red',\n 'blue',\n 'green',\n 'orange',\n 'purple',\n 'cyan',\n 'pink',\n 'darkblue',\n 'darkred',\n 'pink',\n ]\n },\n }))\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #method\n */\n renderProps() {\n const superProps = superRenderProps()\n const {\n displayCrossHatches,\n filters,\n height,\n resolution,\n rpcDriverName,\n scaleOpts,\n stats,\n sources,\n ticks,\n rendererConfig: config,\n } = self\n return {\n ...superProps,\n notReady: superProps.notReady || !sources || !stats,\n displayModel: self,\n config,\n displayCrossHatches,\n filters,\n height,\n resolution,\n rpcDriverName,\n scaleOpts,\n sources,\n ticks,\n onMouseMove: (_: unknown, f: Feature) => {\n self.setFeatureUnderMouse(f)\n },\n onMouseLeave: () => {\n self.setFeatureUnderMouse(undefined)\n },\n }\n },\n\n /**\n * #getter\n */\n get hasResolution() {\n return self.adapterCapabilities.includes('hasResolution')\n },\n\n /**\n * #getter\n */\n get hasGlobalStats() {\n return self.adapterCapabilities.includes('hasGlobalStats')\n },\n\n /**\n * #getter\n */\n get fillSetting() {\n if (self.filled) {\n return 0\n } else if (self.minSize === 1) {\n return 1\n } else {\n return 2\n }\n },\n }\n })\n .views(self => {\n const { trackMenuItems: superTrackMenuItems } = self\n const hasRenderings = getConf(self, 'defaultRendering')\n return {\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Score',\n subMenu: self.scoreTrackMenuItems(),\n },\n\n ...(self.canHaveFill\n ? [\n {\n label: 'Fill mode',\n subMenu: ['filled', 'no fill', 'no fill w/ emphasis'].map(\n (elt, idx) => ({\n label: elt,\n type: 'radio',\n checked: self.fillSetting === idx,\n onClick: () => {\n self.setFill(idx)\n },\n }),\n ),\n },\n ]\n : []),\n\n ...(self.needsScalebar\n ? [\n {\n type: 'checkbox',\n label: 'Draw cross hatches',\n checked: self.displayCrossHatchesSetting,\n onClick: () => {\n self.toggleCrossHatches()\n },\n },\n ]\n : []),\n ...(hasRenderings\n ? [\n {\n label: 'Renderer type',\n subMenu: [\n 'xyplot',\n 'multirowxy',\n 'multirowdensity',\n 'multiline',\n 'multirowline',\n ].map(key => ({\n label: key,\n type: 'radio',\n checked: self.rendererTypeNameSimple === key,\n onClick: () => {\n self.setRendererType(key)\n },\n })),\n },\n ]\n : []),\n\n {\n label: 'Edit colors/arrangement...',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n SetColorDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }\n })\n .actions(self => {\n const { renderSvg: superRenderSvg } = self\n return {\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n const { quantitativeStatsAutorun } = await import('../../util')\n quantitativeStatsAutorun(self)\n addDisposer(\n self,\n autorun(async () => {\n const { rpcManager } = getSession(self)\n const { adapterConfig } = self\n const sessionId = getRpcSessionId(self)\n const sources = (await rpcManager.call(\n sessionId,\n 'MultiWiggleGetSources',\n {\n sessionId,\n adapterConfig,\n },\n )) as Source[]\n if (isAlive(self)) {\n self.setSources(sources)\n }\n }),\n )\n })()\n },\n\n /**\n * #action\n */\n async renderSvg(opts: ExportSvgDisplayOptions) {\n const { renderSvg } = await import('./renderSvg')\n return renderSvg(self, opts, superRenderSvg)\n },\n }\n })\n}\n\nexport type WiggleDisplayStateModel = ReturnType<typeof stateModelFactory>\nexport type WiggleDisplayModel = Instance<WiggleDisplayStateModel>\n\nexport default stateModelFactory\n","import { observer } from 'mobx-react'\nimport React, { useRef } from 'react'\n\nimport { Region } from '@jbrowse/core/util/types'\nimport { SimpleFeature, Feature } from '@jbrowse/core/util'\nimport { PrerenderedCanvas } from '@jbrowse/core/ui'\nimport { Source } from './util'\n\nconst MultiWiggleRendering = observer(function (props: {\n regions: Region[]\n features: Map<string, Feature>\n bpPerPx: number\n width: number\n height: number\n blockKey: string\n sources: Source[]\n displayModel?: { isMultiRow: boolean }\n onMouseLeave?: (event: React.MouseEvent) => void\n onMouseMove?: (event: React.MouseEvent, arg?: Feature) => void\n onFeatureClick?: (event: React.MouseEvent, arg?: Feature) => void\n}) {\n const {\n regions,\n features,\n bpPerPx,\n width,\n height,\n sources,\n onMouseLeave = () => {},\n onMouseMove = () => {},\n onFeatureClick = () => {},\n displayModel,\n } = props\n const region = regions[0]!\n const ref = useRef<HTMLDivElement>(null)\n const { isMultiRow } = displayModel || {}\n\n function getFeatureUnderMouse(eventClientX: number, eventClientY: number) {\n if (!ref.current) {\n return\n }\n const rect = ref.current.getBoundingClientRect()\n const offsetX = eventClientX - rect.left\n const offsetY = eventClientY - rect.top\n const source = sources[Math.floor((offsetY / height) * sources.length)]\n if (!source) {\n return\n }\n const px = region.reversed ? width - offsetX : offsetX\n const mouseoverBp = region.start + bpPerPx * px\n let featureUnderMouse: Feature | undefined\n if (isMultiRow) {\n for (const feature of features.values()) {\n if (feature.get('source') !== source.name) {\n continue\n }\n if (\n mouseoverBp <= feature.get('end') + bpPerPx &&\n mouseoverBp >= feature.get('start')\n ) {\n featureUnderMouse = feature\n break\n }\n }\n } else {\n const featuresUnderMouse = []\n for (const feature of features.values()) {\n if (\n mouseoverBp <= feature.get('end') + bpPerPx &&\n mouseoverBp >= feature.get('start')\n ) {\n featuresUnderMouse.push(feature)\n }\n }\n\n if (featuresUnderMouse.length) {\n const pos = Math.floor(mouseoverBp)\n featureUnderMouse = new SimpleFeature({\n uniqueId: 'mouseoverfeat',\n sources: Object.fromEntries(\n featuresUnderMouse\n .map(f => f.toJSON())\n .map(f => {\n const { refName, start, end, source, ...rest } = f\n return [source, rest]\n }),\n ),\n ...region,\n start: pos,\n end: pos + 1,\n })\n }\n }\n return featureUnderMouse\n }\n\n return (\n <div\n ref={ref}\n onMouseMove={event => {\n const { clientX, clientY } = event\n const featureUnderMouse = getFeatureUnderMouse(clientX, clientY)\n onMouseMove(event, featureUnderMouse)\n }}\n onClick={event => {\n const { clientX, clientY } = event\n const featureUnderMouse = getFeatureUnderMouse(clientX, clientY)\n onFeatureClick(event, featureUnderMouse)\n }}\n onMouseLeave={event => {\n onMouseLeave(event)\n }}\n style={{\n overflow: 'visible',\n position: 'relative',\n height,\n }}\n >\n <PrerenderedCanvas {...props} />\n </div>\n )\n})\n\nexport default MultiWiggleRendering\n","import { groupBy, Feature } from '@jbrowse/core/util'\nimport { drawXY } from '../drawXY'\nimport { YSCALEBAR_LABEL_OFFSET } from '../util'\n\nimport WiggleBaseRenderer, {\n MultiRenderArgsDeserialized as MultiArgs,\n} from '../WiggleBaseRenderer'\n\nexport default class MultiXYPlotRenderer extends WiggleBaseRenderer {\n // @ts-expect-error\n async draw(ctx: CanvasRenderingContext2D, props: MultiArgs) {\n const { sources, features } = props\n const groups = groupBy(features.values(), f => f.get('source'))\n let feats = [] as Feature[]\n for (const source of sources) {\n const features = groups[source.name] || []\n const { reducedFeatures } = drawXY(ctx, {\n ...props,\n features,\n offset: YSCALEBAR_LABEL_OFFSET,\n colorCallback: () => source.color || 'blue',\n })\n feats = feats.concat(reducedFeatures)\n }\n return { reducedFeatures: feats }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config MultiXYPlotRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'MultiXYPlotRenderer',\n {\n /**\n * #slot\n */\n filled: {\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n /**\n * #slot\n */\n summaryScoreMode: {\n type: 'stringEnum',\n model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),\n description:\n 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',\n defaultValue: 'avg',\n },\n /**\n * #slot\n */\n minSize: {\n type: 'number',\n defaultValue: 0,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\nexport default configSchema\n","import { groupBy, Feature } from '@jbrowse/core/util'\nimport { drawXY } from '../drawXY'\n\nimport WiggleBaseRenderer, {\n MultiRenderArgsDeserialized as MultiArgs,\n} from '../WiggleBaseRenderer'\n\nexport default class MultiXYPlotRenderer extends WiggleBaseRenderer {\n // @ts-expect-error\n async draw(ctx: CanvasRenderingContext2D, props: MultiArgs) {\n const { bpPerPx, sources, regions, features } = props\n const region = regions[0]!\n const groups = groupBy(features.values(), f => f.get('source'))\n const height = props.height / sources.length\n const width = (region.end - region.start) / bpPerPx\n let feats = [] as Feature[]\n ctx.save()\n sources.forEach(source => {\n const { reducedFeatures } = drawXY(ctx, {\n ...props,\n features: groups[source.name] || [],\n height,\n colorCallback: () => source.color || 'blue',\n })\n ctx.strokeStyle = 'rgba(200,200,200,0.8)'\n ctx.beginPath()\n ctx.moveTo(0, height)\n ctx.lineTo(width, height)\n ctx.stroke()\n ctx.translate(0, height)\n feats = feats.concat(reducedFeatures)\n })\n ctx.restore()\n return { reducedFeatures: feats }\n }\n}\n","import { types } from 'mobx-state-tree'\n\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config MultiRowXYPlotRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'MultiRowXYPlotRenderer',\n {\n /**\n * #slot\n */\n filled: {\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n /**\n * #slot\n */\n summaryScoreMode: {\n type: 'stringEnum',\n model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),\n description:\n 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',\n defaultValue: 'whiskers',\n },\n /**\n * #slot\n */\n minSize: {\n type: 'number',\n defaultValue: 0,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config MultiDensityRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'MultiDensityRenderer',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import { groupBy, Feature } from '@jbrowse/core/util'\nimport WiggleBaseRenderer, {\n MultiRenderArgsDeserialized as MultiArgs,\n} from '../WiggleBaseRenderer'\nimport { drawDensity } from '../drawDensity'\n\nexport default class MultiXYPlotRenderer extends WiggleBaseRenderer {\n // @ts-expect-error\n async draw(ctx: CanvasRenderingContext2D, props: MultiArgs) {\n const { sources, features } = props\n const groups = groupBy(features.values(), f => f.get('source'))\n const height = props.height / sources.length\n let feats = [] as Feature[]\n ctx.save()\n sources.forEach(source => {\n const features = groups[source.name] || []\n const { reducedFeatures } = drawDensity(ctx, {\n ...props,\n features,\n height,\n })\n ctx.translate(0, height)\n feats = feats.concat(reducedFeatures)\n })\n ctx.restore()\n return { reducedFeatures: feats }\n }\n}\n","import { groupBy, Feature } from '@jbrowse/core/util'\nimport { drawLine } from '../drawLine'\n\nimport WiggleBaseRenderer, {\n MultiRenderArgsDeserialized as MultiArgs,\n} from '../WiggleBaseRenderer'\n\nexport default class MultiLineRenderer extends WiggleBaseRenderer {\n // @ts-expect-error\n async draw(ctx: CanvasRenderingContext2D, props: MultiArgs) {\n const { sources, features } = props\n const groups = groupBy(features.values(), f => f.get('source'))\n let feats = [] as Feature[]\n sources.forEach(source => {\n const { reducedFeatures } = drawLine(ctx, {\n ...props,\n features: groups[source.name] || [],\n colorCallback: () => source.color || 'blue',\n })\n feats = feats.concat(reducedFeatures)\n })\n return { reducedFeatures: feats }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n/**\n * #config MultiLineRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'MultiLineRenderer',\n {\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n /**\n * #slot\n */\n summaryScoreMode: {\n type: 'stringEnum',\n model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),\n description:\n 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',\n defaultValue: 'avg',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\nexport default configSchema\n","import { groupBy, Feature } from '@jbrowse/core/util'\nimport { drawLine } from '../drawLine'\n\nimport WiggleBaseRenderer, {\n MultiRenderArgsDeserialized as MultiArgs,\n} from '../WiggleBaseRenderer'\n\nexport default class MultiRowLineRenderer extends WiggleBaseRenderer {\n // @ts-expect-error\n async draw(ctx: CanvasRenderingContext2D, props: MultiArgs) {\n const { bpPerPx, sources, regions, features } = props\n const region = regions[0]!\n const groups = groupBy(features.values(), f => f.get('source'))\n const height = props.height / sources.length\n const width = (region.end - region.start) / bpPerPx\n let feats = [] as Feature[]\n ctx.save()\n sources.forEach(source => {\n const { reducedFeatures } = drawLine(ctx, {\n ...props,\n features: groups[source.name] || [],\n height,\n colorCallback: () => source.color || 'blue',\n })\n ctx.strokeStyle = 'rgba(200,200,200,0.8)'\n ctx.beginPath()\n ctx.moveTo(0, height)\n ctx.lineTo(width, height)\n ctx.stroke()\n ctx.translate(0, height)\n feats = feats.concat(reducedFeatures)\n })\n ctx.restore()\n return { reducedFeatures: feats }\n }\n}\n","import { types } from 'mobx-state-tree'\n\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport baseWiggleRendererConfigSchema from '../configSchema'\n\n/**\n * #config MultiRowLineRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'MultiRowLineRenderer',\n {\n /**\n * #slot\n */\n displayCrossHatches: {\n type: 'boolean',\n description: 'choose to draw cross hatches (sideways lines)',\n defaultValue: false,\n },\n /**\n * #slot\n */\n summaryScoreMode: {\n type: 'stringEnum',\n model: types.enumeration('Score type', ['max', 'min', 'avg', 'whiskers']),\n description:\n 'choose whether to use max/min/average or whiskers which combines all three into the same rendering',\n defaultValue: 'avg',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseWiggleRendererConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport default configSchema\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { getSession, isSessionWithAddTracks } from '@jbrowse/core/util'\nimport { HierarchicalTrackSelectorModel } from '@jbrowse/plugin-data-management'\n\nconst ConfirmDialog = lazy(() => import('./ConfirmDialog'))\n\nexport default function CreateMultiWiggleExtensionF(pm: PluginManager) {\n pm.addToExtensionPoint(\n 'TrackSelector-multiTrackMenuItems',\n (items: unknown[], props: Record<string, unknown>) => {\n const { session } = props\n return [\n ...items,\n ...(isSessionWithAddTracks(session)\n ? [\n {\n label: 'Create multi-wiggle track',\n onClick: (model: HierarchicalTrackSelectorModel) => {\n const tracks = model.selection\n const trackIds = tracks.map(c => readConfObject(c, 'name'))\n function makeTrack(arg: { name: string }) {\n const subadapters = tracks\n .map(c => readConfObject(c, 'adapter'))\n .map((c, idx) => ({ ...c, source: trackIds[idx] }))\n const assemblyNames = [\n ...new Set(\n tracks.flatMap(c => readConfObject(c, 'assemblyNames')),\n ),\n ]\n const now = +Date.now()\n const trackId = `multitrack-${now}-sessionTrack`\n\n const session = getSession(model)\n if (isSessionWithAddTracks(session)) {\n session.addTrackConf({\n type: 'MultiQuantitativeTrack',\n trackId,\n name: arg.name,\n assemblyNames,\n adapter: {\n type: 'MultiWiggleAdapter',\n subadapters,\n },\n })\n model.view.showTrack(trackId)\n }\n }\n getSession(model).queueDialog(handleClose => [\n ConfirmDialog,\n {\n tracks,\n onClose: (arg: boolean, arg1?: { name: string }) => {\n if (arg && arg1) {\n makeTrack(arg1)\n }\n handleClose()\n },\n },\n ])\n },\n },\n ]\n : []),\n ]\n },\n )\n}\n","import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'\nimport { renameRegionsIfNeeded, Region } from '@jbrowse/core/util'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\nexport class MultiWiggleGetSources extends RpcMethodType {\n name = 'MultiWiggleGetSources'\n\n async deserializeArguments(args: any, rpcDriverClassName: string) {\n const l = await super.deserializeArguments(args, rpcDriverClassName)\n return {\n ...l,\n filters: args.filters\n ? new SerializableFilterChain({\n filters: args.filters,\n })\n : undefined,\n }\n }\n\n async serializeArguments(\n args: RenderArgs & {\n signal?: AbortSignal\n statusCallback?: (arg: string) => void\n },\n rpcDriverClassName: string,\n ) {\n const pm = this.pluginManager\n const assemblyManager = pm.rootModel?.session?.assemblyManager\n if (!assemblyManager) {\n return args\n }\n\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {\n ...args,\n filters: args.filters?.toJSON().filters,\n })\n\n return super.serializeArguments(renamedArgs, rpcDriverClassName)\n }\n\n async execute(\n args: {\n adapterConfig: AnyConfigurationModel\n signal?: RemoteAbortSignal\n sessionId: string\n headers?: Record<string, string>\n regions: Region[]\n bpPerPx: number\n },\n rpcDriverClassName: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(\n args,\n rpcDriverClassName,\n )\n const { regions, adapterConfig, sessionId } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n\n // @ts-expect-error\n return dataAdapter.getSources(regions, deserializedArgs)\n }\n}\n","import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport { RenderArgs } from '@jbrowse/core/rpc/coreRpcMethods'\nimport { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { Region, renameRegionsIfNeeded } from '@jbrowse/core/util'\n\nexport class WiggleGetMultiRegionQuantitativeStats extends RpcMethodType {\n name = 'WiggleGetMultiRegionQuantitativeStats'\n\n async deserializeArguments(args: any, rpcDriverClassName: string) {\n const l = await super.deserializeArguments(args, rpcDriverClassName)\n return {\n ...l,\n filters: args.filters\n ? new SerializableFilterChain({\n filters: args.filters,\n })\n : undefined,\n }\n }\n\n async serializeArguments(\n args: RenderArgs & {\n signal?: AbortSignal\n statusCallback?: (arg: string) => void\n },\n rpcDriverClassName: string,\n ) {\n const pm = this.pluginManager\n const assemblyManager = pm.rootModel?.session?.assemblyManager\n if (!assemblyManager) {\n return args\n }\n\n const renamedArgs = await renameRegionsIfNeeded(assemblyManager, {\n ...args,\n filters: args.filters?.toJSON().filters,\n })\n\n return super.serializeArguments(renamedArgs, rpcDriverClassName)\n }\n\n async execute(\n args: {\n adapterConfig: Record<string, unknown>\n signal?: RemoteAbortSignal\n sessionId: string\n headers?: Record<string, string>\n regions: Region[]\n bpPerPx: number\n },\n rpcDriverClassName: string,\n ) {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(\n args,\n rpcDriverClassName,\n )\n const { regions, adapterConfig, sessionId } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n\n // @ts-expect-error\n return dataAdapter.getMultiRegionQuantitativeStats(\n regions,\n deserializedArgs,\n )\n }\n}\n","import RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'\nimport SerializableFilterChain from '@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain'\nimport { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\nimport { QuantitativeStats } from '@jbrowse/core/util/stats'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\nexport class WiggleGetGlobalQuantitativeStats extends RpcMethodType {\n name = 'WiggleGetGlobalQuantitativeStats'\n\n async deserializeArguments(args: any, rpcDriverClassName: string) {\n const l = await super.deserializeArguments(args, rpcDriverClassName)\n return {\n ...l,\n filters: args.filters\n ? new SerializableFilterChain({\n filters: args.filters,\n })\n : undefined,\n }\n }\n\n async execute(\n args: {\n adapterConfig: AnyConfigurationModel\n signal?: RemoteAbortSignal\n headers?: Record<string, string>\n sessionId: string\n },\n rpcDriverClassName: string,\n ): Promise<QuantitativeStats> {\n const pm = this.pluginManager\n const deserializedArgs = await this.deserializeArguments(\n args,\n rpcDriverClassName,\n )\n const { adapterConfig, sessionId } = deserializedArgs\n const { dataAdapter } = await getAdapter(pm, sessionId, adapterConfig)\n\n // @ts-expect-error\n return dataAdapter.getGlobalStats(deserializedArgs)\n }\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n AdapterGuesser,\n TrackTypeGuesser,\n getFileName,\n} from '@jbrowse/core/util/tracks'\n\n// locals\nimport WiggleBaseRenderer from './WiggleBaseRenderer'\n\nimport BigWigAdapterF from './BigWigAdapter'\nimport QuantitativeTrackF from './QuantitativeTrack'\nimport MultiQuantitativeTrackF from './MultiQuantitativeTrack'\nimport MultiWiggleAdapterF from './MultiWiggleAdapter'\nimport DensityRendererF from './DensityRenderer'\nimport XYPlotRendererF from './XYPlotRenderer'\nimport LinePlotRendererF from './LinePlotRenderer'\nimport LinearWiggleDisplayF from './LinearWiggleDisplay'\nimport MultiLinearWiggleDisplayF from './MultiLinearWiggleDisplay'\nimport MultiXYPlotRendererF from './MultiXYPlotRenderer'\nimport MultiRowXYPlotRendererF from './MultiRowXYPlotRenderer'\nimport MultiDensityRendererF from './MultiDensityRenderer'\nimport MultiLineRendererF from './MultiLineRenderer'\nimport MultiRowLineRendererF from './MultiRowLineRenderer'\nimport CreateMultiWiggleExtensionF from './CreateMultiWiggleExtension'\nimport MultiWiggleAddTrackWorkflowF from './MultiWiggleAddTrackWorkflow'\n\nimport * as utils from './util'\n\nimport {\n WiggleGetGlobalQuantitativeStats,\n WiggleGetMultiRegionQuantitativeStats,\n MultiWiggleGetSources,\n} from './WiggleRPC/rpcMethods'\n\nimport {\n ReactComponent as LinearWiggleDisplayReactComponent,\n modelFactory as linearWiggleDisplayModelFactory,\n} from './LinearWiggleDisplay'\n\nimport {\n ReactComponent as XYPlotRendererReactComponent,\n configSchema as xyPlotRendererConfigSchema,\n XYPlotRenderer,\n} from './XYPlotRenderer'\n\nexport default class WigglePlugin extends Plugin {\n name = 'WigglePlugin'\n\n install(pm: PluginManager) {\n MultiWiggleAdapterF(pm)\n BigWigAdapterF(pm)\n QuantitativeTrackF(pm)\n MultiQuantitativeTrackF(pm)\n LinearWiggleDisplayF(pm)\n MultiLinearWiggleDisplayF(pm)\n LinePlotRendererF(pm)\n XYPlotRendererF(pm)\n DensityRendererF(pm)\n MultiXYPlotRendererF(pm)\n MultiRowXYPlotRendererF(pm)\n MultiDensityRendererF(pm)\n MultiLineRendererF(pm)\n MultiRowLineRendererF(pm)\n MultiWiggleAddTrackWorkflowF(pm)\n CreateMultiWiggleExtensionF(pm)\n\n pm.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (cb: AdapterGuesser) => {\n return (file: FileLocation, index?: FileLocation, hint?: string) => {\n const regexGuess = /\\.(bw|bigwig)$/i\n const adapterName = 'BigWigAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n bigWigLocation: file,\n }\n\n if (regexGuess.test(fileName) && !hint) {\n return obj\n }\n if (hint === adapterName) {\n return obj\n }\n\n return cb(file, index, hint)\n }\n },\n )\n pm.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'BigWigAdapter') {\n return 'QuantitativeTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n\n pm.addRpcMethod(() => new WiggleGetGlobalQuantitativeStats(pm))\n pm.addRpcMethod(() => new WiggleGetMultiRegionQuantitativeStats(pm))\n pm.addRpcMethod(() => new MultiWiggleGetSources(pm))\n }\n\n exports = {\n LinearWiggleDisplayReactComponent,\n XYPlotRendererReactComponent,\n XYPlotRenderer,\n WiggleBaseRenderer,\n linearWiggleDisplayModelFactory,\n xyPlotRendererConfigSchema,\n utils,\n }\n}\n\nexport * from './util'\n\nexport { default as WiggleRendering } from './WiggleRendering'\nexport {\n Tooltip,\n ReactComponent as LinearWiggleDisplayReactComponent,\n modelFactory as linearWiggleDisplayModelFactory,\n} from './LinearWiggleDisplay'\nexport { type TooltipContentsComponent } from './Tooltip'\n\nexport { default as WiggleBaseRenderer } from './WiggleBaseRenderer'\n","import configSchema from './configSchema'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nexport default function MultiWiggleAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'MultiWiggleAdapter',\n displayName: 'Multi-wiggle adapter',\n configSchema,\n adapterCapabilities: [\n 'hasResolution',\n 'hasLocalStats',\n 'hasGlobalStats',\n ],\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./MultiWiggleAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function BigWigAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BigWigAdapter',\n displayName: 'BigWig adapter',\n configSchema,\n adapterCapabilities: [\n 'hasResolution',\n 'hasLocalStats',\n 'hasGlobalStats',\n ],\n getAdapterClass: () => import('./BigWigAdapter').then(r => r.default),\n }),\n )\n}\n","import { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaF from './configSchema'\n\nexport default function QuantitativeTrackF(pluginManager: PluginManager) {\n pluginManager.addTrackType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new TrackType({\n name: 'QuantitativeTrack',\n displayName: 'Quantitative track',\n configSchema,\n stateModel: createBaseTrackModel(\n pluginManager,\n 'QuantitativeTrack',\n configSchema,\n ),\n })\n })\n}\n","import { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaF from './configSchema'\n\nexport default function MultiQuantitativeTrackF(pluginManager: PluginManager) {\n pluginManager.addTrackType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new TrackType({\n name: 'MultiQuantitativeTrack',\n displayName: 'Multi-quantitative track',\n configSchema,\n stateModel: createBaseTrackModel(\n pluginManager,\n 'MultiQuantitativeTrack',\n configSchema,\n ),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes/models'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config MultiQuantitativeTrack\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) => {\n return ConfigurationSchema(\n 'MultiQuantitativeTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n}\n\nexport default configSchema\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\nimport configSchemaFactory from './models/configSchema'\nimport modelFactory from './models/model'\nimport { lazy } from 'react'\n\nexport default function LinearWiggleDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n const stateModel = modelFactory(pluginManager, configSchema)\n return new DisplayType({\n name: 'LinearWiggleDisplay',\n displayName: 'Wiggle display',\n configSchema,\n stateModel,\n trackType: 'QuantitativeTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: lazy(() => import('./components/WiggleDisplayComponent')),\n })\n })\n}\n\nexport { default as Tooltip } from './components/Tooltip'\nexport { default as ReactComponent } from './components/WiggleDisplayComponent'\nexport { default as modelFactory } from './models/model'\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport sharedWiggleConfigFactory from '../../shared/configShared'\n\n/**\n * #config LinearWiggleDisplay\n * extends\n * - [SharedWiggleDisplay](../sharedwiggledisplay)\n */\nexport default function WiggleConfigFactory(pluginManager: PluginManager) {\n const XYPlotRendererConfigSchema =\n pluginManager.getRendererType('XYPlotRenderer')!.configSchema\n const DensityRendererConfigSchema =\n pluginManager.getRendererType('DensityRenderer')!.configSchema\n const LinePlotRendererConfigSchema =\n pluginManager.getRendererType('LinePlotRenderer')!.configSchema\n\n return ConfigurationSchema(\n 'LinearWiggleDisplay',\n {\n /**\n * #slot\n */\n defaultRendering: {\n type: 'stringEnum',\n model: types.enumeration('Rendering', ['density', 'xyplot', 'line']),\n defaultValue: 'xyplot',\n },\n /**\n * #slot\n */\n renderers: ConfigurationSchema('RenderersConfiguration', {\n DensityRenderer: DensityRendererConfigSchema,\n XYPlotRenderer: XYPlotRendererConfigSchema,\n LinePlotRenderer: LinePlotRendererConfigSchema,\n }),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: sharedWiggleConfigFactory(),\n explicitlyTyped: true,\n },\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\n\nimport configSchemaFactory from './models/configSchema'\nimport modelFactory from './models/model'\nimport { lazy } from 'react'\n\nexport default function MultiLinearWiggleDisplayF(\n pluginManager: PluginManager,\n) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'MultiLinearWiggleDisplay',\n displayName: 'Multi-wiggle display',\n configSchema,\n stateModel: modelFactory(pluginManager, configSchema),\n trackType: 'MultiQuantitativeTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: lazy(() => import('./components/WiggleDisplayComponent')),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport sharedWiggleConfigFactory from '../../shared/configShared'\n\n/**\n * #config MultiLinearWiggleDisplay\n * extends\n * - [SharedWiggleDisplay](../sharedwiggledisplay)\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default function WiggleConfigFactory(pluginManager: PluginManager) {\n const MultiXYPlotRendererConfigSchema = pluginManager.getRendererType(\n 'MultiXYPlotRenderer',\n )!.configSchema\n const MultiDensityRendererConfigSchema = pluginManager.getRendererType(\n 'MultiDensityRenderer',\n )!.configSchema\n const MultiRowXYPlotRendererConfigSchema = pluginManager.getRendererType(\n 'MultiRowXYPlotRenderer',\n )!.configSchema\n const MultiLineRendererConfigSchema =\n pluginManager.getRendererType('MultiLineRenderer')!.configSchema\n const MultiRowLineRendererConfigSchema = pluginManager.getRendererType(\n 'MultiRowLineRenderer',\n )!.configSchema\n\n return ConfigurationSchema(\n 'MultiLinearWiggleDisplay',\n {\n /**\n * #slot\n */\n defaultRendering: {\n type: 'stringEnum',\n model: types.enumeration('Rendering', [\n 'multirowxy',\n 'xyplot',\n 'multirowdensity',\n 'multiline',\n 'multirowline',\n ]),\n defaultValue: 'multirowxy',\n },\n\n /**\n * #slot\n */\n renderers: ConfigurationSchema('RenderersConfiguration', {\n MultiXYPlotRenderer: MultiXYPlotRendererConfigSchema,\n MultiDensityRenderer: MultiDensityRendererConfigSchema,\n MultiRowXYPlotRenderer: MultiRowXYPlotRendererConfigSchema,\n MultiLineRenderer: MultiLineRendererConfigSchema,\n MultiRowLineRenderer: MultiRowLineRendererConfigSchema,\n }),\n\n /**\n * #slot\n */\n height: {\n type: 'number',\n defaultValue: 200,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: sharedWiggleConfigFactory(),\n explicitlyTyped: true,\n },\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\nimport ReactComponent from '../WiggleRendering'\nimport LinePlotRenderer from './LinePlotRenderer'\n\nexport default function LinePlotRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new LinePlotRenderer({\n name: 'LinePlotRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import ReactComponent from '../WiggleRendering'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport XYPlotRenderer from './XYPlotRenderer'\nimport configSchema from './configSchema'\n\nexport default function XYPlotRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new XYPlotRenderer({\n name: 'XYPlotRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n\nexport { default as XYPlotRenderer } from './XYPlotRenderer'\nexport { default as ReactComponent } from '../WiggleRendering'\nexport { default as configSchema } from './configSchema'\n","import configSchema from './configSchema'\n\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport DensityRenderer from './DensityRenderer'\nimport ReactComponent from '../WiggleRendering'\n\nexport default function DensityRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new DensityRenderer({\n name: 'DensityRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport ReactComponent from '../MultiWiggleRendering'\nimport MultiXYPlotRenderer from './MultiXYPlotRenderer'\nimport configSchema from './configSchema'\n\nexport default function MultiXYPlotRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new MultiXYPlotRenderer({\n name: 'MultiXYPlotRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport ReactComponent from '../MultiWiggleRendering'\nimport MultiRowXYPlotRenderer from './MultiRowXYPlotRenderer'\nimport configSchema from './configSchema'\n\nexport default function MultiRowXYPlotRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new MultiRowXYPlotRenderer({\n name: 'MultiRowXYPlotRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\nimport ReactComponent from '../MultiWiggleRendering'\nimport MultiDensityRenderer from './MultiDensityRenderer'\n\nexport default function MultiDensityRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new MultiDensityRenderer({\n name: 'MultiDensityRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport ReactComponent from '../MultiWiggleRendering'\nimport MultiLineRenderer from './MultiLineRenderer'\nimport configSchema from './configSchema'\n\nexport default function MultiLineRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new MultiLineRenderer({\n name: 'MultiLineRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport ReactComponent from '../MultiWiggleRendering'\nimport MultiRowLineRenderer from './MultiRowLineRenderer'\nimport configSchema from './configSchema'\n\nexport default function MultiRowLineRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new MultiRowLineRenderer({\n name: 'MultiRowLineRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AddTrackWorkflowType } from '@jbrowse/core/pluggableElementTypes'\nimport { types } from 'mobx-state-tree'\n\n// locals\nimport { lazy } from 'react'\n\nexport default function MultiWiggleAddTrackWorkflowF(pm: PluginManager) {\n pm.addAddTrackWorkflowType(\n () =>\n new AddTrackWorkflowType({\n name: 'Multi-wiggle track',\n ReactComponent: lazy(() => import('./AddTrackWorkflow')),\n stateModel: types.model({}),\n }),\n )\n}\n","import React from 'react'\nimport { useTheme } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { Axis, LEFT, RIGHT } from 'react-d3-axis-mod'\nimport type { axisPropsFromTickScale } from 'react-d3-axis-mod'\n\ntype Ticks = ReturnType<typeof axisPropsFromTickScale>\n\nconst YScaleBar = observer(function ({\n model,\n orientation,\n}: {\n model: { ticks?: Ticks }\n orientation?: string\n}) {\n const { ticks } = model\n const theme = useTheme()\n return ticks ? (\n <Axis\n {...ticks}\n shadow={2}\n format={(n: number) => n}\n style={{ orient: orientation === 'left' ? LEFT : RIGHT }}\n bg={theme.palette.background.default}\n fg={theme.palette.text.primary}\n />\n ) : null\n})\n\nexport default YScaleBar\n","import {\n scaleLinear,\n scaleLog,\n scaleQuantize,\n} from '@mui/x-charts-vendor/d3-scale'\nimport { autorun } from 'mobx'\nimport {\n isAbortException,\n getSession,\n getContainingView,\n} from '@jbrowse/core/util'\nimport { QuantitativeStats } from '@jbrowse/core/util/stats'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { addDisposer, isAlive } from 'mobx-state-tree'\n\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport { AnyConfigurationModel, getConf } from '@jbrowse/core/configuration'\n\ntype LGV = LinearGenomeViewModel\n\nexport const YSCALEBAR_LABEL_OFFSET = 5\n\nexport interface ScaleOpts {\n domain: number[]\n range: number[]\n scaleType: string\n pivotValue?: number\n inverted?: boolean\n}\n\nexport interface Source {\n baseUri?: string\n name: string\n color?: string\n group?: string\n}\n\n/**\n * produces a d3-scale from arguments. applies a \"nice domain\" adjustment\n *\n * @param object - containing attributes\n * - domain [min,max]\n * - range [min,max]\n * - bounds [min,max]\n * - scaleType (linear or log)\n * - pivotValue (number)\n * - inverted (boolean)\n */\nexport function getScale({\n domain = [],\n range = [],\n scaleType,\n pivotValue,\n inverted,\n}: ScaleOpts) {\n let scale:\n | ReturnType<typeof scaleLinear<number>>\n | ReturnType<typeof scaleLog<number>>\n | ReturnType<typeof scaleQuantize<number>>\n const [min, max] = domain\n if (min === undefined || max === undefined) {\n throw new Error('invalid domain')\n }\n if (scaleType === 'linear') {\n scale = scaleLinear()\n } else if (scaleType === 'log') {\n scale = scaleLog().base(2)\n } else if (scaleType === 'quantize') {\n scale = scaleQuantize()\n } else {\n throw new Error('undefined scaleType')\n }\n scale.domain(pivotValue !== undefined ? [min, pivotValue, max] : [min, max])\n scale.nice()\n\n const [rangeMin, rangeMax] = range\n if (rangeMin === undefined || rangeMax === undefined) {\n throw new Error('invalid range')\n }\n scale.range(inverted ? range.slice().reverse() : range)\n return scale\n}\n/**\n * gets the origin for drawing the graph. for linear this is 0, for log this is arbitrarily set to log(1)==0\n *\n * @param scaleType -\n */\nexport function getOrigin(scaleType: string /* , pivot, stats */) {\n // if (pivot) {\n // if (pivot === 'mean') {\n // return stats.scoreMean || 0\n // }\n // if (pivot === 'zero') {\n // return 0\n // }\n // return parseFloat()\n // }\n // if (scaleType === 'z_score') {\n // return stats.scoreMean || 0\n // }\n if (scaleType === 'log') {\n return 1\n }\n return 0\n}\n\n/**\n * produces a \"nice\" domain that actually rounds down to 0 for the min\n * or 0 to the max depending on if all values are positive or negative\n *\n * @param object - containing attributes\n * - domain [min,max]\n * - bounds [min,max]\n * - mean\n * - stddev\n * - scaleType (linear or log)\n */\nexport function getNiceDomain({\n scaleType,\n domain,\n bounds,\n}: {\n scaleType: string\n domain: readonly [number, number]\n bounds: readonly [number | undefined, number | undefined]\n}) {\n const [minScore, maxScore] = bounds\n let [min, max] = domain\n\n if (scaleType === 'linear') {\n if (max < 0) {\n max = 0\n }\n if (min > 0) {\n min = 0\n }\n }\n if (scaleType === 'log') {\n // for min>0 and max>1, set log min to 1, which works for most coverage\n // types tracks. if max is not >1, might be like raw p-values so then it'll\n // display negative values\n if (min >= 0 && max > 1) {\n min = 1\n }\n }\n\n if (minScore !== undefined && minScore !== Number.MIN_VALUE) {\n min = minScore\n }\n if (maxScore !== undefined && maxScore !== Number.MAX_VALUE) {\n max = maxScore\n }\n const getScaleType = (type: string) => {\n if (type === 'linear') {\n return scaleLinear()\n }\n if (type === 'log') {\n const scale = scaleLog()\n scale.base(2)\n return scale\n }\n if (type === 'quantize') {\n return scaleQuantize()\n }\n throw new Error(`undefined scaleType ${type}`)\n }\n const scale = getScaleType(scaleType)\n\n scale.domain([min, max])\n scale.nice()\n return scale.domain() as [number, number]\n}\n\nexport async function getQuantitativeStats(\n self: {\n adapterConfig: AnyConfigurationModel\n configuration: AnyConfigurationModel\n autoscaleType: string\n setMessage: (str: string) => void\n },\n opts: {\n headers?: Record<string, string>\n signal?: AbortSignal\n filters: string[]\n },\n): Promise<QuantitativeStats> {\n const { rpcManager } = getSession(self)\n const numStdDev = getConf(self, 'numStdDev') || 3\n const { adapterConfig, autoscaleType } = self\n const sessionId = getRpcSessionId(self)\n const params = {\n sessionId,\n adapterConfig,\n statusCallback: (message: string) => {\n if (isAlive(self)) {\n self.setMessage(message)\n }\n },\n ...opts,\n }\n\n if (autoscaleType === 'global' || autoscaleType === 'globalsd') {\n const results = (await rpcManager.call(\n sessionId,\n 'WiggleGetGlobalQuantitativeStats',\n params,\n )) as QuantitativeStats\n const { scoreMin, scoreMean, scoreStdDev } = results\n // globalsd uses heuristic to avoid unnecessary scoreMin<0\n // if the scoreMin is never less than 0\n // helps with most coverage bigwigs just being >0\n return autoscaleType === 'globalsd'\n ? {\n ...results,\n scoreMin: scoreMin >= 0 ? 0 : scoreMean - numStdDev * scoreStdDev,\n scoreMax: scoreMean + numStdDev * scoreStdDev,\n }\n : results\n }\n if (autoscaleType === 'local' || autoscaleType === 'localsd') {\n const { dynamicBlocks, bpPerPx } = getContainingView(self) as LGV\n const results = (await rpcManager.call(\n sessionId,\n 'WiggleGetMultiRegionQuantitativeStats',\n {\n ...params,\n regions: dynamicBlocks.contentBlocks.map(region => {\n const { start, end } = region\n return {\n ...JSON.parse(JSON.stringify(region)),\n start: Math.floor(start),\n end: Math.ceil(end),\n }\n }),\n bpPerPx,\n },\n )) as QuantitativeStats\n const { scoreMin, scoreMean, scoreStdDev } = results\n\n // localsd uses heuristic to avoid unnecessary scoreMin<0 if the\n // scoreMin is never less than 0 helps with most coverage bigwigs\n // just being >0\n return autoscaleType === 'localsd'\n ? {\n ...results,\n scoreMin: scoreMin >= 0 ? 0 : scoreMean - numStdDev * scoreStdDev,\n scoreMax: scoreMean + numStdDev * scoreStdDev,\n }\n : results\n }\n if (autoscaleType === 'zscale') {\n return rpcManager.call(\n sessionId,\n 'WiggleGetGlobalQuantitativeStats',\n params,\n ) as Promise<QuantitativeStats>\n }\n throw new Error(`invalid autoscaleType '${autoscaleType}'`)\n}\n\nexport function quantitativeStatsAutorun(self: {\n featureDensityStatsReady: boolean\n regionTooLarge: boolean\n error: unknown\n setLoading: (aborter: AbortController) => void\n setError: (error: unknown) => void\n updateQuantitativeStats: (\n stats: QuantitativeStats,\n statsRegion: string,\n ) => void\n renderProps: () => Record<string, unknown>\n configuration: AnyConfigurationModel\n adapterConfig: AnyConfigurationModel\n autoscaleType: string\n setMessage: (str: string) => void\n}) {\n addDisposer(\n self,\n autorun(\n async () => {\n try {\n const aborter = new AbortController()\n const view = getContainingView(self) as LGV\n self.setLoading(aborter)\n\n if (\n !view.initialized ||\n !self.featureDensityStatsReady ||\n self.regionTooLarge ||\n self.error\n ) {\n return\n }\n const statsRegion = JSON.stringify(view.dynamicBlocks)\n\n const wiggleStats = await getQuantitativeStats(self, {\n signal: aborter.signal,\n filters: [],\n ...self.renderProps(),\n })\n\n if (isAlive(self)) {\n self.updateQuantitativeStats(wiggleStats, statsRegion)\n }\n } catch (e) {\n if (!isAbortException(e) && isAlive(self)) {\n console.error(e)\n self.setError(e)\n }\n }\n },\n { delay: 1000 },\n ),\n )\n}\n\nexport function toP(s = 0) {\n return +(+s).toPrecision(6)\n}\n\nexport function round(value: number) {\n return Math.round(value * 1e5) / 1e5\n}\n\n// avoid drawing negative width features for SVG exports\nexport function fillRectCtx(\n x: number,\n y: number,\n width: number,\n height: number,\n ctx: CanvasRenderingContext2D,\n color?: string,\n) {\n if (width < 0) {\n x += width\n width = -width\n }\n if (height < 0) {\n y += height\n height = -height\n }\n\n if (color) {\n ctx.fillStyle = color\n }\n ctx.fillRect(x, y, width, height)\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport { BaseInternetAccountConfig } from '@jbrowse/core/pluggableElementTypes/models'\n\n/**\n * #config OAuthInternetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst OAuthConfigSchema = ConfigurationSchema(\n 'OAuthInternetAccount',\n {\n /**\n * #slot\n */\n tokenType: {\n description: 'a custom name for a token to include in the header',\n type: 'string',\n defaultValue: 'Bearer',\n },\n /**\n * #slot\n */\n authEndpoint: {\n description: 'the authorization code endpoint of the internet account',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n tokenEndpoint: {\n description: 'the token endpoint of the internet account',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n needsPKCE: {\n description: 'boolean to indicate if the endpoint needs a PKCE code',\n type: 'boolean',\n defaultValue: false,\n },\n /**\n * #slot\n */\n clientId: {\n description: 'id for the OAuth application',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n scopes: {\n description: 'optional scopes for the authorization call',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n state: {\n description: 'optional state for the authorization call',\n type: 'string',\n defaultValue: '',\n },\n /**\n * #slot\n */\n responseType: {\n description:\n \"the type of response from the authorization endpoint. can be 'token' or 'code'\",\n type: 'string',\n defaultValue: 'code',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: BaseInternetAccountConfig,\n explicitlyTyped: true,\n },\n)\n\nexport type OAuthInternetAccountConfigModel = typeof OAuthConfigSchema\nexport type OAuthInternetAccountConfig =\n Instance<OAuthInternetAccountConfigModel>\nexport default OAuthConfigSchema\n","export function fixup(buf: string) {\n return buf.replaceAll('+', '-').replaceAll('/', '_').replaceAll('=', '')\n}\n\nexport async function generateChallenge(val: string) {\n const sha256 = await import('crypto-js/sha256').then(f => f.default)\n const Base64 = await import('crypto-js/enc-base64')\n return fixup(Base64.stringify(sha256(val)))\n}\n\n// if response is JSON, checks if it needs to remove tokens in error, or just plain throw\nexport function processError(text: string, invalidErrorCb: () => void) {\n try {\n const obj = JSON.parse(text)\n if (obj.error === 'invalid_grant') {\n invalidErrorCb()\n }\n return obj?.error_description ?? text\n } catch (e) {\n /* response text is not json, just use original text as error */\n }\n return text\n}\n\nexport function processTokenResponse(\n data: { refresh_token?: string; access_token: string },\n storeRefreshTokenCb: (str: string) => void,\n) {\n if (data.refresh_token) {\n storeRefreshTokenCb(data.refresh_token)\n }\n return data.access_token\n}\n","export async function getResponseError({\n response,\n reason,\n statusText,\n}: {\n response: Response\n reason?: string\n statusText?: string\n}) {\n return [\n `HTTP ${response.status}`,\n reason,\n statusText ?? (await getError(response)),\n ]\n .filter(f => !!f)\n .join(' - ')\n}\n\nexport async function getError(response: Response) {\n try {\n return await response.text()\n } catch (e) {\n return response.statusText\n }\n}\n","import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'\nimport { InternetAccount } from '@jbrowse/core/pluggableElementTypes/models'\nimport { isElectron, UriLocation } from '@jbrowse/core/util'\nimport { Instance, types } from 'mobx-state-tree'\nimport { Buffer } from 'buffer'\n\n// locals\nimport { OAuthInternetAccountConfigModel } from './configSchema'\nimport {\n fixup,\n generateChallenge,\n processError,\n processTokenResponse,\n} from './util'\nimport { getResponseError } from '../util'\n\ninterface OAuthData {\n client_id: string\n redirect_uri: string\n response_type: 'token' | 'code'\n scope?: string\n code_challenge?: string\n code_challenge_method?: string\n token_access_type?: string\n state?: string\n}\n\n/**\n * #stateModel OAuthInternetAccount\n */\nconst stateModelFactory = (configSchema: OAuthInternetAccountConfigModel) => {\n return InternetAccount.named('OAuthInternetAccount')\n .props({\n /**\n * #property\n */\n type: types.literal('OAuthInternetAccount'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .views(() => {\n let codeVerifier: string | undefined = undefined\n return {\n /**\n * #getter\n */\n get codeVerifierPKCE() {\n if (codeVerifier) {\n return codeVerifier\n }\n const array = new Uint8Array(32)\n globalThis.crypto.getRandomValues(array)\n codeVerifier = fixup(Buffer.from(array).toString('base64'))\n return codeVerifier\n },\n }\n })\n .views(self => ({\n /**\n * #getter\n */\n get authEndpoint(): string {\n return getConf(self, 'authEndpoint')\n },\n /**\n * #getter\n */\n get tokenEndpoint(): string {\n return getConf(self, 'tokenEndpoint')\n },\n /**\n * #getter\n */\n get needsPKCE(): boolean {\n return getConf(self, 'needsPKCE')\n },\n /**\n * #getter\n */\n get clientId(): string {\n return getConf(self, 'clientId')\n },\n /**\n * #getter\n */\n get scopes(): string {\n return getConf(self, 'scopes')\n },\n /**\n * #method\n * OAuth state parameter:\n * https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1\n *\n * Can override or extend if dynamic state is needed.\n */\n state(): string | undefined {\n return getConf(self, 'state')\n },\n /**\n * #getter\n */\n get responseType(): 'token' | 'code' {\n return getConf(self, 'responseType')\n },\n /**\n * #getter\n */\n get refreshTokenKey() {\n return `${self.internetAccountId}-refreshToken`\n },\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n storeRefreshToken(refreshToken: string) {\n localStorage.setItem(self.refreshTokenKey, refreshToken)\n },\n /**\n * #action\n */\n removeRefreshToken() {\n localStorage.removeItem(self.refreshTokenKey)\n },\n /**\n * #method\n */\n retrieveRefreshToken() {\n return localStorage.getItem(self.refreshTokenKey)\n },\n /**\n * #action\n */\n async exchangeAuthorizationForAccessToken(\n token: string,\n redirectUri: string,\n ): Promise<string> {\n const params = new URLSearchParams(\n Object.entries({\n code: token,\n grant_type: 'authorization_code',\n client_id: self.clientId,\n redirect_uri: redirectUri,\n ...(self.needsPKCE ? { code_verifier: self.codeVerifierPKCE } : {}),\n }),\n )\n\n const response = await fetch(self.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: params.toString(),\n })\n\n if (!response.ok) {\n throw new Error(\n await getResponseError({\n response,\n reason: 'Failed to obtain token',\n }),\n )\n }\n\n const data = await response.json()\n return processTokenResponse(data, token => {\n this.storeRefreshToken(token)\n })\n },\n /**\n * #action\n */\n async exchangeRefreshForAccessToken(\n refreshToken: string,\n ): Promise<string> {\n const response = await fetch(self.tokenEndpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/x-www-form-urlencoded' },\n body: new URLSearchParams(\n Object.entries({\n grant_type: 'refresh_token',\n refresh_token: refreshToken,\n client_id: self.clientId,\n }),\n ).toString(),\n })\n\n if (!response.ok) {\n self.removeToken()\n const text = await response.text()\n throw new Error(\n await getResponseError({\n response,\n statusText: processError(text, () => {\n this.removeRefreshToken()\n }),\n }),\n )\n }\n const data = await response.json()\n return processTokenResponse(data, token => {\n this.storeRefreshToken(token)\n })\n },\n }))\n .actions(self => {\n let listener: (event: MessageEvent) => undefined\n let exchangedTokenPromise: Promise<string> | undefined = undefined\n return {\n /**\n * #action\n * used to listen to child window for auth code/token\n */\n addMessageChannel(\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n listener = event => {\n // this should probably get better handling, but ignored for now\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.finishOAuthWindow(event, resolve, reject)\n }\n window.addEventListener('message', listener)\n },\n /**\n * #action\n */\n deleteMessageChannel() {\n window.removeEventListener('message', listener)\n },\n /**\n * #action\n */\n async finishOAuthWindow(\n event: MessageEvent,\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n if (\n event.data.name !== `JBrowseAuthWindow-${self.internetAccountId}`\n ) {\n this.deleteMessageChannel()\n return\n }\n const redirectUriWithInfo = event.data.redirectUri\n const fixedQueryString = redirectUriWithInfo.replace('#', '?')\n const redirectUrl = new URL(fixedQueryString)\n const queryStringSearch = redirectUrl.search\n const urlParams = new URLSearchParams(queryStringSearch)\n if (urlParams.has('access_token')) {\n const token = urlParams.get('access_token')\n if (!token) {\n reject(new Error('Error with token endpoint'))\n return\n }\n self.storeToken(token)\n resolve(token)\n return\n }\n if (urlParams.has('code')) {\n const code = urlParams.get('code')\n if (!code) {\n reject(new Error('Error with authorization endpoint'))\n return\n }\n try {\n const token = await self.exchangeAuthorizationForAccessToken(\n code,\n redirectUrl.origin + redirectUrl.pathname,\n )\n self.storeToken(token)\n resolve(token)\n return\n } catch (e) {\n if (e instanceof Error) {\n reject(e)\n } else {\n reject(new Error(String(e)))\n }\n return\n }\n }\n if (redirectUriWithInfo.includes('access_denied')) {\n reject(new Error('OAuth flow was cancelled'))\n return\n }\n if (redirectUriWithInfo.includes('error')) {\n reject(new Error(`OAuth flow error: ${queryStringSearch}`))\n return\n }\n this.deleteMessageChannel()\n },\n /**\n * #action\n * opens external OAuth flow, popup for web and new browser window for\n * desktop\n */\n async useEndpointForAuthorization(\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n const redirectUri = isElectron\n ? 'http://localhost/auth'\n : window.location.origin + window.location.pathname\n const data: OAuthData = {\n client_id: self.clientId,\n redirect_uri: redirectUri,\n response_type: self.responseType,\n token_access_type: 'offline',\n }\n\n if (self.state()) {\n data.state = self.state()\n }\n\n if (self.scopes) {\n data.scope = self.scopes\n }\n\n if (self.needsPKCE) {\n data.code_challenge = await generateChallenge(self.codeVerifierPKCE)\n data.code_challenge_method = 'S256'\n }\n\n const params = new URLSearchParams(Object.entries(data))\n\n const url = new URL(self.authEndpoint)\n url.search = params.toString()\n\n const eventName = `JBrowseAuthWindow-${self.internetAccountId}`\n if (isElectron) {\n const { ipcRenderer } = window.require('electron')\n const redirectUri = await ipcRenderer.invoke('openAuthWindow', {\n internetAccountId: self.internetAccountId,\n data,\n url: url.toString(),\n })\n\n const eventFromDesktop = new MessageEvent('message', {\n data: { name: eventName, redirectUri: redirectUri },\n })\n // may want to improve handling\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.finishOAuthWindow(eventFromDesktop, resolve, reject)\n } else {\n window.open(url, eventName, 'width=500,height=600,left=0,top=0')\n }\n },\n /**\n * #action\n */\n async getTokenFromUser(\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n const refreshToken = self.retrieveRefreshToken()\n let doUserFlow = true\n\n // if there is a refresh token, then try it out, and only if that\n // refresh token succeeds, set doUserFlow to false\n if (refreshToken) {\n try {\n const token =\n await self.exchangeRefreshForAccessToken(refreshToken)\n resolve(token)\n doUserFlow = false\n } catch (e) {\n console.error(e)\n self.removeRefreshToken()\n }\n }\n if (doUserFlow) {\n this.addMessageChannel(resolve, reject)\n // may want to improve handling\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.useEndpointForAuthorization(resolve, reject)\n }\n },\n /**\n * #action\n */\n async validateToken(token: string, location: UriLocation) {\n const newInit = self.addAuthHeaderToInit({ method: 'HEAD' }, token)\n const response = await fetch(location.uri, newInit)\n if (!response.ok) {\n self.removeToken()\n const refreshToken = self.retrieveRefreshToken()\n if (refreshToken) {\n try {\n if (!exchangedTokenPromise) {\n exchangedTokenPromise =\n self.exchangeRefreshForAccessToken(refreshToken)\n }\n const newToken = await exchangedTokenPromise\n exchangedTokenPromise = undefined\n return newToken\n } catch (err) {\n console.error('Token could not be refreshed', err)\n // let original error be thrown\n }\n }\n\n throw new Error(\n await getResponseError({\n response,\n reason: 'Error validating token',\n }),\n )\n }\n return token\n },\n }\n })\n .actions(self => {\n const superGetFetcher = self.getFetcher\n return {\n /**\n * #action\n * Get a fetch method that will add any needed authentication headers\n * to the request before sending it. If location is provided, it will\n * be checked to see if it includes a token in it's pre-auth\n * information.\n *\n * @param loc - UriLocation of the resource\n * @returns A function that can be used to fetch\n */\n getFetcher(loc?: UriLocation) {\n const fetcher = superGetFetcher(loc)\n return async (input: RequestInfo, init?: RequestInit) => {\n if (loc) {\n await self.validateToken(await self.getToken(loc), loc)\n }\n return fetcher(input, init)\n }\n },\n }\n })\n}\n\nexport default stateModelFactory\nexport type OAuthStateModel = ReturnType<typeof stateModelFactory>\nexport type OAuthModel = Instance<OAuthStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport { BaseInternetAccountConfig } from '@jbrowse/core/pluggableElementTypes/models'\n\n/**\n * #config ExternalTokenInternetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst ExternalTokenConfigSchema = ConfigurationSchema(\n 'ExternalTokenInternetAccount',\n {\n /**\n * #slot\n */\n validateWithHEAD: {\n description: 'validate the token with a HEAD request before using it',\n type: 'boolean',\n defaultValue: true,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: BaseInternetAccountConfig,\n explicitlyTyped: true,\n },\n)\n\nexport type ExternalTokenInternetAccountConfigModel =\n typeof ExternalTokenConfigSchema\n\nexport type ExternalTokenInternetAccountConfig =\n Instance<ExternalTokenInternetAccountConfigModel>\nexport default ExternalTokenConfigSchema\n","import React, { useState } from 'react'\nimport { Button, DialogContent, DialogActions, TextField } from '@mui/material'\nimport { Dialog } from '@jbrowse/core/ui'\n\nexport const ExternalTokenEntryForm = ({\n internetAccountId,\n handleClose,\n}: {\n internetAccountId: string\n handleClose: (token?: string) => void\n}) => {\n const [token, setToken] = useState('')\n\n return (\n <Dialog\n open\n maxWidth=\"xl\"\n data-testid=\"externalToken-form\"\n title={`Enter token for ${internetAccountId}`}\n >\n <DialogContent style={{ display: 'flex', flexDirection: 'column' }}>\n <TextField\n required\n label=\"Enter Token\"\n variant=\"outlined\"\n inputProps={{ 'data-testid': 'entry-externalToken' }}\n onChange={event => {\n setToken(event.target.value)\n }}\n margin=\"dense\"\n />\n </DialogContent>\n <DialogActions>\n <Button\n variant=\"contained\"\n color=\"primary\"\n type=\"submit\"\n disabled={!token}\n onClick={() => {\n if (token) {\n handleClose(token)\n }\n }}\n >\n Add\n </Button>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n </DialogActions>\n </Dialog>\n )\n}\n","import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'\nimport { InternetAccount } from '@jbrowse/core/pluggableElementTypes/models'\nimport { UriLocation } from '@jbrowse/core/util/types'\nimport { ExternalTokenInternetAccountConfigModel } from './configSchema'\nimport { Instance, types, getRoot } from 'mobx-state-tree'\n\nimport { ExternalTokenEntryForm } from './ExternalTokenEntryForm'\n\nconst stateModelFactory = (\n configSchema: ExternalTokenInternetAccountConfigModel,\n) => {\n return InternetAccount.named('ExternalTokenInternetAccount')\n .props({\n type: types.literal('ExternalTokenInternetAccount'),\n configuration: ConfigurationReference(configSchema),\n })\n .views(self => ({\n get validateWithHEAD(): boolean {\n return getConf(self, 'validateWithHEAD')\n },\n }))\n .actions(self => ({\n getTokenFromUser(\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n const { session } = getRoot<any>(self)\n session.queueDialog((doneCallback: () => void) => [\n ExternalTokenEntryForm,\n {\n internetAccountId: self.internetAccountId,\n handleClose: (token: string) => {\n if (token) {\n resolve(token)\n } else {\n reject(new Error('user cancelled entry'))\n }\n doneCallback()\n },\n },\n ])\n },\n async validateToken(token: string, location: UriLocation) {\n if (!self.validateWithHEAD) {\n return token\n }\n const newInit = self.addAuthHeaderToInit({ method: 'HEAD' }, token)\n const response = await fetch(location.uri, newInit)\n if (!response.ok) {\n let errorMessage: string\n try {\n errorMessage = await response.text()\n } catch (error) {\n errorMessage = ''\n }\n throw new Error(\n `Token could not be validated — ${response.status} ${errorMessage ? ` (${errorMessage})` : ''}`,\n )\n }\n return token\n },\n }))\n}\n\nexport default stateModelFactory\nexport type ExternalTokenStateModel = ReturnType<typeof stateModelFactory>\nexport type ExternalTokenModel = Instance<ExternalTokenStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport { BaseInternetAccountConfig } from '@jbrowse/core/pluggableElementTypes/models'\n\n/**\n * #config HTTPBasicInternetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst HTTPBasicConfigSchema = ConfigurationSchema(\n 'HTTPBasicInternetAccount',\n {\n /**\n * #slot\n */\n tokenType: {\n description: 'a custom name for a token to include in the header',\n type: 'string',\n defaultValue: 'Basic',\n },\n /**\n * #slot\n */\n validateWithHEAD: {\n description: 'validate the token with a HEAD request before using it',\n type: 'boolean',\n defaultValue: true,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: BaseInternetAccountConfig,\n explicitlyTyped: true,\n },\n)\n\nexport type HTTPBasicInternetAccountConfigModel = typeof HTTPBasicConfigSchema\n\nexport type HTTPBasicInternetAccountConfig =\n Instance<HTTPBasicInternetAccountConfigModel>\nexport default HTTPBasicConfigSchema\n","import React, { useState } from 'react'\nimport { Button, DialogContent, DialogActions, TextField } from '@mui/material'\nimport { Dialog } from '@jbrowse/core/ui'\n\nexport function HTTPBasicLoginForm({\n internetAccountId,\n handleClose,\n}: {\n internetAccountId: string\n handleClose: (arg?: string) => void\n}) {\n const [username, setUsername] = useState('')\n const [password, setPassword] = useState('')\n\n return (\n <Dialog\n open\n maxWidth=\"xl\"\n data-testid=\"login-httpbasic\"\n title={`Log in for ${internetAccountId}`}\n >\n <form\n onSubmit={event => {\n if (username && password) {\n handleClose(btoa(`${username}:${password}`))\n } else {\n handleClose()\n }\n event.preventDefault()\n }}\n >\n <DialogContent style={{ display: 'flex', flexDirection: 'column' }}>\n <TextField\n required\n label=\"Username\"\n variant=\"outlined\"\n inputProps={{ 'data-testid': 'login-httpbasic-username' }}\n onChange={event => {\n setUsername(event.target.value)\n }}\n margin=\"dense\"\n />\n <TextField\n required\n label=\"Password\"\n type=\"password\"\n autoComplete=\"current-password\"\n variant=\"outlined\"\n inputProps={{ 'data-testid': 'login-httpbasic-password' }}\n onChange={event => {\n setPassword(event.target.value)\n }}\n margin=\"dense\"\n />\n </DialogContent>\n <DialogActions>\n <Button variant=\"contained\" color=\"primary\" type=\"submit\">\n Submit\n </Button>\n <Button\n variant=\"contained\"\n color=\"secondary\"\n type=\"submit\"\n onClick={() => {\n handleClose()\n }}\n >\n Cancel\n </Button>\n </DialogActions>\n </form>\n </Dialog>\n )\n}\n","import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'\nimport { InternetAccount } from '@jbrowse/core/pluggableElementTypes/models'\nimport { UriLocation } from '@jbrowse/core/util/types'\nimport { Instance, types, getRoot } from 'mobx-state-tree'\n\n// locals\nimport { HTTPBasicInternetAccountConfigModel } from './configSchema'\nimport { HTTPBasicLoginForm } from './HTTPBasicLoginForm'\nimport { getResponseError } from '../util'\n\n/**\n * #stateModel HTTPBasicInternetAccount\n */\nconst stateModelFactory = (\n configSchema: HTTPBasicInternetAccountConfigModel,\n) => {\n return InternetAccount.named('HTTPBasicInternetAccount')\n .props({\n /**\n * #property\n */\n type: types.literal('HTTPBasicInternetAccount'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .views(self => ({\n /**\n * #getter\n */\n get validateWithHEAD(): boolean {\n return getConf(self, 'validateWithHEAD')\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n getTokenFromUser(\n resolve: (token: string) => void,\n reject: (error: Error) => void,\n ) {\n const { session } = getRoot<any>(self)\n session.queueDialog((doneCallback: () => void) => [\n HTTPBasicLoginForm,\n {\n internetAccountId: self.internetAccountId,\n handleClose: (token: string) => {\n if (token) {\n resolve(token)\n } else {\n reject(new Error('User cancelled entry'))\n }\n doneCallback()\n },\n },\n ])\n },\n /**\n * #action\n */\n async validateToken(token: string, location: UriLocation) {\n if (!self.validateWithHEAD) {\n return token\n }\n const newInit = self.addAuthHeaderToInit({ method: 'HEAD' }, token)\n const response = await fetch(location.uri, newInit)\n if (!response.ok) {\n throw new Error(\n await getResponseError({\n response,\n reason: 'Error validating token',\n }),\n )\n }\n return token\n },\n }))\n}\n\nexport default stateModelFactory\nexport type HTTPBasicStateModel = ReturnType<typeof stateModelFactory>\nexport type HTTPBasicModel = Instance<HTTPBasicStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport OAuthConfigSchema from '../OAuthModel/configSchema'\n\n/**\n * #config DropboxOAuthInternetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst DropboxOAuthConfigSchema = ConfigurationSchema(\n 'DropboxOAuthInternetAccount',\n {\n /**\n * #slot\n */\n authEndpoint: {\n description: 'the authorization code endpoint of the internet account',\n type: 'string',\n defaultValue: 'https://www.dropbox.com/oauth2/authorize',\n },\n /**\n * #slot\n */\n tokenEndpoint: {\n description: 'the token endpoint of the internet account',\n type: 'string',\n defaultValue: 'https://api.dropbox.com/oauth2/token',\n },\n /**\n * #slot\n */\n needsPKCE: {\n description: 'boolean to indicate if the endpoint needs a PKCE code',\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n domains: {\n description:\n 'array of valid domains the url can contain to use this account',\n type: 'stringArray',\n defaultValue: [\n 'addtodropbox.com',\n 'db.tt',\n 'dropbox.com',\n 'dropboxapi.com',\n 'dropboxbusiness.com',\n 'dropbox.tech',\n 'getdropbox.com',\n ],\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: OAuthConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport type DropboxOAuthInternetAccountConfigModel =\n typeof DropboxOAuthConfigSchema\n\nexport type DropboxOAuthInternetAccountConfig =\n Instance<DropboxOAuthInternetAccountConfigModel>\nexport default DropboxOAuthConfigSchema\n","import { getResponseError } from '../util'\n\ninterface DropboxError {\n error_summary: string\n error: {\n '.tag': string\n }\n}\n\n/**\n * Error messages from\n * https://www.dropbox.com/developers/documentation/http/documentation#sharing-get_shared_link_file\n * */\nconst dropboxErrorMessages: Record<string, string> = {\n shared_link_not_found: \"The shared link wasn't found.\",\n shared_link_access_denied:\n 'The caller is not allowed to access this shared link.',\n unsupported_link_type:\n 'This type of link is not supported; use files/export instead.',\n shared_link_is_directory: 'Directories cannot be retrieved by this endpoint.',\n}\n\nexport async function getDescriptiveErrorMessage(\n response: Response,\n reason?: string,\n) {\n let errorMessage = ''\n try {\n const err = JSON.parse(await response.text()) as DropboxError\n const tag = err.error['.tag']\n errorMessage = dropboxErrorMessages[tag] || tag\n } catch (error) {\n /* do nothing */\n }\n return getResponseError({ response, reason, statusText: errorMessage })\n}\n","import React from 'react'\nimport { SvgIcon, SvgIconProps } from '@mui/material'\n\nexport default function DropboxIcon(props: SvgIconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M3 6.2L8 9.39L13 6.2L8 3L3 6.2M13 6.2L18 9.39L23 6.2L18 3L13 6.2M3 12.55L8 15.74L13 12.55L8 9.35L3 12.55M18 9.35L13 12.55L18 15.74L23 12.55L18 9.35M8.03 16.8L13.04 20L18.04 16.8L13.04 13.61L8.03 16.8Z\" />\n </SvgIcon>\n )\n}\n","import React from 'react'\nimport { ConfigurationReference } from '@jbrowse/core/configuration'\nimport { UriLocation } from '@jbrowse/core/util/types'\nimport { Instance, types } from 'mobx-state-tree'\n\n// locals\nimport { DropboxOAuthInternetAccountConfigModel } from './configSchema'\nimport baseModel from '../OAuthModel/model'\nimport { configSchema as OAuthConfigSchema } from '../OAuthModel'\nimport { getDescriptiveErrorMessage } from './util'\nimport DropboxIcon from './DropboxIcon'\n\n/**\n * #stateModel DropboxOAuthInternetAccount\n */\nconst stateModelFactory = (\n configSchema: DropboxOAuthInternetAccountConfigModel,\n) => {\n return baseModel(OAuthConfigSchema)\n .named('DropboxOAuthInternetAccount')\n .props({\n /**\n * #property\n */\n type: types.literal('DropboxOAuthInternetAccount'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .views(() => ({\n /**\n * #getter\n * The FileSelector icon for Dropbox\n */\n get toggleContents() {\n return <DropboxIcon />\n },\n /**\n * #getter\n */\n get selectorLabel() {\n return 'Enter Dropbox share link'\n },\n }))\n .actions(self => ({\n /**\n * #method\n */\n getFetcher(location?: UriLocation) {\n return async (input: RequestInfo, init?: RequestInit) => {\n const authToken = await self.getToken(location)\n const newInit = self.addAuthHeaderToInit(\n { ...init, method: 'POST' },\n authToken,\n )\n newInit.headers.append(\n 'Dropbox-API-Arg',\n JSON.stringify({ url: input }),\n )\n const response = await fetch(\n 'https://content.dropboxapi.com/2/sharing/get_shared_link_file',\n newInit,\n )\n if (!response.ok) {\n throw new Error(await getDescriptiveErrorMessage(response))\n }\n return response\n }\n },\n /**\n * #action\n */\n async validateToken(\n token: string,\n location: UriLocation,\n ): Promise<string> {\n const response = await fetch(\n 'https://api.dropboxapi.com/2/sharing/get_shared_link_metadata',\n {\n method: 'POST',\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/json',\n },\n body: JSON.stringify({\n url: location.uri,\n }),\n },\n )\n if (!response.ok) {\n const refreshToken = self.retrieveRefreshToken()\n if (refreshToken) {\n self.removeRefreshToken()\n const newToken =\n await self.exchangeRefreshForAccessToken(refreshToken)\n return this.validateToken(newToken, location)\n }\n throw new Error(\n await getDescriptiveErrorMessage(\n response,\n 'Token could not be validated',\n ),\n )\n }\n return token\n },\n }))\n}\n\nexport default stateModelFactory\nexport type DropboxOAuthStateModel = ReturnType<typeof stateModelFactory>\nexport type DropboxOAuthModel = Instance<DropboxOAuthStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { Instance } from 'mobx-state-tree'\nimport OAuthConfigSchema from '../OAuthModel/configSchema'\n\n/**\n * #config GoogleDriveOAuthInternetAccount\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst GoogleDriveOAuthConfigSchema = ConfigurationSchema(\n 'GoogleDriveOAuthInternetAccount',\n {\n /**\n * #slot\n */\n authEndpoint: {\n description: 'the authorization code endpoint of the internet account',\n type: 'string',\n defaultValue: 'https://accounts.google.com/o/oauth2/v2/auth',\n },\n /**\n * #slot\n */\n scopes: {\n description: 'optional scopes for the authorization call',\n type: 'string',\n defaultValue: 'https://www.googleapis.com/auth/drive.readonly',\n },\n /**\n * #slot\n */\n domains: {\n description:\n 'array of valid domains the url can contain to use this account',\n type: 'stringArray',\n defaultValue: ['drive.google.com\"'],\n },\n /**\n * #slot\n */\n responseType: {\n description: 'the type of response from the authorization endpoint',\n type: 'string',\n defaultValue: 'token',\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: OAuthConfigSchema,\n explicitlyTyped: true,\n },\n)\n\nexport type GoogleDriveOAuthInternetAccountConfigModel =\n typeof GoogleDriveOAuthConfigSchema\n\nexport type GoogleDriveOAuthInternetAccountConfig =\n Instance<GoogleDriveOAuthInternetAccountConfigModel>\nexport default GoogleDriveOAuthConfigSchema\n","import { getResponseError } from '../util'\n\ninterface GoogleDriveError {\n error: {\n errors: {\n domain: string\n reason: string\n message: string\n locationType?: string\n location?: string\n }[]\n code: number\n message: string\n }\n}\n\nexport async function getDescriptiveErrorMessage(\n response: Response,\n reason?: string,\n) {\n let errorMessage = ''\n try {\n const err = JSON.parse(await response.text()) as GoogleDriveError\n errorMessage = err.error.message\n } catch (error) {\n /* do nothing */\n }\n return getResponseError({ response, reason, statusText: errorMessage })\n}\n","import { RemoteFileWithRangeCache } from '@jbrowse/core/util/io'\nimport {\n FilehandleOptions,\n Stats,\n PolyfilledResponse,\n} from 'generic-filehandle'\n\nexport interface RequestInitWithMetadata extends RequestInit {\n metadataOnly?: boolean\n}\n\ninterface GoogleDriveFilehandleOptions extends FilehandleOptions {\n fetch(\n input: RequestInfo,\n opts?: RequestInitWithMetadata,\n ): Promise<PolyfilledResponse>\n}\n\nexport class GoogleDriveFile extends RemoteFileWithRangeCache {\n private statsPromise: Promise<{ size: number }>\n constructor(source: string, opts: GoogleDriveFilehandleOptions) {\n super(source, opts)\n this.statsPromise = this.fetch(source, {\n metadataOnly: true,\n }).then((response: Response) => response.json())\n }\n\n async fetch(\n input: RequestInfo,\n opts?: RequestInitWithMetadata,\n ): Promise<PolyfilledResponse> {\n return super.fetch(input, opts)\n }\n\n async stat(): Promise<Stats> {\n return this.statsPromise\n }\n}\n","import React from 'react'\nimport { SvgIconProps, SvgIcon } from '@mui/material'\n\nexport default function GoogleDriveIcon(props: SvgIconProps) {\n return (\n <SvgIcon {...props}>\n <path d=\"M7.71,3.5L1.15,15L4.58,21L11.13,9.5M9.73,15L6.3,21H19.42L22.85,15M22.28,14L15.42,2H8.58L8.57,2L15.43,14H22.28Z\" />\n </SvgIcon>\n )\n}\n","import React from 'react'\nimport { ConfigurationReference } from '@jbrowse/core/configuration'\nimport { Instance, types } from 'mobx-state-tree'\nimport { UriLocation } from '@jbrowse/core/util/types'\n\n// locals\nimport { GoogleDriveOAuthInternetAccountConfigModel } from './configSchema'\nimport baseModel from '../OAuthModel/model'\nimport { configSchema as OAuthConfigSchema } from '../OAuthModel'\nimport { getDescriptiveErrorMessage } from './util'\nimport { GoogleDriveFile } from './GoogleDriveFilehandle'\nimport GoogleDriveIcon from './GoogleDriveIcon'\n\nexport interface RequestInitWithMetadata extends RequestInit {\n metadataOnly?: boolean\n}\n\nfunction getUri(str: string) {\n const urlId = /[-\\w]{25,}/.exec(str)\n return `https://www.googleapis.com/drive/v3/files/${urlId}`\n}\n\n/**\n * #stateModel GoogleDriveOAuthInternetAccount\n */\nexport default function stateModelFactory(\n configSchema: GoogleDriveOAuthInternetAccountConfigModel,\n) {\n return baseModel(OAuthConfigSchema)\n .named('GoogleDriveOAuthInternetAccount')\n .props({\n /**\n * #property\n */\n type: types.literal('GoogleDriveOAuthInternetAccount'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .views(() => ({\n /**\n * #getter\n * The FileSelector icon for Google drive\n */\n get toggleContents() {\n return <GoogleDriveIcon />\n },\n /**\n * #getter\n */\n get selectorLabel() {\n return 'Enter Google Drive share link'\n },\n }))\n .actions(self => ({\n /**\n * #method\n */\n getFetcher(location?: UriLocation) {\n return async (input: RequestInfo, init?: RequestInitWithMetadata) => {\n const driveUrl = new URL(getUri(String(input)))\n const searchParams = new URLSearchParams()\n if (init?.metadataOnly) {\n searchParams.append('fields', 'size')\n } else {\n searchParams.append('alt', 'media')\n }\n driveUrl.search = searchParams.toString()\n const authToken = await self.getToken(location)\n const response = await fetch(\n driveUrl,\n self.addAuthHeaderToInit(\n { ...init, method: 'GET', credentials: 'same-origin' },\n authToken,\n ),\n )\n if (!response.ok) {\n throw new Error(await getDescriptiveErrorMessage(response))\n }\n return response\n }\n },\n /**\n * #method\n */\n openLocation(location: UriLocation) {\n return new GoogleDriveFile(location.uri, {\n fetch: this.getFetcher(location),\n })\n },\n /**\n * #action\n */\n async validateToken(token: string, location: UriLocation) {\n const response = await fetch(getUri(location.uri), {\n headers: {\n Authorization: `Bearer ${token}`,\n 'Content-Type': 'application/x-www-form-urlencoded',\n },\n })\n if (!response.ok) {\n throw new Error(\n await getDescriptiveErrorMessage(\n response,\n 'Token could not be validated',\n ),\n )\n }\n return token\n },\n }))\n}\n\nexport type GoogleDriveOAuthStateModel = ReturnType<typeof stateModelFactory>\nexport type GoogleDriveOAuthModel = Instance<GoogleDriveOAuthStateModel>\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport InternetAccountType from '@jbrowse/core/pluggableElementTypes/InternetAccountType'\nimport {\n configSchema as OAuthConfigSchema,\n modelFactory as OAuthInternetAccountModelFactory,\n} from './OAuthModel'\nimport {\n configSchema as ExternalTokenConfigSchema,\n modelFactory as ExternalTokenInternetAccountModelFactory,\n} from './ExternalTokenModel'\nimport {\n configSchema as HTTPBasicConfigSchema,\n modelFactory as HTTPBasicInternetAccountModelFactory,\n} from './HTTPBasicModel'\nimport {\n configSchema as DropboxOAuthConfigSchema,\n modelFactory as DropboxOAuthInternetAccountModelFactory,\n} from './DropboxOAuthModel'\nimport {\n configSchema as GoogleDriveOAuthConfigSchema,\n modelFactory as GoogleDriveOAuthInternetAccountModelFactory,\n} from './GoogleDriveOAuthModel'\n\nexport default class AuthenticationPlugin extends Plugin {\n name = 'AuthenticationPlugin'\n\n exports = {\n OAuthConfigSchema,\n OAuthInternetAccountModelFactory,\n ExternalTokenConfigSchema,\n ExternalTokenInternetAccountModelFactory,\n HTTPBasicConfigSchema,\n HTTPBasicInternetAccountModelFactory,\n DropboxOAuthConfigSchema,\n DropboxOAuthInternetAccountModelFactory,\n GoogleDriveOAuthConfigSchema,\n GoogleDriveOAuthInternetAccountModelFactory,\n }\n\n install(pluginManager: PluginManager) {\n pluginManager.addInternetAccountType(() => {\n return new InternetAccountType({\n name: 'OAuthInternetAccount',\n configSchema: OAuthConfigSchema,\n stateModel: OAuthInternetAccountModelFactory(OAuthConfigSchema),\n })\n })\n pluginManager.addInternetAccountType(() => {\n return new InternetAccountType({\n name: 'ExternalTokenInternetAccount',\n configSchema: ExternalTokenConfigSchema,\n stateModel: ExternalTokenInternetAccountModelFactory(\n ExternalTokenConfigSchema,\n ),\n })\n })\n pluginManager.addInternetAccountType(() => {\n return new InternetAccountType({\n name: 'HTTPBasicInternetAccount',\n configSchema: HTTPBasicConfigSchema,\n stateModel: HTTPBasicInternetAccountModelFactory(HTTPBasicConfigSchema),\n })\n })\n pluginManager.addInternetAccountType(() => {\n return new InternetAccountType({\n name: 'DropboxOAuthInternetAccount',\n configSchema: DropboxOAuthConfigSchema,\n stateModel: DropboxOAuthInternetAccountModelFactory(\n DropboxOAuthConfigSchema,\n ),\n })\n })\n pluginManager.addInternetAccountType(() => {\n return new InternetAccountType({\n name: 'GoogleDriveOAuthInternetAccount',\n configSchema: GoogleDriveOAuthConfigSchema,\n stateModel: GoogleDriveOAuthInternetAccountModelFactory(\n GoogleDriveOAuthConfigSchema,\n ),\n })\n })\n }\n}\n\nexport {\n configSchema as OAuthConfigSchema,\n modelFactory as OAuthInternetAccountModelFactory,\n} from './OAuthModel'\nexport {\n configSchema as ExternalTokenConfigSchema,\n modelFactory as ExternalTokenInternetAccountModelFactory,\n} from './ExternalTokenModel'\n\nexport {\n configSchema as HTTPBasicConfigSchema,\n modelFactory as HTTPBasicInternetAccountModelFactory,\n} from './HTTPBasicModel'\n\nexport {\n configSchema as DropboxOAuthConfigSchema,\n modelFactory as DropboxOAuthInternetAccountModelFactory,\n} from './DropboxOAuthModel'\n\nexport {\n configSchema as GoogleDriveOAuthConfigSchema,\n modelFactory as GoogleDriveOAuthInternetAccountModelFactory,\n} from './GoogleDriveOAuthModel'\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BigBedAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BigBedAdapter = ConfigurationSchema(\n 'BigBedAdapter',\n {\n /**\n * #slot\n */\n bigBedLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bb', locationType: 'UriLocation' },\n },\n\n /**\n * #slot\n */\n scoreColumn: {\n type: 'string',\n description: 'The column to use as a \"score\" attribute',\n defaultValue: '',\n },\n\n /**\n * #slot\n */\n aggregateField: {\n type: 'string',\n description: 'An attribute to aggregate features with',\n defaultValue: 'geneName',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default BigBedAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BedpeAdapter\n * intended for SVs in a single assembly\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BedpeAdapter = ConfigurationSchema(\n 'BedpeAdapter',\n {\n /**\n * #slot\n * can be plaintext or gzipped, not indexed so loaded into memory on startup\n */\n bedpeLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bedpe.gz',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n columnNames: {\n type: 'stringArray',\n description: 'List of column names',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true },\n)\nexport default BedpeAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config BedTabixAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BedTabixAdapter = ConfigurationSchema(\n 'BedTabixAdapter',\n {\n /**\n * #slot\n */\n bedGzLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },\n },\n\n index: ConfigurationSchema('TabixIndex', {\n /**\n * #slot index.indexType\n */\n indexType: {\n model: types.enumeration('IndexType', ['TBI', 'CSI']),\n type: 'stringEnum',\n defaultValue: 'TBI',\n },\n /**\n * #slot index.location\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.bed.gz.tbi',\n locationType: 'UriLocation',\n },\n },\n }),\n\n /**\n * #slot\n */\n columnNames: {\n type: 'stringArray',\n description: 'List of column names',\n defaultValue: [],\n },\n\n /**\n * #slot\n */\n scoreColumn: {\n type: 'string',\n description: 'The column to use as a \"score\" attribute',\n defaultValue: '',\n },\n\n /**\n * #slot\n */\n autoSql: {\n type: 'string',\n description: 'The autoSql definition for the data fields in the file',\n defaultValue: '',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default BedTabixAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config BedAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BedAdapter = ConfigurationSchema(\n 'BedAdapter',\n {\n /**\n * #slot\n */\n bedLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.bed.gz', locationType: 'UriLocation' },\n },\n /**\n * #slot\n */\n columnNames: {\n type: 'stringArray',\n description: 'List of column names',\n defaultValue: [],\n },\n /**\n * #slot\n */\n scoreColumn: {\n type: 'string',\n description: 'The column to use as a \"score\" attribute',\n defaultValue: '',\n },\n /**\n * #slot\n */\n autoSql: {\n type: 'string',\n description: 'The autoSql definition for the data fields in the file',\n defaultValue: '',\n },\n /**\n * #slot\n */\n colRef: {\n type: 'number',\n description: 'The column to use as a \"refName\" attribute',\n defaultValue: 0,\n },\n /**\n * #slot\n */\n colStart: {\n type: 'number',\n description: 'The column to use as a \"start\" attribute',\n defaultValue: 1,\n },\n /**\n * #slot\n */\n colEnd: {\n type: 'number',\n description: 'The column to use as a \"end\" attribute',\n defaultValue: 2,\n },\n },\n { explicitlyTyped: true },\n)\nexport default BedAdapter\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport BigBedAdapterF from './BigBedAdapter'\nimport BedpeAdapterF from './BedpeAdapter'\nimport BedTabixAdapterF from './BedTabixAdapter'\nimport BedAdapterF from './BedAdapter'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n getFileName,\n makeIndex,\n makeIndexType,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default class BedPlugin extends Plugin {\n name = 'BedPlugin'\n\n install(pluginManager: PluginManager) {\n BigBedAdapterF(pluginManager)\n BedAdapterF(pluginManager)\n BedpeAdapterF(pluginManager)\n BedTabixAdapterF(pluginManager)\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.(bb|bigbed)$/i\n const adapterName = 'BigBedAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n bigBedLocation: file,\n }\n\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.bedpe(\\.gz)?$/i\n const adapterName = 'BedpeAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n bedpeLocation: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.bed\\.b?gz$/i\n const adapterName = 'BedTabixAdapter'\n const fileName = getFileName(file)\n const indexName = index && getFileName(index)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n bedGzLocation: file,\n index: {\n location: index || makeIndex(file, '.tbi'),\n indexType: makeIndexType(indexName, 'CSI', 'TBI'),\n },\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.bed$/i\n const adapterName = 'BedAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n bedLocation: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => (adapterName: string) =>\n adapterName === 'BedpeAdapter'\n ? 'VariantTrack'\n : trackTypeGuesser(adapterName),\n )\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function BigBedAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BigBedAdapter',\n displayName: 'BigBed adapter',\n configSchema,\n getAdapterClass: () => import('./BigBedAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function BedAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BedAdapter',\n displayName: 'BED adapter',\n configSchema,\n getAdapterClass: () => import('./BedAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function BedpeAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BedpeAdapter',\n displayName: 'BEDPE adapter',\n configSchema,\n getAdapterClass: () => import('./BedpeAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function BedTabixAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BedTabixAdapter',\n displayName: 'BED tabix adapter',\n configSchema,\n getAdapterClass: () => import('./BedTabixAdapter').then(r => r.default),\n }),\n )\n}\n","import { lazy } from 'react'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { types } from 'mobx-state-tree'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\n\nconst configSchema = ConfigurationSchema('BreakpointAlignmentsWidget', {})\n\nconst stateModel = types\n .model('BreakpointAlignmentsWidget', {\n id: ElementId,\n type: types.literal('BreakpointAlignmentsWidget'),\n featureData: types.frozen(),\n })\n .actions(self => ({\n setFeatureData(data: unknown) {\n self.featureData = data\n },\n clearFeatureData() {\n self.featureData = undefined\n },\n }))\n\nexport default function BreakpointAlignmentsFeatureDetailF(\n pluginManager: PluginManager,\n) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'BreakpointAlignmentsWidget',\n heading: 'Breakpoint feature details',\n configSchema,\n stateModel,\n ReactComponent: lazy(() => import('./BreakpointAlignmentsFeatureDetail')),\n })\n })\n}\n","import { getSession, Feature, Region } from '@jbrowse/core/util'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\nimport { parseBreakend } from '@gmod/vcf'\nimport { IStateTreeNode } from 'mobx-state-tree'\nimport { Assembly } from '@jbrowse/core/assemblyManager/assembly'\n\nexport default class BreakpointSplitViewType extends ViewType {\n getBreakendCoveringRegions({\n feature,\n assembly,\n }: {\n feature: Feature\n assembly: Assembly\n }) {\n const alt = feature.get('ALT')?.[0]\n const bnd = alt ? parseBreakend(alt) : undefined\n const startPos = feature.get('start')\n const refName = feature.get('refName')\n let endPos: number\n\n let mateRefName: string | undefined\n\n // a VCF breakend feature\n if (alt === '<TRA>') {\n const INFO = feature.get('INFO')\n endPos = INFO.END[0] - 1\n mateRefName = INFO.CHR2[0]\n } else if (bnd?.MatePosition) {\n const matePosition = bnd.MatePosition.split(':')\n endPos = +matePosition[1]! - 1\n mateRefName = matePosition[0]!\n } else if (feature.get('mate')) {\n // a generic 'mate' feature\n const mate = feature.get('mate')\n mateRefName = mate.refName\n endPos = mate.start\n } else {\n endPos = startPos + 1\n }\n\n if (!mateRefName) {\n throw new Error(\n `unable to resolve mate refName ${mateRefName} in reference genome`,\n )\n }\n\n return {\n pos: startPos,\n refName: assembly.getCanonicalRefName(refName),\n mateRefName: assembly.getCanonicalRefName(mateRefName),\n matePos: endPos,\n }\n }\n\n singleLevelSnapshotFromBreakendFeature(\n feature: Feature,\n view: { displayedRegions: Region[] } & IStateTreeNode,\n ) {\n const session = getSession(view)\n const bpPerPx = 10\n const { assemblyName } = view.displayedRegions[0]!\n\n const { assemblyManager } = session\n const assembly = assemblyManager.get(assemblyName)\n if (!assembly) {\n throw new Error(`assembly ${assemblyName} not found`)\n }\n if (!assembly.regions) {\n throw new Error(`assembly ${assemblyName} regions not loaded`)\n }\n const {\n refName,\n pos: startPos,\n mateRefName,\n matePos: endPos,\n } = this.getBreakendCoveringRegions({\n feature,\n assembly,\n })\n\n const topRegion = assembly.regions.find(f => f.refName === refName)!\n const bottomRegion = assembly.regions.find(f => f.refName === mateRefName)!\n const topMarkedRegion = [{ ...topRegion }, { ...topRegion }]\n const bottomMarkedRegion = [{ ...bottomRegion }, { ...bottomRegion }]\n topMarkedRegion[0]!.end = startPos\n topMarkedRegion[1]!.start = startPos\n bottomMarkedRegion[0]!.end = endPos\n bottomMarkedRegion[1]!.start = endPos\n return {\n type: 'BreakpointSplitView',\n views: [\n {\n type: 'LinearGenomeView',\n displayedRegions: topMarkedRegion,\n hideHeader: true,\n bpPerPx,\n offsetPx: (topRegion.start + feature.get('start')) / bpPerPx,\n },\n ],\n displayName: `${\n feature.get('name') || feature.get('id') || 'breakend'\n } split detail`,\n featureData: undefined as unknown,\n }\n }\n\n snapshotFromBreakendFeature(\n feature: Feature,\n view: { displayedRegions: Region[] } & IStateTreeNode,\n ) {\n const session = getSession(view)\n const bpPerPx = 10\n const { assemblyName } = view.displayedRegions[0]!\n\n const { assemblyManager } = session\n const assembly = assemblyManager.get(assemblyName)\n if (!assembly) {\n throw new Error(`assembly ${assemblyName} not found`)\n }\n if (!assembly.regions) {\n throw new Error(`assembly ${assemblyName} regions not loaded`)\n }\n const {\n refName,\n pos: startPos,\n mateRefName,\n matePos: endPos,\n } = this.getBreakendCoveringRegions({\n feature,\n assembly,\n })\n\n const topRegion = assembly.regions.find(f => f.refName === refName)!\n const bottomRegion = assembly.regions.find(f => f.refName === mateRefName)!\n const topMarkedRegion = [{ ...topRegion }, { ...topRegion }]\n const bottomMarkedRegion = [{ ...bottomRegion }, { ...bottomRegion }]\n topMarkedRegion[0]!.end = startPos\n topMarkedRegion[1]!.start = startPos\n bottomMarkedRegion[0]!.end = endPos\n bottomMarkedRegion[1]!.start = endPos\n return {\n type: 'BreakpointSplitView',\n views: [\n {\n type: 'LinearGenomeView',\n displayedRegions: topMarkedRegion,\n hideHeader: true,\n bpPerPx,\n offsetPx: (topRegion.start + feature.get('start')) / bpPerPx,\n },\n {\n type: 'LinearGenomeView',\n displayedRegions: bottomMarkedRegion,\n hideHeader: true,\n bpPerPx,\n offsetPx: (bottomRegion.start + endPos) / bpPerPx,\n },\n ],\n displayName: `${\n feature.get('name') || feature.get('id') || 'breakend'\n } split detail`,\n }\n }\n}\n","import React, { lazy } from 'react'\nimport {\n types,\n onAction,\n addDisposer,\n getPath,\n Instance,\n} from 'mobx-state-tree'\nimport { autorun } from 'mobx'\nimport { saveAs } from 'file-saver'\n\n// jbrowse\nimport {\n LinearGenomeViewModel,\n LinearGenomeViewStateModel,\n} from '@jbrowse/plugin-linear-genome-view'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { getSession, Feature, notEmpty } from '@jbrowse/core/util'\nimport { AnyConfigurationModel, getConf } from '@jbrowse/core/configuration'\n\n// icons\nimport PhotoCamera from '@mui/icons-material/PhotoCamera'\nimport LinkIcon from '@mui/icons-material/Link'\n\n// locals\nimport { intersect } from './util'\n\n// lazies\nconst ExportSvgDialog = lazy(() => import('./components/ExportSvgDialog'))\n\ninterface Display {\n searchFeatureByID?: (str: string) => LayoutRecord\n}\n\ninterface Track {\n displays: Display[]\n}\n\nfunction calc(track: Track, f: Feature) {\n return track.displays[0]!.searchFeatureByID?.(f.id())\n}\n\nexport interface ExportSvgOptions {\n rasterizeLayers?: boolean\n filename?: string\n Wrapper?: React.FC<{ children: React.ReactNode }>\n fontSize?: number\n rulerHeight?: number\n textHeight?: number\n paddingHeight?: number\n headerHeight?: number\n cytobandHeight?: number\n trackLabels?: string\n themeName?: string\n}\n\ntype LGV = LinearGenomeViewModel\n\nexport interface Breakend {\n MateDirection: string\n Join: string\n Replacement: string\n MatePosition: string\n}\n\nexport type LayoutRecord = [number, number, number, number]\n\nasync function getBlockFeatures(\n model: BreakpointViewModel,\n track: { configuration: AnyConfigurationModel },\n) {\n const { views } = model\n const { rpcManager, assemblyManager } = getSession(model)\n const assemblyName = model.views[0]?.assemblyNames[0]\n if (!assemblyName) {\n return undefined\n }\n const assembly = await assemblyManager.waitForAssembly(assemblyName)\n if (!assembly) {\n return undefined // throw new Error(`assembly not found: \"${assemblyName}\"`)\n }\n const sessionId = track.configuration.trackId\n return Promise.all(\n views.map(async view =>\n (\n (await rpcManager.call(sessionId, 'CoreGetFeatures', {\n adapterConfig: getConf(track, ['adapter']),\n sessionId,\n regions: view.staticBlocks.contentBlocks,\n })) as Feature[][]\n ).flat(),\n ),\n )\n}\n\n/**\n * #stateModel BreakpointSplitView\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nexport default function stateModelFactory(pluginManager: PluginManager) {\n const minHeight = 40\n const defaultHeight = 400\n return types\n .compose(\n 'BreakpointSplitView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n type: types.literal('BreakpointSplitView'),\n /**\n * #property\n */\n height: types.optional(\n types.refinement(\n 'viewHeight',\n types.number,\n (n: number) => n >= minHeight,\n ),\n defaultHeight,\n ),\n /**\n * #property\n */\n trackSelectorType: 'hierarchical',\n /**\n * #property\n */\n showIntraviewLinks: true,\n /**\n * #property\n */\n linkViews: false,\n /**\n * #property\n */\n interactToggled: false,\n /**\n * #property\n */\n views: types.array(\n pluginManager.getViewType('LinearGenomeView')!\n .stateModel as LinearGenomeViewStateModel,\n ),\n }),\n )\n .volatile(() => ({\n width: 800,\n matchedTrackFeatures: {} as Record<string, Feature[][]>,\n }))\n .views(self => ({\n /**\n * #method\n * creates an svg export and save using FileSaver\n */\n async exportSvg(opts: ExportSvgOptions = {}) {\n const { renderToSvg } = await import(\n './svgcomponents/SVGBreakpointSplitView'\n )\n const html = await renderToSvg(self as BreakpointViewModel, opts)\n const blob = new Blob([html], { type: 'image/svg+xml' })\n saveAs(blob, opts.filename || 'image.svg')\n },\n }))\n .views(self => ({\n /**\n * #getter\n * Find all track ids that match across multiple views, or return just\n * the single view's track if only a single row is used\n */\n get matchedTracks() {\n return self.views.length === 1\n ? self.views[0]!.tracks\n : intersect(\n elt => elt.configuration.trackId,\n ...self.views.map(\n view => view.tracks as { configuration: { trackId: string } }[],\n ),\n )\n },\n\n /**\n * #method\n * Get tracks with a given trackId across multiple views\n */\n getMatchedTracks(trackConfigId: string) {\n return self.views\n .map(view => view.getTrack(trackConfigId))\n .filter(f => !!f)\n },\n\n /**\n * #method\n * Translocation features are handled differently since they do not have\n * a mate e.g. they are one sided\n */\n hasTranslocations(trackConfigId: string) {\n return [...this.getTrackFeatures(trackConfigId).values()].find(\n f => f.get('type') === 'translocation',\n )\n },\n\n /**\n * #method\n * Paired features similar to breakends, but simpler, like BEDPE\n */\n hasPairedFeatures(trackConfigId: string) {\n return [...this.getTrackFeatures(trackConfigId).values()].find(\n f => f.get('type') === 'paired_feature',\n )\n },\n\n /**\n * #method\n * Get a composite map of featureId-\\>feature map for a track across\n * multiple views\n */\n getTrackFeatures(trackConfigId: string) {\n return new Map(\n self.matchedTrackFeatures[trackConfigId]\n ?.flat()\n .map(f => [f.id(), f] as const),\n )\n },\n\n /**\n * #method\n */\n getMatchedFeaturesInLayout(trackConfigId: string, features: Feature[][]) {\n // use reverse to search the second track first\n const tracks = this.getMatchedTracks(trackConfigId)\n return features.map(c =>\n c\n .map(feature => {\n const level = tracks.findIndex(track => calc(track, feature))\n return level !== -1\n ? {\n feature,\n layout: calc(tracks[level], feature),\n level,\n }\n : undefined\n })\n .filter(notEmpty),\n )\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n onAction(\n self,\n ({\n name,\n path,\n args,\n }: {\n name: string\n path?: string\n args?: unknown[]\n }) => {\n if (self.linkViews) {\n const actions = [\n 'horizontalScroll',\n 'zoomTo',\n 'setScaleFactor',\n 'showTrack',\n 'toggleTrack',\n 'hideTrack',\n 'setTrackLabels',\n 'toggleCenterLine',\n ]\n if (actions.includes(name) && path) {\n this.onSubviewAction(name, path, args)\n }\n }\n },\n ),\n )\n },\n\n onSubviewAction(actionName: string, path: string, args?: unknown[]) {\n self.views.forEach(view => {\n const ret = getPath(view)\n if (!ret.endsWith(path)) {\n // @ts-ignore\n view[actionName](args?.[0])\n }\n })\n },\n\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.width = newWidth\n self.views.forEach(v => {\n v.setWidth(newWidth)\n })\n },\n\n /**\n * #action\n */\n removeView(view: LGV) {\n self.views.remove(view)\n },\n\n /**\n * #action\n */\n toggleInteract() {\n self.interactToggled = !self.interactToggled\n },\n\n /**\n * #action\n */\n toggleIntraviewLinks() {\n self.showIntraviewLinks = !self.showIntraviewLinks\n },\n\n /**\n * #action\n */\n toggleLinkViews() {\n self.linkViews = !self.linkViews\n },\n\n /**\n * #action\n */\n setMatchedTrackFeatures(obj: Record<string, Feature[][]>) {\n self.matchedTrackFeatures = obj\n },\n /**\n * #action\n */\n reverseViewOrder() {\n self.views.reverse()\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(async () => {\n try {\n if (!self.views.every(view => view.initialized)) {\n return\n }\n self.setMatchedTrackFeatures(\n Object.fromEntries(\n await Promise.all(\n self.matchedTracks.map(async track => [\n track.configuration.trackId,\n await getBlockFeatures(self as any, track),\n ]),\n ),\n ),\n )\n } catch (e) {\n console.error(e)\n getSession(self).notifyError(`${e}`, e)\n }\n }),\n )\n },\n\n /**\n * #method\n */\n menuItems() {\n return [\n ...self.views\n .map((view, idx) => [idx, view.menuItems()] as const)\n .map(f => ({\n label: `Row ${f[0] + 1} view menu`,\n subMenu: f[1],\n })),\n\n {\n label: 'Reverse view order',\n onClick: () => {\n self.reverseViewOrder()\n },\n },\n {\n label: 'Show intra-view links',\n type: 'checkbox',\n checked: self.showIntraviewLinks,\n onClick: () => {\n self.toggleIntraviewLinks()\n },\n },\n {\n label: 'Allow clicking alignment squiggles?',\n type: 'checkbox',\n checked: self.interactToggled,\n onClick: () => {\n self.toggleInteract()\n },\n },\n\n {\n label: 'Link views',\n type: 'checkbox',\n icon: LinkIcon,\n checked: self.linkViews,\n onClick: () => {\n self.toggleLinkViews()\n },\n },\n {\n label: 'Export SVG',\n icon: PhotoCamera,\n onClick: (): void => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }))\n}\n\nexport type BreakpointViewStateModel = ReturnType<typeof stateModelFactory>\nexport type BreakpointViewModel = Instance<BreakpointViewStateModel>\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\nimport BreakpointAlignmentsWidgetF from './BreakpointAlignmentsFeatureDetail'\nimport BreakpointSplitViewF from './BreakpointSplitView'\n\nexport default class BreakpointSplitViewPlugin extends Plugin {\n name = 'BreakpointSplitViewPlugin'\n\n install(pluginManager: PluginManager) {\n BreakpointSplitViewF(pluginManager)\n BreakpointAlignmentsWidgetF(pluginManager)\n }\n\n configure() {}\n}\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport BreakpointSplitView from './BreakpointSplitView'\nimport stateModelFactory from './model'\n\nexport default function BreakpointSplitViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new BreakpointSplitView({\n name: 'BreakpointSplitView',\n displayName: 'Breakpoint split view',\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/BreakpointSplitView')),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config PAFAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst PAFAdapter = ConfigurationSchema(\n 'PAFAdapter',\n {\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Array of assembly names to use for this file. The target assembly name is the first value in the array, query assembly name is the second',\n },\n /**\n * #slot\n */\n targetAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the target assembly name',\n },\n /**\n * #slot\n */\n queryAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the query assembly name',\n },\n /**\n * #slot\n */\n pafLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/file.paf',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default PAFAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config PairwiseIndexedPAFAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst PairwiseIndexedPAFAdapter = ConfigurationSchema(\n 'PairwiseIndexedPAFAdapter',\n {\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Array of assembly names to use for this file. The target assembly name is the first value in the array, query assembly name is the second',\n },\n /**\n * #slot\n */\n targetAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the target assembly name',\n },\n /**\n * #slot\n */\n queryAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the query assembly name',\n },\n /**\n * #slot\n */\n pifGzLocation: {\n type: 'fileLocation',\n description: 'location of pairwise tabix indexed PAF (pif)',\n defaultValue: {\n uri: '/path/to/data/file.pif.gz',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n index: ConfigurationSchema('TabixIndex', {\n /**\n * #slot index.indexType\n */\n indexType: {\n model: types.enumeration('IndexType', ['TBI', 'CSI']),\n type: 'stringEnum',\n defaultValue: 'TBI',\n },\n /**\n * #slot index.location\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.paf.gz.tbi',\n locationType: 'UriLocation',\n },\n },\n }),\n },\n { explicitlyTyped: true },\n)\n\nexport default PairwiseIndexedPAFAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config MCScanAnchorsAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst MCScanAnchorsAdapter = ConfigurationSchema(\n 'MCScanAnchorsAdapter',\n {\n /**\n * #slot\n */\n mcscanAnchorsLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/mcscan.anchors',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n bed1Location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/file.bed',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n bed2Location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/file.bed',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default MCScanAnchorsAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config MCScanSimpleAnchorsAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst MCScanSimpleAnchorsAdapter = ConfigurationSchema(\n 'MCScanSimpleAnchorsAdapter',\n {\n /**\n * #slot\n */\n mcscanSimpleAnchorsLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/mcscan.anchors.simple',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n bed1Location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/file.bed',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n bed2Location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/file.bed',\n locationType: 'UriLocation',\n },\n },\n\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n },\n },\n { explicitlyTyped: true },\n)\nexport default MCScanSimpleAnchorsAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config MashMapAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst MashMapAdapter = ConfigurationSchema(\n 'MashMapAdapter',\n {\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Target is the first value in the array, query is the second',\n },\n\n /**\n * #slot\n */\n targetAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames array: the target assembly',\n },\n /**\n * #slot\n */\n queryAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames array: the query assembly',\n },\n /**\n * #slot\n */\n outLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/mashmap.out',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default MashMapAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config DeltaAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst DeltaAdapter = ConfigurationSchema(\n 'DeltaAdapter',\n {\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Array of assembly names to use for this file. The target assembly name is the first value in the array, query assembly name is the second',\n },\n /**\n * #slot\n * alternative to assembly names\n */\n targetAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the target assembly name',\n },\n /**\n * #slot\n * alternative to assembly names\n */\n queryAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames: the query assembly name',\n },\n /**\n * #slot\n */\n deltaLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/file.delta', locationType: 'UriLocation' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default DeltaAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config ChainAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst ChainAdapter = ConfigurationSchema(\n 'ChainAdapter',\n {\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Target is the first value in the array, query is the second',\n },\n /**\n * #slot\n * can be specified as alternative to assemblyNames\n */\n targetAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames array: the target assembly',\n },\n /**\n * #slot\n * can be specified as alternative to assemblyNames\n */\n queryAssembly: {\n type: 'string',\n defaultValue: '',\n description: 'Alternative to assemblyNames array: the query assembly',\n },\n /**\n * #slot\n */\n chainLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/file.chain', locationType: 'UriLocation' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default ChainAdapter\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\n\nimport PAFAdapterF from './PAFAdapter'\nimport PairwiseIndexedPAFAdapterF from './PairwiseIndexedPAFAdapter'\nimport MCScanAnchorsAdapterF from './MCScanAnchorsAdapter'\nimport MCScanSimpleAnchorsAdapterF from './MCScanSimpleAnchorsAdapter'\nimport MashMapAdapterF from './MashMapAdapter'\nimport DeltaAdapterF from './DeltaAdapter'\nimport ChainAdapterF from './ChainAdapter'\n\nimport {\n getFileName,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default class ComparativeAdaptersPlugin extends Plugin {\n name = 'ComparativeAdaptersPlugin'\n\n install(pluginManager: PluginManager) {\n PAFAdapterF(pluginManager)\n PairwiseIndexedPAFAdapterF(pluginManager)\n DeltaAdapterF(pluginManager)\n ChainAdapterF(pluginManager)\n MCScanAnchorsAdapterF(pluginManager)\n MCScanSimpleAnchorsAdapterF(pluginManager)\n MashMapAdapterF(pluginManager)\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.paf/i\n const adapterName = 'PAFAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n pafLocation: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) =>\n adapterName === 'PAFAdapter'\n ? 'SyntenyTrack'\n : trackTypeGuesser(adapterName)\n },\n )\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function PAFAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'PAFAdapter',\n displayName: 'PAF adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () => import('./PAFAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function PairwiseIndexedPAFAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'PairwiseIndexedPAFAdapter',\n displayName: 'Pairwise indexed PAF adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./PairwiseIndexedPAFAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function DeltaAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'DeltaAdapter',\n displayName: 'MUMmer delta adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () => import('./DeltaAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function ChainAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'ChainAdapter',\n displayName: 'Liftover chain adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () => import('./ChainAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function MCScanAnchorsAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'MCScanAnchorsAdapter',\n displayName: 'MCScan anchors adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n\n getAdapterClass: () =>\n import('./MCScanAnchorsAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function MCScanSimpleAnchorsAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'MCScanSimpleAnchorsAdapter',\n displayName: 'MCScan anchors.simple adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./MCScanSimpleAnchorsAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport configSchema from './configSchema'\n\nexport default function MashMapAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'MashMapAdapter',\n displayName: 'MashMap adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () => import('./MashMapAdapter').then(r => r.default),\n }),\n )\n}\n","import { getParent, Instance } from 'mobx-state-tree'\nimport { observable } from 'mobx'\nimport Base1DView from '@jbrowse/core/util/Base1DViewModel'\nimport calculateDynamicBlocks from '@jbrowse/core/util/calculateDynamicBlocks'\n\n/**\n * #stateModel Dotplot1DView\n * ref https://mobx-state-tree.js.org/concepts/volatiles on volatile state used here\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst Dotplot1DView = Base1DView.extend(self => {\n const scaleFactor = observable.box(1)\n return {\n views: {\n /**\n * #getter\n * this uses padding=false and elision=false\n */\n get dynamicBlocks() {\n return calculateDynamicBlocks(self, false, false)\n },\n /**\n * #getter\n */\n\n get scaleFactor() {\n return scaleFactor.get()\n },\n\n /**\n * #getter\n */\n get maxBpPerPx() {\n return self.totalBp / (self.width - 50)\n },\n\n /**\n * #getter\n */\n get minBpPerPx() {\n return 1 / 50\n },\n\n /**\n * #getter\n */\n get maxOffset() {\n return self.displayedRegionsTotalPx - self.width * 0.2\n },\n\n /**\n * #getter\n */\n get minOffset() {\n return -self.width * 0.8\n },\n },\n actions: {\n /**\n * #action\n */\n setScaleFactor(n: number) {\n scaleFactor.set(n)\n },\n\n /**\n * #action\n */\n center() {\n const centerBp = self.totalBp / 2\n const centerPx = centerBp / self.bpPerPx\n self.scrollTo(centerPx - self.width / 2)\n },\n },\n }\n})\n\nconst DotplotHView = Dotplot1DView.extend(self => ({\n views: {\n get width() {\n return getParent<any>(self).viewWidth\n },\n },\n}))\n\nconst DotplotVView = Dotplot1DView.extend(self => ({\n views: {\n get width() {\n return getParent<any>(self).viewHeight\n },\n },\n}))\n\nexport { DotplotVView, DotplotHView, Dotplot1DView }\nexport type Dotplot1DViewModel = Instance<typeof Dotplot1DView>\n","import React, { lazy } from 'react'\nimport {\n addDisposer,\n cast,\n getParent,\n getRoot,\n getSnapshot,\n resolveIdentifier,\n types,\n Instance,\n SnapshotIn,\n} from 'mobx-state-tree'\nimport { saveAs } from 'file-saver'\nimport { autorun, transaction } from 'mobx'\n\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport { BaseTrackStateModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport BaseViewModel from '@jbrowse/core/pluggableElementTypes/models/BaseViewModel'\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport {\n getSession,\n isSessionModelWithWidgets,\n minmax,\n measureText,\n max,\n localStorageGetItem,\n getTickDisplayStr,\n} from '@jbrowse/core/util'\nimport { getConf, AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera'\n\n// locals\nimport { Dotplot1DView, DotplotHView, DotplotVView } from './1dview'\nimport { getBlockLabelKeysToHide, makeTicks } from './components/util'\nimport { BaseBlock } from '@jbrowse/core/util/blockTypes'\n\n// lazies\nconst ExportSvgDialog = lazy(() => import('./components/ExportSvgDialog'))\nconst ReturnToImportFormDialog = lazy(\n () => import('@jbrowse/core/ui/ReturnToImportFormDialog'),\n)\ntype Coord = [number, number]\n\nexport interface ExportSvgOptions {\n rasterizeLayers?: boolean\n filename?: string\n Wrapper?: React.FC<{ children: React.ReactNode }>\n themeName?: string\n}\n\nfunction stringLenPx(a: string) {\n return measureText(a.slice(0, 30))\n}\n\nfunction pxWidthForBlocks(\n blocks: BaseBlock[],\n bpPerPx: number,\n hide: Set<string>,\n) {\n return max([\n ...blocks.filter(b => !hide.has(b.key)).map(b => stringLenPx(b.refName)),\n ...blocks\n .filter(b => !hide.has(b.key))\n .map(b => stringLenPx(getTickDisplayStr(b.end, bpPerPx))),\n ])\n}\n\n/**\n * #stateModel DotplotView\n * #category view\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nexport default function stateModelFactory(pm: PluginManager) {\n return types\n .compose(\n 'DotplotView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('DotplotView'),\n /**\n * #property\n */\n height: 600,\n /**\n * #property\n */\n borderSize: 20,\n /**\n * #property\n */\n tickSize: 5,\n /**\n * #property\n */\n vtextRotation: 0,\n /**\n * #property\n */\n htextRotation: -90,\n /**\n * #property\n */\n fontSize: 15,\n /**\n * #property\n */\n trackSelectorType: 'hierarchical',\n /**\n * #property\n */\n assemblyNames: types.array(types.string),\n /**\n * #property\n */\n drawCigar: true,\n /**\n * #property\n */\n hview: types.optional(DotplotHView, {}),\n /**\n * #property\n */\n vview: types.optional(DotplotVView, {}),\n\n /**\n * #property\n */\n tracks: types.array(\n pm.pluggableMstType('track', 'stateModel') as BaseTrackStateModel,\n ),\n\n /**\n * #property\n * this represents tracks specific to this view specifically used\n * for read vs ref dotplots where this track would not really apply\n * elsewhere\n */\n viewTrackConfigs: types.array(pm.pluggableConfigSchemaType('track')),\n }),\n )\n .volatile(() => ({\n volatileWidth: undefined as number | undefined,\n volatileError: undefined as unknown,\n\n // these are 'personal preferences', stored in volatile and\n // loaded/written to localStorage\n cursorMode: localStorageGetItem('dotplot-cursorMode') || 'crosshair',\n showPanButtons: Boolean(\n JSON.parse(localStorageGetItem('dotplot-showPanbuttons') || 'true'),\n ),\n wheelMode: localStorageGetItem('dotplot-wheelMode') || 'zoom',\n borderX: 100,\n borderY: 100,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get width(): number {\n if (!self.volatileWidth) {\n throw new Error('width not initialized')\n }\n return self.volatileWidth\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get assemblyErrors() {\n const { assemblyManager } = getSession(self)\n return self.assemblyNames\n .map(a => assemblyManager.get(a)?.error)\n .filter(f => !!f)\n .join(', ')\n },\n /**\n * #getter\n */\n get assembliesInitialized() {\n const { assemblyManager } = getSession(self)\n return self.assemblyNames.every(\n n => assemblyManager.get(n)?.initialized ?? true,\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get initialized() {\n return (\n self.volatileWidth !== undefined &&\n self.hview.displayedRegions.length > 0 &&\n self.vview.displayedRegions.length > 0 &&\n self.assembliesInitialized\n )\n },\n /**\n * #getter\n */\n get hticks() {\n const { hview } = self\n const { dynamicBlocks, staticBlocks, bpPerPx } = hview\n return dynamicBlocks.contentBlocks.length > 5\n ? []\n : makeTicks(staticBlocks.contentBlocks, bpPerPx)\n },\n /**\n * #getter\n */\n get vticks() {\n const { vview } = self\n const { dynamicBlocks, staticBlocks, bpPerPx } = vview\n return dynamicBlocks.contentBlocks.length > 5\n ? []\n : makeTicks(staticBlocks.contentBlocks, bpPerPx)\n },\n /**\n * #getter\n */\n get loading() {\n return self.assemblyNames.length > 0 && !this.initialized\n },\n /**\n * #getter\n */\n get viewWidth() {\n return self.width - self.borderX\n },\n /**\n * #getter\n */\n get viewHeight() {\n return self.height - self.borderY\n },\n /**\n * #getter\n */\n get views() {\n return [self.hview, self.vview]\n },\n\n /**\n * #method\n */\n renderProps() {\n const session = getSession(self)\n return {\n ...getParentRenderProps(self),\n drawCigar: self.drawCigar,\n highResolutionScaling: getConf(session, 'highResolutionScaling'),\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setShowPanButtons(flag: boolean) {\n self.showPanButtons = flag\n },\n /**\n * #action\n */\n setWheelMode(str: string) {\n self.wheelMode = str\n },\n /**\n * #action\n */\n setCursorMode(str: string) {\n self.cursorMode = str\n },\n /**\n * #action\n */\n setDrawCigar(flag: boolean) {\n self.drawCigar = flag\n },\n /**\n * #action\n * returns to the import form\n */\n clearView() {\n self.hview.setDisplayedRegions([])\n self.vview.setDisplayedRegions([])\n self.assemblyNames = cast([])\n self.tracks.clear()\n },\n /**\n * #action\n */\n setBorderX(n: number) {\n self.borderX = n\n },\n /**\n * #action\n */\n setBorderY(n: number) {\n self.borderY = n\n },\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.volatileWidth = newWidth\n return self.volatileWidth\n },\n /**\n * #action\n */\n setHeight(newHeight: number) {\n self.height = newHeight\n return self.height\n },\n\n /**\n * #action\n */\n setError(e: unknown) {\n self.volatileError = e\n },\n\n /**\n * #action\n */\n zoomOutButton() {\n self.hview.zoomOut()\n self.vview.zoomOut()\n },\n /**\n * #action\n */\n zoomInButton() {\n self.hview.zoomIn()\n self.vview.zoomIn()\n },\n /**\n * #action\n */\n activateTrackSelector() {\n if (self.trackSelectorType === 'hierarchical') {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const selector = session.addWidget(\n 'HierarchicalTrackSelectorWidget',\n 'hierarchicalTrackSelector',\n { view: self },\n )\n session.showWidget(selector)\n return selector\n }\n }\n throw new Error(`invalid track selector type ${self.trackSelectorType}`)\n },\n\n /**\n * #action\n */\n showTrack(trackId: string, initialSnapshot = {}) {\n const schema = pm.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n const trackType = pm.getTrackType(conf.type)\n if (!trackType) {\n throw new Error(`unknown track type ${conf.type}`)\n }\n const viewType = pm.getViewType(self.type)!\n const displayConf = conf.displays.find((d: AnyConfigurationModel) =>\n viewType.displayTypes.find(type => type.name === d.type),\n )\n if (!displayConf) {\n throw new Error(\n `could not find a compatible display for view type ${self.type}`,\n )\n }\n const track = trackType.stateModel.create({\n ...initialSnapshot,\n type: conf.type,\n configuration: conf,\n displays: [{ type: displayConf.type, configuration: displayConf }],\n })\n self.tracks.push(track)\n },\n\n /**\n * #action\n */\n hideTrack(trackId: string) {\n const schema = pm.pluggableConfigSchemaType('track')\n const conf = resolveIdentifier(schema, getRoot(self), trackId)\n const t = self.tracks.filter(t => t.configuration === conf)\n transaction(() => {\n t.forEach(t => self.tracks.remove(t))\n })\n return t.length\n },\n /**\n * #action\n */\n toggleTrack(trackId: string) {\n const hiddenCount = this.hideTrack(trackId)\n if (!hiddenCount) {\n this.showTrack(trackId)\n return true\n }\n return false\n },\n /**\n * #action\n */\n setAssemblyNames(target: string, query: string) {\n self.assemblyNames = cast([target, query])\n },\n /**\n * #action\n */\n setViews(arr: SnapshotIn<Base1DViewModel>[]) {\n self.hview = cast(arr[0])\n self.vview = cast(arr[1])\n },\n\n /**\n * #action\n */\n getCoords(mousedown: Coord, mouseup: Coord) {\n const [xmin, xmax] = minmax(mouseup[0], mousedown[0])\n const [ymin, ymax] = minmax(mouseup[1], mousedown[1])\n return Math.abs(xmax - xmin) > 3 && Math.abs(ymax - ymin) > 3\n ? [\n self.hview.pxToBp(xmin),\n self.hview.pxToBp(xmax),\n self.vview.pxToBp(self.viewHeight - ymin),\n self.vview.pxToBp(self.viewHeight - ymax),\n ]\n : undefined\n },\n\n /**\n * #action\n * zooms into clicked and dragged region\n */\n zoomIn(mousedown: Coord, mouseup: Coord) {\n const result = this.getCoords(mousedown, mouseup)\n if (result) {\n const [x1, x2, y1, y2] = result\n self.hview.moveTo(x1, x2)\n self.vview.moveTo(y2, y1)\n }\n },\n /**\n * #action\n */\n showAllRegions() {\n self.hview.zoomTo(self.hview.maxBpPerPx)\n self.vview.zoomTo(self.vview.maxBpPerPx)\n self.vview.center()\n self.hview.center()\n },\n /**\n * #action\n * creates a linear synteny view from the clicked and dragged region\n */\n onDotplotView(mousedown: Coord, mouseup: Coord) {\n const result = this.getCoords(mousedown, mouseup)\n if (result) {\n const [x1, x2, y1, y2] = result\n const session = getSession(self)\n\n const d1 = Dotplot1DView.create({\n ...getSnapshot(self.hview),\n minimumBlockWidth: 0,\n interRegionPaddingWidth: 0,\n })\n const d2 = Dotplot1DView.create({\n ...getSnapshot(self.vview),\n minimumBlockWidth: 0,\n interRegionPaddingWidth: 0,\n })\n d1.setVolatileWidth(self.hview.width)\n d2.setVolatileWidth(self.vview.width)\n d1.moveTo(x1, x2)\n d2.moveTo(y2, y1)\n d1.zoomTo(d1.bpPerPx / (self.width / self.hview.width), 0)\n d2.zoomTo(d2.bpPerPx / (self.width / self.vview.width), 0)\n\n // add the specific evidence tracks to the LGVs in the split view\n // note: scales the bpPerPx by scaling proportional of the dotplot\n // width to the eventual lgv width\n const tracks = self.tracks\n .map(track =>\n track.configuration.displays.find(\n (display: { type: string }) =>\n display.type === 'LinearSyntenyDisplay',\n ),\n )\n .filter(f => !!f)\n .map(displayConf => {\n const trackConf = getParent<AnyConfigurationModel>(displayConf, 2)\n return {\n type: trackConf.type,\n configuration: trackConf,\n displays: [\n { type: displayConf.type, configuration: displayConf },\n ],\n }\n })\n\n const { id: _unused1, ...rest1 } = getSnapshot(d1)\n const { id: _unused2, ...rest2 } = getSnapshot(d2)\n const viewSnapshot = {\n type: 'LinearSyntenyView',\n views: [\n {\n type: 'LinearGenomeView',\n tracks: [],\n hideHeader: true,\n ...rest1,\n },\n {\n type: 'LinearGenomeView',\n tracks: [],\n hideHeader: true,\n ...rest2,\n },\n ],\n tracks,\n }\n\n session.addView('LinearSyntenyView', viewSnapshot)\n }\n },\n }))\n .actions(self => ({\n /**\n * #action\n * creates an svg export and save using FileSaver\n */\n async exportSvg(opts: ExportSvgOptions = {}) {\n const { renderToSvg } = await import('./svgcomponents/SVGDotplotView')\n const html = await renderToSvg(self as DotplotViewModel, opts)\n const blob = new Blob([html], { type: 'image/svg+xml' })\n saveAs(blob, opts.filename || 'image.svg')\n },\n // if any of our assemblies are temporary assemblies\n beforeDestroy() {\n const session = getSession(self)\n for (const name in self.assemblyNames) {\n session.removeTemporaryAssembly?.(name)\n }\n },\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n const s = (s: unknown) => JSON.stringify(s)\n const { showPanButtons, wheelMode, cursorMode } = self\n if (typeof localStorage !== 'undefined') {\n localStorage.setItem('dotplot-showPanbuttons', s(showPanButtons))\n localStorage.setItem('dotplot-cursorMode', cursorMode)\n localStorage.setItem('dotplot-wheelMode', wheelMode)\n }\n }),\n )\n addDisposer(\n self,\n autorun(\n () => {\n const session = getSession(self)\n\n // don't operate if width not set yet\n if (\n self.volatileWidth === undefined ||\n !self.assembliesInitialized\n ) {\n return\n }\n\n // also don't operate if displayedRegions already set, this is a\n // helper autorun to load regions from assembly\n if (\n self.hview.displayedRegions.length > 0 &&\n self.vview.displayedRegions.length > 0\n ) {\n return\n }\n\n const views = [self.hview, self.vview]\n transaction(() => {\n self.assemblyNames.forEach((name, index) => {\n const assembly = session.assemblyManager.get(name)\n const view = views[index]!\n view.setDisplayedRegions(assembly?.regions || [])\n })\n self.showAllRegions()\n })\n },\n { delay: 1000 },\n ),\n )\n addDisposer(\n self,\n autorun(function borderSetter() {\n // make sure we have a width on the view before trying to load\n if (self.volatileWidth === undefined) {\n return\n }\n const { vview, hview, viewHeight, viewWidth } = self\n const padding = 40\n const vblocks = vview.dynamicBlocks.contentBlocks\n const hblocks = hview.dynamicBlocks.contentBlocks\n const hoffset = hview.offsetPx\n const voffset = vview.offsetPx\n\n const vhide = getBlockLabelKeysToHide(vblocks, viewHeight, voffset)\n const hhide = getBlockLabelKeysToHide(hblocks, viewWidth, hoffset)\n const by = pxWidthForBlocks(hblocks, vview.bpPerPx, hhide)\n const bx = pxWidthForBlocks(vblocks, hview.bpPerPx, vhide)\n\n // these are set via autorun to avoid dependency cycle\n self.setBorderY(Math.max(by + padding, 50))\n self.setBorderX(Math.max(bx + padding, 50))\n }),\n )\n },\n /**\n * #action\n */\n squareView() {\n const { hview, vview } = self\n const avg = (hview.bpPerPx + vview.bpPerPx) / 2\n const hpx = hview.pxToBp(hview.width / 2)\n const vpx = vview.pxToBp(vview.width / 2)\n hview.setBpPerPx(avg)\n hview.centerAt(hpx.coord, hpx.refName, hpx.index)\n vview.setBpPerPx(avg)\n vview.centerAt(vpx.coord, vpx.refName, vpx.index)\n },\n /**\n * #action\n */\n squareViewProportional() {\n const { hview, vview } = self\n const ratio = hview.width / vview.width\n const avg = (hview.bpPerPx + vview.bpPerPx) / 2\n const hpx = hview.pxToBp(hview.width / 2)\n const vpx = vview.pxToBp(vview.width / 2)\n hview.setBpPerPx(avg / ratio)\n hview.centerAt(hpx.coord, hpx.refName, hpx.index)\n vview.setBpPerPx(avg)\n vview.centerAt(vpx.coord, vpx.refName, vpx.index)\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n menuItems() {\n const session = getSession(self)\n return [\n {\n label: 'Return to import form',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ReturnToImportFormDialog,\n { model: self, handleClose },\n ])\n },\n icon: FolderOpenIcon,\n },\n {\n label: 'Square view - same bp per pixel',\n onClick: () => {\n self.squareView()\n },\n },\n {\n label: 'Rectangular view - same total bp',\n onClick: () => {\n self.squareView()\n },\n },\n {\n label: 'Show all regions',\n onClick: () => {\n self.showAllRegions()\n },\n },\n {\n label: 'Export SVG',\n icon: PhotoCameraIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n ...(isSessionModelWithWidgets(session)\n ? [\n {\n label: 'Open track selector',\n onClick: self.activateTrackSelector,\n icon: TrackSelectorIcon,\n },\n ]\n : []),\n ]\n },\n /**\n * #getter\n */\n get error(): unknown {\n return self.volatileError || self.assemblyErrors\n },\n }))\n}\n\nexport type DotplotViewStateModel = ReturnType<typeof stateModelFactory>\nexport type DotplotViewModel = Instance<DotplotViewStateModel>\n\nexport { type Dotplot1DViewModel, Dotplot1DView } from './1dview'\n","import React, { useEffect, useState, CSSProperties } from 'react'\nimport { makeStyles } from 'tss-react/mui'\nimport { Typography } from '@mui/material'\nimport { LoadingEllipses } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n\nconst useStyles = makeStyles()(theme => {\n const bg = theme.palette.action.disabledBackground\n return {\n loading: {\n paddingLeft: '0.6em',\n backgroundColor: theme.palette.background.default,\n backgroundImage: `repeating-linear-gradient(45deg, transparent, transparent 5px, ${bg} 5px, ${bg} 10px)`,\n textAlign: 'center',\n },\n\n blockMessage: {\n backgroundColor: bg,\n padding: '10px',\n },\n blockError: {\n backgroundColor: bg,\n padding: '10px',\n color: 'red',\n },\n }\n})\n\nfunction LoadingMessage() {\n // only show the loading message after 300ms to prevent excessive flickering\n const [shown, setShown] = useState(false)\n const { classes } = useStyles()\n useEffect(() => {\n const timeout = setTimeout(() => {\n setShown(true)\n }, 300)\n return () => {\n clearTimeout(timeout)\n }\n }, [])\n\n return shown ? (\n <div className={classes.loading}>\n <LoadingEllipses />\n </div>\n ) : null\n}\n\nfunction BlockMessage({ messageText }: { messageText: string }) {\n const { classes } = useStyles()\n return (\n <div className={classes.blockMessage}>\n <Typography>{messageText}</Typography>\n </div>\n )\n}\n\nfunction BlockError({ error }: { error: unknown }) {\n const { classes } = useStyles()\n return (\n <div className={classes.blockError}>\n <Typography>{`${error}`}</Typography>\n </div>\n )\n}\n\nconst ServerSideRenderedDotplotContent = observer(function ({\n model,\n style,\n}: {\n model: {\n error?: unknown\n message?: string\n filled?: boolean\n shouldDisplay?: boolean\n reactElement?: React.ReactElement\n }\n style: CSSProperties\n}) {\n if (model.error) {\n return <BlockError error={model.error} data-testid=\"reload_button\" />\n } else if (model.message) {\n return <BlockMessage messageText={model.message} />\n } else if (!model.filled) {\n return <LoadingMessage />\n } else if (model.shouldDisplay) {\n return <div style={style}>{model.reactElement}</div>\n }\n return null\n})\n\nexport default ServerSideRenderedDotplotContent\n","import clone from 'clone'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { getSnapshot, IAnyStateTreeNode } from 'mobx-state-tree'\nimport { getContainingView, getSession } from '@jbrowse/core/util'\n\nimport { DotplotViewModel } from '../DotplotView/model'\n\nexport function renderBlockData(self: IAnyStateTreeNode) {\n const { rpcManager } = getSession(self)\n const { rendererType } = self\n const { adapterConfig } = self\n const parent = getContainingView(self) as DotplotViewModel\n\n // Alternative to readConfObject(config) is below used because renderProps is\n // something under our control. Compare to serverSideRenderedBlock\n readConfObject(self.configuration)\n getSnapshot(parent)\n\n if (parent.initialized) {\n const { viewWidth, viewHeight, borderSize, borderX, borderY } = parent\n return {\n rendererType,\n rpcManager,\n renderProps: {\n ...self.renderProps(),\n view: clone(getSnapshot(parent)),\n width: viewWidth,\n height: viewHeight,\n borderSize,\n borderX,\n borderY,\n adapterConfig,\n rendererType: rendererType.name,\n sessionId: getRpcSessionId(self),\n timeout: 1000000, // 10000,\n },\n }\n }\n return undefined\n}\n\nexport async function renderBlockEffect(\n props?: ReturnType<typeof renderBlockData>,\n) {\n if (!props) {\n return\n }\n\n const { rendererType, rpcManager, renderProps } = props\n const { reactElement, ...data } = await rendererType.renderInClient(\n rpcManager,\n renderProps,\n )\n return {\n reactElement,\n data,\n renderingComponent: rendererType.ReactComponent,\n }\n}\n","import React from 'react'\nimport { ThemeOptions } from '@mui/material'\nimport { types, Instance } from 'mobx-state-tree'\nimport {\n getConf,\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport {\n getContainingView,\n makeAbortableReaction,\n ReactRendering,\n} from '@jbrowse/core/util'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'\n\n// locals\nimport ServerSideRenderedBlockContent from '../ServerSideRenderedBlockContent'\nimport { renderBlockData, renderBlockEffect } from './renderDotplotBlock'\nimport { DotplotViewModel, ExportSvgOptions } from '../DotplotView/model'\n\n/**\n * #stateModel DotplotDisplay\n * #category display\n */\nexport function stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'DotplotDisplay',\n BaseDisplay,\n types\n .model({\n /**\n * #property\n */\n type: types.literal('DotplotDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n })\n .volatile(() => ({\n warnings: [] as { message: string; effect: string }[],\n renderInProgress: undefined as AbortController | undefined,\n filled: false,\n data: undefined as any,\n reactElement: undefined as React.ReactElement | undefined,\n message: undefined as string | undefined,\n renderingComponent: undefined as any,\n ReactComponent2:\n ServerSideRenderedBlockContent as unknown as React.FC<any>,\n })),\n )\n .views(self => ({\n get shouldDisplay() {\n const { vview, hview } = getContainingView(self) as DotplotViewModel\n return (\n vview.bpPerPx === self.data.bpPerPxY &&\n hview.bpPerPx === self.data.bpPerPxX\n )\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return getConf(self, ['renderer', 'type'])\n },\n /**\n * #method\n */\n renderProps() {\n return {\n ...getParentRenderProps(self),\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n config: self.configuration.renderer,\n }\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n async renderSvg(opts: ExportSvgOptions & { theme?: ThemeOptions }) {\n const props = renderBlockData(self)\n if (!props) {\n return null\n }\n\n const { rendererType, rpcManager, renderProps } = props\n const rendering = await rendererType.renderInClient(rpcManager, {\n ...renderProps,\n exportSVG: opts,\n theme: opts.theme || renderProps.theme,\n })\n const { hview, vview } = getContainingView(self) as DotplotViewModel\n const offX = -hview.offsetPx + rendering.offsetX\n const offY = -vview.offsetPx + rendering.offsetY\n return (\n <g transform={`translate(${offX} ${-offY})`}>\n <ReactRendering rendering={rendering} />\n </g>\n )\n },\n }))\n .actions(self => {\n let renderInProgress: undefined | AbortController\n\n return {\n afterAttach() {\n makeAbortableReaction(\n self,\n () => renderBlockData(self),\n blockData => renderBlockEffect(blockData),\n {\n name: `${self.type} ${self.id} rendering`,\n delay: 500,\n fireImmediately: true,\n },\n this.setLoading,\n this.setRendered,\n this.setError,\n )\n },\n /**\n * #action\n */\n setLoading(abortController: AbortController) {\n self.filled = false\n self.message = undefined\n self.reactElement = undefined\n self.data = undefined\n self.error = undefined\n self.renderingComponent = undefined\n renderInProgress = abortController\n },\n /**\n * #action\n */\n setMessage(messageText: string) {\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n self.filled = false\n self.message = messageText\n self.reactElement = undefined\n self.data = undefined\n self.error = undefined\n self.renderingComponent = undefined\n renderInProgress = undefined\n },\n /**\n * #action\n */\n setRendered(args?: {\n data: any\n reactElement: React.ReactElement\n renderingComponent: React.Component\n }) {\n if (args === undefined) {\n return\n }\n const { data, reactElement, renderingComponent } = args\n self.warnings = data.warnings\n self.filled = true\n self.message = undefined\n self.reactElement = reactElement\n self.data = data\n self.error = undefined\n self.renderingComponent = renderingComponent\n renderInProgress = undefined\n },\n /**\n * #action\n */\n setError(error: unknown) {\n console.error(error)\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n // the rendering failed for some reason\n self.filled = false\n self.message = undefined\n self.reactElement = undefined\n self.data = undefined\n self.error = error\n self.renderingComponent = undefined\n renderInProgress = undefined\n },\n }\n })\n}\n\nexport type DotplotDisplayStateModel = ReturnType<typeof stateModelFactory>\nexport type DotplotDisplayModel = Instance<DotplotDisplayStateModel>\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { getContainingView } from '@jbrowse/core/util'\n\n// locals\nimport { DotplotDisplayModel } from '../stateModelFactory'\nimport { DotplotViewModel } from '../../DotplotView/model'\n\nconst DotplotDisplay = observer(function DotplotDisplay(props: {\n model: DotplotDisplayModel\n children?: React.ReactNode\n}) {\n const { model, children } = props\n const { offsetX = 0, offsetY = 0 } = model.data || {}\n const view = getContainingView(model) as DotplotViewModel\n\n const top = view.vview.offsetPx - offsetY\n const left = -(view.hview.offsetPx - offsetX)\n return (\n <div style={{ position: 'relative' }}>\n <model.ReactComponent2\n {...props}\n style={{\n position: 'absolute',\n top,\n left,\n }}\n />\n {children}\n </div>\n )\n})\n\nexport default DotplotDisplay\n","import React from 'react'\nimport { PrerenderedCanvas } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n\n// locals\nimport { DotplotRenderArgsDeserialized } from '../DotplotRenderer'\n\nconst DotplotRendering = observer(function (\n props: DotplotRenderArgsDeserialized,\n) {\n return <PrerenderedCanvas {...props} />\n})\n\nexport default DotplotRendering\n","import { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport {\n renameRegionsIfNeeded,\n renderToAbstractCanvas,\n Region,\n} from '@jbrowse/core/util'\nimport ComparativeRenderer, {\n RenderArgsDeserialized,\n RenderArgs,\n} from '@jbrowse/core/pluggableElementTypes/renderers/ComparativeServerSideRendererType'\n\n// locals\nimport { Dotplot1DView, Dotplot1DViewModel } from '../DotplotView/model'\n\nexport interface DotplotRenderArgsDeserialized extends RenderArgsDeserialized {\n adapterConfig: AnyConfigurationModel\n height: number\n width: number\n highResolutionScaling: number\n view: {\n hview: Dotplot1DViewModel\n vview: Dotplot1DViewModel\n }\n}\n\ninterface DotplotRenderArgs extends RenderArgs {\n adapterConfig: AnyConfigurationModel\n sessionId: string\n view: {\n hview: { displayedRegions: Region[] }\n vview: { displayedRegions: Region[] }\n }\n}\n\nexport default class DotplotRenderer extends ComparativeRenderer {\n supportsSVG = true\n\n async renameRegionsIfNeeded(args: DotplotRenderArgs) {\n const pm = this.pluginManager\n const assemblyManager = pm.rootModel?.session?.assemblyManager\n\n const { view, sessionId, adapterConfig } = args\n\n async function process(regions?: Region[]) {\n if (!assemblyManager) {\n throw new Error('No assembly manager provided')\n }\n const result = await renameRegionsIfNeeded(assemblyManager, {\n sessionId,\n adapterConfig,\n regions,\n })\n return result.regions\n }\n\n view.hview.displayedRegions = await process(view.hview.displayedRegions)\n view.vview.displayedRegions = await process(view.vview.displayedRegions)\n\n return args\n }\n\n async render(renderProps: DotplotRenderArgsDeserialized) {\n const {\n width,\n height,\n view: { hview, vview },\n } = renderProps\n const dimensions = [width, height]\n const views = [hview, vview].map((snap, idx) => {\n const view = Dotplot1DView.create(snap)\n view.setVolatileWidth(dimensions[idx]!)\n return view\n })\n const target = views[0]!\n const feats = await this.getFeatures({\n ...renderProps,\n regions: target.dynamicBlocks.contentBlocks,\n })\n target.setFeatures(feats)\n\n const { drawDotplot } = await import('./drawDotplot')\n const ret = await renderToAbstractCanvas(width, height, renderProps, ctx =>\n drawDotplot(ctx, { ...renderProps, views }),\n )\n\n const results = await super.render({\n ...renderProps,\n ...ret,\n height,\n width,\n })\n\n return {\n ...results,\n ...ret,\n height,\n width,\n offsetX: views[0]!.dynamicBlocks.blocks[0]?.offsetPx || 0,\n offsetY: views[1]!.dynamicBlocks.blocks[0]?.offsetPx || 0,\n bpPerPxX: views[0]!.bpPerPx,\n bpPerPxY: views[1]!.bpPerPx,\n }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config DotplotRenderer\n * #category renderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default ConfigurationSchema(\n 'DotplotRenderer',\n {\n /**\n * #slot\n */\n color: {\n type: 'color',\n description:\n 'the color of each feature in a synteny, used with colorBy:default',\n defaultValue: '#f0f',\n contextVariable: ['feature'],\n },\n\n /**\n * #slot\n */\n posColor: {\n type: 'color',\n description: 'the color for forward alignments, used with colorBy:strand',\n defaultValue: 'blue',\n },\n /**\n * #slot\n */\n negColor: {\n type: 'color',\n description: 'the color for reverse alignments, used with colorBy:strand',\n defaultValue: 'red',\n },\n\n /**\n * #slot\n */\n lineWidth: {\n type: 'number',\n description: 'width of the lines to be drawn',\n defaultValue: 2.5, // 2.5 is similar to D-GENIES\n },\n\n /**\n * #slot\n */\n colorBy: {\n type: 'stringEnum',\n model: types.enumeration('colorBy', [\n 'identity',\n 'meanQueryIdentity',\n 'mappingQuality',\n 'strand',\n 'default',\n ]),\n description: `Color by options:<br/>\n<ul>\n <li>\"identity\" - the identity of the particular hit, similar to D-GENIES, use the other config slots 'thresholds' and 'thresholdsPalette' to define colors for this setting</li>\n <li>\"meanQueryIdentity\" - calculates the weighted mean identity (weighted by alignment length) of all the hits that the query maps to (e.g. if the query is split aligned to many target, uses their weighted mean. can help show patterns of more related and distant synteny after WGD)</li>\n <li>\"mappingQuality\" - uses mapping quality from PAF, some adapters don't have this setting</li>\n <li>\"strand\" - colors negative alignments with negColor and positive alignments with posColor</li>\n <li>\"default\" - uses the 'color' config slot</li>\n</ul>`,\n defaultValue: 'default',\n },\n\n /**\n * #slot\n */\n thresholdsPalette: {\n type: 'stringArray',\n defaultValue: ['#094b09', '#2ebd40', '#d5670b', '#ffd84b'],\n description: 'threshold colors, used with colorBy:identity',\n },\n\n /**\n * #slot\n */\n thresholds: {\n type: 'stringArray',\n defaultValue: ['0.75', '0.5', '0.25', '0'],\n description: 'threshold breakpoints, used with colorBy:identity',\n },\n },\n { explicitlyTyped: true },\n)\n","import { checkAbortSignal } from '@jbrowse/core/util'\nimport RpcMethodType from '@jbrowse/core/pluggableElementTypes/RpcMethodType'\nimport ComparativeRenderer, {\n RenderArgs as ComparativeRenderArgs,\n RenderArgsSerialized as ComparativeRenderArgsSerialized,\n RenderResults,\n ResultsSerialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/ComparativeServerSideRendererType'\nimport { RemoteAbortSignal } from '@jbrowse/core/rpc/remoteAbortSignals'\n\ninterface RenderArgs extends ComparativeRenderArgs {\n adapterConfig: Record<string, unknown>\n rendererType: string\n}\n\ninterface RenderArgsSerialized extends ComparativeRenderArgsSerialized {\n adapterConfig: Record<string, unknown>\n rendererType: string\n}\n\n/**\n * call a synteny renderer with the given args\n * param views: a set of views that each contain a set of regions\n * used instead of passing regions directly as in render()\n */\nexport default class ComparativeRender extends RpcMethodType {\n name = 'ComparativeRender'\n\n async renameRegionsIfNeeded(args: RenderArgs, rend: ComparativeRenderer) {\n return rend.renameRegionsIfNeeded(args)\n }\n\n getRenderer(rendererType: string) {\n const pm = this.pluginManager\n return pm.getRendererType(rendererType) as ComparativeRenderer\n }\n\n async serializeArguments(args: RenderArgs, rpcDriver: string) {\n const { rendererType } = args\n const renderer = this.getRenderer(rendererType)\n const n = (await super.serializeArguments(args, rpcDriver)) as RenderArgs\n const result = await this.renameRegionsIfNeeded(n, renderer)\n\n return rpcDriver === 'MainThreadRpcDriver'\n ? result\n : renderer.serializeArgsInClient(result)\n }\n\n async execute(\n args: RenderArgsSerialized & { signal?: RemoteAbortSignal },\n rpcDriver: string,\n ) {\n let deserializedArgs = args\n if (rpcDriver !== 'MainThreadRpcDriver') {\n deserializedArgs = await this.deserializeArguments(args, rpcDriver)\n }\n const { sessionId, rendererType, signal } = deserializedArgs\n if (!sessionId) {\n throw new Error('must pass a unique session id')\n }\n\n checkAbortSignal(signal)\n\n const renderer = this.getRenderer(rendererType)\n return rpcDriver === 'MainThreadRpcDriver'\n ? renderer.render(deserializedArgs)\n : renderer.renderInWorker(deserializedArgs)\n }\n\n async deserializeReturn(\n val: RenderResults | ResultsSerialized,\n args: RenderArgs,\n rpcDriver: string,\n ): Promise<unknown> {\n const ret = (await super.deserializeReturn(\n val,\n args,\n rpcDriver,\n )) as ResultsSerialized\n if (rpcDriver === 'MainThreadRpcDriver') {\n return ret\n }\n\n const renderer = this.getRenderer(args.rendererType)\n return renderer.deserializeResultsInClient(ret, args)\n }\n}\n","import { getConf } from '@jbrowse/core/configuration'\nimport { getSession, Feature, gatherOverlaps } from '@jbrowse/core/util'\nimport {\n LinearPileupDisplayModel,\n MismatchParser,\n} from '@jbrowse/plugin-alignments'\n\n// locals\nimport { ReducedFeature } from '../util'\n\nconst { featurizeSA, getClip, getTag, getLength, getLengthSansClipping } =\n MismatchParser\n\nexport function onClick(feature: Feature, self: LinearPileupDisplayModel) {\n const session = getSession(self)\n try {\n const cigar = feature.get('CIGAR')\n const clipPos = getClip(cigar, 1)\n const flags = feature.get('flags')\n const strand = feature.get('strand')\n const readName = feature.get('name')\n const readAssembly = `${readName}_assembly_${Date.now()}`\n const { parentTrack } = self\n const [trackAssembly] = getConf(parentTrack, 'assemblyNames')\n const assemblyNames = [trackAssembly, readAssembly]\n const trackId = `track-${Date.now()}`\n const trackName = `${readName}_vs_${trackAssembly}`\n const SA = (getTag(feature, 'SA') as string) || ''\n const SA2 = featurizeSA(SA, feature.id(), strand, readName, true)\n\n const feat = feature.toJSON()\n feat.strand = 1\n feat.mate = {\n refName: readName,\n start: clipPos,\n end: clipPos + getLengthSansClipping(cigar),\n }\n\n // if secondary alignment or supplementary, calculate length from SA[0]'s\n // CIGAR which is the primary alignments. otherwise it is the primary\n // alignment just use seq.length if primary alignment\n const totalLength = getLength(flags & 2048 ? SA2[0]!.CIGAR : cigar)\n\n const features = [feat, ...SA2] as ReducedFeature[]\n\n features.sort((a, b) => a.clipPos - b.clipPos)\n\n const refLength = features.reduce((a, f) => a + f.end - f.start, 0)\n\n session.addView('DotplotView', {\n type: 'DotplotView',\n hview: {\n offsetPx: 0,\n bpPerPx: refLength / 800,\n displayedRegions: gatherOverlaps(\n features.map((f, index) => {\n const { start, end, refName } = f\n return {\n start,\n end,\n refName,\n index,\n assemblyName: trackAssembly,\n }\n }),\n ),\n },\n vview: {\n offsetPx: 0,\n bpPerPx: totalLength / 400,\n minimumBlockWidth: 0,\n interRegionPaddingWidth: 0,\n displayedRegions: [\n {\n assemblyName: readAssembly,\n start: 0,\n end: totalLength,\n refName: readName,\n },\n ],\n },\n\n viewTrackConfigs: [\n {\n type: 'SyntenyTrack',\n assemblyNames,\n adapter: {\n type: 'FromConfigAdapter',\n features,\n },\n trackId,\n name: trackName,\n },\n ],\n assemblyNames,\n tracks: [\n {\n configuration: trackId,\n type: 'SyntenyTrack',\n displays: [\n {\n type: 'DotplotDisplay',\n configuration: `${trackId}-DotplotDisplay`,\n },\n ],\n },\n ],\n\n displayName: `${readName} vs ${trackAssembly}`,\n })\n } catch (e) {\n console.error(e)\n session.notifyError(`${e}`, e)\n }\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel, isAbstractMenuManager } from '@jbrowse/core/util'\n\n// icons\nimport TimelineIcon from '@mui/icons-material/Timeline'\n\n// locals\nimport DotplotViewF from './DotplotView'\nimport DotplotDisplayF from './DotplotDisplay'\nimport DotplotRendererF from './DotplotRenderer'\nimport LaunchDotplotViewF from './LaunchDotplotView'\nimport ComparativeRenderer from './ComparativeRenderer'\nimport DotplotReadVsRefMenuItem from './DotplotReadVsRef'\n\nexport default class DotplotPlugin extends Plugin {\n name = 'DotplotPlugin'\n\n install(pluginManager: PluginManager) {\n DotplotViewF(pluginManager)\n DotplotDisplayF(pluginManager)\n DotplotRendererF(pluginManager)\n LaunchDotplotViewF(pluginManager)\n DotplotReadVsRefMenuItem(pluginManager)\n\n // install our comparative rendering rpc callback\n pluginManager.addRpcMethod(() => new ComparativeRenderer(pluginManager))\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToSubMenu(['Add'], {\n label: 'Dotplot view',\n icon: TimelineIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('DotplotView', {})\n },\n })\n }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport { stateModelFactory } from './stateModelFactory'\nimport ReactComponent from './components/DotplotDisplay'\n\nexport default function DotplotDisplayF(pm: PluginManager) {\n pm.addDisplayType(() => {\n const configSchema = configSchemaFactory(pm)\n return new DisplayType({\n name: 'DotplotDisplay',\n displayName: 'Dotplot display',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'SyntenyTrack',\n viewType: 'DotplotView',\n ReactComponent,\n })\n })\n}\n\n/**\n * #config DotplotDisplay\n */\nexport function configSchemaFactory(pm: any) {\n return ConfigurationSchema(\n 'DotplotDisplay',\n {\n /**\n * #slot\n */\n renderer: types.optional(pm.pluggableConfigSchemaType('renderer'), {\n type: 'DotplotRenderer',\n }),\n },\n {\n /**\n * #identifier\n */\n explicitIdentifier: 'displayId',\n explicitlyTyped: true,\n },\n )\n}\n","import { lazy } from 'react'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n// locals\nimport stateModelFactory from './model'\n\nexport default function DotplotViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'DotplotView',\n displayName: 'Dotplot view',\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/DotplotView')),\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport ReactComponent from './components/DotplotRendering'\nimport DotplotRenderer from './DotplotRenderer'\nimport configSchema from './configSchema'\n\nexport default function DotplotRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new DotplotRenderer({\n name: 'DotplotRenderer',\n configSchema: configSchema,\n ReactComponent,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport { DotplotViewModel } from './DotplotView/model'\nimport { transaction } from 'mobx'\n\nexport default function LaunchDotplotView(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-DotplotView',\n // @ts-expect-error\n async ({\n session,\n views,\n tracks = [],\n }: {\n session: AbstractSessionModel\n views: { loc: string; assembly: string; tracks?: string[] }[]\n tracks?: string[]\n }) => {\n try {\n const model = session.addView('DotplotView', {}) as DotplotViewModel\n const assemblyNames = views.map(view => view.assembly)\n\n transaction(() => {\n model.setViews([\n { bpPerPx: 0.1, offsetPx: 0 },\n { bpPerPx: 0.1, offsetPx: 0 },\n ])\n model.setAssemblyNames(assemblyNames[0]!, assemblyNames[1]!)\n })\n\n // http://localhost:3000/?config=test_data%2Fvolvox%2Fconfig.json&session=spec-{\"views\":[{\"type\":\"DotplotView\",\"views\":[{\"assembly\":\"volvox\"},{\"assembly\":\"volvox\"}],\"tracks\":[\"volvox_fake_synteny\"]}]}\n\n const idsNotFound = [] as string[]\n tracks.forEach(track => {\n tryTrack(model, track, idsNotFound)\n })\n\n if (idsNotFound.length) {\n throw new Error(\n `Could not resolve identifiers: ${idsNotFound.join(',')}`,\n )\n }\n } catch (e) {\n session.notifyError(`${e}`, e)\n throw e\n }\n },\n )\n}\n\nfunction tryTrack(\n model: { showTrack: (arg: string) => void },\n trackId: string,\n idsNotFound: string[],\n) {\n try {\n model.showTrack(trackId)\n } catch (e) {\n if (/Could not resolve identifier/.exec(`${e}`)) {\n idsNotFound.push(trackId)\n } else {\n throw e\n }\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport {\n DisplayType,\n PluggableElementType,\n} from '@jbrowse/core/pluggableElementTypes'\nimport { LinearPileupDisplayModel } from '@jbrowse/plugin-alignments'\n\n// icons\nimport AddIcon from '@mui/icons-material/Add'\n\n// local\nimport { onClick } from './DotplotReadVsRef'\n\nexport default function DotplotReadVsRefMenuItem(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-extendPluggableElement',\n (pluggableElement: PluggableElementType) => {\n if (pluggableElement.name === 'LinearPileupDisplay') {\n const { stateModel } = pluggableElement as DisplayType\n const newStateModel = stateModel.extend(\n (self: LinearPileupDisplayModel) => {\n const superContextMenuItems = self.contextMenuItems\n return {\n views: {\n contextMenuItems() {\n const feature = self.contextMenuFeature\n return [\n ...superContextMenuItems(),\n ...(feature\n ? [\n {\n label: 'Dotplot of read vs ref',\n icon: AddIcon,\n onClick: () => {\n onClick(feature, self)\n },\n },\n ]\n : []),\n ]\n },\n },\n }\n },\n )\n\n ;(pluggableElement as DisplayType).stateModel = newStateModel\n }\n return pluggableElement\n },\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config GtfAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst GtfAdapter = ConfigurationSchema(\n 'GtfAdapter',\n {\n /**\n * #slot\n */\n gtfLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.gtf', locationType: 'UriLocation' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default GtfAdapter\n","import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\nimport { configSchema as gtfAdapterConfigSchema } from './GtfAdapter'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport { AdapterGuesser, getFileName } from '@jbrowse/core/util/tracks'\n\nexport default class GtfPlugin extends Plugin {\n name = 'GTFPlugin'\n\n install(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'GtfAdapter',\n displayName: 'GTF adapter',\n configSchema: gtfAdapterConfigSchema,\n getAdapterClass: () =>\n import('./GtfAdapter/GtfAdapter').then(r => r.default),\n }),\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.gtf(\\.gz)?$/i\n const adapterName = 'GtfAdapter'\n const fileName = getFileName(file)\n\n const obj = {\n type: adapterName,\n gtfLocation: file,\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n } else if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n }\n}\n","import { types } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config Gff3TabixAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst Gff3TabixAdapter = ConfigurationSchema(\n 'Gff3TabixAdapter',\n {\n /**\n * #slot\n */\n gffGzLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.gff.gz', locationType: 'UriLocation' },\n },\n\n index: ConfigurationSchema('Gff3TabixIndex', {\n /**\n * #slot index.indexType\n */\n indexType: {\n model: types.enumeration('IndexType', ['TBI', 'CSI']),\n type: 'stringEnum',\n defaultValue: 'TBI',\n },\n /**\n * #slot index.indexType\n */\n location: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.gff.gz.tbi',\n locationType: 'UriLocation',\n },\n },\n }),\n /**\n * #slot\n * the Gff3TabixAdapter has to \"redispatch\" if it fetches a region and\n * features it finds inside that region extend outside the region we requested.\n * you can disable this for certain feature types to avoid fetching e.g. the\n * entire chromosome\n */\n dontRedispatch: {\n type: 'stringArray',\n defaultValue: ['chromosome', 'region', 'contig'],\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default Gff3TabixAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config Gff3Adapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst Gff3Adapter = ConfigurationSchema(\n 'Gff3Adapter',\n {\n /**\n * #slot\n */\n gffLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.gff', locationType: 'UriLocation' },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default Gff3Adapter\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\n\nimport Gff3TabixAdapterF from './Gff3TabixAdapter'\nimport Gff3AdapterF from './Gff3Adapter'\nimport GuessGff3F from './GuessGff3'\n\nexport default class GFF3Plugin extends Plugin {\n name = 'GFF3Plugin'\n\n install(pluginManager: PluginManager) {\n Gff3TabixAdapterF(pluginManager)\n Gff3AdapterF(pluginManager)\n GuessGff3F(pluginManager)\n }\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\n\nexport default function Gff3TabixAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'Gff3TabixAdapter',\n displayName: 'GFF3 tabix adapter',\n configSchema,\n getAdapterClass: () =>\n import('./Gff3TabixAdapter').then(r => r.default),\n }),\n )\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\n\nexport default function Gff3AdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'Gff3Adapter',\n displayName: 'GFF3 adapter',\n configSchema,\n getAdapterClass: () => import('./Gff3Adapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n makeIndex,\n makeIndexType,\n getFileName,\n AdapterGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default function GuessGff3F(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.gff3?\\.b?gz$/i\n const adapterName = 'Gff3TabixAdapter'\n const fileName = getFileName(file)\n const indexName = index && getFileName(index)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n bamLocation: file,\n gffGzLocation: file,\n index: {\n location: index || makeIndex(file, '.tbi'),\n indexType: makeIndexType(indexName, 'CSI', 'TBI'),\n },\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.gff3?$/i\n const adapterName = 'Gff3Adapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n gffLocation: file,\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n}\n","import { types } from 'mobx-state-tree'\n\n/**\n * #stateModel\n */\nexport const Job = types\n .model('Job', {\n /**\n * #property\n */\n name: types.string,\n /**\n * #property\n */\n statusMessage: types.maybe(types.string),\n /**\n * #property\n */\n progressPct: types.number,\n })\n .volatile(() => ({\n cancelCallback() {},\n }))\n .actions(self => ({\n /**\n * #action\n */\n setCancelCallback(cancelCallback: () => void) {\n self.cancelCallback = cancelCallback\n },\n\n /**\n * #action\n */\n setStatusMessage(message?: string) {\n self.statusMessage = message\n },\n\n /**\n * #action\n */\n setProgressPct(pct: number) {\n self.progressPct = pct\n },\n }))\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport { lazy } from 'react'\n\nimport { stateModelFactory } from './model'\nexport const configSchema = ConfigurationSchema('JobsListWidget', {})\n\nexport default function JobsListWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'JobsListWidget',\n heading: 'Jobs list',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/JobsListWidget')),\n })\n })\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { SessionWithWidgets, isAbstractMenuManager } from '@jbrowse/core/util'\nimport { Indexing } from '@jbrowse/core/ui/Icons'\nimport { isSessionModelWithWidgets } from '@jbrowse/core/util'\nimport JobsListWidgetF from './JobsListWidget'\n\nexport default class JobsManagementPlugin extends Plugin {\n name = 'JobsManagementPlugin'\n\n install(pluginManager: PluginManager) {\n JobsListWidgetF(pluginManager)\n }\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToMenu('Tools', {\n label: 'Jobs list',\n icon: Indexing, // TODO: pick a better icon\n onClick: (session: SessionWithWidgets) => {\n if (isSessionModelWithWidgets(session)) {\n const { widgets } = session\n let jobStatusWidget = widgets.get('JobsList')\n if (!jobStatusWidget) {\n jobStatusWidget = session.addWidget('JobsListWidget', 'JobsList')\n session.showWidget(jobStatusWidget)\n } else {\n session.showWidget(jobStatusWidget)\n }\n }\n },\n })\n }\n }\n}\n","import { types, Instance, SnapshotIn } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { Job } from './jobModel'\n\nexport interface NewJob extends SnapshotIn<typeof Job> {\n cancelCallback(): void\n setStatusMessage(msg?: string): void\n}\n\n/**\n * #stateModel JobsListModel\n */\nexport function stateModelFactory(_pluginManager: PluginManager) {\n return types\n .model('JobsListModel', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('JobsListWidget'),\n /**\n * #property\n */\n jobs: types.array(Job),\n /**\n * #property\n */\n finished: types.array(Job),\n /**\n * #property\n */\n queued: types.array(Job),\n /**\n * #property\n */\n aborted: types.array(Job),\n })\n .actions(self => ({\n /**\n * #action\n */\n addJob(job: NewJob) {\n const { cancelCallback } = job\n const length = self.jobs.push(job)\n const addedJob = self.jobs[length - 1]!\n addedJob.setCancelCallback(cancelCallback)\n return addedJob\n },\n /**\n * #action\n */\n removeJob(jobName: string) {\n const indx = self.jobs.findIndex(job => job.name === jobName)\n const removed = self.jobs[indx]\n self.jobs.splice(indx, 1)\n return removed\n },\n /**\n * #action\n */\n addFinishedJob(job: NewJob) {\n self.finished.push(job)\n return self.finished\n },\n /**\n * #action\n */\n addQueuedJob(job: NewJob) {\n self.queued.push(job)\n return self.finished\n },\n /**\n * #action\n */\n addAbortedJob(job: NewJob) {\n self.aborted.push(job)\n return self.aborted\n },\n /**\n * #action\n */\n removeQueuedJob(jobName: string) {\n const indx = self.queued.findIndex(job => job.name === jobName)\n const removed = self.queued[indx]\n self.queued.splice(indx, 1)\n return removed\n },\n /**\n * #action\n */\n updateJobStatusMessage(jobName: string, message?: string) {\n const job = self.jobs.find(job => job.name === jobName)\n if (!job) {\n throw new Error(`No job found with name ${jobName}`)\n }\n job.setStatusMessage(message)\n },\n /**\n * #action\n */\n updateJobProgressPct(jobName: string, pct: number) {\n const job = self.jobs.find(job => job.name === jobName)\n if (!job) {\n throw new Error(`No job found with name ${jobName}`)\n }\n job.setProgressPct(pct)\n },\n }))\n}\n\nexport type JobsListStateModel = ReturnType<typeof stateModelFactory>\nexport type JobsListModel = Instance<JobsListStateModel>\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config NCListAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst NCListAdapter = ConfigurationSchema(\n 'NCListAdapter',\n {\n /**\n * #slot\n */\n rootUrlTemplate: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my/{refseq}/trackData.json',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n refNames: {\n type: 'stringArray',\n defaultValue: [],\n description: 'List of refNames used by the NCList used for aliasing',\n },\n },\n { explicitlyTyped: true },\n)\nexport default NCListAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config JBrowse1TextSearchAdapter\n * note: metadata about tracks and assemblies covered by text search adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default ConfigurationSchema(\n 'JBrowse1TextSearchAdapter',\n {\n /**\n * #slot\n */\n namesIndexLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/volvox/names', locationType: 'UriLocation' },\n description: 'the location of the JBrowse1 names index data directory',\n },\n /**\n * #slot\n */\n tracks: {\n type: 'stringArray',\n defaultValue: [],\n description: 'List of tracks covered by text search adapter',\n },\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description: 'List of assemblies covered by text search adapter',\n },\n },\n {\n explicitlyTyped: true,\n /**\n * #identifier\n */\n explicitIdentifier: 'textSearchAdapterId',\n },\n)\n","import { baseConnectionConfig } from '@jbrowse/core/pluggableElementTypes/models'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config JBrowse1Connection\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst JBrowse1Connection = ConfigurationSchema(\n 'JBrowse1Connection',\n {\n /**\n * #slot\n */\n dataDirLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: 'http://mysite.com/jbrowse/data/',\n locationType: 'UriLocation',\n },\n description:\n 'the location of the JBrowse 1 data directory, often something like http://mysite.com/jbrowse/data/',\n },\n /**\n * #slot\n */\n assemblyNames: {\n description:\n 'name of the assembly the connection belongs to, should be a single entry',\n type: 'stringArray',\n defaultValue: [],\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseConnectionConfig,\n },\n)\n\nexport default JBrowse1Connection\n","import {\n ConfigurationReference,\n getConf,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseConnectionModelFactory } from '@jbrowse/core/pluggableElementTypes/models'\nimport { types } from 'mobx-state-tree'\n\n// locals\nimport configSchema from './configSchema'\n\nexport default function stateModelFactory(pluginManager: PluginManager) {\n return types\n .compose(\n 'JBrowse1Connection',\n BaseConnectionModelFactory(pluginManager),\n types.model({\n configuration: ConfigurationReference(configSchema),\n type: types.literal('JBrowse1Connection'),\n }),\n )\n\n .actions(self => ({\n async connect() {\n const session = getSession(self)\n try {\n const dataDirLocation = getConf(self, 'dataDirLocation')\n const { fetchJb1 } = await import('./jb1ConfigLoad')\n const { convertTrackConfig } = await import('./jb1ToJb2')\n const config = await fetchJb1(dataDirLocation)\n const assemblyName = getConf(self, 'assemblyNames')[0]\n if (!assemblyName) {\n throw new Error('assembly name required for JBrowse 1 connection')\n }\n const conf = session.assemblies.find(\n a => readConfObject(a, 'name') === assemblyName,\n )\n if (!conf) {\n throw new Error(`Assembly \"${assemblyName}\" not found`)\n }\n const sequenceAdapter = readConfObject(conf, ['sequence', 'adapter'])\n\n // @ts-expect-error\n const jb2Tracks = config.tracks?.map(jb1Track => ({\n ...convertTrackConfig(\n jb1Track,\n config.dataRoot || '',\n sequenceAdapter,\n ),\n assemblyNames: [assemblyName],\n }))\n\n self.setTrackConfs(jb2Tracks)\n } catch (error) {\n console.error(error)\n session.notifyError(\n `There was a problem connecting to the JBrowse 1 data directory \"${self.name}\". Please make sure you have entered a valid location. The error that was thrown is: \"${error}\"`,\n error,\n )\n session.breakConnection?.(self.configuration)\n }\n },\n }))\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport NCListAdapterF from './NCListAdapter'\nimport JBrowse1TextSearchAdapterF from './JBrowse1TextSearchAdapter'\nimport JBrowse1ConnectionF from './JBrowse1Connection'\nimport GuessNCListF from './GuessNCList'\n\nexport default class LegacyJBrowsePlugin extends Plugin {\n name = 'LegacyJBrowsePlugin'\n\n install(pluginManager: PluginManager) {\n NCListAdapterF(pluginManager)\n GuessNCListF(pluginManager)\n JBrowse1TextSearchAdapterF(pluginManager)\n JBrowse1ConnectionF(pluginManager)\n }\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport configSchema from './configSchema'\n\nexport default function NCListAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'NCListAdapter',\n displayName: 'NCList adapter',\n configSchema,\n getAdapterClass: () => import('./NCListAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AdapterGuesser, getFileName } from '@jbrowse/core/util/tracks'\nimport { FileLocation } from '@jbrowse/core/util/types'\n\nexport default function GuessNCListF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /trackData.jsonz?$/i\n const adapterName = 'NCListAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n rootUrlTemplate: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport TextSearchAdapterType from '@jbrowse/core/pluggableElementTypes/TextSearchAdapterType'\n\n// locals\nimport configSchema from './configSchema'\n\nexport default function JBrowse1TextSearchAdapterF(\n pluginManager: PluginManager,\n) {\n pluginManager.addTextSearchAdapterType(\n () =>\n new TextSearchAdapterType({\n name: 'JBrowse1TextSearchAdapter',\n configSchema,\n description: 'A JBrowse 1 text search adapter',\n getAdapterClass: () =>\n import('./JBrowse1TextSearchAdapter').then(t => t.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport ConnectionType from '@jbrowse/core/pluggableElementTypes/ConnectionType'\n\n// locals\nimport modelFactory from './model'\nimport configSchema from './configSchema'\n\nexport default function JBrowse1ConnectionF(pluginManager: PluginManager) {\n pluginManager.addConnectionType(\n () =>\n new ConnectionType({\n name: 'JBrowse1Connection',\n configSchema,\n stateModel: modelFactory(pluginManager),\n displayName: 'JBrowse 1 Data',\n description: 'A JBrowse 1 data directory',\n url: '//jbrowse.org/',\n }),\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config LinearComparativeDisplay\n */\nfunction configSchemaFactory(_pluginManager: any) {\n return ConfigurationSchema(\n 'LinearComparativeDisplay',\n {},\n {\n explicitlyTyped: true,\n\n /**\n * #identifier\n */\n explicitIdentifier: 'displayId',\n },\n )\n}\n\nexport default configSchemaFactory\n","import {\n readConfObject,\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport { types, getSnapshot, Instance } from 'mobx-state-tree'\nimport {\n dedupe,\n Feature,\n getContainingView,\n getSession,\n makeAbortableReaction,\n} from '@jbrowse/core/util'\nimport { getRpcSessionId } from '@jbrowse/core/util/tracks'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes/models'\nimport { LinearComparativeViewModel } from '../LinearComparativeView/model'\n\n/**\n * #stateModel LinearComparativeDisplay\n * extends\n * - [BaseDisplay](../basedisplay)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearComparativeDisplay',\n BaseDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearComparativeDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n height: 100,\n }),\n )\n .volatile((/* self */) => ({\n renderInProgress: undefined as AbortController | undefined,\n features: undefined as Feature[] | undefined,\n message: undefined as string | undefined,\n }))\n .views(self => ({\n /**\n * #getter\n */\n renderProps() {\n return {\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n highResolutionScaling: 2,\n }\n },\n }))\n .actions(self => {\n let renderInProgress: undefined | AbortController\n\n return {\n /**\n * #action\n * controlled by a reaction\n */\n setLoading(abortController: AbortController) {\n self.message = undefined\n self.error = undefined\n renderInProgress = abortController\n },\n\n /**\n * #action\n * controlled by a reaction\n */\n setMessage(messageText: string) {\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n self.message = messageText\n self.error = undefined\n renderInProgress = undefined\n },\n\n /**\n * #action\n * controlled by a reaction\n */\n setRendered(args?: { features: Feature[] }) {\n if (!args) {\n return\n }\n const { features } = args\n const existingFeatures = self.features || []\n\n const featIds = new Set(existingFeatures.map(f => f.id()))\n const newFeatIds = new Set(features.map(f => f.id()))\n\n let foundNewFeatureNotInExistingMap = false\n let foundExistingFeatureNotInNewMap = false\n for (const feat of features) {\n if (!featIds.has(feat.id())) {\n foundNewFeatureNotInExistingMap = true\n break\n }\n }\n for (const existingFeat of existingFeatures) {\n if (!newFeatIds.has(existingFeat.id())) {\n foundExistingFeatureNotInNewMap = true\n break\n }\n }\n\n self.message = undefined\n self.error = undefined\n renderInProgress = undefined\n\n if (\n foundNewFeatureNotInExistingMap ||\n foundExistingFeatureNotInNewMap ||\n !self.features\n ) {\n self.features = features\n }\n },\n\n /**\n * #action\n * controlled by a reaction\n */\n setError(error: unknown) {\n console.error(error)\n if (renderInProgress && !renderInProgress.signal.aborted) {\n renderInProgress.abort()\n }\n // the rendering failed for some reason\n self.message = undefined\n self.error = error\n renderInProgress = undefined\n },\n }\n })\n .actions(self => ({\n afterAttach() {\n makeAbortableReaction(\n // @ts-expect-error\n self,\n renderBlockData,\n renderBlockEffect,\n {\n name: `${self.type} ${self.id} rendering`,\n delay: 1000,\n fireImmediately: true,\n },\n self.setLoading,\n self.setRendered,\n self.setError,\n )\n },\n }))\n}\nfunction renderBlockData(self: LinearComparativeDisplay) {\n const { rpcManager } = getSession(self)\n const display = self\n\n // Alternative to readConfObject(config) is below used because renderProps is\n // something under our control. Compare to serverSideRenderedBlock\n readConfObject(self.configuration)\n\n const { adapterConfig } = self\n const parent = getContainingView(self) as LinearComparativeViewModel\n const sessionId = getRpcSessionId(self)\n getSnapshot(parent)\n\n return parent.initialized\n ? {\n rpcManager,\n renderProps: {\n ...display.renderProps(),\n view: parent,\n adapterConfig,\n sessionId,\n timeout: 1000000,\n self,\n },\n }\n : undefined\n}\n\nasync function renderBlockEffect(props: ReturnType<typeof renderBlockData>) {\n if (!props) {\n return\n }\n\n const { rpcManager, renderProps } = props\n const { adapterConfig } = renderProps\n const view0 = renderProps.view.views[0]\n\n const features = (await rpcManager.call('getFeats', 'CoreGetFeatures', {\n regions: view0.staticBlocks.contentBlocks,\n sessionId: 'getFeats',\n adapterConfig,\n })) as Feature[]\n\n return {\n features: dedupe(features, f => f.id()),\n }\n}\n\nexport default stateModelFactory\nexport type LinearComparativeDisplayModel = ReturnType<typeof stateModelFactory>\nexport type LinearComparativeDisplay = Instance<LinearComparativeDisplayModel>\n","import { lazy } from 'react'\nimport {\n addDisposer,\n cast,\n getPath,\n getRoot,\n resolveIdentifier,\n types,\n Instance,\n SnapshotIn,\n} from 'mobx-state-tree'\nimport { autorun, transaction } from 'mobx'\n\n// jbrowse\nimport BaseViewModel from '@jbrowse/core/pluggableElementTypes/models/BaseViewModel'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport { getSession, isSessionModelWithWidgets, avg } from '@jbrowse/core/util'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport {\n LinearGenomeViewModel,\n LinearGenomeViewStateModel,\n} from '@jbrowse/plugin-linear-genome-view'\n\n// icons\nimport { TrackSelector as TrackSelectorIcon } from '@jbrowse/core/ui/Icons'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\n\n// lazies\nconst ReturnToImportFormDialog = lazy(\n () => import('@jbrowse/core/ui/ReturnToImportFormDialog'),\n)\n\n/**\n * #stateModel LinearComparativeView\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nfunction stateModelFactory(pluginManager: PluginManager) {\n return types\n .compose(\n 'LinearComparativeView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('LinearComparativeView'),\n /**\n * #property\n */\n trackSelectorType: 'hierarchical',\n /**\n * #property\n */\n showIntraviewLinks: true,\n /**\n * #property\n */\n interactToggled: false,\n /**\n * #property\n */\n middleComparativeHeight: 100,\n /**\n * #property\n */\n tracks: types.array(\n pluginManager.pluggableMstType('track', 'stateModel'),\n ),\n /**\n * #property\n * currently this is limited to an array of two\n */\n views: types.array(\n pluginManager.getViewType('LinearGenomeView')!\n .stateModel as LinearGenomeViewStateModel,\n ),\n\n /**\n * #property\n * this represents tracks specific to this view specifically used for\n * read vs ref dotplots where this track would not really apply\n * elsewhere\n */\n viewTrackConfigs: types.array(\n pluginManager.pluggableConfigSchemaType('track'),\n ),\n }),\n )\n .volatile(() => ({\n /**\n * #volatile\n */\n width: undefined as number | undefined,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get highResolutionScaling() {\n return 2\n },\n /**\n * #getter\n */\n get initialized() {\n return (\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n self.width !== undefined &&\n self.views.length > 0 &&\n self.views.every(view => view.initialized)\n )\n },\n\n /**\n * #getter\n */\n get refNames() {\n return self.views.map(v => [\n ...new Set(v.staticBlocks.map(m => m.refName)),\n ])\n },\n\n /**\n * #getter\n */\n get assemblyNames() {\n return [...new Set(self.views.flatMap(v => v.assemblyNames))]\n },\n }))\n .actions(self => ({\n // automatically removes session assemblies associated with this view\n // e.g. read vs ref\n beforeDestroy() {\n const session = getSession(self)\n for (const name of self.assemblyNames) {\n session.removeTemporaryAssembly?.(name)\n }\n },\n\n onSubviewAction(actionName: string, path: string, args?: unknown[]) {\n self.views.forEach(view => {\n const ret = getPath(view)\n if (!ret.endsWith(path)) {\n // @ts-expect-error\n view[actionName](args?.[0])\n }\n })\n },\n\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.width = newWidth\n },\n\n /**\n * #action\n */\n setViews(views: SnapshotIn<LinearGenomeViewModel>[]) {\n self.views = cast(views)\n },\n\n /**\n * #action\n */\n removeView(view: LinearGenomeViewModel) {\n self.views.remove(view)\n },\n\n /**\n * #action\n */\n setMiddleComparativeHeight(n: number) {\n self.middleComparativeHeight = n\n return self.middleComparativeHeight\n },\n\n /**\n * #action\n */\n activateTrackSelector() {\n if (self.trackSelectorType === 'hierarchical') {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const selector = session.addWidget(\n 'HierarchicalTrackSelectorWidget',\n 'hierarchicalTrackSelector',\n { view: self },\n )\n session.showWidget(selector)\n return selector\n }\n return undefined\n }\n throw new Error(`invalid track selector type ${self.trackSelectorType}`)\n },\n\n /**\n * #action\n */\n toggleTrack(trackId: string) {\n const hiddenCount = this.hideTrack(trackId)\n if (!hiddenCount) {\n this.showTrack(trackId)\n return true\n }\n return false\n },\n\n /**\n * #action\n */\n showTrack(trackId: string, initialSnapshot = {}) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const configuration = resolveIdentifier(schema, getRoot(self), trackId)\n if (!configuration) {\n throw new Error(`track not found ${trackId}`)\n }\n const trackType = pluginManager.getTrackType(configuration.type)\n if (!trackType) {\n throw new Error(`unknown track type ${configuration.type}`)\n }\n const viewType = pluginManager.getViewType(self.type)!\n const supportedDisplays = new Set(\n viewType.displayTypes.map(d => d.name),\n )\n const displayConf = configuration.displays.find(\n (d: AnyConfigurationModel) => supportedDisplays.has(d.type),\n )\n if (!displayConf) {\n throw new Error(\n `could not find a compatible display for view type ${self.type}`,\n )\n }\n self.tracks.push(\n trackType.stateModel.create({\n ...initialSnapshot,\n type: configuration.type,\n configuration,\n displays: [{ type: displayConf.type, configuration: displayConf }],\n }),\n )\n },\n\n /**\n * #action\n */\n hideTrack(trackId: string) {\n const schema = pluginManager.pluggableConfigSchemaType('track')\n const config = resolveIdentifier(schema, getRoot(self), trackId)\n const shownTracks = self.tracks.filter(t => t.configuration === config)\n transaction(() => {\n shownTracks.forEach(t => self.tracks.remove(t))\n })\n return shownTracks.length\n },\n /**\n * #action\n */\n squareView() {\n const average = avg(self.views.map(v => v.bpPerPx))\n self.views.forEach(view => {\n const center = view.pxToBp(view.width / 2)\n view.setNewView(average, view.offsetPx)\n if (!center.refName) {\n return\n }\n view.centerAt(center.coord, center.refName, center.index)\n })\n },\n /**\n * #action\n */\n clearView() {\n self.views = cast([])\n self.tracks = cast([])\n },\n }))\n .views(() => ({\n /**\n * #method\n * includes a subset of view menu options because the full list is a\n * little overwhelming. overridden by subclasses\n */\n headerMenuItems(): MenuItem[] {\n return []\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n menuItems(): MenuItem[] {\n return [\n ...self.views\n .map((view, idx) => [idx, view.menuItems()] as const)\n .map(f => ({ label: `View ${f[0] + 1} Menu`, subMenu: f[1] })),\n {\n label: 'Return to import form',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ReturnToImportFormDialog,\n { model: self, handleClose },\n ])\n },\n icon: FolderOpenIcon,\n },\n {\n label: 'Open track selector',\n onClick: self.activateTrackSelector,\n icon: TrackSelectorIcon,\n },\n ]\n },\n /**\n * #method\n */\n rubberBandMenuItems() {\n return [\n {\n label: 'Zoom to region(s)',\n onClick: () => {\n self.views.forEach(view => {\n const { leftOffset, rightOffset } = view\n if (leftOffset && rightOffset) {\n view.moveTo(leftOffset, rightOffset)\n }\n })\n },\n },\n ]\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n if (self.width) {\n self.views.forEach(v => {\n v.setWidth(self.width)\n })\n }\n }),\n )\n },\n }))\n}\n\nexport type LinearComparativeViewStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearComparativeViewModel =\n Instance<LinearComparativeViewStateModel>\n\nexport default stateModelFactory\n","import { types, Instance } from 'mobx-state-tree'\nimport {\n getConf,\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport { Feature } from '@jbrowse/core/util'\n\n// locals\nimport baseModelFactory from '../LinearComparativeDisplay/stateModelFactory'\n\ninterface Pos {\n offsetPx: number\n}\n\nexport interface FeatPos {\n p11: Pos\n p12: Pos\n p21: Pos\n p22: Pos\n f: Feature\n cigar: string[]\n}\n\n/**\n * #stateModel LinearSyntenyDisplay\n * extends\n * - [LinearComparativeDisplay](../linearcomparativedisplay)\n */\nfunction stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearSyntenyDisplay',\n baseModelFactory(configSchema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearSyntenyDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n .volatile(() => ({\n // canvas used for drawing visible screen\n mainCanvas: null as HTMLCanvasElement | null,\n\n // canvas used for drawing click map with feature ids\n // this renders a unique color per alignment, so that it can be re-traced\n // after a feature click with getImageData at that pixel\n clickMapCanvas: null as HTMLCanvasElement | null,\n\n // canvas used for drawing click map with cigar data\n // this can show if you are mousing over a insertion/deletion. it is similar\n // in purpose to the clickMapRef but was not feasible to pack this into the\n // clickMapRef\n cigarClickMapCanvas: null as HTMLCanvasElement | null,\n\n // canvas for drawing mouseover shading\n // this is separate from the other code for speed: don't have to redraw\n // entire canvas to do a feature's mouseover shading\n mouseoverCanvas: null as HTMLCanvasElement | null,\n\n // assigned by reaction\n featPositions: [] as FeatPos[],\n\n // currently mouse'd over feature\n mouseoverId: undefined as string | undefined,\n\n // currently click'd over feature\n clickId: undefined as string | undefined,\n\n // currently mouseover'd CIGAR subfeature\n cigarMouseoverId: -1,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setFeatPositions(arg: FeatPos[]) {\n self.featPositions = arg\n },\n /**\n * #action\n */\n setMainCanvasRef(ref: HTMLCanvasElement | null) {\n self.mainCanvas = ref\n },\n /**\n * #action\n */\n setClickMapCanvasRef(ref: HTMLCanvasElement | null) {\n self.clickMapCanvas = ref\n },\n /**\n * #action\n */\n setCigarClickMapCanvasRef(ref: HTMLCanvasElement | null) {\n self.cigarClickMapCanvas = ref\n },\n /**\n * #action\n */\n setMouseoverCanvasRef(ref: HTMLCanvasElement | null) {\n self.mouseoverCanvas = ref\n },\n /**\n * #action\n */\n setMouseoverId(arg?: string) {\n self.mouseoverId = arg\n },\n /**\n * #action\n */\n setCigarMouseoverId(arg: number) {\n self.cigarMouseoverId = arg\n },\n /**\n * #action\n */\n setClickId(arg?: string) {\n self.clickId = arg\n },\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get adapterConfig() {\n return {\n name: self.parentTrack.configuration.adapter.type,\n assemblyNames: getConf(self, 'assemblyNames'),\n ...getConf(self.parentTrack, 'adapter'),\n }\n },\n /**\n * #getter\n */\n get trackIds() {\n return getConf(self, 'trackIds') as string[]\n },\n /**\n * #getter\n */\n get numFeats() {\n return self.featPositions.length\n },\n /**\n * #getter\n * used for synteny svg rendering\n */\n get ready() {\n return this.numFeats > 0\n },\n\n /**\n * #getter\n */\n get featMap() {\n return Object.fromEntries(self.featPositions.map(f => [f.f.id(), f]))\n },\n }))\n .actions(self => ({\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n const { doAfterAttach } = await import('./afterAttach')\n doAfterAttach(self)\n } catch (e) {\n console.error(e)\n self.setError(e)\n }\n })()\n },\n }))\n}\n\nexport type LinearSyntenyDisplayStateModel = ReturnType<\n typeof stateModelFactory\n>\nexport type LinearSyntenyDisplayModel = Instance<LinearSyntenyDisplayStateModel>\n\nexport default stateModelFactory\n","import { lazy } from 'react'\nimport {\n ConfigurationReference,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport { getSession } from '@jbrowse/core/util'\nimport { SharedLinearPileupDisplayMixin } from '@jbrowse/plugin-alignments'\nimport { types } from 'mobx-state-tree'\n\nconst LaunchSyntenyViewDialog = lazy(\n () => import('./components/LaunchSyntenyViewDialog'),\n)\n\n/**\n * #stateModel LGVSyntenyDisplay\n * displays location of \"synteny\" feature in a plain LGV, allowing linking out\n * to external synteny views\n *\n * extends\n * - [SharedLinearPileupDisplayMixin](../sharedlinearpileupdisplaymixin)\n */\nfunction stateModelFactory(schema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LGVSyntenyDisplay',\n SharedLinearPileupDisplayMixin(schema),\n types.model({\n /**\n * #property\n */\n type: types.literal('LGVSyntenyDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(schema),\n }),\n )\n .views(self => {\n const superContextMenuItems = self.contextMenuItems\n return {\n /**\n * #method\n */\n contextMenuItems() {\n const feature = self.contextMenuFeature\n return [\n ...superContextMenuItems(),\n ...(feature\n ? [\n {\n label: 'Open synteny view for this position',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n LaunchSyntenyViewDialog,\n {\n model: self,\n handleClose,\n feature,\n },\n ])\n },\n },\n ]\n : []),\n ]\n },\n }\n })\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n colorSchemeSubMenuItems: superColorSchemeSubMenuItems,\n } = self\n return {\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Color scheme',\n subMenu: [...superColorSchemeSubMenuItems()],\n },\n ]\n },\n }\n })\n .actions(self => ({\n afterCreate() {\n // use color by stand to help indicate inversions better on first load,\n // otherwise use selected orientation\n if (self.colorBy) {\n self.setColorScheme({ ...self.colorBy })\n } else {\n self.setColorScheme({ type: 'strand' })\n }\n },\n }))\n}\n\nexport default stateModelFactory\n","import React from 'react'\nimport { SvgIcon, SvgIconProps } from '@mui/material'\n\nexport function Curves(props: SvgIconProps) {\n return (\n <SvgIcon {...props}>\n <path\n fill=\"currentColor\"\n d=\"M16.5,21C13.5,21 12.31,16.76 11.05,12.28C10.14,9.04 9,5 7.5,5C4.11,5 4,11.93 4,12H2C2,11.63 2.06,3 7.5,3C10.5,3 11.71,7.25 12.97,11.74C13.83,14.8 15,19 16.5,19C19.94,19 20.03,12.07 20.03,12H22.03C22.03,12.37 21.97,21 16.5,21Z\"\n />\n </SvgIcon>\n )\n}\n\nexport function StraightLines(props: SvgIconProps) {\n return (\n <SvgIcon {...props}>\n <path\n fill=\"currentColor\"\n d=\"M22 12L17 22L7.1 6.04L4.24 12H2L7 2L16.9 17.96L19.76 12H22Z\"\n />\n </SvgIcon>\n )\n}\n","import React, { lazy } from 'react'\nimport { types, Instance } from 'mobx-state-tree'\nimport { transaction } from 'mobx'\nimport { getSession } from '@jbrowse/core/util'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { saveAs } from 'file-saver'\n\n// icons\nimport CropFreeIcon from '@mui/icons-material/CropFree'\nimport VisibilityIcon from '@mui/icons-material/Visibility'\nimport PhotoCameraIcon from '@mui/icons-material/PhotoCamera'\nimport { Curves } from './components/Icons'\n\n// locals\nimport baseModel from '../LinearComparativeView/model'\n\n// lazies\nconst ExportSvgDialog = lazy(() => import('./components/ExportSvgDialog'))\n\nexport interface ExportSvgOptions {\n rasterizeLayers?: boolean\n scale?: number\n filename?: string\n Wrapper?: React.FC<{ children: React.ReactNode }>\n fontSize?: number\n rulerHeight?: number\n textHeight?: number\n paddingHeight?: number\n headerHeight?: number\n cytobandHeight?: number\n themeName?: string\n trackLabels?: string\n}\n\n/**\n * #stateModel LinearSyntenyView\n * extends\n * - [LinearComparativeView](../linearcomparativeview)\n */\nexport default function stateModelFactory(pluginManager: PluginManager) {\n return types\n .compose(\n 'LinearSyntenyView',\n baseModel(pluginManager),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearSyntenyView'),\n /**\n * #property/\n */\n drawCIGAR: true,\n /**\n * #property\n */\n drawCurves: false,\n }),\n )\n .actions(self => ({\n /**\n * #action\n */\n toggleCurves() {\n self.drawCurves = !self.drawCurves\n },\n /**\n * #action\n */\n toggleCIGAR() {\n self.drawCIGAR = !self.drawCIGAR\n },\n /**\n * #action\n */\n showAllRegions() {\n transaction(() => {\n self.views.forEach(view => {\n view.showAllRegionsInAssembly()\n })\n })\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n async exportSvg(opts: ExportSvgOptions) {\n const { renderToSvg } = await import(\n './svgcomponents/SVGLinearSyntenyView'\n )\n const html = await renderToSvg(self as LinearSyntenyViewModel, opts)\n const blob = new Blob([html], { type: 'image/svg+xml' })\n saveAs(blob, opts.filename || 'image.svg')\n },\n }))\n .views(self => {\n const superHeaderMenuItems = self.headerMenuItems\n const superMenuItems = self.menuItems\n return {\n /**\n * #method\n * includes a subset of view menu options because the full list is a\n * little overwhelming\n */\n headerMenuItems() {\n return [\n ...superHeaderMenuItems(),\n {\n label: 'Square view',\n onClick: self.squareView,\n description:\n 'Makes both views use the same zoom level, adjusting to the average of each',\n icon: CropFreeIcon,\n },\n {\n label: 'Show all regions',\n onClick: self.showAllRegions,\n description: 'Show entire genome assemblies',\n icon: VisibilityIcon,\n },\n {\n label: 'Draw CIGAR',\n onClick: self.toggleCIGAR,\n checked: self.drawCIGAR,\n type: 'checkbox',\n description: 'Draws per-base CIGAR level alignments',\n },\n {\n label: 'Use curved lines',\n type: 'checkbox',\n checked: self.drawCurves,\n onClick: self.toggleCurves,\n icon: Curves,\n },\n {\n label: 'Export SVG',\n icon: PhotoCameraIcon,\n onClick: (): void => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n /**\n * #method\n */\n menuItems() {\n return [\n ...superMenuItems(),\n {\n label: 'Export SVG',\n icon: PhotoCameraIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ExportSvgDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n }\n })\n}\nexport type LinearSyntenyViewStateModel = ReturnType<typeof stateModelFactory>\nexport type LinearSyntenyViewModel = Instance<LinearSyntenyViewStateModel>\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport { when } from 'mobx'\n\n// locals\nimport { LinearSyntenyViewModel } from './LinearSyntenyView/model'\n\ntype LSV = LinearSyntenyViewModel\n\ninterface ViewData {\n loc: string\n assembly: string\n tracks?: string[]\n}\n\nexport default function LaunchLinearSyntenyView(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-LinearSyntenyView',\n // @ts-expect-error\n async ({\n session,\n views,\n tracks = [],\n }: {\n session: AbstractSessionModel\n views: ViewData[]\n tracks?: string[]\n }) => {\n try {\n const { assemblyManager } = session\n const model = session.addView('LinearSyntenyView', {}) as LSV\n\n await when(() => !!model.width)\n\n model.setViews(\n await Promise.all(\n views.map(async view => {\n const asm = await assemblyManager.waitForAssembly(view.assembly)\n if (!asm) {\n throw new Error(`Assembly ${view.assembly} failed to load`)\n }\n return {\n type: 'LinearGenomeView' as const,\n bpPerPx: 1,\n offsetPx: 0,\n hideHeader: true,\n displayedRegions: asm.regions,\n }\n }),\n ),\n )\n\n await Promise.all(model.views.map(view => when(() => view.initialized)))\n\n const idsNotFound = [] as string[]\n await Promise.all(\n views.map(async (data, idx) => {\n const view = model.views[idx]!\n const { assembly, loc, tracks = [] } = data\n const asm = await assemblyManager.waitForAssembly(assembly)\n if (!asm) {\n throw new Error(`Assembly ${data.assembly} failed to load`)\n }\n await view.navToSearchString({ input: loc, assembly: asm })\n tracks.forEach(track => {\n tryTrack(view, track, idsNotFound)\n })\n }),\n )\n\n tracks.forEach(track => {\n tryTrack(model, track, idsNotFound)\n })\n\n if (idsNotFound.length) {\n throw new Error(\n `Could not resolve identifiers: ${idsNotFound.join(',')}`,\n )\n }\n } catch (e) {\n session.notifyError(`${e}`, e)\n throw e\n }\n },\n )\n}\n\nfunction tryTrack(\n model: { showTrack: (arg: string) => void },\n trackId: string,\n idsNotFound: string[],\n) {\n try {\n model.showTrack(trackId)\n } catch (e) {\n if (/Could not resolve identifier/.exec(`${e}`)) {\n idsNotFound.push(trackId)\n } else {\n throw e\n }\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes/models'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config SyntenyTrack\n * extends\n * - [BaseTrack](../basetrack)\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'SyntenyTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n\nexport default configSchema\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport { PluggableElementType } from '@jbrowse/core/pluggableElementTypes'\nimport { getSession, getContainingTrack } from '@jbrowse/core/util'\n\n// icons\nimport AddIcon from '@mui/icons-material/Add'\n\n// locals\nconst ReadVsRefDialog = lazy(() => import('./LinearReadVsRef'))\n\nfunction isDisplay(elt: { name: string }): elt is DisplayType {\n return elt.name === 'LinearPileupDisplay'\n}\n\nexport default function LinearReadVsRefMenuItemF(pm: PluginManager) {\n pm.addToExtensionPoint(\n 'Core-extendPluggableElement',\n (pluggableElement: PluggableElementType) => {\n if (!isDisplay(pluggableElement)) {\n return pluggableElement\n }\n pluggableElement.stateModel = pluggableElement.stateModel.extend(self => {\n const superContextMenuItems = self.contextMenuItems\n return {\n views: {\n contextMenuItems() {\n const feature = self.contextMenuFeature\n const track = getContainingTrack(self)\n return [\n ...superContextMenuItems(),\n ...(feature\n ? [\n {\n label: 'Linear read vs ref',\n icon: AddIcon,\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n ReadVsRefDialog,\n {\n track,\n feature,\n handleClose,\n },\n ])\n },\n },\n ]\n : []),\n ]\n },\n },\n }\n })\n return pluggableElement\n },\n )\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel, isAbstractMenuManager } from '@jbrowse/core/util'\n\nimport CalendarIcon from '@mui/icons-material/CalendarViewDay'\nimport LinearComparativeDisplayF from './LinearComparativeDisplay'\nimport LinearComparativeViewF from './LinearComparativeView'\nimport LinearSyntenyDisplayF from './LinearSyntenyDisplay'\nimport LGVSyntenyDisplayF from './LGVSyntenyDisplay'\nimport LinearSyntenyViewF from './LinearSyntenyView'\nimport LaunchLinearSyntenyViewF from './LaunchLinearSyntenyView'\nimport SyntenyTrackF from './SyntenyTrack'\nimport LinearReadVsRefMenuItemF from './LinearReadVsRef'\n\nexport default class LinearComparativeViewPlugin extends Plugin {\n name = 'LinearComparativeViewPlugin'\n\n install(pluginManager: PluginManager) {\n LinearComparativeViewF(pluginManager)\n LinearSyntenyViewF(pluginManager)\n LinearComparativeDisplayF(pluginManager)\n LinearSyntenyDisplayF(pluginManager)\n LGVSyntenyDisplayF(pluginManager)\n LaunchLinearSyntenyViewF(pluginManager)\n SyntenyTrackF(pluginManager)\n LinearReadVsRefMenuItemF(pluginManager)\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToSubMenu(['Add'], {\n label: 'Linear synteny view',\n icon: CalendarIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('LinearSyntenyView', {})\n },\n })\n }\n }\n}\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\nimport modelFactory from './model'\n\nexport default function LinearComparativeViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'LinearComparativeView',\n displayName: 'Linear comparative view',\n stateModel: modelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/LinearComparativeView')),\n })\n })\n}\n","import { lazy } from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport modelFactory from './model'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\n\nexport default function LinearSyntenyViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'LinearSyntenyView',\n displayName: 'Linear synteny view',\n stateModel: modelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/LinearSyntenyView')),\n })\n })\n}\n","import DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport configSchemaFactory from './configSchemaF'\nimport stateModelFactory from './stateModelFactory'\n\nexport default function LinearComparativeDisplayF(\n pluginManager: PluginManager,\n) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearComparativeDisplay',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'SyntenyTrack',\n viewType: 'LinearComparativeView',\n ReactComponent: () => {\n return null\n },\n })\n })\n}\n","import DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport configSchemaF from './configSchemaF'\nimport stateModelFactory from './model'\nimport { lazy } from 'react'\n\nexport default function LinearSyntenyDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new DisplayType({\n name: 'LinearSyntenyDisplay',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'SyntenyTrack',\n viewType: 'LinearSyntenyView',\n ReactComponent: lazy(() => import('./components/Component')),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport baseConfigFactory from '../LinearComparativeDisplay/configSchemaF'\n\n/**\n * #config LinearSyntenyDisplay\n */\nfunction configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearSyntenyDisplay',\n {\n /**\n * #slot\n * currently unused\n */\n trackIds: {\n type: 'stringArray',\n defaultValue: [],\n },\n\n /**\n * #slot\n * currently unused\n */\n middle: { type: 'boolean', defaultValue: true },\n },\n {\n /**\n * #baseConfiguration\n * this refers to the LinearComparativeDisplay\n */\n baseConfiguration: baseConfigFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaFactory\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport DisplayType from '@jbrowse/core/pluggableElementTypes/DisplayType'\nimport configSchemaF from './configSchemaF'\nimport stateModelF from './model'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nexport default function LGVSyntenyDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaF(pluginManager)\n const stateModel = stateModelF(configSchema)\n return new DisplayType({\n name: 'LGVSyntenyDisplay',\n configSchema,\n stateModel,\n trackType: 'SyntenyTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { linearPileupDisplayConfigSchemaFactory } from '@jbrowse/plugin-alignments'\n\n/**\n * #config LGVSyntenyDisplay\n * extends config\n * - [LinearPileupDisplay](../linearpileupdisplay)\n */\nfunction configSchemaF(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LGVSyntenyDisplay',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: linearPileupDisplayConfigSchemaFactory(pluginManager),\n explicitlyTyped: true,\n },\n )\n}\n\nexport default configSchemaF\n","import { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchemaF from './configSchema'\n\nexport default function registerSyntenyTrack(pluginManager: PluginManager) {\n pluginManager.addTrackType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new TrackType({\n name: 'SyntenyTrack',\n configSchema,\n stateModel: createBaseTrackModel(\n pluginManager,\n 'SyntenyTrack',\n configSchema,\n ),\n })\n })\n}\n","import {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n} from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport { BaseLinearDisplay } from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #stateModel LinearLollipopDisplay\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nexport function stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearLollipopDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearLollipopDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n }),\n )\n\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #getter\n */\n get blockType() {\n return 'dynamicBlocks'\n },\n /**\n * #getter\n */\n get renderDelay() {\n return 500\n },\n /**\n * #method\n */\n renderProps() {\n return {\n ...superRenderProps(),\n rpcDriverName: self.rpcDriverName,\n config: self.configuration.renderer,\n }\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return self.configuration.renderer.type\n },\n }\n })\n}\n","import { readConfObject } from '@jbrowse/core/configuration'\nimport { doesIntersect2 } from '@jbrowse/core/util/range'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\n\ninterface LayoutItem {\n uniqueId: string\n anchorLocation: number\n width: number\n height: number\n data: { score: number }\n}\n\ntype LayoutEntry = LayoutItem & { x: number; y: number }\n\ntype LayoutMap = Map<string, LayoutEntry>\n\nexport class FloatingLayout {\n width: number\n\n totalHeight = 0\n\n constructor({ width }: { width: number }) {\n if (!width) {\n throw new Error('width required to make a new FloatingLayout')\n }\n this.width = width\n }\n\n items: LayoutItem[] = []\n\n layout: LayoutMap = new Map()\n\n layoutDirty = false\n\n add(\n uniqueId: string,\n anchorLocation: number,\n width: number,\n height: number,\n data: { score: number },\n ) {\n this.items.push({ uniqueId, anchorLocation, width, height, data })\n this.layoutDirty = true\n }\n\n /**\n * @returns Map of `uniqueId => {x,y,anchorLocation,width,height,data}`\n */\n getLayout(configuration?: AnyConfigurationModel) {\n if (!this.layoutDirty) {\n return this.layout\n }\n if (!configuration) {\n throw new Error('configuration object required')\n }\n\n const minY = readConfObject(configuration, 'minStickLength')\n\n // sort them by score ascending, so higher scores will always end up\n // stacked last (toward the bottom)\n const sorted = this.items.sort((a, b) => a.data.score - b.data.score)\n\n // bump them\n let maxBottom = 0\n const layoutEntries: [string, LayoutEntry][] = new Array(sorted.length)\n for (let i = 0; i < sorted.length; i += 1) {\n const currentItem = sorted[i]!\n const { anchorLocation, width, height } = currentItem\n const start = anchorLocation - width / 2\n const end = start + width\n let top = minY\n let bottom = top + height\n\n // figure out how far down to put it\n for (let j = 0; j < i; j += 1) {\n const [, previouslyLaidOutItem] = layoutEntries[j]!\n const {\n x: prevStart,\n y: prevTop,\n width: prevWidth,\n height: prevHeight,\n } = previouslyLaidOutItem\n const prevEnd = prevStart + prevWidth\n const prevBottom = prevTop + prevHeight\n if (\n doesIntersect2(prevStart, prevEnd, start, end) &&\n doesIntersect2(prevTop, prevBottom, top, bottom)\n ) {\n // bump this one to the bottom of the previous one\n top = prevBottom\n bottom = top + height\n j = -1 // we need to check all of them again after bumping\n }\n }\n\n // record the entry and update the maxBottom\n layoutEntries[i] = [\n currentItem.uniqueId,\n { ...currentItem, x: start, y: top },\n ]\n if (bottom > maxBottom) {\n maxBottom = bottom\n }\n }\n\n // try to tile them left to right all at the same level\n // if they don't fit, try to alternate them on 2 levels, then 3\n this.totalHeight = maxBottom\n this.layout = new Map(layoutEntries)\n this.layoutDirty = false\n return this.layout\n }\n\n getTotalHeight() {\n if (this.layoutDirty) {\n throw new Error('getTotalHeight does not work when the layout is dirty.')\n }\n return this.totalHeight\n }\n\n serializeRegion() {\n return this.toJSON()\n }\n\n toJSON() {\n if (this.layoutDirty) {\n throw new Error('toJSON does not work when the layout is dirty.')\n }\n return { pairs: [...this.getLayout()], totalHeight: this.getTotalHeight() }\n }\n\n static fromJSON() {\n throw new Error('not supported')\n }\n}\n\nexport class PrecomputedFloatingLayout {\n layout: LayoutMap\n\n totalHeight: number\n\n constructor({\n pairs,\n totalHeight,\n }: {\n pairs: [string, LayoutEntry][]\n totalHeight: number\n }) {\n this.layout = new Map(pairs)\n this.totalHeight = totalHeight\n }\n\n add(uniqueId: string) {\n if (!this.layout.has(uniqueId)) {\n throw new Error(`layout error, precomputed layout is missing ${uniqueId}`)\n }\n }\n\n getLayout() {\n return this.layout\n }\n\n getTotalHeight() {\n return this.totalHeight\n }\n\n static fromJSON(\n json: ConstructorParameters<typeof PrecomputedFloatingLayout>[0],\n ) {\n return new PrecomputedFloatingLayout(json)\n }\n}\n","import BoxRendererType, {\n LayoutSession,\n} from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'\nimport MultiLayout from '@jbrowse/core/util/layouts/MultiLayout'\nimport { FloatingLayout, PrecomputedFloatingLayout } from './Layout'\n\nclass FloatingLayoutSession extends LayoutSession {\n makeLayout() {\n 'sequenceAdapter'\n\n const { end, start } = this.regions[0]\n const widthPx = (end - start) / this.bpPerPx\n return new MultiLayout(FloatingLayout, { width: widthPx })\n }\n\n layoutIsValid(/* layout */) {\n return false // layout.left layout.width === this.width\n }\n}\n\nexport default class LollipopRenderer extends BoxRendererType {\n createSession(args) {\n return new FloatingLayoutSession(args)\n }\n\n deserializeLayoutInClient(json) {\n return new PrecomputedFloatingLayout(json)\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nexport default ConfigurationSchema(\n 'LollipopRenderer',\n {\n strokeColor: {\n type: 'color',\n description: 'the outer color of each lollipop',\n defaultValue: 'green',\n contextVariable: ['feature'],\n },\n innerColor: {\n type: 'color',\n description: 'the inner color of each lollipop',\n defaultValue: '#7fc75f',\n contextVariable: ['feature'],\n },\n strokeWidth: {\n type: 'number',\n description: 'width of the stroked border',\n defaultValue: 4,\n contextVariable: ['feature'],\n },\n radius: {\n type: 'number',\n description: 'radius in pixels of each lollipop body',\n defaultValue: `jexl:sqrt(max(3, (get(feature,'score')*10)/3.14))`,\n contextVariable: ['feature'],\n },\n caption: {\n type: 'string',\n description:\n 'the tooltip caption displayed when the mouse hovers over a lollipop',\n defaultValue: `jexl:get(feature,'name')`,\n contextVariable: ['feature'],\n },\n minStickLength: {\n type: 'number',\n description: 'minimum lollipop \"stick\" length, in pixels',\n defaultValue: 5,\n },\n stickColor: {\n type: 'color',\n description: 'color of the lollipop stick',\n defaultValue: 'black',\n contextVariable: ['feature'],\n },\n stickWidth: {\n type: 'number',\n description: 'width in pixels of the lollipop stick',\n defaultValue: 2,\n contextVariable: ['feature'],\n },\n score: {\n type: 'number',\n description:\n 'the \"score\" of each lollipop, displayed as a number in the center of the circle',\n defaultValue: `jexl:get(feature,'score')`,\n contextVariable: ['feature'],\n },\n },\n { explicitlyTyped: true },\n)\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport LinearLollipopDisplayF from './LinearLollipopDisplay'\nimport LollipopRendererF from './LollipopRenderer'\n\nexport default class LollipopPlugin extends Plugin {\n name = 'LollipopPlugin'\n\n install(pluginManager: PluginManager) {\n LollipopRendererF(pluginManager)\n LinearLollipopDisplayF(pluginManager)\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { lazy } from 'react'\nimport LollipopRenderer from './LollipopRenderer'\nimport configSchema from './configSchema'\n\nexport default function LollipopRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new LollipopRenderer({\n name: 'LollipopRenderer',\n ReactComponent: lazy(() => import('./components/LollipopRendering')),\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nimport { stateModelFactory } from './model'\nimport { configSchemaFactory } from './configSchema'\n\nexport default function LinearLollipopDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearLollipopDisplay',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'LollipopTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #config LinearLollipopDisplay\n */\nexport function configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearLollipopDisplay',\n {\n /**\n * #slot\n */\n renderer: pluginManager.pluggableConfigSchemaType('renderer'),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\nimport { BaseLinearDisplay } from '@jbrowse/plugin-linear-genome-view'\nimport { getEnv } from '@jbrowse/core/util'\n\n/**\n * #stateModel LinearArcDisplay\n * extends\n * - [BaseLinearDisplay](../baselineardisplay)\n */\nexport function stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearArcDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearArcDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n displayMode: types.maybe(types.string),\n }),\n )\n\n .views(self => ({\n /**\n * #getter\n */\n get blockType() {\n return 'staticBlocks'\n },\n /**\n * #getter\n */\n get renderDelay() {\n return 500\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return self.configuration.renderer.type\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get displayModeSetting() {\n return self.displayMode ?? getConf(self, ['renderer', 'displayMode'])\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get rendererConfig() {\n const configBlob = getConf(self, ['renderer']) || {}\n const config = configBlob as Omit<typeof configBlob, symbol>\n return self.rendererType.configSchema.create(\n {\n ...config,\n displayMode: self.displayModeSetting,\n },\n getEnv(self),\n )\n },\n }))\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #method\n */\n renderProps() {\n return {\n ...superRenderProps(),\n rpcDriverName: self.rpcDriverName,\n config: self.rendererConfig,\n height: self.height,\n }\n },\n }\n })\n .actions(self => ({\n /**\n * #action\n */\n setDisplayMode(flag: string) {\n self.displayMode = flag\n },\n }))\n .views(self => {\n const superMenuItems = self.trackMenuItems\n return {\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...superMenuItems(),\n {\n label: 'Display mode',\n subMenu: [\n {\n type: 'radio',\n label: 'Arcs',\n onClick: () => {\n self.setDisplayMode('arcs')\n },\n checked: self.displayMode === 'arcs',\n },\n {\n type: 'radio',\n label: 'Semi-circles',\n onClick: () => {\n self.setDisplayMode('semicircles')\n },\n checked: self.displayMode === 'semicircles',\n },\n ],\n },\n ]\n },\n }\n })\n}\n","import React from 'react'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { Instance, types } from 'mobx-state-tree'\nimport {\n Feature,\n getSession,\n isSessionModelWithWidgets,\n getContainingView,\n getContainingTrack,\n isSelectionContainer,\n} from '@jbrowse/core/util'\nimport { BaseDisplay } from '@jbrowse/core/pluggableElementTypes'\nimport {\n FeatureDensityMixin,\n TrackHeightMixin,\n} from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #stateModel LinearPairedArcDisplay\n * this is a non-block-based track type, and can connect arcs across multiple\n * displayedRegions\n *\n * extends\n * - [BaseDisplay](../basedisplay)\n * - [TrackHeightMixin](../trackheightmixin)\n * - [FeatureDensityMixin](../featuredensitymixin)\n */\nexport function stateModelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearPairedArcDisplay',\n BaseDisplay,\n TrackHeightMixin(),\n FeatureDensityMixin(),\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearPairedArcDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n displayMode: types.maybe(types.string),\n }),\n )\n .volatile(() => ({\n lastDrawnOffsetPx: 0,\n features: undefined as Feature[] | undefined,\n loading: false,\n drawn: true,\n }))\n\n .views(self => ({\n /**\n * #getter\n */\n get displayModeSetting() {\n return self.displayMode ?? getConf(self, ['renderer', 'displayMode'])\n },\n }))\n\n .actions(self => ({\n /**\n * #action\n */\n selectFeature(feature: Feature) {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n const featureWidget = session.addWidget(\n 'VariantFeatureWidget',\n 'variantFeature',\n {\n view: getContainingView(self),\n track: getContainingTrack(self),\n featureData: feature.toJSON(),\n },\n )\n\n session.showWidget(featureWidget)\n }\n if (isSelectionContainer(session)) {\n session.setSelection(feature)\n }\n },\n /**\n * #action\n */\n setLoading(flag: boolean) {\n self.loading = flag\n },\n /**\n * #action\n */\n setFeatures(f: Feature[]) {\n self.features = f\n },\n /**\n * #action\n */\n setDisplayMode(flag: string) {\n self.displayMode = flag\n },\n }))\n\n .actions(self => ({\n afterAttach() {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n ;(async () => {\n try {\n const { doAfterAttach } = await import('./afterAttach')\n doAfterAttach(self)\n } catch (e) {\n console.error(e)\n self.setError(e)\n }\n })()\n },\n /**\n * #action\n */\n async renderSvg(opts: {\n rasterizeLayers?: boolean\n }): Promise<React.ReactNode> {\n const { renderArcSvg } = await import('./renderSvg')\n // @ts-expect-error\n return renderArcSvg(self, opts)\n },\n }))\n}\n\nexport type LinearArcDisplayStateModel = ReturnType<typeof stateModelFactory>\nexport type LinearArcDisplayModel = Instance<LinearArcDisplayStateModel>\n","import React, { lazy, Suspense, useState } from 'react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { Feature, Region, bpSpanPx, getStrokeProps } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\n// locals\nconst ArcTooltip = lazy(() => import('../ArcTooltip'))\n\nfunction Arc({\n selectedFeatureId,\n region,\n bpPerPx,\n config,\n height: displayHeight,\n feature,\n onFeatureClick,\n}: {\n selectedFeatureId?: string\n region: Region\n config: AnyConfigurationModel\n bpPerPx: number\n height: number\n feature: Feature\n onFeatureClick: (event: React.MouseEvent, featureId: string) => void\n}) {\n const [isMouseOvered, setIsMouseOvered] = useState(false)\n const [left, right] = bpSpanPx(\n feature.get('start'),\n feature.get('end'),\n region,\n bpPerPx,\n )\n const featureId = feature.id()\n const selected =\n selectedFeatureId && String(selectedFeatureId) === String(feature.id())\n const stroke = selected ? 'red' : readConfObject(config, 'color', { feature })\n const textStroke = selected ? 'red' : 'black'\n const label = readConfObject(config, 'label', { feature })\n const caption = readConfObject(config, 'caption', { feature })\n const strokeWidth = readConfObject(config, 'thickness', { feature }) || 2\n const height = Math.min(\n readConfObject(config, 'height', { feature }) || 100,\n displayHeight,\n )\n const ref = React.createRef<SVGPathElement>()\n\n // formula: https://en.wikipedia.org/wiki/B%C3%A9zier_curve#Cubic_B%C3%A9zier_curves\n const t = 0.5\n const t1 = 1 - t\n const textYCoord = 3 * (t1 * t1) * (t * height) + 3 * t1 * (t * t) * height\n\n return (\n <g>\n <path\n ref={ref}\n {...getStrokeProps(stroke)}\n d={`M ${left} 0 C ${left} ${height}, ${right} ${height}, ${right} 0`}\n strokeWidth={strokeWidth}\n fill=\"transparent\"\n onClick={e => {\n onFeatureClick(e, featureId)\n }}\n onMouseOver={() => {\n setIsMouseOvered(true)\n }}\n onMouseLeave={() => {\n setIsMouseOvered(false)\n }}\n pointerEvents=\"stroke\"\n />\n\n {isMouseOvered ? (\n <Suspense fallback={null}>\n <ArcTooltip contents={caption} />\n </Suspense>\n ) : null}\n <text\n x={left + (right - left) / 2}\n y={textYCoord + 3}\n stroke=\"white\"\n strokeWidth=\"0.6em\"\n >\n {label}\n </text>\n <text\n x={left + (right - left) / 2}\n y={textYCoord + 3}\n stroke={textStroke}\n >\n {label}\n </text>\n </g>\n )\n}\n\nfunction polarToCartesian(\n centerX: number,\n centerY: number,\n radius: number,\n angleInDegrees: number,\n) {\n const angleInRadians = ((angleInDegrees - 90) * Math.PI) / 180\n\n return {\n x: centerX + radius * Math.cos(angleInRadians),\n y: centerY + radius * Math.sin(angleInRadians),\n }\n}\n\nfunction describeArc(\n x: number,\n y: number,\n radius: number,\n startAngle: number,\n endAngle: number,\n) {\n const start = polarToCartesian(x, y, radius, endAngle)\n const end = polarToCartesian(x, y, radius, startAngle)\n const largeArcFlag = endAngle - startAngle <= 180 ? '0' : '1'\n\n return [\n 'M',\n start.x,\n start.y,\n 'A',\n radius,\n radius,\n 0,\n largeArcFlag,\n 0,\n end.x,\n end.y,\n ].join(' ')\n}\n\nfunction SemiCircles({\n selectedFeatureId,\n region,\n bpPerPx,\n config,\n onFeatureClick,\n feature,\n}: {\n selectedFeatureId?: string\n region: Region\n config: AnyConfigurationModel\n onFeatureClick: (event: React.MouseEvent, featureId: string) => void\n bpPerPx: number\n feature: Feature\n}) {\n const [isMouseOvered, setIsMouseOvered] = useState(false)\n const [left, right] = bpSpanPx(\n feature.get('start'),\n feature.get('end'),\n region,\n bpPerPx,\n )\n\n const featureId = feature.id()\n const selected =\n selectedFeatureId && String(selectedFeatureId) === String(feature.id())\n const stroke = selected ? 'red' : readConfObject(config, 'color', { feature })\n const textStroke = selected ? 'red' : 'black'\n const label = readConfObject(config, 'label', { feature })\n const caption = readConfObject(config, 'caption', { feature })\n const strokeWidth = readConfObject(config, 'thickness', { feature }) || 2\n const ref = React.createRef<SVGPathElement>()\n const textYCoord = (right - left) / 2\n\n return (\n <g>\n <path\n d={describeArc(\n left + (right - left) / 2,\n 0,\n (right - left) / 2,\n 90,\n 270,\n )}\n {...getStrokeProps(stroke)}\n strokeWidth={strokeWidth}\n fill=\"transparent\"\n onClick={e => {\n onFeatureClick(e, featureId)\n }}\n onMouseOver={() => {\n setIsMouseOvered(true)\n }}\n onMouseLeave={() => {\n setIsMouseOvered(false)\n }}\n ref={ref}\n pointerEvents=\"stroke\"\n />\n {isMouseOvered ? <ArcTooltip contents={caption} /> : null}\n <text\n x={left + (right - left) / 2}\n y={textYCoord + 3}\n stroke=\"white\"\n strokeWidth=\"0.6em\"\n >\n {label}\n </text>\n <text\n x={left + (right - left) / 2}\n y={textYCoord + 3}\n stroke={textStroke}\n >\n {label}\n </text>\n </g>\n )\n}\nconst ArcRendering = observer(function ({\n features,\n config,\n regions,\n bpPerPx,\n height,\n exportSVG,\n displayModel,\n onFeatureClick,\n}: {\n features: Map<string, Feature>\n config: AnyConfigurationModel\n regions: Region[]\n bpPerPx: number\n height: number\n displayModel?: { selectedFeatureId: string }\n onFeatureClick: (event: React.MouseEvent, featureId: string) => void\n exportSVG: boolean\n}) {\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n const semicircles = readConfObject(config, 'displayMode') === 'semicircles'\n const { selectedFeatureId } = displayModel || {}\n\n return (\n <Wrapper exportSVG={exportSVG} width={width} height={height}>\n {[...features.values()].map(f =>\n semicircles ? (\n <SemiCircles\n key={f.id()}\n config={config}\n region={region}\n bpPerPx={bpPerPx}\n selectedFeatureId={selectedFeatureId}\n onFeatureClick={onFeatureClick}\n feature={f}\n />\n ) : (\n <Arc\n key={f.id()}\n height={height}\n config={config}\n region={region}\n bpPerPx={bpPerPx}\n selectedFeatureId={selectedFeatureId}\n onFeatureClick={onFeatureClick}\n feature={f}\n />\n ),\n )}\n </Wrapper>\n )\n})\n\nfunction Wrapper({\n exportSVG,\n width,\n height,\n children,\n}: {\n exportSVG: boolean\n width: number\n height: number\n children: React.ReactNode\n}) {\n return exportSVG ? (\n children\n ) : (\n <svg width={width} height={height}>\n {children}\n </svg>\n )\n}\n\nexport default ArcRendering\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config ArcRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst ArcRenderer = ConfigurationSchema(\n 'ArcRenderer',\n {\n /**\n * #slot\n */\n color: {\n type: 'color',\n description: 'the color of the arcs',\n defaultValue: 'darkblue',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n thickness: {\n type: 'number',\n description: 'the thickness of the arcs',\n defaultValue: `jexl:logThickness(feature,'score')`,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n label: {\n type: 'string',\n description: 'the label to appear at the apex of the arcs',\n defaultValue: `jexl:get(feature,'score')`,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n height: {\n type: 'number',\n description: 'the height of the arcs',\n defaultValue: `jexl:log10(get(feature,'end')-get(feature,'start'))*50`,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n caption: {\n type: 'string',\n description:\n 'the caption to appear when hovering over any point on the arcs',\n defaultValue: `jexl:get(feature,'name')`,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n displayMode: {\n type: 'enum',\n defaultValue: 'arcs',\n model: types.enumeration('DisplayMode', ['arcs', 'semicircles']),\n description: 'render semi-circles instead of arcs',\n },\n },\n { explicitlyTyped: true },\n)\nexport default ArcRenderer\n","import FeatureRendererType from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'\n\nexport default class ArcRenderer extends FeatureRendererType {}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport LinearArcDisplayF from './LinearArcDisplay'\nimport LinearPairedArcDisplayF from './LinearPairedArcDisplay'\nimport ArcRendererF from './ArcRenderer'\nimport { Feature } from '@jbrowse/core/util'\nimport { set1 } from '@jbrowse/core/ui/colors'\n\nexport default class ArcPlugin extends Plugin {\n name = 'ArcRenderer'\n install(pluginManager: PluginManager) {\n ArcRendererF(pluginManager)\n LinearArcDisplayF(pluginManager)\n LinearPairedArcDisplayF(pluginManager)\n\n pluginManager.jexl.addFunction(\n 'logThickness',\n (feature: Feature, attributeName: string) =>\n Math.log(feature.get(attributeName) + 1),\n )\n pluginManager.jexl.addFunction(\n 'defaultPairedArcColor',\n (_feature: Feature, alt?: string) => {\n if (alt?.startsWith('<DEL')) {\n return set1[0]\n } else if (alt?.startsWith('<DUP')) {\n return set1[1]\n } else if (alt?.startsWith('<INV')) {\n return set1[2]\n } else if (alt?.startsWith('<TRA')) {\n return set1[3]\n } else if (alt?.startsWith('<CNV')) {\n return set1[4]\n } else {\n return set1[6] // skip 5, yellow\n }\n },\n )\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport ReactComponent from './ArcRendering'\nimport configSchema from './configSchema'\nimport ArcRenderer from './ArcRenderer'\n\nexport default function ArcRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new ArcRenderer({\n name: 'ArcRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nimport { configSchemaFactory } from './configSchema'\nimport { stateModelFactory } from './model'\n\nexport default function LinearArcDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearArcDisplay',\n displayName: 'Arc display',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'FeatureTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { types } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #config LinearArcDisplay\n */\nexport function configSchemaFactory(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearArcDisplay',\n {\n /**\n * #slot\n */\n renderer: types.optional(\n pluginManager.pluggableConfigSchemaType('renderer'),\n { type: 'ArcRenderer' },\n ),\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { DisplayType } from '@jbrowse/core/pluggableElementTypes'\n\nimport { configSchemaFactory } from './configSchema'\nimport { stateModelFactory } from './model'\nimport { lazy } from 'react'\n\nexport default function LinearPairedArcDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory()\n return new DisplayType({\n name: 'LinearPairedArcDisplay',\n displayName: 'Arc display',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'VariantTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: lazy(() => import('./components/ReactComponent')),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\n\n/**\n * #config LinearPairedArcDisplay\n */\nexport function configSchemaFactory() {\n return ConfigurationSchema(\n 'LinearPairedArcDisplay',\n {\n /**\n * #slot\n */\n color: {\n type: 'color',\n description: 'the color of the arcs',\n defaultValue: 'jexl:defaultPairedArcColor(feature,alt)',\n contextVariable: ['feature', 'alt'],\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { types } from 'mobx-state-tree'\n\nexport const configSchema = ConfigurationSchema('AboutWidget', {})\n\nexport const stateModel = types.model('AboutWidget', {\n id: ElementId,\n type: types.literal('AboutWidget'),\n})\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { types } from 'mobx-state-tree'\n\nexport const configSchema = ConfigurationSchema('HelpWidget', {})\n\nexport const stateModel = types.model('HelpWidget', {\n id: ElementId,\n type: types.literal('HelpWidget'),\n})\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { types } from 'mobx-state-tree'\n\nexport const configSchema = ConfigurationSchema('ImportSessionWidget', {})\n\nexport const stateModel = types.model('ImportSessionWidget', {\n id: ElementId,\n type: types.literal('ImportSessionWidget'),\n})\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { types } from 'mobx-state-tree'\n\nexport const configSchema = ConfigurationSchema('SessionManager', {})\n\nexport const stateModel = types.model('SessionManager', {\n id: ElementId,\n type: types.literal('SessionManager'),\n})\n","import { lazy } from 'react'\nimport WidgetType from '@jbrowse/core/pluggableElementTypes/WidgetType'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { SessionWithWidgets, isAbstractMenuManager } from '@jbrowse/core/util'\n\nimport HelpIcon from '@mui/icons-material/Help'\nimport InfoIcon from '@mui/icons-material/Info'\n\nimport {\n configSchema as aboutConfigSchema,\n stateModel as aboutStateModel,\n} from './AboutWidget'\nimport {\n configSchema as helpConfigSchema,\n stateModel as helpStateModel,\n} from './HelpWidget'\nimport {\n configSchema as importSessionConfigSchema,\n stateModel as importSessionStateModel,\n} from './ImportSessionWidget'\nimport {\n configSchema as sessionManagerConfigSchema,\n stateModel as sessionManagerStateModel,\n} from './SessionManager'\n\nexport default class MenusPlugin extends Plugin {\n name = 'MenusPlugin'\n\n install(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'AboutWidget',\n heading: 'About',\n configSchema: aboutConfigSchema,\n stateModel: aboutStateModel,\n ReactComponent: lazy(\n () => import('./AboutWidget/components/AboutWidget'),\n ),\n })\n })\n\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'HelpWidget',\n heading: 'Help',\n configSchema: helpConfigSchema,\n stateModel: helpStateModel,\n ReactComponent: lazy(\n () => import('./HelpWidget/components/HelpWidget'),\n ),\n })\n })\n\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'ImportSessionWidget',\n heading: 'Import session',\n configSchema: importSessionConfigSchema,\n stateModel: importSessionStateModel,\n ReactComponent: lazy(\n () => import('./ImportSessionWidget/components/ImportSessionWidget'),\n ),\n })\n })\n\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'SessionManager',\n heading: 'Sessions',\n configSchema: sessionManagerConfigSchema,\n stateModel: sessionManagerStateModel,\n ReactComponent: lazy(\n () => import('./SessionManager/components/SessionManager'),\n ),\n })\n })\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToMenu('Help', {\n label: 'About',\n icon: InfoIcon,\n onClick: (session: SessionWithWidgets) => {\n const widget = session.addWidget('AboutWidget', 'aboutWidget')\n session.showWidget(widget)\n },\n })\n pluginManager.rootModel.appendToMenu('Help', {\n label: 'Help',\n icon: HelpIcon,\n onClick: (session: SessionWithWidgets) => {\n const widget = session.addWidget('HelpWidget', 'helpWidget')\n session.showWidget(widget)\n },\n })\n }\n }\n}\n","import {\n BaseFeatureDataAdapter,\n BaseOptions,\n} from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { NoAssemblyRegion } from '@jbrowse/core/util/types'\nimport { ObservableCreate } from '@jbrowse/core/util/rxjs'\nimport SimpleFeature, { Feature } from '@jbrowse/core/util/simpleFeature'\nimport format from 'string-template'\nimport { Instance } from 'mobx-state-tree'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { getSubAdapterType } from '@jbrowse/core/data_adapters/dataAdapterCache'\n\nimport type MyConfigSchema from './configSchema'\n\ninterface SPARQLEntry {\n type: string\n value: string\n dataTypes?: string\n}\n\ntype SPARQLBinding = Record<string, SPARQLEntry>\n\ninterface SPARQLResponseHead {\n vars: string[]\n}\n\ninterface SPARQLResponseResults {\n bindings?: SPARQLBinding[]\n}\n\ninterface SPARQLResponse {\n head: SPARQLResponseHead\n results: SPARQLResponseResults\n}\n\ninterface SPARQLFeatureData {\n start: number\n end: number\n strand: number\n refName: string\n subfeatures?: SPARQLFeatureData[]\n uniqueId: string\n\n [propName: string]: any\n}\n\ninterface SPARQLFeature {\n data: SPARQLFeatureData\n}\n\nexport default class SPARQLAdapter extends BaseFeatureDataAdapter {\n private endpoint: string\n\n private queryTemplate: string\n\n private refNamesQueryTemplate: string\n\n private additionalQueryParams: string[]\n\n private configRefNames: string[]\n\n private refNames: string[] | undefined\n\n public constructor(\n config: Instance<typeof MyConfigSchema>,\n getSubAdapter?: getSubAdapterType,\n pluginManager?: PluginManager,\n ) {\n super(config, getSubAdapter, pluginManager)\n this.endpoint = readConfObject(config, 'endpoint').uri\n this.queryTemplate = readConfObject(config, 'queryTemplate')\n this.additionalQueryParams = readConfObject(config, 'additionalQueryParams')\n this.refNamesQueryTemplate = readConfObject(config, 'refNamesQueryTemplate')\n this.configRefNames = readConfObject(config, 'refNames')\n }\n\n public async getRefNames(opts: BaseOptions = {}): Promise<string[]> {\n if (this.refNames) {\n return this.refNames\n }\n if (this.refNamesQueryTemplate) {\n const queryTemplate = encodeURIComponent(this.refNamesQueryTemplate)\n const results = await this.querySparql(queryTemplate, opts)\n this.refNames = this.resultsToRefNames(results)\n } else {\n this.refNames = this.configRefNames\n }\n return this.refNames\n }\n\n public getFeatures(query: NoAssemblyRegion, opts: BaseOptions = {}) {\n return ObservableCreate<Feature>(async observer => {\n const filledTemplate = encodeURIComponent(\n format(this.queryTemplate, query),\n )\n const { refName } = query\n const results = await this.querySparql(filledTemplate, opts)\n this.resultsToFeatures(results, refName).forEach(feature => {\n observer.next(feature)\n })\n observer.complete()\n }, opts.signal)\n }\n\n private async querySparql(query: string, opts?: BaseOptions): Promise<any> {\n let additionalQueryParams = ''\n if (this.additionalQueryParams.length) {\n additionalQueryParams = `&${this.additionalQueryParams.join('&')}`\n }\n const signal = opts?.signal\n const response = await fetch(\n `${this.endpoint}?query=${query}${additionalQueryParams}`,\n {\n headers: { accept: 'application/json,application/sparql-results+json' },\n signal,\n },\n )\n return response.json()\n }\n\n private resultsToRefNames(response: SPARQLResponse): string[] {\n const rows = response.results.bindings || []\n const fields = response.head.vars\n if (!fields.includes('refName')) {\n throw new Error('\"refName\" not found in refNamesQueryTemplate response')\n }\n return rows.map(row => row.refName!.value)\n }\n\n private resultsToFeatures(\n results: SPARQLResponse,\n refName: string,\n ): SimpleFeature[] {\n const rows = results.results.bindings || []\n const fields = results.head.vars\n const requiredFields = ['start', 'end', 'uniqueId']\n requiredFields.forEach(requiredField => {\n if (!fields.includes(requiredField)) {\n console.error(\n `Required field ${requiredField} missing from feature data`,\n )\n }\n })\n const seenFeatures: Record<string, SPARQLFeature> = {}\n rows.forEach(row => {\n const rawData: Record<string, string>[] = [{}]\n fields.forEach(field => {\n if (field in row) {\n const { value } = row[field]!\n let idx = 0\n while (field.startsWith('sub_')) {\n field = field.slice(4)\n idx += 1\n }\n while (idx > rawData.length - 1) {\n rawData.push({})\n }\n rawData[idx]![field] = value\n }\n })\n\n rawData.forEach((rd, idx) => {\n const { uniqueId, start, end, strand } = rd\n if (idx < rawData.length - 1) {\n rawData[idx + 1]!.parentUniqueId = uniqueId!\n }\n seenFeatures[uniqueId!] = {\n data: {\n ...rd,\n uniqueId: uniqueId!,\n refName,\n start: Number.parseInt(start!, 10),\n end: Number.parseInt(end!, 10),\n strand: Number.parseInt(strand!, 10) || 0,\n },\n }\n })\n })\n\n // resolve subfeatures, keeping only top-level features in seenFeatures\n for (const [uniqueId, f] of Object.entries(seenFeatures)) {\n const pid = f.data.parentUniqueId\n f.data.parentUniqueId = undefined\n if (pid) {\n const p = seenFeatures[pid]\n if (p) {\n if (!p.data.subfeatures) {\n p.data.subfeatures = []\n }\n p.data.subfeatures.push({\n ...f.data,\n uniqueId,\n })\n delete seenFeatures[uniqueId]\n } else {\n const subfeatures = Object.values(seenFeatures)\n .map(sf => sf.data.subfeatures)\n .filter(sf => !!sf)\n .flat()\n let found = false\n for (const subfeature of subfeatures) {\n if (subfeature.uniqueId === pid) {\n if (!subfeature.subfeatures) {\n subfeature.subfeatures = []\n }\n subfeature.subfeatures.push({\n ...f.data,\n uniqueId,\n })\n delete seenFeatures[uniqueId]\n found = true\n break\n }\n if (subfeature.subfeatures) {\n subfeatures.push(...subfeature.subfeatures)\n }\n }\n if (!found) {\n console.error(`Could not find parentID ${pid}`)\n }\n }\n }\n }\n\n return Object.keys(seenFeatures).map(\n seenFeature =>\n new SimpleFeature({\n ...seenFeatures[seenFeature]!.data,\n uniqueId: seenFeature,\n subfeatures: seenFeatures[seenFeature]!.data.subfeatures,\n }),\n )\n }\n\n public async hasDataForRefName(\n refName: string,\n opts: BaseOptions = {},\n ): Promise<boolean> {\n const refNames = await this.getRefNames(opts)\n if (refNames.length && !refNames.includes(refName)) {\n return false\n }\n return true\n }\n\n public freeResources(/* { region } */): void {}\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\nexport default ConfigurationSchema(\n 'SPARQLAdapter',\n {\n endpoint: {\n type: 'fileLocation',\n defaultValue: {\n uri: 'https://somesite.com/sparql',\n locationType: 'UriLocation',\n },\n description: 'URL of the SPARQL endpoint',\n },\n queryTemplate: {\n type: 'text',\n defaultValue: '',\n description:\n 'SPARQL query where {start} {end} and {refName} will get replaced for each call',\n },\n refNamesQueryTemplate: {\n type: 'text',\n defaultValue: '',\n description:\n 'SPARQL query that returns the possible refNames in a ?refName column',\n },\n refNames: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Possible refNames used by the SPARQL endpoint (ignored if \"refNamesQueryTemplate\" is provided)',\n },\n additionalQueryParams: {\n type: 'stringArray',\n defaultValue: [],\n description:\n 'Additional parameters to add to the query, e.g. \"format=JSON\"',\n },\n },\n { explicitlyTyped: true },\n)\n","import AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n AdapterClass as SPARQLAdapterClass,\n configSchema as sparqlAdapterConfigSchema,\n} from './SPARQLAdapter'\nimport { AdapterGuesser, getFileName } from '@jbrowse/core/util/tracks'\n\nexport default class RdfPlugin extends Plugin {\n name = 'RdfPlugin'\n\n install(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'SPARQLAdapter',\n displayName: 'SPARQL adapter',\n configSchema: sparqlAdapterConfigSchema,\n AdapterClass: SPARQLAdapterClass,\n }),\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\/sparql$/i\n const adapterName = 'SPARQLAdapter'\n const fileName = getFileName(file)\n if (regexGuess.test(fileName) || adapterHint === adapterName) {\n return {\n type: adapterName,\n endpoint: file,\n }\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n }\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config TwoBitAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst TwoBitAdapter = ConfigurationSchema(\n 'TwoBitAdapter',\n {\n /**\n * #slot\n */\n twoBitLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/my.2bit', locationType: 'UriLocation' },\n },\n /**\n * #slot\n */\n chromSizesLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/default.chrom.sizes',\n locationType: 'UriLocation',\n },\n description:\n 'An optional chrom.sizes file can be supplied to speed up loading since parsing the twobit file can take time',\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default TwoBitAdapter\n","import React from 'react'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { createJBrowseTheme } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\nimport {\n Feature,\n Region,\n bpSpanPx,\n revcom,\n complement,\n defaultStarts,\n defaultStops,\n defaultCodonTable,\n generateCodonTable,\n Frame,\n} from '@jbrowse/core/util'\nimport { Theme } from '@mui/material'\n\nfunction Translation({\n codonTable,\n seq,\n frame,\n bpPerPx,\n colorByCDS,\n region,\n seqStart,\n height,\n y,\n reverse = false,\n theme,\n}: {\n codonTable: Record<string, string>\n seq: string\n frame: Frame\n colorByCDS: boolean\n bpPerPx: number\n region: Region\n seqStart: number\n reverse?: boolean\n height: number\n y: number\n theme?: Theme\n}) {\n const normalizedFrame = Math.abs(frame) - 1\n const seqFrame = seqStart % 3\n const frameShift = (normalizedFrame - seqFrame + 3) % 3\n\n const frameShiftAdjustedSeqLength = seq.length - frameShift\n const multipleOfThreeLength =\n frameShiftAdjustedSeqLength - (frameShiftAdjustedSeqLength % 3)\n const seqSliced = seq.slice(frameShift, frameShift + multipleOfThreeLength)\n\n const translated: { letter: string; codon: string }[] = []\n for (let i = 0; i < seqSliced.length; i += 3) {\n const codon = seqSliced.slice(i, i + 3)\n const normalizedCodon = reverse ? revcom(codon) : codon\n const aminoAcid = codonTable[normalizedCodon] || ''\n translated.push({\n letter: aminoAcid,\n codon: normalizedCodon.toUpperCase(),\n })\n }\n\n const width = (region.end - region.start) / bpPerPx\n const codonWidth = (1 / bpPerPx) * 3\n const renderLetter = 1 / bpPerPx >= 12\n const frameOffset = frameShift / bpPerPx\n const startOffset = (region.start - seqStart) / bpPerPx\n const offset = frameOffset - startOffset\n const defaultFill = colorByCDS\n ? theme?.palette.framesCDS.at(frame)?.main\n : theme?.palette.frames.at(frame)?.main\n return (\n <>\n <rect x={0} y={y} width={width} height={height} fill={defaultFill} />\n {translated.map((element, index) => {\n const x = region.reversed\n ? width - (index + 1) * codonWidth - offset\n : codonWidth * index + offset\n const { letter, codon } = element\n const codonFill = defaultStarts.includes(codon)\n ? theme?.palette.startCodon\n : defaultStops.includes(codon)\n ? theme?.palette.stopCodon\n : undefined\n return !(renderLetter || codonFill) ? null : (\n <React.Fragment key={`${index}-${letter}`}>\n <rect\n x={x}\n y={y}\n width={\n renderLetter\n ? codonWidth\n : codonWidth + 0.7 /* small fudge factor when zoomed out*/\n }\n height={height}\n stroke={renderLetter ? '#555' : 'none'}\n fill={codonFill || 'none'}\n />\n {renderLetter ? (\n <text\n x={x + codonWidth / 2}\n fontSize={height - 2}\n y={y + height / 2}\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n >\n {letter}\n </text>\n ) : null}\n </React.Fragment>\n )\n })}\n </>\n )\n}\n\nfunction Sequence({\n bpPerPx,\n region,\n feature,\n sequenceType,\n theme,\n height,\n seq,\n y,\n}: {\n seq: string\n theme: Theme\n bpPerPx: number\n sequenceType: string\n height: number\n region: Region\n feature: Feature\n y: number\n}) {\n const render = 1 / bpPerPx >= 12\n const s = feature.get('start')\n const e = feature.get('end')\n const [leftPx, rightPx] = bpSpanPx(s, e, region, bpPerPx)\n const reverse = region.reversed\n const len = e - s\n const w = Math.max((rightPx - leftPx) / len, 0.8)\n\n return (\n <>\n {seq.split('').map((letter, index) => {\n const color =\n sequenceType === 'dna'\n ? // @ts-expect-error\n theme.palette.bases[letter.toUpperCase()]\n : undefined\n const x = reverse ? rightPx - (index + 1) * w : leftPx + index * w\n return (\n /* biome-ignore lint/suspicious/noArrayIndexKey: */\n <React.Fragment key={`${letter}-${index}`}>\n <rect\n x={x}\n y={y}\n width={w}\n height={height}\n fill={color ? color.main : '#aaa'}\n stroke={render ? '#555' : 'none'}\n />\n {render ? (\n <text\n x={x + w / 2}\n y={y + height / 2}\n dominantBaseline=\"middle\"\n textAnchor=\"middle\"\n fontSize={height - 2}\n fill={\n color ? theme.palette.getContrastText(color.main) : 'black'\n }\n >\n {letter}\n </text>\n ) : null}\n </React.Fragment>\n )\n })}\n </>\n )\n}\n\nfunction SequenceSVG({\n regions,\n theme: configTheme,\n colorByCDS,\n features = new Map(),\n showReverse = true,\n showForward = true,\n showTranslation = true,\n sequenceType = 'dna',\n bpPerPx,\n rowHeight,\n}: {\n regions: Region[]\n theme?: Theme\n features: Map<string, Feature>\n colorByCDS: boolean\n showReverse?: boolean\n showForward?: boolean\n showTranslation?: boolean\n sequenceType?: string\n bpPerPx: number\n rowHeight: number\n}) {\n const region = regions[0]!\n const theme = createJBrowseTheme(configTheme)\n const codonTable = generateCodonTable(defaultCodonTable)\n const [feature] = [...features.values()]\n if (!feature) {\n return null\n }\n const seq: string = feature.get('seq')\n if (!seq) {\n return null\n }\n\n // incrementer for the y-position of the current sequence being rendered\n // (applies to both translation rows and dna rows)\n let currY = -rowHeight\n\n const showSequence = bpPerPx <= 1\n\n const forwardFrames: Frame[] = showTranslation && showForward ? [3, 2, 1] : []\n const reverseFrames: Frame[] =\n showTranslation && showReverse ? [-1, -2, -3] : []\n\n // if region.reversed, the forward translation is on bottom, reverse on top\n const [topFrames, bottomFrames] = region.reversed\n ? [reverseFrames.toReversed(), forwardFrames.toReversed()]\n : [forwardFrames, reverseFrames]\n return (\n <>\n {topFrames.map(index => (\n <Translation\n key={`translation-${index}`}\n colorByCDS={colorByCDS}\n seq={seq}\n y={(currY += rowHeight)}\n codonTable={codonTable}\n frame={index}\n bpPerPx={bpPerPx}\n region={region}\n seqStart={feature.get('start')}\n theme={theme}\n height={rowHeight}\n reverse={region.reversed}\n />\n ))}\n\n {showForward && showSequence ? (\n <Sequence\n height={rowHeight}\n sequenceType={sequenceType}\n y={(currY += rowHeight)}\n feature={feature}\n region={region}\n seq={region.reversed ? complement(seq) : seq}\n bpPerPx={bpPerPx}\n theme={theme}\n />\n ) : null}\n\n {showReverse && showSequence ? (\n <Sequence\n height={rowHeight}\n sequenceType={sequenceType}\n y={(currY += rowHeight)}\n feature={feature}\n region={region}\n seq={region.reversed ? seq : complement(seq)}\n bpPerPx={bpPerPx}\n theme={theme}\n />\n ) : null}\n\n {bottomFrames.map(index => (\n <Translation\n key={`rev-translation-${index}`}\n colorByCDS={colorByCDS}\n seq={seq}\n y={(currY += rowHeight)}\n codonTable={codonTable}\n frame={index}\n bpPerPx={bpPerPx}\n region={region}\n seqStart={feature.get('start')}\n theme={theme}\n height={rowHeight}\n reverse={!region.reversed}\n />\n ))}\n </>\n )\n}\n\nfunction Wrapper({\n exportSVG,\n width,\n totalHeight,\n children,\n}: {\n exportSVG?: { rasterizeLayers: boolean }\n width: number\n totalHeight: number\n children: React.ReactNode\n}) {\n return exportSVG ? (\n children\n ) : (\n <svg\n data-testid=\"sequence_track\"\n width={width}\n height={totalHeight}\n style={{\n // use block because svg by default is inline, which adds a margin\n display: 'block',\n width,\n height: totalHeight,\n userSelect: 'none',\n }}\n >\n {children}\n </svg>\n )\n}\n\nconst DivSequenceRendering = observer(function (props: {\n exportSVG?: { rasterizeLayers: boolean }\n features: Map<string, Feature>\n regions: Region[]\n colorByCDS: boolean\n bpPerPx: number\n rowHeight: number\n sequenceHeight: number\n config: AnyConfigurationModel\n theme?: Theme\n showForward?: boolean\n showReverse?: boolean\n showTranslation?: boolean\n}) {\n const { regions, bpPerPx, sequenceHeight } = props\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n\n return (\n <Wrapper {...props} totalHeight={sequenceHeight} width={width}>\n <SequenceSVG {...props} />\n </Wrapper>\n )\n})\n\nexport default DivSequenceRendering\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config DivSequenceRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst DivSequenceRenderer = ConfigurationSchema(\n 'DivSequenceRenderer',\n {\n /**\n * #slot\n */\n height: {\n type: 'number',\n description: 'height in pixels of each line of sequence',\n defaultValue: 16,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default DivSequenceRenderer\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport { Region } from '@jbrowse/core/util/types'\nimport FeatureRendererType from '@jbrowse/core/pluggableElementTypes/renderers/FeatureRendererType'\nimport ReactComponent from './components/DivSequenceRendering'\nimport configSchema from './configSchema'\n\n/* adjust in both directions */\nclass DivSequenceRenderer extends FeatureRendererType {\n supportsSVG = true\n\n getExpandedRegion(region: Region) {\n return {\n ...region,\n start: Math.max(region.start - 3, 0),\n end: region.end + 3,\n }\n }\n}\n\nexport default function DivSequenceRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new DivSequenceRenderer({\n name: 'DivSequenceRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n/**\n * #config BgzipFastaAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst BgzipFastaAdapter = ConfigurationSchema(\n 'BgzipFastaAdapter',\n {\n /**\n * #slot\n */\n fastaLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/seq.fa.gz', locationType: 'UriLocation' },\n },\n /**\n * #slot\n */\n faiLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/seq.fa.gz.fai',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n metadataLocation: {\n description: 'Optional metadata file',\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/fa.metadata.yaml',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n gziLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/seq.fa.gz.gzi',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\nexport default BgzipFastaAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config ChromSizesAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst ChromSizesAdapter = ConfigurationSchema(\n 'ChromSizesAdapter',\n {\n /**\n * #slot\n */\n chromSizesLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/species.chrom.sizes',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default ChromSizesAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config IndexedFastaAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst IndexedFastaAdapter = ConfigurationSchema(\n 'IndexedFastaAdapter',\n {\n /**\n * #slot\n */\n fastaLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/seq.fa', locationType: 'UriLocation' },\n },\n /**\n * #slot\n */\n faiLocation: {\n type: 'fileLocation',\n defaultValue: { uri: '/path/to/seq.fa.fai', locationType: 'UriLocation' },\n },\n /**\n * #slot\n */\n metadataLocation: {\n description: 'Optional metadata file',\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/fa.metadata.yaml',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\nexport default IndexedFastaAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config UnindexedFastaAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst UnindexedFastaAdapter = ConfigurationSchema(\n 'UnindexedFastaAdapter',\n {\n rewriteRefNames: {\n type: 'string',\n defaultValue: '',\n contextVariable: ['refName'],\n },\n /**\n * #slot\n */\n fastaLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/seq.fa',\n locationType: 'UriLocation',\n },\n },\n /**\n * #slot\n */\n metadataLocation: {\n description: 'Optional metadata file',\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/fa.metadata.yaml',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\nexport default UnindexedFastaAdapter\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config SequenceSearchAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = ConfigurationSchema(\n 'SequenceSearchAdapter',\n {\n /**\n * #slot\n */\n search: {\n type: 'string',\n defaultValue: '',\n description: 'Search string or regex to search for',\n },\n /**\n * #slot\n */\n sequenceAdapter: {\n type: 'frozen',\n defaultValue: null,\n },\n /**\n * #slot\n */\n searchForward: {\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n searchReverse: {\n type: 'boolean',\n defaultValue: true,\n },\n /**\n * #slot\n */\n caseInsensitive: {\n type: 'boolean',\n defaultValue: true,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default configSchema\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { default as divSequenceRendererConfigSchema } from '../DivSequenceRenderer/configSchema'\n\n/**\n * #config LinearReferenceSequenceDisplay\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport const configSchema = ConfigurationSchema(\n 'LinearReferenceSequenceDisplay',\n {\n /**\n * #slot\n */\n renderer: divSequenceRendererConfigSchema,\n },\n { explicitIdentifier: 'displayId', explicitlyTyped: true },\n)\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\nimport TwoBitAdapterF from './TwoBitAdapter'\nimport DivSequenceRendererF from './DivSequenceRenderer'\nimport BgzipFastaAdapterF from './BgzipFastaAdapter'\nimport ChromSizesAdapterF from './ChromSizesAdapter'\nimport IndexedFastaAdapterF from './IndexedFastaAdapter'\nimport UnindexedFastaAdapterF from './UnindexedFastaAdapter'\nimport SequenceSearchAdapterF from './SequenceSearchAdapter'\nimport ReferenceSequenceTrackF from './ReferenceSequenceTrack'\nimport LinearReferenceSequenceDisplayF from './LinearReferenceSequenceDisplay'\nimport createExtensionPoints from './createExtensionPoints'\n\nexport default class SequencePlugin extends Plugin {\n name = 'SequencePlugin'\n\n install(pluginManager: PluginManager) {\n DivSequenceRendererF(pluginManager)\n TwoBitAdapterF(pluginManager)\n BgzipFastaAdapterF(pluginManager)\n ChromSizesAdapterF(pluginManager)\n IndexedFastaAdapterF(pluginManager)\n UnindexedFastaAdapterF(pluginManager)\n SequenceSearchAdapterF(pluginManager)\n ReferenceSequenceTrackF(pluginManager)\n LinearReferenceSequenceDisplayF(pluginManager)\n createExtensionPoints(pluginManager)\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function TwoBitAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'TwoBitAdapter',\n displayName: 'TwoBit adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () => import('./TwoBitAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function BgzipFastaAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'BgzipFastaAdapter',\n displayName: 'Bgzip-indexed FASTA adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./BgzipFastaAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function ChromSizesAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'ChromSizesAdapter',\n displayName: 'Chrom sizes adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./ChromSizesAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function IndexedFastaAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'IndexedFastaAdapter',\n displayName: 'Indexed FASTA adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./IndexedFastaAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function UnindexedFastaAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'UnindexedFastaAdapter',\n displayName: 'Unindexed FASTA adapter',\n configSchema,\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n getAdapterClass: () =>\n import('./UnindexedFastaAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchema from './configSchema'\n\nexport default function SequenceSearchAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'SequenceSearchAdapter',\n displayName: 'Sequence search adapter',\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n configSchema,\n getAdapterClass: () =>\n import('./SequenceSearchAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { createReferenceSeqTrackConfig } from './configSchema'\n\nexport default function ReferenceSequenceTrackF(pluginManager: PluginManager) {\n pluginManager.addTrackType(() => {\n const configSchema = createReferenceSeqTrackConfig(pluginManager)\n\n return new TrackType({\n name: 'ReferenceSequenceTrack',\n displayName: 'Reference sequence track',\n configSchema,\n stateModel: createBaseTrackModel(\n pluginManager,\n 'ReferenceSequenceTrack',\n configSchema,\n ),\n })\n })\n}\n","import { types } from 'mobx-state-tree'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// Note: this is primarily a copy of createBaseTrackConfig, except with a\n// subset of the config slots, to avoid including fields that don't make sense\n// for the ReferenceSequenceTrack\n\n/**\n * #config ReferenceSequenceTrack\n * used to display base level DNA sequence tracks\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport function createReferenceSeqTrackConfig(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'ReferenceSequenceTrack',\n {\n /**\n * #slot\n * configuration for track adapter\n */\n adapter: pluginManager.pluggableConfigSchemaType('adapter'),\n\n /**\n * #slot\n * configuration for the displays e.g. LinearReferenceSequenceDisplay\n */\n displays: types.array(pluginManager.pluggableConfigSchemaType('display')),\n\n /**\n * #slot\n */\n name: {\n type: 'string',\n description:\n 'optional track name, otherwise uses the \"Reference sequence (assemblyName)\"',\n defaultValue: '',\n },\n\n /**\n * #slot\n */\n sequenceType: {\n type: 'string',\n description: 'either dna or pep',\n defaultValue: 'dna',\n },\n\n /**\n * #slot\n */\n description: {\n description: 'a description of the track',\n type: 'string',\n defaultValue: '',\n },\n\n /**\n * #slot\n */\n metadata: {\n type: 'frozen',\n description: 'anything to add about this track',\n defaultValue: {},\n },\n\n formatAbout: ConfigurationSchema('FormatAbout', {\n /**\n * #slot formatAbout.config\n */\n config: {\n type: 'frozen',\n description: 'formats configuration in about dialog',\n defaultValue: {},\n contextVariable: ['config'],\n },\n\n /**\n * #slot formatAbout.hideUris\n */\n hideUris: {\n type: 'boolean',\n defaultValue: false,\n },\n }),\n },\n {\n preProcessSnapshot: s => {\n const snap = JSON.parse(JSON.stringify(s))\n const displayTypes = new Set()\n const { displays = [] } = snap\n if (snap.trackId !== 'placeholderId') {\n // Gets the displays on the track snapshot and the possible displays\n // from the track type and adds any missing possible displays to the\n // snapshot\n displays.forEach((d: any) => d && displayTypes.add(d.type))\n const trackType = pluginManager.getTrackType(snap.type)\n trackType?.displayTypes.forEach(displayType => {\n if (!displayTypes.has(displayType.name)) {\n displays.push({\n displayId: `${snap.trackId}-${displayType.name}`,\n type: displayType.name,\n })\n }\n })\n }\n return { ...snap, displays }\n },\n /**\n * #identifier\n * all tracks have a globally unique 'trackId'\n */\n explicitIdentifier: 'trackId',\n explicitlyTyped: true,\n actions: (self: any) => ({\n addDisplayConf(displayConf: { type: string; displayId: string }) {\n const { type } = displayConf\n if (!type) {\n throw new Error(`unknown display type ${type}`)\n }\n const display = self.displays.find(\n (d: any) => d && d.displayId === displayConf.displayId,\n )\n if (display) {\n return display\n }\n const length = self.displays.push(displayConf)\n return self.displays[length - 1]\n },\n }),\n },\n )\n}\n","import { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nimport { configSchema } from './configSchema'\nimport { modelFactory } from './model'\n\nexport default function LinearReferenceSequenceDisplayF(\n pluginManager: PluginManager,\n) {\n pluginManager.addDisplayType(() => {\n const stateModel = modelFactory(configSchema)\n return new DisplayType({\n name: 'LinearReferenceSequenceDisplay',\n configSchema,\n stateModel,\n displayName: 'Reference sequence display',\n trackType: 'ReferenceSequenceTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import { addDisposer, types } from 'mobx-state-tree'\nimport {\n BaseLinearDisplay,\n LinearGenomeViewModel,\n} from '@jbrowse/plugin-linear-genome-view'\nimport {\n AnyConfigurationSchemaType,\n ConfigurationReference,\n getConf,\n} from '@jbrowse/core/configuration'\nimport { getParentRenderProps } from '@jbrowse/core/util/tracks'\nimport { getContainingTrack, getContainingView } from '@jbrowse/core/util'\nimport { autorun } from 'mobx'\n\ntype LGV = LinearGenomeViewModel\n\n/**\n * #stateModel LinearReferenceSequenceDisplay\n * base model `BaseLinearDisplay`\n */\nexport function modelFactory(configSchema: AnyConfigurationSchemaType) {\n return types\n .compose(\n 'LinearReferenceSequenceDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearReferenceSequenceDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n showForward: true,\n /**\n * #property\n */\n showReverse: true,\n /**\n * #property\n */\n showTranslation: true,\n }),\n )\n .volatile(() => ({\n /**\n * #property\n */\n rowHeight: 15,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get sequenceType() {\n return getConf(getContainingTrack(self), 'sequenceType')\n },\n\n /**\n * #getter\n * showReverse setting, it is NOT disabled for non-dna sequences\n */\n get showForwardActual() {\n return self.showForward\n },\n\n /**\n * #getter\n * showReverse setting, is disabled for non-dna sequences\n */\n get showReverseActual() {\n return this.sequenceType === 'dna' ? self.showReverse : false\n },\n\n /**\n * #getter\n * showTranslation setting is disabled for non-dna sequences\n */\n get showTranslationActual() {\n return this.sequenceType === 'dna' ? self.showTranslation : false\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get sequenceHeight() {\n const {\n rowHeight,\n showTranslationActual,\n showReverseActual,\n showForwardActual,\n } = self\n const r1 =\n showReverseActual && showTranslationActual ? rowHeight * 3 : 0\n const r2 =\n showForwardActual && showTranslationActual ? rowHeight * 3 : 0\n const t = r1 + r2\n const r = showReverseActual ? rowHeight : 0\n const s = showForwardActual ? rowHeight : 0\n return t + r + s\n },\n }))\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #method\n */\n renderProps() {\n const {\n rpcDriverName,\n showForwardActual,\n showReverseActual,\n showTranslationActual,\n rowHeight,\n sequenceHeight,\n sequenceType,\n } = self\n return {\n ...superRenderProps(),\n ...getParentRenderProps(self),\n config: self.configuration.renderer,\n rpcDriverName,\n showForward: showForwardActual,\n showReverse: showReverseActual,\n showTranslation: showTranslationActual,\n sequenceType,\n rowHeight,\n sequenceHeight,\n }\n },\n }\n })\n .views(self => ({\n /**\n * #method\n */\n regionCannotBeRendered(/* region */) {\n const view = getContainingView(self) as LGV\n return view.bpPerPx > 3 ? 'Zoom in to see sequence' : undefined\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return self.configuration.renderer.type\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n toggleShowForward() {\n self.showForward = !self.showForward\n },\n /**\n * #action\n */\n toggleShowReverse() {\n self.showReverse = !self.showReverse\n },\n /**\n * #action\n */\n toggleShowTranslation() {\n self.showTranslation = !self.showTranslation\n },\n afterAttach() {\n addDisposer(\n self,\n autorun(() => {\n const view = getContainingView(self) as LGV\n if (view.bpPerPx > 3) {\n self.setHeight(50)\n } else {\n self.setHeight(self.sequenceHeight)\n }\n }),\n )\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n trackMenuItems() {\n return [\n ...(self.sequenceType === 'dna'\n ? [\n {\n label: 'Show forward',\n type: 'checkbox',\n checked: self.showForward,\n onClick: () => {\n self.toggleShowForward()\n },\n },\n {\n label: 'Show reverse',\n type: 'checkbox',\n checked: self.showReverse,\n onClick: () => {\n self.toggleShowReverse()\n },\n },\n {\n label: 'Show translation',\n type: 'checkbox',\n checked: self.showTranslation,\n onClick: () => {\n self.toggleShowTranslation()\n },\n },\n ]\n : []),\n ]\n },\n }))\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport {\n makeIndex,\n getFileName,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\nexport default function ExtensionPointsF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.2bit$/i\n const adapterName = 'TwoBitAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n twoBitLocation: file,\n }\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'TwoBitAdapter') {\n return 'ReferenceSequenceTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.(fa|fasta|fas|fna|mfa)$/i\n const adapterName = 'IndexedFastaAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n fastaLocation: file,\n faiLocation: index || makeIndex(file, '.fai'),\n }\n\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'IndexedFastaAdapter') {\n return 'ReferenceSequenceTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.(fa|fasta|fas|fna|mfa)\\.b?gz$/i\n const adapterName = 'BgzipFastaAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n faiLocation: makeIndex(file, '.fai'),\n gziLocation: makeIndex(file, '.gzi'),\n }\n\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n }\n if (adapterHint === adapterName) {\n return obj\n }\n return adapterGuesser(file, index, adapterHint)\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) => {\n if (adapterName === 'BgzipFastaAdapter') {\n return 'ReferenceSequenceTrack'\n }\n return trackTypeGuesser(adapterName)\n }\n },\n )\n}\n","import React, { useEffect, useState } from 'react'\nimport { useTheme } from '@mui/material'\nimport { observer } from 'mobx-react'\nimport { isAlive, isStateTreeNode } from 'mobx-state-tree'\nimport {\n measureText,\n getViewParams,\n Feature,\n Region,\n stripAlpha,\n} from '@jbrowse/core/util'\nimport { DisplayModel } from './util'\n\ninterface ViewParams {\n start: number\n end: number\n offsetPx: number\n offsetPx1: number\n}\n\nconst FeatureLabel = observer(function ({\n text,\n x,\n y,\n region,\n reversed,\n bpPerPx,\n exportSVG,\n feature,\n viewParams,\n color = 'black',\n fontHeight = 11,\n featureWidth = 0,\n allowedWidthExpansion = 0,\n displayModel = {},\n}: {\n text: string\n x: number\n y: number\n color?: string\n fontHeight?: number\n featureWidth?: number\n bpPerPx: number\n allowedWidthExpansion?: number\n feature: Feature\n reversed?: boolean\n displayModel?: DisplayModel\n exportSVG?: unknown\n region: Region\n viewParams: ViewParams\n}) {\n const totalWidth = featureWidth + allowedWidthExpansion\n const measuredTextWidth = measureText(text, fontHeight)\n const params =\n isStateTreeNode(displayModel) && isAlive(displayModel) && !exportSVG\n ? getViewParams(displayModel)\n : viewParams\n\n const viewLeft = reversed ? params.end : params.start\n\n const [labelVisible, setLabelVisible] = useState(exportSVG)\n const theme = useTheme()\n\n // we use an effect to set the label visible because there can be a\n // mismatch between the server and the client after hydration due to the\n // floating labels. if we are exporting an SVG we allow it as is though and\n // do not use the effect\n useEffect(() => {\n setLabelVisible(true)\n }, [])\n\n if (isStateTreeNode(region) && !isAlive(region)) {\n return null\n }\n\n const rstart = region.start\n const rend = region.end\n const fstart = feature.get('start')\n const fend = feature.get('end')\n\n const featureWidthBp = measuredTextWidth * bpPerPx\n\n // this tricky bit of code helps smooth over block boundaries\n // not supported for reverse mode currently\n // reason: reverse mode allocates space for the label in the \"normal\n // forward orientation\" making it hard to slide. The reverse mode should\n // allocate the label space in the reverse orientation to slide it\n if (\n viewLeft < rend &&\n viewLeft > rstart &&\n fstart < viewLeft &&\n viewLeft + featureWidthBp < fend\n ) {\n x = params.offsetPx\n } else if (\n fstart < viewLeft &&\n viewLeft + featureWidthBp < fend &&\n viewLeft + featureWidthBp > rstart &&\n viewLeft + featureWidthBp < rend\n ) {\n x = params.offsetPx1\n }\n\n return labelVisible ? (\n <text\n x={x}\n y={y + fontHeight}\n fill={color === '#f0f' ? stripAlpha(theme.palette.text.primary) : color}\n fontSize={fontHeight}\n >\n {measuredTextWidth > totalWidth\n ? `${text.slice(0, totalWidth / (fontHeight * 0.6))}...`\n : text}\n </text>\n ) : null\n})\n\nexport default FeatureLabel\n","import React from 'react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { Feature, Region } from '@jbrowse/core/util'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport { observer } from 'mobx-react'\n\n// locals\nimport type { DisplayModel } from './util'\nimport FeatureLabel from './FeatureLabel'\n\nconst FeatureGlyph = observer(function (props: {\n feature: Feature\n rootLayout: SceneGraph\n config: AnyConfigurationModel\n name: string\n description: string\n shouldShowName: boolean\n shouldShowDescription: boolean\n colorByCDS: boolean\n fontHeight: number\n allowedWidthExpansion: number\n exportSVG?: unknown\n displayModel?: DisplayModel\n selected?: boolean\n reversed?: boolean\n topLevel?: boolean\n region: Region\n viewParams: {\n end: number\n start: number\n offsetPx: number\n offsetPx1: number\n }\n bpPerPx: number\n}) {\n const {\n feature,\n rootLayout,\n config,\n name,\n description,\n shouldShowName,\n shouldShowDescription,\n } = props\n\n const featureLayout = rootLayout.getSubRecord(String(feature.id()))\n if (!featureLayout) {\n return null\n }\n const { GlyphComponent } = featureLayout.data || {}\n\n return (\n <g>\n <GlyphComponent featureLayout={featureLayout} {...props} />\n {shouldShowName ? (\n <FeatureLabel\n text={name}\n x={rootLayout.getSubRecord('nameLabel')?.absolute.left || 0}\n y={rootLayout.getSubRecord('nameLabel')?.absolute.top || 0}\n color={readConfObject(config, ['labels', 'nameColor'], { feature })}\n featureWidth={featureLayout.width}\n {...props}\n />\n ) : null}\n {shouldShowDescription ? (\n <FeatureLabel\n text={description}\n x={rootLayout.getSubRecord('descriptionLabel')?.absolute.left || 0}\n y={rootLayout.getSubRecord('descriptionLabel')?.absolute.top || 0}\n color={readConfObject(config, ['labels', 'descriptionColor'], {\n feature,\n })}\n featureWidth={featureLayout.width}\n {...props}\n />\n ) : null}\n </g>\n )\n})\n\nexport default FeatureGlyph\n","import React, { useEffect, useState } from 'react'\nimport { bpSpanPx, Feature, Region } from '@jbrowse/core/util'\nimport { observer } from 'mobx-react'\n\ntype LayoutRecord = [number, number, number, number]\n\ninterface OverlayRectProps extends React.SVGProps<SVGRectElement> {\n rect?: LayoutRecord\n region: Region\n bpPerPx: number\n}\n\nfunction OverlayRect({\n rect,\n region,\n bpPerPx,\n ...rectProps\n}: OverlayRectProps) {\n if (!rect) {\n return null\n }\n const [leftBp, topPx, rightBp, bottomPx] = rect\n const [leftPx, rightPx] = bpSpanPx(leftBp, rightBp, region, bpPerPx)\n const rectTop = Math.round(topPx)\n const screenWidth = (region.end - region.start) / bpPerPx\n const rectHeight = Math.round(bottomPx - topPx)\n const width = rightPx - leftPx\n\n if (leftPx + width < 0) {\n return null\n }\n const leftWithinBlock = Math.max(leftPx, 0)\n const diff = leftWithinBlock - leftPx\n const widthWithinBlock = Math.max(1, Math.min(width - diff, screenWidth))\n\n return (\n <rect\n x={leftWithinBlock - 2}\n y={rectTop - 2}\n width={widthWithinBlock + 4}\n height={rectHeight + 4}\n {...rectProps}\n />\n )\n}\n\ntype ME = React.MouseEvent<SVGRectElement>\ntype MEFE = ME | React.FocusEvent<SVGRectElement>\n\nconst SvgOverlay = observer(function ({\n displayModel = {},\n blockKey,\n region,\n bpPerPx,\n movedDuringLastMouseDown,\n ...handlers\n}: {\n region: Region\n displayModel?: {\n getFeatureByID?: (arg0: string, arg1: string) => LayoutRecord\n selectedFeatureId?: string\n featureIdUnderMouse?: string\n contextMenuFeature?: Feature\n }\n bpPerPx: number\n blockKey: string\n movedDuringLastMouseDown?: boolean\n onFeatureMouseDown?(event: ME, featureId: string): void\n onFeatureMouseEnter?(event: ME, featureId: string): void\n onFeatureMouseOut?(event: MEFE, featureId: string): void\n onFeatureMouseOver?(event: MEFE, featureId: string): void\n onFeatureMouseUp?(event: ME, featureId: string): void\n onFeatureMouseLeave?(event: ME, featureId: string): void\n onFeatureMouseMove?(event: ME, featureId: string): void\n // synthesized from mouseup and mousedown\n onFeatureClick?(event: ME, featureId: string): void\n onFeatureContextMenu?(event: ME, featureId: string): void\n}) {\n const { selectedFeatureId, featureIdUnderMouse, contextMenuFeature } =\n displayModel\n\n const mouseoverFeatureId = featureIdUnderMouse || contextMenuFeature?.id()\n const [renderOverlay, setRenderOverlay] = useState(false)\n useEffect(() => {\n setRenderOverlay(true)\n }, [])\n\n function onFeatureMouseDown(event: ME) {\n const { onFeatureMouseDown: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseEnter(event: ME) {\n const { onFeatureMouseEnter: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseOut(event: ME | React.FocusEvent<SVGRectElement>) {\n const { onFeatureMouseOut: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseOver(event: ME | React.FocusEvent<SVGRectElement>) {\n const { onFeatureMouseOver: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseUp(event: ME) {\n const { onFeatureMouseUp: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseLeave(event: ME) {\n const { onFeatureMouseLeave: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureMouseMove(event: ME) {\n const { onFeatureMouseMove: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureClick(event: ME) {\n if (movedDuringLastMouseDown) {\n return undefined\n }\n const { onFeatureClick: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n event.stopPropagation()\n handler(event, mouseoverFeatureId)\n }\n\n function onFeatureContextMenu(event: ME) {\n const { onFeatureContextMenu: handler } = handlers\n if (!(handler && mouseoverFeatureId)) {\n return undefined\n }\n handler(event, mouseoverFeatureId)\n }\n\n return renderOverlay ? (\n <>\n {mouseoverFeatureId ? (\n <OverlayRect\n rect={displayModel.getFeatureByID?.(blockKey, mouseoverFeatureId)}\n region={region}\n bpPerPx={bpPerPx}\n fill=\"#000\"\n fillOpacity=\"0.2\"\n onMouseDown={onFeatureMouseDown}\n onMouseEnter={onFeatureMouseEnter}\n onMouseOut={onFeatureMouseOut}\n onMouseOver={onFeatureMouseOver}\n onMouseUp={onFeatureMouseUp}\n onMouseLeave={onFeatureMouseLeave}\n onMouseMove={onFeatureMouseMove}\n onClick={onFeatureClick}\n onContextMenu={onFeatureContextMenu}\n onFocus={onFeatureMouseOver}\n onBlur={onFeatureMouseOut}\n data-testid={mouseoverFeatureId}\n />\n ) : null}\n {selectedFeatureId ? (\n <OverlayRect\n rect={displayModel.getFeatureByID?.(blockKey, selectedFeatureId)}\n region={region}\n bpPerPx={bpPerPx}\n stroke=\"#00b8ff\"\n fill=\"none\"\n />\n ) : null}\n </>\n ) : null\n})\n\nexport default SvgOverlay\n","import React from 'react'\nimport { observer } from 'mobx-react'\n\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport { Region, Feature, stripAlpha } from '@jbrowse/core/util'\nimport { useTheme } from '@mui/material'\n\nconst Arrow = observer(function Arrow({\n feature,\n featureLayout,\n config,\n region,\n}: {\n region: Region\n feature: Feature\n featureLayout: SceneGraph\n config: AnyConfigurationModel\n}) {\n const strand = feature.get('strand')\n const size = 5\n const reverseFlip = region.reversed ? -1 : 1\n const offset = 7 * strand * reverseFlip\n const { left = 0, top = 0, width = 0, height = 0 } = featureLayout.absolute\n\n const c = readConfObject(config, 'color2', { feature })\n const theme = useTheme()\n const color2 = c === '#f0f' ? stripAlpha(theme.palette.text.secondary) : c\n const p =\n strand * reverseFlip === -1\n ? left\n : strand * reverseFlip === 1\n ? left + width\n : null\n const y = top + height / 2\n\n return p ? (\n <>\n <line x1={p} x2={p + offset} y1={y} y2={y} stroke={color2} />\n <polygon\n points={[\n [p + offset / 2, y - size / 2],\n [p + offset / 2, y + size / 2],\n [p + offset, y],\n ].toString()}\n stroke={color2}\n fill={color2}\n />\n </>\n ) : null\n})\n\nexport default Arrow\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { Region, Feature, getFrame } from '@jbrowse/core/util'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport { isUTR } from './util'\nimport Arrow from './Arrow'\n\nconst utrHeightFraction = 0.65\n\nconst Box = observer(function Box(props: {\n feature: Feature\n region: Region\n config: AnyConfigurationModel\n featureLayout: SceneGraph\n bpPerPx: number\n selected?: boolean\n topLevel?: boolean\n colorByCDS: boolean\n}) {\n const theme = useTheme()\n const {\n colorByCDS,\n feature,\n region,\n config,\n featureLayout,\n bpPerPx,\n topLevel,\n } = props\n const { start, end } = region\n const screenWidth = (end - start) / bpPerPx\n const featureStart = feature.get('start')\n const featureEnd = feature.get('end')\n const featureType: string | undefined = feature.get('type')\n const featureStrand: -1 | 1 | undefined = feature.get('strand')\n const featurePhase: 0 | 1 | 2 | undefined = feature.get('phase')\n const width = (featureEnd - featureStart) / bpPerPx\n const { left = 0 } = featureLayout.absolute\n let { top = 0, height = 0 } = featureLayout.absolute\n\n if (left + width < 0) {\n return null\n }\n\n if (isUTR(feature)) {\n top += ((1 - utrHeightFraction) / 2) * height\n height *= utrHeightFraction\n }\n const leftWithinBlock = Math.max(left, 0)\n const diff = leftWithinBlock - left\n const widthWithinBlock = Math.max(2, Math.min(width - diff, screenWidth))\n\n let fill: string = isUTR(feature)\n ? readConfObject(config, 'color3', { feature })\n : readConfObject(config, 'color1', { feature })\n if (\n colorByCDS &&\n featureType === 'CDS' &&\n featureStrand !== undefined &&\n featurePhase !== undefined\n ) {\n const frame = getFrame(\n featureStart,\n featureEnd,\n featureStrand,\n featurePhase,\n )\n const frameColor = theme.palette.framesCDS.at(frame)?.main\n if (frameColor) {\n fill = frameColor\n }\n }\n\n // if feature has parent and type is intron, then don't render the intron\n // subfeature (if it doesn't have a parent, then maybe the introns are\n // separately displayed features that should be displayed)\n return feature.parent() && featureType === 'intron' ? null : (\n <>\n {topLevel ? <Arrow {...props} /> : null}\n <rect\n data-testid={`box-${feature.id()}`}\n x={leftWithinBlock}\n y={top}\n width={widthWithinBlock}\n height={height}\n fill={fill}\n stroke={readConfObject(config, 'outline', { feature }) as string}\n />\n </>\n )\n})\n\nexport default Box\n","import React from 'react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { observer } from 'mobx-react'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport { Region, Feature, stripAlpha } from '@jbrowse/core/util'\nimport { useTheme } from '@mui/material'\n\n// locals\nimport Arrow from './Arrow'\n\nconst Segments = observer(function Segments(props: {\n region: Region\n feature: Feature\n featureLayout: SceneGraph\n config: AnyConfigurationModel\n selected?: boolean\n reversed?: boolean\n subfeatures?: Feature[]\n children?: React.ReactNode\n}) {\n const {\n feature,\n featureLayout,\n selected,\n config,\n // some subfeatures may be computed e.g. makeUTRs,\n // so these are passed as a prop, or feature.get('subfeatures') by default\n subfeatures = feature.get('subfeatures'),\n } = props\n\n const theme = useTheme()\n const c = readConfObject(config, 'color2', { feature })\n const color2 = c === '#f0f' ? stripAlpha(theme.palette.text.secondary) : c\n\n const { left = 0, top = 0, width = 0, height = 0 } = featureLayout.absolute\n\n const y = top + height / 2\n return (\n <>\n <line\n data-testid={feature.id()}\n x1={left}\n y1={y}\n y2={y}\n x2={left + width}\n stroke={color2}\n />\n {subfeatures?.map(subfeature => {\n const subfeatureId = String(subfeature.id())\n const subfeatureLayout = featureLayout.getSubRecord(subfeatureId)\n // This subfeature got filtered out\n if (!subfeatureLayout) {\n return null\n }\n const { GlyphComponent } = subfeatureLayout.data || {}\n return (\n <GlyphComponent\n key={`glyph-${subfeatureId}`}\n {...props}\n feature={subfeature}\n topLevel={false}\n featureLayout={subfeatureLayout}\n selected={selected}\n />\n )\n })}\n <Arrow {...props} />\n </>\n )\n})\n\nexport default Segments\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\n\nimport Segments from './Segments'\nimport { ExtraGlyphValidator, layOutFeature, layOutSubfeatures } from './util'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport { Region, Feature, SimpleFeature } from '@jbrowse/core/util'\n\n// returns a callback that will filter features features according to the\n// subParts conf var\nfunction makeSubpartsFilter(\n confKey: string | string[],\n config: AnyConfigurationModel,\n) {\n const filter = readConfObject(config, confKey) as string[] | string\n const ret = typeof filter === 'string' ? filter.split(/\\s*,\\s*/) : filter\n\n return (feature: Feature) =>\n ret\n .map(typeName => typeName.toLowerCase())\n .includes(feature.get('type').toLowerCase())\n}\n\nfunction filterSubpart(feature: Feature, config: AnyConfigurationModel) {\n return makeSubpartsFilter('subParts', config)(feature)\n}\n\nfunction isUTR(feature: Feature) {\n return /(\\bUTR|_UTR|untranslated[_\\s]region)\\b/.test(\n feature.get('type') || '',\n )\n}\n\nfunction makeUTRs(parent: Feature, subs: Feature[]) {\n // based on Lincoln's UTR-making code in\n // Bio::Graphics::Glyph::processed_transcript\n const subparts = [...subs]\n\n let codeStart = Number.POSITIVE_INFINITY\n let codeEnd = Number.NEGATIVE_INFINITY\n\n let haveLeftUTR: boolean | undefined\n let haveRightUTR: boolean | undefined\n\n // gather exons, find coding start and end, and look for UTRs\n const exons = []\n for (const subpart of subparts) {\n const type = subpart.get('type')\n if (/^cds/i.test(type)) {\n if (codeStart > subpart.get('start')) {\n codeStart = subpart.get('start')\n }\n if (codeEnd < subpart.get('end')) {\n codeEnd = subpart.get('end')\n }\n } else if (/exon/i.test(type)) {\n exons.push(subpart)\n } else if (isUTR(subpart)) {\n haveLeftUTR = subpart.get('start') === parent.get('start')\n haveRightUTR = subpart.get('end') === parent.get('end')\n }\n }\n\n // bail if we don't have exons and CDS\n if (\n !(\n exons.length &&\n codeStart < Number.POSITIVE_INFINITY &&\n codeEnd > Number.NEGATIVE_INFINITY\n )\n ) {\n return subparts\n }\n\n // make sure the exons are sorted by coord\n exons.sort((a, b) => a.get('start') - b.get('start'))\n\n const strand = parent.get('strand')\n\n // make the left-hand UTRs\n let start: number | undefined\n let end: number | undefined\n if (!haveLeftUTR) {\n for (let i = 0; i < exons.length; i++) {\n start = exons[i]!.get('start')\n if (start >= codeStart) {\n break\n }\n end = codeStart > exons[i]!.get('end') ? exons[i]!.get('end') : codeStart\n const type = strand >= 0 ? 'five_prime_UTR' : 'three_prime_UTR'\n subparts.unshift(\n new SimpleFeature({\n parent,\n id: `${parent.id()}_${type}_${i}`,\n data: { start, end, strand, type },\n }),\n )\n }\n }\n\n // make the right-hand UTRs\n if (!haveRightUTR) {\n for (let i = exons.length - 1; i >= 0; i--) {\n end = exons[i]!.get('end')\n if (end <= codeEnd) {\n break\n }\n\n start =\n codeEnd < exons[i]!.get('start') ? exons[i]!.get('start') : codeEnd\n const type = strand >= 0 ? 'three_prime_UTR' : 'five_prime_UTR'\n subparts.push(\n new SimpleFeature({\n parent,\n id: `${parent.id()}_${type}_${i}`,\n data: { start, end, strand, type },\n }),\n )\n }\n }\n\n return subparts\n}\n\nfunction getSubparts(f: Feature, config: AnyConfigurationModel) {\n let c = f.get('subfeatures')\n if (!c || c.length === 0) {\n return []\n }\n const hasUTRs = c.some(child => isUTR(child))\n const isTranscript = ['mRNA', 'transcript'].includes(f.get('type'))\n const impliedUTRs = !hasUTRs && isTranscript\n\n // if we think we should use impliedUTRs, or it is specifically in the\n // config, then makeUTRs\n if (impliedUTRs || readConfObject(config, 'impliedUTRs')) {\n c = makeUTRs(f, c)\n }\n\n return c.filter(element => filterSubpart(element, config))\n}\n\nconst ProcessedTranscript = observer(function ProcessedTranscript(props: {\n feature: Feature\n region: Region\n config: AnyConfigurationModel\n featureLayout: SceneGraph\n selected?: boolean\n reversed?: boolean\n [key: string]: unknown\n}) {\n const { feature, config } = props\n const subfeatures = getSubparts(feature, config)\n\n // we manually compute some subfeatures, so pass these separately\n return <Segments {...props} subfeatures={subfeatures} />\n})\n\n// @ts-expect-error\nProcessedTranscript.layOut = ({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n}: {\n layout: SceneGraph\n feature: Feature\n bpPerPx: number\n reversed: boolean\n config: AnyConfigurationModel\n extraGlyphs: ExtraGlyphValidator[]\n}) => {\n const subLayout = layOutFeature({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n const subfeatures = getSubparts(feature, config)\n layOutSubfeatures({\n layout: subLayout,\n subfeatures,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n return subLayout\n}\n\nexport default ProcessedTranscript\n","import React from 'react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { observer } from 'mobx-react'\nimport { Feature } from '@jbrowse/core/util/simpleFeature'\nimport { SceneGraph } from '@jbrowse/core/util/layouts'\nimport {\n chooseGlyphComponent,\n ExtraGlyphValidator,\n layOut,\n layOutFeature,\n} from './util'\n\nconst Subfeatures = observer(function Subfeatures(props: {\n feature: Feature\n featureLayout: SceneGraph\n selected?: boolean\n}) {\n const { feature, featureLayout, selected } = props\n\n return feature.get('subfeatures')?.map(subfeature => {\n const subfeatureId = String(subfeature.id())\n const subfeatureLayout = featureLayout.getSubRecord(subfeatureId)\n if (!subfeatureLayout) {\n return null\n }\n const { GlyphComponent } = subfeatureLayout.data || {}\n return (\n <GlyphComponent\n key={`glyph-${subfeatureId}`}\n {...props}\n feature={subfeature}\n featureLayout={subfeatureLayout}\n selected={selected}\n />\n )\n })\n})\n\n// @ts-expect-error\nSubfeatures.layOut = ({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n}: {\n layout: SceneGraph\n feature: Feature\n bpPerPx: number\n reversed: boolean\n config: AnyConfigurationModel\n extraGlyphs: ExtraGlyphValidator[]\n}) => {\n const subLayout = layOutFeature({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n const displayMode = readConfObject(config, 'displayMode')\n if (displayMode !== 'reducedRepresentation') {\n let topOffset = 0\n feature.get('subfeatures')?.forEach(subfeature => {\n const SubfeatureGlyphComponent = chooseGlyphComponent(\n subfeature,\n extraGlyphs,\n )\n const subfeatureHeight = readConfObject(config, 'height', {\n feature: subfeature,\n }) as number\n\n const subSubLayout = (SubfeatureGlyphComponent.layOut || layOut)({\n layout: subLayout,\n feature: subfeature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n subSubLayout.move(0, topOffset)\n topOffset +=\n displayMode === 'collapse'\n ? 0\n : (displayMode === 'compact'\n ? subfeatureHeight / 3\n : subfeatureHeight) + 2\n })\n }\n return subLayout\n}\n\nexport default Subfeatures\n","import React from 'react'\nimport {\n readConfObject,\n AnyConfigurationModel,\n} from '@jbrowse/core/configuration'\nimport SceneGraph from '@jbrowse/core/util/layouts/SceneGraph'\nimport { Feature, Region } from '@jbrowse/core/util'\n\n// locals\nimport Box from './Box'\nimport ProcessedTranscript from './ProcessedTranscript'\nimport Segments from './Segments'\nimport Subfeatures from './Subfeatures'\n\nexport interface Glyph\n extends React.FC<{\n colorByCDS: boolean\n feature: Feature\n featureLayout: SceneGraph\n selected?: boolean\n config: AnyConfigurationModel\n region: Region\n bpPerPx: number\n topLevel?: boolean\n [key: string]: unknown\n }> {\n layOut?: (arg: FeatureLayOutArgs) => SceneGraph\n}\n\ntype LayoutRecord = [number, number, number, number]\n\nexport interface DisplayModel {\n getFeatureByID?: (arg0: string, arg1: string) => LayoutRecord\n getFeatureOverlapping?: (\n blockKey: string,\n bp: number,\n y: number,\n ) => string | undefined\n selectedFeatureId?: string\n featureIdUnderMouse?: string\n contextMenuFeature?: Feature\n}\n\nexport interface ExtraGlyphValidator {\n glyph: Glyph\n validator: (feature: Feature) => boolean\n}\n\nexport function chooseGlyphComponent(\n feature: Feature,\n extraGlyphs?: ExtraGlyphValidator[],\n): Glyph {\n const type = feature.get('type')\n const subfeatures = feature.get('subfeatures')\n\n if (subfeatures?.length && type !== 'CDS') {\n const hasSubSub = subfeatures.find(sub => !!sub.get('subfeatures'))\n if (\n ['mRNA', 'transcript', 'primary_transcript'].includes(type) &&\n subfeatures.some(f => f.get('type') === 'CDS')\n ) {\n return ProcessedTranscript\n }\n if (!feature.parent() && hasSubSub) {\n // only do sub-sub on parent level features like gene\n return Subfeatures\n }\n return Segments\n }\n\n return extraGlyphs?.find(f => f.validator(feature))?.glyph || Box\n}\n\ninterface BaseLayOutArgs {\n layout: SceneGraph\n bpPerPx: number\n reversed?: boolean\n config: AnyConfigurationModel\n}\n\ninterface FeatureLayOutArgs extends BaseLayOutArgs {\n feature: Feature\n extraGlyphs?: ExtraGlyphValidator[]\n}\n\ninterface SubfeatureLayOutArgs extends BaseLayOutArgs {\n subfeatures: Feature[]\n extraGlyphs?: ExtraGlyphValidator[]\n}\n\nexport function layOut({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n}: FeatureLayOutArgs): SceneGraph {\n const displayMode = readConfObject(config, 'displayMode')\n const subLayout = layOutFeature({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n if (displayMode !== 'reducedRepresentation') {\n layOutSubfeatures({\n layout: subLayout,\n subfeatures: feature.get('subfeatures') || [],\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n }\n return subLayout\n}\n\nexport function layOutFeature(args: FeatureLayOutArgs) {\n const { layout, feature, bpPerPx, reversed, config, extraGlyphs } = args\n const displayMode = readConfObject(config, 'displayMode') as string\n const GlyphComponent =\n displayMode === 'reducedRepresentation'\n ? Box\n : chooseGlyphComponent(feature, extraGlyphs)\n const parentFeature = feature.parent()\n let x = 0\n if (parentFeature) {\n x =\n (reversed\n ? parentFeature.get('end') - feature.get('end')\n : feature.get('start') - parentFeature.get('start')) / bpPerPx\n }\n const height = readConfObject(config, 'height', { feature }) as number\n const width = (feature.get('end') - feature.get('start')) / bpPerPx\n const layoutParent = layout.parent\n const top = layoutParent ? layoutParent.top : 0\n return layout.addChild(\n String(feature.id()),\n x,\n displayMode === 'collapse' ? 0 : top,\n Math.max(width, 1), // has to be at least one to register in the layout\n displayMode === 'compact' ? height / 2 : height,\n { GlyphComponent },\n )\n}\n\nexport function layOutSubfeatures(args: SubfeatureLayOutArgs) {\n const { layout, subfeatures, bpPerPx, reversed, config, extraGlyphs } = args\n subfeatures.forEach(feature => {\n ;(chooseGlyphComponent(feature, extraGlyphs).layOut || layOut)({\n layout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n })\n}\n\nexport function isUTR(feature: Feature) {\n return /(\\bUTR|_UTR|untranslated[_\\s]region)\\b/.test(\n feature.get('type') || '',\n )\n}\n","import React, { useEffect, useRef, useState, useCallback } from 'react'\nimport { observer } from 'mobx-react'\nimport {\n AnyConfigurationModel,\n readConfObject,\n} from '@jbrowse/core/configuration'\nimport { bpToPx, measureText, Region, Feature } from '@jbrowse/core/util'\nimport { BaseLayout, SceneGraph } from '@jbrowse/core/util/layouts'\n\n// locals\nimport FeatureGlyph from './FeatureGlyph'\nimport SvgOverlay from './SvgOverlay'\nimport {\n chooseGlyphComponent,\n layOut,\n ExtraGlyphValidator,\n DisplayModel,\n} from './util'\n\n// used to make features have a little padding for their labels\nconst xPadding = 3\nconst yPadding = 5\n\n// used so that user can click-away-from-feature below the laid out features\n// (issue #1248)\nconst svgHeightPadding = 100\n\nfunction RenderedFeatureGlyph(props: {\n feature: Feature\n bpPerPx: number\n region: Region\n config: AnyConfigurationModel\n colorByCDS: boolean\n layout: BaseLayout<unknown>\n extraGlyphs?: ExtraGlyphValidator[]\n displayMode: string\n exportSVG?: unknown\n displayModel?: DisplayModel\n detectRerender?: () => void\n viewParams: {\n start: number\n end: number\n offsetPx: number\n offsetPx1: number\n }\n [key: string]: unknown\n}) {\n const {\n feature,\n detectRerender,\n bpPerPx,\n region,\n config,\n displayMode,\n layout,\n extraGlyphs,\n } = props\n\n // used for unit testing, difficult to mock out so it is in actual source code\n detectRerender?.()\n\n const { reversed } = region\n const start = feature.get(reversed ? 'end' : 'start')\n const startPx = bpToPx(start, region, bpPerPx)\n const labelAllowed = displayMode !== 'collapsed'\n\n const rootLayout = new SceneGraph('root', 0, 0, 0, 0)\n const GlyphComponent = chooseGlyphComponent(feature, extraGlyphs)\n const featureLayout = (GlyphComponent.layOut || layOut)({\n layout: rootLayout,\n feature,\n bpPerPx,\n reversed,\n config,\n extraGlyphs,\n })\n let shouldShowName = false\n let shouldShowDescription = false\n let name = ''\n let description = ''\n let fontHeight = 0\n let expansion = 0\n if (labelAllowed) {\n const showLabels = readConfObject(config, 'showLabels')\n const showDescriptions = readConfObject(config, 'showDescriptions')\n fontHeight = readConfObject(config, ['labels', 'fontSize'], { feature })\n expansion = readConfObject(config, 'maxFeatureGlyphExpansion') || 0\n name = String(readConfObject(config, ['labels', 'name'], { feature }) || '')\n shouldShowName = /\\S/.test(name) && showLabels\n\n const getWidth = (text: string) => {\n const glyphWidth = rootLayout.width + expansion\n const textWidth = measureText(text, fontHeight)\n return Math.round(Math.min(textWidth, glyphWidth))\n }\n\n description = String(\n readConfObject(config, ['labels', 'description'], { feature }) || '',\n )\n shouldShowDescription = /\\S/.test(description) && showDescriptions\n\n if (shouldShowName) {\n rootLayout.addChild(\n 'nameLabel',\n 0,\n featureLayout.bottom,\n getWidth(name),\n fontHeight,\n )\n }\n\n if (shouldShowDescription) {\n const aboveLayout = shouldShowName\n ? rootLayout.getSubRecord('nameLabel')\n : featureLayout\n if (!aboveLayout) {\n throw new Error('failed to layout nameLabel')\n }\n\n rootLayout.addChild(\n 'descriptionLabel',\n 0,\n aboveLayout.bottom,\n getWidth(description),\n fontHeight,\n )\n }\n }\n\n const topPx = layout.addRect(\n feature.id(),\n feature.get('start'),\n feature.get('start') + rootLayout.width * bpPerPx + xPadding * bpPerPx,\n rootLayout.height + yPadding,\n )\n if (topPx === null) {\n return null\n }\n rootLayout.move(startPx, topPx)\n\n return (\n <FeatureGlyph\n rootLayout={rootLayout}\n name={name}\n shouldShowName={shouldShowName}\n description={description}\n shouldShowDescription={shouldShowDescription}\n fontHeight={fontHeight}\n allowedWidthExpansion={expansion}\n reversed={region.reversed}\n topLevel={true}\n {...props}\n />\n )\n}\n\nconst RenderedFeatures = observer(function RenderedFeatures(props: {\n features?: Map<string, Feature>\n isFeatureDisplayed?: (f: Feature) => boolean\n bpPerPx: number\n config: AnyConfigurationModel\n displayMode: string\n colorByCDS: boolean\n displayModel?: DisplayModel\n region: Region\n exportSVG?: unknown\n extraGlyphs?: ExtraGlyphValidator[]\n layout: BaseLayout<unknown>\n viewParams: {\n start: number\n end: number\n offsetPx: number\n offsetPx1: number\n }\n [key: string]: unknown\n}) {\n const { features = new Map(), isFeatureDisplayed } = props\n return (\n <>\n {[...features.values()]\n .filter(feature =>\n isFeatureDisplayed ? isFeatureDisplayed(feature) : true,\n )\n .map(feature => (\n <RenderedFeatureGlyph\n key={feature.id()}\n feature={feature}\n {...props}\n />\n ))}\n </>\n )\n})\n\nconst SvgFeatureRendering = observer(function SvgFeatureRendering(props: {\n layout: BaseLayout<unknown>\n blockKey: string\n regions: Region[]\n bpPerPx: number\n detectRerender?: () => void\n config: AnyConfigurationModel\n colorByCDS: boolean\n features: Map<string, Feature>\n displayModel?: DisplayModel\n exportSVG?: boolean\n viewParams: {\n start: number\n end: number\n offsetPx: number\n offsetPx1: number\n }\n featureDisplayHandler?: (f: Feature) => boolean\n extraGlyphs?: ExtraGlyphValidator[]\n onMouseOut?: React.MouseEventHandler\n onMouseDown?: React.MouseEventHandler\n onMouseLeave?: React.MouseEventHandler\n onMouseEnter?: React.MouseEventHandler\n onMouseOver?: React.MouseEventHandler\n onMouseMove?: (event: React.MouseEvent, featureId?: string) => void\n onMouseUp?: React.MouseEventHandler\n onClick?: React.MouseEventHandler\n}) {\n const {\n layout,\n blockKey,\n regions = [],\n bpPerPx,\n config,\n displayModel = {},\n exportSVG,\n featureDisplayHandler,\n onMouseOut,\n onMouseDown,\n onMouseLeave,\n onMouseEnter,\n onMouseOver,\n onMouseMove,\n onMouseUp,\n onClick,\n } = props\n\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n const displayMode = readConfObject(config, 'displayMode') as string\n const maxConfHeight = readConfObject(config, 'maxHeight') as number\n\n const ref = useRef<SVGSVGElement>(null)\n const [mouseIsDown, setMouseIsDown] = useState(false)\n const [height, setHeight] = useState(maxConfHeight)\n const [movedDuringLastMouseDown, setMovedDuringLastMouseDown] =\n useState(false)\n\n const mouseDown = useCallback(\n (event: React.MouseEvent) => {\n setMouseIsDown(true)\n setMovedDuringLastMouseDown(false)\n return onMouseDown?.(event)\n },\n [onMouseDown],\n )\n\n const mouseUp = useCallback(\n (event: React.MouseEvent) => {\n setMouseIsDown(false)\n return onMouseUp?.(event)\n },\n [onMouseUp],\n )\n\n const mouseMove = useCallback(\n (event: React.MouseEvent) => {\n if (!ref.current) {\n return\n }\n if (mouseIsDown) {\n setMovedDuringLastMouseDown(true)\n }\n const { left, top } = ref.current.getBoundingClientRect()\n const offsetX = event.clientX - left\n const offsetY = event.clientY - top\n const px = region.reversed ? width - offsetX : offsetX\n const clientBp = region.start + bpPerPx * px\n\n const featureIdCurrentlyUnderMouse = displayModel.getFeatureOverlapping?.(\n blockKey,\n clientBp,\n offsetY,\n )\n\n if (onMouseMove) {\n onMouseMove(event, featureIdCurrentlyUnderMouse)\n }\n },\n [\n blockKey,\n bpPerPx,\n mouseIsDown,\n onMouseMove,\n region.reversed,\n region.start,\n displayModel,\n width,\n ],\n )\n\n const click = useCallback(\n (event: React.MouseEvent) => {\n // don't select a feature if we are clicking and dragging\n if (movedDuringLastMouseDown) {\n return\n }\n onClick?.(event)\n },\n [movedDuringLastMouseDown, onClick],\n )\n\n useEffect(() => {\n setHeight(layout.getTotalHeight())\n }, [layout])\n\n return exportSVG ? (\n <RenderedFeatures\n displayMode={displayMode}\n isFeatureDisplayed={featureDisplayHandler}\n region={region}\n {...props}\n />\n ) : (\n <svg\n ref={ref}\n data-testid=\"svgfeatures\"\n width={width}\n height={height + svgHeightPadding}\n style={{\n // use block because svg by default is inline, which adds a margin\n display: 'block',\n }}\n onMouseDown={mouseDown}\n onMouseUp={mouseUp}\n onMouseEnter={onMouseEnter}\n onMouseLeave={onMouseLeave}\n onMouseOver={onMouseOver}\n onMouseOut={onMouseOut}\n onMouseMove={mouseMove}\n onClick={click}\n >\n <RenderedFeatures\n displayMode={displayMode}\n region={region}\n movedDuringLastMouseDown={movedDuringLastMouseDown}\n isFeatureDisplayed={featureDisplayHandler}\n {...props}\n />\n\n <SvgOverlay\n {...props}\n region={region}\n movedDuringLastMouseDown={movedDuringLastMouseDown}\n />\n </svg>\n )\n})\n\nexport default SvgFeatureRendering\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { types } from 'mobx-state-tree'\n\n/**\n * #config SvgFeatureRenderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst SvgFeatureRenderer = ConfigurationSchema(\n 'SvgFeatureRenderer',\n {\n /**\n * #slot\n */\n color1: {\n type: 'color',\n description: 'the main color of each feature',\n defaultValue: 'goldenrod',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n color2: {\n type: 'color',\n description:\n 'the secondary color of each feature, used for connecting lines, etc',\n defaultValue: '#f0f',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n color3: {\n type: 'color',\n description:\n 'the tertiary color of each feature, often used for contrasting fills, like on UTRs',\n defaultValue: '#357089',\n contextVariable: ['feature'],\n },\n\n /**\n * #slot\n */\n outline: {\n type: 'color',\n description: 'the outline for features',\n defaultValue: '',\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n height: {\n type: 'number',\n description: 'height in pixels of the main body of each feature',\n defaultValue: 10,\n contextVariable: ['feature'],\n },\n /**\n * #slot\n */\n showLabels: {\n type: 'boolean',\n defaultValue: true,\n },\n\n /**\n * #slot\n */\n showDescriptions: {\n type: 'boolean',\n defaultValue: true,\n },\n\n labels: ConfigurationSchema('SvgFeatureLabels', {\n /**\n * #slot labels.name\n */\n name: {\n type: 'string',\n description:\n 'the primary name of the feature to show, if space is available',\n defaultValue: `jexl:get(feature,'name') || get(feature,'id')`,\n contextVariable: ['feature'],\n },\n /**\n * #slot labels.nameColor\n */\n nameColor: {\n type: 'color',\n description: 'the color of the name label, if shown',\n defaultValue: '#f0f',\n contextVariable: ['feature'],\n },\n /**\n * #slot labels.description\n */\n description: {\n type: 'string',\n description: 'the text description to show, if space is available',\n defaultValue: `jexl:get(feature,'note') || get(feature,'description')`,\n contextVariable: ['feature'],\n },\n /**\n * #slot labels.descriptionColor\n */\n descriptionColor: {\n type: 'color',\n description: 'the color of the description, if shown',\n defaultValue: 'blue',\n contextVariable: ['feature'],\n },\n\n /**\n * #slot labels.fontSize\n */\n fontSize: {\n type: 'number',\n description:\n 'height in pixels of the text to use for names and descriptions',\n defaultValue: 12,\n contextVariable: ['feature'],\n },\n }),\n\n /**\n * #slot\n */\n displayMode: {\n type: 'stringEnum',\n model: types.enumeration('displayMode', [\n 'normal',\n 'compact',\n 'reducedRepresentation',\n 'collapse',\n ]),\n description: 'Alternative display modes',\n defaultValue: 'normal',\n },\n\n /**\n * #slot\n */\n maxFeatureGlyphExpansion: {\n type: 'number',\n description:\n \"maximum number of pixels on each side of a feature's bounding coordinates that a glyph is allowed to use\",\n defaultValue: 500,\n },\n\n /**\n * #slot\n */\n maxHeight: {\n type: 'integer',\n description: 'the maximum height to be used in a svg rendering',\n defaultValue: 1200,\n },\n\n /**\n * #slot\n */\n subParts: {\n type: 'string',\n description: 'subparts for a glyph',\n defaultValue: 'CDS,UTR,five_prime_UTR,three_prime_UTR',\n },\n\n /**\n * #slot\n */\n impliedUTRs: {\n type: 'boolean',\n description: 'imply UTR from the exon and CDS differences',\n defaultValue: false,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default SvgFeatureRenderer\n","import BoxRendererType from '@jbrowse/core/pluggableElementTypes/renderers/BoxRendererType'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport {\n configSchema as svgFeatureRendererConfigSchema,\n ReactComponent as SvgFeatureRendererReactComponent,\n} from './SvgFeatureRenderer'\n\nclass SvgFeatureRenderer extends BoxRendererType {\n supportsSVG = true\n}\n\nexport default class SVGPlugin extends Plugin {\n name = 'SVGPlugin'\n\n install(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new SvgFeatureRenderer({\n name: 'SvgFeatureRenderer',\n ReactComponent: SvgFeatureRendererReactComponent,\n configSchema: svgFeatureRendererConfigSchema,\n pluginManager,\n }),\n )\n }\n}\n\nexport {\n configSchema as svgFeatureRendererConfigSchema,\n ReactComponent as SvgFeatureRendererReactComponent,\n} from './SvgFeatureRenderer'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config GCContentAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst GCContentAdapterF = (_pluginManager: PluginManager) => {\n return ConfigurationSchema(\n 'GCContentAdapter',\n {\n /**\n * #slot\n */\n sequenceAdapter: {\n type: 'frozen',\n defaultValue: null,\n },\n /**\n * #slot\n */\n windowSize: {\n type: 'number',\n defaultValue: 100,\n },\n /**\n * #slot\n */\n windowDelta: {\n type: 'number',\n defaultValue: 100,\n },\n },\n { explicitlyTyped: true },\n )\n}\n\nexport default GCContentAdapterF\n","import {\n getConf,\n AnyConfigurationSchemaType,\n} from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { getSession } from '@jbrowse/core/util'\nimport { linearWiggleDisplayModelFactory } from '@jbrowse/plugin-wiggle'\nimport { types } from 'mobx-state-tree'\nimport { lazy } from 'react'\n\nconst EditGCContentParamsDialog = lazy(\n () => import('./components/EditGCContentParams'),\n)\n\n/**\n * #stateModel SharedGCContentModel\n * #category display\n * extends\n * - [LinearWiggleDisplay](../linearwiggledisplay)\n */\nexport default function SharedModelF(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'SharedGCContentModel',\n linearWiggleDisplayModelFactory(pluginManager, configSchema),\n types.model({\n /**\n * #property\n */\n windowSize: types.maybe(types.number),\n /**\n * #property\n */\n windowDelta: types.maybe(types.number),\n }),\n )\n .actions(self => ({\n setGCContentParams({\n windowSize,\n windowDelta,\n }: {\n windowSize: number\n windowDelta: number\n }) {\n self.windowSize = windowSize\n self.windowDelta = windowDelta\n },\n }))\n .views(self => ({\n get windowSizeSetting() {\n return self.windowSize ?? getConf(self, 'windowSize')\n },\n get windowDeltaSetting() {\n return self.windowDelta ?? getConf(self, 'windowDelta')\n },\n }))\n .views(self => {\n const {\n trackMenuItems: superTrackMenuItems,\n renderProps: superRenderProps,\n } = self\n return {\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Change GC parameters',\n onClick: () => {\n getSession(self).queueDialog(handleClose => [\n EditGCContentParamsDialog,\n { model: self, handleClose },\n ])\n },\n },\n ]\n },\n /**\n * #method\n * retrieves the sequence adapter from parent track, and puts it as a\n * subadapter on a GCContentAdapter\n */\n renderProps() {\n const sequenceAdapter = getConf(self.parentTrack, 'adapter')\n return {\n ...superRenderProps(),\n adapterConfig: {\n type: 'GCContentAdapter',\n sequenceAdapter,\n windowSize: self.windowSizeSetting,\n windowDelta: self.windowDeltaSetting,\n },\n }\n },\n }\n })\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport GCContentAdapterF from './GCContentAdapter'\nimport GCContentTrackF from './GCContentTrack'\nimport LinearGCContentDisplayF from './LinearGCContentDisplay'\n\nexport default class GCContentPlugin extends Plugin {\n name = 'GCContentPlugin'\n\n install(pluginManager: PluginManager) {\n GCContentAdapterF(pluginManager)\n GCContentTrackF(pluginManager)\n LinearGCContentDisplayF(pluginManager)\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport configSchemaF from './configSchema'\n\nexport default function GCContentTrackF(pm: PluginManager) {\n pm.addTrackType(() => {\n const configSchema = configSchemaF(pm)\n return new TrackType({\n name: 'GCContentTrack',\n displayName: 'GCContent track',\n configSchema,\n stateModel: createBaseTrackModel(pm, 'GCContentTrack', configSchema),\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport AdapterType from '@jbrowse/core/pluggableElementTypes/AdapterType'\n\nimport configSchemaF from './configSchema'\n\nexport default function GCContentAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'GCContentAdapter',\n displayName: 'GC content adapter',\n adapterMetadata: {\n hiddenFromGUI: true,\n },\n configSchema: configSchemaF(pluginManager),\n getAdapterClass: () =>\n import('./GCContentAdapter').then(r => r.default),\n }),\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config GCContentTrack\n * used for having a gc content track outside of the \"reference sequence display\"\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'GCContentTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n\nexport default configSchema\n","import { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { LinearWiggleDisplayReactComponent } from '@jbrowse/plugin-wiggle'\n\nimport configSchemaFactory1 from './config1'\nimport configSchemaFactory2 from './config2'\nimport stateModelF1 from './stateModel1'\nimport stateModelF2 from './stateModel2'\n\nexport default function LinearGCContentDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory1(pluginManager)\n const stateModel = stateModelF1(pluginManager, configSchema)\n return new DisplayType({\n name: 'LinearGCContentDisplay',\n configSchema,\n stateModel,\n displayName: 'GC content display',\n trackType: 'ReferenceSequenceTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: LinearWiggleDisplayReactComponent,\n })\n })\n\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory2(pluginManager)\n const stateModel = stateModelF2(pluginManager, configSchema)\n return new DisplayType({\n name: 'LinearGCContentTrackDisplay',\n configSchema,\n stateModel,\n displayName: 'GC content display',\n trackType: 'GCContentTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: LinearWiggleDisplayReactComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearGCContentDisplay\n * #category display\n * extends LinearWiggleDisplay\n */\nexport default function LinearGCContentDisplay(pluginManager: PluginManager) {\n return ConfigurationSchema(\n 'LinearGCContentDisplay',\n {\n windowSize: {\n type: 'number',\n defaultValue: 100,\n },\n windowDelta: {\n type: 'number',\n defaultValue: 100,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: pluginManager.getDisplayType('LinearWiggleDisplay')!\n .configSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { types } from 'mobx-state-tree'\n// locals\nimport SharedModelF from './shared'\n\n/**\n * #stateModel LinearGCContentDisplay\n * #category display\n * base model `SharedGCContentModel`\n */\nexport default function stateModelF(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types.compose(\n 'LinearGCContentDisplay',\n SharedModelF(pluginManager, configSchema),\n types.model({\n type: types.literal('LinearGCContentDisplay'),\n }),\n )\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearGCContentTrackDisplay\n * #category display\n * extends LinearWiggleDisplay, used specifically for GCContentTrack\n */\nexport default function LinearGCContentTrackDisplayF(\n pluginManager: PluginManager,\n) {\n return ConfigurationSchema(\n 'LinearGCContentTrackDisplay',\n {\n windowSize: {\n type: 'number',\n defaultValue: 100,\n },\n windowDelta: {\n type: 'number',\n defaultValue: 100,\n },\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: pluginManager.getDisplayType('LinearWiggleDisplay')!\n .configSchema,\n explicitlyTyped: true,\n },\n )\n}\n","import { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { types } from 'mobx-state-tree'\n// locals\nimport SharedModelF from './shared'\n\n/**\n * #stateModel LinearGCContentTrackDisplay\n * #category display\n *\n * used on GCContentTrack, separately from the display type on the\n * ReferenceSequenceTrack\n *\n * extends\n * - [SharedGCContentModel](../sharedgccontentmodel)\n */\nexport default function stateModelF(\n pluginManager: PluginManager,\n configSchema: AnyConfigurationSchemaType,\n) {\n return types.compose(\n 'LinearGCContentTrackDisplay',\n SharedModelF(pluginManager, configSchema),\n types.model({\n type: types.literal('LinearGCContentTrackDisplay'),\n }),\n )\n}\n","import React from 'react'\nimport { types } from 'mobx-state-tree'\n\n/** utility function for assembling the MST model of a column data type */\nexport default function MakeSpreadsheetColumnType(\n name: string,\n {\n DataCellReactComponent = null,\n FilterModelType = null,\n compare,\n displayName = undefined,\n categoryName = undefined,\n }: {\n compare?: any\n DataCellReactComponent?: React.FC<any> | null\n FilterModelType?: any\n displayName?: string\n categoryName?: string\n },\n) {\n return types\n .model(`ColumnDataType${name}`, {\n type: types.literal(name),\n })\n .volatile(() => ({\n DataCellReactComponent,\n FilterModelType: FilterModelType,\n displayName: displayName || name,\n categoryName,\n }))\n .views(() => ({\n compare,\n get hasFilter() {\n return !!FilterModelType\n },\n }))\n}\n","import React from 'react'\nimport {\n IconButton,\n TextField,\n MenuItem,\n InputAdornment,\n Select,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport { observer } from 'mobx-react'\nimport { types, getParent, getPropertyMembers } from 'mobx-state-tree'\n\n// jbrowse imports\nimport {\n getPropertyType,\n getEnumerationValues,\n getSubType,\n} from '@jbrowse/core/util/mst-reflection'\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\nimport {\n doesIntersect2,\n isContainedWithin,\n compareLocs,\n getSession,\n parseLocString,\n} from '@jbrowse/core/util'\n\n// icons\nimport ClearIcon from '@mui/icons-material/Clear'\n\n// locals\nimport MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\n\ntype LGV = LinearGenomeViewModel\n\nconst useStyles = makeStyles()({\n textFilterControlAdornment: { marginRight: '-18px' },\n textFilterControl: {\n '& .MuiInput-formControl': {\n marginTop: 8,\n },\n '& .MuiInputLabel-formControl': {\n top: '-7px',\n '&.MuiInputLabel-shrink': {\n top: '-3px',\n },\n },\n },\n})\n\n// React component for the column filter control\nconst FilterReactComponent = observer(function ({\n filterModel,\n}: {\n filterModel: any\n}) {\n const { classes } = useStyles()\n const operationChoices = getEnumerationValues(\n getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')),\n )\n return (\n <>\n <Select\n value={filterModel.operation}\n onChange={event => filterModel.setOperation(String(event.target.value))}\n >\n {operationChoices.map(name => (\n <MenuItem key={name} value={name}>\n {name}\n </MenuItem>\n ))}\n </Select>{' '}\n <TextField\n label=\"range\"\n placeholder=\"chr1:100-200\"\n error={filterModel.locStringIsInvalid}\n value={filterModel.locString}\n onChange={evt => filterModel.setLocString(evt.target.value)}\n className={classes.textFilterControl}\n InputProps={{\n endAdornment: (\n <InputAdornment\n className={classes.textFilterControlAdornment}\n position=\"end\"\n >\n <IconButton\n aria-label=\"clear filter\"\n onClick={() => filterModel.setLocString('')}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </>\n )\n})\n\nconst OPERATIONS = [\n 'overlaps with',\n 'contained within',\n 'fully contains',\n 'does not overlap',\n 'not contained within',\n 'does not contain',\n] as const\n\ninterface Loc {\n start: number\n end: number\n refName: string\n}\n\n// NOTE: assembly names, if present, are ignored in all of these predicates\nconst OPERATION_PREDICATES = {\n 'overlaps with': (cellLocation, specifiedLocation) => {\n return (\n cellLocation.refName === specifiedLocation.refName &&\n doesIntersect2(\n cellLocation.start,\n cellLocation.end,\n specifiedLocation.start,\n specifiedLocation.end,\n )\n )\n },\n 'contained within': (cellLocation, specifiedLocation) => {\n return (\n cellLocation.refName === specifiedLocation.refName &&\n isContainedWithin(\n cellLocation.start,\n cellLocation.end,\n specifiedLocation.start,\n specifiedLocation.end,\n )\n )\n },\n 'fully contains': (cellLocation, specifiedLocation) => {\n return (\n cellLocation.refName === specifiedLocation.refName &&\n isContainedWithin(\n specifiedLocation.start,\n specifiedLocation.end,\n cellLocation.start,\n cellLocation.end,\n )\n )\n },\n} as Record<string, (a: Loc, b: Loc) => boolean>\n\nOPERATION_PREDICATES['does not overlap'] = (\n cellLocation,\n specifiedLocation,\n) => {\n return !OPERATION_PREDICATES['overlaps with']!(\n cellLocation,\n specifiedLocation,\n )\n}\nOPERATION_PREDICATES['not contained within'] = (\n cellLocation,\n specifiedLocation,\n) => {\n return !OPERATION_PREDICATES['contained within']!(\n cellLocation,\n specifiedLocation,\n )\n}\nOPERATION_PREDICATES['does not contain'] = (\n cellLocation,\n specifiedLocation,\n) => {\n return !OPERATION_PREDICATES['fully contains']!(\n cellLocation,\n specifiedLocation,\n )\n}\n\n// MST model for the column filter control\nconst FilterModelType = types\n .model('ColumnLocStringFilter', {\n type: types.literal('LocString'),\n columnNumber: types.integer,\n locString: '',\n operation: types.optional(types.string, OPERATIONS[0]),\n })\n .views(self => ({\n get locStringIsInvalid() {\n if (self.locString) {\n const parsed = this.parsedLocString\n return (\n !parsed ||\n parsed.refName === '' ||\n typeof parsed.start !== 'number' ||\n typeof parsed.end !== 'number' ||\n parsed.start > parsed.end\n )\n }\n return false\n },\n get parsedLocString() {\n const session = getSession(self)\n\n const model = getParent<any>(self, 3).spreadsheet\n const { assemblyName } = model\n try {\n return parseLocString(self.locString, refName =>\n session.assemblyManager.isValidRefName(refName, assemblyName),\n )\n } catch (e) {\n return undefined\n }\n },\n }))\n .views(self => ({\n // returns a function that tests the given row\n get predicate() {\n const {\n locString,\n locStringIsInvalid,\n parsedLocString,\n operation,\n columnNumber,\n } = self // avoid closing over self\n if (!locString || locStringIsInvalid || !parsedLocString) {\n return function alwaysTrue() {\n return true\n }\n }\n\n return function stringPredicate(_sheet: any, row: any) {\n const { cellsWithDerived: cells } = row\n const cell = cells[columnNumber]\n\n if (!cell?.text || !cell.extendedData) {\n return false\n }\n const parsedCellText = cell.extendedData\n if (!parsedCellText.refName) {\n return false\n }\n\n const predicate = OPERATION_PREDICATES[operation]\n if (!predicate) {\n throw new Error(`\"${operation}\" not implemented in location filter`)\n }\n\n return predicate(parsedCellText, parsedLocString as Loc)\n }\n },\n }))\n .actions(self => ({\n setLocString(s: string) {\n self.locString = s\n },\n setOperation(op: string) {\n self.operation = op\n },\n }))\n .volatile(() => ({ ReactComponent: FilterReactComponent }))\n\n// opens a new LGV at the location described in the locString in the cell text\n\nasync function locationLinkClick(\n spreadsheet: any,\n _columnNumber: number,\n\n cell: any,\n) {\n const session = getSession(spreadsheet)\n const { assemblyName } = spreadsheet\n\n const { id } = getParent<any>(spreadsheet)\n\n const newViewId = `${id}_${assemblyName}`\n let view = session.views.find(v => v.id === newViewId) as LGV | undefined\n if (!view) {\n view = session.addView('LinearGenomeView', {\n id: newViewId,\n }) as LGV\n }\n await view.navToLocString(cell.text, assemblyName)\n}\n\ntype DataCell = any\n\nconst DataCellReactComponent = observer(function ({\n cell,\n columnNumber,\n spreadsheet,\n}: DataCell) {\n return (\n <a\n onClick={async evt => {\n evt.preventDefault()\n const session = getSession(spreadsheet)\n try {\n await locationLinkClick(spreadsheet, columnNumber, cell)\n } catch (e) {\n console.error(e)\n session.notifyError(`${e}`, e)\n }\n }}\n title=\"open a new linear genome view here\"\n href=\"#\"\n >\n {cell.text}\n </a>\n )\n})\n\nconst LocStringColumnType = MakeSpreadsheetColumnType('LocString', {\n categoryName: 'Location',\n displayName: 'Full location',\n\n compare(cellA: { extendedData: any }, cellB: { extendedData: any }) {\n return compareLocs(cellA.extendedData, cellB.extendedData)\n },\n FilterModelType,\n DataCellReactComponent,\n})\n\nexport default LocStringColumnType\n","import React from 'react'\nimport {\n IconButton,\n TextField,\n MenuItem,\n InputAdornment,\n Select,\n} from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\nimport { types, getPropertyMembers } from 'mobx-state-tree'\nimport { observer } from 'mobx-react'\nimport {\n getPropertyType,\n getEnumerationValues,\n getSubType,\n} from '@jbrowse/core/util/mst-reflection'\n\n// icons\nimport ClearIcon from '@mui/icons-material/Clear'\n\nconst OPERATIONS = [\n 'equals',\n 'contains',\n 'does not contain',\n 'does not equal',\n 'starts with',\n 'ends with',\n]\n\n// NOTE: assembly names, if present, are ignored in all of these predicates\nconst OPERATION_PREDICATES = {\n contains: (textInCell, stringToFind) => {\n return textInCell.toLowerCase().includes(stringToFind)\n },\n equals: (textInCell, stringToFind) => {\n return textInCell.toLowerCase() === stringToFind\n },\n 'starts with': (textInCell, stringToFind) => {\n return textInCell.toLowerCase().startsWith(stringToFind)\n },\n 'ends with': (textInCell, stringToFind) => {\n const index = textInCell.toLowerCase().indexOf(stringToFind)\n if (index === -1) {\n return false\n }\n return index === textInCell.length - stringToFind.length\n },\n} as Record<string, (a: string, b: string) => boolean>\n\nOPERATION_PREDICATES['does not contain'] = (textInCell, stringToFind) => {\n return !OPERATION_PREDICATES.contains!(textInCell, stringToFind)\n}\nOPERATION_PREDICATES['does not equal'] = (textInCell, stringToFind) => {\n return !OPERATION_PREDICATES.equals!(textInCell, stringToFind)\n}\n\nconst useStyles = makeStyles()({\n textFilterControlAdornment: { marginRight: '-18px' },\n textFilterControl: {\n margin: 0,\n '& .MuiInput-formControl': {\n marginTop: 8,\n },\n '& .MuiInputLabel-formControl': {\n top: '-7px',\n '&.MuiInputLabel-shrink': {\n top: '-3px',\n },\n },\n },\n})\n\n// React component for the column filter control\nconst FilterReactComponent = observer(\n ({ filterModel }: { filterModel: any }) => {\n const { classes } = useStyles()\n const operationChoices = getEnumerationValues(\n getSubType(getPropertyType(getPropertyMembers(filterModel), 'operation')),\n )\n return (\n <>\n <Select\n value={filterModel.operation}\n onChange={event => {\n filterModel.setOperation(String(event.target.value))\n }}\n >\n {operationChoices.map(name => (\n <MenuItem key={name} value={name}>\n {name}\n </MenuItem>\n ))}\n </Select>{' '}\n <TextField\n label=\"text\"\n value={filterModel.stringToFind}\n onChange={evt => filterModel.setString(evt.target.value)}\n className={classes.textFilterControl}\n InputProps={{\n endAdornment: (\n <InputAdornment\n className={classes.textFilterControlAdornment}\n position=\"end\"\n >\n <IconButton\n aria-label=\"clear filter\"\n onClick={() => filterModel.setString('')}\n >\n <ClearIcon />\n </IconButton>\n </InputAdornment>\n ),\n }}\n />\n </>\n )\n },\n)\n\n// MST model for the column filter control\nconst ColumnTextFilter = types\n .model('ColumnTextFilter', {\n type: types.literal('Text'),\n columnNumber: types.integer,\n stringToFind: '',\n operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]!),\n })\n .views(self => ({\n // returns a function that tests the given row\n get predicate() {\n const { stringToFind, columnNumber, operation } = self // avoid closing over self\n if (!stringToFind) {\n return function alwaysTrue() {\n return true\n }\n }\n const s = stringToFind.toLowerCase() // case insensitive match\n\n return function stringPredicate(_sheet: any, row: any) {\n const { cellsWithDerived } = row\n const cell = cellsWithDerived[columnNumber]\n if (!cell?.text) {\n return false\n }\n const predicate = OPERATION_PREDICATES[operation]\n if (!predicate) {\n throw new Error(`\"${operation}\" not implemented in location filter`)\n }\n return predicate(cell.text, s)\n }\n },\n }))\n .actions(self => ({\n setString(s: string) {\n self.stringToFind = s\n },\n setOperation(op: string) {\n self.operation = op\n },\n }))\n .volatile(() => ({ ReactComponent: FilterReactComponent }))\n\nconst TextColumnType = MakeSpreadsheetColumnType('Text', {\n compare(cellA: { text: string }, cellB: { text: string }) {\n return cellA.text.localeCompare(cellB.text)\n },\n FilterModelType: ColumnTextFilter,\n})\n\nexport { TextColumnType as TextColumn, ColumnTextFilter as FilterModelType }\n","import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\nimport { FilterModelType as NumberFilterModel } from './Text'\nimport { types } from 'mobx-state-tree'\n\nconst FilterModelType = types.compose(\n NumberFilterModel,\n types.model({\n type: types.literal('LocRef'),\n }),\n)\n\nconst LocRef = MakeSpreadsheetColumnType('LocRef', {\n categoryName: 'Location',\n displayName: 'Reference seq',\n compare(cellA: { text: string }, cellB: { text: string }) {\n return cellA.text.localeCompare(cellB.text)\n },\n FilterModelType,\n})\n\nexport default LocRef\n","import React from 'react'\nimport { types } from 'mobx-state-tree'\nimport { observer } from 'mobx-react'\nimport { MenuItem, Select, TextField } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\nimport MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\n\nconst OPERATIONS = [\n 'equals',\n 'greater than',\n 'less than',\n 'between',\n 'not between',\n]\n\n// NOTE: assembly names, if present, are ignored in all of these predicates\nconst OPERATION_PREDICATES = {\n equals: (numberInCell, firstNumber) => {\n return numberInCell === firstNumber\n },\n 'greater than': (numberInCell, firstNumber) => {\n return numberInCell > firstNumber\n },\n 'less than': (numberInCell, firstNumber) => {\n return numberInCell < firstNumber\n },\n between: (numberInCell, firstNumber, secondNumber) => {\n return (\n numberInCell > firstNumber &&\n secondNumber !== undefined &&\n numberInCell < secondNumber\n )\n },\n} as Record<string, (arg0: number, a: number, b?: number) => boolean>\n\nOPERATION_PREDICATES['not between'] = (\n numberInCell,\n firstNumber,\n secondNumber,\n) => {\n return !OPERATION_PREDICATES.between!(numberInCell, firstNumber, secondNumber)\n}\n\nconst useStyles = makeStyles()({\n textFilterControlAdornment: { marginRight: '-18px' },\n textFilterControl: {\n '& .MuiInput-formControl': {\n marginTop: 8,\n },\n '& .MuiInputLabel-formControl': {\n top: '-7px',\n '&.MuiInputLabel-shrink': {\n top: '-3px',\n },\n },\n },\n})\n\n// React component for the column filter control\nconst FilterReactComponent = observer(\n ({ filterModel }: { filterModel: any }) => {\n const { classes } = useStyles()\n\n const operationChoices = OPERATIONS\n\n return (\n <>\n <Select\n value={filterModel.operation}\n onChange={e => filterModel.setOperation(String(e.target.value))}\n >\n {operationChoices.map(name => (\n <MenuItem key={name} value={name}>\n {name}\n </MenuItem>\n ))}\n </Select>{' '}\n <TextField\n label=\"number\"\n placeholder=\"123\"\n type=\"number\"\n error={filterModel.firstNumberIsInvalid}\n defaultValue={filterModel.firstNumber}\n onChange={evt => {\n filterModel.setFirstNumber(Number.parseFloat(evt.target.value))\n }}\n className={classes.textFilterControl}\n />\n {filterModel.operation !== 'between' &&\n filterModel.operation !== 'not between' ? null : (\n <>\n {' and '}\n <TextField\n label=\"number\"\n placeholder=\"456\"\n type=\"number\"\n error={filterModel.secondNumberIsInvalid}\n defaultValue={filterModel.secondNumber}\n onChange={evt =>\n filterModel.setSecondNumber(Number.parseFloat(evt.target.value))\n }\n className={classes.textFilterControl}\n />\n </>\n )}\n </>\n )\n },\n)\n\n// MST model for the column filter control\nconst FilterModelType = types\n .model('ColumnNumberFilter', {\n type: types.literal('Number'),\n columnNumber: types.integer,\n firstNumber: types.maybe(types.number),\n secondNumber: types.maybe(types.number),\n operation: types.optional(types.enumeration(OPERATIONS), OPERATIONS[0]!),\n })\n .views(self => ({\n // returns a function that tests the given row\n get predicate() {\n if (typeof self.firstNumber !== 'number') {\n return function alwaysTrue() {\n return true\n }\n }\n\n const { firstNumber, secondNumber, operation, columnNumber } = self // avoid closing over self\n\n return function stringPredicate(_sheet: any, row: any) {\n const { cellsWithDerived } = row\n const cell = cellsWithDerived[columnNumber]\n\n if (!cell?.text) {\n return false\n }\n\n const parsedCellText = Number.parseFloat(cell.text)\n if (typeof parsedCellText !== 'number') {\n return false\n }\n\n const predicate = OPERATION_PREDICATES[operation]\n if (!predicate) {\n throw new Error(`\"${operation}\" not implemented in location filter`)\n }\n\n return predicate(parsedCellText, firstNumber, secondNumber)\n }\n },\n }))\n .actions(self => ({\n setFirstNumber(n: number) {\n self.firstNumber =\n Number.isNaN(n) || typeof n !== 'number' ? undefined : n\n },\n setSecondNumber(n: number) {\n self.secondNumber =\n Number.isNaN(n) || typeof n !== 'number' ? undefined : n\n },\n setOperation(op: string) {\n self.operation = op\n },\n }))\n .volatile(() => ({ ReactComponent: FilterReactComponent }))\n\nconst NumberColumn = MakeSpreadsheetColumnType('Number', {\n compare(cellA: { text: string }, cellB: { text: string }) {\n return Number.parseFloat(cellA.text) - Number.parseFloat(cellB.text)\n },\n FilterModelType,\n})\n\nexport { NumberColumn, FilterModelType }\n","import LocString from './LocString'\nimport LocRef from './LocRef'\nimport LocStart from './LocStart'\nimport LocEnd from './LocEnd'\nimport { NumberColumn } from './Number'\nimport { TextColumn as Text } from './Text'\nimport { types, IAnyModelType } from 'mobx-state-tree'\n\nconst ColumnTypes = {\n Number: NumberColumn,\n Text,\n LocString,\n LocRef,\n LocStart,\n LocEnd,\n}\n\nconst allColumnTypes = Object.values(ColumnTypes)\nconst AnyColumnType = types.union(...allColumnTypes)\nconst AnyFilterModelType = types.union(\n ...allColumnTypes\n .map(columnType => {\n // just instantiate the blank types to get their filter model types\n const { FilterModelType } = columnType.create({\n // @ts-expect-error\n type: columnType.properties.type.value,\n })\n return FilterModelType as unknown as IAnyModelType | undefined\n })\n // some column types might not have filter machinery, filter those out\n .filter(t => !!t),\n)\n\nexport { ColumnTypes, AnyColumnType, AnyFilterModelType }\n","import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\nimport { types } from 'mobx-state-tree'\nimport { FilterModelType as NumberFilterModel } from './Number'\n\nconst FilterModelType = types.compose(\n NumberFilterModel,\n types.model({\n type: types.literal('LocStart'),\n }),\n)\n\nconst LocStart = MakeSpreadsheetColumnType('LocStart', {\n categoryName: 'Location',\n displayName: 'Start',\n compare(cellA: { text: string }, cellB: { text: string }) {\n return Number.parseFloat(cellA.text) - Number.parseFloat(cellB.text)\n },\n FilterModelType,\n})\n\nexport default LocStart\n","import MakeSpreadsheetColumnType from './MakeSpreadsheetColumnType'\nimport { FilterModelType as NumberFilterModel } from './Number'\nimport { types } from 'mobx-state-tree'\n\nconst FilterModelType = types.compose(\n NumberFilterModel,\n types.model({\n type: types.literal('LocEnd'),\n }),\n)\n\nconst LocEnd = MakeSpreadsheetColumnType('LocEnd', {\n categoryName: 'Location',\n displayName: 'End',\n compare(cellA: { text: string }, cellB: { text: string }) {\n return Number.parseFloat(cellA.text) - Number.parseFloat(cellB.text)\n },\n FilterModelType,\n})\n\nexport default LocEnd\n","import { types, getParent } from 'mobx-state-tree'\n\nconst CellModel = types.model('SpreadsheetCell', {\n text: types.string,\n extendedData: types.maybe(types.frozen()),\n})\n\nconst RowModel = types\n .model('SpreadsheetRow', {\n id: types.identifier,\n cells: types.array(CellModel),\n extendedData: types.maybe(types.frozen()),\n isSelected: false,\n })\n .actions(self => ({\n toggleSelect() {\n self.isSelected = !self.isSelected\n },\n unSelect() {\n self.isSelected = false\n },\n select() {\n self.isSelected = true\n },\n setExtendedData(data: unknown) {\n self.extendedData = data\n },\n }))\n .views(self => ({\n get cellsWithDerived() {\n const { columns } = getParent<any>(self, 3)\n let i = 0\n\n return columns.map((column: { isDerived: boolean; expr: any }) => {\n if (column.isDerived) {\n return column.expr.evalSync({\n row: self,\n })\n }\n return self.cells[i++]\n })\n },\n }))\n\nexport default RowModel\n","import RowModel from './Row'\nimport { types, getParent } from 'mobx-state-tree'\n\nconst StaticRowModel = types\n .model('StaticRowSet', {\n isLoaded: types.literal(true),\n rows: types.array(RowModel),\n })\n .views(self => ({\n get count() {\n return self.rows.length\n },\n\n get passingFiltersCount() {\n return this.sortedFilteredRows.length\n },\n\n get selectedCount() {\n return this.selectedRows.length\n },\n\n get selectedAndPassingFiltersCount() {\n return this.selectedFilteredRows.length\n },\n\n get sortedRows() {\n const parent = getParent<any>(self)\n return [...self.rows].sort(parent.rowSortingComparisonFunction)\n },\n\n get selectedRows() {\n return self.rows.filter(r => r.isSelected)\n },\n\n get selectedFilteredRows() {\n const sheet = getParent<any>(self)\n\n const view = getParent<any>(sheet)\n const { filterControls } = view\n return this.selectedRows.filter(row =>\n filterControls.rowPassesFilters(sheet, row),\n )\n },\n\n // the set of all rows that pass the filters, sorted\n get sortedFilteredRows() {\n const sheet = getParent<any>(self)\n\n const view = getParent<any>(sheet)\n const { filterControls } = view\n return self.rows\n .filter(row => filterControls.rowPassesFilters(sheet, row))\n .sort(sheet.rowSortingComparisonFunction)\n },\n }))\n .actions(self => ({\n unselectAll() {\n self.rows.forEach(row => {\n row.unSelect()\n })\n },\n }))\n\nexport default StaticRowModel\n","import { stringToJexlExpression } from '@jbrowse/core/util/jexlStrings'\nimport { getSession, getEnv } from '@jbrowse/core/util'\nimport { autorun } from 'mobx'\nimport {\n addDisposer,\n types,\n getParent,\n SnapshotIn,\n Instance,\n} from 'mobx-state-tree'\n\n// locals\nimport { ColumnTypes, AnyColumnType } from './ColumnDataTypes'\nimport StaticRowSetModel from './StaticRowSet'\nimport type RowModel from './Row'\n\ntype Row = Instance<typeof RowModel>\n\nconst ColumnDefinition = types\n .model('ColumnDefinition', {\n name: types.maybe(types.string),\n dataType: types.optional(AnyColumnType, () => ({\n type: 'Text',\n })),\n // set to true if column is derived from other columns\n // if the column is derived, each cell will have a\n // `derivationFunction` that is called to get its value\n isDerived: false,\n // if this cell is derived from other cells, execute this function to get\n // the value\n derivationFunctionText: types.maybe(types.string),\n })\n .views(self => ({\n get expr() {\n if (self.isDerived) {\n // compile this as a jexl expression\n return stringToJexlExpression(\n String(self.derivationFunctionText),\n getEnv(self).pluginManager.jexl,\n )\n }\n return undefined\n },\n }))\n\ntype RowMenuPosition = { anchorEl: Element; rowNumber: string } | null\n\n/**\n * #stateModel SpreadsheetViewSpreadsheet\n * #category view\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst Spreadsheet = types\n .model('Spreadsheet', {\n /**\n * #property\n */\n rowSet: types.optional(StaticRowSetModel, () => StaticRowSetModel.create()),\n /**\n * #property\n */\n columns: types.array(ColumnDefinition),\n /**\n * #property\n */\n columnDisplayOrder: types.array(types.number),\n /**\n * #property\n */\n hasColumnNames: false,\n /**\n * #property\n */\n sortColumns: types.array(\n types\n .model('SortColumns', {\n columnNumber: types.number,\n descending: false,\n })\n .actions(self => ({\n switchDirection() {\n self.descending = !self.descending\n },\n })),\n ),\n\n assemblyName: types.maybe(types.string),\n })\n .volatile(() => ({\n defaultDataType: ColumnTypes.Text,\n rowMenuPosition: null as RowMenuPosition,\n isLoaded: false,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get initialized() {\n const session = getSession(self)\n const name = self.assemblyName\n return name ? session.assemblyManager.get(name)?.initialized : false\n },\n /**\n * #getter\n */\n get hideRowSelection() {\n // just delegates to parent\n\n return getParent<any>(self).hideRowSelection\n },\n\n /**\n * #getter\n * list of data type names to be made available in the column\n * dropdown menu\n */\n get dataTypeChoices() {\n const typeNames = Object.keys(ColumnTypes) as (keyof typeof ColumnTypes)[]\n return typeNames.map(typeName => {\n const dataType = ColumnTypes[typeName].create({ type: typeName })\n const { displayName, categoryName } = dataType\n return { typeName, displayName, categoryName }\n })\n },\n\n /**\n * #method\n */\n rowSortingComparisonFunction(rowA: Row, rowB: Row) {\n for (const { columnNumber, descending } of self.sortColumns) {\n const { dataType } = self.columns[columnNumber]!\n const result = dataType.compare(\n rowA.cellsWithDerived[columnNumber],\n rowB.cellsWithDerived[columnNumber],\n )\n if (result) {\n return descending ? -result : result\n }\n }\n return 0\n },\n }))\n .actions(self => ({\n afterAttach() {\n addDisposer(\n self,\n autorun(async () => {\n const session = getSession(self)\n const { assemblyManager } = session\n try {\n if (self.assemblyName) {\n await assemblyManager.waitForAssembly(self.assemblyName)\n this.setLoaded(true)\n }\n } catch (error) {\n session.notify(\n `failed to load assembly ${self.assemblyName} ${error}`,\n 'error',\n )\n }\n }),\n )\n },\n\n /**\n * #action\n */\n setLoaded(flag: boolean) {\n self.isLoaded = flag\n },\n\n /**\n * #action\n */\n setRowMenuPosition(newPosition: RowMenuPosition) {\n self.rowMenuPosition = newPosition\n },\n\n /**\n * #action\n */\n setSortColumns(newSort: NonNullable<SnapshotIn<typeof self.sortColumns>>) {\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition\n if (newSort) {\n // @ts-expect-error\n self.sortColumns = newSort\n }\n },\n\n /**\n * #action\n */\n setColumnType(columnNumber: number, newTypeName: string) {\n self.columns[columnNumber]!.dataType = { type: newTypeName }\n },\n\n /**\n * #action\n */\n unselectAll() {\n self.rowSet.unselectAll()\n },\n }))\n\nexport type SpreadsheetStateModel = typeof Spreadsheet\nexport type SpreadsheetModel = Instance<SpreadsheetStateModel>\n\nexport default Spreadsheet\n","import { types, getParent, Instance } from 'mobx-state-tree'\nimport { openLocation } from '@jbrowse/core/util/io'\nimport { getSession, getEnv } from '@jbrowse/core/util'\n\n// 30MB\nconst IMPORT_SIZE_LIMIT = 30_000_000\n\nconst fileTypes = ['CSV', 'TSV', 'VCF', 'BED', 'BEDPE', 'STAR-Fusion']\nconst fileTypeParsers = {\n CSV: () =>\n import('../importAdapters/ImportUtils').then(r => r.parseCsvBuffer),\n TSV: () =>\n import('../importAdapters/ImportUtils').then(r => r.parseTsvBuffer),\n VCF: () => import('../importAdapters/VcfImport').then(r => r.parseVcfBuffer),\n BED: () => import('../importAdapters/BedImport').then(r => r.parseBedBuffer),\n BEDPE: () =>\n import('../importAdapters/BedImport').then(r => r.parseBedPEBuffer),\n 'STAR-Fusion': () =>\n import('../importAdapters/STARFusionImport').then(\n r => r.parseSTARFusionBuffer,\n ),\n}\n// regexp used to guess the type of a file or URL from its file extension\nconst fileTypesRegexp = new RegExp(`\\\\.(${fileTypes.join('|')})(\\\\.gz)?$`, 'i')\n\n/**\n * #stateModel SpreadsheetImportWizard\n * #category view\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst ImportWizard = types\n .model('SpreadsheetImportWizard', {\n /**\n * #property\n */\n fileType: types.optional(types.enumeration(fileTypes), 'CSV'),\n /**\n * #property\n */\n hasColumnNameLine: true,\n /**\n * #property\n */\n columnNameLineNumber: 1,\n /**\n * #property\n */\n selectedAssemblyName: types.maybe(types.string),\n })\n .volatile(() => ({\n fileTypes,\n\n fileSource: undefined as any,\n error: undefined as unknown,\n loading: false,\n }))\n .views(self => ({\n get isReadyToOpen() {\n return (\n !self.error &&\n self.fileSource &&\n (self.fileSource.blobId ||\n self.fileSource.localPath ||\n self.fileSource.uri)\n )\n },\n get canCancel() {\n return getParent<any>(self).readyToDisplay\n },\n\n get fileName() {\n return (\n self.fileSource.uri ||\n self.fileSource.localPath ||\n (self.fileSource.blobId && self.fileSource.name)\n )\n },\n\n get requiresUnzip() {\n return this.fileName.endsWith('gz')\n },\n\n isValidRefName(refName: string, assemblyName?: string) {\n const { assemblyManager } = getSession(self)\n if (!assemblyName) {\n return false\n }\n return assemblyManager.isValidRefName(refName, assemblyName)\n },\n }))\n .actions(self => ({\n setSelectedAssemblyName(s: string) {\n self.selectedAssemblyName = s\n },\n setFileSource(newSource: unknown) {\n self.fileSource = newSource\n self.error = undefined\n\n if (self.fileSource) {\n // try to autodetect the file type, ignore errors\n const name = self.fileName\n\n if (name) {\n const firstMatch = fileTypesRegexp.exec(name)?.[1]\n if (firstMatch) {\n self.fileType =\n firstMatch === 'tsv' && name.includes('star-fusion')\n ? 'STAR-Fusion'\n : firstMatch.toUpperCase()\n }\n }\n }\n },\n\n toggleHasColumnNameLine() {\n self.hasColumnNameLine = !self.hasColumnNameLine\n },\n\n setColumnNameLineNumber(newnumber: number) {\n if (newnumber > 0) {\n self.columnNameLineNumber = newnumber\n }\n },\n\n setFileType(typeName: string) {\n self.fileType = typeName\n },\n\n setError(error: unknown) {\n console.error(error)\n self.loading = false\n self.error = error\n },\n\n setLoaded() {\n self.loading = false\n self.error = undefined\n },\n\n cancelButton() {\n self.error = undefined\n\n getParent<any>(self).setDisplayMode()\n },\n\n // fetch and parse the file, make a new Spreadsheet model for it,\n // then set the parent to display it\n async import(assemblyName: string) {\n if (!self.fileSource) {\n return\n }\n\n if (self.loading) {\n throw new Error('Cannot import, load already in progress')\n }\n\n self.selectedAssemblyName = assemblyName\n self.loading = true\n const type = self.fileType as keyof typeof fileTypeParsers\n const typeParser = await fileTypeParsers[type]()\n\n const { unzip } = await import('@gmod/bgzf-filehandle')\n const { pluginManager } = getEnv(self)\n const filehandle = openLocation(self.fileSource, pluginManager)\n try {\n const stat = await filehandle.stat()\n if (stat.size > IMPORT_SIZE_LIMIT) {\n throw new Error(\n `File is too big. Tabular files are limited to at most ${(\n IMPORT_SIZE_LIMIT / 1000\n ).toLocaleString()}kb.`,\n )\n }\n } catch (e) {\n // not required for stat to succeed to proceed, but it is helpful\n console.warn(e)\n }\n\n try {\n await filehandle\n .readFile()\n .then(buffer => (self.requiresUnzip ? unzip(buffer) : buffer))\n .then(buffer => typeParser(buffer, self))\n .then(spreadsheet => {\n this.setLoaded()\n\n getParent<any>(self).displaySpreadsheet(spreadsheet)\n })\n } catch (e) {\n this.setError(e)\n }\n },\n }))\n\nexport type ImportWizardStateModel = typeof ImportWizard\nexport type ImportWizardModel = Instance<ImportWizardStateModel>\n\nexport default ImportWizard\n","import { types, getParent, SnapshotIn } from 'mobx-state-tree'\nimport { AnyFilterModelType as AnyColumnFilter } from './ColumnDataTypes'\n\n// filter that finds a simple string in any of the cells of a row\nconst RowFullTextFilter = types\n .model('RowFullTextFilter', {\n type: types.literal('RowFullText'),\n stringToFind: '',\n })\n .views(self => ({\n // returns a function that tests the given row\n get predicate() {\n let s = self.stringToFind // avoid closing over self\n if (!s) {\n return function alwaysTrue() {\n return true\n }\n }\n s = s.toLowerCase()\n return function stringPredicate(\n _sheet: unknown,\n row: { cellsWithDerived: { text: string }[] },\n ) {\n const { cellsWithDerived } = row\n for (const cell of cellsWithDerived) {\n // note: case insensitive\n if (cell.text.toLowerCase().includes(s)) {\n return true\n }\n }\n return false\n }\n },\n }))\n .actions(self => ({\n setString(s: string) {\n self.stringToFind = s\n },\n clear() {\n self.stringToFind = ''\n },\n }))\n\nconst model = types\n .model('SpreadsheetFilterControls', {\n rowFullText: types.optional(\n RowFullTextFilter,\n () =>\n ({\n type: 'RowFullText',\n stringToFind: '',\n }) as SnapshotIn<typeof RowFullTextFilter>,\n ),\n columnFilters: types.array(AnyColumnFilter),\n })\n .views(self => ({\n get filters() {\n return [self.rowFullText, ...self.columnFilters].filter(f => !!f)\n },\n setRowFullTextFilter(stringToFind: string) {\n // @ts-expect-error\n self.rowFullText = {\n type: 'RowFullText',\n stringToFind,\n }\n },\n rowPassesFilters(sheet: unknown, row: unknown) {\n for (const filter of this.filters) {\n if (!filter.predicate(sheet, row)) {\n return false\n }\n }\n return true\n },\n }))\n .actions(self => ({\n addBlankColumnFilter(columnNumber: number) {\n const { dataType } =\n getParent<any>(self).spreadsheet.columns[columnNumber]\n self.columnFilters.push({\n type: dataType.type,\n columnNumber,\n })\n },\n removeColumnFilter(filter: typeof AnyColumnFilter) {\n return self.columnFilters.remove(filter)\n },\n clearAllFilters() {\n self.columnFilters.clear()\n self.rowFullText.clear()\n },\n }))\n\nexport default model\n","import { types, getEnv, cast, SnapshotIn, Instance } from 'mobx-state-tree'\nimport { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { MenuItem } from '@jbrowse/core/ui'\nimport { getSession } from '@jbrowse/core/util'\n\n// icons\nimport DoneIcon from '@mui/icons-material/Done'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\n\nimport SpreadsheetModel from './Spreadsheet'\nimport ImportWizardModel from './ImportWizard'\nimport FilterControlsModel from './FilterControls'\n\ntype Spreadsheet = Instance<typeof SpreadsheetModel>\n\nexport type MenuItemWithDisabledCallback = MenuItem & {\n disabled?:\n | boolean\n | ((\n viewModel: unknown,\n spreadsheetModel: Spreadsheet,\n rowNumber: number,\n row: Spreadsheet['rowSet']['rows'][0],\n ) => boolean)\n}\n\nconst defaultRowMenuItems: MenuItemWithDisabledCallback[] = [\n {\n label: 'Toggle select',\n icon: DoneIcon,\n onClick(_view: unknown, spreadsheet: Spreadsheet) {\n const rowNumber = spreadsheet.rowMenuPosition?.rowNumber\n if (rowNumber !== undefined) {\n spreadsheet.rowSet.rows[+rowNumber - 1]!.toggleSelect()\n }\n },\n },\n]\n\nconst minHeight = 40\nconst defaultHeight = 440\n\n/**\n * #stateModel SpreadsheetView\n * #category view\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst model = types\n .model('SpreadsheetView', {\n /**\n * #property\n */\n type: types.literal('SpreadsheetView'),\n /**\n * #property\n */\n offsetPx: 0,\n /**\n * #property\n */\n height: types.optional(\n types.refinement(\n 'SpreadsheetViewHeight',\n types.number,\n n => n >= minHeight,\n ),\n defaultHeight,\n ),\n /**\n * #property\n */\n hideVerticalResizeHandle: false,\n /**\n * #property\n */\n hideFilterControls: false,\n /**\n * #property\n */\n filterControls: types.optional(FilterControlsModel, () =>\n FilterControlsModel.create({}),\n ),\n /**\n * #property\n * switch specifying whether we are showing the import wizard or the\n * spreadsheet in our viewing area\n */\n mode: types.optional(\n types.enumeration('SpreadsheetViewMode', ['import', 'display']),\n 'import',\n ),\n /**\n * #property\n */\n importWizard: types.optional(ImportWizardModel, () =>\n ImportWizardModel.create(),\n ),\n /**\n * #property\n */\n spreadsheet: types.maybe(SpreadsheetModel),\n })\n .volatile(() => ({\n width: 400,\n rowMenuItems: defaultRowMenuItems,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get readyToDisplay() {\n return !!self.spreadsheet && self.spreadsheet.isLoaded\n },\n /**\n * #getter\n */\n get hideRowSelection() {\n return !!getEnv(self).hideRowSelection\n },\n /**\n * #getter\n */\n get outputRows() {\n if (self.spreadsheet?.rowSet.isLoaded) {\n const selected = self.spreadsheet.rowSet.selectedFilteredRows\n if (selected.length) {\n return selected\n }\n return self.spreadsheet.rowSet.sortedFilteredRows\n }\n return undefined\n },\n /**\n * #getter\n */\n get assembly() {\n const name = self.spreadsheet?.assemblyName\n if (name) {\n const assemblies = getSession(self).assemblies\n return assemblies.find(asm => readConfObject(asm, 'name') === name)\n }\n return undefined\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setRowMenuItems(newItems: MenuItem[]) {\n self.rowMenuItems = newItems\n },\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.width = newWidth\n return self.width\n },\n /**\n * #action\n */\n setHeight(newHeight: number) {\n self.height = newHeight > minHeight ? newHeight : minHeight\n return self.height\n },\n /**\n * #action\n */\n resizeHeight(distance: number) {\n const oldHeight = self.height\n const newHeight = this.setHeight(self.height + distance)\n return newHeight - oldHeight\n },\n /**\n * #action\n */\n resizeWidth(distance: number) {\n const oldWidth = self.width\n const newWidth = this.setWidth(self.width + distance)\n return newWidth - oldWidth\n },\n\n /**\n * #action\n * load a new spreadsheet and set our mode to display it\n */\n displaySpreadsheet(spreadsheet: SnapshotIn<typeof SpreadsheetModel>) {\n self.filterControls.clearAllFilters()\n self.spreadsheet = cast(spreadsheet)\n self.mode = 'display'\n },\n /**\n * #action\n */\n setImportMode() {\n self.mode = 'import'\n },\n /**\n * #action\n */\n setDisplayMode() {\n if (self.readyToDisplay) {\n self.mode = 'display'\n }\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n menuItems() {\n return [\n {\n label: 'Return to import form',\n onClick: () => {\n self.setImportMode()\n },\n icon: FolderOpenIcon,\n },\n ]\n },\n }))\n\nconst SpreadsheetView = types.compose(BaseViewModel, model)\n\nexport type SpreadsheetViewStateModel = typeof SpreadsheetView\nexport type SpreadsheetViewModel = Instance<SpreadsheetViewStateModel>\n\nexport default SpreadsheetView\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\nimport { AbstractSessionModel, isAbstractMenuManager } from '@jbrowse/core/util'\n\n// icons\nimport ViewComfyIcon from '@mui/icons-material/ViewComfy'\n\n// locals\nimport SpreadsheetViewF from './SpreadsheetView'\n\nimport LaunchSpreadsheetViewF from './LaunchSpreadsheetView'\n\nexport default class SpreadsheetViewPlugin extends Plugin {\n name = 'SpreadsheetViewPlugin'\n\n install(pluginManager: PluginManager) {\n SpreadsheetViewF(pluginManager)\n LaunchSpreadsheetViewF(pluginManager)\n }\n\n configure(pluginManager: PluginManager) {\n const { rootModel } = pluginManager\n if (isAbstractMenuManager(rootModel)) {\n rootModel.appendToSubMenu(['Add'], {\n label: 'Spreadsheet view',\n icon: ViewComfyIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('SpreadsheetView', {})\n },\n })\n }\n }\n}\n\nexport {\n type SpreadsheetViewModel,\n type SpreadsheetViewStateModel,\n} from './SpreadsheetView'\n","import { lazy } from 'react'\nimport { ViewType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport stateModel from './models/SpreadsheetView'\n\nexport default function SpreadsheetViewF(pluginManager: PluginManager) {\n pluginManager.addViewType(() => {\n return new ViewType({\n name: 'SpreadsheetView',\n displayName: 'Spreadsheet view',\n stateModel,\n ReactComponent: lazy(() => import('./components/SpreadsheetView')),\n })\n })\n}\n\nexport {\n type SpreadsheetViewModel,\n type SpreadsheetViewStateModel,\n} from './models/SpreadsheetView'\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport { SpreadsheetViewModel } from '../SpreadsheetView'\n\nexport default function LaunchSpreadsheetViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-SpreadsheetView',\n // @ts-expect-error\n async ({\n session,\n assembly,\n uri,\n fileType,\n }: {\n session: AbstractSessionModel\n assembly: string\n uri: string\n fileType?: string\n }) => {\n const view = session.addView('SpreadsheetView') as SpreadsheetViewModel\n const exts = uri.split('.')\n let ext = exts.pop()?.toUpperCase()\n if (ext === 'GZ') {\n ext = exts.pop()?.toUpperCase()\n }\n\n view.importWizard.setFileType(fileType || ext || '')\n view.importWizard.setSelectedAssemblyName(assembly)\n view.importWizard.setFileSource({\n uri,\n locationType: 'UriLocation',\n })\n await view.importWizard.import(assembly)\n },\n )\n}\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { Grid, FormControlLabel, Checkbox } from '@mui/material'\nimport { makeStyles } from 'tss-react/mui'\n\n// locals\nimport { SvInspectorViewModel } from '../models/SvInspectorView'\n\nconst useStyles = makeStyles()(theme => ({\n circularViewOptions: {\n padding: theme.spacing(1),\n },\n}))\n\nconst CircularViewOptions = observer(function ({\n svInspector,\n}: {\n svInspector: SvInspectorViewModel\n}) {\n const { classes } = useStyles()\n\n return (\n <Grid\n container\n className={classes.circularViewOptions}\n style={{ height: svInspector.circularViewOptionsBarHeight }}\n >\n <Grid item>\n <FormControlLabel\n control={\n <Checkbox\n checked={svInspector.onlyDisplayRelevantRegionsInCircularView}\n onChange={e => {\n svInspector.setOnlyDisplayRelevantRegionsInCircularView(\n e.target.checked,\n )\n }}\n />\n }\n label=\"show only regions with data\"\n />\n </Grid>\n </Grid>\n )\n})\n\nexport default CircularViewOptions\n","import React from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { ResizeHandle } from '@jbrowse/core/ui'\n\n// locals\nimport { SvInspectorViewModel } from '../models/SvInspectorView'\nimport CircularViewOptions from './CircularViewOptions'\n\nconst useStyles = makeStyles()(theme => ({\n resizeHandleVert: {\n background: theme.palette.action.selected,\n width: 4,\n boxSizing: 'border-box',\n borderTop: '1px solid #fafafa',\n },\n resizeHandleHoriz: {\n background: theme.palette.action.selected,\n height: 4,\n boxSizing: 'border-box',\n borderTop: '1px solid #fafafa',\n },\n viewControls: {\n margin: 0,\n },\n viewsContainer: {\n display: 'flex',\n },\n container: {\n overflow: 'hidden',\n },\n}))\n\nconst SvInspectorView = observer(function ({\n model,\n}: {\n model: SvInspectorViewModel\n}) {\n const { classes } = useStyles()\n\n const {\n SpreadsheetViewReactComponent,\n CircularViewReactComponent,\n showCircularView,\n } = model\n\n return (\n <div className={classes.container}>\n <div className={classes.viewsContainer}>\n <div\n style={{ width: model.spreadsheetView.width }}\n className={classes.container}\n >\n <SpreadsheetViewReactComponent model={model.spreadsheetView} />\n </div>\n\n {showCircularView ? (\n <>\n <ResizeHandle\n onDrag={distance => {\n const ret1 = model.circularView.resizeWidth(-distance)\n return model.spreadsheetView.resizeWidth(-ret1)\n }}\n vertical\n flexbox\n className={classes.resizeHandleVert}\n />\n <div style={{ width: model.circularView.width }}>\n <CircularViewOptions svInspector={model} />\n <CircularViewReactComponent model={model.circularView} />\n </div>\n </>\n ) : null}\n </div>\n <ResizeHandle\n onDrag={model.resizeHeight}\n className={classes.resizeHandleHoriz}\n />\n </div>\n )\n})\n\nexport default SvInspectorView\n","// @ts-nocheck\n// this file contains the rather verbose functions for\n// creating features from CSV/TSV lines\nimport { parseLocString } from '@jbrowse/core/util'\n\nexport function makeAdHocFeature(\n columns,\n columnsAlreadyUsedInLocations,\n row,\n loc1,\n loc2,\n rowNumber,\n) {\n // load all the other data in the row into an `otherData` object\n const otherData = {}\n columns.forEach((column, columnNumber) => {\n if (columnsAlreadyUsedInLocations.includes(columnNumber)) {\n return\n }\n let { text } = row.cells[columnNumber]\n if (column.dataType.type === 'Number') {\n text = Number.parseFloat(text)\n }\n otherData[column.name] = text\n })\n\n // make the final feature data out of otherData + the parsed locations\n return {\n ...otherData,\n uniqueId: `sv-inspector-adhoc-${rowNumber}`,\n refName: loc1.refName,\n start: loc1.start,\n end: loc1.end,\n mate: {\n refName: loc2.refName,\n start: loc2.start,\n end: loc2.end,\n },\n }\n}\n\nexport function makeAdHocSvFeatureFromTwoLocations(\n columns,\n locationColumnNumbers,\n row,\n rowNumber,\n isValidRefName,\n) {\n // use the first two locations we found (first according to *displayed* order)\n const loc1 = parseLocString(\n row.cells[locationColumnNumbers[0]].text,\n isValidRefName,\n )\n const loc2 = parseLocString(\n row.cells[locationColumnNumbers[1]].text,\n isValidRefName,\n )\n\n const columnsAlreadyUsedInLocations = [\n locationColumnNumbers[0],\n locationColumnNumbers[1],\n ]\n\n return makeAdHocFeature(\n columns,\n columnsAlreadyUsedInLocations,\n row,\n loc1,\n loc2,\n rowNumber,\n )\n}\n\nexport function makeAdHocSvFeatureFromTwoRefStartEndSets(\n columns,\n locRefColumnNumbers,\n locStartColumnNumbers,\n locEndColumnNumbers,\n row,\n rowNumber,\n) {\n const textOf = colno => row.cells[colno].text\n const loc1 = {\n refName: textOf(locRefColumnNumbers[0]),\n start: Number.parseInt(textOf(locStartColumnNumbers[0]), 10) - 1,\n end: Number.parseInt(textOf(locEndColumnNumbers[0]), 10),\n }\n const loc2 = {\n refName: textOf(locRefColumnNumbers[1]),\n start: Number.parseInt(textOf(locStartColumnNumbers[1]), 10) - 1,\n end: Number.parseInt(textOf(locEndColumnNumbers[1]), 10),\n }\n const columnsAlreadyUsedInLocations = [\n locRefColumnNumbers[0],\n locStartColumnNumbers[0],\n locEndColumnNumbers[0],\n locRefColumnNumbers[1],\n locStartColumnNumbers[1],\n locEndColumnNumbers[1],\n ]\n return makeAdHocFeature(\n columns,\n columnsAlreadyUsedInLocations,\n row,\n loc1,\n loc2,\n rowNumber,\n )\n}\n\n// makes a feature data object (passed as `data` to a SimpleFeature constructor)\n// out of table row if the row has 2 location columns. undefined if not\nexport function makeAdHocSvFeature(sheet, rowNumber, row, isValidRefName) {\n const { columns, columnDisplayOrder } = sheet\n const columnTypes = {}\n columnDisplayOrder.forEach(columnNumber => {\n const columnDefinition = columns[columnNumber]\n if (!columnTypes[columnDefinition.dataType.type]) {\n columnTypes[columnDefinition.dataType.type] = []\n }\n columnTypes[columnDefinition.dataType.type].push(columnNumber)\n })\n const locationColumnNumbers = columnTypes.LocString || []\n const locStartColumnNumbers = columnTypes.LocStart || []\n const locEndColumnNumbers = columnTypes.LocEnd || []\n const locRefColumnNumbers = columnTypes.LocRef || []\n\n // if we have 2 or more columns of type location, make a feature from them\n if (locationColumnNumbers.length >= 2) {\n return makeAdHocSvFeatureFromTwoLocations(\n columns,\n locationColumnNumbers,\n row,\n rowNumber,\n isValidRefName,\n )\n }\n if (\n locRefColumnNumbers.length >= 2 &&\n locStartColumnNumbers.length >= 2 &&\n locEndColumnNumbers.length >= 2\n ) {\n return makeAdHocSvFeatureFromTwoRefStartEndSets(\n columns,\n locRefColumnNumbers,\n locStartColumnNumbers,\n locEndColumnNumbers,\n row,\n rowNumber,\n )\n }\n return undefined\n}\n","// @ts-nocheck\nimport { SimpleFeature, getEnv, getSession } from '@jbrowse/core/util'\nimport { makeAdHocSvFeature } from './adhocFeatureUtils'\n\nexport function getFeatureForRow(session, spreadsheetView, row, rowNumber) {\n return (\n row.extendedData?.vcfFeature ||\n row.extendedData?.feature ||\n makeAdHocSvFeature(\n spreadsheetView.spreadsheet,\n rowNumber,\n row,\n session.assemblyManager.isValidRefName,\n )\n )\n}\n\nexport function breakpointSplitViewSnapshotFromTableRow(\n svInspectorView,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n) {\n const { pluginManager } = getEnv(svInspectorView)\n const session = getSession(spreadsheetView)\n const featureData = getFeatureForRow(session, spreadsheet, row, rowNumber)\n\n if (featureData) {\n const feature = new SimpleFeature(featureData)\n session.setSelection(feature)\n return pluginManager\n .getViewType('BreakpointSplitView')\n .snapshotFromBreakendFeature(feature, svInspectorView.circularView)\n }\n return undefined\n}\n\nexport function openBreakpointSplitViewFromTableRow(\n svInspectorView,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n) {\n const viewSnapshot = breakpointSplitViewSnapshotFromTableRow(\n svInspectorView,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n )\n if (viewSnapshot) {\n // try to center the offsetPx\n const { circularView } = svInspectorView\n viewSnapshot.views[0].offsetPx -= circularView.width / 2 + 100\n viewSnapshot.views[1].offsetPx -= circularView.width / 2 + 100\n\n const session = getSession(spreadsheetView)\n session.addView('BreakpointSplitView', viewSnapshot)\n }\n}\n\nexport function canOpenBreakpointSplitViewFromTableRow(\n svInspectorView,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n) {\n try {\n return Boolean(\n breakpointSplitViewSnapshotFromTableRow(\n svInspectorView,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n ),\n )\n } catch (e) {\n console.error('Unable to open breakpoint split view from table row', e)\n return false\n }\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport ViewType from '@jbrowse/core/pluggableElementTypes/ViewType'\n\nimport ReactComponent from './components/SvInspectorView'\nimport stateModelFactory from './models/SvInspectorView'\nimport { Feature, getContainingView, getSession } from '@jbrowse/core/util'\nimport { IAnyStateTreeNode } from 'mobx-state-tree'\nimport BreakpointSplitViewType from '@jbrowse/plugin-breakpoint-split-view/src/BreakpointSplitView/BreakpointSplitView'\nimport { CircularViewModel } from '@jbrowse/plugin-circular-view'\n\nfunction defaultOnChordClick(\n feature: Feature,\n chordTrack: IAnyStateTreeNode,\n pluginManager: PluginManager,\n) {\n const session = getSession(chordTrack)\n session.setSelection(feature)\n const view = getContainingView(chordTrack) as CircularViewModel\n const viewType = pluginManager.getViewType(\n 'BreakpointSplitView',\n ) as BreakpointSplitViewType\n const viewSnapshot = viewType.snapshotFromBreakendFeature(feature, view)\n\n // try to center the offsetPx\n viewSnapshot.views[0]!.offsetPx -= view.width / 2 + 100\n viewSnapshot.views[1]!.offsetPx -= view.width / 2 + 100\n\n session.addView('BreakpointSplitView', viewSnapshot)\n}\n\nexport default function SvInspectorViewF(pluginManager: PluginManager) {\n pluginManager.jexl.addFunction('defaultOnChordClick', defaultOnChordClick)\n\n pluginManager.addViewType(() => {\n const stateModel = stateModelFactory(pluginManager)\n return new ViewType({\n name: 'SvInspectorView',\n displayName: 'SV inspector',\n stateModel,\n ReactComponent,\n })\n })\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport Plugin from '@jbrowse/core/Plugin'\nimport {\n AbstractSessionModel,\n isAbstractMenuManager,\n} from '@jbrowse/core/util/types'\n\n// icons\nimport TableChartIcon from '@mui/icons-material/TableChart'\n\n// locals\nimport SvInspectorViewF from './SvInspectorView'\nimport LaunchSvInspectorViewF from './LaunchSvInspectorView'\n\nexport default class SvInspectorViewPlugin extends Plugin {\n name = 'SvInspectorViewPlugin'\n\n install(pluginManager: PluginManager) {\n SvInspectorViewF(pluginManager)\n LaunchSvInspectorViewF(pluginManager)\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToSubMenu(['Add'], {\n label: 'SV inspector',\n icon: TableChartIcon,\n onClick: (session: AbstractSessionModel) => {\n session.addView('SvInspectorView', {})\n },\n })\n }\n }\n}\n","import clone from 'clone'\nimport { autorun, reaction } from 'mobx'\nimport { types, addDisposer, Instance } from 'mobx-state-tree'\n\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { getSession, Region } from '@jbrowse/core/util'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { ElementId } from '@jbrowse/core/util/types/mst'\nimport { BaseViewModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport { SpreadsheetViewStateModel } from '@jbrowse/plugin-spreadsheet-view'\nimport { CircularViewStateModel } from '@jbrowse/plugin-circular-view'\n\n// icons\nimport OpenInNewIcon from '@mui/icons-material/OpenInNew'\nimport FolderOpenIcon from '@mui/icons-material/FolderOpen'\n\n// locals\nimport {\n canOpenBreakpointSplitViewFromTableRow,\n openBreakpointSplitViewFromTableRow,\n getFeatureForRow,\n} from './breakpointSplitViewFromTableRow'\n\n/**\n * #stateModel SvInspectorView\n * #category view\n * does not extend, but is a combination of a\n * - [SpreadsheetView](../spreadsheetview)\n * - [CircularView](../circularview)\n *\n * extends\n * - [BaseViewModel](../baseviewmodel)\n */\nfunction SvInspectorViewF(pluginManager: PluginManager) {\n const SpreadsheetViewType = pluginManager.getViewType('SpreadsheetView')!\n const CircularViewType = pluginManager.getViewType('CircularView')!\n\n const SpreadsheetModel =\n SpreadsheetViewType.stateModel as SpreadsheetViewStateModel\n const CircularModel = CircularViewType.stateModel as CircularViewStateModel\n\n const minHeight = 400\n const defaultHeight = 550\n const headerHeight = 52\n const circularViewOptionsBarHeight = 52\n return types\n .compose(\n 'SvInspectorView',\n BaseViewModel,\n types.model({\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('SvInspectorView'),\n\n /**\n * #property\n */\n height: types.optional(\n types.refinement(\n 'SvInspectorViewHeight',\n types.number,\n n => n >= minHeight,\n ),\n defaultHeight,\n ),\n /**\n * #property\n */\n onlyDisplayRelevantRegionsInCircularView: false,\n /**\n * #property\n * switch specifying whether we are showing the import wizard or the\n * spreadsheet in our viewing area\n */\n mode: types.optional(\n types.enumeration('SvInspectorViewMode', ['import', 'display']),\n 'import',\n ),\n /**\n * #property\n */\n spreadsheetView: types.optional(SpreadsheetModel, () =>\n SpreadsheetModel.create({\n type: 'SpreadsheetView',\n hideVerticalResizeHandle: true,\n }),\n ),\n /**\n * #property\n */\n circularView: types.optional(CircularModel, () =>\n CircularModel.create({\n type: 'CircularView',\n hideVerticalResizeHandle: true,\n hideTrackSelectorButton: true,\n disableImportForm: true,\n }),\n ),\n }),\n )\n .volatile(() => ({\n width: 800,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get selectedRows() {\n return self.spreadsheetView.spreadsheet?.rowSet.selectedRows\n },\n /**\n * #getter\n */\n get assemblyName() {\n const { assembly } = self.spreadsheetView\n return assembly\n ? (readConfObject(assembly, 'name') as string)\n : undefined\n },\n /**\n * #getter\n */\n get showCircularView() {\n return self.spreadsheetView.mode === 'display'\n },\n\n /**\n * #getter\n */\n get features() {\n const session = getSession(self)\n const { spreadsheetView } = self\n const { outputRows = [] } = spreadsheetView\n return outputRows\n .map((r, i) => getFeatureForRow(session, spreadsheetView, r, i))\n .filter(f => !!f)\n },\n /**\n * #getter\n */\n get featuresAdapterConfigSnapshot() {\n return {\n type: 'FromConfigAdapter',\n features: this.features,\n }\n },\n /**\n * #getter\n */\n get featureRefNames() {\n const refs = this.features.map(r => r.refName)\n const CHR2 = this.features.flatMap(r => r.INFO?.CHR2).filter(f => !!f)\n return [...refs, ...CHR2]\n },\n /**\n * #getter\n */\n get featuresCircularTrackConfiguration() {\n return {\n type: 'VariantTrack',\n trackId: `sv-inspector-variant-track-${self.id}`,\n name: 'features from tabular data',\n adapter: this.featuresAdapterConfigSnapshot,\n assemblyNames: [this.assemblyName],\n displays: [\n {\n type: 'ChordVariantDisplay',\n displayId: `sv-inspector-variant-track-chord-display-${self.id}`,\n onChordClick:\n 'jexl:defaultOnChordClick(feature, track, pluginManager)',\n renderer: { type: 'StructuralVariantChordRenderer' },\n },\n ],\n }\n },\n }))\n .volatile(() => ({\n SpreadsheetViewReactComponent: SpreadsheetViewType.ReactComponent,\n CircularViewReactComponent: CircularViewType.ReactComponent,\n circularViewOptionsBarHeight,\n }))\n .actions(self => ({\n /**\n * #action\n */\n setWidth(newWidth: number) {\n self.width = newWidth\n },\n /**\n * #action\n */\n setHeight(newHeight: number) {\n self.height = newHeight > minHeight ? newHeight : minHeight\n return self.height\n },\n /**\n * #action\n */\n setImportMode() {\n self.spreadsheetView.setImportMode()\n },\n /**\n * #action\n */\n setDisplayMode() {\n self.spreadsheetView.setDisplayMode()\n },\n\n /**\n * #action\n */\n setDisplayedRegions(regions: Region[]) {\n self.circularView.setDisplayedRegions(regions)\n },\n /**\n * #action\n */\n setOnlyDisplayRelevantRegionsInCircularView(val: boolean) {\n self.onlyDisplayRelevantRegionsInCircularView = Boolean(val)\n },\n }))\n .views(self => ({\n /**\n * #method\n */\n menuItems() {\n return [\n {\n label: 'Return to import form',\n onClick: () => {\n self.setImportMode()\n },\n icon: FolderOpenIcon,\n },\n ]\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n resizeHeight(distance: number) {\n const oldHeight = self.height\n const newHeight = self.setHeight(self.height + distance)\n return newHeight - oldHeight\n },\n afterAttach() {\n // synchronize subview widths\n addDisposer(\n self,\n autorun(\n () => {\n const borderWidth = 1\n if (self.showCircularView) {\n const spreadsheetWidth = Math.round(self.width * 0.66)\n const circularViewWidth = self.width - spreadsheetWidth\n self.spreadsheetView.setWidth(spreadsheetWidth - borderWidth)\n self.circularView.setWidth(circularViewWidth)\n } else {\n self.spreadsheetView.setWidth(self.width)\n }\n },\n { name: 'SvInspectorView width binding' },\n ),\n )\n // synchronize subview heights\n addDisposer(\n self,\n autorun(\n () => {\n self.spreadsheetView.setHeight(self.height - headerHeight)\n self.circularView.setHeight(\n self.height - headerHeight - circularViewOptionsBarHeight,\n )\n },\n { name: 'SvInspectorView height binding' },\n ),\n )\n\n // bind circularview displayedRegions to spreadsheet assembly, mediated\n // by the onlyRelevantRegions toggle\n addDisposer(\n self,\n autorun(\n async () => {\n const {\n assemblyName,\n onlyDisplayRelevantRegionsInCircularView,\n circularView,\n featureRefNames,\n } = self\n const { tracks } = circularView\n const { assemblyManager } = getSession(self)\n if (!assemblyName) {\n return\n }\n const asm = await assemblyManager.waitForAssembly(assemblyName)\n if (!asm) {\n return\n }\n\n const { getCanonicalRefName, regions = [] } = asm\n if (onlyDisplayRelevantRegionsInCircularView) {\n if (tracks.length === 1) {\n try {\n // canonicalize the store's ref names if necessary\n const refSet = new Set(\n featureRefNames.map(r => getCanonicalRefName(r) || r),\n )\n\n circularView.setDisplayedRegions(\n clone(regions.filter(r => refSet.has(r.refName))),\n )\n } catch (e) {\n circularView.setError(e)\n }\n }\n } else {\n circularView.setDisplayedRegions(regions)\n }\n },\n { name: 'SvInspectorView displayed regions bind' },\n ),\n )\n\n // bind circularview tracks to our track snapshot view\n addDisposer(\n self,\n reaction(\n () => ({\n generatedTrackConf: self.featuresCircularTrackConfiguration,\n assemblyName: self.assemblyName,\n }),\n data => {\n const { assemblyName, generatedTrackConf } = data\n const { circularView } = self\n // hide any visible tracks\n circularView.tracks.forEach(t =>\n circularView.hideTrack(t.configuration.trackId),\n )\n\n // put our track in as the only track\n if (assemblyName) {\n // @ts-expect-error\n circularView.addTrackConf(generatedTrackConf, {\n assemblyName,\n })\n }\n },\n {\n name: 'SvInspectorView track configuration binding',\n fireImmediately: true,\n },\n ),\n )\n\n // bind spreadsheetView row menu actions to us\n addDisposer(\n self,\n autorun(() => {\n self.spreadsheetView.setRowMenuItems(\n // these are the MenuItem entries for the row menu actions in the\n // spreadsheet view. these are installed into the child\n // SpreadsheetView using an autorun below\n [\n {\n label: 'Open split detail view',\n icon: OpenInNewIcon,\n // @ts-expect-error\n disabled(spreadsheetView, spreadsheet, rowNumber, row) {\n return !canOpenBreakpointSplitViewFromTableRow(\n self,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n )\n },\n\n onClick(spreadsheetView, spreadsheet, rowNumber, row) {\n openBreakpointSplitViewFromTableRow(\n self,\n spreadsheetView,\n spreadsheet,\n row,\n rowNumber,\n )\n },\n },\n ],\n )\n }),\n )\n },\n }))\n}\n\nexport type SvInspectorViewStateModel = ReturnType<typeof SvInspectorViewF>\nexport type SvInspectorViewModel = Instance<SvInspectorViewStateModel>\n\nexport default SvInspectorViewF\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport { AbstractSessionModel } from '@jbrowse/core/util'\nimport { SvInspectorViewModel } from '../SvInspectorView/models/SvInspectorView'\n\nexport default function LaunchSvInspectorViewF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LaunchView-SvInspectorView',\n // @ts-expect-error\n async ({\n session,\n assembly,\n uri,\n fileType,\n }: {\n session: AbstractSessionModel\n assembly: string\n uri: string\n fileType?: string\n }) => {\n const view = session.addView('SvInspectorView') as SvInspectorViewModel\n const exts = uri.split('.')\n let ext = exts.pop()?.toUpperCase()\n if (ext === 'GZ') {\n ext = exts.pop()?.toUpperCase()\n }\n\n view.spreadsheetView.importWizard.setFileType(fileType || ext || '')\n view.spreadsheetView.importWizard.setSelectedAssemblyName(assembly)\n view.spreadsheetView.importWizard.setFileSource({\n uri,\n locationType: 'UriLocation',\n })\n await view.spreadsheetView.importWizard.import(assembly)\n },\n )\n}\n","import React from 'react'\nimport { Region } from '@jbrowse/core/util/types'\nimport { PrerenderedCanvas } from '@jbrowse/core/ui'\nimport { observer } from 'mobx-react'\n\nconst HicRendering = observer(function HicRendering(props: {\n blockKey: string\n width: number\n height: number\n regions: Region[]\n bpPerPx: number\n}) {\n const { width, height } = props\n const canvasWidth = Math.ceil(width)\n // need to call this in render so we get the right observer behavior\n return (\n <div style={{ position: 'relative', width: canvasWidth, height }}>\n <PrerenderedCanvas\n {...props}\n style={{ position: 'absolute', left: 0, top: 0 }}\n />\n </div>\n )\n})\n\nexport default HicRendering\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config HicRenderer\n * #category renderer\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst HicRenderer = ConfigurationSchema(\n 'HicRenderer',\n {\n /**\n * #slot\n */\n baseColor: {\n type: 'color',\n description: 'base color to be used in the hic alignment',\n defaultValue: '#f00',\n },\n /**\n * #slot\n */\n color: {\n type: 'color',\n description: 'the color of each feature in a hic alignment',\n defaultValue: 'jexl:interpolate(count,scale)',\n contextVariable: ['count', 'maxScore', 'baseColor', 'scale'],\n },\n\n /**\n * #slot\n */\n maxHeight: {\n type: 'integer',\n description: 'the maximum height to be used in a hic rendering',\n defaultValue: 600,\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default HicRenderer\n","import ServerSideRendererType, {\n RenderArgs as ServerSideRenderArgs,\n RenderArgsDeserialized as ServerSideRenderArgsDeserialized,\n ResultsSerialized as ServerSideResultsSerialized,\n ResultsDeserialized as ServerSideResultsDeserialized,\n} from '@jbrowse/core/pluggableElementTypes/renderers/ServerSideRendererType'\nimport { Region } from '@jbrowse/core/util/types'\nimport { renderToAbstractCanvas } from '@jbrowse/core/util/offscreenCanvasUtils'\nimport { toArray } from 'rxjs/operators'\nimport { readConfObject } from '@jbrowse/core/configuration'\nimport { BaseFeatureDataAdapter } from '@jbrowse/core/data_adapters/BaseAdapter'\nimport { getAdapter } from '@jbrowse/core/data_adapters/dataAdapterCache'\nimport { AnyConfigurationModel } from '@jbrowse/core/configuration'\nimport { firstValueFrom } from 'rxjs'\n\ninterface HicFeature {\n bin1: number\n bin2: number\n counts: number\n}\n\ninterface HicDataAdapter extends BaseFeatureDataAdapter {\n getResolution: (bp: number) => Promise<number>\n}\n\nexport interface RenderArgs extends ServerSideRenderArgs {\n regions: Region[]\n}\n\nexport interface RenderArgsDeserialized\n extends ServerSideRenderArgsDeserialized {\n regions: Region[]\n dataAdapter: HicDataAdapter\n bpPerPx: number\n highResolutionScaling: number\n resolution: number\n adapterConfig: AnyConfigurationModel\n}\n\nexport interface RenderArgsDeserializedWithFeatures\n extends RenderArgsDeserialized {\n features: HicFeature[]\n}\n\nexport type ResultsSerialized = ServerSideResultsSerialized\n\nexport type ResultsDeserialized = ServerSideResultsDeserialized\n\nexport default class HicRenderer extends ServerSideRendererType {\n supportsSVG = true\n\n async render(renderProps: RenderArgsDeserialized) {\n const { config, regions, bpPerPx } = renderProps\n const region = regions[0]!\n const width = (region.end - region.start) / bpPerPx\n const height = readConfObject(config, 'maxHeight')\n const features = await this.getFeatures(renderProps)\n\n const { makeImageData } = await import('./makeImageData')\n const res = await renderToAbstractCanvas(width, height, renderProps, ctx =>\n makeImageData(ctx, {\n ...renderProps,\n features,\n pluginManager: this.pluginManager,\n }),\n )\n const results = await super.render({\n ...renderProps,\n ...res,\n features,\n region: renderProps.regions[0],\n height,\n width,\n })\n\n return {\n ...results,\n ...res,\n height,\n width,\n }\n }\n\n async getFeatures(args: RenderArgsDeserialized) {\n const { regions, sessionId, adapterConfig } = args\n const { dataAdapter } = await getAdapter(\n this.pluginManager,\n sessionId,\n adapterConfig,\n )\n const features = await firstValueFrom(\n (dataAdapter as BaseFeatureDataAdapter)\n .getFeatures(regions[0]!, args)\n .pipe(toArray()),\n )\n // cast to any to avoid return-type conflict, because the\n // types of features returned by our getFeatures are quite\n // different from the base interface\n\n return features as any\n }\n}\n\nexport {\n type RenderArgsSerialized,\n type RenderResults,\n} from '@jbrowse/core/pluggableElementTypes/renderers/ServerSideRendererType'\n","import { ConfigurationReference, getConf } from '@jbrowse/core/configuration'\nimport { BaseLinearDisplay } from '@jbrowse/plugin-linear-genome-view'\nimport { types, getEnv } from 'mobx-state-tree'\nimport { AnyConfigurationSchemaType } from '@jbrowse/core/configuration'\n\n/**\n * #stateModel LinearHicDisplay\n * #category display\n * extends `BaseLinearDisplay`\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nexport default function stateModelFactory(\n configSchema: AnyConfigurationSchemaType,\n) {\n return types\n .compose(\n 'LinearHicDisplay',\n BaseLinearDisplay,\n types.model({\n /**\n * #property\n */\n type: types.literal('LinearHicDisplay'),\n /**\n * #property\n */\n configuration: ConfigurationReference(configSchema),\n /**\n * #property\n */\n resolution: types.optional(types.number, 1),\n /**\n * #property\n */\n useLogScale: false,\n /**\n * #property\n */\n colorScheme: types.maybe(types.string),\n }),\n )\n .views(self => {\n const { renderProps: superRenderProps } = self\n return {\n /**\n * #getter\n */\n get blockType() {\n return 'dynamicBlocks'\n },\n /**\n * #getter\n */\n get rendererTypeName() {\n return 'HicRenderer'\n },\n /**\n * #method\n */\n renderProps() {\n const config = self.rendererType.configSchema.create(\n {\n ...getConf(self, 'renderer'),\n\n // add specific jexl color callback when using pre-defined color schemes\n ...(self.colorScheme\n ? { color: 'jexl:interpolate(count,scale)' }\n : {}),\n },\n getEnv(self),\n )\n\n return {\n ...superRenderProps(),\n config,\n rpcDriverName: self.rpcDriverName,\n displayModel: self,\n resolution: self.resolution,\n useLogScale: self.useLogScale,\n colorScheme: self.colorScheme,\n }\n },\n }\n })\n .actions(self => ({\n /**\n * #action\n */\n setResolution(n: number) {\n self.resolution = n\n },\n /**\n * #action\n */\n setUseLogScale(f: boolean) {\n self.useLogScale = f\n },\n /**\n * #action\n */\n setColorScheme(f?: string) {\n self.colorScheme = f\n },\n }))\n .views(self => {\n const { trackMenuItems: superTrackMenuItems } = self\n return {\n /**\n * #getter\n */\n trackMenuItems() {\n return [\n ...superTrackMenuItems(),\n {\n label: 'Use log scale',\n type: 'checkbox',\n checked: self.useLogScale,\n onClick: () => {\n self.setUseLogScale(!self.useLogScale)\n },\n },\n {\n label: 'Color scheme',\n type: 'subMenu',\n subMenu: [\n {\n label: 'Fall',\n onClick: () => {\n self.setColorScheme('fall')\n },\n },\n {\n label: 'Viridis',\n onClick: () => {\n self.setColorScheme('viridis')\n },\n },\n {\n label: 'Juicebox',\n onClick: () => {\n self.setColorScheme('juicebox')\n },\n },\n {\n label: 'Clear',\n onClick: () => {\n self.setColorScheme(undefined)\n },\n },\n ],\n },\n {\n label: 'Resolution',\n subMenu: [\n {\n label: 'Finer resolution',\n onClick: () => {\n self.setResolution(self.resolution * 2)\n },\n },\n {\n label: 'Coarser resolution',\n onClick: () => {\n self.setResolution(self.resolution / 2)\n },\n },\n ],\n },\n ]\n },\n }\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config HicAdapter\n * #category adapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst HicAdapter = ConfigurationSchema(\n 'HicAdapter',\n {\n /**\n * #slot\n */\n hicLocation: {\n type: 'fileLocation',\n defaultValue: {\n uri: '/path/to/my.hic',\n locationType: 'UriLocation',\n },\n },\n },\n { explicitlyTyped: true },\n)\n\nexport default HicAdapter\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { FileLocation } from '@jbrowse/core/util/types'\nimport { colord, Colord } from '@jbrowse/core/util/colord'\nimport {\n getFileName,\n AdapterGuesser,\n TrackTypeGuesser,\n} from '@jbrowse/core/util/tracks'\n\n// locals\nimport HicRendererF from './HicRenderer'\nimport HicTrackF from './HicTrack'\nimport LinearHicDisplayF from './LinearHicDisplay'\nimport HicAdapterF from './HicAdapter'\n\nexport default class HicPlugin extends Plugin {\n name = 'HicPlugin'\n\n install(pluginManager: PluginManager) {\n HicAdapterF(pluginManager)\n HicRendererF(pluginManager)\n HicTrackF(pluginManager)\n LinearHicDisplayF(pluginManager)\n\n pluginManager.addToExtensionPoint(\n 'Core-guessAdapterForLocation',\n (adapterGuesser: AdapterGuesser) => {\n return (\n file: FileLocation,\n index?: FileLocation,\n adapterHint?: string,\n ) => {\n const regexGuess = /\\.hic/i\n const adapterName = 'HicAdapter'\n const fileName = getFileName(file)\n const obj = {\n type: adapterName,\n hicLocation: file,\n }\n\n if (regexGuess.test(fileName) && !adapterHint) {\n return obj\n } else if (adapterHint === adapterName) {\n return obj\n } else {\n return adapterGuesser(file, index, adapterHint)\n }\n }\n },\n )\n pluginManager.addToExtensionPoint(\n 'Core-guessTrackTypeForLocation',\n (trackTypeGuesser: TrackTypeGuesser) => {\n return (adapterName: string) =>\n adapterName === 'HicAdapter'\n ? 'HicTrack'\n : trackTypeGuesser(adapterName)\n },\n )\n }\n\n configure(pluginManager: PluginManager) {\n const { jexl } = pluginManager\n jexl.addFunction('alpha', (color: Colord, n: number) => color.alpha(n))\n jexl.addFunction('hsl', (color: Colord) => colord(color.toHsl()))\n jexl.addFunction('colorString', (color: Colord) => color.toHex())\n jexl.addFunction(\n 'interpolate',\n (count: number, scale: (n: number) => string) => scale(count),\n )\n }\n}\n","import { AdapterType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './configSchema'\n\nexport default function HicAdapterF(pluginManager: PluginManager) {\n pluginManager.addAdapterType(\n () =>\n new AdapterType({\n name: 'HicAdapter',\n displayName: 'Hi-C adapter',\n configSchema,\n getAdapterClass: () => import('./HicAdapter').then(r => r.default),\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\n\nimport ReactComponent from './components/HicRendering'\nimport configSchema from './configSchema'\nimport HicRenderer from './HicRenderer'\n\nexport default function HicRendererF(pluginManager: PluginManager) {\n pluginManager.addRendererType(\n () =>\n new HicRenderer({\n name: 'HicRenderer',\n ReactComponent,\n configSchema,\n pluginManager,\n }),\n )\n}\n","import PluginManager from '@jbrowse/core/PluginManager'\nimport TrackType from '@jbrowse/core/pluggableElementTypes/TrackType'\nimport { createBaseTrackModel } from '@jbrowse/core/pluggableElementTypes/models'\nimport configSchemaF from './configSchema'\n\nexport default function HicTrackF(pluginManager: PluginManager) {\n pluginManager.addTrackType(() => {\n const configSchema = configSchemaF(pluginManager)\n return new TrackType({\n name: 'HicTrack',\n displayName: 'Hi-C track',\n configSchema,\n stateModel: createBaseTrackModel(pluginManager, 'HicTrack', configSchema),\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { createBaseTrackConfig } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config HicTrack\n * #category track\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst configSchema = (pluginManager: PluginManager) =>\n ConfigurationSchema(\n 'HicTrack',\n {},\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: createBaseTrackConfig(pluginManager),\n },\n )\n\nexport default configSchema\n","import { DisplayType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { BaseLinearDisplayComponent } from '@jbrowse/plugin-linear-genome-view'\n\nimport configSchemaFactory from './configSchema'\nimport stateModelFactory from './model'\n\nexport default function LinearHicDisplayF(pluginManager: PluginManager) {\n pluginManager.addDisplayType(() => {\n const configSchema = configSchemaFactory(pluginManager)\n return new DisplayType({\n name: 'LinearHicDisplay',\n displayName: 'Hi-C contact matrix display',\n configSchema,\n stateModel: stateModelFactory(configSchema),\n trackType: 'HicTrack',\n viewType: 'LinearGenomeView',\n ReactComponent: BaseLinearDisplayComponent,\n })\n })\n}\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { baseLinearDisplayConfigSchema } from '@jbrowse/plugin-linear-genome-view'\nimport { Instance } from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n/**\n * #config LinearHicDisplay\n * #category display\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst HicTrackConfigFactory = (pluginManager: PluginManager) => {\n return ConfigurationSchema(\n 'LinearHicDisplay',\n {\n /**\n * #slot\n */\n renderer: pluginManager.getRendererType('HicRenderer')!.configSchema,\n },\n {\n /**\n * #baseConfiguration\n */\n baseConfiguration: baseLinearDisplayConfigSchema,\n explicitlyTyped: true,\n },\n )\n}\n\nexport type HicTrackConfigModel = ReturnType<typeof HicTrackConfigFactory>\nexport type HicTrackConfig = Instance<HicTrackConfigModel>\nexport default HicTrackConfigFactory\n","import { ConfigurationSchema } from '@jbrowse/core/configuration'\n\n/**\n * #config TrixTextSearchAdapter\n */\nfunction x() {} // eslint-disable-line @typescript-eslint/no-unused-vars\n\nconst TrixTextSearchAdapter = ConfigurationSchema(\n 'TrixTextSearchAdapter',\n {\n /**\n * #slot\n */\n ixFilePath: {\n type: 'fileLocation',\n defaultValue: { uri: 'out.ix', locationType: 'UriLocation' },\n description: 'the location of the trix ix file',\n },\n /**\n * #slot\n */\n ixxFilePath: {\n type: 'fileLocation',\n defaultValue: { uri: 'out.ixx', locationType: 'UriLocation' },\n description: 'the location of the trix ixx file',\n },\n /**\n * #slot\n */\n metaFilePath: {\n type: 'fileLocation',\n defaultValue: { uri: 'meta.json', locationType: 'UriLocation' },\n description: 'the location of the metadata json file for the trix index',\n },\n /**\n * #slot\n */\n tracks: {\n type: 'stringArray',\n defaultValue: [],\n description: 'List of tracks covered by text search adapter',\n },\n /**\n * #slot\n */\n assemblyNames: {\n type: 'stringArray',\n defaultValue: [],\n description: 'List of assemblies covered by text search adapter',\n },\n },\n {\n explicitlyTyped: true,\n /**\n * #identifier\n */\n explicitIdentifier: 'textSearchAdapterId',\n },\n)\n\nexport default TrixTextSearchAdapter\n","import TextSearchAdapterType from '@jbrowse/core/pluggableElementTypes/TextSearchAdapterType'\nimport Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport configSchema from './TrixTextSearchAdapter/configSchema'\n\nexport default class TrixPlugin extends Plugin {\n name = 'TrixPlugin'\n\n install(pluginManager: PluginManager) {\n pluginManager.addTextSearchAdapterType(() => {\n return new TextSearchAdapterType({\n name: 'TrixTextSearchAdapter',\n displayName: 'Trix text search adapter',\n configSchema,\n description: 'Trix text search adapter',\n getAdapterClass: () =>\n import('./TrixTextSearchAdapter/TrixTextSearchAdapter').then(\n d => d.default,\n ),\n })\n })\n }\n}\n","import {\n types,\n cast,\n Instance,\n SnapshotIn,\n IMSTArray,\n addDisposer,\n} from 'mobx-state-tree'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { Region } from '@jbrowse/core/util/types'\nimport { Region as RegionModel, ElementId } from '@jbrowse/core/util/types/mst'\nimport { LinearGenomeViewModel } from '@jbrowse/plugin-linear-genome-view'\n\nimport {\n getSession,\n localStorageGetItem,\n localStorageSetItem,\n} from '@jbrowse/core/util'\nimport { autorun } from 'mobx'\n\nconst LabeledRegionModel = types\n .compose(\n RegionModel,\n types.model('Label', {\n label: types.optional(types.string, ''),\n highlight: types.optional(types.string, 'rgba(247, 129, 192, 0.35)'),\n }),\n )\n .actions(self => ({\n setLabel(label: string) {\n self.label = label\n },\n setHighlight(color: string) {\n self.highlight = color\n },\n }))\n\nconst SharedBookmarksModel = types.model('SharedBookmarksModel', {\n sharedBookmarks: types.maybe(types.array(LabeledRegionModel)),\n})\n\nexport interface IExtendedLGV extends LinearGenomeViewModel {\n showBookmarkHighlights: boolean\n showBookmarkLabels: boolean\n toggleShowBookmarkHighlights: (arg: boolean) => void\n toggleShowBookmarkLabels: (arg: boolean) => void\n}\n\nexport interface ILabeledRegionModel\n extends SnapshotIn<typeof LabeledRegionModel> {\n refName: string\n start: number\n end: number\n reversed: boolean\n highlight: string\n assemblyName: string\n label: string\n setRefName: (newRefName: string) => void\n setLabel: (label: string) => void\n setHighlight: (color: string) => void\n}\n\nexport interface IExtendedLabeledRegionModel extends ILabeledRegionModel {\n id: number\n correspondingObj: ILabeledRegionModel\n}\n\nconst localStorageKeyF = () =>\n typeof window !== 'undefined'\n ? `bookmarks-${[window.location.host + window.location.pathname].join('-')}`\n : 'empty'\n\n/**\n * #stateModel GridBookmarkWidgetModel\n */\nexport default function f(_pluginManager: PluginManager) {\n return types\n .model('GridBookmarkModel', {\n /**\n * #property\n */\n id: ElementId,\n /**\n * #property\n */\n type: types.literal('GridBookmarkWidget'),\n /**\n * #property\n * removed by postProcessSnapshot, only loaded from localStorage\n */\n bookmarks: types.optional(types.array(LabeledRegionModel), () =>\n JSON.parse(localStorageGetItem(localStorageKeyF()) || '[]'),\n ),\n })\n .volatile(() => ({\n selectedBookmarks: [] as IExtendedLabeledRegionModel[],\n selectedAssembliesPre: undefined as string[] | undefined,\n }))\n .views(self => ({\n /**\n * #getter\n */\n get bookmarkAssemblies() {\n return [...new Set(self.bookmarks.map(r => r.assemblyName))]\n },\n /**\n * #getter\n */\n get validAssemblies() {\n const { assemblyManager } = getSession(self)\n return new Set(\n this.bookmarkAssemblies.filter(a => assemblyManager.get(a)),\n )\n },\n /**\n * #getter\n */\n get areBookmarksHighlightedOnAllOpenViews() {\n const { views } = getSession(self)\n return views.every(v =>\n 'showBookmarkHighlights' in v ? v.showBookmarkHighlights : true,\n )\n },\n /**\n * #getter\n */\n get areBookmarksHighlightLabelsOnAllOpenViews() {\n const { views } = getSession(self)\n return views.every(v =>\n 'showBookmarkLabels' in v ? v.showBookmarkLabels : true,\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get bookmarksWithValidAssemblies() {\n return self.bookmarks.filter(e =>\n self.validAssemblies.has(e.assemblyName),\n )\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get sharedBookmarksModel() {\n // requires cloning bookmarks with JSON.stringify/parse to avoid duplicate\n // reference to same object in the same state tree, will otherwise error\n // when performing share\n return SharedBookmarksModel.create({\n sharedBookmarks: JSON.parse(JSON.stringify(self.selectedBookmarks)),\n })\n },\n /**\n * #getter\n */\n get allBookmarksModel() {\n // requires cloning bookmarks with JSON.stringify/parse to avoid duplicate\n // reference to same object in the same state tree, will otherwise error\n // when performing share\n return SharedBookmarksModel.create({\n sharedBookmarks: JSON.parse(\n JSON.stringify(self.bookmarksWithValidAssemblies),\n ),\n })\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n setSelectedAssemblies(assemblies?: string[]) {\n self.selectedAssembliesPre = assemblies\n },\n }))\n .views(self => ({\n /**\n * #getter\n */\n get selectedAssemblies() {\n return (\n self.selectedAssembliesPre?.filter(f =>\n self.validAssemblies.has(f),\n ) ?? [...self.validAssemblies]\n )\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n importBookmarks(regions: Region[]) {\n self.bookmarks = cast([...self.bookmarks, ...regions])\n },\n /**\n * #action\n */\n addBookmark(region: Region) {\n self.bookmarks.push(region)\n },\n /**\n * #action\n */\n removeBookmark(index: number) {\n self.bookmarks.splice(index, 1)\n },\n /**\n * #action\n */\n updateBookmarkLabel(\n bookmark: IExtendedLabeledRegionModel,\n label: string,\n ) {\n bookmark.correspondingObj.setLabel(label)\n },\n /**\n * #action\n */\n updateBookmarkHighlight(\n bookmark: IExtendedLabeledRegionModel,\n color: string,\n ) {\n bookmark.correspondingObj.setHighlight(color)\n },\n /**\n * #action\n */\n updateBulkBookmarkHighlights(color: string) {\n self.selectedBookmarks.forEach(bookmark => {\n this.updateBookmarkHighlight(bookmark, color)\n })\n },\n /**\n * #action\n */\n setSelectedBookmarks(bookmarks: IExtendedLabeledRegionModel[]) {\n self.selectedBookmarks = bookmarks\n },\n /**\n * #action\n */\n setBookmarkedRegions(regions: IMSTArray<typeof LabeledRegionModel>) {\n self.bookmarks = cast(regions)\n },\n /**\n * #action\n */\n setHighlightToggle(toggle: boolean) {\n const { views } = getSession(self)\n views.forEach(view => {\n // @ts-expect-error\n view.toggleShowBookmarkHighlights?.(toggle)\n })\n },\n /**\n * #action\n */\n setLabelToggle(toggle: boolean) {\n const { views } = getSession(self)\n views.forEach(view => {\n // @ts-expect-error\n view.toggleShowBookmarkLabels?.(toggle)\n })\n },\n }))\n .actions(self => ({\n /**\n * #action\n */\n clearAllBookmarks() {\n self.setBookmarkedRegions(\n self.bookmarks.filter(\n bookmark => !self.validAssemblies.has(bookmark.assemblyName),\n ) as IMSTArray<typeof LabeledRegionModel>,\n )\n },\n /**\n * #action\n */\n clearSelectedBookmarks() {\n for (const bookmark of self.selectedBookmarks) {\n self.bookmarks.remove(bookmark.correspondingObj)\n }\n self.selectedBookmarks = []\n },\n\n removeBookmarkObject(arg: Instance<typeof LabeledRegionModel>) {\n self.bookmarks.remove(arg)\n },\n }))\n .actions(self => ({\n afterAttach() {\n const key = localStorageKeyF()\n function handler(e: StorageEvent) {\n if (e.key === key) {\n const localStorage = JSON.parse(localStorageGetItem(key) || '[]')\n self.setBookmarkedRegions(localStorage)\n }\n }\n window.addEventListener('storage', handler)\n addDisposer(self, () => {\n window.removeEventListener('storage', handler)\n })\n addDisposer(\n self,\n autorun(() => {\n localStorageSetItem(key, JSON.stringify(self.bookmarks))\n }),\n )\n },\n }))\n .postProcessSnapshot(snap => {\n const { bookmarks: _, ...rest } = snap as Omit<typeof snap, symbol>\n return rest\n })\n}\n\nexport type GridBookmarkStateModel = ReturnType<typeof f>\nexport type GridBookmarkModel = Instance<GridBookmarkStateModel>\n","import React, { useEffect } from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { SessionWithWidgets, getSession, notEmpty } from '@jbrowse/core/util'\nimport { colord } from '@jbrowse/core/util/colord'\nimport { Tooltip } from '@mui/material'\nimport CascadingMenuButton from '@jbrowse/core/ui/CascadingMenuButton'\n\n// icons\nimport BookmarkIcon from '@mui/icons-material/Bookmark'\n\n// locals\nimport { GridBookmarkModel } from '../../model'\nimport { IExtendedLGV } from '../../model'\n\ntype LGV = IExtendedLGV\n\nconst useStyles = makeStyles()({\n highlight: {\n // when the highlight is small, overflow:hidden makes the icon/indicators\n // invisible\n overflow: 'hidden',\n height: '100%',\n position: 'absolute',\n zIndex: 100,\n pointerEvents: 'none',\n },\n highlightButton: {\n // re-enable pointerEvents on the button\n pointerEvents: 'auto',\n },\n})\n\nconst Highlight = observer(function Highlight({ model }: { model: LGV }) {\n const { classes } = useStyles()\n const session = getSession(model) as SessionWithWidgets\n const { assemblyManager } = session\n const { showBookmarkHighlights, showBookmarkLabels } = model\n\n const bookmarkWidget = session.widgets.get('GridBookmark') as\n | GridBookmarkModel\n | undefined\n\n useEffect(() => {\n if (!bookmarkWidget) {\n session.addWidget('GridBookmarkWidget', 'GridBookmark')\n }\n }, [session, bookmarkWidget])\n\n const set = new Set(model.assemblyNames)\n\n return showBookmarkHighlights && bookmarkWidget?.bookmarks\n ? bookmarkWidget.bookmarks\n .filter(value => set.has(value.assemblyName))\n .map(r => {\n const asm = assemblyManager.get(r.assemblyName)\n const refName = asm?.getCanonicalRefName(r.refName) ?? r.refName\n const s = model.bpToPx({ refName, coord: r.start })\n const e = model.bpToPx({ refName, coord: r.end })\n return s && e\n ? {\n width: Math.max(Math.abs(e.offsetPx - s.offsetPx), 3),\n left: Math.min(s.offsetPx, e.offsetPx) - model.offsetPx,\n highlight: r.highlight,\n label: r.label,\n bookmark: r,\n }\n : undefined\n })\n .filter(notEmpty)\n .map(({ left, width, highlight, label, bookmark }, idx) => (\n <div\n /* biome-ignore lint/suspicious/noArrayIndexKey: */\n key={`${left}_${width}_${idx}`}\n className={classes.highlight}\n style={{\n left,\n width,\n background: highlight,\n }}\n >\n {showBookmarkLabels ? (\n <div className={classes.highlightButton}>\n <CascadingMenuButton\n menuItems={[\n {\n label: 'Open bookmark widget',\n onClick: () => {\n session.showWidget(bookmarkWidget)\n },\n },\n {\n label: 'Remove bookmark',\n onClick: () => {\n bookmarkWidget.removeBookmarkObject(bookmark)\n },\n },\n ]}\n >\n <Tooltip title={label} arrow>\n <BookmarkIcon\n fontSize=\"small\"\n sx={{\n color:\n colord(highlight).alpha() !== 0\n ? colord(highlight).alpha(0.8).toRgbString()\n : colord(highlight).alpha(0).toRgbString(),\n }}\n />\n </Tooltip>\n </CascadingMenuButton>\n </div>\n ) : null}\n </div>\n ))\n : null\n})\n\nexport default Highlight\n","import React, { useEffect } from 'react'\nimport { observer } from 'mobx-react'\nimport { makeStyles } from 'tss-react/mui'\nimport { SessionWithWidgets, getSession, notEmpty } from '@jbrowse/core/util'\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\nimport { Tooltip } from '@mui/material'\n\n// locals\nimport { GridBookmarkModel } from '../../model'\nimport { IExtendedLGV } from '../../model'\n\ntype LGV = IExtendedLGV\n\nconst useStyles = makeStyles()({\n highlight: {\n height: '100%',\n position: 'absolute',\n },\n})\n\nconst OverviewHighlight = observer(function OverviewHighlight({\n model,\n overview,\n}: {\n model: LGV\n overview: Base1DViewModel\n}) {\n const { cytobandOffset } = model\n const session = getSession(model) as SessionWithWidgets\n const { classes } = useStyles()\n const { assemblyManager } = session\n const { showBookmarkHighlights, showBookmarkLabels } = model\n const bookmarkWidget = session.widgets.get('GridBookmark') as\n | GridBookmarkModel\n | undefined\n\n useEffect(() => {\n if (!bookmarkWidget) {\n session.addWidget('GridBookmarkWidget', 'GridBookmark')\n }\n }, [session, bookmarkWidget])\n\n const assemblyNames = new Set(model.assemblyNames)\n return showBookmarkHighlights && bookmarkWidget?.bookmarks\n ? bookmarkWidget.bookmarks\n .filter(r => assemblyNames.has(r.assemblyName))\n .map(r => {\n const asm = assemblyManager.get(r.assemblyName)\n const refName = asm?.getCanonicalRefName(r.refName) ?? r.refName\n const rev = r.reversed\n const s = overview.bpToPx({ refName, coord: rev ? r.end : r.start })\n const e = overview.bpToPx({ refName, coord: rev ? r.start : r.end })\n return s !== undefined && e !== undefined\n ? {\n width: Math.abs(e - s),\n left: s + cytobandOffset,\n highlight: r.highlight,\n label: r.label,\n }\n : undefined\n })\n .filter(notEmpty)\n .map((obj, idx) => {\n const { left, width, highlight, label } = obj\n return (\n <Tooltip\n key={`${JSON.stringify(obj)}-${idx}`}\n title={showBookmarkLabels ? label : ''}\n arrow\n >\n <div\n className={classes.highlight}\n style={{\n left,\n width,\n background: highlight,\n borderLeft: `1px solid ${highlight}`,\n borderRight: `1px solid ${highlight}`,\n }}\n />\n </Tooltip>\n )\n })\n : null\n})\n\nexport default OverviewHighlight\n","import { lazy } from 'react'\nimport { ConfigurationSchema } from '@jbrowse/core/configuration'\nimport { WidgetType } from '@jbrowse/core/pluggableElementTypes'\nimport PluginManager from '@jbrowse/core/PluginManager'\n\n// locals\nimport stateModelFactory from './model'\nimport AddHighlightModelF from './components/Highlight'\n\nconst configSchema = ConfigurationSchema('GridBookmarkWidget', {})\n\nexport default function GridBookmarkWidgetF(pluginManager: PluginManager) {\n pluginManager.addWidgetType(() => {\n return new WidgetType({\n name: 'GridBookmarkWidget',\n heading: 'Bookmarked regions',\n configSchema,\n stateModel: stateModelFactory(pluginManager),\n ReactComponent: lazy(() => import('./components/GridBookmarkWidget')),\n })\n })\n AddHighlightModelF(pluginManager)\n}\n","import Plugin from '@jbrowse/core/Plugin'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { LinearGenomeViewStateModel } from '@jbrowse/plugin-linear-genome-view'\nimport {\n SessionWithWidgets,\n getSession,\n isAbstractMenuManager,\n isSessionModelWithWidgets,\n} from '@jbrowse/core/util'\nimport {\n PluggableElementType,\n ViewType,\n} from '@jbrowse/core/pluggableElementTypes'\n\n// icons\nimport BookmarkIcon from '@mui/icons-material/Bookmark'\nimport BookmarksIcon from '@mui/icons-material/Bookmarks'\nimport HighlightIcon from '@mui/icons-material/Highlight'\nimport LabelIcon from '@mui/icons-material/Label'\n\nimport GridBookmarkWidgetF from './GridBookmarkWidget'\nimport { GridBookmarkModel } from './GridBookmarkWidget/model'\n\nexport default class GridBookmarkPlugin extends Plugin {\n name = 'GridBookmarkPlugin'\n\n install(pluginManager: PluginManager) {\n GridBookmarkWidgetF(pluginManager)\n\n pluginManager.addToExtensionPoint(\n 'Core-extendPluggableElement',\n (pluggableElement: PluggableElementType) => {\n if (pluggableElement.name === 'LinearGenomeView') {\n const { stateModel } = pluggableElement as ViewType\n const lgv = stateModel as LinearGenomeViewStateModel\n const newStateModel = lgv\n .props({\n /**\n * #property\n * show the bookmark highlights on this track\n */\n showBookmarkHighlights: true,\n /**\n * #property\n * show the bookmark labels on this track\n */\n showBookmarkLabels: true,\n })\n .actions(self => ({\n /**\n * #action\n */\n toggleShowBookmarkHighlights(toggle?: boolean) {\n self.showBookmarkHighlights =\n toggle !== undefined ? toggle : !self.showBookmarkHighlights\n },\n /**\n * #action\n */\n toggleShowBookmarkLabels(toggle?: boolean) {\n self.showBookmarkLabels =\n toggle !== undefined ? toggle : !self.showBookmarkLabels\n },\n activateBookmarkWidget() {\n const session = getSession(self)\n if (isSessionModelWithWidgets(session)) {\n let bookmarkWidget = session.widgets.get('GridBookmark')\n if (!bookmarkWidget) {\n bookmarkWidget = session.addWidget(\n 'GridBookmarkWidget',\n 'GridBookmark',\n )\n }\n\n session.showWidget(bookmarkWidget)\n return session.widgets.get(\n 'GridBookmark',\n ) as GridBookmarkModel\n }\n\n throw new Error('Could not open bookmark widget')\n },\n }))\n .actions(self => ({\n navigateNewestBookmark() {\n const session = getSession(self)\n const bookmarkWidget = self.activateBookmarkWidget()\n if (bookmarkWidget.bookmarks.length) {\n self.navTo(bookmarkWidget.bookmarks.at(-1)!)\n } else {\n session.notify(\n 'There are no recent bookmarks to navigate to.',\n 'info',\n )\n }\n },\n\n bookmarkCurrentRegion() {\n if (self.id === getSession(self).focusedViewId) {\n const selectedRegions = self.getSelectedRegions(\n undefined,\n undefined,\n )\n const bookmarkWidget = self.activateBookmarkWidget()\n if (!selectedRegions.length) {\n throw new Error('no region selected')\n } else {\n bookmarkWidget.addBookmark(selectedRegions[0]!)\n }\n }\n },\n }))\n .views(self => {\n const superMenuItems = self.menuItems\n const superRubberBandMenuItems = self.rubberBandMenuItems\n return {\n menuItems() {\n return [\n ...superMenuItems(),\n { type: 'divider' },\n {\n label: 'Bookmarks',\n icon: BookmarksIcon,\n subMenu: [\n {\n label: 'Open bookmark widget',\n icon: BookmarksIcon,\n onClick: () => self.activateBookmarkWidget(),\n },\n {\n label: 'Bookmark current region',\n icon: BookmarkIcon,\n onClick: () => {\n self.bookmarkCurrentRegion()\n },\n },\n {\n label: 'Toggle bookmark highlights',\n icon: HighlightIcon,\n type: 'checkbox',\n checked: self.showBookmarkHighlights,\n onClick: () => {\n self.toggleShowBookmarkHighlights()\n },\n },\n {\n label: 'Toggle bookmark labels',\n icon: LabelIcon,\n type: 'checkbox',\n checked: self.showBookmarkLabels,\n onClick: () => {\n self.toggleShowBookmarkLabels()\n },\n },\n ],\n },\n ]\n },\n\n rubberBandMenuItems() {\n return [\n ...superRubberBandMenuItems(),\n {\n label: 'Bookmark region',\n icon: BookmarkIcon,\n onClick: () => {\n const { leftOffset, rightOffset } = self\n const selectedRegions = self.getSelectedRegions(\n leftOffset,\n rightOffset,\n )\n const bookmarkWidget = self.activateBookmarkWidget()\n if (!selectedRegions.length) {\n throw new Error('no regions selected')\n } else {\n bookmarkWidget.addBookmark(selectedRegions[0]!)\n }\n },\n },\n ]\n },\n }\n })\n .actions(self => ({\n afterCreate() {\n document.addEventListener('keydown', e => {\n const activationSequence =\n (e.ctrlKey || e.metaKey) && e.shiftKey\n // ctrl+shift+d or cmd+shift+d\n if (activationSequence && e.code === 'KeyD') {\n e.preventDefault()\n self.activateBookmarkWidget()\n self.bookmarkCurrentRegion()\n getSession(self).notify('Bookmark created.', 'success')\n }\n // ctrl+shift+m or cmd+shift+m\n if (activationSequence && e.code === 'KeyM') {\n e.preventDefault()\n self.navigateNewestBookmark()\n }\n })\n },\n }))\n\n ;(pluggableElement as ViewType).stateModel = newStateModel\n }\n return pluggableElement\n },\n )\n }\n\n configure(pluginManager: PluginManager) {\n if (isAbstractMenuManager(pluginManager.rootModel)) {\n pluginManager.rootModel.appendToMenu('Tools', {\n label: 'Bookmarks',\n icon: BookmarksIcon,\n onClick: (session: SessionWithWidgets) => {\n let bookmarkWidget = session.widgets.get('GridBookmark')\n if (!bookmarkWidget) {\n bookmarkWidget = session.addWidget(\n 'GridBookmarkWidget',\n 'GridBookmark',\n )\n }\n session.showWidget(bookmarkWidget)\n },\n })\n }\n }\n}\n","import React from 'react'\nimport PluginManager from '@jbrowse/core/PluginManager'\nimport { Base1DViewModel } from '@jbrowse/core/util/Base1DViewModel'\n\n// locals\nimport Highlight from './Highlight'\nimport OverviewHighlight from './OverviewHighlight'\nimport { IExtendedLGV } from '../../model'\n\nexport default function AddHighlightModelF(pluginManager: PluginManager) {\n pluginManager.addToExtensionPoint(\n 'LinearGenomeView-TracksContainerComponent',\n // @ts-expect-error\n (\n rest: React.ReactNode[] | undefined,\n { model }: { model: IExtendedLGV },\n ) => {\n return [\n ...(rest || []),\n <Highlight key=\"highlight_grid_bookmark\" model={model} />,\n ]\n },\n )\n pluginManager.addToExtensionPoint(\n 'LinearGenomeView-OverviewScalebarComponent',\n // @ts-expect-error\n (\n rest: React.ReactNode[] | undefined,\n { model, overview }: { model: IExtendedLGV; overview: Base1DViewModel },\n ) => {\n return [\n ...(rest || []),\n <OverviewHighlight\n key=\"overview_highlight_grid_bookmark\"\n model={model}\n overview={overview}\n />,\n ]\n },\n )\n}\n","import Alignments from '@jbrowse/plugin-alignments'\nimport Authentication from '@jbrowse/plugin-authentication'\nimport Bed from '@jbrowse/plugin-bed'\nimport BreakpointSplitView from '@jbrowse/plugin-breakpoint-split-view'\nimport CircularView from '@jbrowse/plugin-circular-view'\nimport Config from '@jbrowse/plugin-config'\nimport ComparativeAdapters from '@jbrowse/plugin-comparative-adapters'\nimport DataManagement from '@jbrowse/plugin-data-management'\nimport DotplotView from '@jbrowse/plugin-dotplot-view'\nimport GtfPlugin from '@jbrowse/plugin-gtf'\nimport Gff3 from '@jbrowse/plugin-gff3'\nimport JobsManagementPlugin from '@jbrowse/plugin-jobs-management'\nimport LegacyJBrowse from '@jbrowse/plugin-legacy-jbrowse'\nimport LinearGenomeView from '@jbrowse/plugin-linear-genome-view'\nimport LinearComparativeView from '@jbrowse/plugin-linear-comparative-view'\nimport Lollipop from '@jbrowse/plugin-lollipop'\nimport Arc from '@jbrowse/plugin-arc'\nimport Menus from '@jbrowse/plugin-menus'\nimport RDF from '@jbrowse/plugin-rdf'\nimport Sequence from '@jbrowse/plugin-sequence'\nimport SVG from '@jbrowse/plugin-svg'\nimport Variants from '@jbrowse/plugin-variants'\nimport Wiggle from '@jbrowse/plugin-wiggle'\nimport GCContent from '@jbrowse/plugin-gccontent'\nimport SpreadsheetViewPlugin from '@jbrowse/plugin-spreadsheet-view'\nimport SvInspectorPlugin from '@jbrowse/plugin-sv-inspector'\nimport HicPlugin from '@jbrowse/plugin-hic'\nimport TrixPlugin from '@jbrowse/plugin-trix'\nimport GridBookmarkPlugin from '@jbrowse/plugin-grid-bookmark'\n\nconst corePlugins = [\n SVG,\n LinearGenomeView,\n Alignments,\n Authentication,\n Bed,\n CircularView,\n Config,\n DataManagement,\n DotplotView,\n GtfPlugin,\n Gff3,\n JobsManagementPlugin,\n LegacyJBrowse,\n LinearComparativeView,\n Lollipop,\n Menus,\n RDF,\n Sequence,\n Variants,\n Wiggle,\n GCContent,\n SpreadsheetViewPlugin,\n SvInspectorPlugin,\n BreakpointSplitView,\n HicPlugin,\n TrixPlugin,\n GridBookmarkPlugin,\n ComparativeAdapters,\n Arc,\n]\n\nexport default corePlugins\n"],"names":["configSchema","ConfigurationSchema","localStorageGetNumber","key","defaultVal","localStorageGetItem","formatSubfeatures","obj","depth","parse","currentDepth","returnObj","subfeatures","map","sub","stateModelFactory","pluginManager","types","model","id","ElementId","type","literal","featureData","frozen","formattedFields","unformattedFeatureData","view","safeReference","pluggableMstType","track","trackId","maybe","string","trackType","maxDepth","number","sequenceFeatureDetails","optional","volatile","showCoordinatesSetting","intronBp","upDownBp","upperCaseCDS","Boolean","JSON","charactersPerRow","feature","undefined","mode","actions","self","setFeature","f","setUpDownBp","setIntronBp","setUpperCaseCDS","setShowCoordinates","setMode","views","showCoordinates","showGenomicCoordsOption","hasCDS","some","hasExon","hasExonOrCDS","this","afterAttach","addDisposer","autorun","localStorageSetItem","stringify","error","setFeatureData","clearFeatureData","setFormattedData","feat","setExtra","setError","e","afterCreate","session","getSession","configuration","getConf","clone","combine","arg2","__jbrowsefmt","console","preProcessSnapshot","snap","finalizedFeatureData","rest","postProcessSnapshot","_","v","Plugin","install","_pluginManager","configure","CoreGetRefNames","RpcMethodType","name","execute","args","rpcDriver","pm","deserializedArgs","deserializeArguments","sessionId","adapterConfig","dataAdapter","getAdapter","isFeatureAdapter","getRefNames","CoreGetFeatureDetails","serializeArguments","rootModel","assemblyManager","renamedArgs","renameRegionsIfNeeded","superArgs","super","rendererType","getRendererType","serializeArgsInClient","featureId","RendererType","sessions","getLayoutId","cachedLayout","layout","getDataByID","toJSON","CoreGetMetadata","getMetadata","CoreGetFileInfo","getHeader","CoreGetFeatures","deserializeReturn","feats","SimpleFeature","signal","regions","opts","Error","ret","getFeaturesInMultipleRegions","firstValueFrom","pipe","toArray","validateRendererType","ReactComponent","CoreRender","checkAbortSignal","result","render","renderInWorker","serializedReturn","des","deserializeResultsInClient","CoreFreeResources","specification","deleteCount","freeAdapterResources","getRendererTypes","forEach","renderer","count","freeResources","_rpcDriver","CoreGetFeatureDensityStats","filters","getMultiRegionFeatureDensityStats","cytobandLocation","defaultValue","uri","explicitlyTyped","CorePlugin","Object","values","coreRpcMethods","RpcMethod","addRpcMethod","addAdapterType","AdapterType","getAdapterClass","then","default","CytobandAdapterF","addWidgetType","WidgetType","heading","stateModel","lazy","PhasedScheduler","phaseCallbacks","Map","phaseOrder","constructor","add","phase","callback","includes","get","set","push","run","phaseName","TypeRecord","registeredTypes","typeName","baseClass","t","has","all","PluginManager","plugins","jexl","createJexlInstance","pluginMetadata","runtimePluginDefinitions","elementCreationSchedule","rendererTypes","adapterTypes","textSearchAdapterTypes","TextSearchAdapterType","trackTypes","TrackType","displayTypes","DisplayType","connectionTypes","ConnectionType","viewTypes","ViewType","widgetTypes","rpcMethods","addTrackWidgets","AddTrackWorkflowType","internetAccountTypes","InternetAccountType","configured","extensionPoints","initialPlugins","addPlugin","plugin","metadata","isCore","pluginConfigurationSchemas","configurationSchemas","configurationSchema","load","definition","getPlugin","find","p","hasPlugin","createPluggableElements","setRootModel","getElementTypeRecord","groupName","addElementType","creationCallback","typeRecord","newElement","evaluateExtensionPoint","getElementType","getElementTypesInGroup","getTrackElements","getConnectionElements","getAddTrackWorkflowElements","getRpcElements","getDisplayElements","getAdapterElements","fieldName","fallback","null","pluggableTypes","filter","isType","isModelType","length","jest","warn","union","pluggableConfigSchemaType","typeGroup","isBareConfigurationSchemaType","jbrequireCache","lib","ReExports","jbrequire","pack","TypeError","getAdapterType","getTextSearchAdapterType","getTrackType","getDisplayType","getViewType","getAddTrackWorkflow","getWidgetType","getConnectionType","getRpcMethodType","methodName","getInternetAccountType","addRendererType","cb","addTextSearchAdapterType","addTrackType","display","addDisplayType","addViewType","newView","viewType","extendedName","addConnectionType","addInternetAccountType","addAddTrackWorkflowType","addToExtensionPoint","extensionPointName","callbacks","extendee","props","accumulator","evaluateAsyncExtensionPoint","Entries","Accordion","AccordionActions","AccordionDetails","Alert","AlertTitle","Autocomplete","Avatar","AvatarGroup","Backdrop","Badge","Box","Breadcrumbs","Button","ButtonGroup","Card","CardActions","CardActionArea","CardContent","CardHeader","CardMedia","CircularProgress","Collapse","ClickAwayListener","Chip","Checkbox","Container","Dialog","DialogActions","DialogTitle","DialogContent","DialogContentText","Divider","Drawer","Fab","Fade","FilledInput","FormLabel","FormControl","FormControlLabel","FormHelperText","FormGroup","Grid","Grow","Icon","IconButton","Input","InputBase","InputLabel","InputAdornment","Link","LinearProgress","List","ListItem","ListItemAvatar","ListItemSecondaryAction","ListItemIcon","ListSubheader","ListItemText","Menu","MenuItem","MenuList","Modal","NativeSelect","OutlinedInput","Pagination","PaginationItem","Paper","Popover","Popper","Portal","Radio","RadioGroup","Rating","ScopedCssBaseline","Select","Skeleton","Slider","Snackbar","SnackbarContent","SpeedDial","SpeedDialAction","SpeedDialIcon","Stack","Step","StepButton","StepConnector","StepLabel","StepIcon","Stepper","SvgIcon","Switch","Tab","Table","TableBody","TableCell","TableContainer","TableFooter","TableHead","TablePagination","TableRow","TableSortLabel","Tabs","TextField","TextareaAutosize","ToggleButton","ToggleButtonGroup","Toolbar","Tooltip","Typography","LazyMUICore","fromEntries","entries","Component","React","ref","Suspense","_extends","displayName","MaterialPrefixMUI","value","MuiPrefixMUI","Attributes","FeatureDetails","BaseCard","DataGridEntries","DataGrid","module","GridActionsCellItem","GridAddIcon","GridArrowDownwardIcon","GridArrowUpwardIcon","GridCellCheckboxForwardRef","GridCellCheckboxRenderer","GridCheckCircleIcon","GridCheckIcon","GridCloseIcon","GridColumnHeaderSeparator","GridColumnHeaderSortIcon","GridColumnIcon","GridColumnMenu","GridColumnMenuContainer","GridDragIcon","GridExpandMoreIcon","GridFilterAltIcon","GridFilterForm","GridFilterListIcon","GridFilterPanel","GridFooter","GridFooterContainer","GridHeader","GridHeaderCheckbox","GridKeyboardArrowRight","GridLoadIcon","GridLoadingOverlay","GridMenuIcon","GridMoreVertIcon","GridNoRowsOverlay","GridOverlay","GridPagination","GridPanel","GridPanelWrapper","GridRemoveIcon","GridRoot","GridRowCount","GridSaveAltIcon","GridSearchIcon","GridSelectedRowCount","GridSeparatorIcon","GridTableRowsIcon","GridToolbar","GridToolbarColumnsButton","GridToolbarContainer","GridToolbarDensitySelector","GridToolbarExport","GridToolbarExportContainer","GridToolbarFilterButton","GridTripleDotsVerticalIcon","GridViewHeadlineIcon","GridViewStreamIcon","LazyDataGridComponents","LazyAttributes","LazyFeatureDetails","LazyBaseCard","libs","mobx","mst","react","ReactJSXRuntime","ReactDom","mxreact","useGridApiContext","useGridApiRef","useGridRootProps","MUIUtils","makeStyles","useTheme","alpha","MUIStyles","useStyles","classes","pluggableElementTypes","pluggableElementTypeModels","ServerSideRendererType","CircularChordRendererType","BoxRendererType","FeatureRendererType","Configuration","mstTypes","coreUi","coreUtil","coreColor","coreLayouts","trackUtils","Base1DView","coreIo","coreMstReflection","rxjs","BaseAdapterExports","libsList","keys","inLibsOnly","mod","reExportsList","join","inReExportsOnly","BaseResult","label","locString","renderingComponent","displayString","matchedAttribute","matchedObject","textSearchAdapter","relevance","score","results","getLabel","getDisplayString","getRenderingComponent","getTrackId","getScore","updateScore","newScore","getId","getLocation","hasLocation","getComboResults","RefSequenceResult","refName","TextSearchManager","adapterCache","QuickLRU","maxSize","loadTextSearchAdapters","searchScope","Promise","relevantAdapters","async","adapterId","readConfObject","conf","r","adapterType","adapterInstance","aggregateTextSearchAdapters","jbrowse","tracks","assemblyName","getAdaptersWithAssembly","getTrackAdaptersWithAssembly","confs","c","textSearching","search","rankFn","adapters","a","searchIndex","sortResults","flat","sort","b","localeCompare","r1","r2","typeModels","stringArray","array","stringArrayMap","numberMap","boolean","color","refinement","integer","text","fileLocation","FileLocation","fallbackDefaults","locationType","literalJSON","valueJSON","objectJSON","typeModelExtensions","val","removeAtIndex","idx","splice","setAtIndex","remove","delete","addToKey","ar","removeAtKeyIndex","setAtKeyIndex","JexlStringType","str","startsWith","isEmptyArray","thing","Array","isArray","modelName","inputSchemaDefinition","inputOptions","schemaDefinition","options","baseConfiguration","jbrowseSchemaDefinition","jbrowseSchemaOptions","preprocessConfigurationSchemaArguments","schemaType","modelDefinition","identifier","explicitIdentifier","implicitIdentifier","volatileConstants","isJBrowseConfigurationSchema","jbrowseSchema","slotName","slotDefinition","isLateType","isConfigurationSchemaType","description","contextVariable","configSlotModelName","charAt","toUpperCase","slice","slot","isCallback","String","expr","getEnv","stringToJexlExpression","evalSync","newVal","reset","convertToCallback","convertToValue","funcResult","extend","m","defineProperty","ConfigSlot","completeModel","setSubschema","data","newSchema","isStateTreeNode","create","identifierDefault","modelDefault","defaultSnap","getSnapshot","newSnap","matchesDefault","makeConfigurationSchemaModel","ConfigurationReference","reference","confObject","slotPath","isMapType","getType","newPath","subConf","isConfigurationModel","getTypeNamesFromExplicitlyTypedUnion","maybeUnionType","resolveLateType","isUnionType","typeNames","getUnionSubTypes","getDefaultValue","every","isOptionalType","getSubType","isArrayType","isConfigurationSlotType","isSequenceAdapter","isRegionsAdapter","isRefNameAliasAdapter","isTextSearchAdapter","EmptyConfig","BaseAdapter","static","config","getSubAdapter","idMaker","arg","BaseFeatureDataAdapter","_opts","getFeaturesInRegion","region","ObservableCreate","hasData","hasDataForRefName","getFeatures","subscribe","observer","complete","merge","getRegionQuantitativeStats","scoresToStats","getMultiRegionQuantitativeStats","blankStats","scoreMax","max","scoreMin","min","scoreSum","sum","scoreSumSquares","featureCount","basesCovered","rectifyStats","getRegionFeatureDensityStats","lastTime","Date","now","statsFromInterval","expansionTime","start","end","sampleCenter","features","Math","round","maybeRecordStats","featureDensity","interval","stats","statsSampleFeatures","refLen","currTime","Number","POSITIVE_INFINITY","BaseSequenceAdapter","PluggableElementBase","stuff","AdapterClass","adapterCapabilities","adapterMetadata","AddTrackWorkflow","url","configEditorComponent","subDisplay","maybeDisplayName","isObject","isObjectCustom","RegExp","globalThis","Blob","object","mapper","isSeen","WeakSet","mapArray","element","rpcDriverClassName","blobMap","getBlobMap","augmentLocationObjects","serializeNewAuthArguments","loc","isAppRootModel","internetAccountPreAuthorization","account","findAppropriateInternetAccount","getPreAuthorizationInformation","serializedArgs","_rpcDriverClassName","setBlobMap","isRemoteAbortSignal","deserializeAbortSignal","serializeReturn","originalReturn","_args","isAuthNeededException","retryAccount","createEphemeralInternetAccount","URL","origin","RetryError","internetAccountId","uris","mapObject","isUriLocation","HeadingComponent","BaseViewModel","minimized","width","menuItems","setDisplayName","setWidth","newWidth","setMinimized","flag","displayedRegions","Region","assemblyNames","connect","_arg","addTrackConf","trackConf","addTrackConfs","trackConfs","setTrackConfs","cast","clear","BaseDisplay","rpcDriverName","rendererTypeName","message","RenderingComponent","DisplayBlurb","parentTrack","getParent","isRoot","renderProps","getParentRenderProps","notReady","getContainingView","displayModel","DisplayMessageComponent","trackMenuItems","viewMenuActions","regionCannotBeRendered","setMessage","setRpcDriverName","reload","BaseInternetAccountConfig","authHeader","tokenType","domains","inWebWorker","sessionStorage","InternetAccount","toggleContents","SelectorComponent","selectorLabel","handlesLocation","location","domain","tokenKey","getTokenFromUser","_resolve","_reject","storeToken","token","setItem","removeToken","removeItem","retrieveToken","getItem","validateToken","_loc","tokenPromise","getToken","authInfo","resolve","reject","addAuthHeaderToInit","init","headers","Headers","authToken","validatedToken","internetAccountType","getFetcher","input","newInit","fetch","openLocation","RemoteFileWithRangeCache","createBaseTrackModel","baseTrackConfig","displays","rpcSessionId","flatMap","d","canConfigure","sessionTracks","adminMode","isSessionModelWithConfigEditing","showDisplay","displayId","initialSnapshot","schema","resolveIdentifier","getRoot","displayType","hideDisplay","transaction","replaceDisplay","oldId","newId","findIndex","shownId","compatDisp","compatTypes","Set","getCompatibleDisplays","priority","subMenu","checked","onClick","createBaseTrackConfig","category","adapter","indexingAttributes","indexingFeatureTypesToExclude","formatDetails","formatAbout","hideUris","s2","configDisplayTypes","addDisplayConf","LayoutSession","bpPerPx","update","assign","makeLayout","MultiLayout","GranularRectLayout","maxHeight","displayMode","pitchX","pitchY","cachedLayoutIsValid","subLayoutConstructorArgs","deepEqual","getWorkerSession","createSession","getExpandedRegion","renderArgs","maxFeatureGlyphExpansion","bpExpansion","floor","ceil","freeResourcesInClient","rpcManager","discardRange","deserializeLayoutInClient","json","PrecomputedLayout","createLayoutInWorker","getSublayout","serializeResultsInWorker","serialized","serializeRegion","rectangles","uniqueId","maxHeightReached","NewHydrate","html","theme","useRef","rootRef","hydrateRoot","hydrateFn","useEffect","renderTimeout","rIC","current","jbrowseTheme","createJBrowseTheme","ThemeProvider","clearTimeout","root","setTimeout","unmount","dangerouslySetInnerHTML","__html","OldHydrate","domNode","innerHTML","unmountComponentAtNode","style","outline","hydrate","FeatureRenderer","supportsSVG","res","deserializedFeatures","fromJSON","exportSVG","blockKey","reactElement","RpcRenderedSvgGroup","ComparativeServerSideRenderer","ServerSideRenderer","renderInClient","call","getSerializedSvg","featurePassesFilters","passes","requestRegions","requestRegion","dedupe","iterMap","size","_renderArgs","featureObservable","ServerSideRenderedContent","deserializeArgsInWorker","deserialized","SerializableFilterChain","renderToString","statusCallback","updateStatus","filterChain","trim","inputFilter","entry","tooltip","position","pointerEvents","backgroundColor","palette","grey","borderRadius","shape","common","white","fontFamily","typography","padding","fontSize","pxToRem","lineHeight","maxWidth","wordWrap","BaseTooltip","clientPoint","clientPointCoords","children","placement","popperTheme","components","MuiPopper","refs","floatingStyles","context","useFloating","strategy","useClientPoint","getFloatingProps","useInteractions","container","defaultProps","className","setFloating","zIndex","visibility","transform","closeAfterItemClick","stopPropagation","setOpen","onClickExtra","popupState","usePopupState","popupId","variant","onTouchStart","rest2","bindTrigger","isOpen","event","disabled","CascadingMenu","bindPopover","onMenuItemClick","ResetComponent","onFactoryReset","resetButtonText","dialogOpen","setDialogOpen","useState","FactoryResetDialog","onClose","open","FatalErrorDialog","componentStack","ErrorMessage","window","isBlobLocation","filename","marginLeft","spacing","setLocation","localPath","needToReload","getBlob","blobId","flexDirection","alignItems","fullWidth","component","hidden","onChange","target","file","files","isElectron","webUtils","require","getPathForFile","storeBlobLocation","blob","inputProps","dots","content","textAlign","animation","keyframes","LoadingEllipses","bg","margin","overflow","background","border","divider","RedErrorMessageBox","category10","dark2","set1","set2","tableau10","ggplot2Colors6","ggplot2Colors5","ggplot2Colors4","ggplot2Colors3","moveTo","interRegionPaddingWidth","minimumBlockWidth","len","bpSoFar","index","offset","s","i","lengthBetween","numBlocksWideEnough","targetBpPerPx","newBpPerPx","zoomTo","extraBp","bpToStart","scrollTo","coord","bp","reversed","pxToBp","px","offsetPx","staticBlocks","blocks","contentBlocks","oob","interRegionPaddingBp","currBlock","regionNumber","at","bpToPx","volatileWidth","setDisplayedRegions","setBpPerPx","setVolatileWidth","displayedRegionsTotalPx","totalBp","maxOffset","minOffset","dynamicBlocks","calculateDynamicBlocks","calculateStaticBlocks","currBp","setFeatures","showAllRegions","zoomOut","zoomIn","clamp","minBpPerPx","maxBpPerPx","oldBpPerPx","abs","newOffsetPx","centerAt","centerPx","scroll","distance","oldOffsetPx","AbortError","AbortSignal","aborted","makeAbortError","abortBreakPoint","DOMException","code","observeAbortSignal","fromEvent","Observable","isAbortException","exception","test","blobToDataURL","FileReader","onload","readAsDataURL","BlockSet","block","lastBlock","getBlocks","getRegions","toRegion","func","thisarg","totalWidthPx","widthPx","totalWidthPxWithoutBorders","BaseBlock","ContentBlock","ElidedBlock","elidedBlockCount","otherBlock","InterRegionPaddingBlock","elision","displayedRegionLeftPx","windowLeftPx","windowRightPx","regionStart","regionEnd","displayedRegionRightPx","regionWidthPx","parentRegion","leftPx","rightPx","intersection2","isLeftEndOfDisplayedRegion","isRightEndOfDisplayedRegion","blockOffsetPx","blockData","assembleLocStringFast","extra","modelWidth","windowLeftBp","windowRightBp","blockSizePx","blockSizeBp","regionBpOffset","regionBlockCount","windowRightBlockNum","windowLeftBlockNum","blockNum","colors","aliceblue","antiquewhite","aqua","aquamarine","azure","beige","bisque","black","blanchedalmond","blue","blueviolet","brown","burlywood","cadetblue","chartreuse","chocolate","coral","cornflowerblue","cornsilk","crimson","cyan","darkblue","darkcyan","darkgoldenrod","darkgray","darkgreen","darkgrey","darkkhaki","darkmagenta","darkolivegreen","darkorange","darkorchid","darkred","darksalmon","darkseagreen","darkslateblue","darkslategray","darkslategrey","darkturquoise","darkviolet","deeppink","deepskyblue","dimgray","dimgrey","dodgerblue","firebrick","floralwhite","forestgreen","fuchsia","gainsboro","ghostwhite","gold","goldenrod","gray","green","greenyellow","honeydew","hotpink","indianred","indigo","ivory","khaki","lavender","lavenderblush","lawngreen","lemonchiffon","lightblue","lightcoral","lightcyan","lightgoldenrodyellow","lightgray","lightgreen","lightgrey","lightpink","lightsalmon","lightseagreen","lightskyblue","lightslategray","lightslategrey","lightsteelblue","lightyellow","lime","limegreen","linen","magenta","maroon","mediumaquamarine","mediumblue","mediumorchid","mediumpurple","mediumseagreen","mediumslateblue","mediumspringgreen","mediumturquoise","mediumvioletred","midnightblue","mintcream","mistyrose","moccasin","navajowhite","navy","oldlace","olive","olivedrab","orange","orangered","orchid","palegoldenrod","palegreen","paleturquoise","palevioletred","papayawhip","peachpuff","peru","pink","plum","powderblue","purple","rebeccapurple","red","rosybrown","royalblue","saddlebrown","salmon","sandybrown","seagreen","seashell","sienna","silver","skyblue","slateblue","slategray","slategrey","snow","springgreen","steelblue","tan","teal","thistle","tomato","turquoise","violet","wheat","whitesmoke","yellow","yellowgreen","namedColorToHex","isNamedColor","contrastingTextColor","getLuminance","convertedColor","muiGetLuminance","emphasize","coefficient","muiEmphasize","makeContrasting","foreground","minContrastRatio","convertedForeground","convertedBackground","backgroundLuminance","contrastRatio","getContrastRatio","originalColor","darken","lighten","mix","names","list","hasher","lookup","hashed","hashCode","fetchers","globalRangeCache","HttpRangeFetcher","fetcher","chunkSize","maxFetchSize","minimumTTL","RemoteFile","fetchBinaryRange","bind","range","rangeParse","exec","parseInt","buffer","getRange","Response","status","requestDate","responseDate","ok","errorMessage","hint","k","arrayBuffer","Buffer","from","resolveUriLocation","baseUri","href","isLocalPathLocation","isNode","LocalFile","BlobFile","absoluteLocation","internetAccount","getInternetAccount","checkAuthNeededFetch","isRootModelWithInternetAccounts","response","AuthNeededError","toString","JexlF","j","addFunction","parent","log","sqrt","log10","parseFloat","char","split","charCodeAt","pos","codePointAt","endsWith","pad","padEnd","fill","padStart","repeat","match","replace","replaceAll","substring","toLowerCase","trimEnd","trimStart","tags","addBinaryOp","compilationCache","cacheKey","compiled","compile","minSizeToBotherWith","segmentsIntersect","x1","x2","y1","y2","LayoutRow","widthLimit","setAllFilled","allFilled","getItemAt","x","rowState","bits","isRangeClear","left","right","maxX","initialize","rectWidth","addRect","rect","l","oLeft","oRight","currLength","additionalLength","w","leftTrimAmount","rightTrimAmount","trimAmount","desiredLength","hardRowLimit","bitmap","pTotalHeight","height","storedRec","top","addRectToBitmap","pLeft","pRight","pHeight","rectangle","h","originalHeight","maxTop","collides","maxY","y","row","autovivifyRow","yEnd","hasSeen","getByCoord","pY","pX","getByID","cleanup","getTotalHeight","totalHeight","getRectangles","regionRectangles","containsNoTransferables","subLayouts","SubLayoutClass","layoutName","subLayout","sublayout","rbush","RBush","insert","minX","minY","_rect","_top","_data","_left","_right","_region","ThrowingLayout","PrecomputedMultiLayout","sublayoutJson","SceneGraph","absoluteCache","dirty","addChild","nameOrSceneGraph","child","childLeft","childRight","childTop","bottom","childBottom","absolute","expand","getSubRecord","newLeft","newRight","newTop","newBottom","diff","walkParents","walkChildren","xOffset","yOffset","node","move","_subtype","_subType","subType","unionType","_types","getPropertyType","propertyName","properties","_defaultValue","getEnumerationValues","maybeLate","nanoid","crypto","getRandomValues","Uint8Array","reduce","byte","createCanvas","createImageBitmap","ImageBitmapType","drawImageOntoCanvasContext","imageData","serializedCommands","CanvasSequence","drawImage","weHave","OffscreenCanvas","ImageBitmap","nodeCreateCanvas","dataUri","canvas","toDataURL","img","nodeImage","onerror","src","getContext","ctx","renderToAbstractCanvas","highResolutionScaling","rasterizeLayers","scale","xlinkHref","convertToBlob","fakeCtx","canvasRecordedData","getSvg","ReactRendering","rendering","left1","right1","left2","right2","doesIntersect2","isContainedWithin","catch","takeUntil","isFeature","isSimpleFeatureSerialized","parentHandle","aliases","strand","parentId","calcStdFromSums","sumSquares","n","population","variance","scoreMean","scoreStdDev","seed","MAX_VALUE","MIN_VALUE","found","acc","summary","isViewContainer","isSessionModel","isSessionWithAddTracks","disableAddTracks","isSessionWithShareURL","shareURL","isSessionModelWithWidgets","isSessionModelWithConnections","isSessionModelWithConnectionEditing","isSessionWithSessionPlugins","isSelectionContainer","isViewModel","isTrackModel","isDisplayModel","isTrackViewModel","isAbstractMenuManager","setPrototypeOf","prototype","isRetryException","useMeasure","dims","setDims","RS","ResizeObserver","contentRect","observe","disconnect","when","getter","timeout","finished","whenPromise","mobxWhen","timeoutId","finishTimeout","cancel","addEventListener","err","whenPresent","mdRegex","modificationRegex","cigarRegex","startClip","endClip","parseCigar","cigar","cigarToMismatches","ops","seq","qual","roffset","soffset","mismatches","hasRefAndSeq","op","base","altbase","q","subarray","cliplen","mdToMismatches","mdstring","cigarMismatches","curr","lastCigar","lastTemplateOffset","lastRefOffset","lastSkipPos","mismatchRecords","skips","getTemplateCoordLocal","refCoord","templateOffset","refOffset","md","num","isNaN","mismatch","getMismatches","concat","getNextRefPos","cigarOps","positions","readPos","refPos","currPos","getModificationProbabilities","getTagAlt","elt","getMethBins","fstart","fend","fstrand","flen","mm","methBins","methProbs","probabilities","modifications","getModificationPositions","probIndex","prob","fseq","revcom","mods","basemod","matches","typestr","delta","temp","getModificationTypes","getOrientedCigar","flip","getOrientedMismatches","getLengthOnRef","lengthOnRef","getLength","getLengthSansClipping","getClip","getTag","tag","featurizeSA","SA","readName","normalize","aln","saRef","saStart","saStrand","saCigar","saLengthOnRef","saLength","saLengthSansClipping","saStrandNormalized","saClipPos","saRealStart","seqLength","clipPos","CIGAR","mate","fetchSizeLimit","cramLocation","craiLocation","sequenceAdapter","CramAdapterF","bamLocation","indexType","enumeration","BamAdapterF","htsgetBase","htsgetTrackId","HtsgetBamAdapterF","hiddenFromGUI","subadapter","SNPCoverageAdapterF","clipColor","indicatorThreshold","drawArcs","drawInterbaseCounts","drawIndicators","SNPCoverageRenderer","WiggleBaseRenderer","draw","displayCrossHatches","modificationTagMap","scaleOpts","unadjustedHeight","configTheme","cfg","ticks","YSCALEBAR_LABEL_OFFSET","viewScale","getScale","indicatorViewScale","scaleType","originY","getOrigin","originLinear","toY","toHeight","toY2","toHeight2","bases","colorForBase","A","main","C","G","T","insertion","softclip","hardclip","total","meth","unmeth","coverage","fillStyle","featureSpanPx","fillRect","prevTotal","extraHorizontallyFlippedOffset","snpinfo","totalScore","cov","interbaseEvents","noncov","indicatorHeight","accum","maxBase","indicatorComparatorScore","beginPath","lineTo","bpSpanPx","xs","neg","neutral","strokeStyle","lineWidth","bezierCurveTo","stroke","tick","register","WiggleRendering","PileupLayoutSession","showSoftClip","sortedBy","filterBy","PileupRenderer","fetchSequence","maxClippingSize","layoutRecords","featureMap","sortFeature","featureArray","featuresInCenterLine","featuresOutsideCenter","innerArray","isCram","baseSortArray","baseMap","aMismatch","bMismatch","acode","bcode","heightPx","expansionBefore","expansionAfter","topPx","layoutFeature","layoutFeats","regionSequence","shouldFetchReferenceSequence","colorBy","makeImageData","notEmpty","canvasWidth","orientationType","minSubfeatureWidth","noSpacing","largeInsertionIndicatorScale","mismatchAlpha","onMouseMove","selectedFeatureId","featureIdUnderMouse","contextMenuFeature","firstRender","setFirstRender","mouseIsDown","setMouseIsDown","movedDuringLastMouseDown","setMovedDuringLastMouseDown","selectedRect","getFeatureByID","highlightedFeature","highlightedRect","makeRect","leftBp","rightBp","bottomPx","selected","highlight","callMouseHandler","handlerName","featureHandler","canvasHandler","tagFilter","onMouseDown","onMouseEnter","onMouseOut","onMouseOver","onMouseUp","onMouseLeave","getBoundingClientRect","offsetX","clientX","offsetY","clientY","clientBp","getFeatureOverlapping","mouseMove","onContextMenu","onFocus","onBlur","PrerenderedCanvas","boxSizing","getLowerPanelDisplays","lowerPanel","deepSnap","preCheck","PileupDisplay","SNPCoverageDisplay","isAlive","compose","snpCovHeight","heightPreConfig","userFeatureScreenDensity","lowerPanelType","LinearAlignmentsDisplayMixin","scrollTop","setScrollTop","setSNPCoverageHeight","pileupConf","searchFeatureByID","coverageConf","setSNPCoverageDisplay","setFeatureDensityStatsLimit","setPileupDisplay","setHeight","setFilterBy","setLowerPanelType","resizeHeight","oldHeight","setConfig","setColorBy","propagateColorBy","propagateFilterBy","renderSvg","pileupHeight","overrideHeight","superTrackMenuItems","resizeHandle","AlignmentsDisplay","ResizeHandle","onDrag","LinearAlignmentsDisplayF","pileupDisplay","snpCoverageDisplay","baseLinearDisplayConfigSchema","modelFactory","linearWiggleDisplayModelFactory","FilterModel","jexlFilters","observable","modificationsReady","setJexlFilters","updateModificationColorMap","uniqueModifications","modificationColors","randomColor","superRenderProps","rendererConfig","configBlob","drawArcsSetting","drawInterbaseCountsSetting","drawIndicatorsSetting","autorunReady","initialized","featureDensityStatsReady","regionTooLarge","renderReady","ready","superProps","setModificationsReady","toggleDrawIndicators","toggleDrawInterbaseCounts","toggleDrawArcs","createAutorun","vals","getUniqueModificationValues","delay","TooltipComponent","needsScalebar","contextMenuItems","autoscale","minScore","maxScore","inverted","multiTicks","renderers","configSchemaFactory","LinearWiggleDisplayReactComponent","FilterByTagDialog","TrackHeightMixin","FeatureDensityMixin","jitter","drawInter","drawLongRange","loading","chainData","lastDrawnOffsetPx","lastDrawnBpPerPx","setLastDrawnOffsetPx","setLastDrawnBpPerPx","setLoading","setRef","setColorScheme","setChainData","setDrawInter","setDrawLongRange","setLineWidth","setJitter","drawn","lineWidthSetting","jitterVal","icon","FilterListIcon","queueDialog","handleClose","PaletteIcon","drawFeats","doAfterAttach","maxFeatureScreenDensity","colorScheme","linearBasicDisplayConfigSchemaFactory","configSchemaF","stateModelF","drawSingletons","setDrawSingletons","featureHeight","linearAlignmentsDisplay","baseModel","baseModelFactory","AlignmentFeatureDetailsF","PileupBaseRPC","PileupGetReducedFeatures","featuresArray","reduced","flags","tlen","pair_orientation","next_ref","next_pos","filtered","sum2","avg","sd","upper","lower","getInsertSizeStats","chains","groupBy","hasPaired","PileupGetVisibleModifications","uniqueValues","PileupGetGlobalValueForTag","PileupRPCMethodsF","GuessAlignmentsTypesF","adapterGuesser","adapterHint","adapterName","fileName","getFileName","makeIndex","indexName","makeIndexType","trackTypeGuesser","defaultRendering","LinearPileupDisplayBlurb","ColorByTagDialog","SetFeatureHeightDialog","SetMaxHeightDialog","SharedLinearPileupDisplayMixin","BaseLinearDisplay","fadeLikelihood","trackMaxHeight","ColorByModel","colorTagMap","featureUnderMouseVolatile","tagsReady","setTagsReady","setMaxHeight","setFeatureHeight","setNoSpacing","updateColorTagMap","uniqueTag","colorPalette","totalKeys","setFeatureUnderMouse","selectFeature","featureWidget","addWidget","getContainingTrack","showWidget","setSelection","copyFeatureToClipboard","copy","notify","featureHeightSetting","featureUnderMouse","viewName","MenuOpenIcon","clearFeatureSelection","ContentCopyIcon","renderPropsPre","onFeatureClick","getRpcSessionId","layoutId","onFeatureContextMenu","setContextMenuFeature","colorSchemeSubMenuItems","getUniqueTagValues","notifyError","SortByTagDialog","GroupByDialog","ModificationsDialog","showSoftClipping","sortReady","currSortBpPerPx","setCurrSortBpPerPx","setSortReady","clearSelected","toggleSoftClipping","toggleMismatchAlpha","setSortedBy","centerLineInfo","centerBp","superReload","superRenderReady","mismatchAlphaSetting","superRenderPropsPre","superColorSchemeSubMenuItems","SortIcon","option","ColorLensIcon","doneCallback","WorkspacesIcon","VisibilityIcon","BaseLinearDisplayComponent","AlignmentsPlugin","LinearPileupDisplayF","LinearSNPCoverageDisplayF","AlignmentsTrackF","PileupRendererF","SNPCoverageRendererF","LinearReadArcsDisplayF","LinearReadCloudDisplayF","AlignmentsFeatureWidgetF","fillColor","color_fwd_strand_not_proper","color_rev_strand_not_proper","color_fwd_strand","color_rev_strand","color_fwd_missing_mate","color_rev_missing_mate","color_fwd_diff_chr","color_rev_diff_chr","color_pair_lr","color_pair_rr","color_pair_rl","color_pair_ll","color_nostrand","color_interchrom","color_longinsert","color_shortinsert","color_unknown","strokeColor","getPairedInsertSizeColor","f1","f2","sameRef","defaultColor","getPairedInsertSizeAndOrientationColor","getPairedOrientationColorOrDefault","orientationTypes","fr","type2","pairMap","getPairedOrientationColor","flagInclude","flagExclude","alt","F1R2","F2R1","F1F2","F2F1","R1R2","R2R1","R1F2","R2F1","rf","ff","LR","LL","RR","RL","originalRefName","o","g","random","TOP","BOTTOM","heightFromSpecificLevel","level","getYPosOverride","trackRefs","getPxFromCoordinate","yPos","chunk","useNextFrame","variable","setNextFrameState","intersect","a1","a2","ids","a12","findCircleIntersectionX","cx","cy","resultArray","solution","findCircleIntersectionY","cartesianToPolar","rho","theta","atan","PI","cartesianToTheta","twoPi","Slice","offsetRadians","radianWidth","bpPerRadian","assembleLocString","flipped","startRadians","endRadians","widthBp","freeze","bpToXY","radiusPx","offsetBp","elided","totalRadians","polarToCartesian","ExportSvgDialog","hideVerticalResizeHandle","hideTrackSelectorButton","lockedFitToWindow","disableImportForm","scrollX","scrollY","minimumRadiusPx","spacingPx","paddingPx","lockedPaddingPx","minVisibleWidth","trackSelectorType","visibleSection","viewSides","circleCenter","circleRadius","viewL","viewR","viewT","viewB","vertices","maxRho","NEGATIVE_INFINITY","reflect","rhoMin","rhoMax","thetaMin","thetaMax","vx","vy","viewportVisibleSection","centerXY","circumferencePx","elidedBp","elidedRegions","pxPerRadian","maximumRadiusPx","minCircumferencePx","maxCircumferencePx","atMaxBpPerPx","atMinBpPerPx","tooSmallToLock","figureDimensions","figureWidth","figureHeight","visible","lastVisible","displayedRegion","staticSlices","slices","currentRadianOffset","calculateStaticSlices","visibleStaticSlices","visibleThetaMin","visibleThetaMax","r1start","r2start","r2length","r1length","sliceIsVisible","newHeight","setModelViewWhenAdjust","resizeWidth","oldWidth","rotateClockwiseButton","rotateClockwise","rotateCounterClockwiseButton","rotateCounterClockwise","zoomInButton","zoomOutButton","secondCondition","previouslyEmpty","activateTrackSelector","selector","toggleTrack","hideTrack","showTrack","supportedDisplays","displayConf","toggleFitToWindowLock","exportSvg","renderToSvg","saveAs","FolderOpenIcon","PhotoCameraIcon","TrackSelectorIcon","primary","secondary","tertiary","quaternary","path","strokeDasharray","strokeDashoffset","light","radius","shown","setShown","patternTransform","patternUnits","strokeWidth","dominantBaseline","textAnchor","strokeLinecap","DisplayError","filled","Loading","renderReactionData","blockDefinitions","renderReactionEffect","cannotBeRenderedReason","isCompatibleWithRenderer","baseChordDisplayConfig","onChordClick","BaseChordDisplayModel","bezierRadiusRatio","refNameMap","origSlices","renamed","bezierRadius","selection","renderStarted","renderSuccess","renderError","setRefNameMap","makeAbortableReaction","fireImmediately","getTrackAssemblyNames","getRefNameMapForAdapter","CircularViewPlugin","CircularViewF","assembly","addView","asm","waitForAssembly","LaunchCircularViewF","appendToSubMenu","DataUsageIcon","callbackEditor","marginTop","callbackContainer","overflowX","textAreaFont","contents","setContents","shrink","htmlFor","helperText","multiline","InputProps","refNameColumn","setTarget","newTarget","LazyConfigurationEditorComponent","useUcscNameOverride","ConfigurationPlugin","FromConfigAdapterF","FromConfigRegionsAdapterF","FromConfigSequenceAdapterF","RefNameAliasAdapterF","ConfigurationEditorWidgetF","NcbiSequenceReportAliasAdapterF","AddConnectionWidgetF","isAbsoluteUrl","trackSource","trackData","indexTrackData","altAssemblyName","altTrackName","altTrackType","textIndexTrack","textIndexingConf","setAdapterHint","setTrackSource","setTextIndexingConf","setTextIndexTrack","setTrackData","setIndexTrackData","setAssembly","setTrackName","setTrackType","clearData","trackAdapter","guessAdapter","trackName","isFtp","isRelativeTrackUrl","isRelativeIndexUrl","isRelativeUrl","trackHttp","indexHttp","wrongProtocol","protocol","unsupported","UNSUPPORTED","guessTrackType","warningMessage","AddTrackWidgetF","getRowStr","facet","hasAnyOverlap","s1","query","categories","queryLower","getTrackName","findSubCategories","paths","hasSubs","findTopLevelCategories","filterTracks","trackListAssemblies","trackAssemblyNames","trackAssemblies","trackSelectorAnyOverlap","hasAllOverlap","generateHierarchy","noCategories","hierarchy","collapsed","filterText","activeSortTrackNames","activeSortCategories","viewTracks","sortNames","sortCategories","sortConfs","unshift","currLevel","isOpenByDefault","findNonSparseKeys","rows","nonMetadataKeys","keyConfigPostFix","pathname","URLSearchParams","recentlyUsedK","favoritesK","collapsedK","localStorageGetJSON","localStorageSetJSON","MAX_RECENTLY_USED","stateTreeFactory","faceted","showSparse","showFilters","showOptions","panelWidth","useShoppingCart","setFilter","setPanelWidth","setUseShoppingCart","setFilterText","setShowSparse","setShowOptions","setShowFilters","allTrackConfigurations","filteredNonMetadataKeys","metadataKeys","getRootKeys","filteredMetadataKeys","fields","filteredRows","arrFilters","setVisible","favorites","recentlyUsed","sortTrackNames","recentlyUsedCounter","favoritesCounter","shownTrackIds","selectionSet","favoritesSet","recentlyUsedSet","setSortTrackNames","setSortCategories","addToSelection","removeFromSelection","clearSelection","addToFavorites","removeFromFavorites","clearFavorites","setRecentlyUsedCounter","setRecentlyUsed","setFavorites","setFavoritesCounter","addToRecentlyUsed","clearRecentlyUsed","setView","toggleCategory","pathName","setCategoryCollapsed","expandAllCategories","setCollapsedCategories","clearFilterText","newText","isSelected","isFavorite","isRecentlyUsed","getRefSeqTrackConf","sequence","configAndSessionTrackConfigurations","connectionInstances","allTrackConfigurationTrackIdSet","favoriteTracks","recentlyUsedTracks","allTracks","group","collapseSubCategories","collapseTopLevelCategories","trackGroups","hasAnySubcategories","lc","HierarchicalTrackSelectorWidgetF","PluginStoreWidgetF","hubTxtLocation","baseConnectionConfig","UCSCTrackHubConnection","BaseConnectionModelFactory","doConnect","UCSCTrackHubConnectionF","locstr","includeAsm","toLocaleString","getBlockLabelKeysToHide","viewOffsetPx","blockLabelKeysToHide","sortedBlocks","alen","labelBounds","makeTicks","emitMajor","emitMinor","gridPitch","minMajorPitchBp","majorPitch","toExponential","majorPitchPx","minorPitch","chooseGridPitch","iterPitch","minBase","contentBlock","minHeight","whiteSpace","elidedBlock","backgroundImage","interRegionPaddingBlock","boundaryPaddingBlock","action","disabledBackground","boundary","ellipses","textOverflow","BlockMsg","severity","title","TooltipContents","SanitizedHTML","clientMouseCoord","ErrorMessageStackTraceDialog","paddingLeft","LoadingMessage","blockStatus","displayStatus","RefreshIcon","ReportIcon","reloadFlag","renderInProgress","ServerSideRenderedBlockContent","doReload","getContainingDisplay","renderBlockData","renderBlockEffect","renderDelay","setRendered","setStatus","abortController","abort","messageText","beforeDestroy","optDisplay","regionAsm","hasName","displayError","viewParams","getViewParams","getDisplayStr","totalBytes","toPrecision","notJest","getFeatureDensityStatsPre","rightRoundedRect","leftTriangle","rightTriangle","colorMap","gneg","gpos25","gpos50","gpos100","gpos75","gvar","stalk","acen","overview","cytobands","getCytobands","lcap","rcap","HEADER_OVERVIEW_HEIGHT","centromereSeen","points","getFillProps","dragHandle","cursor","dragHandleIcon","verticalAlign","draggable","onDragStart","currentTarget","parentNode","dataTransfer","setDragImage","setDraggingTrackId","onDragEnd","DragIcon","paper","iconButton","items","AddIcon","MinimizeIcon","KeyboardDoubleArrowUpIcon","moveTrackToTop","KeyboardArrowUpIcon","moveTrackUp","KeyboardArrowDownIcon","moveTrackDown","KeyboardDoubleArrowDownIcon","moveTrackToBottom","getTrackActionMenuItems","TrackLabelDragHandle","CloseIcon","CascadingMenuButton","MoreVertIcon","trackLabel","trackLabelOffset","trackLabelOverlap","labelStyle","trackLabelsSetting","prefersOffset","TrackLabel","renderingComponentContainer","trackRenderingContainer","overflowY","onDragEnter","scaleFactor","onScroll","evt","onHorizontalScroll","horizontalScroll","draggingTrackId","showTrackOutlines","elevation","detail","TrackLabelContainer","ErrorBoundary","FallbackComponent","TrackRenderingContainer","moveTrack","useRangeSelect","shiftOnly","startX","setStartX","currentX","setCurrentX","anchorPosition","setAnchorPosition","guideX","setGuideX","mouseDragging","mouseDown","shiftKey","preventDefault","relativeX","getRelativeX","mouseOut","setOffsets","handleMenuItemClick","globalMouseMove","globalMouseUp","leftOffset","rightOffset","computeOffsets","removeEventListener","rubberbandOn","leftBpOffset","rightBpOffset","numOfBpSelected","guide","coordX","arrow","rubberbandControl","ControlComponent","VerticalGuide","RubberbandSpan","anchorReference","rubberBandMenuItems","majorTickLabel","justifyContent","ContentBlockComponent","baseNumber","getTickDisplayStr","ScalebarCoordinateTicks","ElidedBlockComponent","InterRegionPaddingBlockComponent","refLabel","fontWeight","b0","scaleBarDisplayPrefix","lastLeftBlock","last","zoomContainer","scalebar","other","offsetLeft","ScalebarCoordinateLabels","ScalebarRefNameLabels","verticalGuidesZoomContainer","verticalGuidesContainer","majorTick","minorTick","RenderedBlockLines","RenderedVerticalGuides","centerLineContainer","active","borderTop","borderBottom","centerLineText","CenterLine","trackHeights","startingPosition","role","colord","toRgbString","linkIcon","Highlight","anchorEl","dismissHighlight","removeHighlight","mapCoords","getCanonicalRefName","LinkIcon","_event","BookmarkIcon","bookmarkWidget","widgets","addBookmark","tracksContainer","mouseDown1","mouseUp","setMouseDragging","scheduled","prevX","requestAnimationFrame","dataset","resizer","button","useSideScroll","mouseDown2","onWheel","ctrlKey","deltaY","setScaleFactor","deltaX","useWheelScroll","additional","showGridlines","Gridlines","showCenterLine","Rubberband","Scalebar","SCALE_BAR_HEIGHT","HighlightGroup","ImportForm","NoTracksActiveButton","note","paddingTop","paddingBottom","rel","LinearGenomeView","hasDisplayedRegions","handleSelectView","Element","contains","setFocusedViewId","document","MiniControlsComponent","HeaderComponent","setHovered","hoverPosition","hoverFeature","TracksContainer","TrackContainer","useOffset","multiplier","cytobandOffset","polygonColor","first","topLeft","topRight","startPx","endPx","HEADER_BAR_HEIGHT","getStrokeProps","HelpDialog","HelpAdornment","isHelpDialogDisplayed","setHelpDialogDisplayed","HelpIcon","EndAdornment","showHelp","endAdornment","marginRight","SearchIcon","AutocompleteTextField","TextFieldProps","inputBoxVal","params","setInputValue","setCurrentSearch","slotProps","placeholder","onSelect","fetchResults","minWidth","loaded","setLoaded","currentSearch","inputValue","searchOptions","setSearchOptions","debouncedSearch","useDebounce","coarseVisibleLocStrings","aggregateResults","getDeduplicatedResult","measureText","refNames","regionOptions","disableListWrap","disableClearable","freeSolo","includeInputInList","selectOnFocus","onInputChange","newInputValue","loadingText","onOpen","selectedOption","getOptionDisabled","filterOptions","searchQuery","toLocaleLowerCase","getFiltered","renderInput","getOptionLabel","opt","rubberband","rubberbandText","contrastText","popover","mouseEvents","paddingRight","anchorOrigin","vertical","horizontal","transformOrigin","keepMounted","disableRestoreFocus","toLocale","queryString","searchType","rankSearchResults","textSearchManager","textSearchResults","refNameResults","allRefNames","RESIZE_HANDLE_HEIGHT","INTER_REGION_PADDING_WIDTH","SPACING","WIDGET_HEIGHT","SVGBackground","shift","stripAlpha","SVGRegionSeparators","SVGTrackLabel","trackLabels","xoff","yoff","coarseStripHTML","SVGTracks","displayResults","textHeight","textOffset","Ruler","major","minor","hideText","SVGRuler","renderRuler","clipid","clipPath","SVGScalebar","displayBp","getBpDisplayStr","x0","SVGHeader","cytobandHeight","rulerHeight","showCytobands","visibleRegions","firstOverviewPx","lastOverviewPx","Cytobands","fillOpacity","OverviewScalebarPolygon","headerHeight","themeName","Wrapper","allThemes","createRootFn","trackLabelMaxLen","renderToStaticMarkup","xmlns","xmlnsXlink","viewBox","minMajorPitchPx","minMinorPitchPx","generateLocations","asmName","canonicalRefName","parseLocStrings","isValidRefName","inputs","parseLocString","isInteger","mouseover","CompositeMap","submaps","submap","Symbol","iterator","minDisplayHeight","displayHeight","regionTooLargeReason","featureDensityStats","userBpPerPxLimit","userByteSizeLimit","featureDensityStatsP","currStatsBpPerPx","currentBytesRequested","bytes","currentFeatureScreenDensity","maxAllowableBytes","setCurrStatsBpPerPx","clearFeatureDensityStats","getFeatureDensityStats","setFeatureDensityStats","autorunFeatureDensityStats","setFeatureDensityStatsP","req","regionCannotBeRenderedText","TooLargeMessage","blockState","BlockState","blockType","featureMaps","addBlock","deleteBlock","navToFeature","navTo","setFeatureIdUnderMouse","CenterFocusStrongIcon","renderBaseLinearDisplaySvg","blocksPresent","linearBlocks","heightOverflowed","textShadow","RenderedBlocks","state","LinearBlocks","viewModel","clientRect","setClientRect","offsetMouseCoord","setOffsetMouseCoord","setClientMouseCoord","contextCoord","setContextCoord","mouseCoord","TransitionProps","onExit","focusedBackground","MiniControls","hideHeader","focusedViewId","ArrowDown","zoom","ZoomOut","ZoomIn","HoverTooltip","cytoband","OverviewRubberband","controlsRef","click","globalKeyDown","borderLeft","borderRight","OverviewHighlight","scalebarLabel","OverviewScalebarTickLabels","refNameColor","getRefNameColor","tickLabels","offsetLabel","tickLabel","labelIdx","scalebarBorder","scalebarContig","scalebarContigForward","backgroundRepeat","scalebarContigReverse","scalebarRefName","scalebarVisibleRegion","overviewSvg","OverviewBox","canDisplayCytobands","borderColor","overviewVisibleRegions","scalebarColor","transparency","OverviewScalebar","modWidth","useMemo","slider","ZoomControls","setValue","log2","onChangeCommitted","headerRefName","SearchBox","RefNameAutocomplete","navToOption","setSearchResults","handleSelectedRegion","headerBar","headerForm","flexWrap","spacer","flexGrow","panButton","toggleButton","buttonSpacer","HeaderButtons","PanControls","slide","ArrowBackIcon","ArrowForwardIcon","RegionWidth","coarseTotalBp","Controls","LinearGenomeViewHeader","hideHeaderOverview","ReturnToImportFormDialog","SequenceSearchDialog","GetSequenceDialog","SearchResultsDialog","calculateVisibleLocStrings","isSingleAssemblyName","hideNoTracksActive","showCytobandsSetting","colorByCDS","volatileError","afterDisplayedRegionsSetCallbacks","coarseDynamicBlocks","sessionSetting","Header","assemblyErrors","assembliesInitialized","scaleBarHeight","trackHeightsWithResizeHandles","includeAggregateIndexes","getTrack","openTrackIds","rewriteOnClicks","holdOnClick","apply","trackTypeActions","allActions","setShowTrackOutlines","setColorByCDS","setShowCytobands","setHideHeader","setHideHeaderOverview","setHideNoTracksActive","setShowGridlines","addToHighlights","setHighlight","centerAtOffset","searchResults","setNewView","horizontallyFlip","reverse","displayInitialSnapshot","movingId","targetId","oldIndex","newIndex","setTrackLabels","setting","localStorage","setShowCenterLine","getSelectedRegions","simView","afterDisplayedRegionsSet","center","showAllRegionsInAssembly","factor","clearView","cancelLastAnimation","viewWidths","animate","cancelAnimation","springAnimate","canShowCytobands","anyCytobandsExist","SyncAltIcon","LabelIcon","currentlyCalculatedStaticBlocks","stringifiedCurrentlyCalculatedStaticBlocks","sret","roundedDynamicBlocks","visibleLocStrings","setCoarseDynamicBlocks","navToLocString","optAssemblyName","navToLocations","navToSearchString","parsedLocStrings","locations","navToMultiple","assembly1","assembly2","ref1","ref2","findLast","e1","e2","index2","ed","ZoomInIcon","handler","metaKey","AddFiltersDialog","trackShowLabels","trackShowDescriptions","trackDisplayMode","activeFilters","showLabels","showDescriptions","toggleShowLabels","toggleShowDescriptions","setDisplayMode","LinearGenomeViewPlugin","exports","BasicTrackF","LinearBasicDisplayF","LinearGenomeViewF","LinearBareDisplayF","tracklist","nav","idsNotFound","tryTrack","LaunchLinearGenomeViewF","LineStyleIcon","allRefs","allRefNamesWithLowerCase","lastIndex","lastIndexOf","splitLast","checkRef","altTypeToSO","DEL","INS","DUP","INV","INVDUP","CNV","TRA","NON_REF","getSOTermAndDescription","parser","soTerms","descriptions","soTerm","getSOAndDescFromAltDefs","parseBreakend","makeDescriptionString","lena","getSOAndDescByExamination","descs","prefixes","desc","prefix","suffixes","pref","modAlt","VCFFeature","dataFromVariant","_id","field","SAMPLES","REF","ALT","POS","CHROM","INFO","ID","isTRA","isSymbolic","END","samples","vcfLocation","vcfGzLocation","linearBasicDisplayModelFactory","strokeColorSelected","strokeColorHover","bpToRadians","blockStart","blockEnd","blocksForRefs","hovered","startBlock","svType","endPosition","endBlock","SVTYPE","bnd","startPos","matePosition","MatePosition","chr2","CHR2","startXY","endXY","controlXY","hoverStrokeColor","blocksForRefsMemo","Chord","VariantsPlugin","VcfAdapterF","VcfTabixAdapterF","VariantFeatureWidgetF","ExtensionPointsF","LinearVariantDisplayF","ChordRendererType","StructuralVariantChordRendererF","BaseChordDisplayComponent","ChordVariantDisplayF","en","toP","YScaleBar","hoverVertical","useClientY","reducedFeatures","bigWigLocation","source","subadapters","bigWigs","posColor","negColor","bicolorPivot","bicolorPivotValue","baseWiggleRendererConfigSchema","drawDensity","pivot","pivotValue","crossing","niceMin","niceMax","prevLeftPx","hasClipping","save","fillRectCtx","restore","DensityRenderer","getFeatureUnderMouse","eventClientX","amount","hslColor","toHsl","fudgeFactor","drawXY","colorCallback","summaryScoreMode","minSize","getHeight","toOrigin","crossingOrigin","lastCol","lastMix","effectiveC","toHex","XYPlotRenderer","_score","drawLine","lastVal","lowClipping","highClipping","LinePlotRenderer","sharedWiggleConfigFactory","minimalTicks","numStdDev","SetMinMaxDialog","SharedWiggleMixin","selectedRendering","resolution","rendererTypeNameState","constraints","statsFetchInProgress","updateQuantitativeStats","EPSILON","setColor","setPosColor","setNegColor","aborter","statsFetch","setResolution","setFill","toggleLogScale","setScaleType","setSummaryScoreMode","setAutoscale","setMaxScore","setRendererType","setMinScore","toggleCrossHatches","setCrossHatches","cross","adapterTypeName","rendererTypeNameSimple","autoscaleType","oldDomain","getNiceDomain","bounds","summaryScoreModeSetting","canHaveFill","displayCrossHatchesSetting","hatches","hasResolution","hasGlobalStats","scoreTrackMenuItems","SetColorDialog","axisPropsFromTickScale","fillSetting","hasRenderings","superRenderSvg","quantitativeStatsAutorun","sourcesVolatile","setLayout","clearLayout","setSources","sources","needsFullHeightScalebar","isMultiRow","needsCustomLegend","renderColorBoxes","iter","rowHeight","rowHeightTooSmallForScalebar","useMinimalTicks","eventClientY","mouseoverBp","featuresUnderMouse","MultiXYPlotRenderer","groups","translate","MultiLineRenderer","MultiRowLineRenderer","ConfirmDialog","MultiWiggleGetSources","getSources","WiggleGetMultiRegionQuantitativeStats","WiggleGetGlobalQuantitativeStats","getGlobalStats","WigglePlugin","QuantitativeTrackF","MultiQuantitativeTrackF","XYPlotRendererConfigSchema","DensityRendererConfigSchema","LinePlotRendererConfigSchema","LinearWiggleDisplayF","MultiXYPlotRendererConfigSchema","MultiDensityRendererConfigSchema","MultiRowXYPlotRendererConfigSchema","MultiLineRendererConfigSchema","MultiRowLineRendererConfigSchema","MultiDensityRenderer","MultiRowXYPlotRenderer","MultiLinearWiggleDisplayF","LinePlotRendererF","XYPlotRendererF","DensityRendererF","MultiXYPlotRendererF","MultiRowXYPlotRendererF","MultiDensityRendererF","MultiLineRendererF","MultiRowLineRendererF","MultiWiggleAddTrackWorkflowF","trackIds","arg1","makeTrack","CreateMultiWiggleExtensionF","XYPlotRendererReactComponent","xyPlotRendererConfigSchema","utils","orientation","Axis","shadow","format","orient","LEFT","RIGHT","fg","scaleLinear","scaleLog","scaleQuantize","nice","rangeMin","rangeMax","getScaleType","getQuantitativeStats","AbortController","statsRegion","wiggleStats","authEndpoint","tokenEndpoint","needsPKCE","clientId","scopes","responseType","fixup","buf","processError","invalidErrorCb","error_description","processTokenResponse","storeRefreshTokenCb","refresh_token","access_token","getResponseError","reason","statusText","getError","named","codeVerifier","codeVerifierPKCE","refreshTokenKey","storeRefreshToken","refreshToken","removeRefreshToken","retrieveRefreshToken","exchangeAuthorizationForAccessToken","redirectUri","grant_type","client_id","redirect_uri","code_verifier","method","body","exchangeRefreshForAccessToken","listener","exchangedTokenPromise","addMessageChannel","finishOAuthWindow","deleteMessageChannel","redirectUriWithInfo","fixedQueryString","redirectUrl","queryStringSearch","urlParams","useEndpointForAuthorization","response_type","token_access_type","scope","code_challenge","sha256","generateChallenge","code_challenge_method","eventName","ipcRenderer","invoke","eventFromDesktop","MessageEvent","doUserFlow","newToken","superGetFetcher","validateWithHEAD","ExternalTokenEntryForm","setToken","required","HTTPBasicLoginForm","username","setUsername","password","setPassword","onSubmit","btoa","autoComplete","OAuthConfigSchema","dropboxErrorMessages","shared_link_not_found","shared_link_access_denied","unsupported_link_type","shared_link_is_directory","getDescriptiveErrorMessage","DropboxIcon","append","Authorization","GoogleDriveFile","statsPromise","metadataOnly","stat","GoogleDriveIcon","getUri","driveUrl","searchParams","credentials","AuthenticationPlugin","OAuthInternetAccountModelFactory","ExternalTokenConfigSchema","ExternalTokenInternetAccountModelFactory","HTTPBasicConfigSchema","HTTPBasicInternetAccountModelFactory","DropboxOAuthConfigSchema","DropboxOAuthInternetAccountModelFactory","GoogleDriveOAuthConfigSchema","GoogleDriveOAuthInternetAccountModelFactory","bigBedLocation","scoreColumn","aggregateField","bedpeLocation","columnNames","bedGzLocation","autoSql","bedLocation","colRef","colStart","colEnd","BedPlugin","BigBedAdapterF","BedAdapterF","BedpeAdapterF","BedTabixAdapterF","BreakpointSplitViewType","getBreakendCoveringRegions","endPos","mateRefName","matePos","singleLevelSnapshotFromBreakendFeature","topRegion","bottomRegion","topMarkedRegion","bottomMarkedRegion","snapshotFromBreakendFeature","calc","getBlockFeatures","showIntraviewLinks","linkViews","interactToggled","matchedTrackFeatures","matchedTracks","getMatchedTracks","trackConfigId","hasTranslocations","getTrackFeatures","hasPairedFeatures","getMatchedFeaturesInLayout","onAction","onSubviewAction","actionName","getPath","removeView","toggleInteract","toggleIntraviewLinks","toggleLinkViews","setMatchedTrackFeatures","reverseViewOrder","PhotoCamera","BreakpointSplitViewPlugin","BreakpointSplitView","BreakpointSplitViewF","BreakpointAlignmentsWidgetF","targetAssembly","queryAssembly","pafLocation","pifGzLocation","mcscanAnchorsLocation","bed1Location","bed2Location","mcscanSimpleAnchorsLocation","outLocation","deltaLocation","chainLocation","ComparativeAdaptersPlugin","PAFAdapterF","PairwiseIndexedPAFAdapterF","DeltaAdapterF","ChainAdapterF","MCScanAnchorsAdapterF","MCScanSimpleAnchorsAdapterF","MashMapAdapterF","Dotplot1DView","box","DotplotHView","viewWidth","DotplotVView","viewHeight","stringLenPx","pxWidthForBlocks","hide","blockMessage","blockError","BlockMessage","BlockError","ServerSideRenderedDotplotContent","shouldDisplay","borderSize","borderX","borderY","warnings","ReactComponent2","vview","hview","bpPerPxY","bpPerPxX","offX","offY","DotplotDisplay","DotplotRenderer","ComparativeRenderer","process","dimensions","drawDotplot","thresholdsPalette","thresholds","ComparativeRender","rend","getRenderer","MismatchParser","DotplotPlugin","tickSize","vtextRotation","htextRotation","drawCigar","viewTrackConfigs","cursorMode","showPanButtons","wheelMode","hticks","vticks","setShowPanButtons","setWheelMode","setCursorMode","setDrawCigar","setBorderX","setBorderY","setAssemblyNames","setViews","arr","getCoords","mousedown","mouseup","xmin","xmax","minmax","ymin","ymax","onDotplotView","d1","d2","_unused1","rest1","_unused2","viewSnapshot","removeTemporaryAssembly","vblocks","hblocks","hoffset","voffset","vhide","hhide","by","bx","squareView","hpx","vpx","squareViewProportional","ratio","DotplotViewF","DotplotRendererF","LaunchDotplotViewF","pluggableElement","newStateModel","superContextMenuItems","readAssembly","trackAssembly","SA2","totalLength","refLength","gatherOverlaps","DotplotReadVsRefMenuItem","TimelineIcon","gtfLocation","GtfPlugin","gtfAdapterConfigSchema","gffGzLocation","dontRedispatch","gffLocation","GFF3Plugin","Gff3TabixAdapterF","Gff3AdapterF","GuessGff3F","Job","statusMessage","progressPct","cancelCallback","setCancelCallback","setStatusMessage","setProgressPct","pct","JobsManagementPlugin","jobs","queued","addJob","job","addedJob","removeJob","jobName","indx","removed","addFinishedJob","addQueuedJob","addAbortedJob","removeQueuedJob","updateJobStatusMessage","updateJobProgressPct","JobsListWidgetF","appendToMenu","Indexing","jobStatusWidget","rootUrlTemplate","namesIndexLocation","dataDirLocation","fetchJb1","convertTrackConfig","assemblies","jb2Tracks","jb1Track","dataRoot","breakConnection","LegacyJBrowsePlugin","NCListAdapterF","GuessNCListF","JBrowse1TextSearchAdapterF","JBrowse1ConnectionF","view0","existingFeatures","featIds","newFeatIds","foundNewFeatureNotInExistingMap","foundExistingFeatureNotInNewMap","existingFeat","middleComparativeHeight","setMiddleComparativeHeight","shownTracks","average","headerMenuItems","mainCanvas","clickMapCanvas","cigarClickMapCanvas","mouseoverCanvas","featPositions","mouseoverId","clickId","cigarMouseoverId","setFeatPositions","setMainCanvasRef","setClickMapCanvasRef","setCigarClickMapCanvasRef","setMouseoverCanvasRef","setMouseoverId","setCigarMouseoverId","setClickId","numFeats","featMap","LaunchSyntenyViewDialog","Curves","drawCIGAR","drawCurves","toggleCurves","toggleCIGAR","superHeaderMenuItems","superMenuItems","CropFreeIcon","ReadVsRefDialog","LinearComparativeViewPlugin","LinearComparativeViewF","LinearSyntenyViewF","LinearComparativeDisplayF","middle","baseConfigFactory","LinearSyntenyDisplayF","linearPileupDisplayConfigSchemaFactory","LGVSyntenyDisplayF","LaunchLinearSyntenyViewF","SyntenyTrackF","CalendarIcon","FloatingLayout","layoutDirty","anchorLocation","getLayout","sorted","maxBottom","layoutEntries","currentItem","previouslyLaidOutItem","prevStart","prevTop","prevWidth","prevHeight","prevEnd","prevBottom","pairs","PrecomputedFloatingLayout","FloatingLayoutSession","layoutIsValid","LollipopRenderer","innerColor","caption","minStickLength","stickColor","stickWidth","LollipopPlugin","LollipopRendererF","LinearLollipopDisplayF","displayModeSetting","renderArcSvg","ArcTooltip","Arc","isMouseOvered","setIsMouseOvered","textStroke","textYCoord","centerX","centerY","angleInDegrees","angleInRadians","cos","sin","describeArc","startAngle","endAngle","largeArcFlag","SemiCircles","semicircles","thickness","ArcRenderer","ArcPlugin","ArcRendererF","LinearArcDisplayF","LinearPairedArcDisplayF","attributeName","_feature","MenusPlugin","aboutConfigSchema","aboutStateModel","helpConfigSchema","helpStateModel","importSessionConfigSchema","importSessionStateModel","sessionManagerConfigSchema","sessionManagerStateModel","InfoIcon","widget","SPARQLAdapter","endpoint","queryTemplate","additionalQueryParams","refNamesQueryTemplate","configRefNames","encodeURIComponent","querySparql","resultsToRefNames","filledTemplate","resultsToFeatures","next","accept","bindings","head","vars","requiredField","seenFeatures","rawData","rd","parentUniqueId","pid","sf","subfeature","seenFeature","RdfPlugin","sparqlAdapterConfigSchema","SPARQLAdapterClass","twoBitLocation","chromSizesLocation","Translation","codonTable","frame","seqStart","frameShift","frameShiftAdjustedSeqLength","multipleOfThreeLength","seqSliced","translated","codon","normalizedCodon","aminoAcid","letter","codonWidth","renderLetter","defaultFill","framesCDS","frames","codonFill","defaultStarts","startCodon","defaultStops","stopCodon","Sequence","sequenceType","getContrastText","SequenceSVG","showReverse","showForward","showTranslation","generateCodonTable","defaultCodonTable","currY","showSequence","forwardFrames","reverseFrames","topFrames","bottomFrames","toReversed","complement","userSelect","sequenceHeight","DivSequenceRenderer","fastaLocation","faiLocation","metadataLocation","gziLocation","rewriteRefNames","searchForward","searchReverse","caseInsensitive","divSequenceRendererConfigSchema","SequencePlugin","DivSequenceRendererF","TwoBitAdapterF","BgzipFastaAdapterF","ChromSizesAdapterF","IndexedFastaAdapterF","UnindexedFastaAdapterF","SequenceSearchAdapterF","createReferenceSeqTrackConfig","ReferenceSequenceTrackF","showForwardActual","showReverseActual","showTranslationActual","toggleShowForward","toggleShowReverse","toggleShowTranslation","LinearReferenceSequenceDisplayF","createExtensionPoints","fontHeight","featureWidth","allowedWidthExpansion","totalWidth","measuredTextWidth","viewLeft","labelVisible","setLabelVisible","rstart","featureWidthBp","offsetPx1","rootLayout","shouldShowName","shouldShowDescription","featureLayout","GlyphComponent","FeatureLabel","OverlayRect","rectProps","rectTop","screenWidth","rectHeight","leftWithinBlock","widthWithinBlock","handlers","mouseoverFeatureId","renderOverlay","setRenderOverlay","onFeatureMouseOut","onFeatureMouseOver","onFeatureMouseDown","onFeatureMouseEnter","onFeatureMouseUp","onFeatureMouseLeave","onFeatureMouseMove","reverseFlip","color2","topLevel","featureStart","featureEnd","featureType","featureStrand","featurePhase","isUTR","getFrame","frameColor","Arrow","subfeatureId","subfeatureLayout","getSubparts","hasUTRs","isTranscript","subs","subparts","haveLeftUTR","haveRightUTR","codeStart","codeEnd","exons","subpart","makeUTRs","confKey","makeSubpartsFilter","filterSubpart","ProcessedTranscript","Segments","layOut","extraGlyphs","layOutFeature","layOutSubfeatures","Subfeatures","topOffset","SubfeatureGlyphComponent","chooseGlyphComponent","subfeatureHeight","hasSubSub","validator","glyph","parentFeature","layoutParent","RenderedFeatureGlyph","detectRerender","labelAllowed","expansion","getWidth","glyphWidth","textWidth","aboveLayout","FeatureGlyph","RenderedFeatures","isFeatureDisplayed","featureDisplayHandler","maxConfHeight","useCallback","featureIdCurrentlyUnderMouse","SvgOverlay","color1","color3","labels","nameColor","descriptionColor","subParts","impliedUTRs","SvgFeatureRenderer","SVGPlugin","SvgFeatureRendererReactComponent","svgFeatureRendererConfigSchema","EditGCContentParamsDialog","SharedModelF","windowSize","windowDelta","setGCContentParams","windowSizeSetting","windowDeltaSetting","GCContentPlugin","GCContentAdapterF","configSchemaFactory1","stateModelF1","configSchemaFactory2","stateModelF2","LinearGCContentDisplayF","MakeSpreadsheetColumnType","DataCellReactComponent","FilterModelType","compare","categoryName","hasFilter","textFilterControlAdornment","textFilterControl","FilterReactComponent","filterModel","operationChoices","getPropertyMembers","operation","setOperation","locStringIsInvalid","setLocString","ClearIcon","OPERATION_PREDICATES","overlaps with","cellLocation","specifiedLocation","contained within","fully contains","columnNumber","parsed","parsedLocString","spreadsheet","predicate","_sheet","cellsWithDerived","cells","cell","extendedData","parsedCellText","cellA","cellB","compareLocs","_columnNumber","newViewId","locationLinkClick","OPERATIONS","textInCell","stringToFind","equals","starts with","ends with","indexOf","setString","ColumnTextFilter","TextColumnType","NumberFilterModel","numberInCell","firstNumber","greater than","less than","between","secondNumber","firstNumberIsInvalid","setFirstNumber","secondNumberIsInvalid","setSecondNumber","ColumnTypes","Text","LocString","LocRef","LocStart","LocEnd","allColumnTypes","AnyColumnType","AnyFilterModelType","columnType","CellModel","toggleSelect","unSelect","select","setExtendedData","columns","column","isDerived","isLoaded","RowModel","passingFiltersCount","sortedFilteredRows","selectedCount","selectedRows","selectedAndPassingFiltersCount","selectedFilteredRows","sortedRows","rowSortingComparisonFunction","sheet","filterControls","rowPassesFilters","unselectAll","ColumnDefinition","dataType","derivationFunctionText","rowSet","StaticRowSetModel","columnDisplayOrder","hasColumnNames","sortColumns","descending","switchDirection","defaultDataType","rowMenuPosition","hideRowSelection","dataTypeChoices","rowA","rowB","setRowMenuPosition","newPosition","setSortColumns","newSort","setColumnType","newTypeName","fileTypes","fileTypeParsers","CSV","parseCsvBuffer","TSV","parseTsvBuffer","VCF","parseVcfBuffer","BED","parseBedBuffer","BEDPE","parseBedPEBuffer","STAR-Fusion","parseSTARFusionBuffer","fileTypesRegexp","ImportWizard","fileType","hasColumnNameLine","columnNameLineNumber","selectedAssemblyName","fileSource","isReadyToOpen","canCancel","readyToDisplay","requiresUnzip","setSelectedAssemblyName","setFileSource","newSource","firstMatch","toggleHasColumnNameLine","setColumnNameLineNumber","newnumber","setFileType","cancelButton","import","typeParser","unzip","filehandle","readFile","displaySpreadsheet","RowFullTextFilter","rowFullText","columnFilters","AnyColumnFilter","setRowFullTextFilter","addBlankColumnFilter","removeColumnFilter","clearAllFilters","defaultRowMenuItems","DoneIcon","_view","rowNumber","hideFilterControls","FilterControlsModel","importWizard","ImportWizardModel","SpreadsheetModel","rowMenuItems","outputRows","setRowMenuItems","newItems","setImportMode","SpreadsheetViewPlugin","SpreadsheetViewF","exts","ext","pop","LaunchSpreadsheetViewF","ViewComfyIcon","circularViewOptions","svInspector","circularViewOptionsBarHeight","item","control","onlyDisplayRelevantRegionsInCircularView","setOnlyDisplayRelevantRegionsInCircularView","resizeHandleVert","resizeHandleHoriz","viewControls","viewsContainer","SvInspectorView","SpreadsheetViewReactComponent","CircularViewReactComponent","showCircularView","spreadsheetView","ret1","circularView","flexbox","CircularViewOptions","makeAdHocFeature","columnsAlreadyUsedInLocations","loc1","loc2","otherData","getFeatureForRow","vcfFeature","columnTypes","columnDefinition","locationColumnNumbers","locStartColumnNumbers","locEndColumnNumbers","locRefColumnNumbers","makeAdHocSvFeatureFromTwoLocations","textOf","colno","makeAdHocSvFeatureFromTwoRefStartEndSets","makeAdHocSvFeature","breakpointSplitViewSnapshotFromTableRow","svInspectorView","defaultOnChordClick","chordTrack","SvInspectorViewPlugin","SpreadsheetViewType","CircularViewType","CircularModel","featuresAdapterConfigSnapshot","featureRefNames","featuresCircularTrackConfiguration","spreadsheetWidth","circularViewWidth","refSet","reaction","generatedTrackConf","OpenInNewIcon","canOpenBreakpointSplitViewFromTableRow","openBreakpointSplitViewFromTableRow","SvInspectorViewF","LaunchSvInspectorViewF","TableChartIcon","baseColor","HicRenderer","useLogScale","setUseLogScale","hicLocation","HicPlugin","HicAdapterF","HicRendererF","HicTrackF","LinearHicDisplayF","ixFilePath","ixxFilePath","metaFilePath","TrixPlugin","LabeledRegionModel","RegionModel","setLabel","SharedBookmarksModel","sharedBookmarks","localStorageKeyF","host","highlightButton","showBookmarkHighlights","showBookmarkLabels","bookmarks","bookmark","removeBookmarkObject","sx","rev","GridBookmarkPlugin","selectedBookmarks","selectedAssembliesPre","bookmarkAssemblies","validAssemblies","areBookmarksHighlightedOnAllOpenViews","areBookmarksHighlightLabelsOnAllOpenViews","bookmarksWithValidAssemblies","sharedBookmarksModel","allBookmarksModel","setSelectedAssemblies","selectedAssemblies","importBookmarks","removeBookmark","updateBookmarkLabel","correspondingObj","updateBookmarkHighlight","updateBulkBookmarkHighlights","setSelectedBookmarks","setBookmarkedRegions","setHighlightToggle","toggle","toggleShowBookmarkHighlights","setLabelToggle","toggleShowBookmarkLabels","clearAllBookmarks","clearSelectedBookmarks","AddHighlightModelF","GridBookmarkWidgetF","activateBookmarkWidget","navigateNewestBookmark","bookmarkCurrentRegion","selectedRegions","superRubberBandMenuItems","BookmarksIcon","HighlightIcon","activationSequence","SVG","Alignments","Authentication","Bed","CircularView","Config","DataManagement","DotplotView","Gff3","LegacyJBrowse","LinearComparativeView","Lollipop","Menus","RDF","Variants","Wiggle","GCContent","SvInspectorPlugin","ComparativeAdapters"],"sourceRoot":""}