@jbrowse/core 4.3.0 → 5.0.0-beta.10
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 +1994 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +14 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +36 -23
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +10 -7
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +124 -21
- 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 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +12 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +19 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +18 -23
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +19 -40
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +9 -6
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +33 -30
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +20 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +66 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -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 +19 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +8 -6
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +7 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +7 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +15 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +9 -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 +35 -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 +3 -3
- 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 +20 -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 +62 -63
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +69 -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/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.d.ts +1 -1
- package/esm/BaseFeatureWidget/configSchema.js +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +22 -0
- package/esm/BaseFeatureWidget/formatDetails.js +82 -0
- package/esm/BaseFeatureWidget/index.d.ts +4 -1
- package/esm/BaseFeatureWidget/index.js +2 -2
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +102 -71
- package/esm/BaseFeatureWidget/stateModelFactory.js +162 -63
- package/esm/BaseFeatureWidget/types.d.ts +15 -8
- package/esm/BaseFeatureWidget/util.d.ts +2 -37
- package/esm/BaseFeatureWidget/util.js +4 -85
- package/esm/CorePlugin.js +12 -7
- 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 +55 -44
- package/esm/PluginLoader.js +290 -90
- package/esm/PluginManager.d.ts +476 -57
- package/esm/PluginManager.js +480 -91
- package/esm/ReExports/MuiDataGridReExports.d.ts +3 -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/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/lazify.d.ts +2 -2
- package/esm/ReExports/lazify.js +16 -3
- package/esm/ReExports/list.js +433 -160
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -146
- package/esm/ReExports/muiComponentNames.d.ts +18 -0
- package/esm/ReExports/muiComponentNames.js +130 -0
- package/esm/ReExports/registry.d.ts +3 -0
- package/esm/ReExports/registry.js +46 -0
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/BaseResults.d.ts +20 -21
- package/esm/TextSearch/BaseResults.js +8 -33
- package/esm/TextSearch/TextSearchManager.d.ts +30 -36
- package/esm/TextSearch/TextSearchManager.js +138 -44
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +310 -35
- package/esm/assemblyManager/assembly.js +554 -263
- package/esm/assemblyManager/assemblyAdapters.d.ts +12 -0
- package/esm/assemblyManager/assemblyAdapters.js +24 -0
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +135 -19
- package/esm/assemblyManager/assemblyConfigSchema.js +205 -23
- package/esm/assemblyManager/assemblyManager.d.ts +586 -323
- package/esm/assemblyManager/assemblyManager.js +352 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +39 -0
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +114 -0
- package/esm/assemblyManager/geneticCodes.d.ts +21 -0
- package/esm/assemblyManager/geneticCodes.js +44 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +19 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +22 -0
- package/esm/assemblyManager/index.d.ts +1 -1
- package/esm/assemblyManager/index.js +2 -2
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +5 -0
- package/esm/assemblyManager/loadRefNameMap.js +75 -0
- package/esm/assemblyManager/refNameColors.d.ts +1 -0
- package/esm/assemblyManager/refNameColors.js +32 -0
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -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 +13 -0
- package/esm/checkPlugins.js +98 -0
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +194 -29
- package/esm/configuration/configurationSchema.js +439 -145
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +373 -30
- package/esm/configuration/configurationSlot.js +231 -224
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +41 -0
- package/esm/configuration/formatAboutConfigSchema.js +58 -0
- package/esm/configuration/formatDetailsConfigSchema.d.ts +54 -0
- package/esm/configuration/formatDetailsConfigSchema.js +87 -0
- package/esm/configuration/fullConfSnapshot.d.ts +13 -0
- package/esm/configuration/fullConfSnapshot.js +44 -0
- package/esm/configuration/getConf.d.ts +92 -0
- package/esm/configuration/getConf.js +141 -0
- package/esm/configuration/index.d.ts +32 -3
- package/esm/configuration/index.js +27 -2
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +14 -0
- package/esm/configuration/mergeFormatCallbacks.js +27 -0
- package/esm/configuration/readConfObject.d.ts +34 -0
- package/esm/configuration/readConfObject.js +118 -0
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +52 -0
- package/esm/configuration/schemaRegistry.js +48 -0
- package/esm/configuration/schemaTypes.d.ts +39 -0
- package/esm/configuration/schemaTypes.js +105 -0
- package/esm/configuration/slotFacade.d.ts +65 -0
- package/esm/configuration/slotFacade.js +110 -0
- package/esm/configuration/slotValueUtils.d.ts +17 -0
- package/esm/configuration/slotValueUtils.js +25 -0
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +70 -0
- package/esm/configuration/tabixIndexFields.js +62 -0
- package/esm/configuration/tabixShorthand.d.ts +51 -0
- package/esm/configuration/tabixShorthand.js +72 -0
- package/esm/configuration/types.d.ts +315 -13
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +19 -11
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +19 -18
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +158 -7
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +164 -29
- 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 +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -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 +28 -6
- package/esm/data_adapters/BaseAdapter/index.js +6 -5
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- 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 -13
- 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/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +1 -1
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +5 -5
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +34 -6
- package/esm/data_adapters/CytobandAdapter/configSchema.js +47 -17
- 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 +53 -2
- package/esm/data_adapters/dataAdapterCache.js +99 -25
- package/esm/data_adapters/getFeatureAdapter.d.ts +24 -0
- package/esm/data_adapters/getFeatureAdapter.js +27 -0
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +19 -0
- package/esm/data_adapters/getSequenceSubAdapter.js +42 -0
- package/esm/pluggableElementTypes/AdapterType.d.ts +57 -7
- 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 +54 -14
- package/esm/pluggableElementTypes/DisplayType.js +30 -7
- package/esm/pluggableElementTypes/InternetAccountType.js +1 -1
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +11 -0
- package/esm/pluggableElementTypes/PluggableElementBase.js +11 -0
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +142 -12
- package/esm/pluggableElementTypes/RpcMethodType.js +279 -98
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +18 -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 +7 -7
- 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 +22 -5
- package/esm/pluggableElementTypes/ViewType.js +40 -5
- package/esm/pluggableElementTypes/WidgetType.d.ts +2 -2
- package/esm/pluggableElementTypes/WidgetType.js +1 -1
- package/esm/pluggableElementTypes/addMenuItems.d.ts +88 -0
- package/esm/pluggableElementTypes/addMenuItems.js +82 -0
- package/esm/pluggableElementTypes/extendElementType.d.ts +29 -0
- package/esm/pluggableElementTypes/extendElementType.js +72 -0
- package/esm/pluggableElementTypes/index.d.ts +8 -7
- package/esm/pluggableElementTypes/index.js +24 -14
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +80 -15
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +90 -10
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +643 -84
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +230 -60
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +246 -37
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +416 -107
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +236 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +154 -16
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +169 -25
- package/esm/pluggableElementTypes/models/InternetAccountModel.js +218 -48
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +178 -0
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +239 -0
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +26 -8
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +18 -2
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +31 -17
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +23 -2
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +142 -65
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +215 -90
- package/esm/pluggableElementTypes/models/components/SaveTrackData.d.ts +3 -8
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +111 -139
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +54 -0
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +83 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +50 -0
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +147 -0
- package/esm/pluggableElementTypes/models/index.d.ts +5 -3
- package/esm/pluggableElementTypes/models/index.js +9 -8
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +48 -0
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +114 -0
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/bed.js +75 -7
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +10 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +272 -100
- 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 +225 -0
- package/esm/pluginDefinitions.js +254 -0
- package/esm/rpc/BaseRpcDriver.d.ts +27 -35
- package/esm/rpc/BaseRpcDriver.js +68 -106
- package/esm/rpc/MainThreadRpcDriver.d.ts +9 -10
- package/esm/rpc/MainThreadRpcDriver.js +23 -29
- package/esm/rpc/RpcClient.d.ts +50 -0
- package/esm/rpc/RpcClient.js +189 -0
- package/esm/rpc/RpcManager.d.ts +120 -27
- package/esm/rpc/RpcManager.js +187 -50
- package/esm/rpc/RpcRegistry.d.ts +298 -0
- package/esm/rpc/RpcServer.d.ts +43 -0
- package/esm/rpc/RpcServer.js +242 -0
- package/esm/rpc/WebWorkerRpcDriver.d.ts +78 -24
- package/esm/rpc/WebWorkerRpcDriver.js +311 -30
- package/esm/rpc/byteBudget.d.ts +64 -0
- package/esm/rpc/byteBudget.js +61 -0
- package/esm/rpc/configSchema.d.ts +13 -5
- package/esm/rpc/configSchema.js +40 -16
- package/esm/rpc/coreRpcMethods.d.ts +6 -5
- package/esm/rpc/coreRpcMethods.js +13 -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/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.d.ts +5 -18
- package/esm/rpc/methods/CoreGetExportData.js +25 -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 +14 -18
- 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 +16 -15
- 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/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- 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 +52 -0
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/constants.d.ts +1 -0
- package/esm/svg/constants.js +5 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/saveSvgAsImage.d.ts +6 -0
- package/esm/svg/saveSvgAsImage.js +90 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +42 -0
- package/esm/svg/svgId.js +84 -0
- package/esm/svg/svgReady.d.ts +138 -0
- package/esm/svg/svgReady.js +165 -0
- package/esm/svg/trackNames.d.ts +29 -0
- package/esm/svg/trackNames.js +34 -0
- package/esm/svg/wrapSvgExport.d.ts +12 -0
- package/esm/svg/wrapSvgExport.js +10 -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 +56 -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/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- 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 +446 -42
- 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 +6 -5
- 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 +5 -4
- package/esm/ui/ErrorMessageStackTraceDialog.d.ts +1 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +51 -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 +129 -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 +436 -64
- 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 +11 -3
- package/esm/ui/HoverMenu.js +34 -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 +26 -0
- package/esm/ui/JexlFilterDialog.js +167 -0
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LabeledCheckbox.d.ts +9 -0
- package/esm/ui/LabeledCheckbox.js +7 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.d.ts +7 -0
- package/esm/ui/LegendSwatchGlyph.js +30 -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 +139 -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 +95 -5
- package/esm/ui/MenuTypes.js +16 -1
- package/esm/ui/MonospaceTextField.d.ts +10 -0
- package/esm/ui/MonospaceTextField.js +40 -0
- package/esm/ui/NumberTextField.d.ts +31 -0
- package/esm/ui/NumberTextField.js +33 -0
- package/esm/ui/PaletteContext.d.ts +90 -0
- package/esm/ui/PaletteContext.js +142 -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/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +21 -0
- package/esm/ui/RefNameAutocomplete/index.js +84 -0
- package/esm/ui/RefNameAutocomplete/util.d.ts +62 -0
- package/esm/ui/RefNameAutocomplete/util.js +209 -0
- package/esm/ui/ReplaceCurrentViewButton.d.ts +19 -0
- package/esm/ui/ReplaceCurrentViewButton.js +22 -0
- package/esm/ui/ResizeHandle.d.ts +15 -7
- package/esm/ui/ResizeHandle.js +73 -53
- 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/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +41 -0
- package/esm/ui/ScrollEdgeShadow.js +77 -0
- package/esm/ui/ScrollZoomToggle.d.ts +15 -0
- package/esm/ui/ScrollZoomToggle.js +75 -0
- package/esm/ui/SequenceAdapterInputs.d.ts +9 -0
- package/esm/ui/SequenceAdapterInputs.js +30 -0
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +15 -0
- package/esm/ui/SettingsChangesTable.js +87 -0
- package/esm/ui/ShareLinkField.d.ts +4 -0
- package/esm/ui/ShareLinkField.js +15 -0
- package/esm/ui/SingleSlider.d.ts +8 -0
- package/esm/ui/SingleSlider.js +11 -0
- package/esm/ui/SizeSliderRow.d.ts +14 -0
- package/esm/ui/SizeSliderRow.js +48 -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 +96 -52
- 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 +18 -0
- package/esm/ui/SvgColorLegend.js +106 -0
- package/esm/ui/TagTextField.d.ts +40 -0
- package/esm/ui/TagTextField.js +32 -0
- package/esm/ui/VerticalScrollbar.d.ts +24 -0
- package/esm/ui/VerticalScrollbar.js +104 -0
- package/esm/ui/ViewLoadingScreen.d.ts +25 -0
- package/esm/ui/ViewLoadingScreen.js +52 -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/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colorSwatchStyle.d.ts +9 -0
- package/esm/ui/colorSwatchStyle.js +11 -0
- package/esm/ui/colors.d.ts +125 -8
- package/esm/ui/colors.js +364 -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/hoverBoxStyle.d.ts +23 -0
- package/esm/ui/hoverBoxStyle.js +28 -0
- package/esm/ui/index.d.ts +77 -5
- package/esm/ui/index.js +83 -20
- 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 +46 -0
- package/esm/ui/legendMenuItem.d.ts +16 -0
- package/esm/ui/legendMenuItem.js +17 -0
- package/esm/ui/legendSpec.d.ts +69 -0
- package/esm/ui/legendSpec.js +69 -0
- package/esm/ui/loadingDotKeyframes.d.ts +18 -0
- package/esm/ui/loadingDotKeyframes.js +17 -0
- package/esm/ui/makeSizeMenu.d.ts +24 -0
- package/esm/ui/makeSizeMenu.js +58 -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 +22 -0
- package/esm/ui/menuItemAdornment.js +28 -0
- package/esm/ui/menuItems.d.ts +23 -0
- package/esm/ui/menuItems.js +21 -0
- package/esm/ui/menuLabels.d.ts +41 -0
- package/esm/ui/menuLabels.js +43 -0
- package/esm/ui/multiTrackMenuItems.d.ts +25 -0
- package/esm/ui/multiTrackMenuItems.js +15 -0
- package/esm/ui/palette.d.ts +561 -0
- package/esm/ui/palette.js +785 -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/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 +268 -30
- package/esm/ui/theme.js +250 -350
- package/esm/ui/toggleMenuItems.d.ts +42 -0
- package/esm/ui/toggleMenuItems.js +61 -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/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -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 +207 -17
- package/esm/util/Base1DUtils.js +316 -173
- package/esm/util/Base1DViewModel.d.ts +99 -21
- package/esm/util/Base1DViewModel.js +151 -41
- 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 +83 -0
- package/esm/util/SvgCanvas.js +520 -0
- package/esm/util/TimeTraveller.d.ts +12 -0
- package/esm/util/TimeTraveller.js +130 -27
- package/esm/util/aborting.d.ts +56 -4
- package/esm/util/aborting.js +112 -25
- package/esm/util/adapterMetadata.d.ts +20 -0
- package/esm/util/adapterMetadata.js +40 -0
- package/esm/util/addAndShowTrack.d.ts +19 -0
- package/esm/util/addAndShowTrack.js +27 -0
- package/esm/util/addRelativeUris.d.ts +29 -0
- package/esm/util/addRelativeUris.js +78 -0
- package/esm/util/addTrackComponent.d.ts +72 -0
- package/esm/util/addTrackComponent.js +53 -0
- package/esm/util/addTrackFromWidget.d.ts +91 -0
- package/esm/util/addTrackFromWidget.js +91 -0
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.d.ts +32 -3
- package/esm/util/analytics.js +135 -49
- package/esm/util/animationAllowed.d.ts +26 -0
- package/esm/util/animationAllowed.js +35 -0
- package/esm/util/applyRowResizeWheel.d.ts +15 -0
- package/esm/util/applyRowResizeWheel.js +23 -0
- package/esm/util/assemblyConfigUtils.d.ts +144 -0
- package/esm/util/assemblyConfigUtils.js +498 -0
- package/esm/util/bandHeight.d.ts +63 -0
- package/esm/util/bandHeight.js +85 -0
- package/esm/util/bandLayout.d.ts +51 -0
- package/esm/util/bandLayout.js +36 -0
- package/esm/util/bezierConnector.d.ts +15 -0
- package/esm/util/bezierConnector.js +101 -0
- package/esm/util/bgzfWorkerPool.d.ts +24 -0
- package/esm/util/bgzfWorkerPool.js +27 -0
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -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/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/chooseGridPitch.d.ts +9 -0
- package/esm/util/chooseGridPitch.js +31 -0
- package/esm/util/clampToContig.d.ts +43 -0
- package/esm/util/clampToContig.js +47 -0
- package/esm/util/cmpStr.d.ts +1 -0
- package/esm/util/cmpStr.js +7 -0
- package/esm/util/coarseStripHTML.js +2 -15
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +7 -2
- package/esm/util/color/index.d.ts +84 -3
- package/esm/util/color/index.js +197 -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 +155 -0
- package/esm/util/colorRamp.d.ts +81 -0
- package/esm/util/colorRamp.js +244 -0
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -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/createAbortRotation.d.ts +115 -0
- package/esm/util/createAbortRotation.js +116 -0
- package/esm/util/createSvgRasterCanvas.d.ts +17 -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/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- 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 +22 -0
- package/esm/util/diagonalizeRegions.js +187 -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/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.d.ts +6 -0
- package/esm/util/fetchAndMaybeUnzip.js +71 -0
- package/esm/util/fetchContext.d.ts +81 -0
- package/esm/util/fetchContext.js +59 -0
- package/esm/util/fetchHub.d.ts +17 -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 +4 -1
- package/esm/util/fetchSeq.js +18 -6
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- 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 +26 -0
- package/esm/util/freezeDeep.js +39 -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/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +25 -0
- package/esm/util/highlights.js +87 -0
- package/esm/util/hooks.d.ts +189 -0
- package/esm/util/hooks.js +485 -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 +82 -268
- package/esm/util/index.js +137 -853
- package/esm/util/indexCandidates.d.ts +20 -0
- package/esm/util/indexCandidates.js +43 -0
- package/esm/util/installClearHoverOnSurfaceMove.d.ts +40 -0
- package/esm/util/installClearHoverOnSurfaceMove.js +41 -0
- package/esm/util/installFetch.d.ts +234 -0
- package/esm/util/installFetch.js +205 -0
- package/esm/util/installInitAutorun.d.ts +63 -0
- package/esm/util/installInitAutorun.js +107 -0
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -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 +120 -12
- package/esm/util/isDataCurrent.d.ts +9 -0
- package/esm/util/isDataCurrent.js +12 -0
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -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 +146 -19
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +68 -0
- package/esm/util/jexlFilters.js +61 -0
- package/esm/util/jexlStrings.d.ts +21 -1
- package/esm/util/jexlStrings.js +20 -14
- package/esm/util/layouts/GranularRectLayout.d.ts +20 -25
- package/esm/util/layouts/GranularRectLayout.js +116 -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/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/leadingEdgeAutorun.d.ts +40 -0
- package/esm/util/leadingEdgeAutorun.js +51 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -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/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -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 +3 -11
- package/esm/util/mst-reflection.js +3 -52
- package/esm/util/mstUtils.d.ts +97 -0
- package/esm/util/mstUtils.js +137 -0
- package/esm/util/nanoid.d.ts +0 -4
- package/esm/util/nanoid.js +10 -20
- package/esm/util/numericUtils.d.ts +27 -0
- package/esm/util/numericUtils.js +143 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -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/openFeatureWidget.d.ts +38 -0
- package/esm/util/openFeatureWidget.js +64 -0
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -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 +44 -2
- package/esm/util/parseLineByLine.js +150 -15
- package/esm/util/parseMotifList.d.ts +17 -0
- package/esm/util/parseMotifList.js +69 -0
- package/esm/util/pluginStore.d.ts +111 -0
- package/esm/util/pluginStore.js +254 -0
- package/esm/util/pointerPresence.d.ts +5 -0
- package/esm/util/pointerPresence.js +21 -0
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +459 -0
- package/esm/util/progress.js +821 -0
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +46 -1
- package/esm/util/range.js +68 -2
- package/esm/util/renameRegions.d.ts +41 -0
- package/esm/util/renameRegions.js +143 -0
- package/esm/util/renderToStaticMarkup.d.ts +2 -0
- package/esm/util/renderToStaticMarkup.js +60 -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 -2
- package/esm/util/rxjs.js +85 -10
- package/esm/util/sameStrings.d.ts +16 -0
- package/esm/util/sameStrings.js +20 -0
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +5 -0
- package/esm/util/scrollLatch.js +67 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -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 +40 -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/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +111 -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/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stats.d.ts +25 -2
- package/esm/util/stats.js +39 -8
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/stringUtils.d.ts +5 -0
- package/esm/util/stringUtils.js +34 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +18 -0
- package/esm/util/svgColorProps.js +55 -0
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +125 -0
- package/esm/util/tabix.js +148 -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/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/tickLabels.d.ts +36 -0
- package/esm/util/tickLabels.js +45 -0
- package/esm/util/timeGate.d.ts +25 -0
- package/esm/util/timeGate.js +78 -0
- package/esm/util/trackConfigDelta.d.ts +84 -0
- package/esm/util/trackConfigDelta.js +206 -0
- package/esm/util/tracks.d.ts +431 -30
- package/esm/util/tracks.js +952 -185
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- 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 +73 -0
- package/esm/util/types/data.js +41 -0
- package/esm/util/types/index.d.ts +459 -121
- package/esm/util/types/index.js +96 -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 +74 -47
- package/esm/util/types/mst.js +31 -22
- package/esm/util/types/predicate.d.ts +9 -0
- package/esm/util/types/predicate.js +1 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -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 +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -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 +55 -77
- package/esm/util/useFetch.d.ts +55 -0
- package/esm/util/useFetch.js +197 -0
- package/esm/util/useFetchPlugins.d.ts +16 -0
- package/esm/util/useFetchPlugins.js +18 -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 +9 -0
- package/esm/util/usePanelVirtualScroll.js +15 -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 +9 -0
- package/esm/util/useRowVirtualScroll.js +22 -0
- package/esm/util/useVirtualScrollWheel.d.ts +23 -0
- package/esm/util/useVirtualScrollWheel.js +74 -0
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +90 -0
- package/esm/util/viewStatus.js +54 -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 +65 -0
- package/esm/util/wheelZoom.js +297 -0
- package/esm/util/whenViewSettled.d.ts +74 -0
- package/esm/util/whenViewSettled.js +77 -0
- package/esm/util/withFeatureDetails.d.ts +34 -0
- package/esm/util/withFeatureDetails.js +59 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +290 -820
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -7
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -9
- package/esm/ReExports/DataGrid.d.ts +0 -1
- package/esm/ReExports/DataGrid.js +0 -1
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.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/stopToken.d.ts +0 -19
- package/esm/util/stopToken.js +0 -90
- 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/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/CytobandAdapter.js} +0 -0
- /package/esm/data_adapters/BaseAdapter/{BaseOptions.js → zoomRange.js} +0 -0
- /package/esm/{util/layouts/BaseLayout.js → rpc/RpcRegistry.js} +0 -0
package/esm/util/tracks.js
CHANGED
|
@@ -1,48 +1,134 @@
|
|
|
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 { asModelType, getParent, getSnapshot, getType, hasParent, isAlive, isStateTreeNode, } from '@jbrowse/mobx-state-tree';
|
|
12
|
+
import { observable, runInAction, untracked } from 'mobx';
|
|
13
|
+
import { readConfObject } from '../configuration/index.js';
|
|
14
|
+
import { adapterConfigCacheKey } from '../data_adapters/dataAdapterCache.js';
|
|
15
|
+
import { displayCandidates, displayTypesFedBy, } from '../pluggableElementTypes/models/baseTrackConfig.js';
|
|
16
|
+
import { getFileHandle, storeFileHandle, verifyPermission, } from './fileHandleStore.js';
|
|
17
|
+
import { getFileName } from './getFileName.js';
|
|
18
|
+
import { getContainingView, getEnv, getSession, objectHash, } from './mstUtils.js';
|
|
19
|
+
import { isViewModel } from './types/index.js';
|
|
20
|
+
import { setterOnlyMessage, unknownKeysMessage } from './unknownSnapshotKeys.js';
|
|
21
|
+
// Deliberately uncached. This used to memoize on a permanent WeakMap keyed by
|
|
22
|
+
// track, but every caller reads it from inside a reactive getter or autorun: the
|
|
23
|
+
// memo meant the reaction never subscribed to the config, so editing
|
|
24
|
+
// assemblyNames in the config editor did not invalidate it. The reads are
|
|
25
|
+
// per-view-change, not per-feature, so MobX's own computed caching is enough.
|
|
6
26
|
export function getTrackAssemblyNames(track) {
|
|
7
|
-
|
|
8
|
-
if (!cached) {
|
|
9
|
-
cached = getConfAssemblyNames(track.configuration);
|
|
10
|
-
trackAssemblyNamesCache.set(track, cached);
|
|
11
|
-
}
|
|
12
|
-
return cached;
|
|
27
|
+
return getConfAssemblyNames(track.configuration);
|
|
13
28
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
29
|
+
/**
|
|
30
|
+
* Assembly names as the aliases resolve them, so a track configured against
|
|
31
|
+
* `hg38` compares equal to a view on `GRCh38`. Every "does this track belong to
|
|
32
|
+
* these assemblies" test should run both sides through this, or the same track
|
|
33
|
+
* is offered by one picker and hidden by another.
|
|
34
|
+
*
|
|
35
|
+
* A name the assembly manager doesn't know is kept **as written**, not dropped.
|
|
36
|
+
* Dropping it means "matches nothing" on the track side but "no constraint at
|
|
37
|
+
* all" on the list side, and those disagree; kept, both sides compare the same
|
|
38
|
+
* raw string and matching degrades to the exact name — which is also the right
|
|
39
|
+
* answer in the window before the assembly manager has built its models. Empty
|
|
40
|
+
* names are dropped: a half-initialized view pads its assembly list with them.
|
|
41
|
+
*/
|
|
42
|
+
export function canonicalAssemblyNames(names, assemblyManager) {
|
|
43
|
+
return names
|
|
44
|
+
.filter(name => !!name)
|
|
45
|
+
.map(name => assemblyManager.getCanonicalAssemblyName(name) ?? name);
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Whether two names name the same assembly, resolving aliases on both sides.
|
|
49
|
+
*
|
|
50
|
+
* The pairwise counterpart to {@link canonicalAssemblyNames}, for the two
|
|
51
|
+
* places a list cannot be mapped: an index-aligned array, which that function's
|
|
52
|
+
* empty-name filter would desync, and a comparison where one side must come
|
|
53
|
+
* back in the caller's own spelling rather than the canonical one.
|
|
54
|
+
*
|
|
55
|
+
* **Both sides, or it buys nothing.** The names meeting at these comparisons
|
|
56
|
+
* come from different places — a view holds what the session opened it on, a
|
|
57
|
+
* track config holds what its author wrote, and a synteny mate holds whatever
|
|
58
|
+
* the adapter resolved a PanSN prefix to. Any two of those can be aliases of
|
|
59
|
+
* one assembly, and `===` says no.
|
|
60
|
+
*
|
|
61
|
+
* A name the assembly manager doesn't know compares as written, the same
|
|
62
|
+
* degradation {@link canonicalAssemblyNames} makes and for the same reason: an
|
|
63
|
+
* all-vs-all file carries sample names no config declares, and those still have
|
|
64
|
+
* to compare equal to themselves.
|
|
65
|
+
*/
|
|
66
|
+
export function isSameAssemblyName(a, b, assemblyManager) {
|
|
67
|
+
if (!a || !b) {
|
|
68
|
+
return false;
|
|
24
69
|
}
|
|
25
|
-
return
|
|
70
|
+
return (a === b ||
|
|
71
|
+
(assemblyManager.getCanonicalAssemblyName(a) ?? a) ===
|
|
72
|
+
(assemblyManager.getCanonicalAssemblyName(b) ?? b));
|
|
26
73
|
}
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
74
|
+
/**
|
|
75
|
+
* The assemblies a track config names, or `undefined` when it names none.
|
|
76
|
+
*
|
|
77
|
+
* Two shapes, and the second is why this is a function rather than a slot read.
|
|
78
|
+
* A track built on `createBaseTrackConfig` carries `assemblyNames`.
|
|
79
|
+
* `ReferenceSequenceTrack` does not — its schema omits the slot deliberately
|
|
80
|
+
* (see `createReferenceSeqTrackConfig`), because the assembly config holding it
|
|
81
|
+
* IS its assembly, so the name is read off the parent instead.
|
|
82
|
+
*
|
|
83
|
+
* That makes a sequence track's assembly **positional**, so a copy of one that
|
|
84
|
+
* is not inside its assembly cannot answer at all — and a detached config is
|
|
85
|
+
* what every hydration path produces (`hydrateTrackConfig`, and the working
|
|
86
|
+
* copy a non-admin's edits would go to, ADR-032). `hasParent` is the guard:
|
|
87
|
+
* without it the walk raises MST's "Failed to find the parent" from a helper
|
|
88
|
+
* whose other two failure modes are a plain `undefined`.
|
|
89
|
+
*/
|
|
90
|
+
function confAssemblyNames(conf) {
|
|
91
|
+
const trackAssemblyNames = readConfObject(conf, 'assemblyNames');
|
|
92
|
+
if (trackAssemblyNames) {
|
|
93
|
+
return trackAssemblyNames;
|
|
33
94
|
}
|
|
34
|
-
if (!
|
|
35
|
-
|
|
95
|
+
if (!hasParent(conf)) {
|
|
96
|
+
return undefined;
|
|
36
97
|
}
|
|
37
|
-
|
|
98
|
+
const parent = getParent(conf);
|
|
99
|
+
return 'sequence' in parent
|
|
100
|
+
? [readConfObject(parent, 'name')]
|
|
101
|
+
: undefined;
|
|
38
102
|
}
|
|
39
|
-
export function
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
}
|
|
103
|
+
export function getConfAssemblyNames(conf) {
|
|
104
|
+
const names = confAssemblyNames(conf);
|
|
105
|
+
if (!names) {
|
|
106
|
+
throw new Error('unknown assembly names');
|
|
44
107
|
}
|
|
45
|
-
return
|
|
108
|
+
return names;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* {@link getConfAssemblyNames} for a caller that cannot afford its throw — a
|
|
112
|
+
* config answering neither way leaves the question unanswered instead.
|
|
113
|
+
*
|
|
114
|
+
* `BaseTrackModel.refNameMismatch` is the caller: it runs on every render of
|
|
115
|
+
* every track label, so an unanswerable question must not become a thrown
|
|
116
|
+
* getter. It used to read the raw `assemblyNames` slot itself for that reason,
|
|
117
|
+
* which is a second, subtly different copy of the walk above — and one that
|
|
118
|
+
* answers `[]` for a ReferenceSequenceTrack whose assembly this already knows
|
|
119
|
+
* how to name.
|
|
120
|
+
*/
|
|
121
|
+
export function getConfAssemblyNamesOrNone(conf) {
|
|
122
|
+
return confAssemblyNames(conf) ?? [];
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The RPC session id a track's own requests go out under, from its config:
|
|
126
|
+
* what `BaseTrackModel.rpcSessionId` computes, for a caller holding no model.
|
|
127
|
+
* A call under any other id lands on another worker, which builds a second
|
|
128
|
+
* copy of the adapter that nothing frees.
|
|
129
|
+
*/
|
|
130
|
+
export function getConfRpcSessionId(conf) {
|
|
131
|
+
return adapterConfigCacheKey(readConfObject(conf, 'adapter'));
|
|
46
132
|
}
|
|
47
133
|
export const UNKNOWN = 'UNKNOWN';
|
|
48
134
|
export const UNSUPPORTED = 'UNSUPPORTED';
|
|
@@ -53,10 +139,17 @@ export function getBlob(id) {
|
|
|
53
139
|
export function getBlobMap() {
|
|
54
140
|
return blobMap;
|
|
55
141
|
}
|
|
142
|
+
// Populates the blobMap in a fresh JS realm (e.g. a web worker, which starts
|
|
143
|
+
// with an empty module-level blobMap). RPC args are the only channel into the
|
|
144
|
+
// worker, so the main thread ships its full blobMap and the worker replaces its
|
|
145
|
+
// own here before adapters call the synchronous getBlob() during openLocation.
|
|
56
146
|
export function setBlobMap(map) {
|
|
57
147
|
blobMap = map;
|
|
58
148
|
}
|
|
59
149
|
let counter = 0;
|
|
150
|
+
// blob files are stored in a global map. the blobId is based on a combination
|
|
151
|
+
// of timestamp plus counter to be unique across sessions and fast repeated
|
|
152
|
+
// calls
|
|
60
153
|
export function storeBlobLocation(location) {
|
|
61
154
|
if ('blob' in location) {
|
|
62
155
|
const blobId = `b${Date.now()}-${counter++}`;
|
|
@@ -69,24 +162,33 @@ export function storeBlobLocation(location) {
|
|
|
69
162
|
}
|
|
70
163
|
return location;
|
|
71
164
|
}
|
|
72
|
-
|
|
165
|
+
// openLocation is synchronous, so File objects are cached here after async handle
|
|
166
|
+
// resolution. Observable so an open LocalFileChooser reactively clears its "needs
|
|
167
|
+
// reload" notice once a restore (afterAttach / "Restore access") populates the
|
|
168
|
+
// cache; the worker/RPC readers run outside any reaction so nothing else
|
|
169
|
+
// subscribes.
|
|
170
|
+
const fileHandleCache = observable.map();
|
|
73
171
|
export function getFileFromCache(handleId) {
|
|
74
|
-
return fileHandleCache
|
|
172
|
+
return fileHandleCache.get(handleId);
|
|
75
173
|
}
|
|
76
174
|
export function setFileInCache(handleId, file) {
|
|
77
|
-
|
|
175
|
+
runInAction(() => {
|
|
176
|
+
fileHandleCache.set(handleId, file);
|
|
177
|
+
});
|
|
78
178
|
}
|
|
79
179
|
export function clearFileFromCache(handleId) {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
return fileHandleCache;
|
|
180
|
+
runInAction(() => {
|
|
181
|
+
fileHandleCache.delete(handleId);
|
|
182
|
+
});
|
|
84
183
|
}
|
|
85
|
-
export function
|
|
86
|
-
|
|
184
|
+
export function hasFileHandlesInCache() {
|
|
185
|
+
// read in RpcMethodType.serializeArguments, which an RPC-fetch autorun can
|
|
186
|
+
// reach; untracked so populating the cache never re-triggers that autorun
|
|
187
|
+
// eslint-disable-next-line no-restricted-syntax -- self-write: the fetch this is reached from populates the cache
|
|
188
|
+
return untracked(() => fileHandleCache.size > 0);
|
|
87
189
|
}
|
|
88
190
|
export async function ensureFileHandleReady(handleId, requestPermission = true) {
|
|
89
|
-
const cached = fileHandleCache
|
|
191
|
+
const cached = fileHandleCache.get(handleId);
|
|
90
192
|
if (cached) {
|
|
91
193
|
return cached;
|
|
92
194
|
}
|
|
@@ -99,88 +201,100 @@ export async function ensureFileHandleReady(handleId, requestPermission = true)
|
|
|
99
201
|
throw new Error(`Permission denied for file "${handle.name}". Click "Restore access" to grant permission.`);
|
|
100
202
|
}
|
|
101
203
|
const file = await handle.getFile();
|
|
102
|
-
|
|
204
|
+
setFileInCache(handleId, file);
|
|
103
205
|
return file;
|
|
104
206
|
}
|
|
105
207
|
export async function storeFileHandleLocation(handle) {
|
|
106
208
|
const handleId = await storeFileHandle(handle);
|
|
107
209
|
const file = await handle.getFile();
|
|
108
|
-
|
|
210
|
+
setFileInCache(handleId, file);
|
|
109
211
|
return {
|
|
110
212
|
locationType: 'FileHandleLocation',
|
|
111
213
|
name: handle.name,
|
|
112
214
|
handleId,
|
|
113
215
|
};
|
|
114
216
|
}
|
|
217
|
+
async function settleFileHandle(handleId, requestPermission) {
|
|
218
|
+
try {
|
|
219
|
+
await ensureFileHandleReady(handleId, requestPermission);
|
|
220
|
+
return { handleId, success: true };
|
|
221
|
+
}
|
|
222
|
+
catch (error) {
|
|
223
|
+
return { handleId, success: false, error };
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Resolves a batch of stored file handles, one result per id.
|
|
228
|
+
*
|
|
229
|
+
* With `requestPermission` set these run ONE AT A TIME, and that is the whole
|
|
230
|
+
* point of the branch. `requestPermission()` needs transient user activation and
|
|
231
|
+
* the browser puts a single file-access prompt on screen at a time, so N of them
|
|
232
|
+
* fired off one "Restore access" click means the first call takes the prompt and
|
|
233
|
+
* the rest are refused without the user ever seeing a dialog — files reported
|
|
234
|
+
* back as permission failures that nobody was asked about. Taking turns, each
|
|
235
|
+
* prompt waits for the one before it to be answered, and whatever the activation
|
|
236
|
+
* window no longer covers is simply still pending for the next click instead of
|
|
237
|
+
* being spent.
|
|
238
|
+
*
|
|
239
|
+
* Without it nothing can prompt, so there is nothing to take turns over and the
|
|
240
|
+
* batch runs at once.
|
|
241
|
+
*/
|
|
115
242
|
export async function restoreFileHandles(handleIds, requestPermission = false) {
|
|
243
|
+
if (!requestPermission) {
|
|
244
|
+
return Promise.all(handleIds.map(id => settleFileHandle(id, false)));
|
|
245
|
+
}
|
|
116
246
|
const results = [];
|
|
117
247
|
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
|
-
}
|
|
248
|
+
results.push(await settleFileHandle(handleId, true));
|
|
125
249
|
}
|
|
126
250
|
return results;
|
|
127
251
|
}
|
|
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);
|
|
252
|
+
export function findFileHandleIds(obj) {
|
|
253
|
+
const handleIds = new Set();
|
|
254
|
+
const seen = new WeakSet();
|
|
255
|
+
function walk(o) {
|
|
256
|
+
if (!o || typeof o !== 'object' || seen.has(o)) {
|
|
257
|
+
return;
|
|
139
258
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
handleIds.add(record.handleId);
|
|
259
|
+
seen.add(o);
|
|
260
|
+
if (Array.isArray(o)) {
|
|
261
|
+
for (const item of o) {
|
|
262
|
+
walk(item);
|
|
263
|
+
}
|
|
146
264
|
}
|
|
147
|
-
|
|
148
|
-
|
|
265
|
+
else {
|
|
266
|
+
const record = o;
|
|
267
|
+
if (record.locationType === 'FileHandleLocation' &&
|
|
268
|
+
typeof record.handleId === 'string') {
|
|
269
|
+
handleIds.add(record.handleId);
|
|
270
|
+
}
|
|
271
|
+
for (const value of Object.values(record)) {
|
|
272
|
+
walk(value);
|
|
273
|
+
}
|
|
149
274
|
}
|
|
150
275
|
}
|
|
276
|
+
walk(obj);
|
|
151
277
|
return handleIds;
|
|
152
278
|
}
|
|
153
279
|
export async function restoreFileHandlesFromSnapshot(sessionSnapshot, requestPermission = false) {
|
|
154
|
-
|
|
155
|
-
if (handleIds.size > 0) {
|
|
156
|
-
return restoreFileHandles([...handleIds], requestPermission);
|
|
157
|
-
}
|
|
158
|
-
return [];
|
|
159
|
-
}
|
|
160
|
-
let pendingFileHandleIds = [];
|
|
161
|
-
export function getPendingFileHandleIds() {
|
|
162
|
-
return pendingFileHandleIds;
|
|
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;
|
|
280
|
+
return restoreFileHandles([...findFileHandleIds(sessionSnapshot)], requestPermission);
|
|
178
281
|
}
|
|
282
|
+
/**
|
|
283
|
+
* creates a new location from the provided location including the appropriate
|
|
284
|
+
* suffix and location type
|
|
285
|
+
*
|
|
286
|
+
* @param location - the FileLocation
|
|
287
|
+
* @param suffix - the file suffix (e.g. .bam)
|
|
288
|
+
* @returns the constructed location object from the provided parameters
|
|
289
|
+
*/
|
|
179
290
|
export function makeIndex(location, suffix) {
|
|
180
291
|
if ('uri' in location) {
|
|
181
292
|
return {
|
|
182
293
|
uri: location.uri + suffix,
|
|
183
294
|
locationType: 'UriLocation',
|
|
295
|
+
// carry the parent's baseUri so a derived sibling index resolves against
|
|
296
|
+
// the same config location as the file it indexes
|
|
297
|
+
...(location.baseUri ? { baseUri: location.baseUri } : {}),
|
|
184
298
|
};
|
|
185
299
|
}
|
|
186
300
|
else if ('localPath' in location) {
|
|
@@ -193,36 +307,78 @@ export function makeIndex(location, suffix) {
|
|
|
193
307
|
return location;
|
|
194
308
|
}
|
|
195
309
|
}
|
|
310
|
+
/**
|
|
311
|
+
* constructs a potential index file (with suffix) from the provided file name
|
|
312
|
+
*
|
|
313
|
+
* @param name - the name of the index file
|
|
314
|
+
* @param typeA - one option of a potential two file suffix (e.g. CSI, BAI)
|
|
315
|
+
* @param typeB - the second option of a potential two file suffix (e.g. CSI, BAI)
|
|
316
|
+
* @returns a likely name of the index file for a given filename
|
|
317
|
+
*/
|
|
196
318
|
export function makeIndexType(name, typeA, typeB) {
|
|
197
319
|
return name?.toUpperCase().endsWith(typeA) ? typeA : typeB;
|
|
198
320
|
}
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
321
|
+
/**
|
|
322
|
+
* The `index` block a tabix-indexed adapter's guess writes: where the index is,
|
|
323
|
+
* and which of the two kinds it is.
|
|
324
|
+
*
|
|
325
|
+
* Eight guessers spelled this pair out by hand, which is the crossed-pair hazard
|
|
326
|
+
* `tabixIndexSnapshot` was extracted for on the config side: a `.csi` location
|
|
327
|
+
* filed under `indexType: 'TBI'` is a valid-looking config that opens no index
|
|
328
|
+
* at all, and nothing downstream can tell it from a correct one.
|
|
329
|
+
*
|
|
330
|
+
* BAM is deliberately not here, for the reason `tabixIndexFields` gives: BAI/CSI
|
|
331
|
+
* is a different enumeration over a different default, and folding the two would
|
|
332
|
+
* mean a slot whose vocabulary depends on its adapter.
|
|
333
|
+
*/
|
|
334
|
+
export function guessTabixIndex(file, index) {
|
|
335
|
+
return {
|
|
336
|
+
location: index ?? makeIndex(file, '.tbi'),
|
|
337
|
+
indexType: makeIndexType(index && getFileName(index), 'CSI', 'TBI'),
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
/**
|
|
341
|
+
* Register a guess on `Core-guessAdapterForLocation`. Return an adapter config
|
|
342
|
+
* to claim the file, or `undefined` to defer to the plugins registered before
|
|
343
|
+
* this one.
|
|
344
|
+
*
|
|
345
|
+
* Prefer this over calling `addToExtensionPoint` directly: the chaining is done
|
|
346
|
+
* once here, so a plugin cannot break the chain by forgetting to delegate, nor
|
|
347
|
+
* drop an argument on the way through.
|
|
348
|
+
*/
|
|
349
|
+
export function addAdapterGuesser(pluginManager, guess) {
|
|
350
|
+
pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', next => (file, index, adapterHint) => guess(file, index, adapterHint) ?? next(file, index, adapterHint));
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Register a guess on `Core-guessTrackTypeForLocation`. Return a track type
|
|
354
|
+
* name to claim the adapter, or `undefined` to defer. See `addAdapterGuesser`
|
|
355
|
+
* for why this wrapper exists — hand-written delegates here used to drop the
|
|
356
|
+
* optional `file`, which hid it from every guesser registered earlier in the
|
|
357
|
+
* chain.
|
|
358
|
+
*/
|
|
359
|
+
export function addTrackTypeGuesser(pluginManager, guess) {
|
|
360
|
+
pluginManager.addToExtensionPoint('Core-guessTrackTypeForLocation', next => (adapterName, file) => guess(adapterName, file) ?? next(adapterName, file));
|
|
361
|
+
}
|
|
362
|
+
const COMPRESSION_SUFFIXES = ['.gz', '.bgz', '.bz2', '.zst'];
|
|
363
|
+
/**
|
|
364
|
+
* Drop the format extension from a filename, plus any compression suffix, so
|
|
365
|
+
* `volvox.vcf.gz` becomes `volvox` rather than `volvox.vcf`. Names with no
|
|
366
|
+
* extension, and dotfiles, are returned unchanged.
|
|
367
|
+
*/
|
|
368
|
+
export function stripFileExtension(name) {
|
|
369
|
+
const lower = name.toLowerCase();
|
|
370
|
+
const base = COMPRESSION_SUFFIXES.some(suffix => lower.endsWith(suffix))
|
|
371
|
+
? name.slice(0, name.lastIndexOf('.'))
|
|
372
|
+
: name;
|
|
373
|
+
const dot = base.lastIndexOf('.');
|
|
374
|
+
return dot > 0 ? base.slice(0, dot) : base;
|
|
219
375
|
}
|
|
220
376
|
export function guessAdapter(file, index, adapterHint, model) {
|
|
221
377
|
if (model) {
|
|
222
378
|
const { pluginManager } = getEnv(model);
|
|
223
|
-
const adapterGuesser = pluginManager.evaluateExtensionPoint(
|
|
224
|
-
|
|
225
|
-
|
|
379
|
+
const adapterGuesser = pluginManager.evaluateExtensionPoint(
|
|
380
|
+
/** #extensionPoint Core-guessAdapterForLocation | sync | Guess an adapter config from a file location */
|
|
381
|
+
'Core-guessAdapterForLocation', () => undefined);
|
|
226
382
|
const adapter = adapterGuesser(file, index, adapterHint);
|
|
227
383
|
if (adapter) {
|
|
228
384
|
return adapter;
|
|
@@ -234,10 +390,14 @@ export function guessAdapter(file, index, adapterHint, model) {
|
|
|
234
390
|
}
|
|
235
391
|
export function guessTrackType(adapterType, model, file) {
|
|
236
392
|
if (model) {
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
393
|
+
// getEnv(model), not getEnv(getSession(model)): the env is tree-wide, so
|
|
394
|
+
// the session hop only narrowed what may be passed here — a session itself
|
|
395
|
+
// has no session ancestor, so guessAdapter above accepted one and this
|
|
396
|
+
// threw on it
|
|
397
|
+
const { pluginManager } = getEnv(model);
|
|
398
|
+
const trackTypeGuesser = pluginManager.evaluateExtensionPoint(
|
|
399
|
+
/** #extensionPoint Core-guessTrackTypeForLocation | sync | Guess a track type from a file location */
|
|
400
|
+
'Core-guessTrackTypeForLocation', () => undefined);
|
|
241
401
|
const trackType = trackTypeGuesser(adapterType, file);
|
|
242
402
|
if (trackType) {
|
|
243
403
|
return trackType;
|
|
@@ -245,102 +405,709 @@ export function guessTrackType(adapterType, model, file) {
|
|
|
245
405
|
}
|
|
246
406
|
return 'FeatureTrack';
|
|
247
407
|
}
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
408
|
+
/**
|
|
409
|
+
* Expand a loose track description — a bare data-file URI, or an object with
|
|
410
|
+
* `uri` (and optional `index`) plus any extra config keys — into a full track
|
|
411
|
+
* config, the same inference the "Add track" flow does: the adapter and track
|
|
412
|
+
* type are guessed from the file via the format plugins, a stable `trackId` and
|
|
413
|
+
* a `name` are derived from the filename, and the assembly is stamped on. Extra
|
|
414
|
+
* keys on the input (`name`, `category`, `displays`, ...) override the inferred
|
|
415
|
+
* defaults. Takes a `pluginManager` (not a model) so it runs headlessly — in a
|
|
416
|
+
* worker/Node export as well as the browser. Throws when no format matches, so
|
|
417
|
+
* the caller can ask for a full config instead.
|
|
418
|
+
*/
|
|
419
|
+
export function guessTrackConf(input, pluginManager, assemblyName) {
|
|
420
|
+
const { uri, index, baseUri, ...extra } = typeof input === 'string' ? { uri: input } : input;
|
|
421
|
+
const base = baseUri ? { baseUri } : {};
|
|
422
|
+
return {
|
|
423
|
+
...guessTrackConfForLocation({ uri, locationType: 'UriLocation', ...base }, index ? { uri: index, locationType: 'UriLocation', ...base } : undefined, pluginManager, assemblyName),
|
|
424
|
+
...extra,
|
|
255
425
|
};
|
|
256
|
-
conf.trackId = objectHash(conf);
|
|
257
|
-
return conf;
|
|
258
426
|
}
|
|
259
|
-
|
|
427
|
+
/**
|
|
428
|
+
* {@link guessTrackConf} over an already-built {@link FileLocation}, for a
|
|
429
|
+
* caller holding a location the loose `{ uri }` vocabulary cannot spell — a
|
|
430
|
+
* desktop local path. Kept separate so `LooseTrackInput` stays URI-only: it
|
|
431
|
+
* sits on the track-config union and the root config's `tracks`, where a
|
|
432
|
+
* local path would be a config a web deployment could not open.
|
|
433
|
+
*
|
|
434
|
+
* The `trackId` is a content hash of the adapter, not a timestamp, so adding
|
|
435
|
+
* the same file twice is idempotent — `addToSession` dedupes on it.
|
|
436
|
+
*/
|
|
437
|
+
export function guessTrackConfForLocation(file, index, pluginManager, assemblyName) {
|
|
438
|
+
const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', () => undefined);
|
|
439
|
+
const adapter = adapterGuesser(file, index, undefined);
|
|
440
|
+
const name = getFileName(file);
|
|
441
|
+
if (!adapter || adapter.type === UNKNOWN) {
|
|
442
|
+
throw new Error(`could not infer a track type from "${name}"; pass a full track config instead`);
|
|
443
|
+
}
|
|
444
|
+
const trackTypeGuesser = pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', () => undefined);
|
|
445
|
+
return {
|
|
446
|
+
trackId: `${name}-${objectHash(adapter).slice(0, 8)}`,
|
|
447
|
+
type: trackTypeGuesser(adapter.type, file) ?? 'FeatureTrack',
|
|
448
|
+
name,
|
|
449
|
+
assemblyNames: assemblyName ? [assemblyName] : [],
|
|
450
|
+
adapter,
|
|
451
|
+
};
|
|
452
|
+
}
|
|
453
|
+
/**
|
|
454
|
+
* Whether a track snapshot is the loose `{ uri, ... }` form — a data file with
|
|
455
|
+
* no `adapter` — that {@link expandLooseTrackConfig} expands.
|
|
456
|
+
*/
|
|
457
|
+
export function isLooseTrackConfig(snap) {
|
|
458
|
+
return (typeof snap === 'object' &&
|
|
459
|
+
snap !== null &&
|
|
460
|
+
!Array.isArray(snap) &&
|
|
461
|
+
typeof snap.uri === 'string' &&
|
|
462
|
+
!('adapter' in snap));
|
|
463
|
+
}
|
|
464
|
+
/**
|
|
465
|
+
* Expand a loose track config into a full one and leave any other snapshot
|
|
466
|
+
* untouched, so it can sit on every path a track snapshot enters the tree by:
|
|
467
|
+
* the track config union, the root config's frozen `tracks`, `addTrackConf`,
|
|
468
|
+
* and `showTrackGeneric`'s inline config.
|
|
469
|
+
*
|
|
470
|
+
* `{ "trackId": "reads", "uri": "reads.bam", "assemblyNames": ["hg38"] }` is a
|
|
471
|
+
* whole track: the adapter and track type come from the file's extension
|
|
472
|
+
* through the format plugins' guessers, the same inference the "Add track"
|
|
473
|
+
* flow runs, and `name` defaults to the file name. Any key written beside
|
|
474
|
+
* `uri` — `trackId`, `name`, `category`, `displayDefaults`, an explicit `type`
|
|
475
|
+
* — overrides what was inferred. `assemblyName` fills `assemblyNames` when the
|
|
476
|
+
* snapshot has none, for a config or embed that has exactly one assembly.
|
|
477
|
+
*/
|
|
478
|
+
export function expandLooseTrackConfig(snap, pluginManager, assemblyName) {
|
|
479
|
+
return isLooseTrackConfig(snap)
|
|
480
|
+
? guessTrackConf(snap, pluginManager, assemblyName)
|
|
481
|
+
: snap;
|
|
482
|
+
}
|
|
483
|
+
function generateProblemTrackConf(trackName, categories, label, description) {
|
|
260
484
|
const conf = {
|
|
261
485
|
type: 'FeatureTrack',
|
|
262
|
-
name: `${trackName} (
|
|
263
|
-
description
|
|
486
|
+
name: `${trackName} (${label})`,
|
|
487
|
+
description,
|
|
264
488
|
category: categories,
|
|
265
489
|
trackId: '',
|
|
266
490
|
};
|
|
267
491
|
conf.trackId = objectHash(conf);
|
|
268
492
|
return conf;
|
|
269
493
|
}
|
|
494
|
+
export function generateUnsupportedTrackConf(trackName, trackUrl, categories) {
|
|
495
|
+
return generateProblemTrackConf(trackName, categories, 'Unsupported', `Support not yet implemented for "${trackUrl}"`);
|
|
496
|
+
}
|
|
497
|
+
export function generateUnknownTrackConf(trackName, trackUrl, categories) {
|
|
498
|
+
return generateProblemTrackConf(trackName, categories, 'Unknown', `Could not determine track type for "${trackUrl}"`);
|
|
499
|
+
}
|
|
270
500
|
export function getTrackName(conf, session) {
|
|
271
|
-
const
|
|
501
|
+
const isMst = isStateTreeNode(conf);
|
|
502
|
+
const trackName = isMst
|
|
272
503
|
? readConfObject(conf, 'name')
|
|
273
504
|
: (conf.name ?? '');
|
|
274
|
-
const trackType =
|
|
275
|
-
? readConfObject(conf, 'type')
|
|
276
|
-
: conf.type;
|
|
505
|
+
const trackType = isMst ? readConfObject(conf, 'type') : conf.type;
|
|
277
506
|
if (!trackName && trackType === 'ReferenceSequenceTrack') {
|
|
278
507
|
const asm = session.assemblies.find(a => a.sequence === conf);
|
|
279
508
|
return asm
|
|
280
509
|
? `Reference sequence (${readConfObject(asm, 'displayName') || readConfObject(asm, 'name')})`
|
|
281
510
|
: 'Reference sequence';
|
|
282
511
|
}
|
|
283
|
-
|
|
512
|
+
const trackId = isMst
|
|
513
|
+
? readConfObject(conf, 'trackId')
|
|
514
|
+
: (conf.trackId ?? '');
|
|
515
|
+
return trackName || trackId;
|
|
516
|
+
}
|
|
517
|
+
// The first-show path spreads the same settings into the display's `create()`
|
|
518
|
+
// snapshot, so a DECLARED PROP (`resolution` on the wiggle displays) has
|
|
519
|
+
// already landed by the time applyDisplaySettings reports it took no slot.
|
|
520
|
+
// Only a declared prop: MST restores nothing else from a snapshot, so a
|
|
521
|
+
// volatile or a getter of the same name (`scrollTop`) did not land and the
|
|
522
|
+
// caller has to hear about it.
|
|
523
|
+
function didNotLand(unapplied, display) {
|
|
524
|
+
const model = display ? asModelType(getType(display)) : undefined;
|
|
525
|
+
const props = model ? Object.keys(model.properties) : [];
|
|
526
|
+
return unapplied.filter(entry => !props.includes(entry.key));
|
|
527
|
+
}
|
|
528
|
+
function notifySettingsReport(session, trackId, displayType, unapplied, failed) {
|
|
529
|
+
const label = `${displayType} for track "${trackId}"`;
|
|
530
|
+
const keys = (of) => of.map(entry => entry.key);
|
|
531
|
+
const setterOnly = unapplied.filter(e => e.reason === 'setter-only');
|
|
532
|
+
const unknown = unapplied.filter(e => e.reason !== 'setter-only');
|
|
533
|
+
if (unknown.length) {
|
|
534
|
+
session.notifyError(unknownKeysMessage(label, keys(unknown)));
|
|
535
|
+
}
|
|
536
|
+
if (setterOnly.length) {
|
|
537
|
+
session.notifyError(setterOnlyMessage(label, keys(setterOnly)));
|
|
538
|
+
}
|
|
539
|
+
if (failed.length) {
|
|
540
|
+
session.notifyError(`Track "${trackId}" rejected ${failed.map(f => `${f.key}: ${f.error}`).join('; ')}`);
|
|
541
|
+
}
|
|
542
|
+
}
|
|
543
|
+
// The display a shown track switches to for a `type` it is not drawn as.
|
|
544
|
+
function displaySwitch(self, trackId, track, requested) {
|
|
545
|
+
if (requested === undefined) {
|
|
546
|
+
return undefined;
|
|
547
|
+
}
|
|
548
|
+
const { pluginManager } = getEnv(self);
|
|
549
|
+
const type = pluginManager.resolveDisplayTypeRecord(requested)?.name;
|
|
550
|
+
if (type === track.activeDisplay.type) {
|
|
551
|
+
return undefined;
|
|
552
|
+
}
|
|
553
|
+
const target = track.compatibleDisplays.find(d => d.type === type);
|
|
554
|
+
if (!target) {
|
|
555
|
+
const view = isViewModel(self) ? self : getContainingView(self);
|
|
556
|
+
throw new Error(`Track "${trackId}" cannot be shown as "${requested}" in a ${view.type}. It takes: ${track.compatibleDisplays.map(d => d.type).join(', ')}`);
|
|
557
|
+
}
|
|
558
|
+
return target;
|
|
284
559
|
}
|
|
285
|
-
|
|
560
|
+
// A switch carries the settings in the new display's snapshot, as a first show
|
|
561
|
+
// does, and hands off to the async launch while that display's state model is
|
|
562
|
+
// still a dynamic import.
|
|
563
|
+
function restyleShown(self, trackId, found, displayInitialSnapshot) {
|
|
286
564
|
const { pluginManager } = getEnv(self);
|
|
287
565
|
const session = getSession(self);
|
|
288
|
-
const
|
|
289
|
-
|
|
566
|
+
const track = found;
|
|
567
|
+
const { type, ...settings } = displayInitialSnapshot;
|
|
568
|
+
try {
|
|
569
|
+
const target = displaySwitch(self, trackId, track, type);
|
|
570
|
+
if (target) {
|
|
571
|
+
const record = pluginManager.resolveDisplayTypeRecord(target.type);
|
|
572
|
+
if (record && !record.isStateModelLoaded) {
|
|
573
|
+
void launchTrackGeneric(self, trackId, {}, displayInitialSnapshot);
|
|
574
|
+
return undefined;
|
|
575
|
+
}
|
|
576
|
+
track.replaceDisplay(track.activeDisplay.configuration.displayId, target.displayId, {
|
|
577
|
+
...track.activeDisplay.getPortableSettings?.(target.displayId),
|
|
578
|
+
...settings,
|
|
579
|
+
});
|
|
580
|
+
}
|
|
581
|
+
if (Object.keys(settings).length && track.applyDisplaySettings) {
|
|
582
|
+
const report = track.applyDisplaySettings(settings);
|
|
583
|
+
notifySettingsReport(session, trackId, track.activeDisplay.type, target
|
|
584
|
+
? didNotLand(report.unapplied, track.displays[0])
|
|
585
|
+
: report.unapplied, report.failed);
|
|
586
|
+
}
|
|
290
587
|
return found;
|
|
291
588
|
}
|
|
292
|
-
|
|
589
|
+
catch (e) {
|
|
590
|
+
session.notifyError(`${e}`, e);
|
|
591
|
+
return undefined;
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
/**
|
|
595
|
+
* The display type names a view can render, as a lookup set. Built once per
|
|
596
|
+
* view and handed to {@link viewCanDisplayTrack} for every track, rather than
|
|
597
|
+
* rebuilt per track.
|
|
598
|
+
*/
|
|
599
|
+
export function viewDisplayNames(pluginManager, viewType) {
|
|
600
|
+
return new Set(pluginManager.getViewType(viewType).displayTypes.map(d => d.name));
|
|
601
|
+
}
|
|
602
|
+
/**
|
|
603
|
+
* Whether a view rendering `viewDisplays` can open a track at all: does the
|
|
604
|
+
* track's adapter feed a display the view draws. The coarse half of the
|
|
605
|
+
* question {@link pickDisplayForView} answers precisely, over the same
|
|
606
|
+
* candidates, so a picker never offers a track `showTrackGeneric` will refuse.
|
|
607
|
+
*
|
|
608
|
+
* Two answers that are easy to get wrong, and both have been:
|
|
609
|
+
*
|
|
610
|
+
* - A type **no plugin registered** answers false rather than throwing.
|
|
611
|
+
* `getTrackType` throws on an unknown name, and a frozen track config never
|
|
612
|
+
* passes the schema that would have rejected it at load — so a config naming
|
|
613
|
+
* a plugin that failed to load put that throw inside whatever loop was
|
|
614
|
+
* filtering tracks, and one unopenable track took out the entire list. The
|
|
615
|
+
* track selector and jb2export's circular-view filter met this separately.
|
|
616
|
+
* - A view type registering **no displays at all** constrains nothing, so
|
|
617
|
+
* every track passes. That is a policy rather than a fact, and it lives here
|
|
618
|
+
* so the pickers agree on it.
|
|
619
|
+
*/
|
|
620
|
+
export function viewCanDisplayTrack(pluginManager, viewDisplays, track) {
|
|
621
|
+
if (!pluginManager.trackTypes.has(track.type)) {
|
|
622
|
+
return false;
|
|
623
|
+
}
|
|
624
|
+
return (viewDisplays.size === 0 ||
|
|
625
|
+
displayTypesFedBy(pluginManager, track.type, track.adapter).some(name => viewDisplays.has(name)));
|
|
626
|
+
}
|
|
627
|
+
/**
|
|
628
|
+
* Whether every name in `subset` appears in `superset`. An absent superset
|
|
629
|
+
* contains nothing; an absent subset is contained by anything.
|
|
630
|
+
*/
|
|
631
|
+
function containsAll(superset = [], subset = []) {
|
|
632
|
+
const s = new Set(superset);
|
|
633
|
+
return subset.every(x => s.has(x));
|
|
634
|
+
}
|
|
635
|
+
/**
|
|
636
|
+
* The tracks a view can be offered: those that support every assembly it
|
|
637
|
+
* displays, and that declare a display it can draw. The track selector's tree
|
|
638
|
+
* and every other picker that opens a track into a view read this one answer,
|
|
639
|
+
* or one of them offers a track the next hides.
|
|
640
|
+
*/
|
|
641
|
+
export function filterTracks(tracks, self) {
|
|
642
|
+
const { view } = self;
|
|
643
|
+
if (!view) {
|
|
644
|
+
return [];
|
|
645
|
+
}
|
|
646
|
+
const { assemblyManager } = getSession(view);
|
|
647
|
+
const { pluginManager } = getEnv(view);
|
|
648
|
+
const canonical = (names) => canonicalAssemblyNames(names, assemblyManager);
|
|
649
|
+
const viewAssemblyNames = canonical(self.assemblyNames);
|
|
650
|
+
const viewDisplays = viewDisplayNames(pluginManager, view.type);
|
|
651
|
+
return tracks.filter(c => {
|
|
652
|
+
const trackAssemblyNames = readConfObject(c, 'assemblyNames');
|
|
653
|
+
return (
|
|
654
|
+
// a view that declares no assemblies (one still initializing) constrains
|
|
655
|
+
// nothing; otherwise the track must cover every one of them
|
|
656
|
+
(viewAssemblyNames.length === 0 ||
|
|
657
|
+
containsAll(trackAssemblyNames && canonical(trackAssemblyNames), viewAssemblyNames)) &&
|
|
658
|
+
viewCanDisplayTrack(pluginManager, viewDisplays, {
|
|
659
|
+
type: c.type,
|
|
660
|
+
adapter: c.adapter,
|
|
661
|
+
}));
|
|
662
|
+
});
|
|
663
|
+
}
|
|
664
|
+
/**
|
|
665
|
+
* The assembly's own sequence track, when the view can draw one. It is in no
|
|
666
|
+
* track list — the config lives on the assembly (see {@link getConfAssemblyNames}
|
|
667
|
+
* on why a sequence track's assembly is positional) — so a picker that walks
|
|
668
|
+
* `session.tracks` alone cannot offer the track most views open first.
|
|
669
|
+
*/
|
|
670
|
+
function refSeqTrackConf(assemblyName, view) {
|
|
671
|
+
const { assemblyManager } = getSession(view);
|
|
672
|
+
const { pluginManager } = getEnv(view);
|
|
673
|
+
const conf = assemblyManager.get(assemblyName)?.configuration.sequence;
|
|
674
|
+
// the same display-compatibility question filterTracks asks of every other
|
|
675
|
+
// track, so a view that cannot draw a sequence is not offered one
|
|
676
|
+
return conf &&
|
|
677
|
+
viewCanDisplayTrack(pluginManager, viewDisplayNames(pluginManager, view.type), { type: conf.type, adapter: conf.adapter })
|
|
678
|
+
? conf
|
|
679
|
+
: undefined;
|
|
680
|
+
}
|
|
681
|
+
/**
|
|
682
|
+
* Every track config a view can be offered, each assembly's sequence track
|
|
683
|
+
* first and then {@link filterTracks} over the list handed in.
|
|
684
|
+
*/
|
|
685
|
+
export function offeredTracks(tracks, self) {
|
|
686
|
+
const { view, assemblyNames } = self;
|
|
687
|
+
if (!view) {
|
|
688
|
+
return [];
|
|
689
|
+
}
|
|
690
|
+
return [
|
|
691
|
+
...assemblyNames.map(name => refSeqTrackConf(name, view)),
|
|
692
|
+
...filterTracks(tracks, self),
|
|
693
|
+
].filter(conf => conf !== undefined);
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Which display a track opens with in a given view, and the declared entry
|
|
697
|
+
* that configures it: `{ type, conf }`, or undefined when the view draws none
|
|
698
|
+
* of the candidates or the requested type is not among them.
|
|
699
|
+
*
|
|
700
|
+
* The **type** is the requested one, checked rather than taken on faith (an
|
|
701
|
+
* unchecked one resolved its dangling `<trackId>-<type>` id back to the
|
|
702
|
+
* track's default display, and the caller was told it got what it asked for),
|
|
703
|
+
* else the first candidate among the view's own display types, else the first
|
|
704
|
+
* it draws at all. The **config** is then the declared entry of that type,
|
|
705
|
+
* never another one the view supports: `display.type ===
|
|
706
|
+
* display.configuration.type` is the invariant `DisplayConfigurationReference`
|
|
707
|
+
* assumes when it falls back to resolving by type.
|
|
708
|
+
*/
|
|
709
|
+
export function pickDisplayForView({ candidates, declaredDisplays, requestedType, viewDisplayTypes, preferredDisplayTypes = new Set(), }) {
|
|
710
|
+
const supported = new Set(viewDisplayTypes);
|
|
711
|
+
const drawable = candidates.filter(name => supported.has(name));
|
|
712
|
+
const type = requestedType === undefined
|
|
713
|
+
? (drawable.find(name => preferredDisplayTypes.has(name)) ?? drawable[0])
|
|
714
|
+
: drawable.find(name => name === requestedType);
|
|
715
|
+
return type === undefined
|
|
716
|
+
? undefined
|
|
717
|
+
: { type, conf: declaredDisplays.find(d => d.type === type) };
|
|
718
|
+
}
|
|
719
|
+
// #endregion
|
|
720
|
+
// Resolve a session-spec `TrackInit` into the (trackId, trackSnapshot,
|
|
721
|
+
// displaySnapshot) triple that `showTrackGeneric` expects. Display props written
|
|
722
|
+
// inline on the track object (everything except trackId/trackSnapshot/
|
|
723
|
+
// displaySnapshot) fold into the display snapshot, so a spec can write
|
|
724
|
+
// `{ trackId, showDescriptions: false }` instead of nesting under
|
|
725
|
+
// `displaySnapshot`. An explicit `displaySnapshot` still wins over an inline
|
|
726
|
+
// key of the same name, and the older nested form keeps working unchanged.
|
|
727
|
+
// `showTrackGeneric` then routes any inline key that is a real config slot (e.g.
|
|
728
|
+
// `forceLoad`) onto the display config, so a session spec can declaratively
|
|
729
|
+
// force-load a track with `{ trackId, forceLoad: true }`.
|
|
730
|
+
export function normalizeTrackInit(t) {
|
|
731
|
+
if (typeof t === 'string') {
|
|
732
|
+
return { trackId: t, trackSnapshot: {}, displaySnapshot: {} };
|
|
733
|
+
}
|
|
734
|
+
else {
|
|
735
|
+
const { trackId, trackSnapshot, displaySnapshot, ...rest } = t;
|
|
736
|
+
return {
|
|
737
|
+
trackId,
|
|
738
|
+
trackSnapshot: trackSnapshot ?? {},
|
|
739
|
+
displaySnapshot: { ...rest, ...displaySnapshot },
|
|
740
|
+
};
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
function resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf) {
|
|
744
|
+
const { pluginManager } = getEnv(self);
|
|
745
|
+
const session = getSession(self);
|
|
746
|
+
// `trackId` seeds the expansion because `guessTrackConf` otherwise
|
|
747
|
+
// synthesizes one from the filename, and the dedupe in the callers and
|
|
748
|
+
// `hideTrackGeneric` both look the track up by the id the caller passed.
|
|
749
|
+
// Only for the loose form: spreading a live MST node (SvInspector's
|
|
750
|
+
// circular track) would flatten it out of the `isStateTreeNode` branch.
|
|
751
|
+
const inlineRawConf = isLooseTrackConfig(inlineConf)
|
|
752
|
+
? expandLooseTrackConfig({ trackId, ...inlineConf }, pluginManager)
|
|
753
|
+
: inlineConf;
|
|
754
|
+
const rawConf = inlineRawConf ?? session.getTrackById(trackId);
|
|
293
755
|
if (!rawConf) {
|
|
294
756
|
throw new Error(`Could not resolve identifier "${trackId}"`);
|
|
295
757
|
}
|
|
296
|
-
const confSnapshot = isStateTreeNode(rawConf)
|
|
297
|
-
|
|
298
|
-
|
|
758
|
+
const confSnapshot = structuredClone(isStateTreeNode(rawConf) ? getSnapshot(rawConf) : rawConf);
|
|
759
|
+
// `& { type: string }` because `rawConf` unions a live node with a loose
|
|
760
|
+
// `Record<string, unknown>`, and the node's `type: string` widens back to
|
|
761
|
+
// `unknown` across that union
|
|
299
762
|
const conf = pluginManager.evaluateExtensionPoint('Core-preProcessTrackConfig', confSnapshot);
|
|
300
763
|
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
|
-
|
|
764
|
+
// Validate only a conf that is not already in the tree. `configSchema.create`
|
|
765
|
+
// here builds an entire config node and throws it away purely to surface a
|
|
766
|
+
// nice error; its preProcessSnapshot also re-runs Core-preProcessTrackConfig
|
|
767
|
+
// on a snapshot this function just preprocessed. A conf that is a state tree
|
|
768
|
+
// node was validated when MST created it, so all of that is pure waste on
|
|
769
|
+
// the common showTrack path.
|
|
770
|
+
if (!isStateTreeNode(rawConf)) {
|
|
771
|
+
try {
|
|
772
|
+
trackType.configSchema.create(conf, getEnv(self));
|
|
773
|
+
}
|
|
774
|
+
catch (e) {
|
|
775
|
+
throw new Error(`Track "${trackId}" has an invalid configuration: ${e}`, {
|
|
776
|
+
cause: e,
|
|
777
|
+
});
|
|
778
|
+
}
|
|
779
|
+
}
|
|
780
|
+
// A track container that isn't itself a view — a synteny level, which owns
|
|
781
|
+
// a track list but has no width and no registered view type — takes the
|
|
782
|
+
// display choice from the view it sits in, which is the same node
|
|
783
|
+
// getContainingView already resolves to for everything else beneath it.
|
|
784
|
+
const view = isViewModel(self) ? self : getContainingView(self);
|
|
785
|
+
const viewType = pluginManager.getViewType(view.type);
|
|
786
|
+
const candidates = displayCandidates(pluginManager, conf);
|
|
787
|
+
const viewDisplayTypes = viewType.displayTypes.map(d => d.name);
|
|
788
|
+
// Aliases resolve first, so a caller or a config naming a pre-consolidation
|
|
789
|
+
// display type (`LinearPileupDisplay`) reaches the type that replaced it; a
|
|
790
|
+
// name no display answers to stays as written, for the refusal to quote.
|
|
791
|
+
const canonical = (name) => pluginManager.resolveDisplayTypeRecord(name)?.name ?? name;
|
|
792
|
+
const requested = displayInitialSnapshot.type;
|
|
793
|
+
const declaredDisplays = conf.displays ?? [];
|
|
794
|
+
const picked = pickDisplayForView({
|
|
795
|
+
candidates,
|
|
796
|
+
declaredDisplays: declaredDisplays.map(d => ({
|
|
797
|
+
...d,
|
|
798
|
+
type: canonical(d.type),
|
|
799
|
+
})),
|
|
800
|
+
requestedType: requested === undefined ? undefined : canonical(requested),
|
|
801
|
+
viewDisplayTypes,
|
|
802
|
+
preferredDisplayTypes: new Set(viewType.displayTypes
|
|
803
|
+
.filter(d => d.viewType === view.type)
|
|
804
|
+
.map(d => d.name)),
|
|
329
805
|
});
|
|
330
|
-
|
|
331
|
-
|
|
806
|
+
if (!picked) {
|
|
807
|
+
const drawable = candidates.filter(name => viewDisplayTypes.includes(name));
|
|
808
|
+
throw new Error(requested === undefined
|
|
809
|
+
? `Could not find a compatible display for view type ${view.type}`
|
|
810
|
+
: `Track "${trackId}" cannot be shown as "${requested}" in a ${view.type}. ${drawable.length > 0
|
|
811
|
+
? `It takes: ${drawable.join(', ')}`
|
|
812
|
+
: 'This view draws none of its display types'}`);
|
|
813
|
+
}
|
|
814
|
+
return { rawConf, conf, trackType, picked };
|
|
815
|
+
}
|
|
816
|
+
export function showTrackGeneric(self, trackId,
|
|
817
|
+
// `object`, annotated, rather than inferred from the default. A bare `{}`
|
|
818
|
+
// accepts every non-nullish value, numbers included, which is how a synteny
|
|
819
|
+
// level index typechecked its way into a track snapshot — see the dotplot and
|
|
820
|
+
// comparative views' own `showTrack`, whose second parameter is this one.
|
|
821
|
+
//
|
|
822
|
+
// `object` and not `Record<string, unknown>`: the hazard is a primitive, and
|
|
823
|
+
// an index signature additionally rejects the precise snapshot interfaces
|
|
824
|
+
// callers legitimately pass (jbrowse-img's `DisplaySnapshot` is one).
|
|
825
|
+
initialSnapshot = {}, displayInitialSnapshot = {},
|
|
826
|
+
// The config itself, for a track no session list holds: a view that
|
|
827
|
+
// synthesizes a track only it can draw passes the config here and it lives on
|
|
828
|
+
// the track node, so closing the track takes the config with it. Without it
|
|
829
|
+
// such a config has to be parked in a session list that outlives the view.
|
|
830
|
+
inlineConf) {
|
|
831
|
+
const { pluginManager } = getEnv(self);
|
|
832
|
+
const session = getSession(self);
|
|
833
|
+
const found = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
834
|
+
if (found) {
|
|
835
|
+
return restyleShown(self, trackId, found, displayInitialSnapshot);
|
|
836
|
+
}
|
|
837
|
+
// Single choke point for all "open a track" paths — errors surface as
|
|
838
|
+
// snackbars. Config is validated before the push so the open set never holds
|
|
839
|
+
// a broken track.
|
|
840
|
+
try {
|
|
841
|
+
const { rawConf, conf, trackType, picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
|
|
842
|
+
const { type: displayType, conf: displayConf } = picked;
|
|
843
|
+
const displayId = displayConf?.displayId ?? `${trackId}-${displayType}`;
|
|
844
|
+
// a registered display whose model is not loaded yet: the load re-enters
|
|
845
|
+
// through the view's own showTrack action, so a synchronous caller gets the
|
|
846
|
+
// track a tick late; a caller that needs it back awaits launchTrack
|
|
847
|
+
const displayRecord = pluginManager.resolveDisplayTypeRecord(displayType);
|
|
848
|
+
if (displayRecord && !displayRecord.isStateModelLoaded) {
|
|
849
|
+
void launchTrackGeneric(self, trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
|
|
850
|
+
return undefined;
|
|
851
|
+
}
|
|
852
|
+
const track = trackType.stateModel.create({
|
|
853
|
+
...initialSnapshot,
|
|
854
|
+
type: conf.type,
|
|
855
|
+
// `rawConf`, not the caller's `inlineConf`: the loose `{ trackId, uri }`
|
|
856
|
+
// form has no `type` for the config schema to dispatch on, and the
|
|
857
|
+
// concrete schema this lands on carries no loose preprocessor — that one
|
|
858
|
+
// is on `pluggableConfigSchemaType('track')`, which a track model's
|
|
859
|
+
// `ConfigurationReference` is not. Not `conf` either: that has already
|
|
860
|
+
// run Core-preProcessTrackConfig, which the schema's own
|
|
861
|
+
// preProcessSnapshot runs again.
|
|
862
|
+
configuration: inlineConf ? rawConf : trackId,
|
|
863
|
+
displays: [
|
|
864
|
+
{
|
|
865
|
+
...displayConf,
|
|
866
|
+
configuration: displayId,
|
|
867
|
+
...displayInitialSnapshot,
|
|
868
|
+
type: displayType,
|
|
869
|
+
},
|
|
870
|
+
],
|
|
871
|
+
});
|
|
872
|
+
self.tracks.push(track);
|
|
873
|
+
// Display settings (height, color, …) are config slots now, not display
|
|
874
|
+
// instance props — passed in the display snapshot they'd be dropped as
|
|
875
|
+
// unknown MST keys. applyDisplaySettings routes the ones that are real
|
|
876
|
+
// slots onto the persistent display config so they take effect and
|
|
877
|
+
// survive hide/retick (#5591), running the schema's preProcessSnapshot
|
|
878
|
+
// first so shorthand expansions and legacy-key migrations reach this path
|
|
879
|
+
// too — a session spec, share link, or embed writes slots here rather
|
|
880
|
+
// than creating a config from a snapshot, and those surfaces are meant to
|
|
881
|
+
// speak the same vocabulary. Runs after the push so the display's config
|
|
882
|
+
// reference can resolve. Slots only, deliberately: this is the
|
|
883
|
+
// declarative surface, and `allowSetters` stays off so a spec key cannot
|
|
884
|
+
// reach internal display actions.
|
|
885
|
+
const displaySettings = Object.fromEntries(Object.entries(displayInitialSnapshot).filter(([key]) => key !== 'type'));
|
|
886
|
+
const report = track.applyDisplaySettings(displaySettings);
|
|
887
|
+
const drawn = track.displays[0];
|
|
888
|
+
notifySettingsReport(session, trackId, displayType, didNotLand(report.unapplied, drawn), report.failed);
|
|
889
|
+
// if this track came from a connection, persist its config so it survives
|
|
890
|
+
// reload without re-establishing the connection (no-op otherwise)
|
|
891
|
+
session.captureConnectionTrack?.(trackId);
|
|
892
|
+
return track;
|
|
893
|
+
}
|
|
894
|
+
catch (e) {
|
|
895
|
+
session.notifyError(`${e}`, e);
|
|
896
|
+
return undefined;
|
|
897
|
+
}
|
|
898
|
+
}
|
|
899
|
+
// Strip a track's identifier and its nested display identifiers (both are
|
|
900
|
+
// types.identifier) so a duplicated/copied snapshot doesn't collide with the
|
|
901
|
+
// source's ids when added back into the same session tree.
|
|
902
|
+
export function stripTrackIds(tracks) {
|
|
903
|
+
return tracks.map(({ id, displays, ...rest }) => ({
|
|
904
|
+
...rest,
|
|
905
|
+
displays: displays.map(({ id, ...d }) => d),
|
|
906
|
+
}));
|
|
332
907
|
}
|
|
333
908
|
export function hideTrackGeneric(self, trackId) {
|
|
334
909
|
const t = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
335
910
|
if (t) {
|
|
336
911
|
self.tracks.remove(t);
|
|
337
|
-
|
|
912
|
+
// drop the persisted connection-track config if no other view holds it
|
|
913
|
+
// (persisted → guards saved-session size; the volatile working-copy cache
|
|
914
|
+
// in SessionTracks is deliberately not pruned, see editableTrackConfigs)
|
|
915
|
+
getSession(self).pruneConnectionTrackConfig?.(trackId);
|
|
916
|
+
return true;
|
|
338
917
|
}
|
|
339
|
-
return
|
|
918
|
+
return false;
|
|
340
919
|
}
|
|
920
|
+
// Returns true if the track is now shown, false if it was hidden or failed to
|
|
921
|
+
// open (callers use this to e.g. record only newly-opened tracks as recent).
|
|
341
922
|
export function toggleTrackGeneric(self, trackId) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
showTrackGeneric(self, trackId);
|
|
923
|
+
return hideTrackGeneric(self, trackId)
|
|
924
|
+
? false
|
|
925
|
+
: !!showTrackGeneric(self, trackId);
|
|
926
|
+
}
|
|
927
|
+
/**
|
|
928
|
+
* Start loading the state model and component of the display a track would
|
|
929
|
+
* open with, without opening it, for a caller that knows the track is coming.
|
|
930
|
+
* Anything that fails here is the launch's to report.
|
|
931
|
+
*/
|
|
932
|
+
export function warmTrackDisplayGeneric(self, trackId, displayInitialSnapshot = {}, assemblyName) {
|
|
933
|
+
const { pluginManager } = getEnv(self);
|
|
934
|
+
try {
|
|
935
|
+
const { picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot);
|
|
936
|
+
pluginManager
|
|
937
|
+
.resolveDisplayTypeRecord(picked.type)
|
|
938
|
+
?.loadStateModel()
|
|
939
|
+
.catch(() => { });
|
|
940
|
+
warmTrackAdapter(self, trackId, assemblyName);
|
|
941
|
+
}
|
|
942
|
+
catch {
|
|
943
|
+
// the launch reports an unresolvable track
|
|
944
|
+
}
|
|
945
|
+
}
|
|
946
|
+
function adapterTypesIn(value, pluginManager, found = new Set()) {
|
|
947
|
+
if (typeof value === 'object' && value !== null) {
|
|
948
|
+
const { type } = value;
|
|
949
|
+
if (typeof type === 'string' && pluginManager.hasAdapterType(type)) {
|
|
950
|
+
found.add(type);
|
|
951
|
+
}
|
|
952
|
+
for (const child of Object.values(value)) {
|
|
953
|
+
adapterTypesIn(child, pluginManager, found);
|
|
954
|
+
}
|
|
955
|
+
}
|
|
956
|
+
return found;
|
|
957
|
+
}
|
|
958
|
+
/**
|
|
959
|
+
* Load the track's adapter code and read its index in the worker, beside the
|
|
960
|
+
* assembly load the track's first request waits for.
|
|
961
|
+
*
|
|
962
|
+
* Sent under the id the track's own requests will use, so it reaches, and
|
|
963
|
+
* boots, the worker that serves them. That id hashes the adapter config as the
|
|
964
|
+
* track's config node reads it, so a frozen config.json entry is read through a
|
|
965
|
+
* node of its type: its raw adapter snapshot hashes to another worker.
|
|
966
|
+
*
|
|
967
|
+
* `assemblyName` is the one the view is launching on. The track's own
|
|
968
|
+
* `assemblyNames[0]` is not that: a reference-reading adapter is built for the
|
|
969
|
+
* genome its request names, and warming it for the config's first assembly
|
|
970
|
+
* would build an instance the view never reads.
|
|
971
|
+
*/
|
|
972
|
+
function declaresLanes(adapterConfig, pluginManager) {
|
|
973
|
+
const { type } = adapterConfig;
|
|
974
|
+
return (typeof type === 'string' &&
|
|
975
|
+
pluginManager.hasAdapterType(type) &&
|
|
976
|
+
pluginManager
|
|
977
|
+
.getAdapterType(type)
|
|
978
|
+
.adapterCapabilities.includes('headerLanes'));
|
|
979
|
+
}
|
|
980
|
+
function warmTrackAdapter(self, trackId, assemblyName) {
|
|
981
|
+
const { pluginManager } = getEnv(self);
|
|
982
|
+
const session = getSession(self);
|
|
983
|
+
const raw = session.getTrackById(trackId);
|
|
984
|
+
const conf = isStateTreeNode(raw)
|
|
985
|
+
? raw
|
|
986
|
+
: typeof raw?.type === 'string'
|
|
987
|
+
? pluginManager
|
|
988
|
+
.getTrackType(raw.type)
|
|
989
|
+
.configSchema.create(raw, { pluginManager })
|
|
990
|
+
: undefined;
|
|
991
|
+
if (conf) {
|
|
992
|
+
const adapterConfig = readConfObject(conf, 'adapter');
|
|
993
|
+
const sessionId = getConfRpcSessionId(conf);
|
|
994
|
+
session.rpcManager
|
|
995
|
+
// eslint-disable-next-line no-restricted-syntax -- a code download the track's first request would make anyway: nothing to show, and nothing a user can move on from
|
|
996
|
+
.call(sessionId, 'CoreLoadAdapterCode', {
|
|
997
|
+
adapterTypes: [...adapterTypesIn(adapterConfig, pluginManager)],
|
|
998
|
+
})
|
|
999
|
+
.catch(() => { });
|
|
1000
|
+
// a source that declares its lanes reads an index per lane asked about,
|
|
1001
|
+
// and only its display knows which; asked about none it would read all
|
|
1002
|
+
if (assemblyName && !declaresLanes(adapterConfig, pluginManager)) {
|
|
1003
|
+
session.rpcManager
|
|
1004
|
+
// eslint-disable-next-line no-restricted-syntax -- an index read the track's first request would make anyway: nothing to show, and nothing a user can move on from
|
|
1005
|
+
.call(sessionId, 'CoreGetRefNames', {
|
|
1006
|
+
adapterConfig,
|
|
1007
|
+
assemblyName,
|
|
1008
|
+
signal: undefined,
|
|
1009
|
+
})
|
|
1010
|
+
.catch(() => { });
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
}
|
|
1014
|
+
export async function launchTrackGeneric(self, trackId, initialSnapshot = {}, displayInitialSnapshot = {}, inlineConf) {
|
|
1015
|
+
const { pluginManager } = getEnv(self);
|
|
1016
|
+
const session = getSession(self);
|
|
1017
|
+
const found = self.tracks.find(t => t.configuration.trackId === trackId);
|
|
1018
|
+
if (found) {
|
|
1019
|
+
let target;
|
|
1020
|
+
try {
|
|
1021
|
+
target = displaySwitch(self, trackId, found, displayInitialSnapshot.type);
|
|
1022
|
+
if (target) {
|
|
1023
|
+
await pluginManager
|
|
1024
|
+
.resolveDisplayTypeRecord(target.type)
|
|
1025
|
+
?.loadStateModel();
|
|
1026
|
+
}
|
|
1027
|
+
}
|
|
1028
|
+
catch (e) {
|
|
1029
|
+
session.notifyError(`${e}`, e);
|
|
1030
|
+
return undefined;
|
|
1031
|
+
}
|
|
1032
|
+
if (!target) {
|
|
1033
|
+
return restyleShown(self, trackId, found, displayInitialSnapshot);
|
|
1034
|
+
}
|
|
1035
|
+
return isAlive(self) && isAlive(found)
|
|
1036
|
+
? self.showTrack?.(trackId, initialSnapshot, displayInitialSnapshot, inlineConf)
|
|
1037
|
+
: undefined;
|
|
1038
|
+
}
|
|
1039
|
+
try {
|
|
1040
|
+
const { picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
|
|
1041
|
+
await pluginManager.resolveDisplayTypeRecord(picked.type)?.loadStateModel();
|
|
1042
|
+
}
|
|
1043
|
+
catch (e) {
|
|
1044
|
+
session.notifyError(`${e}`, e);
|
|
1045
|
+
return undefined;
|
|
1046
|
+
}
|
|
1047
|
+
if (!isAlive(self)) {
|
|
1048
|
+
return undefined;
|
|
345
1049
|
}
|
|
1050
|
+
return self.showTrack?.(trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
|
|
1051
|
+
}
|
|
1052
|
+
// the hide runs in the synchronous prologue, so it keeps action context
|
|
1053
|
+
export async function launchToggleTrackGeneric(self, trackId) {
|
|
1054
|
+
return hideTrackGeneric(self, trackId)
|
|
1055
|
+
? false
|
|
1056
|
+
: !!(await launchTrackGeneric(self, trackId));
|
|
1057
|
+
}
|
|
1058
|
+
/**
|
|
1059
|
+
* Every track config the session can show, connection-supplied ones included.
|
|
1060
|
+
*
|
|
1061
|
+
* `session.tracks` is only sessionTracks plus the admin config (see
|
|
1062
|
+
* product-core's SessionTracks), so a track that arrived from a hub or registry
|
|
1063
|
+
* connection is absent from it while still being toggleable from the track
|
|
1064
|
+
* selector, which unions the same two sources. Anything answering "what tracks
|
|
1065
|
+
* exist for X" wants this, or a feature silently can't see connection tracks.
|
|
1066
|
+
*
|
|
1067
|
+
* Note `session.tracks` already contains `sessionTracks` — unioning those two
|
|
1068
|
+
* yields every session track twice.
|
|
1069
|
+
*/
|
|
1070
|
+
export function allSessionTracks(session) {
|
|
1071
|
+
const connectionTracks = (session.connectionInstances ?? []).flatMap(conn => conn.tracks);
|
|
1072
|
+
return connectionTracks.length
|
|
1073
|
+
? [...session.tracks, ...connectionTracks]
|
|
1074
|
+
: session.tracks;
|
|
1075
|
+
}
|
|
1076
|
+
/**
|
|
1077
|
+
* The session's annotation for `assemblyName`, as trackIds: what a view opened
|
|
1078
|
+
* on another genome starts with. Only FeatureTracks, not everything configured
|
|
1079
|
+
* for the assembly — an alignments track turned on behind the user's back
|
|
1080
|
+
* fetches data nobody asked for, and a FeatureTrack over a few kb is one tabix
|
|
1081
|
+
* range query.
|
|
1082
|
+
*/
|
|
1083
|
+
export function annotationTrackIds(session, assemblyName) {
|
|
1084
|
+
return allSessionTracks(session).flatMap(track => readConfObject(track, 'type') === 'FeatureTrack' &&
|
|
1085
|
+
readConfObject(track, 'assemblyNames').some(name => isSameAssemblyName(name, assemblyName, session.assemblyManager))
|
|
1086
|
+
? [readConfObject(track, 'trackId')]
|
|
1087
|
+
: []);
|
|
1088
|
+
}
|
|
1089
|
+
function isNavigableView(view) {
|
|
1090
|
+
return 'navToLocString' in view;
|
|
1091
|
+
}
|
|
1092
|
+
/**
|
|
1093
|
+
* One assembly on its own in a linear genome view, at `loc`. Keyed on `id`:
|
|
1094
|
+
* following several alignments to one genome re-navigates the view rather than
|
|
1095
|
+
* stacking a new one each time.
|
|
1096
|
+
*/
|
|
1097
|
+
export async function openAssemblyInLinearView({ session, id, assemblyName, loc, tracks, }) {
|
|
1098
|
+
const view = session.views.find(v => v.id === id);
|
|
1099
|
+
if (view && isNavigableView(view)) {
|
|
1100
|
+
await view.navToLocString(loc, assemblyName);
|
|
1101
|
+
}
|
|
1102
|
+
else {
|
|
1103
|
+
session.addView('LinearGenomeView', {
|
|
1104
|
+
id,
|
|
1105
|
+
assembly: assemblyName,
|
|
1106
|
+
loc,
|
|
1107
|
+
tracks,
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
export function openMateLabel(assemblyName) {
|
|
1112
|
+
return `Open ${assemblyName} at the matching region`;
|
|
346
1113
|
}
|