@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,275 @@
|
|
|
1
|
+
// The interval `bin` and the `aggregate` behind it as one kernel, which
|
|
2
|
+
// `runSteps` in featureTransforms.ts reaches by relative path only.
|
|
3
|
+
import { readerOf } from './featureTable.js';
|
|
4
|
+
import { isPlainFieldRef } from './fieldReader.js';
|
|
5
|
+
import { isJexl } from './jexlStrings.js';
|
|
6
|
+
import { BIN_OVERLAP_FIELD, DEFAULT_BIN_AS, OpSums, binSize, groupKey, intervalsOf, isWeighted, madeGroups, stepNumberReader, } from './stepTables.js';
|
|
7
|
+
/**
|
|
8
|
+
* The bin's edges and `overlap` a piece carries, where an `aggregate` reads a
|
|
9
|
+
* field off a piece: the row's own field where the bin wrote none. A later
|
|
10
|
+
* entry of the bin's written fields shadows an earlier one of the same name,
|
|
11
|
+
* as the piece table's columns do.
|
|
12
|
+
*/
|
|
13
|
+
const FROM_ROW = 0;
|
|
14
|
+
const FROM_BIN_START = 1;
|
|
15
|
+
const FROM_BIN_END = 2;
|
|
16
|
+
const FROM_OVERLAP = 3;
|
|
17
|
+
function pieceSource(field, [asStart, asEnd]) {
|
|
18
|
+
return field === BIN_OVERLAP_FIELD
|
|
19
|
+
? FROM_OVERLAP
|
|
20
|
+
: field === asEnd
|
|
21
|
+
? FROM_BIN_END
|
|
22
|
+
: field === asStart
|
|
23
|
+
? FROM_BIN_START
|
|
24
|
+
: FROM_ROW;
|
|
25
|
+
}
|
|
26
|
+
function pick(source, row, lo, hi, overlap) {
|
|
27
|
+
return source === FROM_ROW
|
|
28
|
+
? row
|
|
29
|
+
: source === FROM_BIN_START
|
|
30
|
+
? lo
|
|
31
|
+
: source === FROM_BIN_END
|
|
32
|
+
? hi
|
|
33
|
+
: overlap;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Whether an interval `bin` and the `aggregate` behind it run as one kernel:
|
|
37
|
+
* the aggregate groups by the bin's two edges, and every field it reads is a
|
|
38
|
+
* plain name, so a piece's value is its row's or one the bin wrote.
|
|
39
|
+
*/
|
|
40
|
+
export function fusesBinAggregate(bin, agg) {
|
|
41
|
+
const as = bin.as ?? DEFAULT_BIN_AS;
|
|
42
|
+
const groupby = agg.groupby ?? [];
|
|
43
|
+
const plain = (field) => field === undefined || (isPlainFieldRef(field) && !isJexl(field));
|
|
44
|
+
return (bin.fields !== undefined &&
|
|
45
|
+
as[0] !== as[1] &&
|
|
46
|
+
groupby.length === 2 &&
|
|
47
|
+
as.every(edge => groupby.includes(edge)) &&
|
|
48
|
+
as.every(plain) &&
|
|
49
|
+
agg.ops.every(op => plain(op.field) && plain(op.weight)));
|
|
50
|
+
}
|
|
51
|
+
// Beyond this many bins over the pieces a dense bin index costs more than the
|
|
52
|
+
// pieces would, and the two steps run as written.
|
|
53
|
+
const SPARSE_BINS_PER_PIECE = 2;
|
|
54
|
+
const SPARSE_BINS_SLACK = 65536;
|
|
55
|
+
/**
|
|
56
|
+
* An interval `bin` and the `aggregate` grouped by its edges as one walk: each
|
|
57
|
+
* row's bins accumulate straight into their group's sums, with no piece table,
|
|
58
|
+
* the way `binRawRegion` bins a BigWig's raw section. The groups come out in
|
|
59
|
+
* the order the pieces would have met them and each sum adds its pieces in
|
|
60
|
+
* the pieces' order, so the answer is the two steps' to the bit. Undefined
|
|
61
|
+
* where the bins spread too thinly over the region for a dense index.
|
|
62
|
+
*/
|
|
63
|
+
export function binnedAggregate({ table, bounds }, bin, agg) {
|
|
64
|
+
const size = binSize(bin);
|
|
65
|
+
const as = bin.as ?? DEFAULT_BIN_AS;
|
|
66
|
+
const iv = intervalsOf(table, bin.fields, size, bounds);
|
|
67
|
+
const { lowBin, highBin } = iv;
|
|
68
|
+
const sections = bounds.length - 1;
|
|
69
|
+
// Each section's bins from its lowest, at `offset[s]` in one index.
|
|
70
|
+
const offset = new Float64Array(sections + 1);
|
|
71
|
+
for (let s = 0; s < sections; s++) {
|
|
72
|
+
const span = highBin[s] - lowBin[s] + 1;
|
|
73
|
+
offset[s + 1] = offset[s] + (span > 0 ? span : 0);
|
|
74
|
+
}
|
|
75
|
+
const spans = offset[sections];
|
|
76
|
+
if (spans > SPARSE_BINS_PER_PIECE * iv.pieces + SPARSE_BINS_SLACK) {
|
|
77
|
+
return undefined;
|
|
78
|
+
}
|
|
79
|
+
const capacity = Math.min(spans, iv.pieces);
|
|
80
|
+
const groupOfBin = new Int32Array(spans).fill(-1);
|
|
81
|
+
const groupRow = new Uint32Array(capacity);
|
|
82
|
+
const groupBin = new Float64Array(capacity);
|
|
83
|
+
const groupSection = new Uint32Array(capacity);
|
|
84
|
+
const start = new Float64Array(capacity);
|
|
85
|
+
const end = new Float64Array(capacity);
|
|
86
|
+
const startSource = pieceSource('start', as);
|
|
87
|
+
const endSource = pieceSource('end', as);
|
|
88
|
+
// A group's extent is its bin's where the pieces' start and end are the
|
|
89
|
+
// bin's edges, the least and greatest of its pieces' otherwise.
|
|
90
|
+
const binExtent = startSource === FROM_BIN_START && endSource === FROM_BIN_END;
|
|
91
|
+
const readRowStart = readerOf(table.column('start'));
|
|
92
|
+
const readRowEnd = readerOf(table.column('end'));
|
|
93
|
+
const groups = numberGroups({ iv, bounds, size, lowBin, offset, groupOfBin }, { groupRow, groupBin, groupSection, start, end }, binExtent
|
|
94
|
+
? undefined
|
|
95
|
+
: { startSource, endSource, readRowStart, readRowEnd });
|
|
96
|
+
const walk = { iv, bounds, size, lowBin, offset, groupOfBin };
|
|
97
|
+
const ops = agg.ops.map(op => {
|
|
98
|
+
const sums = new OpSums(op, groups);
|
|
99
|
+
const valueSource = op.op === 'count' || op.field === undefined
|
|
100
|
+
? undefined
|
|
101
|
+
: pieceSource(op.field, as);
|
|
102
|
+
const weightSource = op.weight !== undefined && isWeighted(op)
|
|
103
|
+
? pieceSource(op.weight, as)
|
|
104
|
+
: undefined;
|
|
105
|
+
const rowNumbers = (field, source) => field !== undefined && source === FROM_ROW
|
|
106
|
+
? stepNumberReader(table, field, 'an aggregate')
|
|
107
|
+
: undefined;
|
|
108
|
+
const readValue = rowNumbers(op.field, valueSource);
|
|
109
|
+
const readWeight = rowNumbers(op.weight, weightSource);
|
|
110
|
+
if ((valueSource === undefined || readValue) &&
|
|
111
|
+
(weightSource === undefined ||
|
|
112
|
+
readWeight ||
|
|
113
|
+
weightSource === FROM_OVERLAP)) {
|
|
114
|
+
addByRow(walk, sums, readValue, readWeight, weightSource === FROM_OVERLAP);
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
addByPiece(walk, sums, valueSource, weightSource, readValue, readWeight);
|
|
118
|
+
}
|
|
119
|
+
return sums.column(groups);
|
|
120
|
+
});
|
|
121
|
+
// A field's value on each group's first piece.
|
|
122
|
+
const each = (field) => {
|
|
123
|
+
const source = pieceSource(field, as);
|
|
124
|
+
const read = readerOf(table.column(field));
|
|
125
|
+
const out = new Array(groups);
|
|
126
|
+
for (let g = 0; g < groups; g++) {
|
|
127
|
+
const i = groupRow[g];
|
|
128
|
+
const lo = groupBin[g] * size;
|
|
129
|
+
const hi = lo + size;
|
|
130
|
+
out[g] =
|
|
131
|
+
source === FROM_ROW
|
|
132
|
+
? read(i)
|
|
133
|
+
: pick(source, 0, lo, hi, Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo));
|
|
134
|
+
}
|
|
135
|
+
return out;
|
|
136
|
+
};
|
|
137
|
+
return madeGroups({
|
|
138
|
+
groups,
|
|
139
|
+
keys: (agg.groupby ?? []).map((field) => [
|
|
140
|
+
field,
|
|
141
|
+
each(field).map(groupKey),
|
|
142
|
+
]),
|
|
143
|
+
ops,
|
|
144
|
+
step: agg,
|
|
145
|
+
refNames: each('refName'),
|
|
146
|
+
start: start.slice(0, groups),
|
|
147
|
+
end: end.slice(0, groups),
|
|
148
|
+
sectionOf: groupSection,
|
|
149
|
+
sections: bounds.length,
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Each bin's group, numbered in the order the pieces meet them, with the
|
|
154
|
+
* first piece's row, the bin and the section, and each group's extent: its
|
|
155
|
+
* bin's, or the least start and greatest end its pieces read where `extent`
|
|
156
|
+
* says where they read them. Answers how many groups there are.
|
|
157
|
+
*/
|
|
158
|
+
function numberGroups({ iv, bounds, size, lowBin, offset, groupOfBin }, out, extent) {
|
|
159
|
+
const { groupRow, groupBin, groupSection, start, end } = out;
|
|
160
|
+
let groups = 0;
|
|
161
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
162
|
+
const base = offset[s] - lowBin[s];
|
|
163
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
164
|
+
const first = iv.first[i];
|
|
165
|
+
if (Number.isNaN(first)) {
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const last = iv.last[i];
|
|
169
|
+
for (let b = first; b <= last; b++) {
|
|
170
|
+
let g = groupOfBin[base + b];
|
|
171
|
+
if (g < 0) {
|
|
172
|
+
g = groups++;
|
|
173
|
+
groupOfBin[base + b] = g;
|
|
174
|
+
groupRow[g] = i;
|
|
175
|
+
groupBin[g] = b;
|
|
176
|
+
groupSection[g] = s;
|
|
177
|
+
start[g] = b * size;
|
|
178
|
+
end[g] = b * size + size;
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
if (extent) {
|
|
184
|
+
start.fill(Infinity);
|
|
185
|
+
end.fill(-Infinity);
|
|
186
|
+
const { startSource, endSource, readRowStart, readRowEnd } = extent;
|
|
187
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
188
|
+
const base = offset[s] - lowBin[s];
|
|
189
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
190
|
+
const first = iv.first[i];
|
|
191
|
+
if (Number.isNaN(first)) {
|
|
192
|
+
continue;
|
|
193
|
+
}
|
|
194
|
+
const ownStart = readRowStart(i);
|
|
195
|
+
const ownEnd = readRowEnd(i);
|
|
196
|
+
for (let b = first; b <= iv.last[i]; b++) {
|
|
197
|
+
const g = groupOfBin[base + b];
|
|
198
|
+
const lo = b * size;
|
|
199
|
+
const hi = lo + size;
|
|
200
|
+
const overlap = Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo);
|
|
201
|
+
start[g] = Math.min(start[g], pick(startSource, ownStart, lo, hi, overlap));
|
|
202
|
+
end[g] = Math.max(end[g], pick(endSource, ownEnd, lo, hi, overlap));
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
return groups;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* One op's sums where its value is its row's and its weight its row's, its
|
|
211
|
+
* piece's overlap or none: a row whose value or weight is not a number adds
|
|
212
|
+
* nothing to any bin, so it is skipped whole. A piece's overlap is always a
|
|
213
|
+
* number, since the row's ends are.
|
|
214
|
+
*/
|
|
215
|
+
function addByRow({ iv, bounds, size, lowBin, offset, groupOfBin }, { sum, weight, min, max, op }, readValue, readWeight, byOverlap) {
|
|
216
|
+
const readsValue = op !== 'count';
|
|
217
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
218
|
+
const base = offset[s] - lowBin[s];
|
|
219
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
220
|
+
const first = iv.first[i];
|
|
221
|
+
const v = readValue ? readValue(i) : Number.NaN;
|
|
222
|
+
const rowWeight = readWeight ? readWeight(i) : 1;
|
|
223
|
+
if (Number.isNaN(first) ||
|
|
224
|
+
(readsValue && !Number.isFinite(v)) ||
|
|
225
|
+
!Number.isFinite(rowWeight)) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
const rowS = iv.start[i];
|
|
229
|
+
const rowE = iv.end[i];
|
|
230
|
+
const last = iv.last[i];
|
|
231
|
+
for (let b = first; b <= last; b++) {
|
|
232
|
+
const g = groupOfBin[base + b];
|
|
233
|
+
const lo = b * size;
|
|
234
|
+
const w = byOverlap
|
|
235
|
+
? Math.min(rowE, lo + size) - Math.max(rowS, lo)
|
|
236
|
+
: rowWeight;
|
|
237
|
+
weight[g] += w;
|
|
238
|
+
if (readsValue) {
|
|
239
|
+
sum[g] += v * w;
|
|
240
|
+
if (v < min[g]) {
|
|
241
|
+
min[g] = v;
|
|
242
|
+
}
|
|
243
|
+
if (v > max[g]) {
|
|
244
|
+
max[g] = v;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/** One op's sums where its value or weight is a field the bin wrote. */
|
|
252
|
+
function addByPiece({ iv, bounds, size, lowBin, offset, groupOfBin }, sums, valueSource, weightSource, readValue, readWeight) {
|
|
253
|
+
for (let s = 0; s + 1 < bounds.length; s++) {
|
|
254
|
+
const base = offset[s] - lowBin[s];
|
|
255
|
+
for (let i = bounds[s]; i < bounds[s + 1]; i++) {
|
|
256
|
+
const first = iv.first[i];
|
|
257
|
+
if (Number.isNaN(first)) {
|
|
258
|
+
continue;
|
|
259
|
+
}
|
|
260
|
+
const rowV = readValue ? readValue(i) : Number.NaN;
|
|
261
|
+
const rowW = readWeight ? readWeight(i) : 1;
|
|
262
|
+
const last = iv.last[i];
|
|
263
|
+
for (let b = first; b <= last; b++) {
|
|
264
|
+
const lo = b * size;
|
|
265
|
+
const hi = lo + size;
|
|
266
|
+
const overlap = Math.min(iv.end[i], hi) - Math.max(iv.start[i], lo);
|
|
267
|
+
sums.add(groupOfBin[base + b], valueSource === undefined
|
|
268
|
+
? Number.NaN
|
|
269
|
+
: pick(valueSource, rowV, lo, hi, overlap), weightSource === undefined
|
|
270
|
+
? 1
|
|
271
|
+
: pick(weightSource, rowW, lo, hi, overlap));
|
|
272
|
+
}
|
|
273
|
+
}
|
|
274
|
+
}
|
|
275
|
+
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { SharedBudget } from '@gmod/shared-read-cache';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
-
* which is the scope that actually runs out of memory.
|
|
3
|
+
* The ceiling on what the indexed-format libraries retain, shared by every
|
|
4
|
+
* adapter in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
+
* thread, which is the scope that actually runs out of memory.
|
|
6
6
|
*
|
|
7
|
-
* ## Why
|
|
7
|
+
* ## Why this is not per file
|
|
8
8
|
*
|
|
9
9
|
* `@gmod/bam`, `@gmod/tabix` and `@gmod/cram` each take a per-file budget,
|
|
10
10
|
* sized so that a single track panning never falls off the cliff where a cache
|
|
@@ -29,24 +29,27 @@ import { SharedBudget } from '@gmod/shared-read-cache';
|
|
|
29
29
|
* at hand their space to the one being panned, so the active track keeps a
|
|
30
30
|
* whole working set however many are open.
|
|
31
31
|
*
|
|
32
|
-
* ## The
|
|
32
|
+
* ## The number is not new
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
34
|
+
* 1 GB is the libraries' own per-file default (`DEFAULT_MAX_CACHE_BYTES` in
|
|
35
|
+
* both `@gmod/bam` and `@gmod/cram`), moved from per-file to per-context. That
|
|
36
|
+
* makes this a strict tightening — retention can only fall — and avoids
|
|
37
|
+
* inventing a number that would need its own justification. With one file open
|
|
38
|
+
* the two ceilings coincide; from the second file on, this one is the one that
|
|
39
|
+
* binds. The budget still has to clear one query's working set or the cliff
|
|
40
|
+
* returns, and on that workload 512 MB shared across three tracks already cost
|
|
41
|
+
* 43 refills where 1 GB cost 4.
|
|
40
42
|
*
|
|
41
|
-
* ##
|
|
43
|
+
* ## One budget, because every member weighs bytes
|
|
42
44
|
*
|
|
43
45
|
* `SharedBudget.total` is a sum over its members, so they must all weigh in the
|
|
44
|
-
* same unit
|
|
45
|
-
* `@gmod/
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* same unit, and `sizeOf` is opaque, so nothing could catch a mismatch at
|
|
47
|
+
* runtime. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes, and since 14
|
|
48
|
+
* `@gmod/cram` weighs a decoded slice by `DecodedSlice.byteLength` — its typed
|
|
49
|
+
* columns exactly and its strings by estimate, within 1–8% of the measured heap
|
|
50
|
+
* (its ADR 0013). Before that a CRAM slice weighed its record count, which is
|
|
51
|
+
* why this used to be two budgets named for their units: a million records
|
|
52
|
+
* could not be added to bytes, and never bound long-read data either, where a
|
|
53
|
+
* 6 MB slice counted as 37.
|
|
49
54
|
*/
|
|
50
55
|
export declare const decompressedBytesBudget: SharedBudget;
|
|
51
|
-
/** See {@link decompressedBytesBudget}. Records, not bytes — CRAM only. */
|
|
52
|
-
export declare const decodedRecordsBudget: SharedBudget;
|
package/esm/util/cacheBudgets.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { SharedBudget } from '@gmod/shared-read-cache';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
4
|
-
* in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
-
* which is the scope that actually runs out of memory.
|
|
3
|
+
* The ceiling on what the indexed-format libraries retain, shared by every
|
|
4
|
+
* adapter in this JS context — so one per RPC worker, plus one on the main
|
|
5
|
+
* thread, which is the scope that actually runs out of memory.
|
|
6
6
|
*
|
|
7
|
-
* ## Why
|
|
7
|
+
* ## Why this is not per file
|
|
8
8
|
*
|
|
9
9
|
* `@gmod/bam`, `@gmod/tabix` and `@gmod/cram` each take a per-file budget,
|
|
10
10
|
* sized so that a single track panning never falls off the cliff where a cache
|
|
@@ -29,24 +29,27 @@ import { SharedBudget } from '@gmod/shared-read-cache';
|
|
|
29
29
|
* at hand their space to the one being panned, so the active track keeps a
|
|
30
30
|
* whole working set however many are open.
|
|
31
31
|
*
|
|
32
|
-
* ## The
|
|
32
|
+
* ## The number is not new
|
|
33
33
|
*
|
|
34
|
-
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
*
|
|
39
|
-
*
|
|
34
|
+
* 1 GB is the libraries' own per-file default (`DEFAULT_MAX_CACHE_BYTES` in
|
|
35
|
+
* both `@gmod/bam` and `@gmod/cram`), moved from per-file to per-context. That
|
|
36
|
+
* makes this a strict tightening — retention can only fall — and avoids
|
|
37
|
+
* inventing a number that would need its own justification. With one file open
|
|
38
|
+
* the two ceilings coincide; from the second file on, this one is the one that
|
|
39
|
+
* binds. The budget still has to clear one query's working set or the cliff
|
|
40
|
+
* returns, and on that workload 512 MB shared across three tracks already cost
|
|
41
|
+
* 43 refills where 1 GB cost 4.
|
|
40
42
|
*
|
|
41
|
-
* ##
|
|
43
|
+
* ## One budget, because every member weighs bytes
|
|
42
44
|
*
|
|
43
45
|
* `SharedBudget.total` is a sum over its members, so they must all weigh in the
|
|
44
|
-
* same unit
|
|
45
|
-
* `@gmod/
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
46
|
+
* same unit, and `sizeOf` is opaque, so nothing could catch a mismatch at
|
|
47
|
+
* runtime. `@gmod/bam` and `@gmod/tabix` weigh decompressed bytes, and since 14
|
|
48
|
+
* `@gmod/cram` weighs a decoded slice by `DecodedSlice.byteLength` — its typed
|
|
49
|
+
* columns exactly and its strings by estimate, within 1–8% of the measured heap
|
|
50
|
+
* (its ADR 0013). Before that a CRAM slice weighed its record count, which is
|
|
51
|
+
* why this used to be two budgets named for their units: a million records
|
|
52
|
+
* could not be added to bytes, and never bound long-read data either, where a
|
|
53
|
+
* 6 MB slice counted as 37.
|
|
49
54
|
*/
|
|
50
55
|
export const decompressedBytesBudget = new SharedBudget(1024 * 2 ** 20);
|
|
51
|
-
/** See {@link decompressedBytesBudget}. Records, not bytes — CRAM only. */
|
|
52
|
-
export const decodedRecordsBudget = new SharedBudget(1_000_000);
|
|
@@ -17,7 +17,7 @@ type OnProgress = (current: number, total?: number) => void;
|
|
|
17
17
|
* moment that fetch was superseded — the display's latest-wins guard gates the
|
|
18
18
|
* old callback off — so the fetch replacing it awaited a multi-GB parse behind
|
|
19
19
|
* a blank loading overlay.
|
|
20
|
-
* - **`
|
|
20
|
+
* - **`signal` is withheld from the shared work.** Honoring one caller's
|
|
21
21
|
* cancel would abort a parse the caller replacing it is already waiting on,
|
|
22
22
|
* and reject them both. A superseded fetch just stops listening. Cancellation
|
|
23
23
|
* stays with the per-call work (indexed range queries), which no one else is
|
package/esm/util/cachedSetup.js
CHANGED
|
@@ -15,7 +15,7 @@ import { downloadStatus } from './progress.js';
|
|
|
15
15
|
* moment that fetch was superseded — the display's latest-wins guard gates the
|
|
16
16
|
* old callback off — so the fetch replacing it awaited a multi-GB parse behind
|
|
17
17
|
* a blank loading overlay.
|
|
18
|
-
* - **`
|
|
18
|
+
* - **`signal` is withheld from the shared work.** Honoring one caller's
|
|
19
19
|
* cancel would abort a parse the caller replacing it is already waiting on,
|
|
20
20
|
* and reject them both. A superseded fetch just stops listening. Cancellation
|
|
21
21
|
* stays with the per-call work (indexed range queries), which no one else is
|
|
@@ -39,7 +39,7 @@ export function cachedSetup({ setup, label, }) {
|
|
|
39
39
|
const run = (opts, onProgress) => {
|
|
40
40
|
cached ??= setup({
|
|
41
41
|
...opts,
|
|
42
|
-
|
|
42
|
+
signal: undefined,
|
|
43
43
|
statusCallback: status => {
|
|
44
44
|
for (const cb of waiting) {
|
|
45
45
|
cb(status);
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/** #api */
|
|
2
|
+
export declare const STRAND_FIELD = "strand";
|
|
3
|
+
/**
|
|
4
|
+
* #api
|
|
5
|
+
* The structural-variant class `svClassOf` names. A VCF record and a BEDPE
|
|
6
|
+
* row carry it, and the mark display's `mate` step writes it per allele.
|
|
7
|
+
*/
|
|
8
|
+
export declare const SV_TYPE_FIELD = "svType";
|
|
9
|
+
/**
|
|
10
|
+
* #api
|
|
11
|
+
* The row a feature with nothing in a categorical field lands on, so a key
|
|
12
|
+
* says why a mark is grey rather than listing a blank value.
|
|
13
|
+
*/
|
|
14
|
+
export declare const NO_VALUE_LABEL = "(no value)";
|
|
15
|
+
/**
|
|
16
|
+
* #api
|
|
17
|
+
* One categorical field as every channel reads it — a facet's sections, a
|
|
18
|
+
* color's range entries, a key's rows. `key` files a value, `compare`
|
|
19
|
+
* orders keys (the `domain` first, the rest by `compareGroupKeys`, `''`
|
|
20
|
+
* after them), `label` names a key in a legend, `sectionLabel` on a chip, and
|
|
21
|
+
* `color` paints it. A key's color depends only on the key and the
|
|
22
|
+
* declaration, so every region agrees on it.
|
|
23
|
+
*/
|
|
24
|
+
export interface CategoricalField {
|
|
25
|
+
field: string;
|
|
26
|
+
/** The declared order, or the field's own where none is declared. */
|
|
27
|
+
domain: readonly string[];
|
|
28
|
+
/**
|
|
29
|
+
* Every key a value can file under is in `domain`, as a threshold scale's
|
|
30
|
+
* bins are, so a key lists all of them whether or not anything painted one.
|
|
31
|
+
*/
|
|
32
|
+
closed?: boolean;
|
|
33
|
+
key: (value: unknown) => string;
|
|
34
|
+
compare: (a: string, b: string) => number;
|
|
35
|
+
label: (key: string) => string;
|
|
36
|
+
sectionLabel: (key: string) => string;
|
|
37
|
+
color: (key: string) => string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* #api
|
|
41
|
+
* What a key names each of `keys`, from a colour object's `labels`: one each in
|
|
42
|
+
* order, an empty or missing entry leaving that key its own name. Every key
|
|
43
|
+
* that takes `labels` reads them through this, so a config means one thing by
|
|
44
|
+
* them everywhere.
|
|
45
|
+
*/
|
|
46
|
+
export declare function keyNames(keys: readonly unknown[], labels?: readonly string[]): ReadonlyMap<string, string>;
|
|
47
|
+
/**
|
|
48
|
+
* #api
|
|
49
|
+
* `labels` names the `domain`'s values in a key, one each in order, where a
|
|
50
|
+
* config spells them for a reader rather than as the data does.
|
|
51
|
+
*/
|
|
52
|
+
export declare function categoricalField(field: string, { domain, range, labels, }?: {
|
|
53
|
+
domain?: readonly string[];
|
|
54
|
+
range?: readonly string[];
|
|
55
|
+
labels?: readonly string[];
|
|
56
|
+
}): CategoricalField;
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { categoricalColorScale } from '../ui/colors.js';
|
|
2
|
+
import { NO_CATEGORY_COLOR } from './color/index.js';
|
|
3
|
+
import { universalPresetOf } from './colorScale.js';
|
|
4
|
+
import { groupKeyComparator, valueText } from './groupKeys.js';
|
|
5
|
+
/** #api */
|
|
6
|
+
export const STRAND_FIELD = 'strand';
|
|
7
|
+
/**
|
|
8
|
+
* #api
|
|
9
|
+
* The structural-variant class `svClassOf` names. A VCF record and a BEDPE
|
|
10
|
+
* row carry it, and the mark display's `mate` step writes it per allele.
|
|
11
|
+
*/
|
|
12
|
+
export const SV_TYPE_FIELD = 'svType';
|
|
13
|
+
/**
|
|
14
|
+
* #api
|
|
15
|
+
* The row a feature with nothing in a categorical field lands on, so a key
|
|
16
|
+
* says why a mark is grey rather than listing a blank value.
|
|
17
|
+
*/
|
|
18
|
+
export const NO_VALUE_LABEL = '(no value)';
|
|
19
|
+
/**
|
|
20
|
+
* #api
|
|
21
|
+
* What a key names each of `keys`, from a colour object's `labels`: one each in
|
|
22
|
+
* order, an empty or missing entry leaving that key its own name. Every key
|
|
23
|
+
* that takes `labels` reads them through this, so a config means one thing by
|
|
24
|
+
* them everywhere.
|
|
25
|
+
*/
|
|
26
|
+
export function keyNames(keys, labels = []) {
|
|
27
|
+
const names = new Map();
|
|
28
|
+
keys.forEach((key, i) => {
|
|
29
|
+
const name = labels[i];
|
|
30
|
+
const text = String(key);
|
|
31
|
+
if (name && !names.has(text)) {
|
|
32
|
+
names.set(text, name);
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return names;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* #api
|
|
39
|
+
* `labels` names the `domain`'s values in a key, one each in order, where a
|
|
40
|
+
* config spells them for a reader rather than as the data does.
|
|
41
|
+
*/
|
|
42
|
+
export function categoricalField(field, { domain = [], range = [], labels = [], } = {}) {
|
|
43
|
+
// a field with a vocabulary of its own reads it on every channel, a facet's
|
|
44
|
+
// sections as well as a colour's key
|
|
45
|
+
const vocabulary = universalPresetOf(field);
|
|
46
|
+
const ownOrder = vocabulary?.domain ?? [];
|
|
47
|
+
const order = domain.length > 0 ? domain : ownOrder;
|
|
48
|
+
const [paired, colors] = range.length > 0 || !vocabulary
|
|
49
|
+
? [order, range]
|
|
50
|
+
: [ownOrder, vocabulary.range ?? []];
|
|
51
|
+
const declared = keyNames(order, labels);
|
|
52
|
+
const own = vocabulary && keyNames(ownOrder, vocabulary.labels);
|
|
53
|
+
const named = (key) => declared.get(key) ?? own?.get(key);
|
|
54
|
+
let colorOf;
|
|
55
|
+
return {
|
|
56
|
+
field,
|
|
57
|
+
domain: order,
|
|
58
|
+
key: value => {
|
|
59
|
+
const key = valueText(value);
|
|
60
|
+
return key === '' ? (vocabulary?.missing ?? key) : key;
|
|
61
|
+
},
|
|
62
|
+
compare: groupKeyComparator(order),
|
|
63
|
+
label: key => named(key) ?? (key === '' ? NO_VALUE_LABEL : key),
|
|
64
|
+
sectionLabel: key => named(key) ?? `${field}: ${key === '' ? 'none' : key}`,
|
|
65
|
+
color: key => {
|
|
66
|
+
if (key === '') {
|
|
67
|
+
return NO_CATEGORY_COLOR;
|
|
68
|
+
}
|
|
69
|
+
colorOf ??= categoricalColorScale(paired, colors);
|
|
70
|
+
return colorOf(key);
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
@@ -24,3 +24,20 @@ export declare function clampToContig(assembly: Assembly, region: {
|
|
|
24
24
|
start: number;
|
|
25
25
|
end: number;
|
|
26
26
|
}): Region | undefined;
|
|
27
|
+
/**
|
|
28
|
+
* `clampToContig` for a refName that may not be on the assembly at all, which
|
|
29
|
+
* is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
|
|
30
|
+
* SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
|
|
31
|
+
* unknown name through with nothing to clamp against, so it cannot tell "past
|
|
32
|
+
* the end of a contig we have" from "a contig we do not have", and both callers
|
|
33
|
+
* need that apart to say which happened.
|
|
34
|
+
*/
|
|
35
|
+
export declare function clampToListedContig(assembly: Assembly, region: {
|
|
36
|
+
refName: string;
|
|
37
|
+
start: number;
|
|
38
|
+
end: number;
|
|
39
|
+
}): {
|
|
40
|
+
refName: string;
|
|
41
|
+
onAssembly: boolean;
|
|
42
|
+
region: Region | undefined;
|
|
43
|
+
};
|
|
@@ -26,3 +26,22 @@ export function clampToContig(assembly, region) {
|
|
|
26
26
|
? { ...region, assemblyName: assembly.name, refName, start, end }
|
|
27
27
|
: undefined;
|
|
28
28
|
}
|
|
29
|
+
/**
|
|
30
|
+
* `clampToContig` for a refName that may not be on the assembly at all, which
|
|
31
|
+
* is the shape a location nobody requested arrives in — a BAM's `nextRef`, an
|
|
32
|
+
* SA record's contig (REFNAME_NAMESPACES.md). `clampToContig` alone passes an
|
|
33
|
+
* unknown name through with nothing to clamp against, so it cannot tell "past
|
|
34
|
+
* the end of a contig we have" from "a contig we do not have", and both callers
|
|
35
|
+
* need that apart to say which happened.
|
|
36
|
+
*/
|
|
37
|
+
export function clampToListedContig(assembly, region) {
|
|
38
|
+
const refName = assembly.getCanonicalRefName2(region.refName);
|
|
39
|
+
const onAssembly = assembly.getRegionForRefName(refName) !== undefined;
|
|
40
|
+
return {
|
|
41
|
+
refName,
|
|
42
|
+
onAssembly,
|
|
43
|
+
region: onAssembly
|
|
44
|
+
? clampToContig(assembly, { ...region, refName })
|
|
45
|
+
: undefined,
|
|
46
|
+
};
|
|
47
|
+
}
|
|
@@ -1,5 +1,4 @@
|
|
|
1
|
-
// not a sanitizer, this just removes html tags
|
|
2
|
-
// element width calculations
|
|
1
|
+
// not a sanitizer, this just removes html tags where only the text is shown
|
|
3
2
|
export function coarseStripHTML(s) {
|
|
4
3
|
return s.replaceAll(/<[^<>]*>/g, '');
|
|
5
4
|
}
|
|
@@ -20,7 +20,9 @@ export declare function emphasize(color: string, coefficient?: number): string;
|
|
|
20
20
|
* default refName colors.
|
|
21
21
|
*/
|
|
22
22
|
export declare function makeContrasting(foreground: string, background?: string, minContrastRatio?: number): string;
|
|
23
|
-
export { isNamedColor, namedColorToHex } from './cssColorsLevel4.ts';
|
|
23
|
+
export { CSS_COLOR_NAMES, isNamedColor, namedColorToHex, } from './cssColorsLevel4.ts';
|
|
24
|
+
export declare const NO_CATEGORY_COLOR = "#afafaf";
|
|
25
|
+
export declare const MISCONFIGURED_COLOR = "#808080";
|
|
24
26
|
/**
|
|
25
27
|
* #api
|
|
26
28
|
* Move a color's OKLCH lightness by `lightnessShift` and scale its chroma,
|
|
@@ -69,8 +71,8 @@ export declare function relight(color: string, lightnessShift: number, chromaSca
|
|
|
69
71
|
*
|
|
70
72
|
* A value that is absent gets NO_CATEGORY_COLOR rather than a hue, and that is
|
|
71
73
|
* the difference between this being usable on real data and not. The everyday
|
|
72
|
-
* caller is
|
|
73
|
-
*
|
|
74
|
+
* caller is a `jexl:randomColor(get(feature,'<attr>'))` color slot over a
|
|
75
|
+
* whole track — and most files
|
|
74
76
|
* have the attribute on some features and not others, so most of the time this
|
|
75
77
|
* is handed `undefined`. It used to throw on that (`str.length` of undefined),
|
|
76
78
|
* once per feature, and what a reader saw was every unlabelled feature in one
|