@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
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 +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -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/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- 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/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- 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 +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- 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.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- 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/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -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/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- 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/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- 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 +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- 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/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- 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 +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- 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 +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- 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 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { getSnapshot, isAlive, isStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
|
-
import { getSequenceAdapterConfig } from '../assemblyManager/getSequenceAdapterConfig.js';
|
|
3
2
|
// Maps a region's refName to the track adapter's name (via refNameMap), and
|
|
4
3
|
// sets originalRefName to the seq adapter (FASTA) name so that CRAM/BAM
|
|
5
4
|
// adapters can fetch reference sequence correctly.
|
|
@@ -27,9 +26,10 @@ import { getSequenceAdapterConfig } from '../assemblyManager/getSequenceAdapterC
|
|
|
27
26
|
// file being read and the ordinary pass is simply right — MAF's annotation
|
|
28
27
|
// overlay is called that way. Thread a second name only when the two results
|
|
29
28
|
// cannot be joined by the caller: GWAS LD coloring can't, because the r²-to-
|
|
30
|
-
// feature join is per feature and features never cross the boundary, so
|
|
31
|
-
// resolves
|
|
32
|
-
//
|
|
29
|
+
// feature join is per feature and features never cross the boundary, so the
|
|
30
|
+
// display resolves the LD file's name before the RPC and hands it to the
|
|
31
|
+
// adapter in `opts.ld.refName`
|
|
32
|
+
// (`plugins/gwas/src/LinearManhattanDisplay/ldJoinResolver.ts`). That and
|
|
33
33
|
// `originalRefName` are the only two, and there is no reason to expect a third:
|
|
34
34
|
// a sub-adapter is normally the same data in another form, named the same way.
|
|
35
35
|
export function renameRegionIfNeeded(refNameMap, region, getSeqAdapterRefName) {
|
|
@@ -57,8 +57,7 @@ function isRegionShaped(r) {
|
|
|
57
57
|
'start' in r &&
|
|
58
58
|
'end' in r);
|
|
59
59
|
}
|
|
60
|
-
|
|
61
|
-
const { regions = [], adapterConfig } = args;
|
|
60
|
+
function checkRenameArgs(args) {
|
|
62
61
|
if (!args.sessionId) {
|
|
63
62
|
throw new Error('sessionId is required');
|
|
64
63
|
}
|
|
@@ -69,61 +68,76 @@ export async function renameRegionsIfNeeded(assemblyManager, args) {
|
|
|
69
68
|
// `chr5`. The legitimate singular base class (RpcMethodTypeWithRenameRegion)
|
|
70
69
|
// always mirrors `region` into a populated `regions`, so flag only the
|
|
71
70
|
// un-mirrored case and fail loudly instead of returning wrong data.
|
|
72
|
-
if (regions
|
|
71
|
+
if (!args.regions?.length &&
|
|
73
72
|
isRegionShaped(args.region)) {
|
|
74
73
|
throw new Error('renameRegionsIfNeeded got a singular `region` but no `regions` array; ' +
|
|
75
74
|
'refName renaming applies only to `regions`. Pass `regions: [region]` ' +
|
|
76
75
|
'(or extend RpcMethodTypeWithRenameRegion) so the region is renamed.');
|
|
77
76
|
}
|
|
78
|
-
|
|
77
|
+
}
|
|
78
|
+
// What one assembly contributes to a rename, off the loaded assembly: resolved
|
|
79
|
+
// via requireAssembly (which awaits registration and load) so the refName map
|
|
80
|
+
// and getSeqAdapterRefName come from one handle. A synchronous
|
|
81
|
+
// assemblyManager.get() could miss an assembly still registering, leaving
|
|
82
|
+
// originalRefName (CRAM/BAM's reference fetch name) on the canonical name
|
|
83
|
+
// instead of the FASTA's. Require, not wait: a region names an assembly, so
|
|
84
|
+
// failing to resolve it is renaming that cannot be done, not nothing to rename,
|
|
85
|
+
// and an empty map would query un-renamed refNames and draw an empty track
|
|
86
|
+
// with no word about why. Only an unnamed assembly is a legitimate no-op.
|
|
87
|
+
async function assemblyRenameData(assemblyManager, assemblyName, args) {
|
|
88
|
+
if (!assemblyName) {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
const assembly = await assemblyManager.requireAssembly(assemblyName);
|
|
92
|
+
return {
|
|
93
|
+
refNameMap: await assembly.getRefNameMapForAdapter(args.adapterConfig, args),
|
|
94
|
+
getSeqAdapterRefName: (r) => assembly.getSeqAdapterRefName(r),
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
function renamed(region, data) {
|
|
98
|
+
return renameRegionIfNeeded(data?.refNameMap, region, data?.getSeqAdapterRefName);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Rename for a request about one genome, which is every request but a
|
|
102
|
+
* comparative one. The call's genome is its regions' genome, and renaming
|
|
103
|
+
* writes it as the call's `assemblyName`, the one field a call names its
|
|
104
|
+
* genome in: `RpcMethodType.serializeArguments` turns it into the reference a
|
|
105
|
+
* BAM/CRAM or scan adapter is built with. A region on another assembly is
|
|
106
|
+
* refused: a request over a synteny adapter renames with
|
|
107
|
+
* {@link renameComparativeRegions}.
|
|
108
|
+
*/
|
|
109
|
+
export async function renameRegionsIfNeeded(assemblyManager, args) {
|
|
110
|
+
checkRenameArgs(args);
|
|
111
|
+
const { regions = [] } = args;
|
|
112
|
+
// read before the await, since MST regions may be dead after
|
|
113
|
+
const assemblyName = regions[0]?.assemblyName;
|
|
114
|
+
const stray = regions.find(r => r.assemblyName !== assemblyName);
|
|
115
|
+
if (stray) {
|
|
116
|
+
throw new Error(`regions on ${assemblyName} and ${stray.assemblyName} in one request: a request is about one genome, and a comparative request (synteny, dotplot) renames with renameComparativeRegions`);
|
|
117
|
+
}
|
|
118
|
+
const data = await assemblyRenameData(assemblyManager, assemblyName, args);
|
|
119
|
+
return {
|
|
120
|
+
...args,
|
|
121
|
+
assemblyName,
|
|
122
|
+
regions: regions.map(region => renamed(region, data)),
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Rename for a comparative request (synteny, dotplot, chords), whose regions
|
|
127
|
+
* sit on two or more assemblies and are each renamed against their own. Such a
|
|
128
|
+
* request has no genome of its own, so it names none and no reference rides
|
|
129
|
+
* on it; a synteny adapter reads no reference.
|
|
130
|
+
*/
|
|
131
|
+
export async function renameComparativeRegions(assemblyManager, args) {
|
|
132
|
+
checkRenameArgs(args);
|
|
133
|
+
const { regions = [] } = args;
|
|
79
134
|
const assemblyNames = regions.map(r => r.assemblyName);
|
|
80
|
-
const
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
const assemblyData = Object.fromEntries(await Promise.all(uniqueAssemblyNames.map(async (name) => {
|
|
85
|
-
// resolve the assembly once via requireAssembly (which awaits both
|
|
86
|
-
// registration and load) and derive the refName map AND
|
|
87
|
-
// getSeqAdapterRefName from this single loaded handle. A synchronous
|
|
88
|
-
// assemblyManager.get() here could miss an assembly still being
|
|
89
|
-
// registered, leaving getSeqAdapterRefName undefined so
|
|
90
|
-
// originalRefName (used by CRAM/BAM to fetch reference bases) falls
|
|
91
|
-
// back to the canonical name instead of the FASTA name.
|
|
92
|
-
//
|
|
93
|
-
// require, not wait: a region names an assembly, so failing to
|
|
94
|
-
// resolve it is not "nothing to rename", it is renaming that cannot
|
|
95
|
-
// be done. Substituting an empty map leaves the adapter querying
|
|
96
|
-
// un-renamed refNames, which finds nothing and draws an empty track
|
|
97
|
-
// with no indication that the assembly is what is missing. Only an
|
|
98
|
-
// unnamed assembly is a legitimate no-op.
|
|
99
|
-
const assembly = name
|
|
100
|
-
? await assemblyManager.requireAssembly(name)
|
|
101
|
-
: undefined;
|
|
102
|
-
return [
|
|
103
|
-
name,
|
|
104
|
-
{
|
|
105
|
-
refNameMap: assembly
|
|
106
|
-
? await assembly.getRefNameMapForAdapter(adapterConfig, args)
|
|
107
|
-
: {},
|
|
108
|
-
getSeqAdapterRefName: assembly
|
|
109
|
-
? (r) => assembly.getSeqAdapterRefName(r)
|
|
110
|
-
: undefined,
|
|
111
|
-
sequenceAdapter: getSequenceAdapterConfig(assembly),
|
|
112
|
-
},
|
|
113
|
-
];
|
|
114
|
-
})));
|
|
135
|
+
const data = new Map(await Promise.all([...new Set(assemblyNames)].map(async (name) => [
|
|
136
|
+
name,
|
|
137
|
+
await assemblyRenameData(assemblyManager, name, args),
|
|
138
|
+
])));
|
|
115
139
|
return {
|
|
116
140
|
...args,
|
|
117
|
-
|
|
118
|
-
// resolved the assembly a fetch is against, and it is the same handle
|
|
119
|
-
// `originalRefName` is a name into. Every caller that passed its own wrote
|
|
120
|
-
// these same two lines, and the three that forgot — `CoreGetExportData`,
|
|
121
|
-
// `BreakpointGetFeatures`, `fetchTrackData` — failed silently, saved only by
|
|
122
|
-
// whichever call happened to prime the adapter instance first.
|
|
123
|
-
sequenceAdapter: assemblyData[assemblyNames[0]]?.sequenceAdapter,
|
|
124
|
-
regions: regions.map((region, i) => {
|
|
125
|
-
const data = assemblyData[assemblyNames[i]];
|
|
126
|
-
return renameRegionIfNeeded(data?.refNameMap, region, data?.getSeqAdapterRefName);
|
|
127
|
-
}),
|
|
141
|
+
regions: regions.map((region, i) => renamed(region, data.get(assemblyNames[i]))),
|
|
128
142
|
};
|
|
129
143
|
}
|
|
@@ -7,6 +7,18 @@ import { createRoot } from 'react-dom/client';
|
|
|
7
7
|
// reason to pull react/react-dom/@emotion, and the barrel is imported by
|
|
8
8
|
// worker-side adapter code that never renders.
|
|
9
9
|
//
|
|
10
|
+
// It is not part of the plugin ABI either, and that removal did break two
|
|
11
|
+
// published bundles before anyone noticed: react-msaview's SVG export read it
|
|
12
|
+
// off `@jbrowse/core/util`, and jbrowse-plugin-msaview and -tview bundle
|
|
13
|
+
// react-msaview. Resolved on their side -- react-msaview owns its own copy now
|
|
14
|
+
// (packages/lib/src/renderToStaticMarkup.ts there) -- because a rendering
|
|
15
|
+
// library asking its host for a renderer was the coupling worth removing, and
|
|
16
|
+
// because react-dom is a host external for a plugin anyway, so it costs them a
|
|
17
|
+
// few hundred bytes rather than a duplicate react. Re-exporting it from the
|
|
18
|
+
// barrel would also stub `@jbrowse/core/util` in the worker, since the
|
|
19
|
+
// generator stubs a module whose graph reaches react-dom; workerModules.test.ts
|
|
20
|
+
// fails on that.
|
|
21
|
+
//
|
|
10
22
|
// https://react.dev/reference/react-dom/server/renderToString#removing-rendertostring-from-the-client-code
|
|
11
23
|
export function renderToStaticMarkup(node) {
|
|
12
24
|
const div = document.createElement('div');
|
|
@@ -15,13 +27,23 @@ export function renderToStaticMarkup(node) {
|
|
|
15
27
|
// jbrowse-img) loads @emotion/react before `document` exists, so its default
|
|
16
28
|
// cache context is null — provide one explicitly here.
|
|
17
29
|
const cache = createCache({ key: 'css' });
|
|
18
|
-
|
|
30
|
+
// a client root reports a render error and unmounts, so without this the
|
|
31
|
+
// export is an empty string its caller writes as a file
|
|
32
|
+
const uncaught = [];
|
|
33
|
+
const root = createRoot(div, {
|
|
34
|
+
onUncaughtError: error => {
|
|
35
|
+
uncaught.push(error);
|
|
36
|
+
},
|
|
37
|
+
});
|
|
19
38
|
let html;
|
|
20
39
|
try {
|
|
21
40
|
// eslint-disable-next-line @eslint-react/dom-no-flush-sync
|
|
22
41
|
flushSync(() => {
|
|
23
42
|
root.render(React.createElement(CacheProvider, { value: cache }, node));
|
|
24
43
|
});
|
|
44
|
+
if (uncaught.length > 0) {
|
|
45
|
+
throw uncaught[0];
|
|
46
|
+
}
|
|
25
47
|
html = div.innerHTML;
|
|
26
48
|
}
|
|
27
49
|
finally {
|
|
@@ -34,17 +56,5 @@ export function renderToStaticMarkup(node) {
|
|
|
34
56
|
// once the markup is a string, which no longer depends on the DOM.
|
|
35
57
|
root.unmount();
|
|
36
58
|
}
|
|
37
|
-
|
|
38
|
-
// does not include rgba() — alpha belongs in a separate fill-opacity /
|
|
39
|
-
// stroke-opacity. Illustrator and older Inkscape drop an element whose fill
|
|
40
|
-
// they cannot parse, so the alpha is stripped rather than left to break the
|
|
41
|
-
// whole shape. It is *dropped*, not converted, so a translucent color exports
|
|
42
|
-
// fully opaque: components that need transparency to survive set a separate
|
|
43
|
-
// opacity attribute instead (`CrossHatches`, `MultiWiggleOverlayLines`).
|
|
44
|
-
//
|
|
45
|
-
// Rewriting `fill="rgba(r,g,b,a)"` into `fill="rgb(r,g,b)" fill-opacity="a"`
|
|
46
|
-
// would preserve the appearance and let those two drop their workarounds, but
|
|
47
|
-
// it changes the pixels of every export carrying an rgba color, so it needs a
|
|
48
|
-
// visual pass before the snapshots are regenerated.
|
|
49
|
-
return html.replaceAll(/\brgba\((.+?),[^,]+?\)/g, 'rgb($1)');
|
|
59
|
+
return html;
|
|
50
60
|
}
|
package/esm/util/rxjs.d.ts
CHANGED
|
@@ -1,17 +1,32 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import type { StopToken } from './stopToken.ts';
|
|
3
2
|
import type { Observer } from 'rxjs';
|
|
4
3
|
/**
|
|
5
4
|
* Wrapper for rxjs Observable.create with improved error handling and aborting
|
|
6
5
|
* support.
|
|
7
6
|
*
|
|
8
|
-
* A `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
7
|
+
* A `signal` errors the subscriber with an abort error the moment it aborts,
|
|
8
|
+
* rather than waiting for `func` to finish work whose result is already
|
|
9
|
+
* discarded. The fetch paths filter abort errors out (`isAbortException`) so a
|
|
10
|
+
* cancel does not surface as a track error. It cannot interrupt `func` itself
|
|
11
|
+
* — a body doing long synchronous work still needs its own `checkAbortSignal`
|
|
12
|
+
* ticks — but it does stop delivery downstream.
|
|
14
13
|
*
|
|
15
14
|
* @param func - observer function, could be async
|
|
16
15
|
*/
|
|
17
|
-
export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>,
|
|
16
|
+
export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, signal?: AbortSignal): Observable<T>;
|
|
17
|
+
/**
|
|
18
|
+
* Subscribe to an observable and resolve when it completes, running `onNext` per
|
|
19
|
+
* item as it arrives — the streaming shape for parsing items out of a feature
|
|
20
|
+
* stream rather than collecting them first.
|
|
21
|
+
*
|
|
22
|
+
* **`onNext` throwing rejects the promise.** rxjs does not do that on its own:
|
|
23
|
+
* an exception out of a `next` handler goes to its global unhandled-error hook,
|
|
24
|
+
* so the subscriber keeps being fed and `complete` still fires — a bare promise
|
|
25
|
+
* around that resolves as *success* with the items silently missing. Beside
|
|
26
|
+
* `ObservableCreate` because it is the other half of the pattern: the adapter
|
|
27
|
+
* wraps its body in that, the RPC `await`s this, so a per-item parse failure
|
|
28
|
+
* surfaces as a track error instead of a blank-but-loaded track.
|
|
29
|
+
*
|
|
30
|
+
* The source is unsubscribed on the first throw.
|
|
31
|
+
*/
|
|
32
|
+
export declare function subscribeToObservable<T>(observable: Observable<T>, onNext: (item: T) => void): Promise<void>;
|
package/esm/util/rxjs.js
CHANGED
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
import { Observable } from 'rxjs';
|
|
2
|
-
import { stopTokenSignal } from './stopToken.js';
|
|
3
2
|
/**
|
|
4
3
|
* Wrapper for rxjs Observable.create with improved error handling and aborting
|
|
5
4
|
* support.
|
|
6
5
|
*
|
|
7
|
-
* A `
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
6
|
+
* A `signal` errors the subscriber with an abort error the moment it aborts,
|
|
7
|
+
* rather than waiting for `func` to finish work whose result is already
|
|
8
|
+
* discarded. The fetch paths filter abort errors out (`isAbortException`) so a
|
|
9
|
+
* cancel does not surface as a track error. It cannot interrupt `func` itself
|
|
10
|
+
* — a body doing long synchronous work still needs its own `checkAbortSignal`
|
|
11
|
+
* ticks — but it does stop delivery downstream.
|
|
13
12
|
*
|
|
14
13
|
* @param func - observer function, could be async
|
|
15
14
|
*/
|
|
16
|
-
export function ObservableCreate(func,
|
|
15
|
+
export function ObservableCreate(func, signal) {
|
|
17
16
|
return new Observable((observer) => {
|
|
18
|
-
const { signal, dispose } = stopTokenSignal(stopToken);
|
|
19
17
|
const stop = () => {
|
|
20
|
-
observer.error(signal
|
|
18
|
+
observer.error(signal?.reason);
|
|
21
19
|
};
|
|
22
|
-
if (signal
|
|
23
|
-
//
|
|
20
|
+
if (signal?.aborted) {
|
|
21
|
+
// aborted before subscribe: no 'abort' event is coming
|
|
24
22
|
stop();
|
|
25
23
|
}
|
|
26
24
|
else {
|
|
27
|
-
signal
|
|
25
|
+
signal?.addEventListener('abort', stop);
|
|
28
26
|
try {
|
|
29
27
|
const ret = func(observer);
|
|
30
28
|
if (ret?.catch) {
|
|
@@ -38,8 +36,56 @@ export function ObservableCreate(func, stopToken) {
|
|
|
38
36
|
}
|
|
39
37
|
}
|
|
40
38
|
return () => {
|
|
41
|
-
signal
|
|
42
|
-
dispose();
|
|
39
|
+
signal?.removeEventListener('abort', stop);
|
|
43
40
|
};
|
|
44
41
|
});
|
|
45
42
|
}
|
|
43
|
+
/**
|
|
44
|
+
* Subscribe to an observable and resolve when it completes, running `onNext` per
|
|
45
|
+
* item as it arrives — the streaming shape for parsing items out of a feature
|
|
46
|
+
* stream rather than collecting them first.
|
|
47
|
+
*
|
|
48
|
+
* **`onNext` throwing rejects the promise.** rxjs does not do that on its own:
|
|
49
|
+
* an exception out of a `next` handler goes to its global unhandled-error hook,
|
|
50
|
+
* so the subscriber keeps being fed and `complete` still fires — a bare promise
|
|
51
|
+
* around that resolves as *success* with the items silently missing. Beside
|
|
52
|
+
* `ObservableCreate` because it is the other half of the pattern: the adapter
|
|
53
|
+
* wraps its body in that, the RPC `await`s this, so a per-item parse failure
|
|
54
|
+
* surfaces as a track error instead of a blank-but-loaded track.
|
|
55
|
+
*
|
|
56
|
+
* The source is unsubscribed on the first throw.
|
|
57
|
+
*/
|
|
58
|
+
export function subscribeToObservable(observable, onNext) {
|
|
59
|
+
return new Promise((resolve, reject) => {
|
|
60
|
+
// A box rather than two bare `let`s: oxlint narrows a flag assigned only
|
|
61
|
+
// inside a closure to its initializer and reports the reads as always-false.
|
|
62
|
+
// `subscription` is genuinely still undefined during a synchronous source's
|
|
63
|
+
// first emissions, which is why it is read optionally below.
|
|
64
|
+
const state = {
|
|
65
|
+
failed: false,
|
|
66
|
+
};
|
|
67
|
+
state.subscription = observable.subscribe({
|
|
68
|
+
next: item => {
|
|
69
|
+
if (!state.failed) {
|
|
70
|
+
try {
|
|
71
|
+
onNext(item);
|
|
72
|
+
}
|
|
73
|
+
catch (e) {
|
|
74
|
+
state.failed = true;
|
|
75
|
+
// A parser throws an Error in every real case here; the wrap is for
|
|
76
|
+
// the rule that a rejection reason must be one, and keeps whatever
|
|
77
|
+
// was actually thrown as the `cause`.
|
|
78
|
+
reject(e instanceof Error ? e : new Error(String(e), { cause: e }));
|
|
79
|
+
state.subscription?.unsubscribe();
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
},
|
|
83
|
+
error: reject,
|
|
84
|
+
complete: () => {
|
|
85
|
+
if (!state.failed) {
|
|
86
|
+
resolve();
|
|
87
|
+
}
|
|
88
|
+
},
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import type PluginManager from '../PluginManager.ts';
|
|
2
|
+
import type { BaseOptions } from '../data_adapters/BaseAdapter/types.ts';
|
|
3
|
+
import type { FileLocation } from './types/data.ts';
|
|
4
|
+
export type SamplesTsvRow = Record<string, string> & {
|
|
5
|
+
name: string;
|
|
6
|
+
};
|
|
7
|
+
export interface SamplesTsvResult {
|
|
8
|
+
sources: SamplesTsvRow[];
|
|
9
|
+
warnings: string[];
|
|
10
|
+
}
|
|
11
|
+
export declare const samplesTsvAdapterConfigSchemaFields: {
|
|
12
|
+
/**
|
|
13
|
+
* #slot
|
|
14
|
+
*/
|
|
15
|
+
readonly samplesTsvLocation: {
|
|
16
|
+
readonly type: 'maybeFileLocation';
|
|
17
|
+
readonly description: "optional tab-separated table of per-sample metadata. It needs a header row, and its first column is the sample name exactly as the adapter spells it: a VCF sample, a MultiWiggle subtrack's name, a MAF species id. Every other column (`population`, `tissue`, ...) becomes an attribute of that sample, which the multi-row displays group, sort, color and tooltip rows by; a MAF adapter reads the `label`, `color` and `assemblyName` columns onto its species rows, over its `samples` entries. The table also narrows the adapter's samples to the ones it lists, and a table naming none of them is an error. An adapter that lists no samples of its own (a MAF track discovering its species from the file) takes the table's rows as its samples";
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
/**
|
|
21
|
+
* The metadata rows for the samples an adapter names, plus a warning for the
|
|
22
|
+
* samples the table leaves out, which no row is drawn for. Rows naming samples
|
|
23
|
+
* the adapter lacks are dropped silently: one project-wide table serving
|
|
24
|
+
* several tracks is the normal shape. `names` undefined means the adapter lists
|
|
25
|
+
* no samples of its own, so the rows become the set.
|
|
26
|
+
*
|
|
27
|
+
* A table matching none of `names` throws. Falling back to `names` would show
|
|
28
|
+
* every sample when the config asked for a curated subset, and an empty result
|
|
29
|
+
* draws a blank track with no banner. The message quotes both sides of the
|
|
30
|
+
* mismatch, because a prefix is what separates `1000GP_HG00096` from
|
|
31
|
+
* `HG00096`.
|
|
32
|
+
*
|
|
33
|
+
* `fileLabel` names the file in a message; `namesLabel` names where `names`
|
|
34
|
+
* came from ("the VCF").
|
|
35
|
+
*/
|
|
36
|
+
export declare function parseSamplesTsv(txt: string, names: readonly string[] | undefined, fileLabel: string, namesLabel: string): SamplesTsvResult;
|
|
37
|
+
/**
|
|
38
|
+
* An adapter's samples merged with its `samplesTsvLocation` table: the bare
|
|
39
|
+
* `names` when the slot is unset, otherwise {@link parseSamplesTsv}'s rows.
|
|
40
|
+
* The warnings come back rather than going to `console.warn`, because this runs
|
|
41
|
+
* in a worker whose console nobody reads.
|
|
42
|
+
*/
|
|
43
|
+
export declare function getSamplesTsvSources({ location, names, namesLabel, pluginManager, opts, }: {
|
|
44
|
+
location: FileLocation | undefined;
|
|
45
|
+
names: readonly string[] | undefined;
|
|
46
|
+
namesLabel: string;
|
|
47
|
+
pluginManager?: PluginManager;
|
|
48
|
+
opts?: BaseOptions;
|
|
49
|
+
}): Promise<SamplesTsvResult>;
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { fetchAndMaybeUnzipText } from './fetchAndMaybeUnzip.js';
|
|
2
|
+
import { getFileName } from './getFileName.js';
|
|
3
|
+
import { openLocation } from './io/index.js';
|
|
4
|
+
import { shorten2 } from './stringUtils.js';
|
|
5
|
+
export const samplesTsvAdapterConfigSchemaFields = {
|
|
6
|
+
/**
|
|
7
|
+
* #slot
|
|
8
|
+
*/
|
|
9
|
+
samplesTsvLocation: {
|
|
10
|
+
type: 'maybeFileLocation',
|
|
11
|
+
description: "optional tab-separated table of per-sample metadata. It needs a header row, and its first column is the sample name exactly as the adapter spells it: a VCF sample, a MultiWiggle subtrack's name, a MAF species id. Every other column (`population`, `tissue`, ...) becomes an attribute of that sample, which the multi-row displays group, sort, color and tooltip rows by; a MAF adapter reads the `label`, `color` and `assemblyName` columns onto its species rows, over its `samples` entries. The table also narrows the adapter's samples to the ones it lists, and a table naming none of them is an error. An adapter that lists no samples of its own (a MAF track discovering its species from the file) takes the table's rows as its samples",
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* The metadata rows for the samples an adapter names, plus a warning for the
|
|
16
|
+
* samples the table leaves out, which no row is drawn for. Rows naming samples
|
|
17
|
+
* the adapter lacks are dropped silently: one project-wide table serving
|
|
18
|
+
* several tracks is the normal shape. `names` undefined means the adapter lists
|
|
19
|
+
* no samples of its own, so the rows become the set.
|
|
20
|
+
*
|
|
21
|
+
* A table matching none of `names` throws. Falling back to `names` would show
|
|
22
|
+
* every sample when the config asked for a curated subset, and an empty result
|
|
23
|
+
* draws a blank track with no banner. The message quotes both sides of the
|
|
24
|
+
* mismatch, because a prefix is what separates `1000GP_HG00096` from
|
|
25
|
+
* `HG00096`.
|
|
26
|
+
*
|
|
27
|
+
* `fileLabel` names the file in a message; `namesLabel` names where `names`
|
|
28
|
+
* came from ("the VCF").
|
|
29
|
+
*/
|
|
30
|
+
export function parseSamplesTsv(txt, names, fileLabel, namesLabel) {
|
|
31
|
+
const lines = txt.split(/\n|\r\n|\r/);
|
|
32
|
+
const header = lines[0].split('\t');
|
|
33
|
+
const metadataSet = new Set();
|
|
34
|
+
const duplicates = new Set();
|
|
35
|
+
const metadataLines = lines
|
|
36
|
+
.slice(1)
|
|
37
|
+
.filter(Boolean)
|
|
38
|
+
.map(line => {
|
|
39
|
+
const [name, ...rest] = line.split('\t');
|
|
40
|
+
return {
|
|
41
|
+
...Object.fromEntries(header.slice(1).map((col, idx) => [col, rest[idx] ?? ''])),
|
|
42
|
+
name: name,
|
|
43
|
+
};
|
|
44
|
+
})
|
|
45
|
+
.filter(row => {
|
|
46
|
+
if (metadataSet.has(row.name)) {
|
|
47
|
+
duplicates.add(row.name);
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
metadataSet.add(row.name);
|
|
51
|
+
return true;
|
|
52
|
+
});
|
|
53
|
+
const warnings = [];
|
|
54
|
+
if (duplicates.size) {
|
|
55
|
+
warnings.push(`${duplicates.size} samples appear more than once in the metadata file ${fileLabel}; the first row of each is used: ${shorten2([...duplicates].join(','))}`);
|
|
56
|
+
}
|
|
57
|
+
if (!names) {
|
|
58
|
+
return { sources: metadataLines, warnings };
|
|
59
|
+
}
|
|
60
|
+
const nameSet = new Set(names);
|
|
61
|
+
const namesNotInMetadata = [...nameSet].filter(f => !metadataSet.has(f));
|
|
62
|
+
const sources = metadataLines.filter(f => nameSet.has(f.name));
|
|
63
|
+
if (sources.length === 0 && names.length > 0) {
|
|
64
|
+
const example = metadataLines[0]?.name;
|
|
65
|
+
throw new Error(example === undefined
|
|
66
|
+
? `The samples metadata file ${fileLabel} has a header but no sample rows, so this track has no rows to draw`
|
|
67
|
+
: `No sample in the metadata file ${fileLabel} matches ${namesLabel}, so this track has no rows to draw: its first column reads "${example}" where ${namesLabel} names "${names[0]}". Check for an added prefix or suffix, or for the sample IDs being in a different column.`);
|
|
68
|
+
}
|
|
69
|
+
if (namesNotInMetadata.length) {
|
|
70
|
+
warnings.push(`${namesNotInMetadata.length} of the ${names.length} samples in ${namesLabel} are not in the metadata file ${fileLabel} (${metadataLines.length} lines) and are not shown: ${shorten2(namesNotInMetadata.join(','))}`);
|
|
71
|
+
}
|
|
72
|
+
return { sources, warnings };
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* An adapter's samples merged with its `samplesTsvLocation` table: the bare
|
|
76
|
+
* `names` when the slot is unset, otherwise {@link parseSamplesTsv}'s rows.
|
|
77
|
+
* The warnings come back rather than going to `console.warn`, because this runs
|
|
78
|
+
* in a worker whose console nobody reads.
|
|
79
|
+
*/
|
|
80
|
+
export async function getSamplesTsvSources({ location, names, namesLabel, pluginManager, opts, }) {
|
|
81
|
+
if (!location) {
|
|
82
|
+
return { sources: (names ?? []).map(name => ({ name })), warnings: [] };
|
|
83
|
+
}
|
|
84
|
+
const txt = await fetchAndMaybeUnzipText(openLocation(location, pluginManager), opts, 'Downloading sample metadata');
|
|
85
|
+
return parseSamplesTsv(txt, names, 'uri' in location ? location.uri : getFileName(location), namesLabel);
|
|
86
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
/**
|
|
3
|
+
* Free a tree an action has already let go of — a superseded session, a view
|
|
4
|
+
* taken out of one, a superseded rootModel the React host has detached.
|
|
5
|
+
*
|
|
6
|
+
* A task rather than a microtask: the wait is for React to unmount the
|
|
7
|
+
* components rendering it, which happens on the re-render that the action's own
|
|
8
|
+
* reactions schedule. Deferring is acceptable here, and is not elsewhere,
|
|
9
|
+
* because the node stays alive and detached until it fires — a late read gets a
|
|
10
|
+
* live tree nobody is rendering. ADR-069.
|
|
11
|
+
*
|
|
12
|
+
* The destroy itself is not optional. `beforeDestroy` is a plugin-facing
|
|
13
|
+
* contract (jbrowse-plugin-apollo aborts its in-flight fetches there) and core's
|
|
14
|
+
* `BaseTrackModel` releases the `rpcSessionId` claim that lets
|
|
15
|
+
* `CoreFreeResources` evict a parsed adapter from the worker — so detaching and
|
|
16
|
+
* forgetting would trade a console warning for an unbounded leak.
|
|
17
|
+
*/
|
|
18
|
+
export declare function scheduleDetachedDestroy(node: IAnyStateTreeNode): void;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { destroy, isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
/**
|
|
3
|
+
* Free a tree an action has already let go of — a superseded session, a view
|
|
4
|
+
* taken out of one, a superseded rootModel the React host has detached.
|
|
5
|
+
*
|
|
6
|
+
* A task rather than a microtask: the wait is for React to unmount the
|
|
7
|
+
* components rendering it, which happens on the re-render that the action's own
|
|
8
|
+
* reactions schedule. Deferring is acceptable here, and is not elsewhere,
|
|
9
|
+
* because the node stays alive and detached until it fires — a late read gets a
|
|
10
|
+
* live tree nobody is rendering. ADR-069.
|
|
11
|
+
*
|
|
12
|
+
* The destroy itself is not optional. `beforeDestroy` is a plugin-facing
|
|
13
|
+
* contract (jbrowse-plugin-apollo aborts its in-flight fetches there) and core's
|
|
14
|
+
* `BaseTrackModel` releases the `rpcSessionId` claim that lets
|
|
15
|
+
* `CoreFreeResources` evict a parsed adapter from the worker — so detaching and
|
|
16
|
+
* forgetting would trade a console warning for an unbounded leak.
|
|
17
|
+
*/
|
|
18
|
+
export function scheduleDetachedDestroy(node) {
|
|
19
|
+
setTimeout(() => {
|
|
20
|
+
if (isAlive(node)) {
|
|
21
|
+
destroy(node);
|
|
22
|
+
}
|
|
23
|
+
}, 0);
|
|
24
|
+
}
|
package/esm/util/scrollLatch.js
CHANGED
|
@@ -47,6 +47,14 @@ export function createScrollLatch(timeoutMs = LATCH_TIMEOUT_MS) {
|
|
|
47
47
|
}
|
|
48
48
|
return null;
|
|
49
49
|
},
|
|
50
|
+
// Whether this panel already owns the gesture `e` belongs to, i.e. it has
|
|
51
|
+
// scrolled during a run of events this one continues. Callers ask before
|
|
52
|
+
// declining an event on their own rules: a gesture that has latched keeps
|
|
53
|
+
// every event it fires, cross-axis momentum included, which is the whole
|
|
54
|
+
// point of latching.
|
|
55
|
+
holds(e) {
|
|
56
|
+
return latched && e.timeStamp - lastEvent < timeoutMs;
|
|
57
|
+
},
|
|
50
58
|
// Forget the gesture state so the next event is treated as a fresh gesture.
|
|
51
59
|
// Called when the pointer leaves the panel: a gesture the browser has
|
|
52
60
|
// latched to this element must not keep the page suppressed once the cursor
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { createAbortRotation } from './createAbortRotation.ts';
|
|
2
|
+
import type { CoreGetEncodedLayersArgs } from './markEncodingTypes.ts';
|
|
3
|
+
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
4
|
+
/**
|
|
5
|
+
* #api
|
|
6
|
+
* Open the feature widget on the feature behind one instance of a
|
|
7
|
+
* `CoreGetEncodedLayers` answer. A display holds channels, not records, so it
|
|
8
|
+
* sends `CoreGetEncodedFeature` the request the instance's region came back
|
|
9
|
+
* under, and the worker answers the entry of `layer`'s list that the
|
|
10
|
+
* instance's `featureIndex` names: the record as the adapter wrote it, or the
|
|
11
|
+
* bin or run the steps made. A second click aborts the first.
|
|
12
|
+
*/
|
|
13
|
+
export declare function selectEncodedFeature(self: IStateTreeNode, rotation: ReturnType<typeof createAbortRotation>, args: Omit<CoreGetEncodedLayersArgs, 'byteLimit'> & {
|
|
14
|
+
layer: number;
|
|
15
|
+
featureIndex: number;
|
|
16
|
+
}): void;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { openFeatureWidget } from './openFeatureWidget.js';
|
|
2
|
+
import { getRpcSessionId } from './parentWalk.js';
|
|
3
|
+
import { getRpcHost } from './sessionServices.js';
|
|
4
|
+
import SimpleFeature from './simpleFeature.js';
|
|
5
|
+
import { withFeatureDetails } from './withFeatureDetails.js';
|
|
6
|
+
/**
|
|
7
|
+
* #api
|
|
8
|
+
* Open the feature widget on the feature behind one instance of a
|
|
9
|
+
* `CoreGetEncodedLayers` answer. A display holds channels, not records, so it
|
|
10
|
+
* sends `CoreGetEncodedFeature` the request the instance's region came back
|
|
11
|
+
* under, and the worker answers the entry of `layer`'s list that the
|
|
12
|
+
* instance's `featureIndex` names: the record as the adapter wrote it, or the
|
|
13
|
+
* bin or run the steps made. A second click aborts the first.
|
|
14
|
+
*/
|
|
15
|
+
export function selectEncodedFeature(self, rotation, args) {
|
|
16
|
+
const fetch = rotation.begin();
|
|
17
|
+
void withFeatureDetails(self, async () => {
|
|
18
|
+
try {
|
|
19
|
+
const feature = await getRpcHost(self).rpcManager.call(getRpcSessionId(self), 'CoreGetEncodedFeature', {
|
|
20
|
+
...args,
|
|
21
|
+
signal: fetch.signal,
|
|
22
|
+
statusCallback: fetch.statusCallback,
|
|
23
|
+
});
|
|
24
|
+
return feature && fetch.isCurrent()
|
|
25
|
+
? new SimpleFeature(feature)
|
|
26
|
+
: undefined;
|
|
27
|
+
}
|
|
28
|
+
finally {
|
|
29
|
+
fetch.end();
|
|
30
|
+
}
|
|
31
|
+
}, feature => {
|
|
32
|
+
openFeatureWidget(self, feature.toJSON(), { feature });
|
|
33
|
+
});
|
|
34
|
+
}
|
|
@@ -2,6 +2,9 @@ export declare function b64PadSuffix(b64: string): string;
|
|
|
2
2
|
/**
|
|
3
3
|
* Decode and inflate a url-safe base64 to a string
|
|
4
4
|
* See {@link https://en.wikipedia.org/wiki/Base64#URL_applications}
|
|
5
|
+
*
|
|
6
|
+
* A truncated input rejects rather than inflating to a prefix: a link cut short
|
|
7
|
+
* in transit has to say so, not fail later as a JSON syntax error.
|
|
5
8
|
*/
|
|
6
9
|
export declare function fromUrlSafeB64(b64: string): Promise<string>;
|
|
7
10
|
/**
|
|
@@ -10,9 +13,9 @@ export declare function fromUrlSafeB64(b64: string): Promise<string>;
|
|
|
10
13
|
*/
|
|
11
14
|
export declare function toUrlSafeB64(str: string): Promise<string>;
|
|
12
15
|
/**
|
|
13
|
-
* The `?session=` value prefixes
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
+
* The `?session=` value prefixes for a session carried by or behind the link.
|
|
17
|
+
* The decoder half (jbrowse-web's SessionLoader) has its own list covering
|
|
18
|
+
* `spec-` and `local-` too.
|
|
16
19
|
*/
|
|
17
20
|
export declare const SHARE_PREFIX = "share-";
|
|
18
21
|
export declare const ENCODED_PREFIX = "encoded-";
|
|
@@ -25,11 +28,10 @@ export declare const JSON_PREFIX = "json-";
|
|
|
25
28
|
* alone: web honors an explicit empty string as "resolve relative to the page".
|
|
26
29
|
*/
|
|
27
30
|
export declare function shareEndpoint(shareURL: string, path: 'share' | 'load'): string;
|
|
28
|
-
export type SessionShareMode = 'short' | 'long'
|
|
31
|
+
export type SessionShareMode = 'short' | 'long';
|
|
29
32
|
export interface EncodedSessionParam {
|
|
30
33
|
sessionParam: string;
|
|
31
34
|
password?: string;
|
|
32
|
-
plaintext?: string;
|
|
33
35
|
}
|
|
34
36
|
export declare function encodeSessionParam(mode: SessionShareMode, session: unknown, options: {
|
|
35
37
|
shareURL: string;
|