@jbrowse/core 4.3.0 → 5.0.0-beta.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +822 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +13 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +33 -22
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +8 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +117 -19
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +2 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +12 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +28 -17
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +19 -40
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +46 -30
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +20 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +66 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +2 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +3 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +3 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +7 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +19 -13
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +5 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +8 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +32 -10
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +18 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +10 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.d.ts +7 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +62 -24
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +10 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +64 -41
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +17 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +6 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +19 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.d.ts +5 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +15 -18
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +33 -17
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.d.ts +3 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.js +7 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.d.ts +11 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.js +29 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -6
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +18 -6
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +11 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.d.ts +9 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +63 -58
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +7 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +38 -51
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +19 -27
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +6 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +18 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +97 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/index.js +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +50 -63
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +62 -59
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.d.ts +21 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.js +24 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.d.ts +5 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +93 -75
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +4 -11
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.d.ts +5 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +21 -48
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.d.ts +8 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.js +20 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.d.ts +6 -3
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +33 -13
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.d.ts +7 -4
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +67 -11
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.d.ts +14 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.js +42 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +1 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +7 -7
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/types.d.ts +8 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.d.ts +9 -9
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +28 -44
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.d.ts +23 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.js +31 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +90 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.js +145 -23
- package/esm/BaseFeatureWidget/configSchema.js +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +38 -0
- package/esm/BaseFeatureWidget/formatDetails.js +103 -0
- package/esm/BaseFeatureWidget/index.d.ts +3 -1
- package/esm/BaseFeatureWidget/index.js +2 -2
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +80 -62
- package/esm/BaseFeatureWidget/stateModelFactory.js +128 -29
- package/esm/BaseFeatureWidget/types.d.ts +4 -3
- package/esm/BaseFeatureWidget/util.d.ts +4 -29
- package/esm/BaseFeatureWidget/util.js +20 -84
- package/esm/CorePlugin.js +11 -6
- package/esm/PhasedScheduler.d.ts +4 -2
- package/esm/PhasedScheduler.js +18 -2
- package/esm/Plugin.d.ts +6 -1
- package/esm/Plugin.js +7 -0
- package/esm/PluginLoader.d.ts +41 -40
- package/esm/PluginLoader.js +206 -78
- package/esm/PluginManager.d.ts +421 -55
- package/esm/PluginManager.js +461 -89
- package/esm/ReExports/BaseFeatureDetails.js +7 -6
- package/esm/ReExports/MuiDataGridReExports.d.ts +2 -2
- package/esm/ReExports/MuiDataGridReExports.js +58 -130
- package/esm/ReExports/MuiReExports.d.ts +3 -134
- package/esm/ReExports/MuiReExports.js +43 -16
- package/esm/ReExports/MuiStylesReExports.d.ts +66 -0
- package/esm/ReExports/MuiStylesReExports.js +55 -0
- package/esm/ReExports/index.js +1 -1
- package/esm/ReExports/lazify.d.ts +2 -2
- package/esm/ReExports/lazify.js +16 -3
- package/esm/ReExports/list.js +54 -229
- package/esm/ReExports/modules.js +62 -93
- package/esm/ReExports/muiComponentNames.d.ts +18 -0
- package/esm/ReExports/muiComponentNames.js +130 -0
- package/esm/ReExports/publicUtil.d.ts +1 -0
- package/esm/ReExports/publicUtil.js +28 -0
- package/esm/ReExports/registry.d.ts +2 -0
- package/esm/ReExports/registry.js +28 -0
- package/esm/ReExports/sharedModules.d.ts +96 -0
- package/esm/ReExports/sharedModules.js +59 -0
- package/esm/ReExports/uiStub.d.ts +1 -0
- package/esm/ReExports/uiStub.js +13 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +10 -0
- package/esm/TextSearch/BaseResults.d.ts +20 -21
- package/esm/TextSearch/BaseResults.js +8 -33
- package/esm/TextSearch/TextSearchManager.d.ts +14 -34
- package/esm/TextSearch/TextSearchManager.js +87 -34
- package/esm/assemblyManager/assembly.d.ts +307 -34
- package/esm/assemblyManager/assembly.js +551 -262
- package/esm/assemblyManager/assemblyAdapters.d.ts +12 -0
- package/esm/assemblyManager/assemblyAdapters.js +18 -0
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +192 -17
- package/esm/assemblyManager/assemblyConfigSchema.js +213 -19
- package/esm/assemblyManager/assemblyManager.d.ts +711 -303
- package/esm/assemblyManager/assemblyManager.js +351 -46
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +32 -0
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +85 -0
- package/esm/assemblyManager/geneticCodes.d.ts +21 -0
- package/esm/assemblyManager/geneticCodes.js +47 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +9 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +12 -0
- package/esm/assemblyManager/index.d.ts +1 -1
- package/esm/assemblyManager/index.js +2 -2
- package/esm/assemblyManager/loadRefNameMap.d.ts +5 -0
- package/esm/assemblyManager/loadRefNameMap.js +80 -0
- package/esm/assemblyManager/refNameColors.d.ts +1 -0
- package/esm/assemblyManager/refNameColors.js +32 -0
- package/esm/assemblyManager/refNameMaps.d.ts +26 -0
- package/esm/assemblyManager/refNameMaps.js +87 -0
- package/esm/assemblyManager/refNameMismatch.d.ts +54 -0
- package/esm/assemblyManager/refNameMismatch.js +66 -0
- package/esm/checkPlugins.d.ts +11 -0
- package/esm/checkPlugins.js +77 -0
- package/esm/configuration/configurationSchema.d.ts +122 -20
- package/esm/configuration/configurationSchema.js +374 -140
- package/esm/configuration/configurationSlot.d.ts +283 -30
- package/esm/configuration/configurationSlot.js +205 -226
- package/esm/configuration/formatAboutConfigSchema.d.ts +55 -0
- package/esm/configuration/formatAboutConfigSchema.js +58 -0
- package/esm/configuration/formatDetailsConfigSchema.d.ts +80 -0
- package/esm/configuration/formatDetailsConfigSchema.js +90 -0
- package/esm/configuration/fullConfSnapshot.d.ts +28 -0
- package/esm/configuration/fullConfSnapshot.js +66 -0
- package/esm/configuration/getConf.d.ts +88 -0
- package/esm/configuration/getConf.js +74 -0
- package/esm/configuration/index.d.ts +19 -3
- package/esm/configuration/index.js +19 -2
- package/esm/configuration/mergeFormatCallbacks.d.ts +15 -0
- package/esm/configuration/mergeFormatCallbacks.js +24 -0
- package/esm/configuration/promotableDefaults.d.ts +199 -0
- package/esm/configuration/promotableDefaults.js +332 -0
- package/esm/configuration/promotablePin.d.ts +55 -0
- package/esm/configuration/promotableResolve.d.ts +108 -0
- package/esm/configuration/promotableResolve.js +117 -0
- package/esm/configuration/promotableSlots.d.ts +12 -0
- package/esm/configuration/promotableSlots.js +45 -0
- package/esm/configuration/readConfObject.d.ts +56 -0
- package/esm/configuration/readConfObject.js +161 -0
- package/esm/configuration/schemaRegistry.d.ts +35 -0
- package/esm/configuration/schemaRegistry.js +50 -0
- package/esm/configuration/schemaTypes.d.ts +23 -0
- package/esm/configuration/schemaTypes.js +94 -0
- package/esm/configuration/slotFacade.d.ts +82 -0
- package/esm/configuration/slotFacade.js +89 -0
- package/esm/configuration/slotShape.d.ts +12 -0
- package/esm/configuration/slotShape.js +84 -0
- package/esm/configuration/slotValueUtils.d.ts +17 -0
- package/esm/configuration/slotValueUtils.js +25 -0
- package/esm/configuration/tabixIndexFields.d.ts +44 -0
- package/esm/configuration/tabixIndexFields.js +45 -0
- package/esm/configuration/tabixShorthand.d.ts +34 -0
- package/esm/configuration/tabixShorthand.js +45 -0
- package/esm/configuration/types.d.ts +170 -7
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +24 -10
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +23 -15
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +132 -7
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +136 -25
- package/esm/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +1 -0
- package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -5
- package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.js +9 -7
- package/esm/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +2 -1
- package/esm/data_adapters/BaseAdapter/CytobandAdapter.d.ts +7 -0
- package/esm/data_adapters/BaseAdapter/RegionsAdapter.d.ts +2 -1
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +29 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +17 -0
- package/esm/data_adapters/BaseAdapter/getAdapterId.d.ts +2 -0
- package/esm/data_adapters/BaseAdapter/getAdapterId.js +9 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +7 -4
- package/esm/data_adapters/BaseAdapter/index.js +6 -5
- package/esm/data_adapters/BaseAdapter/stats.d.ts +37 -5
- package/esm/data_adapters/BaseAdapter/stats.js +89 -24
- package/esm/data_adapters/BaseAdapter/types.d.ts +11 -8
- package/esm/data_adapters/BaseAdapter/types.js +1 -0
- package/esm/data_adapters/BaseAdapter/util.d.ts +5 -1
- package/esm/data_adapters/BaseAdapter/util.js +14 -3
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +1 -1
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +4 -4
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +36 -4
- package/esm/data_adapters/CytobandAdapter/configSchema.js +46 -2
- package/esm/data_adapters/CytobandAdapter/index.js +3 -3
- package/esm/data_adapters/adapterSessionRefcount.d.ts +61 -0
- package/esm/data_adapters/adapterSessionRefcount.js +96 -0
- package/esm/data_adapters/dataAdapterCache.d.ts +35 -1
- package/esm/data_adapters/dataAdapterCache.js +62 -22
- package/esm/data_adapters/getFeatureAdapter.d.ts +22 -0
- package/esm/data_adapters/getFeatureAdapter.js +27 -0
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +21 -0
- package/esm/data_adapters/getSequenceSubAdapter.js +44 -0
- package/esm/pluggableElementTypes/AdapterType.d.ts +52 -2
- package/esm/pluggableElementTypes/AdapterType.js +44 -5
- package/esm/pluggableElementTypes/AddTrackWorkflowType.d.ts +6 -1
- package/esm/pluggableElementTypes/AddTrackWorkflowType.js +3 -1
- package/esm/pluggableElementTypes/ConnectionType.d.ts +5 -5
- package/esm/pluggableElementTypes/ConnectionType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +19 -10
- package/esm/pluggableElementTypes/DisplayType.js +53 -5
- package/esm/pluggableElementTypes/InternetAccountType.js +1 -1
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +13 -0
- package/esm/pluggableElementTypes/PluggableElementBase.js +13 -0
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +132 -12
- package/esm/pluggableElementTypes/RpcMethodType.js +263 -98
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +19 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.js +26 -20
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.d.ts +5 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.js +18 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.d.ts +5 -0
- package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.js +10 -0
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +3 -3
- package/esm/pluggableElementTypes/TextSearchAdapterType.js +3 -1
- package/esm/pluggableElementTypes/TrackType.d.ts +2 -1
- package/esm/pluggableElementTypes/TrackType.js +1 -1
- package/esm/pluggableElementTypes/ViewType.d.ts +27 -3
- package/esm/pluggableElementTypes/ViewType.js +84 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +2 -2
- package/esm/pluggableElementTypes/WidgetType.js +1 -1
- package/esm/pluggableElementTypes/addMenuItems.d.ts +87 -0
- package/esm/pluggableElementTypes/addMenuItems.js +82 -0
- package/esm/pluggableElementTypes/extendElementType.d.ts +30 -0
- package/esm/pluggableElementTypes/extendElementType.js +73 -0
- package/esm/pluggableElementTypes/index.d.ts +7 -7
- package/esm/pluggableElementTypes/index.js +24 -14
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +70 -15
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +90 -10
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +646 -84
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +241 -60
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +216 -35
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +365 -83
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +216 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +150 -16
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +51 -0
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +78 -0
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +163 -29
- package/esm/pluggableElementTypes/models/InternetAccountModel.js +218 -48
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +177 -0
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +239 -0
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -8
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +18 -2
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +39 -20
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +23 -2
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +181 -65
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +191 -89
- package/esm/pluggableElementTypes/models/components/SaveTrackData.d.ts +3 -8
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +113 -139
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +55 -0
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +83 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +40 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +115 -0
- package/esm/pluggableElementTypes/models/index.d.ts +6 -3
- package/esm/pluggableElementTypes/models/index.js +10 -8
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +34 -0
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +54 -0
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/bed.js +75 -7
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +9 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +153 -103
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.d.ts +6 -1
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.js +70 -74
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +9 -1
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.d.ts +21 -0
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.js +51 -0
- package/esm/pluggableElementTypes/models/uriMatchesDomains.d.ts +29 -0
- package/esm/pluggableElementTypes/models/uriMatchesDomains.js +62 -0
- package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.d.ts +5 -4
- package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.js +20 -10
- package/esm/pluginDefinitions.d.ts +198 -0
- package/esm/pluginDefinitions.js +220 -0
- package/esm/rpc/BaseRpcDriver.d.ts +27 -35
- package/esm/rpc/BaseRpcDriver.js +74 -107
- package/esm/rpc/MainThreadRpcDriver.d.ts +9 -10
- package/esm/rpc/MainThreadRpcDriver.js +18 -29
- package/esm/rpc/RpcClient.d.ts +38 -0
- package/esm/rpc/RpcClient.js +154 -0
- package/esm/rpc/RpcManager.d.ts +116 -27
- package/esm/rpc/RpcManager.js +177 -50
- package/esm/rpc/RpcRegistry.d.ts +275 -0
- package/esm/rpc/RpcRegistry.js +1 -0
- package/esm/rpc/RpcServer.d.ts +41 -0
- package/esm/rpc/RpcServer.js +235 -0
- package/esm/rpc/WebWorkerRpcDriver.d.ts +71 -24
- package/esm/rpc/WebWorkerRpcDriver.js +312 -27
- package/esm/rpc/byteBudget.d.ts +58 -0
- package/esm/rpc/byteBudget.js +50 -0
- package/esm/rpc/configSchema.d.ts +27 -5
- package/esm/rpc/configSchema.js +40 -16
- package/esm/rpc/coreRpcMethods.d.ts +3 -5
- package/esm/rpc/coreRpcMethods.js +10 -12
- package/esm/rpc/explainTransferError.d.ts +35 -0
- package/esm/rpc/explainTransferError.js +158 -0
- package/esm/rpc/methods/CoreFreeResources.d.ts +19 -4
- package/esm/rpc/methods/CoreFreeResources.js +17 -6
- package/esm/rpc/methods/CoreGetExportData.d.ts +5 -18
- package/esm/rpc/methods/CoreGetExportData.js +26 -15
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.d.ts +6 -15
- package/esm/rpc/methods/CoreGetFeatures.js +15 -17
- package/esm/rpc/methods/CoreGetInfo.d.ts +6 -0
- package/esm/rpc/methods/CoreGetInfo.js +12 -0
- package/esm/rpc/methods/CoreGetMetadata.d.ts +4 -7
- package/esm/rpc/methods/CoreGetMetadata.js +6 -9
- package/esm/rpc/methods/CoreGetRefNames.d.ts +4 -8
- package/esm/rpc/methods/CoreGetRefNames.js +24 -13
- package/esm/rpc/methods/CoreGetRegionByteEstimate.d.ts +6 -0
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +19 -0
- package/esm/rpc/methods/CoreGetRegions.d.ts +4 -6
- package/esm/rpc/methods/CoreGetRegions.js +6 -9
- package/esm/rpc/methods/CoreGetSequence.d.ts +4 -11
- package/esm/rpc/methods/CoreGetSequence.js +12 -13
- package/esm/rpc/serializeError/index.d.ts +9 -0
- package/esm/rpc/serializeError/index.js +86 -0
- package/esm/svg/SvgExport.d.ts +30 -0
- package/esm/svg/SvgExport.js +53 -0
- package/esm/svg/constants.d.ts +1 -0
- package/esm/svg/constants.js +5 -0
- package/esm/svg/saveSvgAsImage.d.ts +6 -0
- package/esm/svg/saveSvgAsImage.js +90 -0
- package/esm/svg/svgId.d.ts +42 -0
- package/esm/svg/svgId.js +84 -0
- package/esm/svg/svgReady.d.ts +137 -0
- package/esm/svg/svgReady.js +164 -0
- package/esm/svg/trackNames.d.ts +27 -0
- package/esm/svg/trackNames.js +31 -0
- package/esm/svg/wrapSvgExport.d.ts +12 -0
- package/esm/svg/wrapSvgExport.js +78 -0
- package/esm/ui/ActionLink.d.ts +7 -0
- package/esm/ui/ActionLink.js +9 -0
- package/esm/ui/AddCustomPluginDialog.d.ts +14 -0
- package/esm/ui/AddCustomPluginDialog.js +61 -0
- package/esm/ui/AddGenomePane.d.ts +8 -0
- package/esm/ui/AddGenomePane.js +228 -0
- package/esm/ui/AdvancedOptions.d.ts +6 -0
- package/esm/ui/AdvancedOptions.js +17 -0
- package/esm/ui/AppLogo.d.ts +1 -1
- package/esm/ui/AppLogo.js +2 -2
- package/esm/ui/AssemblySelector.d.ts +5 -8
- package/esm/ui/AssemblySelector.js +8 -26
- package/esm/ui/BaseExportSvgDialog.d.ts +16 -0
- package/esm/ui/BaseExportSvgDialog.js +84 -0
- package/esm/ui/BaseTooltip.d.ts +14 -3
- package/esm/ui/BaseTooltip.js +151 -34
- package/esm/ui/CascadingMenu.d.ts +9 -18
- package/esm/ui/CascadingMenu.js +390 -41
- package/esm/ui/CascadingMenuButton.d.ts +9 -11
- package/esm/ui/CascadingMenuButton.js +36 -18
- package/esm/ui/CascadingMenuHelpDialog.d.ts +2 -2
- package/esm/ui/CascadingMenuHelpDialog.js +4 -5
- package/esm/ui/CascadingMenuHelpIconButton.d.ts +2 -1
- package/esm/ui/CascadingMenuHelpIconButton.js +18 -9
- package/esm/ui/ColorPicker.d.ts +6 -9
- package/esm/ui/ColorPicker.js +36 -39
- package/esm/ui/ConfirmDialog.d.ts +2 -9
- package/esm/ui/ConfirmDialog.js +6 -9
- package/esm/ui/ContextMenu.d.ts +50 -0
- package/esm/ui/ContextMenu.js +55 -0
- package/esm/ui/CopyToClipboardButton.d.ts +10 -0
- package/esm/ui/CopyToClipboardButton.js +14 -0
- package/esm/ui/Crosshairs.d.ts +10 -0
- package/esm/ui/Crosshairs.js +15 -0
- package/esm/ui/DOMPurifySanitizedHTML.d.ts +1 -1
- package/esm/ui/DOMPurifySanitizedHTML.js +5 -5
- package/esm/ui/DataGridFlexContainer.d.ts +9 -2
- package/esm/ui/DataGridFlexContainer.js +4 -3
- package/esm/ui/Dialog.d.ts +5 -2
- package/esm/ui/Dialog.js +35 -27
- package/esm/ui/DraggableDialog.d.ts +3 -3
- package/esm/ui/DraggableDialog.js +50 -12
- package/esm/ui/DropDownMenu.d.ts +4 -2
- package/esm/ui/DropDownMenu.js +4 -4
- package/esm/ui/EditableTypography.d.ts +3 -1
- package/esm/ui/EditableTypography.js +34 -26
- package/esm/ui/ErrorActions.d.ts +24 -0
- package/esm/ui/ErrorActions.js +20 -0
- package/esm/ui/ErrorBanner.d.ts +7 -0
- package/esm/ui/ErrorBanner.js +35 -0
- package/esm/ui/ErrorBar.d.ts +6 -0
- package/esm/ui/ErrorBar.js +35 -0
- package/esm/ui/ErrorBoundary.d.ts +29 -5
- package/esm/ui/ErrorBoundary.js +32 -2
- package/esm/ui/ErrorMessage.d.ts +2 -4
- package/esm/ui/ErrorMessage.js +17 -52
- package/esm/ui/ErrorMessageStackTraceContents.d.ts +1 -1
- package/esm/ui/ErrorMessageStackTraceContents.js +3 -3
- package/esm/ui/ErrorMessageStackTraceDialog.d.ts +1 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +57 -96
- package/esm/ui/ErrorOverlay.d.ts +8 -0
- package/esm/ui/ErrorOverlay.js +5 -0
- package/esm/ui/ExportSvgDialog.d.ts +7 -0
- package/esm/ui/ExportSvgDialog.js +9 -0
- package/esm/ui/ExternalLink.d.ts +1 -1
- package/esm/ui/FactoryResetDialog.d.ts +1 -1
- package/esm/ui/FactoryResetDialog.js +6 -15
- package/esm/ui/FatalErrorDialog.d.ts +3 -2
- package/esm/ui/FatalErrorDialog.js +6 -5
- package/esm/ui/FileDropZone.d.ts +25 -0
- package/esm/ui/FileDropZone.js +128 -0
- package/esm/ui/FileSelector/FileSelector.d.ts +1 -1
- package/esm/ui/FileSelector/FileSelector.js +59 -30
- package/esm/ui/FileSelector/LocalFileChooser.d.ts +7 -2
- package/esm/ui/FileSelector/LocalFileChooser.js +61 -47
- package/esm/ui/FileSelector/LocationInput.d.ts +1 -1
- package/esm/ui/FileSelector/LocationInput.js +8 -12
- package/esm/ui/FileSelector/SourceTypeSelector.d.ts +5 -5
- package/esm/ui/FileSelector/SourceTypeSelector.js +9 -7
- package/esm/ui/FileSelector/UrlChooser.d.ts +1 -1
- package/esm/ui/FileSelector/UrlChooser.js +26 -2
- package/esm/ui/FileSelector/emptySourceType.d.ts +2 -0
- package/esm/ui/FileSelector/emptySourceType.js +14 -0
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +383 -71
- package/esm/ui/FileSelector/useInternetAccounts.js +13 -6
- package/esm/ui/FileSelector/util.d.ts +58 -3
- package/esm/ui/FileSelector/util.js +128 -11
- package/esm/ui/GpuFallbackButton.d.ts +12 -0
- package/esm/ui/GpuFallbackButton.js +20 -0
- package/esm/ui/HoverMenu.d.ts +12 -3
- package/esm/ui/HoverMenu.js +31 -9
- package/esm/ui/HoverTooltip.d.ts +27 -0
- package/esm/ui/HoverTooltip.js +24 -0
- package/esm/ui/Icons.d.ts +6 -4
- package/esm/ui/Icons.js +9 -0
- package/esm/ui/InfoDialog.d.ts +7 -0
- package/esm/ui/InfoDialog.js +16 -0
- package/esm/ui/InlineMenuControls.d.ts +6 -0
- package/esm/ui/InlineMenuControls.js +17 -0
- package/esm/ui/JexlFilterDialog.d.ts +23 -0
- package/esm/ui/JexlFilterDialog.js +94 -0
- package/esm/ui/LabeledCheckbox.d.ts +9 -0
- package/esm/ui/LabeledCheckbox.js +7 -0
- package/esm/ui/LegendSwatchGlyph.d.ts +7 -0
- package/esm/ui/LegendSwatchGlyph.js +25 -0
- package/esm/ui/LoadingDots.d.ts +1 -0
- package/esm/ui/LoadingDots.js +30 -0
- package/esm/ui/LoadingEllipses.d.ts +17 -1
- package/esm/ui/LoadingEllipses.js +20 -29
- package/esm/ui/LoadingOverlay.d.ts +23 -0
- package/esm/ui/LoadingOverlay.js +137 -0
- package/esm/ui/LoadingProgress.d.ts +16 -0
- package/esm/ui/LoadingProgress.js +16 -0
- package/esm/ui/Logo.d.ts +2 -2
- package/esm/ui/Logo.js +23 -24
- package/esm/ui/Menu.js +1 -1
- package/esm/ui/MenuItemChevron.d.ts +3 -0
- package/esm/ui/MenuItemChevron.js +19 -0
- package/esm/ui/MenuItemEndDecoration.d.ts +4 -0
- package/esm/ui/MenuItemEndDecoration.js +28 -0
- package/esm/ui/MenuItemTrailing.d.ts +12 -0
- package/esm/ui/MenuItemTrailing.js +42 -0
- package/esm/ui/MenuTypes.d.ts +134 -5
- package/esm/ui/MenuTypes.js +16 -1
- package/esm/ui/MonospaceTextField.d.ts +9 -0
- package/esm/ui/MonospaceTextField.js +37 -0
- package/esm/ui/NumberTextField.d.ts +31 -0
- package/esm/ui/NumberTextField.js +33 -0
- package/esm/ui/PaletteContext.d.ts +92 -0
- package/esm/ui/PaletteContext.js +133 -0
- package/esm/ui/PinAdornment.d.ts +5 -0
- package/esm/ui/PinAdornment.js +85 -0
- package/esm/ui/PluggableComponent.d.ts +10 -0
- package/esm/ui/PluggableComponent.js +19 -0
- package/esm/ui/PluggableComponents.d.ts +29 -0
- package/esm/ui/PluggableComponents.js +28 -0
- package/esm/ui/PluggableElements.d.ts +23 -0
- package/esm/ui/PluggableElements.js +24 -0
- package/esm/ui/PluginStoreCard.d.ts +17 -0
- package/esm/ui/PluginStoreCard.js +45 -0
- package/esm/ui/PopoverPicker.d.ts +6 -0
- package/esm/ui/PopoverPicker.js +25 -0
- package/esm/ui/PrerenderedCanvas.d.ts +1 -1
- package/esm/ui/PrerenderedCanvas.js +5 -4
- package/esm/ui/ProgressChip.d.ts +37 -0
- package/esm/ui/ProgressChip.js +66 -0
- package/esm/ui/RedErrorMessageBox.d.ts +1 -1
- package/esm/ui/RedErrorMessageBox.js +9 -3
- package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +5 -0
- package/esm/ui/RefNameAutocomplete/EndAdornment.js +31 -0
- package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -0
- package/esm/ui/RefNameAutocomplete/HelpDialog.js +7 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +22 -0
- package/esm/ui/RefNameAutocomplete/index.js +78 -0
- package/esm/ui/RefNameAutocomplete/util.d.ts +49 -0
- package/esm/ui/RefNameAutocomplete/util.js +168 -0
- package/esm/ui/ReplaceCurrentViewButton.d.ts +19 -0
- package/esm/ui/ReplaceCurrentViewButton.js +22 -0
- package/esm/ui/ResizeHandle.d.ts +13 -7
- package/esm/ui/ResizeHandle.js +42 -55
- package/esm/ui/ReturnToImportFormDialog.d.ts +1 -1
- package/esm/ui/ReturnToImportFormDialog.js +7 -9
- package/esm/ui/SanitizedHTML.d.ts +6 -1
- package/esm/ui/SanitizedHTML.js +7 -47
- package/esm/ui/ScrollEdgeShadow.d.ts +44 -0
- package/esm/ui/ScrollEdgeShadow.js +98 -0
- package/esm/ui/ScrollZoomToggle.d.ts +38 -0
- package/esm/ui/ScrollZoomToggle.js +92 -0
- package/esm/ui/SequenceAdapterInputs.d.ts +9 -0
- package/esm/ui/SequenceAdapterInputs.js +30 -0
- package/esm/ui/SettingsChangesTable.d.ts +14 -0
- package/esm/ui/SettingsChangesTable.js +49 -0
- package/esm/ui/ShareLinkField.d.ts +6 -0
- package/esm/ui/ShareLinkField.js +42 -0
- package/esm/ui/SingleSlider.d.ts +8 -0
- package/esm/ui/SingleSlider.js +11 -0
- package/esm/ui/SizeSliderRow.d.ts +16 -0
- package/esm/ui/SizeSliderRow.js +50 -0
- package/esm/ui/SliderTooltip.d.ts +2 -0
- package/esm/ui/SliderTooltip.js +17 -0
- package/esm/ui/Snackbar.d.ts +4 -2
- package/esm/ui/Snackbar.js +11 -8
- package/esm/ui/SnackbarContents.d.ts +1 -1
- package/esm/ui/SnackbarContents.js +21 -3
- package/esm/ui/SnackbarModel.d.ts +40 -0
- package/esm/ui/SnackbarModel.js +43 -11
- package/esm/ui/StackTraceButton.d.ts +5 -0
- package/esm/ui/StackTraceButton.js +16 -0
- package/esm/ui/StatusProgressBar.d.ts +37 -0
- package/esm/ui/StatusProgressBar.js +76 -0
- package/esm/ui/SubmitDialog.d.ts +6 -0
- package/esm/ui/SubmitDialog.js +9 -0
- package/esm/ui/SubmitForm.d.ts +23 -0
- package/esm/ui/SubmitForm.js +23 -0
- package/esm/ui/SvgColorLegend.d.ts +13 -0
- package/esm/ui/SvgColorLegend.js +65 -0
- package/esm/ui/SvgGradientLegend.d.ts +26 -0
- package/esm/ui/SvgGradientLegend.js +26 -0
- package/esm/ui/TagTextField.d.ts +40 -0
- package/esm/ui/TagTextField.js +32 -0
- package/esm/ui/VerticalScrollbar.d.ts +45 -0
- package/esm/ui/VerticalScrollbar.js +158 -0
- package/esm/ui/ViewLoadingScreen.d.ts +24 -0
- package/esm/ui/ViewLoadingScreen.js +76 -0
- package/esm/ui/addExtensionElement.d.ts +18 -0
- package/esm/ui/addExtensionElement.js +23 -0
- package/esm/ui/buildExtraTrackMenuItems.d.ts +22 -0
- package/esm/ui/buildExtraTrackMenuItems.js +14 -0
- package/esm/ui/colorSwatchStyle.d.ts +9 -0
- package/esm/ui/colorSwatchStyle.js +11 -0
- package/esm/ui/colors.d.ts +61 -8
- package/esm/ui/colors.js +135 -1
- package/esm/ui/extensionSelectors.d.ts +38 -0
- package/esm/ui/extensionSelectors.js +49 -0
- package/esm/ui/filterMenuItems.d.ts +112 -0
- package/esm/ui/filterMenuItems.js +86 -0
- package/esm/ui/formatErrorStack.d.ts +1 -0
- package/esm/ui/formatErrorStack.js +56 -0
- package/esm/ui/gpuFallback.d.ts +33 -0
- package/esm/ui/gpuFallback.js +39 -0
- package/esm/ui/highlightChipReveal.d.ts +32 -0
- package/esm/ui/highlightChipReveal.js +39 -0
- package/esm/ui/hoverBoxStyle.d.ts +11 -0
- package/esm/ui/hoverBoxStyle.js +13 -0
- package/esm/ui/index.d.ts +76 -4
- package/esm/ui/index.js +90 -19
- package/esm/ui/inlineMenuRowWidth.d.ts +1 -0
- package/esm/ui/inlineMenuRowWidth.js +8 -0
- package/esm/ui/launchTargetsMenuItem.d.ts +18 -0
- package/esm/ui/launchTargetsMenuItem.js +24 -0
- package/esm/ui/launchViewMenu.d.ts +4 -0
- package/esm/ui/launchViewMenu.js +42 -0
- package/esm/ui/legendMenuItem.d.ts +38 -0
- package/esm/ui/legendMenuItem.js +44 -0
- package/esm/ui/legendSpec.d.ts +62 -0
- package/esm/ui/legendSpec.js +78 -0
- package/esm/ui/loadingDotKeyframes.d.ts +18 -0
- package/esm/ui/loadingDotKeyframes.js +17 -0
- package/esm/ui/makeSizeMenu.d.ts +30 -0
- package/esm/ui/makeSizeMenu.js +82 -0
- package/esm/ui/mapStackTrace.d.ts +8 -0
- package/esm/ui/mapStackTrace.js +108 -0
- package/esm/ui/measureLegendText.d.ts +1 -0
- package/esm/ui/measureLegendText.js +8 -0
- package/esm/ui/menuItemAdornment.d.ts +33 -0
- package/esm/ui/menuItemAdornment.js +50 -0
- package/esm/ui/menuItems.d.ts +28 -0
- package/esm/ui/menuItems.js +26 -0
- package/esm/ui/menuLabels.d.ts +41 -0
- package/esm/ui/menuLabels.js +43 -0
- package/esm/ui/multiTrackMenuItems.d.ts +19 -0
- package/esm/ui/multiTrackMenuItems.js +15 -0
- package/esm/ui/palette.d.ts +559 -0
- package/esm/ui/palette.js +746 -0
- package/esm/ui/parseError.d.ts +4 -0
- package/esm/ui/parseError.js +18 -0
- package/esm/ui/persistentScrollbarStyle.d.ts +49 -0
- package/esm/ui/persistentScrollbarStyle.js +53 -0
- package/esm/ui/promotableMenuItems.d.ts +19 -0
- package/esm/ui/promotableMenuItems.js +91 -0
- package/esm/ui/promotablePinCoverage.d.ts +44 -0
- package/esm/ui/promotablePinCoverage.js +88 -0
- package/esm/ui/radioSubMenu.d.ts +33 -0
- package/esm/ui/radioSubMenu.js +32 -0
- package/esm/ui/react-colorful.js +5 -1
- package/esm/ui/replaceViewAction.d.ts +31 -0
- package/esm/ui/replaceViewAction.js +39 -0
- package/esm/ui/rewriteExternalAnchors.d.ts +1 -0
- package/esm/ui/rewriteExternalAnchors.js +8 -0
- package/esm/ui/scrollZoomLabels.d.ts +17 -0
- package/esm/ui/scrollZoomLabels.js +22 -0
- package/esm/ui/showSubMenu.d.ts +19 -0
- package/esm/ui/showSubMenu.js +30 -0
- package/esm/ui/sliderScale.d.ts +6 -0
- package/esm/ui/sliderScale.js +30 -0
- package/esm/ui/statusProgressKeyframes.d.ts +6 -0
- package/esm/ui/statusProgressKeyframes.js +14 -0
- package/esm/ui/stripStackTraceMessage.d.ts +1 -0
- package/esm/ui/stripStackTraceMessage.js +9 -0
- package/esm/ui/styleTheme.d.ts +158 -0
- package/esm/ui/styleTheme.js +115 -0
- package/esm/ui/submenuAim.d.ts +30 -0
- package/esm/ui/submenuAim.js +37 -0
- package/esm/ui/theme.d.ts +343 -29
- package/esm/ui/theme.js +258 -342
- package/esm/ui/toggleMenuItems.d.ts +42 -0
- package/esm/ui/toggleMenuItems.js +60 -0
- package/esm/ui/useAssemblySelection.d.ts +153 -0
- package/esm/ui/useAssemblySelection.js +54 -0
- package/esm/ui/useCoalescedPointer.d.ts +36 -0
- package/esm/ui/useCoalescedPointer.js +60 -0
- package/esm/ui/useCopyToClipboard.d.ts +15 -0
- package/esm/ui/useCopyToClipboard.js +41 -0
- package/esm/ui/useExportSvgPreference.d.ts +1 -0
- package/esm/ui/useExportSvgPreference.js +4 -0
- package/esm/ui/useMouseTracking.d.ts +71 -0
- package/esm/ui/useMouseTracking.js +179 -0
- package/esm/ui/useRecentLocations.d.ts +28 -0
- package/esm/ui/useRecentLocations.js +31 -0
- package/esm/ui/wrapComponent.d.ts +47 -0
- package/esm/ui/wrapComponent.js +58 -0
- package/esm/ui/zIndexes.d.ts +28 -0
- package/esm/ui/zIndexes.js +38 -0
- package/esm/util/Base1DUtils.d.ts +204 -16
- package/esm/util/Base1DUtils.js +310 -175
- package/esm/util/Base1DViewModel.d.ts +97 -20
- package/esm/util/Base1DViewModel.js +148 -39
- package/esm/util/FileSaver/index.d.ts +1 -0
- package/esm/util/FileSaver/index.js +27 -0
- package/esm/util/IntervalTree.d.ts +18 -39
- package/esm/util/IntervalTree.js +63 -244
- package/esm/util/SvgCanvas.d.ts +81 -0
- package/esm/util/SvgCanvas.js +500 -0
- package/esm/util/TimeTraveller.d.ts +12 -0
- package/esm/util/TimeTraveller.js +130 -27
- package/esm/util/aborting.d.ts +17 -4
- package/esm/util/aborting.js +30 -25
- package/esm/util/adapterMetadata.d.ts +20 -0
- package/esm/util/adapterMetadata.js +39 -0
- package/esm/util/addAndShowTrack.d.ts +22 -0
- package/esm/util/addAndShowTrack.js +27 -0
- package/esm/util/addRelativeUris.d.ts +17 -0
- package/esm/util/addRelativeUris.js +42 -0
- package/esm/util/addTrackComponent.d.ts +72 -0
- package/esm/util/addTrackComponent.js +53 -0
- package/esm/util/addTrackFromWidget.d.ts +94 -0
- package/esm/util/addTrackFromWidget.js +90 -0
- package/esm/util/analytics.d.ts +32 -3
- package/esm/util/analytics.js +102 -49
- package/esm/util/animationAllowed.d.ts +17 -0
- package/esm/util/animationAllowed.js +22 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -0
- package/esm/util/applyRowResizeWheel.js +34 -0
- package/esm/util/assemblyConfigUtils.d.ts +144 -0
- package/esm/util/assemblyConfigUtils.js +498 -0
- package/esm/util/bandHeight.d.ts +53 -0
- package/esm/util/bandHeight.js +56 -0
- package/esm/util/bandLayout.d.ts +51 -0
- package/esm/util/bandLayout.js +36 -0
- package/esm/util/bezierConnector.d.ts +14 -0
- package/esm/util/bezierConnector.js +108 -0
- package/esm/util/bgzfWorkerPool.d.ts +78 -0
- package/esm/util/bgzfWorkerPool.js +81 -0
- package/esm/util/blockTypes.d.ts +64 -45
- package/esm/util/blockTypes.js +67 -74
- package/esm/util/bpUtils.d.ts +81 -0
- package/esm/util/bpUtils.js +103 -0
- package/esm/util/cacheBudgets.d.ts +55 -0
- package/esm/util/cacheBudgets.js +55 -0
- package/esm/util/cachedSetup.d.ts +51 -0
- package/esm/util/cachedSetup.js +87 -0
- package/esm/util/calculateDynamicBlocks.d.ts +5 -0
- package/esm/util/calculateDynamicBlocks.js +85 -82
- package/esm/util/calculateStaticBlocks.d.ts +2 -3
- package/esm/util/calculateStaticBlocks.js +48 -71
- package/esm/util/chooseGridPitch.d.ts +9 -0
- package/esm/util/chooseGridPitch.js +31 -0
- package/esm/util/clampToContig.d.ts +26 -0
- package/esm/util/clampToContig.js +28 -0
- package/esm/util/cmpStr.d.ts +1 -0
- package/esm/util/cmpStr.js +7 -0
- package/esm/util/coarseStripHTML.js +3 -15
- package/esm/util/color/cssColorsLevel4.js +6 -2
- package/esm/util/color/index.d.ts +81 -2
- package/esm/util/color/index.js +194 -25
- package/esm/util/color-bits/bit.d.ts +4 -0
- package/esm/util/color-bits/bit.js +37 -0
- package/esm/util/color-bits/convert.d.ts +23 -0
- package/esm/util/color-bits/convert.js +294 -0
- package/esm/util/color-bits/core.d.ts +34 -0
- package/esm/util/color-bits/core.js +67 -0
- package/esm/util/color-bits/format.d.ts +24 -0
- package/esm/util/color-bits/format.js +82 -0
- package/esm/util/color-bits/functions.d.ts +33 -0
- package/esm/util/color-bits/functions.js +70 -0
- package/esm/util/color-bits/index.d.ts +5 -0
- package/esm/util/color-bits/index.js +4 -0
- package/esm/util/color-bits/parse.d.ts +17 -0
- package/esm/util/color-bits/parse.js +382 -0
- package/esm/util/colorBits.d.ts +39 -0
- package/esm/util/colorBits.js +180 -0
- package/esm/util/colorRamp.d.ts +37 -0
- package/esm/util/colorRamp.js +93 -0
- package/esm/util/colord.d.ts +8 -0
- package/esm/util/colord.js +43 -191
- package/esm/util/convertCodingSequenceToPeptides.d.ts +17 -3
- package/esm/util/convertCodingSequenceToPeptides.js +51 -4
- package/esm/util/copyText.d.ts +18 -0
- package/esm/util/copyText.js +30 -0
- package/esm/util/copyToClipboard.d.ts +4 -0
- package/esm/util/copyToClipboard.js +58 -0
- package/esm/util/createStopTokenRotation.d.ts +118 -0
- package/esm/util/createStopTokenRotation.js +127 -0
- package/esm/util/createSvgRasterCanvas.d.ts +7 -0
- package/esm/util/createSvgRasterCanvas.js +22 -0
- package/esm/util/crypto.d.ts +24 -0
- package/esm/util/crypto.js +85 -2
- package/esm/util/dataGridUtils.d.ts +9 -0
- package/esm/util/dataGridUtils.js +36 -0
- package/esm/util/dedupe.js +1 -0
- package/esm/util/deepEqual.d.ts +8 -0
- package/esm/util/deepEqual.js +22 -0
- package/esm/util/deepMerge.d.ts +20 -0
- package/esm/util/deepMerge.js +44 -0
- package/esm/util/diagonalizeRegions.d.ts +23 -0
- package/esm/util/diagonalizeRegions.js +192 -0
- package/esm/util/environment.d.ts +4 -0
- package/esm/util/environment.js +43 -0
- package/esm/util/eventPoint.d.ts +32 -0
- package/esm/util/eventPoint.js +28 -0
- package/esm/util/fetchAndMaybeUnzip.d.ts +6 -0
- package/esm/util/fetchAndMaybeUnzip.js +64 -0
- package/esm/util/fetchContext.d.ts +82 -0
- package/esm/util/fetchContext.js +59 -0
- package/esm/util/fetchHub.d.ts +15 -0
- package/esm/util/fetchHub.js +31 -0
- package/esm/util/fetchJson.d.ts +1 -0
- package/esm/util/fetchJson.js +7 -0
- package/esm/util/fetchPhases.d.ts +77 -0
- package/esm/util/fetchPhases.js +1 -0
- package/esm/util/fetchSeq.d.ts +5 -1
- package/esm/util/fetchSeq.js +18 -6
- package/esm/util/fileHandleStore.d.ts +19 -2
- package/esm/util/fileHandleStore.js +95 -35
- package/esm/util/flatbush/index.d.ts +27 -6
- package/esm/util/flatbush/index.js +194 -218
- package/esm/util/formatBytes.d.ts +9 -0
- package/esm/util/formatBytes.js +18 -0
- package/esm/util/formatFastaStrings.d.ts +13 -0
- package/esm/util/formatFastaStrings.js +13 -0
- package/esm/util/formatGuessers.d.ts +30 -0
- package/esm/util/formatGuessers.js +69 -0
- package/esm/util/formatRelativeTime.d.ts +1 -0
- package/esm/util/formatRelativeTime.js +25 -0
- package/esm/util/frameCoalescer.d.ts +30 -0
- package/esm/util/frameCoalescer.js +22 -0
- package/esm/util/freezeDeep.d.ts +28 -0
- package/esm/util/freezeDeep.js +41 -0
- package/esm/util/geneticCodes.d.ts +56 -0
- package/esm/util/geneticCodes.js +371 -0
- package/esm/util/getFileName.d.ts +11 -0
- package/esm/util/getFileName.js +34 -0
- package/esm/util/getLocationUri.d.ts +49 -0
- package/esm/util/getLocationUri.js +63 -0
- package/esm/util/getRelativeX.d.ts +4 -0
- package/esm/util/getRelativeX.js +7 -0
- package/esm/util/getStr.d.ts +6 -0
- package/esm/util/getStr.js +15 -0
- package/esm/util/highlights.d.ts +21 -0
- package/esm/util/highlights.js +100 -0
- package/esm/util/hooks.d.ts +168 -0
- package/esm/util/hooks.js +443 -0
- package/esm/util/htmlText.d.ts +13 -0
- package/esm/util/htmlText.js +66 -0
- package/esm/util/idMaker.d.ts +1 -1
- package/esm/util/idMaker.js +31 -18
- package/esm/util/index.d.ts +81 -268
- package/esm/util/index.js +135 -853
- package/esm/util/indexCandidates.d.ts +50 -0
- package/esm/util/indexCandidates.js +101 -0
- package/esm/util/installClearHoverOnSurfaceMove.d.ts +40 -0
- package/esm/util/installClearHoverOnSurfaceMove.js +41 -0
- package/esm/util/installFetch.d.ts +220 -0
- package/esm/util/installFetch.js +206 -0
- package/esm/util/installInitAutorun.d.ts +62 -0
- package/esm/util/installInitAutorun.js +107 -0
- package/esm/util/intervals.d.ts +20 -0
- package/esm/util/intervals.js +37 -0
- package/esm/util/io/RemoteFileWithRangeCache.d.ts +10 -11
- package/esm/util/io/RemoteFileWithRangeCache.js +10 -148
- package/esm/util/io/index.d.ts +39 -2
- package/esm/util/io/index.js +115 -12
- package/esm/util/isDataCurrent.d.ts +7 -0
- package/esm/util/isDataCurrent.js +9 -0
- package/esm/util/isWebWorker.js +1 -2
- package/esm/util/iupac.d.ts +4 -0
- package/esm/util/iupac.js +59 -0
- package/esm/util/jexl.js +141 -17
- package/esm/util/jexlFilters.d.ts +75 -0
- package/esm/util/jexlFilters.js +49 -0
- package/esm/util/jexlStrings.d.ts +22 -1
- package/esm/util/jexlStrings.js +21 -14
- package/esm/util/layouts/GranularRectLayout.d.ts +13 -25
- package/esm/util/layouts/GranularRectLayout.js +99 -356
- package/esm/util/layouts/index.d.ts +1 -7
- package/esm/util/layouts/index.js +2 -6
- package/esm/util/layouts/intervalUtils.d.ts +12 -1
- package/esm/util/layouts/intervalUtils.js +13 -31
- package/esm/util/layouts/placeRect.d.ts +50 -0
- package/esm/util/layouts/placeRect.js +97 -0
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/leadingEdgeAutorun.d.ts +40 -0
- package/esm/util/leadingEdgeAutorun.js +51 -0
- package/esm/util/legendCandidates.d.ts +50 -0
- package/esm/util/legendCandidates.js +87 -0
- package/esm/util/librpc.d.ts +5 -2
- package/esm/util/librpc.js +6 -1
- package/esm/util/linkify.js +2 -0
- package/esm/util/locString.d.ts +72 -0
- package/esm/util/locString.js +178 -7
- package/esm/util/locStringsToRegions.d.ts +10 -0
- package/esm/util/locStringsToRegions.js +35 -0
- package/esm/util/localStorage.d.ts +36 -0
- package/esm/util/localStorage.js +137 -0
- package/esm/util/makeAssembly.d.ts +54 -0
- package/esm/util/makeAssembly.js +52 -0
- package/esm/util/makeTrackId.d.ts +14 -0
- package/esm/util/makeTrackId.js +14 -0
- package/esm/util/matchTrackId.d.ts +11 -0
- package/esm/util/matchTrackId.js +14 -0
- package/esm/util/measureText.d.ts +24 -0
- package/esm/util/measureText.js +51 -0
- package/esm/util/mst-reflection.d.ts +14 -4
- package/esm/util/mst-reflection.js +33 -32
- package/esm/util/mstUtils.d.ts +100 -0
- package/esm/util/mstUtils.js +140 -0
- package/esm/util/nanoid.d.ts +0 -4
- package/esm/util/nanoid.js +10 -20
- package/esm/util/numericUtils.d.ts +20 -0
- package/esm/util/numericUtils.js +127 -0
- package/esm/util/objectUtils.d.ts +2 -0
- package/esm/util/objectUtils.js +9 -0
- package/esm/util/offscreenCanvasPonyfill.d.ts +5 -4
- package/esm/util/offscreenCanvasPonyfill.js +5 -47
- package/esm/util/openDisplays.d.ts +23 -0
- package/esm/util/openDisplays.js +79 -0
- package/esm/util/openFeatureWidget.d.ts +33 -0
- package/esm/util/openFeatureWidget.js +64 -0
- package/esm/util/paintLayer.d.ts +32 -0
- package/esm/util/paintLayer.js +33 -0
- package/esm/util/parentWalk.d.ts +32 -0
- package/esm/util/parentWalk.js +84 -0
- package/esm/util/parseLineByLine.d.ts +45 -2
- package/esm/util/parseLineByLine.js +156 -15
- package/esm/util/parseMotifList.d.ts +17 -0
- package/esm/util/parseMotifList.js +69 -0
- package/esm/util/pluginStore.d.ts +114 -0
- package/esm/util/pluginStore.js +260 -0
- package/esm/util/pointerPresence.d.ts +5 -0
- package/esm/util/pointerPresence.js +21 -0
- package/esm/util/progress.d.ts +459 -0
- package/esm/util/progress.js +820 -0
- package/esm/util/range.d.ts +46 -1
- package/esm/util/range.js +68 -2
- package/esm/util/renameRegions.d.ts +21 -0
- package/esm/util/renameRegions.js +129 -0
- package/esm/util/renderToStaticMarkup.d.ts +2 -0
- package/esm/util/renderToStaticMarkup.js +50 -0
- package/esm/util/reorder.d.ts +35 -0
- package/esm/util/reorder.js +83 -0
- package/esm/util/resolveRowHeight.d.ts +27 -0
- package/esm/util/resolveRowHeight.js +30 -0
- package/esm/util/revlist.d.ts +13 -0
- package/esm/util/revlist.js +14 -0
- package/esm/util/rowStackGeometry.d.ts +66 -0
- package/esm/util/rowStackGeometry.js +70 -0
- package/esm/util/rpc.d.ts +16 -1
- package/esm/util/rpc.js +12 -1
- package/esm/util/rxjs.d.ts +30 -1
- package/esm/util/rxjs.js +88 -10
- package/esm/util/sameStrings.d.ts +16 -0
- package/esm/util/sameStrings.js +20 -0
- package/esm/util/scrollLatch.d.ts +4 -0
- package/esm/util/scrollLatch.js +59 -0
- package/esm/util/selectNamedRegions.d.ts +136 -0
- package/esm/util/selectNamedRegions.js +222 -0
- package/esm/util/seqUtils.d.ts +17 -0
- package/esm/util/seqUtils.js +80 -0
- package/esm/util/sessionServices.d.ts +29 -0
- package/esm/util/sessionServices.js +46 -0
- package/esm/util/sessionSharing.d.ts +38 -0
- package/esm/util/sessionSharing.js +154 -0
- package/esm/util/sessionStorage.d.ts +1 -0
- package/esm/util/sessionStorage.js +15 -0
- package/esm/util/setStackTraceLimit.d.ts +6 -0
- package/esm/util/setStackTraceLimit.js +20 -0
- package/esm/util/simpleFeature.d.ts +112 -4
- package/esm/util/simpleFeature.js +181 -29
- package/esm/util/springAnimate.d.ts +20 -0
- package/esm/util/springAnimate.js +80 -0
- package/esm/util/stats.d.ts +25 -2
- package/esm/util/stats.js +39 -8
- package/esm/util/stopToken.d.ts +207 -15
- package/esm/util/stopToken.js +403 -55
- package/esm/util/stringUtils.d.ts +5 -0
- package/esm/util/stringUtils.js +34 -0
- package/esm/util/svgColorProps.d.ts +7 -0
- package/esm/util/svgColorProps.js +28 -0
- package/esm/util/tabix.d.ts +126 -0
- package/esm/util/tabix.js +149 -0
- package/esm/util/tags.d.ts +2 -0
- package/esm/util/tags.js +5 -0
- package/esm/util/temporaryAssembly.d.ts +21 -0
- package/esm/util/temporaryAssembly.js +29 -0
- package/esm/util/tickLabels.d.ts +36 -0
- package/esm/util/tickLabels.js +45 -0
- package/esm/util/timeGate.d.ts +26 -0
- package/esm/util/timeGate.js +79 -0
- package/esm/util/trackConfigDelta.d.ts +84 -0
- package/esm/util/trackConfigDelta.js +190 -0
- package/esm/util/tracks.d.ts +398 -30
- package/esm/util/tracks.js +699 -191
- package/esm/util/tss-react/cssAndCx.js +11 -66
- package/esm/util/tss-react/index.d.ts +11 -2
- package/esm/util/tss-react/index.js +9 -2
- package/esm/util/tss-react/makeStyles.js +7 -4
- package/esm/util/tss-react/mergeClasses.js +1 -0
- package/esm/util/tss-react/tools/classnames.d.ts +3 -0
- package/esm/util/tss-react/tools/classnames.js +3 -0
- package/esm/util/tss-react/tools/getDependencyArrayRef.d.ts +18 -0
- package/esm/util/tss-react/tools/getDependencyArrayRef.js +19 -0
- package/esm/util/tss-react/types.d.ts +1 -1
- package/esm/util/tss-react/types.js +1 -6
- package/esm/util/types/ElementId.js +1 -1
- package/esm/util/types/data.d.ts +75 -0
- package/esm/util/types/data.js +41 -0
- package/esm/util/types/index.d.ts +402 -120
- package/esm/util/types/index.js +90 -64
- package/esm/util/types/isAny.d.ts +11 -0
- package/esm/util/types/isAny.js +1 -0
- package/esm/util/types/mst.d.ts +71 -47
- package/esm/util/types/mst.js +27 -22
- package/esm/util/types/predicate.d.ts +9 -0
- package/esm/util/types/predicate.js +1 -0
- package/esm/util/types/renderingServices.d.ts +16 -0
- package/esm/util/types/renderingServices.js +1 -0
- package/esm/util/types/services.d.ts +55 -0
- package/esm/util/types/services.js +10 -0
- package/esm/util/types/util.d.ts +8 -2
- package/esm/util/unknownSnapshotKeys.d.ts +36 -0
- package/esm/util/unknownSnapshotKeys.js +69 -0
- package/esm/util/unzip.d.ts +1 -0
- package/esm/util/unzip.js +6 -0
- package/esm/util/useEventCallback.d.ts +1 -0
- package/esm/util/useEventCallback.js +16 -0
- package/esm/util/useFeatureSequence.d.ts +13 -7
- package/esm/util/useFeatureSequence.js +56 -78
- package/esm/util/useFetch.d.ts +56 -0
- package/esm/util/useFetch.js +188 -0
- package/esm/util/useFetchPlugins.d.ts +12 -0
- package/esm/util/useFetchPlugins.js +14 -0
- package/esm/util/useMeasure.d.ts +11 -1
- package/esm/util/useMeasure.js +20 -6
- package/esm/util/usePanZoom.d.ts +75 -0
- package/esm/util/usePanZoom.js +175 -0
- package/esm/util/usePanelVirtualScroll.d.ts +37 -0
- package/esm/util/usePanelVirtualScroll.js +42 -0
- package/esm/util/usePointerDrag.d.ts +37 -0
- package/esm/util/usePointerDrag.js +61 -0
- package/esm/util/useRafCommit.d.ts +4 -0
- package/esm/util/useRafCommit.js +50 -0
- package/esm/util/useResizeDrag.d.ts +91 -0
- package/esm/util/useResizeDrag.js +105 -0
- package/esm/util/useRowVirtualScroll.d.ts +32 -0
- package/esm/util/useRowVirtualScroll.js +63 -0
- package/esm/util/useVirtualScrollWheel.d.ts +7 -0
- package/esm/util/useVirtualScrollWheel.js +108 -0
- package/esm/util/viewStatus.d.ts +81 -0
- package/esm/util/viewStatus.js +37 -0
- package/esm/util/virtualRange.d.ts +36 -0
- package/esm/util/virtualRange.js +26 -0
- package/esm/util/webStorage.d.ts +26 -0
- package/esm/util/webStorage.js +92 -0
- package/esm/util/wheelZoom.d.ts +59 -0
- package/esm/util/wheelZoom.js +231 -0
- package/esm/util/whenViewSettled.d.ts +40 -0
- package/esm/util/whenViewSettled.js +41 -0
- package/esm/util/withFeatureDetails.d.ts +34 -0
- package/esm/util/withFeatureDetails.js +59 -0
- package/esm/util/withLaunchInput.d.ts +123 -0
- package/esm/util/withLaunchInput.js +228 -0
- package/package.json +243 -820
- package/esm/ReExports/DataGrid.d.ts +0 -1
- package/esm/ReExports/DataGrid.js +0 -1
- package/esm/configuration/util.d.ts +0 -10
- package/esm/configuration/util.js +0 -123
- package/esm/data_adapters/BaseAdapter/BaseOptions.d.ts +0 -18
- package/esm/data_adapters/util.d.ts +0 -1
- package/esm/data_adapters/util.js +0 -6
- package/esm/pluggableElementTypes/GlyphType.d.ts +0 -43
- package/esm/pluggableElementTypes/GlyphType.js +0 -18
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.d.ts +0 -5
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.js +0 -17
- package/esm/pluggableElementTypes/renderers/BoxRendererType.d.ts +0 -52
- package/esm/pluggableElementTypes/renderers/BoxRendererType.js +0 -78
- package/esm/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +0 -4
- package/esm/pluggableElementTypes/renderers/CircularChordRendererType.js +0 -4
- package/esm/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -58
- package/esm/pluggableElementTypes/renderers/FeatureRendererType.js +0 -77
- package/esm/pluggableElementTypes/renderers/LayoutSession.d.ts +0 -31
- package/esm/pluggableElementTypes/renderers/LayoutSession.js +0 -40
- package/esm/pluggableElementTypes/renderers/RendererType.d.ts +0 -28
- package/esm/pluggableElementTypes/renderers/RendererType.js +0 -20
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +0 -58
- package/esm/pluggableElementTypes/renderers/ServerSideRendererType.js +0 -108
- package/esm/pluggableElementTypes/renderers/index.d.ts +0 -6
- package/esm/pluggableElementTypes/renderers/index.js +0 -6
- package/esm/pluggableElementTypes/renderers/util.d.ts +0 -3
- package/esm/pluggableElementTypes/renderers/util.js +0 -14
- package/esm/rpc/baseRpcConfig.d.ts +0 -8
- package/esm/rpc/baseRpcConfig.js +0 -10
- package/esm/rpc/mainThreadRpcConfig.d.ts +0 -8
- package/esm/rpc/mainThreadRpcConfig.js +0 -8
- package/esm/rpc/methods/CoreGetFeatureDensityStats.d.ts +0 -17
- package/esm/rpc/methods/CoreGetFeatureDensityStats.js +0 -25
- package/esm/rpc/methods/CoreGetFeatureDetails.d.ts +0 -11
- package/esm/rpc/methods/CoreGetFeatureDetails.js +0 -24
- package/esm/rpc/methods/CoreGetFileInfo.d.ts +0 -9
- package/esm/rpc/methods/CoreGetFileInfo.js +0 -15
- package/esm/rpc/methods/CoreRender.d.ts +0 -14
- package/esm/rpc/methods/CoreRender.js +0 -40
- package/esm/rpc/methods/CoreSaveFeatureData.d.ts +0 -16
- package/esm/rpc/methods/CoreSaveFeatureData.js +0 -32
- package/esm/rpc/methods/util.d.ts +0 -15
- package/esm/rpc/methods/util.js +0 -7
- package/esm/rpc/webWorkerRpcConfig.d.ts +0 -8
- package/esm/rpc/webWorkerRpcConfig.js +0 -8
- package/esm/ui/MenuButton.d.ts +0 -1
- package/esm/ui/MenuButton.js +0 -1
- package/esm/ui/MenuItems.d.ts +0 -15
- package/esm/ui/MenuItems.js +0 -59
- package/esm/ui/useEvent.d.ts +0 -1
- package/esm/ui/useEvent.js +0 -10
- package/esm/util/blobToDataURL.d.ts +0 -1
- package/esm/util/blobToDataURL.js +0 -14
- package/esm/util/compositeMap.d.ts +0 -11
- package/esm/util/compositeMap.js +0 -59
- package/esm/util/flatqueue/index.d.ts +0 -11
- package/esm/util/flatqueue/index.js +0 -61
- package/esm/util/layouts/BaseLayout.d.ts +0 -30
- package/esm/util/layouts/MultiLayout.d.ts +0 -12
- package/esm/util/layouts/MultiLayout.js +0 -40
- package/esm/util/layouts/PileupLayout.d.ts +0 -41
- package/esm/util/layouts/PileupLayout.js +0 -202
- package/esm/util/layouts/PrecomputedLayout.d.ts +0 -30
- package/esm/util/layouts/PrecomputedLayout.js +0 -71
- package/esm/util/layouts/SceneGraph.d.ts +0 -31
- package/esm/util/layouts/SceneGraph.js +0 -121
- package/esm/util/makeAbortableReaction.d.ts +0 -3
- package/esm/util/makeAbortableReaction.js +0 -47
- package/esm/util/map-obj/index.d.ts +0 -13
- package/esm/util/map-obj/index.js +0 -92
- package/esm/util/nextTick.d.ts +0 -1
- package/esm/util/nextTick.js +0 -3
- package/esm/util/offscreenCanvasGetSerializingSvg.d.ts +0 -5
- package/esm/util/offscreenCanvasGetSerializingSvg.js +0 -9
- package/esm/util/offscreenCanvasUtils.d.ts +0 -12
- package/esm/util/offscreenCanvasUtils.js +0 -19
- package/esm/util/renderToAbstractCanvas.d.ts +0 -17
- package/esm/util/renderToAbstractCanvas.js +0 -53
- package/esm/util/transferables.d.ts +0 -2
- package/esm/util/transferables.js +0 -35
- package/esm/util/tss-react/mui/index.d.ts +0 -1
- package/esm/util/tss-react/mui/index.js +0 -1
- package/esm/util/tss-react/mui/mui.d.ts +0 -10
- package/esm/util/tss-react/mui/mui.js +0 -5
- package/esm/util/when.d.ts +0 -1
- package/esm/util/when.js +0 -1
- /package/esm/{data_adapters/BaseAdapter/BaseOptions.js → configuration/promotablePin.js} +0 -0
- /package/esm/{util/layouts/BaseLayout.js → data_adapters/BaseAdapter/CytobandAdapter.js} +0 -0
package/esm/util/tracks.js
CHANGED
|
@@ -1,48 +1,122 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
1
|
+
// Re-exported because `@jbrowse/core/util/tracks` is the path plugins import it
|
|
2
|
+
// from. It must come first: `../configuration` imports the util barrel, which
|
|
3
|
+
// imports this module back, and a re-export declared after that cycle has a
|
|
4
|
+
// getter that fires before its own require has run.
|
|
5
|
+
export { getFileName } from './getFileName.js';
|
|
6
|
+
// Lives in `./mstUtils.ts` with the rest of the tree walks, and is re-exported
|
|
7
|
+
// here because `@jbrowse/core/util/tracks` is a plugin ABI module that offers
|
|
8
|
+
// it. `fetchContext.ts` takes it from mstUtils instead, which is what keeps the
|
|
9
|
+
// configuration schemas this file pulls in out of the fetch harness's graph.
|
|
10
|
+
export { getRpcSessionId } from './parentWalk.js';
|
|
11
|
+
import { getParent, getSnapshot, hasParent, isAlive, isStateTreeNode, } from '@jbrowse/mobx-state-tree';
|
|
12
|
+
import { observable, runInAction, untracked } from 'mobx';
|
|
13
|
+
import { readConfObject } from '../configuration/index.js';
|
|
14
|
+
import { getFileHandle, storeFileHandle, verifyPermission, } from './fileHandleStore.js';
|
|
15
|
+
import { getFileName } from './getFileName.js';
|
|
16
|
+
import { getContainingView, getEnv, getSession, objectHash, } from './mstUtils.js';
|
|
17
|
+
import { isViewModel } from './types/index.js';
|
|
18
|
+
// Deliberately uncached. This used to memoize on a permanent WeakMap keyed by
|
|
19
|
+
// track, but every caller reads it from inside a reactive getter or autorun: the
|
|
20
|
+
// memo meant the reaction never subscribed to the config, so editing
|
|
21
|
+
// assemblyNames in the config editor did not invalidate it. The reads are
|
|
22
|
+
// per-view-change, not per-feature, so MobX's own computed caching is enough.
|
|
6
23
|
export function getTrackAssemblyNames(track) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
24
|
+
return getConfAssemblyNames(track.configuration);
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Assembly names as the aliases resolve them, so a track configured against
|
|
28
|
+
* `hg38` compares equal to a view on `GRCh38`. Every "does this track belong to
|
|
29
|
+
* these assemblies" test should run both sides through this, or the same track
|
|
30
|
+
* is offered by one picker and hidden by another.
|
|
31
|
+
*
|
|
32
|
+
* A name the assembly manager doesn't know is kept **as written**, not dropped.
|
|
33
|
+
* Dropping it means "matches nothing" on the track side but "no constraint at
|
|
34
|
+
* all" on the list side, and those disagree; kept, both sides compare the same
|
|
35
|
+
* raw string and matching degrades to the exact name — which is also the right
|
|
36
|
+
* answer in the window before the assembly manager has built its models. Empty
|
|
37
|
+
* names are dropped: a half-initialized view pads its assembly list with them.
|
|
38
|
+
*/
|
|
39
|
+
export function canonicalAssemblyNames(names, assemblyManager) {
|
|
40
|
+
return names
|
|
41
|
+
.filter(name => !!name)
|
|
42
|
+
.map(name => assemblyManager.getCanonicalAssemblyName(name) ?? name);
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Whether two names name the same assembly, resolving aliases on both sides.
|
|
46
|
+
*
|
|
47
|
+
* The pairwise counterpart to {@link canonicalAssemblyNames}, for the two
|
|
48
|
+
* places a list cannot be mapped: an index-aligned array, which that function's
|
|
49
|
+
* empty-name filter would desync, and a comparison where one side must come
|
|
50
|
+
* back in the caller's own spelling rather than the canonical one.
|
|
51
|
+
*
|
|
52
|
+
* **Both sides, or it buys nothing.** The names meeting at these comparisons
|
|
53
|
+
* come from different places — a view holds what the session opened it on, a
|
|
54
|
+
* track config holds what its author wrote, and a synteny mate holds whatever
|
|
55
|
+
* the adapter resolved a PanSN prefix to. Any two of those can be aliases of
|
|
56
|
+
* one assembly, and `===` says no.
|
|
57
|
+
*
|
|
58
|
+
* A name the assembly manager doesn't know compares as written, the same
|
|
59
|
+
* degradation {@link canonicalAssemblyNames} makes and for the same reason: an
|
|
60
|
+
* all-vs-all file carries sample names no config declares, and those still have
|
|
61
|
+
* to compare equal to themselves.
|
|
62
|
+
*/
|
|
63
|
+
export function isSameAssemblyName(a, b, assemblyManager) {
|
|
64
|
+
if (!a || !b) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
return (a === b ||
|
|
68
|
+
(assemblyManager.getCanonicalAssemblyName(a) ?? a) ===
|
|
69
|
+
(assemblyManager.getCanonicalAssemblyName(b) ?? b));
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* The assemblies a track config names, or `undefined` when it names none.
|
|
73
|
+
*
|
|
74
|
+
* Two shapes, and the second is why this is a function rather than a slot read.
|
|
75
|
+
* A track built on `createBaseTrackConfig` carries `assemblyNames`.
|
|
76
|
+
* `ReferenceSequenceTrack` does not — its schema omits the slot deliberately
|
|
77
|
+
* (see `createReferenceSeqTrackConfig`), because the assembly config holding it
|
|
78
|
+
* IS its assembly, so the name is read off the parent instead.
|
|
79
|
+
*
|
|
80
|
+
* That makes a sequence track's assembly **positional**, so a copy of one that
|
|
81
|
+
* is not inside its assembly cannot answer at all — and a detached config is
|
|
82
|
+
* what every hydration path produces (`hydrateTrackConfig`, and the working
|
|
83
|
+
* copy a non-admin's edits would go to, ADR-032). `hasParent` is the guard:
|
|
84
|
+
* without it the walk raises MST's "Failed to find the parent" from a helper
|
|
85
|
+
* whose other two failure modes are a plain `undefined`.
|
|
86
|
+
*/
|
|
87
|
+
function confAssemblyNames(conf) {
|
|
15
88
|
const trackAssemblyNames = readConfObject(conf, 'assemblyNames');
|
|
16
|
-
if (
|
|
17
|
-
|
|
18
|
-
if ('sequence' in parent) {
|
|
19
|
-
return [readConfObject(parent, 'name')];
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
throw new Error('unknown assembly names');
|
|
23
|
-
}
|
|
89
|
+
if (trackAssemblyNames) {
|
|
90
|
+
return trackAssemblyNames;
|
|
24
91
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
export function getRpcSessionId(thisNode) {
|
|
28
|
-
let highestRpcSessionId;
|
|
29
|
-
for (let node = thisNode; !isRoot(node); node = getParent(node)) {
|
|
30
|
-
if ('rpcSessionId' in node) {
|
|
31
|
-
highestRpcSessionId = node.rpcSessionId;
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
if (!highestRpcSessionId) {
|
|
35
|
-
throw new Error('getRpcSessionId failed, no parent node in the state tree has an `rpcSessionId` attribute');
|
|
92
|
+
if (!hasParent(conf)) {
|
|
93
|
+
return undefined;
|
|
36
94
|
}
|
|
37
|
-
|
|
95
|
+
const parent = getParent(conf);
|
|
96
|
+
return 'sequence' in parent
|
|
97
|
+
? [readConfObject(parent, 'name')]
|
|
98
|
+
: undefined;
|
|
38
99
|
}
|
|
39
|
-
export function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
100
|
+
export function getConfAssemblyNames(conf) {
|
|
101
|
+
const names = confAssemblyNames(conf);
|
|
102
|
+
if (!names) {
|
|
103
|
+
throw new Error('unknown assembly names');
|
|
104
|
+
}
|
|
105
|
+
return names;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* {@link getConfAssemblyNames} for a caller that cannot afford its throw — a
|
|
109
|
+
* config answering neither way leaves the question unanswered instead.
|
|
110
|
+
*
|
|
111
|
+
* `BaseTrackModel.refNameMismatch` is the caller: it runs on every render of
|
|
112
|
+
* every track label, so an unanswerable question must not become a thrown
|
|
113
|
+
* getter. It used to read the raw `assemblyNames` slot itself for that reason,
|
|
114
|
+
* which is a second, subtly different copy of the walk above — and one that
|
|
115
|
+
* answers `[]` for a ReferenceSequenceTrack whose assembly this already knows
|
|
116
|
+
* how to name.
|
|
117
|
+
*/
|
|
118
|
+
export function getConfAssemblyNamesOrNone(conf) {
|
|
119
|
+
return confAssemblyNames(conf) ?? [];
|
|
46
120
|
}
|
|
47
121
|
export const UNKNOWN = 'UNKNOWN';
|
|
48
122
|
export const UNSUPPORTED = 'UNSUPPORTED';
|
|
@@ -53,10 +127,17 @@ export function getBlob(id) {
|
|
|
53
127
|
export function getBlobMap() {
|
|
54
128
|
return blobMap;
|
|
55
129
|
}
|
|
130
|
+
// Populates the blobMap in a fresh JS realm (e.g. a web worker, which starts
|
|
131
|
+
// with an empty module-level blobMap). RPC args are the only channel into the
|
|
132
|
+
// worker, so the main thread ships its full blobMap and the worker replaces its
|
|
133
|
+
// own here before adapters call the synchronous getBlob() during openLocation.
|
|
56
134
|
export function setBlobMap(map) {
|
|
57
135
|
blobMap = map;
|
|
58
136
|
}
|
|
59
137
|
let counter = 0;
|
|
138
|
+
// blob files are stored in a global map. the blobId is based on a combination
|
|
139
|
+
// of timestamp plus counter to be unique across sessions and fast repeated
|
|
140
|
+
// calls
|
|
60
141
|
export function storeBlobLocation(location) {
|
|
61
142
|
if ('blob' in location) {
|
|
62
143
|
const blobId = `b${Date.now()}-${counter++}`;
|
|
@@ -69,24 +150,33 @@ export function storeBlobLocation(location) {
|
|
|
69
150
|
}
|
|
70
151
|
return location;
|
|
71
152
|
}
|
|
72
|
-
|
|
153
|
+
// openLocation is synchronous, so File objects are cached here after async handle
|
|
154
|
+
// resolution. Observable so an open LocalFileChooser reactively clears its "needs
|
|
155
|
+
// reload" notice once a restore (afterAttach / "Restore access") populates the
|
|
156
|
+
// cache; the worker/RPC readers run outside any reaction so nothing else
|
|
157
|
+
// subscribes.
|
|
158
|
+
const fileHandleCache = observable.map();
|
|
73
159
|
export function getFileFromCache(handleId) {
|
|
74
|
-
return fileHandleCache
|
|
160
|
+
return fileHandleCache.get(handleId);
|
|
75
161
|
}
|
|
76
162
|
export function setFileInCache(handleId, file) {
|
|
77
|
-
|
|
163
|
+
runInAction(() => {
|
|
164
|
+
fileHandleCache.set(handleId, file);
|
|
165
|
+
});
|
|
78
166
|
}
|
|
79
167
|
export function clearFileFromCache(handleId) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return fileHandleCache;
|
|
168
|
+
runInAction(() => {
|
|
169
|
+
fileHandleCache.delete(handleId);
|
|
170
|
+
});
|
|
84
171
|
}
|
|
85
|
-
export function
|
|
86
|
-
|
|
172
|
+
export function hasFileHandlesInCache() {
|
|
173
|
+
// read in RpcMethodType.serializeArguments, which an RPC-fetch autorun can
|
|
174
|
+
// reach; untracked so populating the cache never re-triggers that autorun
|
|
175
|
+
// eslint-disable-next-line no-restricted-syntax -- self-write: the fetch this is reached from populates the cache
|
|
176
|
+
return untracked(() => fileHandleCache.size > 0);
|
|
87
177
|
}
|
|
88
178
|
export async function ensureFileHandleReady(handleId, requestPermission = true) {
|
|
89
|
-
const cached = fileHandleCache
|
|
179
|
+
const cached = fileHandleCache.get(handleId);
|
|
90
180
|
if (cached) {
|
|
91
181
|
return cached;
|
|
92
182
|
}
|
|
@@ -99,88 +189,100 @@ export async function ensureFileHandleReady(handleId, requestPermission = true)
|
|
|
99
189
|
throw new Error(`Permission denied for file "${handle.name}". Click "Restore access" to grant permission.`);
|
|
100
190
|
}
|
|
101
191
|
const file = await handle.getFile();
|
|
102
|
-
|
|
192
|
+
setFileInCache(handleId, file);
|
|
103
193
|
return file;
|
|
104
194
|
}
|
|
105
195
|
export async function storeFileHandleLocation(handle) {
|
|
106
196
|
const handleId = await storeFileHandle(handle);
|
|
107
197
|
const file = await handle.getFile();
|
|
108
|
-
|
|
198
|
+
setFileInCache(handleId, file);
|
|
109
199
|
return {
|
|
110
200
|
locationType: 'FileHandleLocation',
|
|
111
201
|
name: handle.name,
|
|
112
202
|
handleId,
|
|
113
203
|
};
|
|
114
204
|
}
|
|
205
|
+
async function settleFileHandle(handleId, requestPermission) {
|
|
206
|
+
try {
|
|
207
|
+
await ensureFileHandleReady(handleId, requestPermission);
|
|
208
|
+
return { handleId, success: true };
|
|
209
|
+
}
|
|
210
|
+
catch (error) {
|
|
211
|
+
return { handleId, success: false, error };
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Resolves a batch of stored file handles, one result per id.
|
|
216
|
+
*
|
|
217
|
+
* With `requestPermission` set these run ONE AT A TIME, and that is the whole
|
|
218
|
+
* point of the branch. `requestPermission()` needs transient user activation and
|
|
219
|
+
* the browser puts a single file-access prompt on screen at a time, so N of them
|
|
220
|
+
* fired off one "Restore access" click means the first call takes the prompt and
|
|
221
|
+
* the rest are refused without the user ever seeing a dialog — files reported
|
|
222
|
+
* back as permission failures that nobody was asked about. Taking turns, each
|
|
223
|
+
* prompt waits for the one before it to be answered, and whatever the activation
|
|
224
|
+
* window no longer covers is simply still pending for the next click instead of
|
|
225
|
+
* being spent.
|
|
226
|
+
*
|
|
227
|
+
* Without it nothing can prompt, so there is nothing to take turns over and the
|
|
228
|
+
* batch runs at once.
|
|
229
|
+
*/
|
|
115
230
|
export async function restoreFileHandles(handleIds, requestPermission = false) {
|
|
231
|
+
if (!requestPermission) {
|
|
232
|
+
return Promise.all(handleIds.map(id => settleFileHandle(id, false)));
|
|
233
|
+
}
|
|
116
234
|
const results = [];
|
|
117
235
|
for (const handleId of handleIds) {
|
|
118
|
-
|
|
119
|
-
await ensureFileHandleReady(handleId, requestPermission);
|
|
120
|
-
results.push({ handleId, success: true });
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
results.push({ handleId, success: false, error: e });
|
|
124
|
-
}
|
|
236
|
+
results.push(await settleFileHandle(handleId, true));
|
|
125
237
|
}
|
|
126
238
|
return results;
|
|
127
239
|
}
|
|
128
|
-
export function findFileHandleIds(obj
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
seen.add(obj);
|
|
136
|
-
if (Array.isArray(obj)) {
|
|
137
|
-
for (const item of obj) {
|
|
138
|
-
findFileHandleIds(item, handleIds, seen);
|
|
240
|
+
export function findFileHandleIds(obj) {
|
|
241
|
+
const handleIds = new Set();
|
|
242
|
+
const seen = new WeakSet();
|
|
243
|
+
function walk(o) {
|
|
244
|
+
if (!o || typeof o !== 'object' || seen.has(o)) {
|
|
245
|
+
return;
|
|
139
246
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
handleIds.add(record.handleId);
|
|
247
|
+
seen.add(o);
|
|
248
|
+
if (Array.isArray(o)) {
|
|
249
|
+
for (const item of o) {
|
|
250
|
+
walk(item);
|
|
251
|
+
}
|
|
146
252
|
}
|
|
147
|
-
|
|
148
|
-
|
|
253
|
+
else {
|
|
254
|
+
const record = o;
|
|
255
|
+
if (record.locationType === 'FileHandleLocation' &&
|
|
256
|
+
typeof record.handleId === 'string') {
|
|
257
|
+
handleIds.add(record.handleId);
|
|
258
|
+
}
|
|
259
|
+
for (const value of Object.values(record)) {
|
|
260
|
+
walk(value);
|
|
261
|
+
}
|
|
149
262
|
}
|
|
150
263
|
}
|
|
264
|
+
walk(obj);
|
|
151
265
|
return handleIds;
|
|
152
266
|
}
|
|
153
267
|
export async function restoreFileHandlesFromSnapshot(sessionSnapshot, requestPermission = false) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
export function setPendingFileHandleIds(ids) {
|
|
165
|
-
pendingFileHandleIds = ids;
|
|
166
|
-
}
|
|
167
|
-
export function clearPendingFileHandleIds() {
|
|
168
|
-
pendingFileHandleIds = [];
|
|
169
|
-
}
|
|
170
|
-
export async function restorePendingFileHandles() {
|
|
171
|
-
if (pendingFileHandleIds.length === 0) {
|
|
172
|
-
return [];
|
|
173
|
-
}
|
|
174
|
-
const results = await restoreFileHandles(pendingFileHandleIds, true);
|
|
175
|
-
const stillFailed = results.filter(r => !r.success).map(r => r.handleId);
|
|
176
|
-
pendingFileHandleIds = stillFailed;
|
|
177
|
-
return results;
|
|
178
|
-
}
|
|
268
|
+
return restoreFileHandles([...findFileHandleIds(sessionSnapshot)], requestPermission);
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* creates a new location from the provided location including the appropriate
|
|
272
|
+
* suffix and location type
|
|
273
|
+
*
|
|
274
|
+
* @param location - the FileLocation
|
|
275
|
+
* @param suffix - the file suffix (e.g. .bam)
|
|
276
|
+
* @returns the constructed location object from the provided parameters
|
|
277
|
+
*/
|
|
179
278
|
export function makeIndex(location, suffix) {
|
|
180
279
|
if ('uri' in location) {
|
|
181
280
|
return {
|
|
182
281
|
uri: location.uri + suffix,
|
|
183
282
|
locationType: 'UriLocation',
|
|
283
|
+
// carry the parent's baseUri so a derived sibling index resolves against
|
|
284
|
+
// the same config location as the file it indexes
|
|
285
|
+
...(location.baseUri ? { baseUri: location.baseUri } : {}),
|
|
184
286
|
};
|
|
185
287
|
}
|
|
186
288
|
else if ('localPath' in location) {
|
|
@@ -193,36 +295,78 @@ export function makeIndex(location, suffix) {
|
|
|
193
295
|
return location;
|
|
194
296
|
}
|
|
195
297
|
}
|
|
298
|
+
/**
|
|
299
|
+
* constructs a potential index file (with suffix) from the provided file name
|
|
300
|
+
*
|
|
301
|
+
* @param name - the name of the index file
|
|
302
|
+
* @param typeA - one option of a potential two file suffix (e.g. CSI, BAI)
|
|
303
|
+
* @param typeB - the second option of a potential two file suffix (e.g. CSI, BAI)
|
|
304
|
+
* @returns a likely name of the index file for a given filename
|
|
305
|
+
*/
|
|
196
306
|
export function makeIndexType(name, typeA, typeB) {
|
|
197
307
|
return name?.toUpperCase().endsWith(typeA) ? typeA : typeB;
|
|
198
308
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
309
|
+
/**
|
|
310
|
+
* The `index` block a tabix-indexed adapter's guess writes: where the index is,
|
|
311
|
+
* and which of the two kinds it is.
|
|
312
|
+
*
|
|
313
|
+
* Eight guessers spelled this pair out by hand, which is the crossed-pair hazard
|
|
314
|
+
* `tabixIndexSnapshot` was extracted for on the config side: a `.csi` location
|
|
315
|
+
* filed under `indexType: 'TBI'` is a valid-looking config that opens no index
|
|
316
|
+
* at all, and nothing downstream can tell it from a correct one.
|
|
317
|
+
*
|
|
318
|
+
* BAM is deliberately not here, for the reason `tabixIndexFields` gives: BAI/CSI
|
|
319
|
+
* is a different enumeration over a different default, and folding the two would
|
|
320
|
+
* mean a slot whose vocabulary depends on its adapter.
|
|
321
|
+
*/
|
|
322
|
+
export function guessTabixIndex(file, index) {
|
|
323
|
+
return {
|
|
324
|
+
location: index ?? makeIndex(file, '.tbi'),
|
|
325
|
+
indexType: makeIndexType(index && getFileName(index), 'CSI', 'TBI'),
|
|
326
|
+
};
|
|
327
|
+
}
|
|
328
|
+
/**
|
|
329
|
+
* Register a guess on `Core-guessAdapterForLocation`. Return an adapter config
|
|
330
|
+
* to claim the file, or `undefined` to defer to the plugins registered before
|
|
331
|
+
* this one.
|
|
332
|
+
*
|
|
333
|
+
* Prefer this over calling `addToExtensionPoint` directly: the chaining is done
|
|
334
|
+
* once here, so a plugin cannot break the chain by forgetting to delegate, nor
|
|
335
|
+
* drop an argument on the way through.
|
|
336
|
+
*/
|
|
337
|
+
export function addAdapterGuesser(pluginManager, guess) {
|
|
338
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', next => (file, index, adapterHint) => guess(file, index, adapterHint) ?? next(file, index, adapterHint));
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Register a guess on `Core-guessTrackTypeForLocation`. Return a track type
|
|
342
|
+
* name to claim the adapter, or `undefined` to defer. See `addAdapterGuesser`
|
|
343
|
+
* for why this wrapper exists — hand-written delegates here used to drop the
|
|
344
|
+
* optional `file`, which hid it from every guesser registered earlier in the
|
|
345
|
+
* chain.
|
|
346
|
+
*/
|
|
347
|
+
export function addTrackTypeGuesser(pluginManager, guess) {
|
|
348
|
+
pluginManager.addToExtensionPoint('Core-guessTrackTypeForLocation', next => (adapterName, file) => guess(adapterName, file) ?? next(adapterName, file));
|
|
349
|
+
}
|
|
350
|
+
const COMPRESSION_SUFFIXES = ['.gz', '.bgz', '.bz2', '.zst'];
|
|
351
|
+
/**
|
|
352
|
+
* Drop the format extension from a filename, plus any compression suffix, so
|
|
353
|
+
* `volvox.vcf.gz` becomes `volvox` rather than `volvox.vcf`. Names with no
|
|
354
|
+
* extension, and dotfiles, are returned unchanged.
|
|
355
|
+
*/
|
|
356
|
+
export function stripFileExtension(name) {
|
|
357
|
+
const lower = name.toLowerCase();
|
|
358
|
+
const base = COMPRESSION_SUFFIXES.some(suffix => lower.endsWith(suffix))
|
|
359
|
+
? name.slice(0, name.lastIndexOf('.'))
|
|
360
|
+
: name;
|
|
361
|
+
const dot = base.lastIndexOf('.');
|
|
362
|
+
return dot > 0 ? base.slice(0, dot) : base;
|
|
219
363
|
}
|
|
220
364
|
export function guessAdapter(file, index, adapterHint, model) {
|
|
221
365
|
if (model) {
|
|
222
366
|
const { pluginManager } = getEnv(model);
|
|
223
|
-
const adapterGuesser = pluginManager.evaluateExtensionPoint(
|
|
224
|
-
|
|
225
|
-
|
|
367
|
+
const adapterGuesser = pluginManager.evaluateExtensionPoint(
|
|
368
|
+
/** #extensionPoint Core-guessAdapterForLocation | sync | Guess an adapter config from a file location */
|
|
369
|
+
'Core-guessAdapterForLocation', () => undefined);
|
|
226
370
|
const adapter = adapterGuesser(file, index, adapterHint);
|
|
227
371
|
if (adapter) {
|
|
228
372
|
return adapter;
|
|
@@ -234,10 +378,14 @@ export function guessAdapter(file, index, adapterHint, model) {
|
|
|
234
378
|
}
|
|
235
379
|
export function guessTrackType(adapterType, model, file) {
|
|
236
380
|
if (model) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
381
|
+
// getEnv(model), not getEnv(getSession(model)): the env is tree-wide, so
|
|
382
|
+
// the session hop only narrowed what may be passed here — a session itself
|
|
383
|
+
// has no session ancestor, so guessAdapter above accepted one and this
|
|
384
|
+
// threw on it
|
|
385
|
+
const { pluginManager } = getEnv(model);
|
|
386
|
+
const trackTypeGuesser = pluginManager.evaluateExtensionPoint(
|
|
387
|
+
/** #extensionPoint Core-guessTrackTypeForLocation | sync | Guess a track type from a file location */
|
|
388
|
+
'Core-guessTrackTypeForLocation', () => undefined);
|
|
241
389
|
const trackType = trackTypeGuesser(adapterType, file);
|
|
242
390
|
if (trackType) {
|
|
243
391
|
return trackType;
|
|
@@ -245,102 +393,462 @@ export function guessTrackType(adapterType, model, file) {
|
|
|
245
393
|
}
|
|
246
394
|
return 'FeatureTrack';
|
|
247
395
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
396
|
+
/**
|
|
397
|
+
* Expand a loose track description — a bare data-file URI, or an object with
|
|
398
|
+
* `uri` (and optional `index`) plus any extra config keys — into a full track
|
|
399
|
+
* config, the same inference the "Add track" flow does: the adapter and track
|
|
400
|
+
* type are guessed from the file via the format plugins, a stable `trackId` and
|
|
401
|
+
* a `name` are derived from the filename, and the assembly is stamped on. Extra
|
|
402
|
+
* keys on the input (`name`, `category`, `displays`, ...) override the inferred
|
|
403
|
+
* defaults. Takes a `pluginManager` (not a model) so it runs headlessly — in a
|
|
404
|
+
* worker/Node export as well as the browser. Throws when no format matches, so
|
|
405
|
+
* the caller can ask for a full config instead.
|
|
406
|
+
*/
|
|
407
|
+
export function guessTrackConf(input, pluginManager, assemblyName) {
|
|
408
|
+
const { uri, index, ...extra } = typeof input === 'string' ? { uri: input } : input;
|
|
409
|
+
return {
|
|
410
|
+
...guessTrackConfForLocation({ uri, locationType: 'UriLocation' }, index ? { uri: index, locationType: 'UriLocation' } : undefined, pluginManager, assemblyName),
|
|
411
|
+
...extra,
|
|
255
412
|
};
|
|
256
|
-
conf.trackId = objectHash(conf);
|
|
257
|
-
return conf;
|
|
258
413
|
}
|
|
259
|
-
|
|
414
|
+
/**
|
|
415
|
+
* {@link guessTrackConf} over an already-built {@link FileLocation}, for a
|
|
416
|
+
* caller holding a location the loose `{ uri }` vocabulary cannot spell — a
|
|
417
|
+
* desktop local path. Kept separate so `LooseTrackInput` stays URI-only: it
|
|
418
|
+
* sits on the track-config union and the root config's `tracks`, where a
|
|
419
|
+
* local path would be a config a web deployment could not open.
|
|
420
|
+
*
|
|
421
|
+
* The `trackId` is a content hash of the adapter, not a timestamp, so adding
|
|
422
|
+
* the same file twice is idempotent — `addToSession` dedupes on it.
|
|
423
|
+
*/
|
|
424
|
+
export function guessTrackConfForLocation(file, index, pluginManager, assemblyName) {
|
|
425
|
+
const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', () => undefined);
|
|
426
|
+
const adapter = adapterGuesser(file, index, undefined);
|
|
427
|
+
const name = getFileName(file);
|
|
428
|
+
if (!adapter || adapter.type === UNKNOWN) {
|
|
429
|
+
throw new Error(`could not infer a track type from "${name}"; pass a full track config instead`);
|
|
430
|
+
}
|
|
431
|
+
const trackTypeGuesser = pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', () => undefined);
|
|
432
|
+
return {
|
|
433
|
+
trackId: `${name}-${objectHash(adapter).slice(0, 8)}`,
|
|
434
|
+
type: trackTypeGuesser(adapter.type, file) ?? 'FeatureTrack',
|
|
435
|
+
name,
|
|
436
|
+
assemblyNames: assemblyName ? [assemblyName] : [],
|
|
437
|
+
adapter,
|
|
438
|
+
};
|
|
439
|
+
}
|
|
440
|
+
/**
|
|
441
|
+
* Whether a track snapshot is the loose `{ uri, ... }` form — a data file with
|
|
442
|
+
* no `adapter` — that {@link expandLooseTrackConfig} expands.
|
|
443
|
+
*/
|
|
444
|
+
export function isLooseTrackConfig(snap) {
|
|
445
|
+
return (typeof snap === 'object' &&
|
|
446
|
+
snap !== null &&
|
|
447
|
+
!Array.isArray(snap) &&
|
|
448
|
+
typeof snap.uri === 'string' &&
|
|
449
|
+
!('adapter' in snap));
|
|
450
|
+
}
|
|
451
|
+
/**
|
|
452
|
+
* Expand a loose track config into a full one and leave any other snapshot
|
|
453
|
+
* untouched, so it can sit on every path a track snapshot enters the tree by:
|
|
454
|
+
* the track config union, the root config's frozen `tracks`, `addTrackConf`,
|
|
455
|
+
* and `showTrackGeneric`'s inline config.
|
|
456
|
+
*
|
|
457
|
+
* `{ "trackId": "reads", "uri": "reads.bam", "assemblyNames": ["hg38"] }` is a
|
|
458
|
+
* whole track: the adapter and track type come from the file's extension
|
|
459
|
+
* through the format plugins' guessers, the same inference the "Add track"
|
|
460
|
+
* flow runs, and `name` defaults to the file name. Any key written beside
|
|
461
|
+
* `uri` — `trackId`, `name`, `category`, `displayDefaults`, an explicit `type`
|
|
462
|
+
* — overrides what was inferred. `assemblyName` fills `assemblyNames` when the
|
|
463
|
+
* snapshot has none, for a config or embed that has exactly one assembly.
|
|
464
|
+
*/
|
|
465
|
+
export function expandLooseTrackConfig(snap, pluginManager, assemblyName) {
|
|
466
|
+
return isLooseTrackConfig(snap)
|
|
467
|
+
? guessTrackConf(snap, pluginManager, assemblyName)
|
|
468
|
+
: snap;
|
|
469
|
+
}
|
|
470
|
+
function generateProblemTrackConf(trackName, categories, label, description) {
|
|
260
471
|
const conf = {
|
|
261
472
|
type: 'FeatureTrack',
|
|
262
|
-
name: `${trackName} (
|
|
263
|
-
description
|
|
473
|
+
name: `${trackName} (${label})`,
|
|
474
|
+
description,
|
|
264
475
|
category: categories,
|
|
265
476
|
trackId: '',
|
|
266
477
|
};
|
|
267
478
|
conf.trackId = objectHash(conf);
|
|
268
479
|
return conf;
|
|
269
480
|
}
|
|
481
|
+
export function generateUnsupportedTrackConf(trackName, trackUrl, categories) {
|
|
482
|
+
return generateProblemTrackConf(trackName, categories, 'Unsupported', `Support not yet implemented for "${trackUrl}"`);
|
|
483
|
+
}
|
|
484
|
+
export function generateUnknownTrackConf(trackName, trackUrl, categories) {
|
|
485
|
+
return generateProblemTrackConf(trackName, categories, 'Unknown', `Could not determine track type for "${trackUrl}"`);
|
|
486
|
+
}
|
|
270
487
|
export function getTrackName(conf, session) {
|
|
271
|
-
const
|
|
488
|
+
const isMst = isStateTreeNode(conf);
|
|
489
|
+
const trackName = isMst
|
|
272
490
|
? readConfObject(conf, 'name')
|
|
273
491
|
: (conf.name ?? '');
|
|
274
|
-
const trackType =
|
|
275
|
-
? readConfObject(conf, 'type')
|
|
276
|
-
: conf.type;
|
|
492
|
+
const trackType = isMst ? readConfObject(conf, 'type') : conf.type;
|
|
277
493
|
if (!trackName && trackType === 'ReferenceSequenceTrack') {
|
|
278
494
|
const asm = session.assemblies.find(a => a.sequence === conf);
|
|
279
495
|
return asm
|
|
280
496
|
? `Reference sequence (${readConfObject(asm, 'displayName') || readConfObject(asm, 'name')})`
|
|
281
497
|
: 'Reference sequence';
|
|
282
498
|
}
|
|
283
|
-
|
|
499
|
+
const trackId = isMst
|
|
500
|
+
? readConfObject(conf, 'trackId')
|
|
501
|
+
: (conf.trackId ?? '');
|
|
502
|
+
return trackName || trackId;
|
|
503
|
+
}
|
|
504
|
+
/**
|
|
505
|
+
* Which display a track opens with in a given view, and the display config that
|
|
506
|
+
* display must use: `{ type, conf }`, or undefined when the view supports none
|
|
507
|
+
* of the track's displays.
|
|
508
|
+
*
|
|
509
|
+
* Two decisions, in this order, and the order is the point. The **type** is what
|
|
510
|
+
* the caller asked for, else the track's first declared display the view
|
|
511
|
+
* supports, else the track type's first supported display. The **config** is
|
|
512
|
+
* then whichever declared entry has that type — never "the first supported one",
|
|
513
|
+
* which is what let a display be created wearing another display's config node
|
|
514
|
+
* (a multi-sample VCF declares both the matrix and the regular display, so the
|
|
515
|
+
* regular one inherited the matrix's 20px connector-line zone and drew its
|
|
516
|
+
* clustering tree offset from the rows it labels). `display.type ===
|
|
517
|
+
* display.configuration.type` is the invariant `DisplayConfigurationReference`
|
|
518
|
+
* already assumes when it falls back to resolving a display config by type; this
|
|
519
|
+
* is where it has to hold.
|
|
520
|
+
*
|
|
521
|
+
* `conf` is undefined when the track config declares no entry of that type;
|
|
522
|
+
* `baseTrackConfig.preProcessSnapshot` injects one for every registered display
|
|
523
|
+
* type, so the caller's `${trackId}-${type}` id resolves to it.
|
|
524
|
+
*/
|
|
525
|
+
/**
|
|
526
|
+
* The display type names a view can render, as a lookup set. Built once per
|
|
527
|
+
* view and handed to {@link viewCanDisplayTrack} for every track, rather than
|
|
528
|
+
* rebuilt per track.
|
|
529
|
+
*/
|
|
530
|
+
export function viewDisplayNames(pluginManager, viewType) {
|
|
531
|
+
return new Set(pluginManager.getViewType(viewType).displayTypes.map(d => d.name));
|
|
532
|
+
}
|
|
533
|
+
/**
|
|
534
|
+
* Whether a view rendering `viewDisplays` can open a track of this type at all
|
|
535
|
+
* — does the track type declare a display the view draws. The coarse half of
|
|
536
|
+
* the question {@link pickDisplayForView} answers precisely: a picker that
|
|
537
|
+
* offers a track this says no to is offering one `showTrackGeneric` will
|
|
538
|
+
* refuse.
|
|
539
|
+
*
|
|
540
|
+
* Reads the *track type's* registered displays rather than a config's own
|
|
541
|
+
* `displays` array, which is both cheaper and the only form available on an
|
|
542
|
+
* un-hydrated frozen track config (ADR-032). The two agree, since
|
|
543
|
+
* `preprocessTrackConfigSnapshot` injects a stub display for every display the
|
|
544
|
+
* track type registers.
|
|
545
|
+
*
|
|
546
|
+
* Two answers that are easy to get wrong, and both have been:
|
|
547
|
+
*
|
|
548
|
+
* - A type **no plugin registered** answers false rather than throwing.
|
|
549
|
+
* `getTrackType` throws on an unknown name, and a frozen track config never
|
|
550
|
+
* passes the schema that would have rejected it at load — so a config naming
|
|
551
|
+
* a plugin that failed to load put that throw inside whatever loop was
|
|
552
|
+
* filtering tracks, and one unopenable track took out the entire list. The
|
|
553
|
+
* track selector and jb2export's circular-view filter met this separately.
|
|
554
|
+
* - A view type registering **no displays at all** constrains nothing, so
|
|
555
|
+
* every track passes. That is a policy rather than a fact, and it lives here
|
|
556
|
+
* so the pickers agree on it.
|
|
557
|
+
*/
|
|
558
|
+
export function viewCanDisplayTrack(pluginManager, viewDisplays, trackType) {
|
|
559
|
+
if (!pluginManager.trackTypes.has(trackType)) {
|
|
560
|
+
return false;
|
|
561
|
+
}
|
|
562
|
+
return (viewDisplays.size === 0 ||
|
|
563
|
+
pluginManager
|
|
564
|
+
.getTrackType(trackType)
|
|
565
|
+
.displayTypes.some(d => viewDisplays.has(d.name)));
|
|
566
|
+
}
|
|
567
|
+
export function pickDisplayForView({ declaredDisplays, requestedType, trackDisplayTypes, viewDisplayTypes, }) {
|
|
568
|
+
const supported = new Set(viewDisplayTypes);
|
|
569
|
+
const type = requestedType ??
|
|
570
|
+
declaredDisplays.find(d => supported.has(d.type))?.type ??
|
|
571
|
+
trackDisplayTypes.find(name => supported.has(name));
|
|
572
|
+
return type === undefined
|
|
573
|
+
? undefined
|
|
574
|
+
: { type, conf: declaredDisplays.find(d => d.type === type) };
|
|
575
|
+
}
|
|
576
|
+
// #endregion
|
|
577
|
+
// Resolve a session-spec `TrackInit` into the (trackId, trackSnapshot,
|
|
578
|
+
// displaySnapshot) triple that `showTrackGeneric` expects. Display props written
|
|
579
|
+
// inline on the track object (everything except trackId/trackSnapshot/
|
|
580
|
+
// displaySnapshot) fold into the display snapshot, so a spec can write
|
|
581
|
+
// `{ trackId, showDescriptions: false }` instead of nesting under
|
|
582
|
+
// `displaySnapshot`. An explicit `displaySnapshot` still wins over an inline
|
|
583
|
+
// key of the same name, and the older nested form keeps working unchanged.
|
|
584
|
+
// `showTrackGeneric` then routes any inline key that is a real config slot (e.g.
|
|
585
|
+
// `forceLoad`) onto the display config, so a session spec can declaratively
|
|
586
|
+
// force-load a track with `{ trackId, forceLoad: true }`.
|
|
587
|
+
export function normalizeTrackInit(t) {
|
|
588
|
+
if (typeof t === 'string') {
|
|
589
|
+
return { trackId: t, trackSnapshot: {}, displaySnapshot: {} };
|
|
590
|
+
}
|
|
591
|
+
else {
|
|
592
|
+
const { trackId, trackSnapshot, displaySnapshot, ...rest } = t;
|
|
593
|
+
return {
|
|
594
|
+
trackId,
|
|
595
|
+
trackSnapshot: trackSnapshot ?? {},
|
|
596
|
+
displaySnapshot: { ...rest, ...displaySnapshot },
|
|
597
|
+
};
|
|
598
|
+
}
|
|
284
599
|
}
|
|
285
|
-
|
|
600
|
+
function resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf) {
|
|
286
601
|
const { pluginManager } = getEnv(self);
|
|
287
602
|
const session = getSession(self);
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
603
|
+
// `trackId` seeds the expansion because `guessTrackConf` otherwise
|
|
604
|
+
// synthesizes one from the filename, and the dedupe in the callers and
|
|
605
|
+
// `hideTrackGeneric` both look the track up by the id the caller passed.
|
|
606
|
+
// Only for the loose form: spreading a live MST node (SvInspector's
|
|
607
|
+
// circular track) would flatten it out of the `isStateTreeNode` branch.
|
|
608
|
+
const inlineRawConf = isLooseTrackConfig(inlineConf)
|
|
609
|
+
? expandLooseTrackConfig({ trackId, ...inlineConf }, pluginManager)
|
|
610
|
+
: inlineConf;
|
|
611
|
+
const rawConf = inlineRawConf ?? session.getTrackById(trackId);
|
|
293
612
|
if (!rawConf) {
|
|
294
613
|
throw new Error(`Could not resolve identifier "${trackId}"`);
|
|
295
614
|
}
|
|
296
|
-
const confSnapshot = isStateTreeNode(rawConf)
|
|
297
|
-
? getSnapshot(rawConf)
|
|
298
|
-
: structuredClone(rawConf);
|
|
615
|
+
const confSnapshot = structuredClone(isStateTreeNode(rawConf) ? getSnapshot(rawConf) : rawConf);
|
|
299
616
|
const conf = pluginManager.evaluateExtensionPoint('Core-preProcessTrackConfig', confSnapshot);
|
|
300
617
|
const trackType = pluginManager.getTrackType(conf.type);
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
],
|
|
618
|
+
// Validate only a conf that is not already in the tree. `configSchema.create`
|
|
619
|
+
// here builds an entire config node and throws it away purely to surface a
|
|
620
|
+
// nice error; its preProcessSnapshot also re-runs Core-preProcessTrackConfig
|
|
621
|
+
// on a snapshot this function just preprocessed. A conf that is a state tree
|
|
622
|
+
// node was validated when MST created it, so all of that is pure waste on
|
|
623
|
+
// the common showTrack path.
|
|
624
|
+
if (!isStateTreeNode(rawConf)) {
|
|
625
|
+
try {
|
|
626
|
+
trackType.configSchema.create(conf, getEnv(self));
|
|
627
|
+
}
|
|
628
|
+
catch (e) {
|
|
629
|
+
throw new Error(`Track "${trackId}" has an invalid configuration: ${e}`, {
|
|
630
|
+
cause: e,
|
|
631
|
+
});
|
|
632
|
+
}
|
|
633
|
+
}
|
|
634
|
+
// A track container that isn't itself a view — a synteny level, which owns
|
|
635
|
+
// a track list but has no width and no registered view type — takes the
|
|
636
|
+
// display choice from the view it sits in, which is the same node
|
|
637
|
+
// getContainingView already resolves to for everything else beneath it.
|
|
638
|
+
const view = isViewModel(self) ? self : getContainingView(self);
|
|
639
|
+
const viewType = pluginManager.getViewType(view.type);
|
|
640
|
+
const picked = pickDisplayForView({
|
|
641
|
+
declaredDisplays: conf.displays ?? [],
|
|
642
|
+
requestedType: displayInitialSnapshot.type,
|
|
643
|
+
trackDisplayTypes: trackType.displayTypes.map(d => d.name),
|
|
644
|
+
viewDisplayTypes: viewType.displayTypes.map(d => d.name),
|
|
329
645
|
});
|
|
330
|
-
|
|
331
|
-
|
|
646
|
+
if (!picked) {
|
|
647
|
+
throw new Error(`Could not find a compatible display for view type ${view.type}`);
|
|
648
|
+
}
|
|
649
|
+
return { rawConf, conf, trackType, picked };
|
|
650
|
+
}
|
|
651
|
+
export function showTrackGeneric(self, trackId,
|
|
652
|
+
// `object`, annotated, rather than inferred from the default. A bare `{}`
|
|
653
|
+
// accepts every non-nullish value, numbers included, which is how a synteny
|
|
654
|
+
// level index typechecked its way into a track snapshot — see the dotplot and
|
|
655
|
+
// comparative views' own `showTrack`, whose second parameter is this one.
|
|
656
|
+
//
|
|
657
|
+
// `object` and not `Record<string, unknown>`: the hazard is a primitive, and
|
|
658
|
+
// an index signature additionally rejects the precise snapshot interfaces
|
|
659
|
+
// callers legitimately pass (jbrowse-img's `DisplaySnapshot` is one).
|
|
660
|
+
initialSnapshot = {}, displayInitialSnapshot = {},
|
|
661
|
+
// The config itself, for a track no session list holds: a view that
|
|
662
|
+
// synthesizes a track only it can draw passes the config here and it lives on
|
|
663
|
+
// the track node, so closing the track takes the config with it. Without it
|
|
664
|
+
// such a config has to be parked in a session list that outlives the view.
|
|
665
|
+
inlineConf) {
|
|
666
|
+
const { pluginManager } = getEnv(self);
|
|
667
|
+
const session = getSession(self);
|
|
668
|
+
const found = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
669
|
+
if (found) {
|
|
670
|
+
return found;
|
|
671
|
+
}
|
|
672
|
+
// Single choke point for all "open a track" paths — errors surface as
|
|
673
|
+
// snackbars. Config is validated before the push so the open set never holds
|
|
674
|
+
// a broken track.
|
|
675
|
+
try {
|
|
676
|
+
const { rawConf, conf, trackType, picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
|
|
677
|
+
const { type: displayType, conf: displayConf } = picked;
|
|
678
|
+
const displayId = displayConf?.displayId ?? `${trackId}-${displayType}`;
|
|
679
|
+
// a registered display whose model is not loaded yet: the load re-enters
|
|
680
|
+
// through the view's own showTrack action, so a synchronous caller gets the
|
|
681
|
+
// track a tick late; a caller that needs it back awaits launchTrack
|
|
682
|
+
const displayRecord = pluginManager.resolveDisplayTypeRecord(displayType);
|
|
683
|
+
if (displayRecord && !displayRecord.isStateModelLoaded) {
|
|
684
|
+
void launchTrackGeneric(self, trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
|
|
685
|
+
return undefined;
|
|
686
|
+
}
|
|
687
|
+
const track = trackType.stateModel.create({
|
|
688
|
+
...initialSnapshot,
|
|
689
|
+
type: conf.type,
|
|
690
|
+
// `rawConf`, not the caller's `inlineConf`: the loose `{ trackId, uri }`
|
|
691
|
+
// form has no `type` for the config schema to dispatch on, and the
|
|
692
|
+
// concrete schema this lands on carries no loose preprocessor — that one
|
|
693
|
+
// is on `pluggableConfigSchemaType('track')`, which a track model's
|
|
694
|
+
// `ConfigurationReference` is not. Not `conf` either: that has already
|
|
695
|
+
// run Core-preProcessTrackConfig, which the schema's own
|
|
696
|
+
// preProcessSnapshot runs again.
|
|
697
|
+
configuration: inlineConf ? rawConf : trackId,
|
|
698
|
+
displays: [
|
|
699
|
+
{
|
|
700
|
+
...displayConf,
|
|
701
|
+
type: displayType,
|
|
702
|
+
configuration: displayId,
|
|
703
|
+
...displayInitialSnapshot,
|
|
704
|
+
},
|
|
705
|
+
],
|
|
706
|
+
});
|
|
707
|
+
self.tracks.push(track);
|
|
708
|
+
// Display settings (height, color, …) are config slots now, not display
|
|
709
|
+
// instance props — passed in the display snapshot they'd be dropped as
|
|
710
|
+
// unknown MST keys. applyDisplaySettings routes the ones that are real
|
|
711
|
+
// slots onto the persistent display config so they take effect and
|
|
712
|
+
// survive hide/retick (#5591), running the schema's preProcessSnapshot
|
|
713
|
+
// first so shorthand expansions and legacy-key migrations reach this path
|
|
714
|
+
// too — a session spec, share link, or embed writes slots here rather
|
|
715
|
+
// than creating a config from a snapshot, and those surfaces are meant to
|
|
716
|
+
// speak the same vocabulary. Runs after the push so the display's config
|
|
717
|
+
// reference can resolve. Slots only, deliberately: this is the
|
|
718
|
+
// declarative surface, and `allowSetters` stays off so a spec key cannot
|
|
719
|
+
// reach internal display actions.
|
|
720
|
+
//
|
|
721
|
+
// `type` is dropped first because this function already consumed it
|
|
722
|
+
// (pickDisplayForView above), and only `failed` — a key whose write threw —
|
|
723
|
+
// is notified: `unapplied` here also holds the MST display props the
|
|
724
|
+
// snapshot spread above already applied, so notifying on it would report a
|
|
725
|
+
// correct call as broken. A throwing slot value used to reach the outer
|
|
726
|
+
// catch and raise a snackbar; per-key catching kept the track intact but
|
|
727
|
+
// took the message away with it.
|
|
728
|
+
const displaySettings = Object.fromEntries(Object.entries(displayInitialSnapshot).filter(([key]) => key !== 'type'));
|
|
729
|
+
const report = track.applyDisplaySettings(displaySettings);
|
|
730
|
+
if (report.failed.length) {
|
|
731
|
+
session.notifyError(`Track "${trackId}" rejected ${report.failed
|
|
732
|
+
.map(f => `${f.key}: ${f.error}`)
|
|
733
|
+
.join('; ')}`);
|
|
734
|
+
}
|
|
735
|
+
// if this track came from a connection, persist its config so it survives
|
|
736
|
+
// reload without re-establishing the connection (no-op otherwise)
|
|
737
|
+
session.captureConnectionTrack?.(trackId);
|
|
738
|
+
return track;
|
|
739
|
+
}
|
|
740
|
+
catch (e) {
|
|
741
|
+
session.notifyError(`${e}`, e);
|
|
742
|
+
return undefined;
|
|
743
|
+
}
|
|
744
|
+
}
|
|
745
|
+
// Strip a track's identifier and its nested display identifiers (both are
|
|
746
|
+
// types.identifier) so a duplicated/copied snapshot doesn't collide with the
|
|
747
|
+
// source's ids when added back into the same session tree.
|
|
748
|
+
export function stripTrackIds(tracks) {
|
|
749
|
+
return tracks.map(({ id, displays, ...rest }) => ({
|
|
750
|
+
...rest,
|
|
751
|
+
displays: displays.map(({ id, ...d }) => d),
|
|
752
|
+
}));
|
|
332
753
|
}
|
|
333
754
|
export function hideTrackGeneric(self, trackId) {
|
|
334
755
|
const t = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
335
756
|
if (t) {
|
|
336
757
|
self.tracks.remove(t);
|
|
337
|
-
|
|
758
|
+
// drop the persisted connection-track config if no other view holds it
|
|
759
|
+
// (persisted → guards saved-session size; the volatile working-copy cache
|
|
760
|
+
// in SessionTracks is deliberately not pruned, see editableTrackConfigs)
|
|
761
|
+
getSession(self).pruneConnectionTrackConfig?.(trackId);
|
|
762
|
+
return true;
|
|
338
763
|
}
|
|
339
|
-
return
|
|
764
|
+
return false;
|
|
340
765
|
}
|
|
766
|
+
// Returns true if the track is now shown, false if it was hidden or failed to
|
|
767
|
+
// open (callers use this to e.g. record only newly-opened tracks as recent).
|
|
341
768
|
export function toggleTrackGeneric(self, trackId) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
showTrackGeneric(self, trackId);
|
|
769
|
+
return hideTrackGeneric(self, trackId)
|
|
770
|
+
? false
|
|
771
|
+
: !!showTrackGeneric(self, trackId);
|
|
772
|
+
}
|
|
773
|
+
export async function launchTrackGeneric(self, trackId, initialSnapshot = {}, displayInitialSnapshot = {}, inlineConf) {
|
|
774
|
+
const { pluginManager } = getEnv(self);
|
|
775
|
+
const session = getSession(self);
|
|
776
|
+
const found = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
777
|
+
if (found) {
|
|
778
|
+
return found;
|
|
779
|
+
}
|
|
780
|
+
try {
|
|
781
|
+
const { picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
|
|
782
|
+
await pluginManager.resolveDisplayTypeRecord(picked.type)?.loadStateModel();
|
|
783
|
+
}
|
|
784
|
+
catch (e) {
|
|
785
|
+
session.notifyError(`${e}`, e);
|
|
786
|
+
return undefined;
|
|
787
|
+
}
|
|
788
|
+
if (!isAlive(self)) {
|
|
789
|
+
return undefined;
|
|
790
|
+
}
|
|
791
|
+
return self.showTrack?.(trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
|
|
792
|
+
}
|
|
793
|
+
// the hide runs in the synchronous prologue, so it keeps action context
|
|
794
|
+
export async function launchToggleTrackGeneric(self, trackId) {
|
|
795
|
+
return hideTrackGeneric(self, trackId)
|
|
796
|
+
? false
|
|
797
|
+
: !!(await launchTrackGeneric(self, trackId));
|
|
798
|
+
}
|
|
799
|
+
/**
|
|
800
|
+
* Every track config the session can show, connection-supplied ones included.
|
|
801
|
+
*
|
|
802
|
+
* `session.tracks` is only sessionTracks plus the admin config (see
|
|
803
|
+
* product-core's SessionTracks), so a track that arrived from a hub or registry
|
|
804
|
+
* connection is absent from it while still being toggleable from the track
|
|
805
|
+
* selector, which unions the same two sources. Anything answering "what tracks
|
|
806
|
+
* exist for X" wants this, or a feature silently can't see connection tracks.
|
|
807
|
+
*
|
|
808
|
+
* Note `session.tracks` already contains `sessionTracks` — unioning those two
|
|
809
|
+
* yields every session track twice.
|
|
810
|
+
*/
|
|
811
|
+
export function allSessionTracks(session) {
|
|
812
|
+
const connectionTracks = (session.connectionInstances ?? []).flatMap(conn => conn.tracks);
|
|
813
|
+
return connectionTracks.length
|
|
814
|
+
? [...session.tracks, ...connectionTracks]
|
|
815
|
+
: session.tracks;
|
|
816
|
+
}
|
|
817
|
+
/**
|
|
818
|
+
* The session's annotation for `assemblyName`, as trackIds: what a view opened
|
|
819
|
+
* on another genome starts with. Only FeatureTracks, not everything configured
|
|
820
|
+
* for the assembly — an alignments track turned on behind the user's back
|
|
821
|
+
* fetches data nobody asked for, and a FeatureTrack over a few kb is one tabix
|
|
822
|
+
* range query.
|
|
823
|
+
*/
|
|
824
|
+
export function annotationTrackIds(session, assemblyName) {
|
|
825
|
+
return allSessionTracks(session).flatMap(track => readConfObject(track, 'type') === 'FeatureTrack' &&
|
|
826
|
+
readConfObject(track, 'assemblyNames').some(name => isSameAssemblyName(name, assemblyName, session.assemblyManager))
|
|
827
|
+
? [readConfObject(track, 'trackId')]
|
|
828
|
+
: []);
|
|
829
|
+
}
|
|
830
|
+
function isNavigableView(view) {
|
|
831
|
+
return 'navToLocString' in view;
|
|
832
|
+
}
|
|
833
|
+
/**
|
|
834
|
+
* One assembly on its own in a linear genome view, at `loc`. Keyed on `id`:
|
|
835
|
+
* following several alignments to one genome re-navigates the view rather than
|
|
836
|
+
* stacking a new one each time.
|
|
837
|
+
*/
|
|
838
|
+
export async function openAssemblyInLinearView({ session, id, assemblyName, loc, tracks, }) {
|
|
839
|
+
const view = session.views.find(v => v.id === id);
|
|
840
|
+
if (view && isNavigableView(view)) {
|
|
841
|
+
await view.navToLocString(loc, assemblyName);
|
|
842
|
+
}
|
|
843
|
+
else {
|
|
844
|
+
session.addView('LinearGenomeView', {
|
|
845
|
+
id,
|
|
846
|
+
assembly: assemblyName,
|
|
847
|
+
loc,
|
|
848
|
+
tracks,
|
|
849
|
+
});
|
|
345
850
|
}
|
|
346
851
|
}
|
|
852
|
+
export function openMateLabel(assemblyName) {
|
|
853
|
+
return `Open ${assemblyName} at the matching region`;
|
|
854
|
+
}
|