@jbrowse/core 5.0.0-beta.1 → 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 +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- 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 +16 -9
- 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 +50 -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/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 +2 -2
- 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 +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/list.js +527 -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 +24 -11
- package/esm/configuration/index.js +15 -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/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 +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -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/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 +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- 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 -49
- 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/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/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 +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -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/{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 +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.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/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -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/io/index.js +19 -14
- 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 +20 -27
- package/esm/util/jexlFilters.js +23 -11
- 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/localStorage.js +4 -4
- 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/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/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -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 +13 -8
- package/esm/util/tabix.js +17 -12
- 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 +121 -40
- package/esm/util/tracks.js +497 -112
- 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 +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -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/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- 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/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- 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
|
@@ -0,0 +1,364 @@
|
|
|
1
|
+
import { parseBreakend } from '@gmod/vcf';
|
|
2
|
+
export const SV_SYMBOLIC_ALLELES = [
|
|
3
|
+
'<TRA',
|
|
4
|
+
'<DEL',
|
|
5
|
+
'<INV',
|
|
6
|
+
'<INS',
|
|
7
|
+
'<DUP',
|
|
8
|
+
'<CNV',
|
|
9
|
+
];
|
|
10
|
+
/**
|
|
11
|
+
* #api
|
|
12
|
+
* parseBreakend, honoring its `Breakend | undefined` signature. ALT strings are
|
|
13
|
+
* user data and malformed breakends do occur; @gmod/vcf <=7.0.10 throws on them
|
|
14
|
+
* instead of returning undefined, which would otherwise fail a whole render or
|
|
15
|
+
* feature-parse pass over one bad allele. Use this everywhere rather than
|
|
16
|
+
* importing parseBreakend directly; it can become a plain re-export once the
|
|
17
|
+
* upstream fix ships.
|
|
18
|
+
*/
|
|
19
|
+
export function safeParseBreakend(alt) {
|
|
20
|
+
try {
|
|
21
|
+
return parseBreakend(alt);
|
|
22
|
+
}
|
|
23
|
+
catch {
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* #api
|
|
29
|
+
* The mate locString ("chr2:100") of a parsed breakend, or undefined when it
|
|
30
|
+
* names no navigable position. Two ALT forms reach here without one: a single
|
|
31
|
+
* breakend (`.A` / `G.`) has no mate at all, and the symbolic-mate forms
|
|
32
|
+
* (`G<DEL>`, `<DEL>G`) get a placeholder `<DEL>:1` from parseBreakend, which
|
|
33
|
+
* puts a symbolic allele id where a contig name belongs. Callers that navigate
|
|
34
|
+
* or split-view a mate must drop both rather than treat `<DEL>` as a refName.
|
|
35
|
+
*/
|
|
36
|
+
export function getBreakendMateLocString(breakend) {
|
|
37
|
+
const matePosition = breakend?.MatePosition;
|
|
38
|
+
return matePosition === undefined || matePosition.startsWith('<')
|
|
39
|
+
? undefined
|
|
40
|
+
: matePosition;
|
|
41
|
+
}
|
|
42
|
+
// VCF 4.5 computes END rather than storing it: a DEL, DUP, INV or CNV allele
|
|
43
|
+
// ends |SVLEN| bases past POS, SVLEN one value per ALT (one for all in files
|
|
44
|
+
// older than 4.4)
|
|
45
|
+
function spannedEnd(feature, alt, svlen, alleleIndex) {
|
|
46
|
+
if (!/^<(DEL|DUP|INV|CNV)[:>]/.test(alt) || !Array.isArray(svlen)) {
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
const len = Math.abs(Number(svlen.length === 1 ? svlen[0] : svlen[alleleIndex]));
|
|
50
|
+
return len > 0 ? feature.get('start') + 1 + len : undefined;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* #api
|
|
54
|
+
* Parse raw (non-assembly-resolved) mate coordinates from a VCF SV feature+alt.
|
|
55
|
+
* Returns undefined when no mate coordinate info is found. `alleleIndex` is
|
|
56
|
+
* the alt's place in `ALT`, which a record repeating one symbolic allele with
|
|
57
|
+
* several lengths needs; it defaults to the first place `alt` appears.
|
|
58
|
+
*/
|
|
59
|
+
export function parseSvAlt(feature, alt, alleleIndex = Math.max(0, feature.get('ALT')?.indexOf(alt ?? '') ?? 0)) {
|
|
60
|
+
const bnd = alt !== undefined ? safeParseBreakend(alt) : undefined;
|
|
61
|
+
const mateLocString = getBreakendMateLocString(bnd);
|
|
62
|
+
const refName = feature.get('refName');
|
|
63
|
+
if (alt !== undefined && SV_SYMBOLIC_ALLELES.some(a => alt.startsWith(a))) {
|
|
64
|
+
// An insertion has one end: its END, where a caller writes one, is POS.
|
|
65
|
+
if (alt.startsWith('<INS')) {
|
|
66
|
+
return undefined;
|
|
67
|
+
}
|
|
68
|
+
const info = feature.get('INFO');
|
|
69
|
+
const matePos = info?.END?.[0] ??
|
|
70
|
+
spannedEnd(feature, alt, info?.SVLEN, alleleIndex);
|
|
71
|
+
if (matePos === undefined) {
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
return {
|
|
75
|
+
mateRefName: info?.CHR2?.[0] ?? refName,
|
|
76
|
+
matePos,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
else if (bnd !== undefined && mateLocString !== undefined) {
|
|
80
|
+
// Split at the LAST colon, the same rule `parseLocString` applies and for
|
|
81
|
+
// the same reason: a refName may contain one. GRCh38's full analysis set
|
|
82
|
+
// names its HLA contigs `HLA-A*01:01:01:01`, so a mate on one arrives here
|
|
83
|
+
// as `HLA-A*01:01:01:01:1000` and splitting at the first colon read the
|
|
84
|
+
// chromosome as `HLA-A*01` and the position as 1.
|
|
85
|
+
const colon = mateLocString.lastIndexOf(':');
|
|
86
|
+
const mateRefName = mateLocString.slice(0, colon);
|
|
87
|
+
const matePosStr = mateLocString.slice(colon + 1);
|
|
88
|
+
const matePos = Number(matePosStr);
|
|
89
|
+
// A position that is not a 1-based coordinate is not a location. Returning
|
|
90
|
+
// one anyway put it through `svMateLocus` into a fetch region and a panel's
|
|
91
|
+
// `centerAt`, neither of which reports anything. `Number` alone is too
|
|
92
|
+
// generous to screen on: it reads `''` as 0 and `'0x10'` as 16.
|
|
93
|
+
if (colon <= 0 || !/^\d+$/.test(matePosStr) || matePos < 1) {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
return { mateRefName, matePos, ...breakendKeepsDirections(bnd) };
|
|
97
|
+
}
|
|
98
|
+
return undefined;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* #api
|
|
102
|
+
* Which way the sequence each end of a breakend KEEPS runs from its breakpoint,
|
|
103
|
+
* as `+1 = right` / `-1 = left` — the convention `StarFusionAdapter`'s
|
|
104
|
+
* `tickDirection` states and the one every producer in the tree emits.
|
|
105
|
+
*
|
|
106
|
+
* The two halves read their strings with OPPOSITE polarity, which is the whole
|
|
107
|
+
* reason to state them together. `Join: 'right'` says the mate piece is joined
|
|
108
|
+
* to the RIGHT of the ref base, so this end keeps the sequence to its left:
|
|
109
|
+
* negated. `MateDirection: 'right'` says the mate's own piece extends to the
|
|
110
|
+
* right of the mate position, which is already the direction it keeps: taken as
|
|
111
|
+
* read. So `N[chr2:2000[` is `{ joinDirection: -1, mateDirection: 1 }`, and that
|
|
112
|
+
* is the same pair `StarFusionAdapter` emits for the fusion it describes — the
|
|
113
|
+
* donor keeps the sequence below its breakpoint (-1) and the acceptor the
|
|
114
|
+
* sequence above its own (+1).
|
|
115
|
+
*
|
|
116
|
+
* Split out of `parseSvAlt` because a consumer holding an already-parsed
|
|
117
|
+
* `Breakend` was re-deriving it by hand, in two adjacent ternaries of opposite
|
|
118
|
+
* polarity — the shape that produced 78bb7b84f9.
|
|
119
|
+
*/
|
|
120
|
+
export function breakendKeepsDirections(bnd) {
|
|
121
|
+
return {
|
|
122
|
+
mateDirection: bnd.MateDirection === 'left' ? -1 : 1,
|
|
123
|
+
joinDirection: bnd.Join === 'left' ? 1 : -1,
|
|
124
|
+
};
|
|
125
|
+
}
|
|
126
|
+
/**
|
|
127
|
+
* #api
|
|
128
|
+
* Breakend notation, without parsing it: bracket forms (`G[chr2:100[`), single
|
|
129
|
+
* breakends (`.A` / `G.`), and the symbolic-mate form (`G<DEL>`, an angle
|
|
130
|
+
* bracket past position 0; a leading `<` is a plain symbolic allele).
|
|
131
|
+
*/
|
|
132
|
+
export function isBreakend(alt) {
|
|
133
|
+
return (alt.includes('[') ||
|
|
134
|
+
alt.includes(']') ||
|
|
135
|
+
alt.startsWith('.') ||
|
|
136
|
+
alt.endsWith('.') ||
|
|
137
|
+
alt.lastIndexOf('<') > 0);
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* #api
|
|
141
|
+
* The conventional size floor for calling a sequence indel structural.
|
|
142
|
+
*/
|
|
143
|
+
export const SV_MIN_LENGTH = 50;
|
|
144
|
+
const CLASS_OF_TOKEN = {
|
|
145
|
+
DEL: 'DEL',
|
|
146
|
+
DUP: 'DUP',
|
|
147
|
+
INS: 'INS',
|
|
148
|
+
INV: 'INV',
|
|
149
|
+
CNV: 'CNV',
|
|
150
|
+
TR: 'TR',
|
|
151
|
+
VNTR: 'TR',
|
|
152
|
+
BND: 'BND',
|
|
153
|
+
TRA: 'BND',
|
|
154
|
+
CTX: 'BND',
|
|
155
|
+
CPX: 'CPX',
|
|
156
|
+
INVDUP: 'CPX',
|
|
157
|
+
CHROMOTHRIPSIS: 'CPX',
|
|
158
|
+
CHROMOPLEXY: 'CPX',
|
|
159
|
+
BFB: 'CPX',
|
|
160
|
+
DOUBLEMINUTE: 'CPX',
|
|
161
|
+
};
|
|
162
|
+
// gVCF's `<NON_REF>` and bcftools mpileup's `<*>` stand for whatever allele
|
|
163
|
+
// the caller did not name, not for a structure.
|
|
164
|
+
const ANY_OTHER_ALLELE = new Set(['<NON_REF>', '<*>']);
|
|
165
|
+
/**
|
|
166
|
+
* #api
|
|
167
|
+
* The class a symbolic allele id, `SVTYPE` or `EVENTTYPE` names. A subtype folds
|
|
168
|
+
* into its first level (`DEL:ME:ALU` is DEL, `DUP:TANDEM` DUP), except the
|
|
169
|
+
* tandem repeats VCF 4.4 spells `CNV:TR` and ExpansionHunter `STRn`, and the
|
|
170
|
+
* inverted duplication `INV:DUP`. 1000 Genomes' `CNn` counts one haplotype's
|
|
171
|
+
* copies, so none is a deletion and two or more a duplication. `''` for an
|
|
172
|
+
* empty or missing token.
|
|
173
|
+
*/
|
|
174
|
+
export function svClassOfToken(raw) {
|
|
175
|
+
const token = raw.trim().toUpperCase();
|
|
176
|
+
if (token === '' || token === '.') {
|
|
177
|
+
return '';
|
|
178
|
+
}
|
|
179
|
+
if (token === 'CNV:TR') {
|
|
180
|
+
return 'TR';
|
|
181
|
+
}
|
|
182
|
+
if (token === 'INV:DUP') {
|
|
183
|
+
return 'CPX';
|
|
184
|
+
}
|
|
185
|
+
const first = token.split(':')[0];
|
|
186
|
+
const copies = /^CN(\d+)$/.exec(first);
|
|
187
|
+
if (copies) {
|
|
188
|
+
const n = Number(copies[1]);
|
|
189
|
+
return n === 0 ? 'DEL' : n === 1 ? 'CNV' : 'DUP';
|
|
190
|
+
}
|
|
191
|
+
return /^STR\d*$/.test(first) ? 'TR' : (CLASS_OF_TOKEN[first] ?? 'OTHER');
|
|
192
|
+
}
|
|
193
|
+
// an INFO token one allele states: its own entry of a Number=A field, or the
|
|
194
|
+
// one entry a record-wide field has
|
|
195
|
+
function alleleToken(info, key, alleleIndex) {
|
|
196
|
+
const value = info?.[key];
|
|
197
|
+
const list = Array.isArray(value) ? value : [value];
|
|
198
|
+
const token = list.length === 1 ? list[0] : list[alleleIndex];
|
|
199
|
+
return typeof token === 'string' ? token : '';
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* #api
|
|
203
|
+
* The structural-variant class one ALT allele states, `''` for one that is not
|
|
204
|
+
* structural. A symbolic allele's own id wins. Otherwise VCF 4.4's `EVENTTYPE`
|
|
205
|
+
* does; then a breakend is the class its `SVTYPE` declares where that says more
|
|
206
|
+
* than BND, and a sequence allele is an insertion or deletion by its length
|
|
207
|
+
* against REF, else its `SVTYPE`'s class.
|
|
208
|
+
*/
|
|
209
|
+
export function svClassOfAlt(alt, { ref, info, alleleIndex = 0, } = {}) {
|
|
210
|
+
if (ANY_OTHER_ALLELE.has(alt)) {
|
|
211
|
+
return '';
|
|
212
|
+
}
|
|
213
|
+
if (alt.startsWith('<') && alt.endsWith('>')) {
|
|
214
|
+
return svClassOfToken(alt.slice(1, -1));
|
|
215
|
+
}
|
|
216
|
+
const event = svClassOfToken(alleleToken(info, 'EVENTTYPE', alleleIndex));
|
|
217
|
+
if (event) {
|
|
218
|
+
return event;
|
|
219
|
+
}
|
|
220
|
+
const declared = svClassOfToken(alleleToken(info, 'SVTYPE', alleleIndex));
|
|
221
|
+
if (isBreakend(alt)) {
|
|
222
|
+
return declared && declared !== 'BND' && declared !== 'OTHER'
|
|
223
|
+
? declared
|
|
224
|
+
: 'BND';
|
|
225
|
+
}
|
|
226
|
+
const diff = alt.length - (ref?.length ?? alt.length);
|
|
227
|
+
return diff >= SV_MIN_LENGTH
|
|
228
|
+
? 'INS'
|
|
229
|
+
: diff <= -SV_MIN_LENGTH
|
|
230
|
+
? 'DEL'
|
|
231
|
+
: declared;
|
|
232
|
+
}
|
|
233
|
+
/**
|
|
234
|
+
* #api
|
|
235
|
+
* The structural-variant class of a VCF record as a whole: the one class its
|
|
236
|
+
* alleles state, CNV where they are losses and gains of one segment, OTHER
|
|
237
|
+
* where they otherwise disagree, and `''` for a record with no structural
|
|
238
|
+
* allele.
|
|
239
|
+
*/
|
|
240
|
+
export function svClassOf(feature) {
|
|
241
|
+
const alts = feature.get('ALT');
|
|
242
|
+
const ref = feature.get('REF');
|
|
243
|
+
const info = feature.get('INFO');
|
|
244
|
+
if (!alts?.length) {
|
|
245
|
+
return svClassOfToken(alleleToken(info, 'SVTYPE', 0));
|
|
246
|
+
}
|
|
247
|
+
const classes = new Set();
|
|
248
|
+
for (const [alleleIndex, alt] of alts.entries()) {
|
|
249
|
+
const found = svClassOfAlt(alt, { ref, info, alleleIndex });
|
|
250
|
+
if (found) {
|
|
251
|
+
classes.add(found);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
const [only, ...rest] = classes;
|
|
255
|
+
return rest.length === 0
|
|
256
|
+
? (only ?? '')
|
|
257
|
+
: [...classes].every(c => c === 'DEL' || c === 'DUP' || c === 'CNV')
|
|
258
|
+
? 'CNV'
|
|
259
|
+
: 'OTHER';
|
|
260
|
+
}
|
|
261
|
+
// Read the mate destination from a VCF translocation INFO record. CHR2/END
|
|
262
|
+
// give the mate ref+position; STRANDS[0] is a two-char code (e.g. "+-") where
|
|
263
|
+
// the first char is this side's strand and the second is the mate's. Returns
|
|
264
|
+
// undefined when CHR2/END aren't both present.
|
|
265
|
+
export function readTranslocationMate(info) {
|
|
266
|
+
const chr = info.CHR2?.[0];
|
|
267
|
+
const pos = info.END?.[0];
|
|
268
|
+
if (chr === undefined || pos === undefined) {
|
|
269
|
+
return undefined;
|
|
270
|
+
}
|
|
271
|
+
const [myDir, mateDir] = info.STRANDS?.[0]?.split('') ?? ['.', '.'];
|
|
272
|
+
// A STRANDS char names the strand the record is ON, and an end on `+` keeps
|
|
273
|
+
// the sequence to its LEFT — so the keeps-direction (`breakendKeepsDirections`,
|
|
274
|
+
// +1 = right) is its negation. Resolved here so the one consumer that draws
|
|
275
|
+
// these as ticks does not have to know that, which is how the two conventions
|
|
276
|
+
// came to sit a negation apart in the first place.
|
|
277
|
+
const sign = (s) => (s === '+' ? -1 : s === '-' ? 1 : 0);
|
|
278
|
+
return {
|
|
279
|
+
chr,
|
|
280
|
+
pos,
|
|
281
|
+
myDir: myDir ?? '.',
|
|
282
|
+
mateDir: mateDir ?? '.',
|
|
283
|
+
myKeepsDir: sign(myDir ?? '.'),
|
|
284
|
+
mateKeepsDir: sign(mateDir ?? '.'),
|
|
285
|
+
};
|
|
286
|
+
}
|
|
287
|
+
// A BEDPE strand names the side of the block the junction is on: `+` its end,
|
|
288
|
+
// so the block keeps the sequence to its left.
|
|
289
|
+
function keepsOf(mateDirection, strand) {
|
|
290
|
+
if (typeof mateDirection === 'number') {
|
|
291
|
+
return mateDirection;
|
|
292
|
+
}
|
|
293
|
+
return strand === 1 ? -1 : strand === -1 ? 1 : 0;
|
|
294
|
+
}
|
|
295
|
+
function joinBase(self, other) {
|
|
296
|
+
const keeps = self.keeps || (self.start + self.end <= other.start + other.end ? -1 : 1);
|
|
297
|
+
return keeps === -1 ? self.end - 1 : self.start;
|
|
298
|
+
}
|
|
299
|
+
function symbolicKeeps(feature, alt) {
|
|
300
|
+
if (alt.startsWith('<DEL')) {
|
|
301
|
+
return [-1, 1];
|
|
302
|
+
}
|
|
303
|
+
if (alt.startsWith('<DUP')) {
|
|
304
|
+
return [1, -1];
|
|
305
|
+
}
|
|
306
|
+
const tra = readTranslocationMate(feature.get('INFO') ?? {});
|
|
307
|
+
return [tra?.myKeepsDir ?? 0, tra?.mateKeepsDir ?? 0];
|
|
308
|
+
}
|
|
309
|
+
/**
|
|
310
|
+
* #api
|
|
311
|
+
* Where a paired record's junction is at each of its two ends, and which side
|
|
312
|
+
* of it each end keeps — the one answer every launcher, the row menu and the
|
|
313
|
+
* chain walk take, whether the record is a VCF breakend, a symbolic SV or a
|
|
314
|
+
* paired adapter's row (BEDPE, STAR-Fusion). Refnames are as the record spells
|
|
315
|
+
* them. `undefined` for a record naming no other end. A VCF record is read
|
|
316
|
+
* through `alt`, its first ALT unless the caller names another.
|
|
317
|
+
*
|
|
318
|
+
* A VCF end is its own position. A paired adapter's end is a block, and the
|
|
319
|
+
* junction is the block's edge on the side the end keeps: stated by
|
|
320
|
+
* `mateDirection` where the adapter knows it, read off the strands where the
|
|
321
|
+
* record states one for each end as BEDPE does, and with neither the two
|
|
322
|
+
* blocks face each other. A PAF row's strand is the query's orientation and
|
|
323
|
+
* states none for the target, so it names no side.
|
|
324
|
+
*/
|
|
325
|
+
export function junctionEnds(feature, alt = feature.get('ALT')?.[0], alleleIndex) {
|
|
326
|
+
const refName = feature.get('refName');
|
|
327
|
+
const mate = feature.get('mate');
|
|
328
|
+
if (mate?.refName !== undefined && mate.start !== undefined) {
|
|
329
|
+
const sided = mate.strand !== undefined;
|
|
330
|
+
const self = {
|
|
331
|
+
start: feature.get('start'),
|
|
332
|
+
end: feature.get('end'),
|
|
333
|
+
keeps: keepsOf(feature.get('mateDirection'), sided ? feature.get('strand') : undefined),
|
|
334
|
+
};
|
|
335
|
+
const far = {
|
|
336
|
+
start: mate.start,
|
|
337
|
+
end: mate.end ?? mate.start + 1,
|
|
338
|
+
keeps: keepsOf(mate.mateDirection, mate.strand),
|
|
339
|
+
};
|
|
340
|
+
return {
|
|
341
|
+
own: { refName, pos: joinBase(self, far), keeps: self.keeps },
|
|
342
|
+
mate: {
|
|
343
|
+
refName: mate.refName,
|
|
344
|
+
pos: joinBase(far, self),
|
|
345
|
+
keeps: far.keeps,
|
|
346
|
+
},
|
|
347
|
+
};
|
|
348
|
+
}
|
|
349
|
+
const parsed = parseSvAlt(feature, alt, alleleIndex);
|
|
350
|
+
if (!parsed || alt === undefined) {
|
|
351
|
+
return undefined;
|
|
352
|
+
}
|
|
353
|
+
const [ownKeeps, mateKeeps] = parsed.joinDirection === undefined
|
|
354
|
+
? symbolicKeeps(feature, alt)
|
|
355
|
+
: [parsed.joinDirection, parsed.mateDirection ?? 0];
|
|
356
|
+
return {
|
|
357
|
+
own: { refName, pos: feature.get('start'), keeps: ownKeeps },
|
|
358
|
+
mate: {
|
|
359
|
+
refName: parsed.mateRefName,
|
|
360
|
+
pos: parsed.matePos - 1,
|
|
361
|
+
keeps: mateKeeps,
|
|
362
|
+
},
|
|
363
|
+
};
|
|
364
|
+
}
|
|
@@ -5,3 +5,14 @@ export declare function getStrokeProps(str: string): {
|
|
|
5
5
|
export declare function getFillProps(str: string): {
|
|
6
6
|
[x: string]: string | number;
|
|
7
7
|
};
|
|
8
|
+
/**
|
|
9
|
+
* A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
|
|
10
|
+
* alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
|
|
11
|
+
* drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
|
|
12
|
+
* and `transparent` have to be split before they reach a file. Undefined for a
|
|
13
|
+
* value that is already an SVG color, `none` or a `url()`.
|
|
14
|
+
*/
|
|
15
|
+
export declare function splitPaintAlpha(value: string): {
|
|
16
|
+
color: string;
|
|
17
|
+
opacity: number;
|
|
18
|
+
} | undefined;
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { formatHEX, getAlpha, newColor, parseCssColorOr } from './colorBits.js';
|
|
1
|
+
import { formatHEX, getAlpha, getBlue, getGreen, getRed, newColor, parseCssColorOr, } from './colorBits.js';
|
|
2
2
|
// Matches colord()'s fallback for unparsable input.
|
|
3
3
|
const FALLBACK = newColor(0, 0, 0, 255);
|
|
4
4
|
// Works on the packed Color directly rather than via colord(): these run per
|
|
@@ -26,3 +26,30 @@ export function getStrokeProps(str) {
|
|
|
26
26
|
export function getFillProps(str) {
|
|
27
27
|
return svgColorProps(str, 'fill', 'fillOpacity');
|
|
28
28
|
}
|
|
29
|
+
// four channels, comma- or slash-separated, so a three-channel `rgb(4,5,6)`
|
|
30
|
+
// never reads its blue as an alpha
|
|
31
|
+
const FUNCTIONAL_ALPHA = /^(?:rgb|hsl)a?\((?:[^,/)]+,){3}\s*([\d.]+)(%?)\s*\)$|^(?:rgb|hsl)a?\([^,/)]+\/\s*([\d.]+)(%?)\s*\)$/i;
|
|
32
|
+
const HEX_ALPHA = /^#(?:[\da-f]{4}|[\da-f]{8})$/i;
|
|
33
|
+
const NOT_SVG_COLOR = /^(?:rgba|hsla?)\(|^transparent$/i;
|
|
34
|
+
/**
|
|
35
|
+
* A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
|
|
36
|
+
* alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
|
|
37
|
+
* drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
|
|
38
|
+
* and `transparent` have to be split before they reach a file. Undefined for a
|
|
39
|
+
* value that is already an SVG color, `none` or a `url()`.
|
|
40
|
+
*/
|
|
41
|
+
export function splitPaintAlpha(value) {
|
|
42
|
+
const m = FUNCTIONAL_ALPHA.exec(value);
|
|
43
|
+
if (!m && !HEX_ALPHA.test(value) && !NOT_SVG_COLOR.test(value)) {
|
|
44
|
+
return undefined;
|
|
45
|
+
}
|
|
46
|
+
const c = parseCssColorOr(value, FALLBACK);
|
|
47
|
+
const digits = m?.[1] ?? m?.[3];
|
|
48
|
+
const percent = (m?.[2] ?? m?.[4]) === '%';
|
|
49
|
+
return {
|
|
50
|
+
color: `rgb(${getRed(c)},${getGreen(c)},${getBlue(c)})`,
|
|
51
|
+
opacity: digits === undefined
|
|
52
|
+
? getAlpha(c) / 255
|
|
53
|
+
: Math.min(1, Number(digits) / (percent ? 100 : 1)),
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the OS asks for a dark UI. False wherever `matchMedia` is missing — a
|
|
3
|
+
* worker, jsdom, node — which is the light theme JBrowse has always started in.
|
|
4
|
+
*/
|
|
5
|
+
export declare function prefersDarkColorScheme(): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Call `listener` whenever the OS preference flips, and return the unsubscribe.
|
|
8
|
+
* Both halves live here rather than beside either caller because the session's
|
|
9
|
+
* `system` theme and the embedding hook `useSessionPalette` are two readers of
|
|
10
|
+
* one preference, and a second spelling of the query is a second answer.
|
|
11
|
+
*/
|
|
12
|
+
export declare function onColorSchemeChange(listener: () => void): () => void;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
const DARK_SCHEME = '(prefers-color-scheme: dark)';
|
|
2
|
+
function darkSchemeQuery() {
|
|
3
|
+
return typeof window !== 'undefined' &&
|
|
4
|
+
typeof window.matchMedia === 'function'
|
|
5
|
+
? window.matchMedia(DARK_SCHEME)
|
|
6
|
+
: undefined;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Whether the OS asks for a dark UI. False wherever `matchMedia` is missing — a
|
|
10
|
+
* worker, jsdom, node — which is the light theme JBrowse has always started in.
|
|
11
|
+
*/
|
|
12
|
+
export function prefersDarkColorScheme() {
|
|
13
|
+
return darkSchemeQuery()?.matches ?? false;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Call `listener` whenever the OS preference flips, and return the unsubscribe.
|
|
17
|
+
* Both halves live here rather than beside either caller because the session's
|
|
18
|
+
* `system` theme and the embedding hook `useSessionPalette` are two readers of
|
|
19
|
+
* one preference, and a second spelling of the query is a second answer.
|
|
20
|
+
*/
|
|
21
|
+
export function onColorSchemeChange(listener) {
|
|
22
|
+
const media = darkSchemeQuery();
|
|
23
|
+
media?.addEventListener('change', listener);
|
|
24
|
+
return () => {
|
|
25
|
+
media?.removeEventListener('change', listener);
|
|
26
|
+
};
|
|
27
|
+
}
|
package/esm/util/tabix.d.ts
CHANGED
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { StatusCallback } from './progress.ts';
|
|
2
|
-
import type { StopToken } from './stopToken.ts';
|
|
3
2
|
/**
|
|
4
3
|
* A raw tabix line paired with the metadata the GFF3/GTF adapters need before
|
|
5
4
|
* parsing: `offset` (the tabix byte offset) mints a stable per-feature id that
|
|
@@ -34,20 +33,26 @@ interface TabixLineSource {
|
|
|
34
33
|
* label, capturing each line's byte offset, indexed start/end, and feature type
|
|
35
34
|
* into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
|
|
36
35
|
*
|
|
37
|
-
* The
|
|
36
|
+
* The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
|
|
38
37
|
* its block reads at the socket instead of downloading them and discarding the
|
|
39
38
|
* lines. @gmod/tabix aborts a block shared between callers only once every
|
|
40
39
|
* joined caller has aborted (`AggregateAbortController`), so this can't cancel a
|
|
41
40
|
* chunk another region still needs.
|
|
42
41
|
*/
|
|
43
|
-
export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback,
|
|
42
|
+
export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback, signal?: AbortSignal): Promise<TabixLine[]>;
|
|
44
43
|
/**
|
|
45
44
|
* Read a region's tabix lines, then — if any feature found there extends past
|
|
46
45
|
* the query — read the overhang on either side, so a parent line's children (a
|
|
47
46
|
* gene's exons, a transcript's CDS) outside the original window are pulled in
|
|
48
|
-
* and the parent/child tree resolves fully.
|
|
49
|
-
*
|
|
50
|
-
*
|
|
47
|
+
* and the parent/child tree resolves fully. `expands` decides which lines widen
|
|
48
|
+
* the bound, so one chromosome-spanning record can't force a whole-chromosome
|
|
49
|
+
* refetch; {@link calculateRedispatchRange} says why that is a predicate.
|
|
50
|
+
*
|
|
51
|
+
* **There is one control, and skipping the expansion is a value of it**: an
|
|
52
|
+
* `expands` that admits nothing reads the query and stops. A caller that wants
|
|
53
|
+
* that says so to its adapter, which is the layer that knows whether its format
|
|
54
|
+
* can honour it — see `Gff3TabixAdapter`, and `GtfTabixAdapter` for a format
|
|
55
|
+
* that cannot.
|
|
51
56
|
*
|
|
52
57
|
* **The flanks, not the union.** Re-reading `[minStart, maxEnd]` returns
|
|
53
58
|
* everything the first read already had — a second full read of the query range
|
|
@@ -76,9 +81,9 @@ export declare function readTabixLinesRedispatched(file: TabixLineSource, query:
|
|
|
76
81
|
refName: string;
|
|
77
82
|
start: number;
|
|
78
83
|
end: number;
|
|
79
|
-
},
|
|
84
|
+
}, expands: (line: TabixLine) => boolean, opts?: {
|
|
80
85
|
statusCallback?: StatusCallback;
|
|
81
|
-
|
|
86
|
+
signal?: AbortSignal;
|
|
82
87
|
}): Promise<TabixLine[]>;
|
|
83
88
|
/**
|
|
84
89
|
* Minimal structural view of the `@gmod/tabix` call a header read needs, kept
|
package/esm/util/tabix.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import { createStatusFanOut, downloadStatus } from './progress.js';
|
|
2
2
|
import { calculateRedispatchRange } from './range.js';
|
|
3
|
-
import { withStopTokenSignal } from './stopToken.js';
|
|
4
3
|
/**
|
|
5
4
|
* Read the feature type (column 3) from a raw GFF3/GTF line without a full
|
|
6
5
|
* split. Used only to classify a line for redispatch.
|
|
@@ -18,15 +17,15 @@ function extractType(line) {
|
|
|
18
17
|
* label, capturing each line's byte offset, indexed start/end, and feature type
|
|
19
18
|
* into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
|
|
20
19
|
*
|
|
21
|
-
* The
|
|
20
|
+
* The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
|
|
22
21
|
* its block reads at the socket instead of downloading them and discarding the
|
|
23
22
|
* lines. @gmod/tabix aborts a block shared between callers only once every
|
|
24
23
|
* joined caller has aborted (`AggregateAbortController`), so this can't cancel a
|
|
25
24
|
* chunk another region still needs.
|
|
26
25
|
*/
|
|
27
|
-
export function readTabixLines(gff, refName, start, end, statusCallback,
|
|
26
|
+
export function readTabixLines(gff, refName, start, end, statusCallback, signal) {
|
|
28
27
|
const lines = [];
|
|
29
|
-
return
|
|
28
|
+
return downloadStatus('Downloading features', statusCallback, onProgress => gff.getLines(refName, start, end, {
|
|
30
29
|
lineCallback: (line, offset, s, e) => {
|
|
31
30
|
lines.push({
|
|
32
31
|
line,
|
|
@@ -38,15 +37,21 @@ export function readTabixLines(gff, refName, start, end, statusCallback, stopTok
|
|
|
38
37
|
},
|
|
39
38
|
onProgress,
|
|
40
39
|
signal,
|
|
41
|
-
}))
|
|
40
|
+
})).then(() => lines);
|
|
42
41
|
}
|
|
43
42
|
/**
|
|
44
43
|
* Read a region's tabix lines, then — if any feature found there extends past
|
|
45
44
|
* the query — read the overhang on either side, so a parent line's children (a
|
|
46
45
|
* gene's exons, a transcript's CDS) outside the original window are pulled in
|
|
47
|
-
* and the parent/child tree resolves fully.
|
|
48
|
-
*
|
|
49
|
-
*
|
|
46
|
+
* and the parent/child tree resolves fully. `expands` decides which lines widen
|
|
47
|
+
* the bound, so one chromosome-spanning record can't force a whole-chromosome
|
|
48
|
+
* refetch; {@link calculateRedispatchRange} says why that is a predicate.
|
|
49
|
+
*
|
|
50
|
+
* **There is one control, and skipping the expansion is a value of it**: an
|
|
51
|
+
* `expands` that admits nothing reads the query and stops. A caller that wants
|
|
52
|
+
* that says so to its adapter, which is the layer that knows whether its format
|
|
53
|
+
* can honour it — see `Gff3TabixAdapter`, and `GtfTabixAdapter` for a format
|
|
54
|
+
* that cannot.
|
|
50
55
|
*
|
|
51
56
|
* **The flanks, not the union.** Re-reading `[minStart, maxEnd]` returns
|
|
52
57
|
* everything the first read already had — a second full read of the query range
|
|
@@ -74,13 +79,13 @@ export function readTabixLines(gff, refName, start, end, statusCallback, stopTok
|
|
|
74
79
|
export async function readTabixLinesRedispatched(file,
|
|
75
80
|
// the region's locus only — kept structural, like TabixLineSource above, so
|
|
76
81
|
// this module stays free of the `types` barrel and its MST models
|
|
77
|
-
query,
|
|
78
|
-
const { statusCallback,
|
|
82
|
+
query, expands, opts = {}) {
|
|
83
|
+
const { statusCallback, signal } = opts;
|
|
79
84
|
// `cb` is not optional: each read decides where it reports, and the flanks
|
|
80
85
|
// report somewhere the first read does not
|
|
81
|
-
const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb,
|
|
86
|
+
const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb, signal);
|
|
82
87
|
const lines = await read(query.start, query.end, statusCallback);
|
|
83
|
-
const redispatch = calculateRedispatchRange(lines,
|
|
88
|
+
const redispatch = calculateRedispatchRange(lines, expands, query.start, query.end);
|
|
84
89
|
if (redispatch) {
|
|
85
90
|
const slot = createStatusFanOut(statusCallback);
|
|
86
91
|
const flanks = await Promise.all([
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { CategoricalScale } from '../ui/colorScale.ts';
|
|
2
|
+
import type { CategoricalField } from './categoricalField.ts';
|
|
3
|
+
/**
|
|
4
|
+
* #api
|
|
5
|
+
* A domain written as strings — the shared `domain` slot is a `stringArray` —
|
|
6
|
+
* read back as the numbers it names. A member that is not a number reads NaN,
|
|
7
|
+
* which every comparison against it declines.
|
|
8
|
+
*/
|
|
9
|
+
export declare function numericDomain(domain: readonly (string | number)[]): number[];
|
|
10
|
+
/**
|
|
11
|
+
* #api
|
|
12
|
+
* A threshold scale's cut points as {@link thresholdIndex} walks them: the
|
|
13
|
+
* numbers the domain names, ascending. Cuts written high to low, as p-value
|
|
14
|
+
* thresholds often are, left the middle interval unreachable, the walk stopping
|
|
15
|
+
* at the first cut a value is under.
|
|
16
|
+
*/
|
|
17
|
+
export declare function thresholdCuts(domain: readonly (string | number)[]): number[];
|
|
18
|
+
/**
|
|
19
|
+
* #api
|
|
20
|
+
* The bin a value falls in: how many of the ascending cut points it is at or
|
|
21
|
+
* past, so a palette with one more entry than the domain paints it as
|
|
22
|
+
* `palette[thresholdIndex(value, domain)]`. A value that is not a number is
|
|
23
|
+
* in no bin and answers -1; an infinite one takes the end bin on its side, as
|
|
24
|
+
* d3's threshold scale places it, so a `-log10` of a zero p-value lands in
|
|
25
|
+
* the top bin.
|
|
26
|
+
*/
|
|
27
|
+
export declare function thresholdIndex(value: unknown, domain: readonly number[]): number;
|
|
28
|
+
/**
|
|
29
|
+
* #api
|
|
30
|
+
* The colour of each interval, in order: the declared palette, and the
|
|
31
|
+
* default categorical palette where it runs out.
|
|
32
|
+
*/
|
|
33
|
+
export declare function thresholdPalette(bins: number, palette?: readonly string[]): string[];
|
|
34
|
+
/**
|
|
35
|
+
* #api
|
|
36
|
+
* What a threshold scale's bins are called in a key, one label per palette
|
|
37
|
+
* entry: `< a` below the first cut, `a – b` between two, `≥ b` past the last.
|
|
38
|
+
*/
|
|
39
|
+
export declare function thresholdLabels(domain: readonly number[]): string[];
|
|
40
|
+
/**
|
|
41
|
+
* #api
|
|
42
|
+
* The key a value holding text that is no number files under on a threshold
|
|
43
|
+
* scale, painted the misconfiguration grey rather than passing for a missing
|
|
44
|
+
* value.
|
|
45
|
+
*/
|
|
46
|
+
export declare const NOT_A_NUMBER_LABEL = "(not a number)";
|
|
47
|
+
/**
|
|
48
|
+
* #api
|
|
49
|
+
* A threshold key's rows: every interval, painted or not, since the bins are
|
|
50
|
+
* the whole domain, then the not-a-number and no-value rows where a feature
|
|
51
|
+
* took one, in the order `thresholdField` sorts them.
|
|
52
|
+
*/
|
|
53
|
+
export declare function thresholdKeyEntries(cuts: readonly number[], range: readonly string[] | undefined, met: {
|
|
54
|
+
missing?: boolean;
|
|
55
|
+
notNumber?: boolean;
|
|
56
|
+
}, names?: readonly string[]): {
|
|
57
|
+
value: string;
|
|
58
|
+
label: string;
|
|
59
|
+
color: string;
|
|
60
|
+
missing?: true;
|
|
61
|
+
}[];
|
|
62
|
+
/**
|
|
63
|
+
* #api
|
|
64
|
+
* The rows a ramp's key lists beside its bar once a feature painted one: the
|
|
65
|
+
* not-a-number and no-value rows a threshold's key ends with. Empty while
|
|
66
|
+
* neither painted.
|
|
67
|
+
*/
|
|
68
|
+
export declare function rampGapScales(id: string, met: {
|
|
69
|
+
missing?: boolean;
|
|
70
|
+
notNumber?: boolean;
|
|
71
|
+
}): CategoricalScale[];
|
|
72
|
+
/**
|
|
73
|
+
* #api
|
|
74
|
+
* Whether a field holds no value at all, as against text that fails to parse:
|
|
75
|
+
* absent, empty, or a VCF's `AF=.`, which arrives as `[undefined]`.
|
|
76
|
+
*/
|
|
77
|
+
export declare function isMissing(value: unknown): boolean;
|
|
78
|
+
/**
|
|
79
|
+
* #api
|
|
80
|
+
* A threshold scale read the way every categorical channel reads its field: a
|
|
81
|
+
* value files under the label of the bin it falls in, a feature with no value
|
|
82
|
+
* under `''`, and text that is no number under {@link NOT_A_NUMBER_LABEL}.
|
|
83
|
+
* The bins are the whole domain, so a key lists each one. `labels` names the
|
|
84
|
+
* bins in a key, one each from the lowest, where a config spells them for a
|
|
85
|
+
* reader; a bin's key stays its interval.
|
|
86
|
+
*/
|
|
87
|
+
export declare function thresholdField(field: string, { domain, range, labels: names, }?: {
|
|
88
|
+
domain?: readonly string[];
|
|
89
|
+
range?: readonly string[];
|
|
90
|
+
labels?: readonly string[];
|
|
91
|
+
}): CategoricalField;
|