@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
interface InitAutorunHost<T> extends IStateTreeNode {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
pendingLaunch?: T;
|
|
4
|
+
setLaunch: (launch?: T) => void;
|
|
5
5
|
setError: (error: unknown) => void;
|
|
6
6
|
}
|
|
7
7
|
export interface InitApplyContext {
|
|
8
8
|
/**
|
|
9
9
|
* True once this init can no longer be the one being applied: the node is
|
|
10
|
-
* gone, or a newer `
|
|
10
|
+
* gone, or a newer `setLaunch` has replaced it. Any mid-apply wait that can
|
|
11
11
|
* park indefinitely must fold this into its condition — an unbounded wait on
|
|
12
12
|
* state that never arrives holds the drain open, and the newer init that
|
|
13
13
|
* would have superseded it is exactly what gets stranded. This is the causal
|
|
@@ -26,35 +26,36 @@ interface InitAutorunOptions<T> {
|
|
|
26
26
|
*/
|
|
27
27
|
ready: () => boolean;
|
|
28
28
|
/**
|
|
29
|
-
* Whether the view has materialized — the
|
|
30
|
-
*
|
|
31
|
-
* synteny: rows built). Decides the failure policy, see
|
|
29
|
+
* Whether the view has materialized — the line `withLaunchInput`'s
|
|
30
|
+
* `materialized` draws for persistence, read from the live node (dotplot:
|
|
31
|
+
* assemblyNames set; synteny: rows built). Decides the failure policy, see
|
|
32
|
+
* below.
|
|
32
33
|
*/
|
|
33
34
|
materialized: () => boolean;
|
|
34
35
|
/** Apply one init blob. Owns the ordered steps; never clears `init`. */
|
|
35
36
|
apply: (init: T, ctx: InitApplyContext) => Promise<void>;
|
|
36
37
|
}
|
|
37
38
|
/**
|
|
38
|
-
* The
|
|
39
|
+
* The launch state machine shared by the views that take a declarative launch
|
|
39
40
|
* blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
|
|
40
41
|
* the readiness gate, the serialized drain, the identity-checked clear, the
|
|
41
42
|
* isAlive guards, and one failure policy.
|
|
42
43
|
*
|
|
43
|
-
* The failure policy keys off `materialized`, the same line
|
|
44
|
-
*
|
|
44
|
+
* The failure policy keys off `materialized`, the same line `withLaunchInput`
|
|
45
|
+
* draws for persistence:
|
|
45
46
|
*
|
|
46
|
-
* - Not materialized — nothing is on screen and `
|
|
47
|
+
* - Not materialized — nothing is on screen and `launch` is still persisted, so
|
|
47
48
|
* keep it for a reload retry and `setError`. That flips the view onto its
|
|
48
49
|
* import form, which renders the error in its own banner; a snackbar would
|
|
49
50
|
* state the same failure twice and the banner is the one that persists.
|
|
50
51
|
* - Materialized — the view works, so a later failure is one sub-step's
|
|
51
52
|
* problem and must not take the view down with it. `setError` would, since
|
|
52
53
|
* showImportForm keys off `error` alone and would discard rows that loaded
|
|
53
|
-
* fine, so report it as a snackbar instead. Clearing `
|
|
54
|
+
* fine, so report it as a snackbar instead. Clearing `launch` is also what
|
|
54
55
|
* disarms the re-fire: `ready` usually folds in the measured width, so
|
|
55
|
-
* leaving it set lets any resize re-run `apply` over a half-applied
|
|
56
|
+
* leaving it set lets any resize re-run `apply` over a half-applied blob.
|
|
56
57
|
*
|
|
57
|
-
* `apply` therefore never clears `
|
|
58
|
+
* `apply` therefore never clears `launch` and never catches for reporting — it
|
|
58
59
|
* catches only the failures it wants to keep going through (a bad locstring in
|
|
59
60
|
* one row), and everything it lets escape is fatal-as-of-that-point.
|
|
60
61
|
*/
|
|
@@ -1,19 +1,19 @@
|
|
|
1
1
|
import { addDisposer, isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
import { autorun } from 'mobx';
|
|
3
3
|
import { getNotificationSink } from './sessionServices.js';
|
|
4
|
-
// Clear only when
|
|
5
|
-
// lands while `apply` is awaiting (React StrictMode remounts, a
|
|
6
|
-
// re-launch) swaps in a new object; clearing unconditionally would
|
|
7
|
-
// drop
|
|
4
|
+
// Clear only when the pending blob is still the exact object we applied. A
|
|
5
|
+
// setLaunch that lands while `apply` is awaiting (React StrictMode remounts, a
|
|
6
|
+
// programmatic re-launch) swaps in a new object; clearing unconditionally would
|
|
7
|
+
// silently drop it. Leaving it lets the drain loop apply it next.
|
|
8
8
|
function clearIfUnchanged(self, init) {
|
|
9
|
-
if (isAlive(self) && self.
|
|
10
|
-
self.
|
|
9
|
+
if (isAlive(self) && self.pendingLaunch === init) {
|
|
10
|
+
self.setLaunch(undefined);
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
13
|
async function applyInitOnce(self, init, { apply, materialized }) {
|
|
14
14
|
try {
|
|
15
15
|
await apply(init, {
|
|
16
|
-
superseded: () => !isAlive(self) || self.
|
|
16
|
+
superseded: () => !isAlive(self) || self.pendingLaunch !== init,
|
|
17
17
|
});
|
|
18
18
|
clearIfUnchanged(self, init);
|
|
19
19
|
}
|
|
@@ -34,7 +34,7 @@ async function applyInitOnce(self, init, { apply, materialized }) {
|
|
|
34
34
|
}
|
|
35
35
|
}
|
|
36
36
|
function currentInit(self, { ready }) {
|
|
37
|
-
return isAlive(self) && ready() ? self.
|
|
37
|
+
return isAlive(self) && ready() ? self.pendingLaunch : undefined;
|
|
38
38
|
}
|
|
39
39
|
// Apply pending inits one at a time until none remain. Serializing (rather
|
|
40
40
|
// than letting the autorun run `apply` concurrently) is what keeps re-entrant
|
|
@@ -47,32 +47,32 @@ async function drainInit(self, opts) {
|
|
|
47
47
|
while (pending !== undefined) {
|
|
48
48
|
await applyInitOnce(self, pending, opts);
|
|
49
49
|
const next = currentInit(self, opts);
|
|
50
|
-
// a fatal failure keeps `
|
|
50
|
+
// a fatal failure keeps `launch` for a reload retry; the same object still
|
|
51
51
|
// sitting there means it was not consumed, so stop rather than spin on it
|
|
52
52
|
pending = next === pending ? undefined : next;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
55
|
/**
|
|
56
|
-
* The
|
|
56
|
+
* The launch state machine shared by the views that take a declarative launch
|
|
57
57
|
* blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
|
|
58
58
|
* the readiness gate, the serialized drain, the identity-checked clear, the
|
|
59
59
|
* isAlive guards, and one failure policy.
|
|
60
60
|
*
|
|
61
|
-
* The failure policy keys off `materialized`, the same line
|
|
62
|
-
*
|
|
61
|
+
* The failure policy keys off `materialized`, the same line `withLaunchInput`
|
|
62
|
+
* draws for persistence:
|
|
63
63
|
*
|
|
64
|
-
* - Not materialized — nothing is on screen and `
|
|
64
|
+
* - Not materialized — nothing is on screen and `launch` is still persisted, so
|
|
65
65
|
* keep it for a reload retry and `setError`. That flips the view onto its
|
|
66
66
|
* import form, which renders the error in its own banner; a snackbar would
|
|
67
67
|
* state the same failure twice and the banner is the one that persists.
|
|
68
68
|
* - Materialized — the view works, so a later failure is one sub-step's
|
|
69
69
|
* problem and must not take the view down with it. `setError` would, since
|
|
70
70
|
* showImportForm keys off `error` alone and would discard rows that loaded
|
|
71
|
-
* fine, so report it as a snackbar instead. Clearing `
|
|
71
|
+
* fine, so report it as a snackbar instead. Clearing `launch` is also what
|
|
72
72
|
* disarms the re-fire: `ready` usually folds in the measured width, so
|
|
73
|
-
* leaving it set lets any resize re-run `apply` over a half-applied
|
|
73
|
+
* leaving it set lets any resize re-run `apply` over a half-applied blob.
|
|
74
74
|
*
|
|
75
|
-
* `apply` therefore never clears `
|
|
75
|
+
* `apply` therefore never clears `launch` and never catches for reporting — it
|
|
76
76
|
* catches only the failures it wants to keep going through (a bad locstring in
|
|
77
77
|
* one row), and everything it lets escape is fatal-as-of-that-point.
|
|
78
78
|
*/
|
|
@@ -93,7 +93,7 @@ export function installInitAutorun(self, opts) {
|
|
|
93
93
|
// reading a detached node throws — here into an unawaited promise.
|
|
94
94
|
const alive = isAlive(self);
|
|
95
95
|
const isReady = alive && opts.ready();
|
|
96
|
-
const init = alive ? self.
|
|
96
|
+
const init = alive ? self.pendingLaunch : undefined;
|
|
97
97
|
if (isReady && init !== undefined && !draining) {
|
|
98
98
|
draining = true;
|
|
99
99
|
try {
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
import type { StatusReporter } from './createAbortRotation.ts';
|
|
2
|
+
import type { FetchContext } from './fetchContext.ts';
|
|
3
|
+
import type { FetchSkeletonHost } from './installFetch.ts';
|
|
4
|
+
/**
|
|
5
|
+
* What a prerequisite read needs of the display it runs on, beside the
|
|
6
|
+
* skeleton's own three. Duck-typed rather than a foundation's `Instance` type,
|
|
7
|
+
* because the hosts compose different foundations — one per fetch family, and
|
|
8
|
+
* the comparative displays compose none of them — and this is the only thing
|
|
9
|
+
* they have in common.
|
|
10
|
+
*/
|
|
11
|
+
export interface PrerequisiteFetchHost extends FetchSkeletonHost {
|
|
12
|
+
/**
|
|
13
|
+
* Read in `prepare`, so it is **tracked**: an adapter edited in the config
|
|
14
|
+
* editor has to re-read, and `run`'s own reads are untracked by contract.
|
|
15
|
+
*/
|
|
16
|
+
adapterConfig: Record<string, unknown>;
|
|
17
|
+
isMinimized: boolean;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* A prerequisite read's answer, stamped with the adapter config it answers.
|
|
21
|
+
* A display holds the latest one and reads it through `readFor`, so an answer
|
|
22
|
+
* never outlives its adapter config and no failure path has to clear it.
|
|
23
|
+
*/
|
|
24
|
+
export interface AdapterRead<T> {
|
|
25
|
+
adapterConfig: Record<string, unknown>;
|
|
26
|
+
value: T;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* `read`'s value while it answers the adapter config `host` holds; undefined
|
|
30
|
+
* until a read of that config commits, which a failed read never does.
|
|
31
|
+
*
|
|
32
|
+
* Equal by value, as the fetch key is: an undo rebuilds the track's config,
|
|
33
|
+
* handing back an equal adapter config the fetch declines to read again.
|
|
34
|
+
*/
|
|
35
|
+
export declare function readFor<T>(host: {
|
|
36
|
+
adapterConfig: Record<string, unknown>;
|
|
37
|
+
}, read: AdapterRead<T> | undefined): T | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* A **prerequisite read**: one RPC about the adapter itself, beside the
|
|
40
|
+
* display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
|
|
41
|
+
* whose `resolutions` every contacts fetch waits on; the multi-sample sample
|
|
42
|
+
* list, which `fetchNeeded` declines until; the tiered alignment file's
|
|
43
|
+
* `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
|
|
44
|
+
* and the mark display's source list, which gives each listed source a row —
|
|
45
|
+
* and they sit on three different fetch foundations, which is why this sits in
|
|
46
|
+
* core beside the skeleton and not beside any of them.
|
|
47
|
+
*
|
|
48
|
+
* They had the shape below hand-copied, comment for comment, and each term is a
|
|
49
|
+
* rule rather than a preference:
|
|
50
|
+
*
|
|
51
|
+
* - **the adapter config is the whole trigger and the whole key.** Tracked in
|
|
52
|
+
* `prepare` so a config-editor edit re-reads; keyed on the same value so an
|
|
53
|
+
* un-minimize over the same file re-reads nothing. Getting one without the
|
|
54
|
+
* other gives either a stale header or a walk of a `.hic` norm-vector index on
|
|
55
|
+
* every expand.
|
|
56
|
+
* - **the answer carries the same key** (`AdapterRead`), and a display reads
|
|
57
|
+
* it through `readFor`, so an answer to a previous adapter config is never
|
|
58
|
+
* read as the current one, and a failed read leaves nothing to clear.
|
|
59
|
+
* - **an answer to a config the display no longer holds is dropped**, and so is
|
|
60
|
+
* its error. An undo that brings back the config already answered makes the
|
|
61
|
+
* skeleton decline a re-read, while the read of the abandoned config runs
|
|
62
|
+
* on, still current; landing, it would stamp its key, force a second read of
|
|
63
|
+
* the held one and hand the display a list for another file, on which the
|
|
64
|
+
* variant display resets its arrangement.
|
|
65
|
+
* - **minimized is the gate**, and a display with a second condition of its own
|
|
66
|
+
* passes `gate` — the sample-list read waits for the LGV to be measured as
|
|
67
|
+
* well, so a full-file scan does not start ahead of the display's own first
|
|
68
|
+
* fetch, and the tier read waits on the track declaring a tier threshold at
|
|
69
|
+
* all.
|
|
70
|
+
* - **no `contract`.** This is the second fetch on a display whose foundation
|
|
71
|
+
* installed both checks already: `assertDisplayContract` would report the
|
|
72
|
+
* double-attach it exists to catch, and a second retry check would consume the
|
|
73
|
+
* same `reloadCounter` bumps as the first.
|
|
74
|
+
* - **where the status goes is the caller's** (`report`). The two LGV reads
|
|
75
|
+
* lend the display's own status window, so the read takes a slot beside the
|
|
76
|
+
* primary fetch rather than opening a second writer over the one status field
|
|
77
|
+
* (ADR-081) — and it matters more here than for most fetches: a prerequisite
|
|
78
|
+
* runs inside the pre-first-paint window, where the scrim is up because
|
|
79
|
+
* nothing is drawn rather than because `isLoading` is, so `statusMessage` is
|
|
80
|
+
* the only thing that can say what is happening. The tier read narrates
|
|
81
|
+
* nothing; a header is not a load.
|
|
82
|
+
*
|
|
83
|
+
* `createAdapterMetadataFetch` keys on the same adapter config and is
|
|
84
|
+
* deliberately NOT one of these: no trigger, no signal and no status,
|
|
85
|
+
* because it is fetched lazily when a details widget opens and the widget opens
|
|
86
|
+
* on the result. A prerequisite read is the one a display's own fetch waits on.
|
|
87
|
+
*
|
|
88
|
+
* **A declaration, not the skeleton this name used to be.** There was an
|
|
89
|
+
* `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
|
|
90
|
+
* a good reason: it carried a `runOne` of its own — a fifth copy of begin →
|
|
91
|
+
* clear → run → commit-if-current → `handleFetchError` → end — and once
|
|
92
|
+
* `installFetch` owned that sequence, a second one was pure drift surface. This
|
|
93
|
+
* one adds no sequence, no rotation and no error rule; it is terms handed to
|
|
94
|
+
* `installFetch`, the same shape `installGlobalFetchAutorun` and
|
|
95
|
+
* `installComparativeFetchAutorun` are. Add nothing here that a family could
|
|
96
|
+
* not state as an option to the skeleton.
|
|
97
|
+
*
|
|
98
|
+
* Everything the skeleton gives it is the point of going through the skeleton:
|
|
99
|
+
* the latest-wins rotation (so a superseding read aborts the one it replaced,
|
|
100
|
+
* and only a superseding read does — a user cancel of the primary fetch cannot
|
|
101
|
+
* strand the display the way sharing its signal would), the clear at the start,
|
|
102
|
+
* the currency-guarded error rule, the unconditional `reloadCounter` read that
|
|
103
|
+
* makes the chrome's Retry re-run this, and the retired status slot that keeps a
|
|
104
|
+
* failed read from leaving a progress chip up for good.
|
|
105
|
+
*/
|
|
106
|
+
export declare function installPrerequisiteFetch<TResult>(self: PrerequisiteFetchHost, { name, delay, report, gate, run, commit, setError, }: {
|
|
107
|
+
name: string;
|
|
108
|
+
delay: number;
|
|
109
|
+
report: StatusReporter;
|
|
110
|
+
/** an extra term of the display's own, ANDed under `!isMinimized` */
|
|
111
|
+
gate?: () => boolean;
|
|
112
|
+
run: (adapterConfig: Record<string, unknown>, ctx: FetchContext) => Promise<TResult | undefined>;
|
|
113
|
+
commit: (read: AdapterRead<TResult>) => void;
|
|
114
|
+
setError: (error?: unknown) => void;
|
|
115
|
+
}): void;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { isAlive } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { installFetch } from './installFetch.js';
|
|
3
|
+
import { isDataCurrent } from './isDataCurrent.js';
|
|
4
|
+
/**
|
|
5
|
+
* `read`'s value while it answers the adapter config `host` holds; undefined
|
|
6
|
+
* until a read of that config commits, which a failed read never does.
|
|
7
|
+
*
|
|
8
|
+
* Equal by value, as the fetch key is: an undo rebuilds the track's config,
|
|
9
|
+
* handing back an equal adapter config the fetch declines to read again.
|
|
10
|
+
*/
|
|
11
|
+
export function readFor(host, read) {
|
|
12
|
+
return read !== undefined &&
|
|
13
|
+
isDataCurrent(read.adapterConfig, host.adapterConfig)
|
|
14
|
+
? read.value
|
|
15
|
+
: undefined;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* A **prerequisite read**: one RPC about the adapter itself, beside the
|
|
19
|
+
* display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
|
|
20
|
+
* whose `resolutions` every contacts fetch waits on; the multi-sample sample
|
|
21
|
+
* list, which `fetchNeeded` declines until; the tiered alignment file's
|
|
22
|
+
* `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
|
|
23
|
+
* and the mark display's source list, which gives each listed source a row —
|
|
24
|
+
* and they sit on three different fetch foundations, which is why this sits in
|
|
25
|
+
* core beside the skeleton and not beside any of them.
|
|
26
|
+
*
|
|
27
|
+
* They had the shape below hand-copied, comment for comment, and each term is a
|
|
28
|
+
* rule rather than a preference:
|
|
29
|
+
*
|
|
30
|
+
* - **the adapter config is the whole trigger and the whole key.** Tracked in
|
|
31
|
+
* `prepare` so a config-editor edit re-reads; keyed on the same value so an
|
|
32
|
+
* un-minimize over the same file re-reads nothing. Getting one without the
|
|
33
|
+
* other gives either a stale header or a walk of a `.hic` norm-vector index on
|
|
34
|
+
* every expand.
|
|
35
|
+
* - **the answer carries the same key** (`AdapterRead`), and a display reads
|
|
36
|
+
* it through `readFor`, so an answer to a previous adapter config is never
|
|
37
|
+
* read as the current one, and a failed read leaves nothing to clear.
|
|
38
|
+
* - **an answer to a config the display no longer holds is dropped**, and so is
|
|
39
|
+
* its error. An undo that brings back the config already answered makes the
|
|
40
|
+
* skeleton decline a re-read, while the read of the abandoned config runs
|
|
41
|
+
* on, still current; landing, it would stamp its key, force a second read of
|
|
42
|
+
* the held one and hand the display a list for another file, on which the
|
|
43
|
+
* variant display resets its arrangement.
|
|
44
|
+
* - **minimized is the gate**, and a display with a second condition of its own
|
|
45
|
+
* passes `gate` — the sample-list read waits for the LGV to be measured as
|
|
46
|
+
* well, so a full-file scan does not start ahead of the display's own first
|
|
47
|
+
* fetch, and the tier read waits on the track declaring a tier threshold at
|
|
48
|
+
* all.
|
|
49
|
+
* - **no `contract`.** This is the second fetch on a display whose foundation
|
|
50
|
+
* installed both checks already: `assertDisplayContract` would report the
|
|
51
|
+
* double-attach it exists to catch, and a second retry check would consume the
|
|
52
|
+
* same `reloadCounter` bumps as the first.
|
|
53
|
+
* - **where the status goes is the caller's** (`report`). The two LGV reads
|
|
54
|
+
* lend the display's own status window, so the read takes a slot beside the
|
|
55
|
+
* primary fetch rather than opening a second writer over the one status field
|
|
56
|
+
* (ADR-081) — and it matters more here than for most fetches: a prerequisite
|
|
57
|
+
* runs inside the pre-first-paint window, where the scrim is up because
|
|
58
|
+
* nothing is drawn rather than because `isLoading` is, so `statusMessage` is
|
|
59
|
+
* the only thing that can say what is happening. The tier read narrates
|
|
60
|
+
* nothing; a header is not a load.
|
|
61
|
+
*
|
|
62
|
+
* `createAdapterMetadataFetch` keys on the same adapter config and is
|
|
63
|
+
* deliberately NOT one of these: no trigger, no signal and no status,
|
|
64
|
+
* because it is fetched lazily when a details widget opens and the widget opens
|
|
65
|
+
* on the result. A prerequisite read is the one a display's own fetch waits on.
|
|
66
|
+
*
|
|
67
|
+
* **A declaration, not the skeleton this name used to be.** There was an
|
|
68
|
+
* `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
|
|
69
|
+
* a good reason: it carried a `runOne` of its own — a fifth copy of begin →
|
|
70
|
+
* clear → run → commit-if-current → `handleFetchError` → end — and once
|
|
71
|
+
* `installFetch` owned that sequence, a second one was pure drift surface. This
|
|
72
|
+
* one adds no sequence, no rotation and no error rule; it is terms handed to
|
|
73
|
+
* `installFetch`, the same shape `installGlobalFetchAutorun` and
|
|
74
|
+
* `installComparativeFetchAutorun` are. Add nothing here that a family could
|
|
75
|
+
* not state as an option to the skeleton.
|
|
76
|
+
*
|
|
77
|
+
* Everything the skeleton gives it is the point of going through the skeleton:
|
|
78
|
+
* the latest-wins rotation (so a superseding read aborts the one it replaced,
|
|
79
|
+
* and only a superseding read does — a user cancel of the primary fetch cannot
|
|
80
|
+
* strand the display the way sharing its signal would), the clear at the start,
|
|
81
|
+
* the currency-guarded error rule, the unconditional `reloadCounter` read that
|
|
82
|
+
* makes the chrome's Retry re-run this, and the retired status slot that keeps a
|
|
83
|
+
* failed read from leaving a progress chip up for good.
|
|
84
|
+
*/
|
|
85
|
+
export function installPrerequisiteFetch(self, { name, delay, report, gate = () => true, run, commit, setError, }) {
|
|
86
|
+
installFetch(self, {
|
|
87
|
+
name,
|
|
88
|
+
delay,
|
|
89
|
+
report,
|
|
90
|
+
gate: () => !self.isMinimized && gate(),
|
|
91
|
+
prepare: () => ({ adapterConfig: self.adapterConfig }),
|
|
92
|
+
fetchKey: ({ adapterConfig }) => adapterConfig,
|
|
93
|
+
run: async ({ adapterConfig }, ctx) => {
|
|
94
|
+
const held = () => isAlive(self) && isDataCurrent(adapterConfig, self.adapterConfig);
|
|
95
|
+
try {
|
|
96
|
+
const value = await run(adapterConfig, ctx);
|
|
97
|
+
return held() ? value : undefined;
|
|
98
|
+
}
|
|
99
|
+
catch (e) {
|
|
100
|
+
if (held()) {
|
|
101
|
+
throw e;
|
|
102
|
+
}
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
},
|
|
106
|
+
commit: (value, { adapterConfig }) => {
|
|
107
|
+
commit({ adapterConfig, value });
|
|
108
|
+
},
|
|
109
|
+
setError,
|
|
110
|
+
});
|
|
111
|
+
}
|
package/esm/util/intervals.js
CHANGED
|
@@ -28,10 +28,15 @@ export function mergeIntervals(intervals, padding = 5000) {
|
|
|
28
28
|
* features. `padding` carries the same per-side meaning.
|
|
29
29
|
*/
|
|
30
30
|
export function gatherOverlaps(regions, padding = 5000) {
|
|
31
|
-
const memo =
|
|
31
|
+
const memo = new Map();
|
|
32
32
|
for (const x of regions) {
|
|
33
|
-
memo
|
|
34
|
-
|
|
33
|
+
const group = memo.get(x.refName);
|
|
34
|
+
if (group) {
|
|
35
|
+
group.push(x);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
memo.set(x.refName, [x]);
|
|
39
|
+
}
|
|
35
40
|
}
|
|
36
|
-
return
|
|
41
|
+
return [...memo.values()].flatMap(group => mergeIntervals(group, padding));
|
|
37
42
|
}
|
package/esm/util/io/index.js
CHANGED
|
@@ -19,18 +19,26 @@ export function resolveUriLocation(location) {
|
|
|
19
19
|
: location;
|
|
20
20
|
}
|
|
21
21
|
/**
|
|
22
|
-
* The local path a `file:` URI names, or undefined for
|
|
23
|
-
* Windows URL parses as `/C:/data/x.bam`, whose leading slash
|
|
24
|
-
* grammar rather than the path
|
|
22
|
+
* The local path a `file:` URI or a bare absolute path names, or undefined for
|
|
23
|
+
* anything else. A Windows URL parses as `/C:/data/x.bam`, whose leading slash
|
|
24
|
+
* is part of the URL grammar rather than the path, and a host is a network
|
|
25
|
+
* share: `\\server\share\x.bam` is `file://server/share/x.bam`.
|
|
25
26
|
*/
|
|
26
|
-
function
|
|
27
|
+
function uriToLocalPath(uri) {
|
|
28
|
+
if (uri.startsWith('/') || /^[a-z]:[\\/]/i.test(uri)) {
|
|
29
|
+
return uri;
|
|
30
|
+
}
|
|
27
31
|
if (!uri.startsWith('file:')) {
|
|
28
32
|
return undefined;
|
|
29
33
|
}
|
|
30
34
|
try {
|
|
31
|
-
const { pathname } = new URL(uri);
|
|
35
|
+
const { host, pathname } = new URL(uri);
|
|
32
36
|
const decoded = decodeURIComponent(pathname);
|
|
33
|
-
return
|
|
37
|
+
return host && host !== 'localhost'
|
|
38
|
+
? `//${host}${decoded}`
|
|
39
|
+
: /^\/[a-z]:/i.test(decoded)
|
|
40
|
+
? decoded.slice(1)
|
|
41
|
+
: decoded;
|
|
34
42
|
}
|
|
35
43
|
catch {
|
|
36
44
|
return undefined;
|
|
@@ -69,7 +77,9 @@ export function openLocation(location, pluginManager) {
|
|
|
69
77
|
if (!file) {
|
|
70
78
|
throw new Error(`file ("${location.name}") requires permission. Please reopen the file from track settings`);
|
|
71
79
|
}
|
|
72
|
-
|
|
80
|
+
// A File is a snapshot: the handle yields a new one once the file changes
|
|
81
|
+
// on disk, and its chunks must not be the old snapshot's
|
|
82
|
+
return new CachedFilehandle(new BlobFile(file), `filehandle://${location.handleId}@${file.lastModified}:${file.size}`);
|
|
73
83
|
}
|
|
74
84
|
if (isUriLocation(location)) {
|
|
75
85
|
// Check for empty string
|
|
@@ -82,14 +92,11 @@ export function openLocation(location, pluginManager) {
|
|
|
82
92
|
// a config that names its files relative to itself found no account at all
|
|
83
93
|
// and read every one of them unauthenticated.
|
|
84
94
|
const absoluteLocation = resolveUriLocation(location);
|
|
85
|
-
// A file: URI
|
|
86
|
-
//
|
|
87
|
-
//
|
|
88
|
-
// 'reads.bam'
|
|
89
|
-
|
|
90
|
-
// localPath keeps that whole chain on the one code path that can open a
|
|
91
|
-
// local file, instead of a fetch that no range request survives.
|
|
92
|
-
const localPath = fileUrlToLocalPath(absoluteLocation.uri);
|
|
95
|
+
// A file: URI or a bare absolute path names a file on this machine. A
|
|
96
|
+
// config.json opened from disk resolves `uri: 'reads.bam'` against its own
|
|
97
|
+
// directory to file:///dir/reads.bam, and a session built over MCP writes
|
|
98
|
+
// `uri: '/dir/reads.bam'` with no baseUri at all; fetched, either is a 404.
|
|
99
|
+
const localPath = uriToLocalPath(absoluteLocation.uri);
|
|
93
100
|
if (localPath !== undefined && (isNode || isElectron)) {
|
|
94
101
|
return openLocation({ localPath, locationType: 'LocalPathLocation' });
|
|
95
102
|
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* is
|
|
2
|
+
* Whether the key held data was committed under still equals the key a fetch
|
|
3
|
+
* issued now would carry. Keys are values compared structurally, so a stamp
|
|
4
|
+
* that kept its identity short-circuits on `===`, and an `undefined`-valued
|
|
5
|
+
* field or a fieldless class instance is still a distinct state — the two
|
|
6
|
+
* shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
|
|
7
|
+
* fetched yet, so never current.
|
|
6
8
|
*/
|
|
7
|
-
export declare function isDataCurrent(
|
|
9
|
+
export declare function isDataCurrent(loaded: unknown, current: unknown): boolean;
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
+
import { compareStructural } from 'mobx';
|
|
1
2
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
* is
|
|
3
|
+
* Whether the key held data was committed under still equals the key a fetch
|
|
4
|
+
* issued now would carry. Keys are values compared structurally, so a stamp
|
|
5
|
+
* that kept its identity short-circuits on `===`, and an `undefined`-valued
|
|
6
|
+
* field or a fieldless class instance is still a distinct state — the two
|
|
7
|
+
* shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
|
|
8
|
+
* fetched yet, so never current.
|
|
6
9
|
*/
|
|
7
|
-
export function isDataCurrent(
|
|
8
|
-
return
|
|
10
|
+
export function isDataCurrent(loaded, current) {
|
|
11
|
+
return loaded !== undefined && compareStructural(loaded, current);
|
|
9
12
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the user is typing into a text field, for a document-level shortcut
|
|
3
|
+
* that must leave that field's own keys alone: ctrl+z undoing typing rather
|
|
4
|
+
* than the session, ctrl+arrow moving the caret rather than the view. A
|
|
5
|
+
* `<textarea>` counts, which the multiline config and JSON editors render.
|
|
6
|
+
*/
|
|
7
|
+
export declare function isTextEntryFocused(): boolean;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Whether the user is typing into a text field, for a document-level shortcut
|
|
3
|
+
* that must leave that field's own keys alone: ctrl+z undoing typing rather
|
|
4
|
+
* than the session, ctrl+arrow moving the caret rather than the view. A
|
|
5
|
+
* `<textarea>` counts, which the multiline config and JSON editors render.
|
|
6
|
+
*/
|
|
7
|
+
export function isTextEntryFocused() {
|
|
8
|
+
const el = document.activeElement;
|
|
9
|
+
if (!(el instanceof HTMLElement)) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
const tag = el.tagName.toUpperCase();
|
|
13
|
+
// coerced: isContentEditable is declared boolean but is undefined in jsdom,
|
|
14
|
+
// so the raw expression returns undefined for an ordinary focused element
|
|
15
|
+
return tag === 'INPUT' || tag === 'TEXTAREA' || !!el.isContentEditable;
|
|
16
|
+
}
|
package/esm/util/jexl.js
CHANGED
|
@@ -1,23 +1,10 @@
|
|
|
1
1
|
import { Jexl } from '@jbrowse/jexl';
|
|
2
|
+
import { categoricalColor } from '../ui/colors.js';
|
|
2
3
|
import { randomColor } from './color/index.js';
|
|
3
4
|
import { colord } from './colord.js';
|
|
4
5
|
import { jexlFeatureProxy, unwrapFeature } from './simpleFeature.js';
|
|
5
6
|
export default function JexlF( /* config?: any*/) {
|
|
6
7
|
const j = new Jexl();
|
|
7
|
-
// Memoize compilation on the instance itself. A compiled Expression closes
|
|
8
|
-
// over this instance's grammar (its registered functions), so the cache
|
|
9
|
-
// belongs here and is naturally per-instance — there is no shared cache that
|
|
10
|
-
// could bind an expression to the wrong instance's functions.
|
|
11
|
-
const rawCompile = j.compile.bind(j);
|
|
12
|
-
const cache = new Map();
|
|
13
|
-
j.compile = (code) => {
|
|
14
|
-
let expr = cache.get(code);
|
|
15
|
-
if (expr === undefined) {
|
|
16
|
-
expr = rawCompile(code);
|
|
17
|
-
cache.set(code, expr);
|
|
18
|
-
}
|
|
19
|
-
return expr;
|
|
20
|
-
};
|
|
21
8
|
// someday will make sure all of configs callbacks are added in, including
|
|
22
9
|
// ones passed in
|
|
23
10
|
// below are core functions
|
|
@@ -31,15 +18,29 @@ export default function JexlF( /* config?: any*/) {
|
|
|
31
18
|
return p ? jexlFeatureProxy(p) : undefined;
|
|
32
19
|
});
|
|
33
20
|
j.addFunction('id', (feature) => unwrapFeature(feature).id());
|
|
21
|
+
/**
|
|
22
|
+
* #jexlFunction Feature operations - getInherited | getInherited(feature, 'gene_biotype') | the attribute from the feature, or from its nearest ancestor that has it, so a CDS reads its gene's value
|
|
23
|
+
*/
|
|
24
|
+
j.addFunction('getInherited', (feature, name) => {
|
|
25
|
+
let cur = unwrapFeature(feature);
|
|
26
|
+
while (cur !== undefined) {
|
|
27
|
+
const value = cur.get(name);
|
|
28
|
+
if (value !== undefined) {
|
|
29
|
+
return value;
|
|
30
|
+
}
|
|
31
|
+
cur = cur.parent?.();
|
|
32
|
+
}
|
|
33
|
+
return undefined;
|
|
34
|
+
});
|
|
34
35
|
// let user cast a jexl type into a javascript type
|
|
35
36
|
j.addFunction('cast', (arg) => arg);
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
/**
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
// jexl's own list-aware min and max take varargs too; a Math.min
|
|
38
|
+
// registration would replace them
|
|
39
|
+
/**
|
|
40
|
+
* #jexlFunction Math functions | max(0, 2)
|
|
41
|
+
* #jexlFunction Math functions | min(feature.INFO.AF)
|
|
42
|
+
* #jexlFunction Math functions | sqrt(4)
|
|
43
|
+
*/
|
|
43
44
|
j.addFunction('sqrt', Math.sqrt);
|
|
44
45
|
/** #jexlFunction Math functions | ceil(0.5) */
|
|
45
46
|
j.addFunction('ceil', Math.ceil);
|
|
@@ -148,6 +149,8 @@ export default function JexlF( /* config?: any*/) {
|
|
|
148
149
|
// color helpers
|
|
149
150
|
/** #jexlFunction Color functions | randomColor(feature.type) | deterministic color from a string (e.g. a feature type) */
|
|
150
151
|
j.addFunction('randomColor', randomColor);
|
|
152
|
+
/** #jexlFunction Color functions | categoricalColor(getInherited(feature, 'biotype'), ['protein_coding']) | a palette color per value: the values listed take the palette (an optional third argument) in order, any other value a stable color no listed value paints, a missing one grey */
|
|
153
|
+
j.addFunction('categoricalColor', categoricalColor);
|
|
151
154
|
// These take and return CSS color *strings*, not Colord objects: a config
|
|
152
155
|
// `jexl:` expression has no way to construct a Colord, and a color slot
|
|
153
156
|
// holding one resolves to the invalid-color sentinel rather than a color. So
|