@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
package/esm/util/SvgCanvas.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { measureText as measureTextWidth } from './measureText.js';
|
|
2
|
+
import { splitPaintAlpha } from './svgColorProps.js';
|
|
2
3
|
const XML_ESCAPES = {
|
|
3
4
|
'&': '&',
|
|
4
5
|
'<': '<',
|
|
@@ -29,14 +30,16 @@ function parseFont(font) {
|
|
|
29
30
|
// SVG-compatible attributes. The default sans-serif family is left off so
|
|
30
31
|
// feature labels match the raw-JSX <text> elements (ruler, scalebar, etc.),
|
|
31
32
|
// which set no family either; an explicitly-set family is still emitted.
|
|
32
|
-
function fontAttrs(font) {
|
|
33
|
+
function fontAttrs(font, scale) {
|
|
33
34
|
const { prefix, size, family } = parseFont(font);
|
|
34
35
|
const tokens = prefix.split(/\s+/).filter(Boolean);
|
|
35
36
|
const weight = tokens.find(t => fontWeightTokens.has(t) || /^\d{1,4}$/.test(t));
|
|
36
37
|
const style = tokens.find(t => fontStyleTokens.has(t));
|
|
37
38
|
return [
|
|
38
|
-
` font-size="${size}"`,
|
|
39
|
-
family === '' || family === 'sans-serif'
|
|
39
|
+
` font-size="${Number(size) * scale}"`,
|
|
40
|
+
family === '' || family === 'sans-serif'
|
|
41
|
+
? ''
|
|
42
|
+
: ` font-family="${escapeXml(family)}"`,
|
|
40
43
|
weight ? ` font-weight="${weight}"` : '',
|
|
41
44
|
style ? ` font-style="${style}"` : '',
|
|
42
45
|
].join('');
|
|
@@ -47,25 +50,34 @@ function fontAttrs(font) {
|
|
|
47
50
|
// mint `svgcanvas-clip-0`, whereupon `url(#svgcanvas-clip-0)` resolves to the
|
|
48
51
|
// first and every later layer is clipped to some other layer's rect.
|
|
49
52
|
//
|
|
50
|
-
// Document-global, not process-global: `
|
|
53
|
+
// Document-global, not process-global: `withFreshSvgClipIds` below.
|
|
51
54
|
let clipIdCounter = 0;
|
|
52
55
|
/**
|
|
53
|
-
*
|
|
56
|
+
* Run `render` as one document's clip-id numbering run, starting at 0, then put
|
|
57
|
+
* the counter back.
|
|
54
58
|
*
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
59
|
-
* that aren't real, and `jest -t` on any export test but the first fails its
|
|
60
|
-
* checked-in snapshot with a diff that is nothing but renumbering.
|
|
59
|
+
* Starting at 0 is what makes the same view export to the same bytes: a counter
|
|
60
|
+
* left running numbers each export from wherever the previous one stopped, so
|
|
61
|
+
* diffing two saved SVGs shows changes that aren't real and `jest -t` on any
|
|
62
|
+
* export test but the first fails its snapshot on renumbering alone.
|
|
61
63
|
*
|
|
62
|
-
*
|
|
63
|
-
* `
|
|
64
|
-
*
|
|
65
|
-
*
|
|
64
|
+
* Putting it back is what keeps a file export from renumbering the page: live
|
|
65
|
+
* figures (`useViewSvgFigure`) mint from the same counter into one DOM, where
|
|
66
|
+
* ids must not repeat, so a reset that stuck would let the next figure reuse an
|
|
67
|
+
* id another figure still points at.
|
|
68
|
+
*
|
|
69
|
+
* `render` must be synchronous — an `await` inside it would let two documents
|
|
70
|
+
* share a numbering run.
|
|
66
71
|
*/
|
|
67
|
-
export function
|
|
72
|
+
export function withFreshSvgClipIds(render) {
|
|
73
|
+
const saved = clipIdCounter;
|
|
68
74
|
clipIdCounter = 0;
|
|
75
|
+
try {
|
|
76
|
+
return render();
|
|
77
|
+
}
|
|
78
|
+
finally {
|
|
79
|
+
clipIdCounter = saved;
|
|
80
|
+
}
|
|
69
81
|
}
|
|
70
82
|
export class SvgCanvas {
|
|
71
83
|
parts = [];
|
|
@@ -115,6 +127,13 @@ export class SvgCanvas {
|
|
|
115
127
|
get axisAligned() {
|
|
116
128
|
return this.b === 0 && this.c === 0;
|
|
117
129
|
}
|
|
130
|
+
// How much the CTM scales a length, for what SVG draws at a size of its own
|
|
131
|
+
// rather than through transformed coordinates: stroke widths, dashes and
|
|
132
|
+
// font sizes. Exact for a uniform scale; the geometric mean otherwise, where
|
|
133
|
+
// a Canvas2D pen would draw an ellipse no stroke-width can state.
|
|
134
|
+
get lengthScale() {
|
|
135
|
+
return Math.sqrt(Math.abs(this.a * this.d - this.b * this.c));
|
|
136
|
+
}
|
|
118
137
|
transformPoint(x, y) {
|
|
119
138
|
return [this.a * x + this.c * y + this.e, this.b * x + this.d * y + this.f];
|
|
120
139
|
}
|
|
@@ -170,23 +189,20 @@ export class SvgCanvas {
|
|
|
170
189
|
? 'end'
|
|
171
190
|
: 'start';
|
|
172
191
|
}
|
|
173
|
-
// Split rgba(r,g,b,a) into separate color + opacity SVG attributes for
|
|
174
|
-
// compatibility with SVG 1.1 consumers like Inkscape that don't honor the
|
|
175
|
-
// alpha component of CSS3 rgba() fill/stroke values. Whitespace-tolerant so
|
|
176
|
-
// spaced forms (MUI alpha(), colord toRgbString → "rgba(255, 177, 29, 0.12)")
|
|
177
|
-
// are separated too, not just the compact "rgba(255,177,29,0.12)".
|
|
178
192
|
paintAttr(name, style) {
|
|
179
193
|
const s = `${style}`;
|
|
180
|
-
const
|
|
181
|
-
if (
|
|
182
|
-
|
|
183
|
-
const base = `${name}="rgb(${m[1]},${m[2]},${m[3]})"`;
|
|
184
|
-
return a < 1 ? `${base} ${name}-opacity="${a}"` : base;
|
|
194
|
+
const split = splitPaintAlpha(s);
|
|
195
|
+
if (!split) {
|
|
196
|
+
return `${name}="${s}"`;
|
|
185
197
|
}
|
|
186
|
-
|
|
198
|
+
const base = `${name}="${split.color}"`;
|
|
199
|
+
return split.opacity < 1
|
|
200
|
+
? `${base} ${name}-opacity="${split.opacity}"`
|
|
201
|
+
: base;
|
|
187
202
|
}
|
|
188
203
|
strokeAttrs() {
|
|
189
|
-
|
|
204
|
+
const scale = this.lengthScale;
|
|
205
|
+
let attrs = ` ${this.paintAttr('stroke', this.strokeStyle)} stroke-width="${this.lineWidth * scale}"`;
|
|
190
206
|
if (this.lineCap !== 'butt') {
|
|
191
207
|
attrs += ` stroke-linecap="${this.lineCap}"`;
|
|
192
208
|
}
|
|
@@ -194,7 +210,7 @@ export class SvgCanvas {
|
|
|
194
210
|
attrs += ` stroke-linejoin="${this.lineJoin}"`;
|
|
195
211
|
}
|
|
196
212
|
if (this.lineDash.length > 0) {
|
|
197
|
-
attrs += ` stroke-dasharray="${this.lineDash.join(',')}"`;
|
|
213
|
+
attrs += ` stroke-dasharray="${this.lineDash.map(d => d * scale).join(',')}"`;
|
|
198
214
|
}
|
|
199
215
|
return attrs;
|
|
200
216
|
}
|
|
@@ -358,34 +374,40 @@ export class SvgCanvas {
|
|
|
358
374
|
this.ellipse(x, y, radius, radius, 0, startAngle, endAngle, counterclockwise);
|
|
359
375
|
}
|
|
360
376
|
ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise = false) {
|
|
361
|
-
const [cx, cy] = this.transformPoint(x, y);
|
|
362
377
|
const [rx, ry] = this.transformSize(radiusX, radiusY);
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
const
|
|
378
|
+
// A mirrored CTM turns a clockwise sweep counterclockwise on the page, and
|
|
379
|
+
// its rotation the other way.
|
|
380
|
+
const mirrored = this.a * this.d < 0;
|
|
381
|
+
const sweep = counterclockwise === mirrored ? 1 : 0;
|
|
382
|
+
const deg = ((mirrored ? -rotation : rotation) * 180) / Math.PI;
|
|
366
383
|
// Canvas measures the angle on the UNROTATED ellipse and then spins the
|
|
367
384
|
// whole thing, so the endpoint is the parametric point rotated — not the
|
|
368
|
-
// point at (angle + rotation).
|
|
385
|
+
// point at (angle + rotation) — and then placed by the CTM.
|
|
369
386
|
const at = (angle) => {
|
|
370
|
-
const px =
|
|
371
|
-
const py =
|
|
372
|
-
return
|
|
373
|
-
cx + px * Math.cos(rotation) - py * Math.sin(rotation),
|
|
374
|
-
cy + px * Math.sin(rotation) + py * Math.cos(rotation),
|
|
375
|
-
];
|
|
387
|
+
const px = radiusX * Math.cos(angle);
|
|
388
|
+
const py = radiusY * Math.sin(angle);
|
|
389
|
+
return this.transformPoint(x + px * Math.cos(rotation) - py * Math.sin(rotation), y + px * Math.sin(rotation) + py * Math.cos(rotation));
|
|
376
390
|
};
|
|
377
|
-
|
|
391
|
+
// The angle actually swept, as Canvas2D resolves it: in the stated
|
|
392
|
+
// direction, a whole turn once it reaches 2π, and otherwise wrapped into
|
|
393
|
+
// [0, 2π) — so a clockwise sweep from 0.5π back to 0 goes the long way.
|
|
394
|
+
const TAU = 2 * Math.PI;
|
|
395
|
+
const signed = counterclockwise
|
|
396
|
+
? startAngle - endAngle
|
|
397
|
+
: endAngle - startAngle;
|
|
398
|
+
const swept = signed >= TAU ? TAU : ((signed % TAU) + TAU) % TAU;
|
|
399
|
+
const [sx, sy] = at(startAngle);
|
|
400
|
+
if (swept === TAU) {
|
|
378
401
|
// A closed ellipse has coincident endpoints, which an SVG arc command
|
|
379
|
-
// degenerates on — so go round in two halves.
|
|
380
|
-
const
|
|
381
|
-
const [
|
|
382
|
-
this.pathData += `M${
|
|
402
|
+
// degenerates on — so go round in two halves, as a subpath of its own.
|
|
403
|
+
const half = counterclockwise ? -Math.PI : Math.PI;
|
|
404
|
+
const [hx, hy] = at(startAngle + half);
|
|
405
|
+
this.pathData += `M${sx},${sy}A${rx},${ry} ${deg} 1 ${sweep} ${hx},${hy}A${rx},${ry} ${deg} 1 ${sweep} ${sx},${sy}`;
|
|
383
406
|
return;
|
|
384
407
|
}
|
|
385
|
-
const [sx, sy2] = at(startAngle);
|
|
386
408
|
const [ex, ey] = at(endAngle);
|
|
387
|
-
const largeArc =
|
|
388
|
-
this.pathData += !this.pathData ? `M${sx},${
|
|
409
|
+
const largeArc = swept > Math.PI ? 1 : 0;
|
|
410
|
+
this.pathData += !this.pathData ? `M${sx},${sy}` : `L${sx},${sy}`;
|
|
389
411
|
this.pathData += `A${rx},${ry} ${deg} ${largeArc} ${sweep} ${ex},${ey}`;
|
|
390
412
|
}
|
|
391
413
|
bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {
|
|
@@ -441,19 +463,16 @@ export class SvgCanvas {
|
|
|
441
463
|
fillText(text, x, y) {
|
|
442
464
|
const [tx, ty] = this.transformPoint(x, y);
|
|
443
465
|
const escaped = escapeXml(text);
|
|
444
|
-
this.emit(`<text x="${tx}" y="${ty}" ${this.paintAttr('fill', this.fillStyle)}${fontAttrs(this.font)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
|
|
466
|
+
this.emit(`<text x="${tx}" y="${ty}" ${this.paintAttr('fill', this.fillStyle)}${fontAttrs(this.font, this.lengthScale)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
|
|
445
467
|
}
|
|
446
468
|
strokeText(text, x, y) {
|
|
447
469
|
const [tx, ty] = this.transformPoint(x, y);
|
|
448
470
|
const escaped = escapeXml(text);
|
|
449
|
-
this.emit(`<text x="${tx}" y="${ty}" fill="none"${this.strokeAttrs()}${fontAttrs(this.font)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
|
|
471
|
+
this.emit(`<text x="${tx}" y="${ty}" fill="none"${this.strokeAttrs()}${fontAttrs(this.font, this.lengthScale)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
|
|
450
472
|
}
|
|
451
473
|
drawImage(..._args) {
|
|
452
474
|
// no-op: raster images can't be meaningfully serialized to SVG paths
|
|
453
475
|
}
|
|
454
|
-
putImageData(..._args) {
|
|
455
|
-
// no-op
|
|
456
|
-
}
|
|
457
476
|
clip(..._args) {
|
|
458
477
|
// Use the current path as a clipPath, then open a `<g clip-path>`
|
|
459
478
|
// group that subsequent draws will land inside. The group is closed by
|
|
@@ -479,9 +498,10 @@ export class SvgCanvas {
|
|
|
479
498
|
// The family goes through, not just the size: `measureText` switches to the
|
|
480
499
|
// fixed monospace advance on seeing one, so dropping it measured a monospace
|
|
481
500
|
// string against the proportional table — the same string, laid out one way on
|
|
482
|
-
// a real canvas and another in the export, with nothing to show which.
|
|
483
|
-
//
|
|
484
|
-
//
|
|
501
|
+
// a real canvas and another in the export, with nothing to show which. An
|
|
502
|
+
// estimate all the same: a draw whose layout turns on a width (synteny's
|
|
503
|
+
// off-screen mate labels) measures through a real canvas and passes the
|
|
504
|
+
// result in, so the figure names what the screen named.
|
|
485
505
|
measureText(text) {
|
|
486
506
|
const { size, family } = parseFont(this.font);
|
|
487
507
|
return { width: measureTextWidth(text, Number(size), family) };
|
|
@@ -9,10 +9,13 @@ declare const TimeTraveller: import("@jbrowse/mobx-state-tree").IModelType<{
|
|
|
9
9
|
}, {
|
|
10
10
|
history: unknown[];
|
|
11
11
|
notTrackingUndo: boolean;
|
|
12
|
+
hasPendingRecord: boolean;
|
|
12
13
|
} & {
|
|
13
14
|
readonly canUndo: boolean;
|
|
14
15
|
readonly canRedo: boolean;
|
|
15
16
|
} & {
|
|
17
|
+
setHasPendingRecord(value: boolean): void;
|
|
18
|
+
flushPendingRecord(): void;
|
|
16
19
|
stopTrackingUndo(): void;
|
|
17
20
|
resumeTrackingUndo(): void;
|
|
18
21
|
addUndoState(snapshot: unknown): void;
|
|
@@ -14,13 +14,16 @@ const TimeTraveller = types
|
|
|
14
14
|
.volatile(() => ({
|
|
15
15
|
history: [],
|
|
16
16
|
notTrackingUndo: false,
|
|
17
|
+
hasPendingRecord: false,
|
|
17
18
|
}))
|
|
18
19
|
.views(self => ({
|
|
19
20
|
get canUndo() {
|
|
20
|
-
return self.undoIdx > 0 && !self.notTrackingUndo;
|
|
21
|
+
return ((self.undoIdx > 0 || self.hasPendingRecord) && !self.notTrackingUndo);
|
|
21
22
|
},
|
|
22
23
|
get canRedo() {
|
|
23
|
-
return self.undoIdx < self.history.length - 1 &&
|
|
24
|
+
return (self.undoIdx < self.history.length - 1 &&
|
|
25
|
+
!self.hasPendingRecord &&
|
|
26
|
+
!self.notTrackingUndo);
|
|
24
27
|
},
|
|
25
28
|
}))
|
|
26
29
|
.actions(self => {
|
|
@@ -93,7 +96,21 @@ const TimeTraveller = types
|
|
|
93
96
|
skipNextUndoState = false;
|
|
94
97
|
}
|
|
95
98
|
}
|
|
99
|
+
let recordPending;
|
|
96
100
|
return {
|
|
101
|
+
setHasPendingRecord(value) {
|
|
102
|
+
self.hasPendingRecord = value;
|
|
103
|
+
},
|
|
104
|
+
flushPendingRecord() {
|
|
105
|
+
if (debounceTimer) {
|
|
106
|
+
clearTimeout(debounceTimer);
|
|
107
|
+
debounceTimer = undefined;
|
|
108
|
+
}
|
|
109
|
+
if (self.hasPendingRecord) {
|
|
110
|
+
self.hasPendingRecord = false;
|
|
111
|
+
recordPending?.();
|
|
112
|
+
}
|
|
113
|
+
},
|
|
97
114
|
stopTrackingUndo() {
|
|
98
115
|
self.notTrackingUndo = true;
|
|
99
116
|
},
|
|
@@ -141,14 +158,17 @@ const TimeTraveller = types
|
|
|
141
158
|
skipNextUndoState = false;
|
|
142
159
|
self.history = [];
|
|
143
160
|
self.undoIdx = -1;
|
|
161
|
+
self.hasPendingRecord = false;
|
|
144
162
|
// read the target's current state rather than a snapshot captured per
|
|
145
163
|
// change: any change inside the debounce window re-times it, so when it
|
|
146
164
|
// does fire the two agree
|
|
147
165
|
const record = () => {
|
|
166
|
+
this.setHasPendingRecord(false);
|
|
148
167
|
if (targetStore) {
|
|
149
168
|
this.addUndoState(getSnapshot(targetStore));
|
|
150
169
|
}
|
|
151
170
|
};
|
|
171
|
+
recordPending = record;
|
|
152
172
|
// onPatch, not onSnapshot: this only needs to know *that* the target
|
|
153
173
|
// changed, and the snapshot is taken once per debounce window below.
|
|
154
174
|
// onSnapshot would serialize the whole target on every single change to
|
|
@@ -178,17 +198,29 @@ const TimeTraveller = types
|
|
|
178
198
|
clearTimeout(debounceTimer);
|
|
179
199
|
debounceTimer = undefined;
|
|
180
200
|
}
|
|
201
|
+
this.setHasPendingRecord(false);
|
|
181
202
|
return;
|
|
182
203
|
}
|
|
204
|
+
if (!self.hasPendingRecord) {
|
|
205
|
+
this.setHasPendingRecord(true);
|
|
206
|
+
}
|
|
183
207
|
armRecording(record);
|
|
184
208
|
});
|
|
185
209
|
this.addUndoState(getSnapshot(targetStore));
|
|
186
210
|
},
|
|
187
211
|
undo() {
|
|
212
|
+
this.flushPendingRecord();
|
|
213
|
+
if (self.undoIdx <= 0) {
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
188
216
|
self.undoIdx--;
|
|
189
217
|
applyHistoryState(self.undoIdx);
|
|
190
218
|
},
|
|
191
219
|
redo() {
|
|
220
|
+
this.flushPendingRecord();
|
|
221
|
+
if (self.undoIdx >= self.history.length - 1) {
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
192
224
|
self.undoIdx++;
|
|
193
225
|
applyHistoryState(self.undoIdx);
|
|
194
226
|
},
|
package/esm/util/aborting.d.ts
CHANGED
|
@@ -20,4 +20,43 @@ export declare function handleFetchError(exception: unknown, isCurrent: () => bo
|
|
|
20
20
|
* @param exception -
|
|
21
21
|
*/
|
|
22
22
|
export declare function isAbortException(exception: unknown): boolean;
|
|
23
|
+
/**
|
|
24
|
+
* Throw an AbortError if `signal` has aborted. A `signal.aborted` read, so it
|
|
25
|
+
* is cheap enough for the body of a loop; place it after any await and in any
|
|
26
|
+
* per-item callback a reader hands you.
|
|
27
|
+
*/
|
|
28
|
+
export declare function checkAbortSignal(signal?: AbortSignal): void;
|
|
29
|
+
/**
|
|
30
|
+
* Run an awaited stage under `signal`: checked before it starts, and again
|
|
31
|
+
* once it settles. The check after is the one that gets left out when the two
|
|
32
|
+
* are placed by hand — a stop landing during a long await otherwise goes
|
|
33
|
+
* unseen until the next stage.
|
|
34
|
+
*/
|
|
35
|
+
export declare function withAbortCheck<T>(signal: AbortSignal | undefined, fn: () => T | Promise<T>): Promise<T>;
|
|
36
|
+
export interface AbortBreakpoint {
|
|
37
|
+
/** True once every ~50 ms of wall time, otherwise a counter bump. */
|
|
38
|
+
due(): boolean;
|
|
39
|
+
/** Yield a task so a posted abort can land, then throw if it did. */
|
|
40
|
+
yield(): Promise<void>;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Cancellation for a loop that can run for seconds without awaiting — a
|
|
44
|
+
* whole-genome projection, a matrix fill. A `signal.aborted` read inside such a
|
|
45
|
+
* loop never changes, because the abort is a posted message; the loop has to
|
|
46
|
+
* give the event loop a turn now and then. A loop bounded by the byte gate or
|
|
47
|
+
* one region's features finishes before this would matter and only checks.
|
|
48
|
+
*
|
|
49
|
+
* const breakpoint = createAbortBreakpoint(signal)
|
|
50
|
+
* for (const row of rows) {
|
|
51
|
+
* if (breakpoint.due()) {
|
|
52
|
+
* await breakpoint.yield()
|
|
53
|
+
* }
|
|
54
|
+
* …
|
|
55
|
+
* }
|
|
56
|
+
*
|
|
57
|
+
* Two calls rather than one because an `await` on a non-promise still costs a
|
|
58
|
+
* microtask, about 60 ns against 2 ns for the `due()` read, and a loop over
|
|
59
|
+
* every read in a pileup notices the difference.
|
|
60
|
+
*/
|
|
61
|
+
export declare function createAbortBreakpoint(signal?: AbortSignal): AbortBreakpoint;
|
|
23
62
|
export {};
|
package/esm/util/aborting.js
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import { isElectron, isNode } from './environment.js';
|
|
2
|
+
import { createTimeGate } from './timeGate.js';
|
|
1
3
|
class AbortError extends Error {
|
|
2
4
|
code;
|
|
3
5
|
}
|
|
@@ -33,15 +35,95 @@ export function handleFetchError(exception, isCurrent, setError) {
|
|
|
33
35
|
*/
|
|
34
36
|
export function isAbortException(exception) {
|
|
35
37
|
return (
|
|
36
|
-
//
|
|
37
|
-
// message
|
|
38
|
-
//
|
|
39
|
-
// Error: aborted
|
|
40
|
-
// AbortError: aborted
|
|
41
|
-
// AbortError: The user aborted a request.
|
|
38
|
+
// The message test is for an abort whose name did not survive a boundary
|
|
39
|
+
// (Electron IPC, RpcServer's message-only fallback). A timeout is a failure
|
|
40
|
+
// even though Node words it "The operation was aborted due to timeout".
|
|
42
41
|
exception instanceof Error &&
|
|
42
|
+
exception.name !== 'TimeoutError' &&
|
|
43
43
|
(exception.name === 'AbortError' ||
|
|
44
44
|
// standard-ish non-DOM abort exception
|
|
45
45
|
(exception instanceof AbortError && exception.code === 'ERR_ABORTED') ||
|
|
46
46
|
/\b(aborted|aborterror)\b/i.test(exception.message)));
|
|
47
47
|
}
|
|
48
|
+
/**
|
|
49
|
+
* Throw an AbortError if `signal` has aborted. A `signal.aborted` read, so it
|
|
50
|
+
* is cheap enough for the body of a loop; place it after any await and in any
|
|
51
|
+
* per-item callback a reader hands you.
|
|
52
|
+
*/
|
|
53
|
+
export function checkAbortSignal(signal) {
|
|
54
|
+
if (signal?.aborted) {
|
|
55
|
+
throw makeAbortError();
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Run an awaited stage under `signal`: checked before it starts, and again
|
|
60
|
+
* once it settles. The check after is the one that gets left out when the two
|
|
61
|
+
* are placed by hand — a stop landing during a long await otherwise goes
|
|
62
|
+
* unseen until the next stage.
|
|
63
|
+
*/
|
|
64
|
+
export async function withAbortCheck(signal, fn) {
|
|
65
|
+
checkAbortSignal(signal);
|
|
66
|
+
const result = await fn();
|
|
67
|
+
checkAbortSignal(signal);
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
const YIELD_INTERVAL_MS = 50;
|
|
71
|
+
/**
|
|
72
|
+
* Give the event loop one turn. A worker learns of an abort through a posted
|
|
73
|
+
* message, and a message is a task: an `await` on an already-settled promise
|
|
74
|
+
* drains only microtasks and delivers nothing. A browser realm, Electron's
|
|
75
|
+
* included, gets a MessageChannel task, which unlike `setTimeout` is not
|
|
76
|
+
* clamped. Not `scheduler.yield`: Chromium runs its continuation ahead of a
|
|
77
|
+
* posted message, so a worker loop yielding that way never sees the abort.
|
|
78
|
+
* Plain Node and jsdom get the timer: a MessagePort turn there runs no due
|
|
79
|
+
* timer, and under jest the abort is one.
|
|
80
|
+
*/
|
|
81
|
+
const yieldToEventLoop = (() => {
|
|
82
|
+
if ((isElectron || !isNode) && typeof MessageChannel !== 'undefined') {
|
|
83
|
+
const channel = new MessageChannel();
|
|
84
|
+
let resolvers = [];
|
|
85
|
+
channel.port1.onmessage = () => {
|
|
86
|
+
const pending = resolvers;
|
|
87
|
+
resolvers = [];
|
|
88
|
+
for (const resolve of pending) {
|
|
89
|
+
resolve();
|
|
90
|
+
}
|
|
91
|
+
};
|
|
92
|
+
return () => new Promise(resolve => {
|
|
93
|
+
resolvers.push(resolve);
|
|
94
|
+
channel.port2.postMessage(0);
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
return () => new Promise(resolve => {
|
|
98
|
+
setTimeout(resolve, 0);
|
|
99
|
+
});
|
|
100
|
+
})();
|
|
101
|
+
/**
|
|
102
|
+
* Cancellation for a loop that can run for seconds without awaiting — a
|
|
103
|
+
* whole-genome projection, a matrix fill. A `signal.aborted` read inside such a
|
|
104
|
+
* loop never changes, because the abort is a posted message; the loop has to
|
|
105
|
+
* give the event loop a turn now and then. A loop bounded by the byte gate or
|
|
106
|
+
* one region's features finishes before this would matter and only checks.
|
|
107
|
+
*
|
|
108
|
+
* const breakpoint = createAbortBreakpoint(signal)
|
|
109
|
+
* for (const row of rows) {
|
|
110
|
+
* if (breakpoint.due()) {
|
|
111
|
+
* await breakpoint.yield()
|
|
112
|
+
* }
|
|
113
|
+
* …
|
|
114
|
+
* }
|
|
115
|
+
*
|
|
116
|
+
* Two calls rather than one because an `await` on a non-promise still costs a
|
|
117
|
+
* microtask, about 60 ns against 2 ns for the `due()` read, and a loop over
|
|
118
|
+
* every read in a pileup notices the difference.
|
|
119
|
+
*/
|
|
120
|
+
export function createAbortBreakpoint(signal) {
|
|
121
|
+
const gate = createTimeGate();
|
|
122
|
+
return {
|
|
123
|
+
due: () => gate(YIELD_INTERVAL_MS),
|
|
124
|
+
async yield() {
|
|
125
|
+
await yieldToEventLoop();
|
|
126
|
+
checkAbortSignal(signal);
|
|
127
|
+
},
|
|
128
|
+
};
|
|
129
|
+
}
|
|
@@ -11,7 +11,7 @@ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
|
11
11
|
*
|
|
12
12
|
* Keyed on the adapter config rather than memoized for the display's life, so
|
|
13
13
|
* a track re-pointed in the config editor stops serving the old header's
|
|
14
|
-
* descriptions. Cleared on failure so a later click retries. No
|
|
14
|
+
* descriptions. Cleared on failure so a later click retries. No signal and
|
|
15
15
|
* no status: nothing to narrate, and nothing a cancel could save — the widget
|
|
16
16
|
* opens on the result.
|
|
17
17
|
*/
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { isDataCurrent } from './isDataCurrent.js';
|
|
1
2
|
import { getRpcSessionId } from './parentWalk.js';
|
|
2
3
|
import { getRpcHost } from './sessionServices.js';
|
|
3
4
|
/**
|
|
@@ -12,19 +13,19 @@ import { getRpcHost } from './sessionServices.js';
|
|
|
12
13
|
*
|
|
13
14
|
* Keyed on the adapter config rather than memoized for the display's life, so
|
|
14
15
|
* a track re-pointed in the config editor stops serving the old header's
|
|
15
|
-
* descriptions. Cleared on failure so a later click retries. No
|
|
16
|
+
* descriptions. Cleared on failure so a later click retries. No signal and
|
|
16
17
|
* no status: nothing to narrate, and nothing a cancel could save — the widget
|
|
17
18
|
* opens on the result.
|
|
18
19
|
*/
|
|
19
20
|
export function createAdapterMetadataFetch(self) {
|
|
20
21
|
let cached;
|
|
21
22
|
return () => {
|
|
22
|
-
const
|
|
23
|
-
if (cached
|
|
23
|
+
const { adapterConfig } = self;
|
|
24
|
+
if (!cached || !isDataCurrent(cached.adapterConfig, adapterConfig)) {
|
|
24
25
|
const promise = getRpcHost(self)
|
|
25
26
|
// eslint-disable-next-line no-restricted-syntax -- nothing to narrate, nothing a cancel could save
|
|
26
27
|
.rpcManager.call(getRpcSessionId(self), 'CoreGetMetadata', {
|
|
27
|
-
adapterConfig
|
|
28
|
+
adapterConfig,
|
|
28
29
|
})
|
|
29
30
|
.catch((e) => {
|
|
30
31
|
if (cached?.promise === promise) {
|
|
@@ -32,7 +33,7 @@ export function createAdapterMetadataFetch(self) {
|
|
|
32
33
|
}
|
|
33
34
|
throw e;
|
|
34
35
|
});
|
|
35
|
-
cached = {
|
|
36
|
+
cached = { adapterConfig, promise };
|
|
36
37
|
}
|
|
37
38
|
return cached.promise;
|
|
38
39
|
};
|
|
@@ -15,8 +15,5 @@ import type { SessionWithAddSessionTrack } from './types/index.ts';
|
|
|
15
15
|
export declare function addAndShowTrack(session: SessionWithAddSessionTrack, conf: Parameters<SessionWithAddSessionTrack['addSessionTrackConf']>[0] & {
|
|
16
16
|
trackId: string;
|
|
17
17
|
}, view?: {
|
|
18
|
-
|
|
19
|
-
}):
|
|
20
|
-
setSubschema(slotName: string, data: Record<string, unknown>): any;
|
|
21
|
-
setSlot(slotName: string, value: unknown): void;
|
|
22
|
-
} & import("@jbrowse/mobx-state-tree").IStateTreeNode<import("../configuration/types.ts").AnyConfigurationSchemaType>) | undefined;
|
|
18
|
+
launchTrack: (trackId: string) => Promise<unknown>;
|
|
19
|
+
}): import("../configuration/types.ts").AnyConfigurationModel | undefined;
|
|
@@ -16,8 +16,12 @@ export function addAndShowTrack(session, conf, view) {
|
|
|
16
16
|
// addSessionTrackConf already notified on an invalid conf; showing a trackId
|
|
17
17
|
// that was never added would only add a second "Could not resolve identifier"
|
|
18
18
|
// snackbar
|
|
19
|
+
//
|
|
20
|
+
// `launchTrack`, voided: the display's state model may still be a dynamic
|
|
21
|
+
// import away, and every caller here is a menu item or a dialog button whose
|
|
22
|
+
// return value is the added config rather than the opened track
|
|
19
23
|
if (added) {
|
|
20
|
-
view?.
|
|
24
|
+
void view?.launchTrack(conf.trackId);
|
|
21
25
|
}
|
|
22
26
|
return added;
|
|
23
27
|
}
|
|
@@ -1,14 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Stamp `baseUri` next to every `uri` in a config
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
2
|
+
* Stamp `baseUri` next to every `uri` in a config, and beside a MultiWiggle
|
|
3
|
+
* `bigWigs` array of bare URI strings, so relative URIs resolve against the
|
|
4
|
+
* location the config itself was loaded from. A file written as a bare string
|
|
5
|
+
* where a location object can go (a search index, `refNameAliases`,
|
|
6
|
+
* `cytobands`, a `bedLocations` entry) has no object to stamp, so it becomes
|
|
7
|
+
* `{ uri, baseUri }`.
|
|
8
|
+
* jbrowse-web runs this when it fetches a config.json from a URL; anything that
|
|
9
|
+
* injects a fetched config as an object (a hub, a track hub connection, a
|
|
10
|
+
* headless render) has to run it too, or the config's relative data URIs
|
|
11
|
+
* resolve against the page.
|
|
7
12
|
*
|
|
8
13
|
* Lives in core because core is what consumes the result — the assembly config
|
|
9
14
|
* schema and expandAssemblyConfigShorthand read `baseUri` back out.
|
|
10
15
|
*/
|
|
11
16
|
export declare function addRelativeUris(config: Record<string, unknown> | null, base: URL): void;
|
|
17
|
+
/**
|
|
18
|
+
* A copy of `config` with every relative URI stamped against the page, which
|
|
19
|
+
* is what the page itself would resolve it against. An RPC worker started from
|
|
20
|
+
* a `blob:` URL has no such base, so a location it receives without one fails
|
|
21
|
+
* to parse there.
|
|
22
|
+
*/
|
|
23
|
+
export declare function withPageBaseUri<T>(config: T): T;
|
|
12
24
|
/**
|
|
13
25
|
* Inverse of {@link addRelativeUris}: recursively delete every synthetic
|
|
14
26
|
* `baseUri` key (mutates in place), e.g. before serializing a config snapshot
|