@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1476 -265
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +16 -9
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +50 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +2 -2
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +528 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +488 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +527 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +24 -11
- package/esm/configuration/index.js +15 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
- package/esm/pluggableElementTypes/DisplayType.js +22 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +1 -1
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
- package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -49
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +1 -1
- package/esm/util/cachedSetup.js +2 -2
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +80 -0
- package/esm/util/featureTransforms.js +1579 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/groupKeys.d.ts +77 -0
- package/esm/util/groupKeys.js +155 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/io/index.js +19 -14
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +20 -27
- package/esm/util/jexlFilters.js +23 -11
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +845 -0
- package/esm/util/markEncodingTypes.d.ts +588 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +82 -0
- package/esm/util/stepTables.js +243 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +13 -8
- package/esm/util/tabix.js +17 -12
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +121 -40
- package/esm/util/tracks.js +497 -112
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +51 -0
- package/esm/util/unknownSnapshotKeys.js +82 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +70 -20
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** The sibling index format of a family: TBI for tabix, BAI for BAM. */
|
|
2
|
+
export type SiblingIndexType = 'TBI' | 'BAI';
|
|
3
|
+
export type IndexType = SiblingIndexType | 'CSI';
|
|
4
|
+
/** The extension an index of this type carries: `CSI` → `.csi`, `TBI` → `.tbi`. */
|
|
5
|
+
export declare function indexSuffix(indexType: IndexType): string;
|
|
6
|
+
/**
|
|
7
|
+
* Whether a file location names a CSI. htslib writes `.csi` in place of a `.bai`
|
|
8
|
+
* or a `.tbi` for a reference over 512 Mb and on request at any size, so the
|
|
9
|
+
* extension is the only thing distinguishing the two parsers.
|
|
10
|
+
*
|
|
11
|
+
* `makeIndexType` in `util/tracks.ts` asks this of a bare filename, for the
|
|
12
|
+
* guessers and add-track forms that WRITE an `indexType` beside the location.
|
|
13
|
+
* Those stay: a config the CLI or jbrowse-img writes is read by older JBrowse
|
|
14
|
+
* versions, which have no inference to fall back on.
|
|
15
|
+
*/
|
|
16
|
+
export declare function isCsiLocation(location: unknown): boolean;
|
|
17
|
+
/**
|
|
18
|
+
* An index sub-schema's snapshot with `indexType` filled in from the location it
|
|
19
|
+
* names, where it states none. Only CSI is ever filled in — the sibling format
|
|
20
|
+
* is the slot's own default.
|
|
21
|
+
*
|
|
22
|
+
* Belongs to the sub-schema rather than to the `uri` shorthand because it has to
|
|
23
|
+
* cover the paths no shorthand runs on: a long-form config, and an add-track
|
|
24
|
+
* form that writes a location and nothing else.
|
|
25
|
+
*/
|
|
26
|
+
export declare function fillIndexType(snap: Record<string, unknown>): Record<string, unknown>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { isPlainObject } from '../util/objectUtils.js';
|
|
2
|
+
/** The extension an index of this type carries: `CSI` → `.csi`, `TBI` → `.tbi`. */
|
|
3
|
+
export function indexSuffix(indexType) {
|
|
4
|
+
return `.${indexType.toLowerCase()}`;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Whether a file location names a CSI. htslib writes `.csi` in place of a `.bai`
|
|
8
|
+
* or a `.tbi` for a reference over 512 Mb and on request at any size, so the
|
|
9
|
+
* extension is the only thing distinguishing the two parsers.
|
|
10
|
+
*
|
|
11
|
+
* `makeIndexType` in `util/tracks.ts` asks this of a bare filename, for the
|
|
12
|
+
* guessers and add-track forms that WRITE an `indexType` beside the location.
|
|
13
|
+
* Those stay: a config the CLI or jbrowse-img writes is read by older JBrowse
|
|
14
|
+
* versions, which have no inference to fall back on.
|
|
15
|
+
*/
|
|
16
|
+
export function isCsiLocation(location) {
|
|
17
|
+
if (!isPlainObject(location)) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
const { uri, localPath } = location;
|
|
21
|
+
const name = typeof uri === 'string' ? uri : localPath;
|
|
22
|
+
// a presigned url carries its query string after the name
|
|
23
|
+
return typeof name === 'string' && /\.csi$/i.test(name.split(/[?#]/)[0]);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* An index sub-schema's snapshot with `indexType` filled in from the location it
|
|
27
|
+
* names, where it states none. Only CSI is ever filled in — the sibling format
|
|
28
|
+
* is the slot's own default.
|
|
29
|
+
*
|
|
30
|
+
* Belongs to the sub-schema rather than to the `uri` shorthand because it has to
|
|
31
|
+
* cover the paths no shorthand runs on: a long-form config, and an add-track
|
|
32
|
+
* form that writes a location and nothing else.
|
|
33
|
+
*/
|
|
34
|
+
export function fillIndexType(snap) {
|
|
35
|
+
return snap.indexType === undefined && isCsiLocation(snap.location)
|
|
36
|
+
? { ...snap, indexType: 'CSI' }
|
|
37
|
+
: snap;
|
|
38
|
+
}
|
|
@@ -4,12 +4,11 @@
|
|
|
4
4
|
* first, so a track's object is spread over the session-wide one and can
|
|
5
5
|
* override individual keys the global callback added.
|
|
6
6
|
*
|
|
7
|
-
* A tier that
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* and
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* hides a field, and the panels filter them out downstream.
|
|
7
|
+
* A tier that returns something other than an object is an authoring mistake,
|
|
8
|
+
* `"jexl:feature.name"` where `"jexl:{name:feature.name}"` was meant, and it
|
|
9
|
+
* throws rather than vanishing: spread, the string became rows keyed 0, 1, 2,
|
|
10
|
+
* and dropped, the author's callback silently did nothing. A tier returning
|
|
11
|
+
* null or undefined has nothing to add. `null` and `undefined` *values* survive:
|
|
12
|
+
* they are how a callback hides a field, and the panels filter them downstream.
|
|
14
13
|
*/
|
|
15
14
|
export declare function mergeFormatCallbacks(...tiers: unknown[]): Record<string, unknown>;
|
|
@@ -1,24 +1,27 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { isPlainObject } from '../util/objectUtils.js';
|
|
2
2
|
/**
|
|
3
3
|
* Combine the tiers of an object-returning format callback (`formatDetails` on
|
|
4
4
|
* the feature-details panel, `formatAbout` on the About dialog), earliest
|
|
5
5
|
* first, so a track's object is spread over the session-wide one and can
|
|
6
6
|
* override individual keys the global callback added.
|
|
7
7
|
*
|
|
8
|
-
* A tier that
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
* and
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* hides a field, and the panels filter them out downstream.
|
|
8
|
+
* A tier that returns something other than an object is an authoring mistake,
|
|
9
|
+
* `"jexl:feature.name"` where `"jexl:{name:feature.name}"` was meant, and it
|
|
10
|
+
* throws rather than vanishing: spread, the string became rows keyed 0, 1, 2,
|
|
11
|
+
* and dropped, the author's callback silently did nothing. A tier returning
|
|
12
|
+
* null or undefined has nothing to add. `null` and `undefined` *values* survive:
|
|
13
|
+
* they are how a callback hides a field, and the panels filter them downstream.
|
|
15
14
|
*/
|
|
16
15
|
export function mergeFormatCallbacks(...tiers) {
|
|
17
16
|
const out = {};
|
|
18
17
|
for (const tier of tiers) {
|
|
19
|
-
if (
|
|
20
|
-
|
|
18
|
+
if (tier == null) {
|
|
19
|
+
continue;
|
|
20
|
+
}
|
|
21
|
+
if (!isPlainObject(tier)) {
|
|
22
|
+
throw new Error(`a format callback returned ${Array.isArray(tier) ? 'an array' : `a ${typeof tier}`} where an object of fields was expected, e.g. "jexl:{name:feature.name}" rather than "jexl:feature.name"`);
|
|
21
23
|
}
|
|
24
|
+
Object.assign(out, tier);
|
|
22
25
|
}
|
|
23
26
|
return out;
|
|
24
27
|
}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { Feature } from '../util/index.ts';
|
|
2
2
|
import type { JexlInstance } from '../util/jexlStrings.ts';
|
|
3
|
-
import type { AnyConfigurationModel,
|
|
4
|
-
import type { IMSTMap } from '@jbrowse/mobx-state-tree';
|
|
3
|
+
import type { AnyConfigurationModel, AnyConfigurationSnapshot, ConfigurationSchemaForModel, ConfigurationSlotName, ConfigurationSlotPath, ConfigurationSlotPathValue, ConfigurationSlotValue } from './types.ts';
|
|
5
4
|
/**
|
|
6
5
|
* #api core/configuration
|
|
7
6
|
* Given a configuration model (an instance of a ConfigurationSchema), read the
|
|
@@ -25,8 +24,7 @@ import type { IMSTMap } from '@jbrowse/mobx-state-tree';
|
|
|
25
24
|
* will be sent to each of the slotNames
|
|
26
25
|
*/
|
|
27
26
|
export declare function readConfObject(confObject: AnyConfigurationModel): AnyConfigurationSnapshot;
|
|
28
|
-
export declare function readConfObject<CONFMODEL extends AnyConfigurationModel, SLOT extends ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>> |
|
|
29
|
-
export declare function readConfObject(confObject: IMSTMap<AnyConfigurationSchemaType>, slotPath?: string | string[], args?: Record<string, unknown>): any;
|
|
27
|
+
export declare function readConfObject<CONFMODEL extends AnyConfigurationModel, const SLOT extends ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>> | ConfigurationSlotPath<ConfigurationSchemaForModel<CONFMODEL>> = ConfigurationSlotName<ConfigurationSchemaForModel<CONFMODEL>>>(confObject: CONFMODEL, slotPath?: SLOT, args?: Record<string, unknown>): SLOT extends string ? ConfigurationSlotValue<ConfigurationSchemaForModel<CONFMODEL>, SLOT> : ConfigurationSlotPathValue<ConfigurationSchemaForModel<CONFMODEL>, SLOT>;
|
|
30
28
|
/**
|
|
31
29
|
* Read a value from a plain config snapshot object. Automatically evaluates
|
|
32
30
|
* "jexl:..." strings per-feature. Works without MST — intended for use in
|
|
@@ -34,23 +32,3 @@ export declare function readConfObject(confObject: IMSTMap<AnyConfigurationSchem
|
|
|
34
32
|
* so plugin-registered functions (e.g. in a custom `mouseover` slot) resolve.
|
|
35
33
|
*/
|
|
36
34
|
export declare function readConfigValue<T>(config: Record<string, unknown>, key: string | string[], feature: Feature, jexl: JexlInstance): T;
|
|
37
|
-
/**
|
|
38
|
-
* #api core/configuration
|
|
39
|
-
* Read a single config slot from a config that may be **either** a live MST
|
|
40
|
-
* node or a plain snapshot object, evaluating the value if it is a `jexl:`
|
|
41
|
-
* expression. For the dialogs and panels that are handed a track config without
|
|
42
|
-
* knowing which of the two they got. An About panel gets a hydrated track
|
|
43
|
-
* config from the session and a bare object from an embedded caller.
|
|
44
|
-
*
|
|
45
|
-
* Reach for `readConfObject` or `readConfigValue` when the shape is known:
|
|
46
|
-
* this one decides at runtime, and the plain branch inherits the snapshot
|
|
47
|
-
* caveat (a slot at its default is absent from a snapshot, so it reads
|
|
48
|
-
* `undefined`).
|
|
49
|
-
*
|
|
50
|
-
* @param config - live config model or plain config object
|
|
51
|
-
* @param slotPath - slot name, or path of sub-config names ending in a slot
|
|
52
|
-
* @param args - extra arguments for a callback slot, e.g. `{ feature }`
|
|
53
|
-
* @param jexl - realm jexl instance, required only to evaluate a callback slot
|
|
54
|
-
* on a plain object (a live node resolves its own from env)
|
|
55
|
-
*/
|
|
56
|
-
export declare function readConfSlot<T = unknown>(config: AnyConfigurationModel | Record<string, unknown>, slotPath: string | string[], args?: Record<string, unknown>, jexl?: JexlInstance): T;
|
|
@@ -1,13 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @module
|
|
3
|
-
* The config **readers**: `readConfObject` off a live MST config node,
|
|
4
|
-
* `readConfigValue` off a plain snapshot object in a worker or a renderer
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
*
|
|
3
|
+
* The config **readers**: `readConfObject` off a live MST config node, and
|
|
4
|
+
* `readConfigValue` off a plain snapshot object in a worker or a renderer. Both
|
|
5
|
+
* exist to evaluate a slot's `jexl:...` callback on read; they differ only in
|
|
6
|
+
* where the jexl instance comes from, the node's env or an explicit argument.
|
|
7
|
+
* A `featureField` slot's `jexl:` expression is the display's to evaluate per
|
|
8
|
+
* feature, so `readConfObject` hands it over as written.
|
|
9
9
|
*/
|
|
10
|
-
import { getEnv, getSnapshot, getType,
|
|
10
|
+
import { getEnv, getSnapshot, getType, isStateTreeNode, } from '@jbrowse/mobx-state-tree';
|
|
11
|
+
import { getConfigurationSchemaMetadata } from './schemaRegistry.js';
|
|
11
12
|
import { evaluateJexl, isCallbackValue } from './slotValueUtils.js';
|
|
12
13
|
// Evaluate a slot's `jexl:...` callback string against the realm's single jexl
|
|
13
14
|
// instance (carrying plugin-registered functions), read from the config node's
|
|
@@ -30,26 +31,20 @@ function evalConfigCallback(expr, args, confObject) {
|
|
|
30
31
|
}
|
|
31
32
|
return evaluateJexl(expr, args, jexl);
|
|
32
33
|
}
|
|
33
|
-
function
|
|
34
|
-
return isStateTreeNode(confObject) &&
|
|
35
|
-
|
|
36
|
-
// Read a slot's raw stored value, drilling into a map entry via `.get()` when
|
|
37
|
-
// the config is itself a types.map.
|
|
38
|
-
function rawSlotValue(confObject, slotName) {
|
|
39
|
-
return isConfigMap(confObject)
|
|
40
|
-
? confObject.get(slotName)
|
|
41
|
-
: confObject[slotName];
|
|
34
|
+
function isFeatureField(confObject, slotName) {
|
|
35
|
+
return (isStateTreeNode(confObject) &&
|
|
36
|
+
!!getConfigurationSchemaMetadata(getType(confObject))?.featureFields.has(slotName));
|
|
42
37
|
}
|
|
43
38
|
// Read and resolve a single slot: raw value, jexl callback evaluation, then a
|
|
44
39
|
// referentially-stable snapshot for sub-config nodes.
|
|
45
40
|
function readSlot(confObject, slotName, args) {
|
|
46
41
|
// strict undefined check, not truthiness — a slot value can legitimately be
|
|
47
42
|
// falsy (0, '', false, null)
|
|
48
|
-
const value =
|
|
43
|
+
const value = confObject[slotName];
|
|
49
44
|
if (value === undefined) {
|
|
50
45
|
return undefined;
|
|
51
46
|
}
|
|
52
|
-
const val = isCallbackValue(value)
|
|
47
|
+
const val = isCallbackValue(value) && !isFeatureField(confObject, slotName)
|
|
53
48
|
? evalConfigCallback(value, args, confObject)
|
|
54
49
|
: value;
|
|
55
50
|
// Fast path for primitives (most common case)
|
|
@@ -63,8 +58,9 @@ function readSlot(confObject, slotName, args) {
|
|
|
63
58
|
return isStateTreeNode(val) ? getSnapshot(val) : val;
|
|
64
59
|
}
|
|
65
60
|
// loose implementation signature: the body returns values that are `any` by
|
|
66
|
-
// nature (raw slot values, snapshots); the typed
|
|
67
|
-
// see.
|
|
61
|
+
// nature (raw slot values, snapshots); the typed overloads above are what
|
|
62
|
+
// callers see. No looser overload admits the model: one that did was a
|
|
63
|
+
// catch-all a slot-name typo fell through to, compiling clean as `any`.
|
|
68
64
|
export function readConfObject(confObject, slotPath, args = {}) {
|
|
69
65
|
// the single-slot read, first and allocation-free: it is the shape of nearly
|
|
70
66
|
// every one of the ~1300 call sites, so it doesn't get normalized into a
|
|
@@ -89,7 +85,7 @@ export function readConfObject(confObject, slotPath, args = {}) {
|
|
|
89
85
|
// whole argument-shape preamble above at each level.
|
|
90
86
|
let conf = confObject;
|
|
91
87
|
for (let i = 0; i < slotPath.length - 1; i++) {
|
|
92
|
-
const subConf =
|
|
88
|
+
const subConf = conf[slotPath[i]];
|
|
93
89
|
if (subConf === undefined) {
|
|
94
90
|
return undefined;
|
|
95
91
|
}
|
|
@@ -97,10 +93,9 @@ export function readConfObject(confObject, slotPath, args = {}) {
|
|
|
97
93
|
}
|
|
98
94
|
return readSlot(conf, slotPath[slotPath.length - 1], args);
|
|
99
95
|
}
|
|
100
|
-
// The plain-object half of the slot walk,
|
|
101
|
-
//
|
|
102
|
-
//
|
|
103
|
-
// reduce.
|
|
96
|
+
// The plain-object half of the slot walk, for readConfigValue. The MST half is
|
|
97
|
+
// readSlot/rawSlotValue above. A plain object has no map entries and no
|
|
98
|
+
// sub-config nodes to snapshot, so it is just a path reduce.
|
|
104
99
|
function resolveConfigValue(config, key) {
|
|
105
100
|
if (Array.isArray(key)) {
|
|
106
101
|
let val = config;
|
|
@@ -121,41 +116,3 @@ export function readConfigValue(config, key, feature, jexl) {
|
|
|
121
116
|
const raw = resolveConfigValue(config, key);
|
|
122
117
|
return (isCallbackValue(raw) ? evaluateJexl(raw, { feature }, jexl) : raw);
|
|
123
118
|
}
|
|
124
|
-
/**
|
|
125
|
-
* #api core/configuration
|
|
126
|
-
* Read a single config slot from a config that may be **either** a live MST
|
|
127
|
-
* node or a plain snapshot object, evaluating the value if it is a `jexl:`
|
|
128
|
-
* expression. For the dialogs and panels that are handed a track config without
|
|
129
|
-
* knowing which of the two they got. An About panel gets a hydrated track
|
|
130
|
-
* config from the session and a bare object from an embedded caller.
|
|
131
|
-
*
|
|
132
|
-
* Reach for `readConfObject` or `readConfigValue` when the shape is known:
|
|
133
|
-
* this one decides at runtime, and the plain branch inherits the snapshot
|
|
134
|
-
* caveat (a slot at its default is absent from a snapshot, so it reads
|
|
135
|
-
* `undefined`).
|
|
136
|
-
*
|
|
137
|
-
* @param config - live config model or plain config object
|
|
138
|
-
* @param slotPath - slot name, or path of sub-config names ending in a slot
|
|
139
|
-
* @param args - extra arguments for a callback slot, e.g. `{ feature }`
|
|
140
|
-
* @param jexl - realm jexl instance, required only to evaluate a callback slot
|
|
141
|
-
* on a plain object (a live node resolves its own from env)
|
|
142
|
-
*/
|
|
143
|
-
export function readConfSlot(config, slotPath, args = {}, jexl) {
|
|
144
|
-
if (isStateTreeNode(config)) {
|
|
145
|
-
// pass slotPath through rather than normalizing a string into a one-element
|
|
146
|
-
// array: readConfObject keeps the single-slot read allocation-free
|
|
147
|
-
return readConfObject(config, slotPath, args);
|
|
148
|
-
}
|
|
149
|
-
const value = resolveConfigValue(config, slotPath);
|
|
150
|
-
// A plain-object config has no MST env, so the realm's jexl instance can't be
|
|
151
|
-
// resolved automatically — callers reading a callback slot must pass it. Only
|
|
152
|
-
// reached when the slot actually holds a `jexl:` value (trackId/adapter/etc.
|
|
153
|
-
// never do), so non-callback readers need not supply it.
|
|
154
|
-
if (isCallbackValue(value)) {
|
|
155
|
-
if (!jexl) {
|
|
156
|
-
throw new Error(`cannot evaluate jexl config slot ${JSON.stringify(slotPath)} on a plain-object config: no jexl instance provided`);
|
|
157
|
-
}
|
|
158
|
-
return evaluateJexl(value, args, jexl);
|
|
159
|
-
}
|
|
160
|
-
return value;
|
|
161
|
-
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { ConfigurationSchemaDefinition } from './configurationSchema.ts';
|
|
2
|
+
import type { IAnyType } from '@jbrowse/mobx-state-tree';
|
|
3
|
+
/**
|
|
4
|
+
* A combination one config object cannot mean, declared once: when every slot
|
|
5
|
+
* named in `when` holds one of the listed values, each dotted path in `slots`
|
|
6
|
+
* has to name a value — a non-empty string, or a sub-schema a string lifts
|
|
7
|
+
* into. `message` says why, and `id` is the stable name a report carries.
|
|
8
|
+
* `requirementProblems` reads it for a display's notice, and the generated
|
|
9
|
+
* JSON Schema carries it as `if`/`then` with the message, which the CLI
|
|
10
|
+
* validator and an editor report.
|
|
11
|
+
*
|
|
12
|
+
* `ConfigurationSchema()` types `when`, its values and `slots` off the
|
|
13
|
+
* definition and throws at construction for what the types cannot reach: a
|
|
14
|
+
* misspelt `when` key or value would never fire, and a misspelt path would
|
|
15
|
+
* require a key `closed` then refuses.
|
|
16
|
+
*/
|
|
17
|
+
export interface ConfigurationSchemaRequirement<WHEN extends Partial<Record<string, string[]>> = Partial<Record<string, string[]>>, PATH extends string = string> {
|
|
18
|
+
id: string;
|
|
19
|
+
when: WHEN;
|
|
20
|
+
slots: PATH[];
|
|
21
|
+
message: string;
|
|
22
|
+
}
|
|
23
|
+
/** A requirement a snapshot does not meet: the slot path left empty, and why. */
|
|
24
|
+
export interface RequirementProblem {
|
|
25
|
+
id: string;
|
|
26
|
+
slot: string;
|
|
27
|
+
message: string;
|
|
28
|
+
}
|
|
29
|
+
export declare function checkRequirements(modelName: string, definition: ConfigurationSchemaDefinition, requires: ConfigurationSchemaRequirement[]): void;
|
|
30
|
+
/**
|
|
31
|
+
* #api core/configuration
|
|
32
|
+
* The `requires` entries of a configuration schema that `snapshot` does not
|
|
33
|
+
* meet, as a config file or `getSnapshot` spells it: a slot left off reads as
|
|
34
|
+
* its default, so a `when` value that is the default fires for an absent slot,
|
|
35
|
+
* which is what the generated JSON Schema's `if` does.
|
|
36
|
+
*/
|
|
37
|
+
export declare function requirementProblems(type: IAnyType, snapshot: Record<string, unknown>): RequirementProblem[];
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
import { getConfigurationSchemaMetadata } from './schemaRegistry.js';
|
|
2
|
+
import { isBareConfigurationSchemaType, isSlotDefinitionEntry, shorthandTargets, } from './schemaTypes.js';
|
|
3
|
+
function memberOf(definition, name) {
|
|
4
|
+
return Object.hasOwn(definition, name) ? definition[name] : undefined;
|
|
5
|
+
}
|
|
6
|
+
function subSchemaOf(entry) {
|
|
7
|
+
return isBareConfigurationSchemaType(entry)
|
|
8
|
+
? getConfigurationSchemaMetadata(entry)
|
|
9
|
+
: undefined;
|
|
10
|
+
}
|
|
11
|
+
function requiredPathProblem(modelName, definition, path) {
|
|
12
|
+
const [head = '', ...rest] = path;
|
|
13
|
+
const entry = memberOf(definition, head);
|
|
14
|
+
const sub = subSchemaOf(entry);
|
|
15
|
+
return entry === undefined
|
|
16
|
+
? `${modelName} declares no "${head}"`
|
|
17
|
+
: rest.length > 0
|
|
18
|
+
? sub
|
|
19
|
+
? requiredPathProblem(sub.name, sub.definition, rest)
|
|
20
|
+
: `"${head}" is not a single sub-schema, so no path runs through it`
|
|
21
|
+
: isSlotDefinitionEntry(entry)
|
|
22
|
+
? entry.defaultValue === undefined ||
|
|
23
|
+
typeof entry.defaultValue === 'string'
|
|
24
|
+
? undefined
|
|
25
|
+
: `"${head}" holds no string, and a requirement is met by naming one`
|
|
26
|
+
: sub?.options.shorthand !== undefined
|
|
27
|
+
? undefined
|
|
28
|
+
: `"${head}" is neither a slot nor a sub-schema a string lifts into`;
|
|
29
|
+
}
|
|
30
|
+
export function checkRequirements(modelName, definition, requires) {
|
|
31
|
+
for (const { when, slots } of requires) {
|
|
32
|
+
for (const [slot, values = []] of Object.entries(when)) {
|
|
33
|
+
const entry = memberOf(definition, slot);
|
|
34
|
+
if (!isSlotDefinitionEntry(entry)) {
|
|
35
|
+
throw new Error(`${modelName} requires something when "${slot}" holds a value, and declares no such slot`);
|
|
36
|
+
}
|
|
37
|
+
const refused = values.filter(value => entry.model?.is(value) === false);
|
|
38
|
+
if (refused.length > 0) {
|
|
39
|
+
throw new Error(`${modelName} requires something when "${slot}" holds ${refused.join(', ')}, which the slot does not take`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
for (const path of slots) {
|
|
43
|
+
const problem = requiredPathProblem(modelName, definition, path.split('.'));
|
|
44
|
+
if (problem) {
|
|
45
|
+
throw new Error(`${modelName} requires "${path}", and ${problem}`);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
function namesAValue(definition, snapshot, path) {
|
|
51
|
+
const [head = '', ...rest] = path;
|
|
52
|
+
const value = typeof snapshot === 'object' && snapshot !== null
|
|
53
|
+
? snapshot[head]
|
|
54
|
+
: undefined;
|
|
55
|
+
const sub = subSchemaOf(memberOf(definition, head));
|
|
56
|
+
const named = sub && shorthandTargets(sub).string;
|
|
57
|
+
return rest.length > 0
|
|
58
|
+
? sub !== undefined && namesAValue(sub.definition, value, rest)
|
|
59
|
+
: typeof value === 'string'
|
|
60
|
+
? value !== ''
|
|
61
|
+
: sub !== undefined &&
|
|
62
|
+
named !== undefined &&
|
|
63
|
+
namesAValue(sub.definition, value, [named]);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* #api core/configuration
|
|
67
|
+
* The `requires` entries of a configuration schema that `snapshot` does not
|
|
68
|
+
* meet, as a config file or `getSnapshot` spells it: a slot left off reads as
|
|
69
|
+
* its default, so a `when` value that is the default fires for an absent slot,
|
|
70
|
+
* which is what the generated JSON Schema's `if` does.
|
|
71
|
+
*/
|
|
72
|
+
export function requirementProblems(type, snapshot) {
|
|
73
|
+
const schema = getConfigurationSchemaMetadata(type);
|
|
74
|
+
if (!schema) {
|
|
75
|
+
return [];
|
|
76
|
+
}
|
|
77
|
+
const { definition } = schema;
|
|
78
|
+
return (schema.options.requires ?? [])
|
|
79
|
+
.filter(({ when }) => Object.entries(when).every(([slot, values]) => {
|
|
80
|
+
const entry = memberOf(definition, slot);
|
|
81
|
+
const held = snapshot[slot] ??
|
|
82
|
+
(isSlotDefinitionEntry(entry) ? entry.defaultValue : undefined);
|
|
83
|
+
return typeof held === 'string' && values?.includes(held);
|
|
84
|
+
}))
|
|
85
|
+
.flatMap(({ id, slots, message }) => slots
|
|
86
|
+
.filter(path => !namesAValue(definition, snapshot, path.split('.')))
|
|
87
|
+
.map(slot => ({ id, slot, message })));
|
|
88
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import type { ConfigurationSchemaDefinition, MergedConfigurationSchemaOptions } from './configurationSchema.ts';
|
|
2
|
-
import type { AnyConfigurationModel } from './types.ts';
|
|
2
|
+
import type { AnyConfigurationModel, AnyConfigurationSchemaType } from './types.ts';
|
|
3
3
|
import type { IAnyType } from '@jbrowse/mobx-state-tree';
|
|
4
4
|
export interface ConfigurationSchemaMetadata {
|
|
5
|
+
/** the name `ConfigurationSchema` was given, e.g. `FeatureColor` */
|
|
6
|
+
name: string;
|
|
5
7
|
/** the raw slot/sub-schema/constant table, also carrying per-slot editor metadata */
|
|
6
8
|
definition: ConfigurationSchemaDefinition;
|
|
7
9
|
/**
|
|
@@ -9,27 +11,42 @@ export interface ConfigurationSchemaMetadata {
|
|
|
9
11
|
* i.e. with any `baseConfiguration`'s hooks already composed in
|
|
10
12
|
*/
|
|
11
13
|
options: MergedConfigurationSchemaOptions<any, any>;
|
|
14
|
+
/** the frozen-family slots, the only members a snapshot's `null` is stored in */
|
|
15
|
+
storesNull: ReadonlySet<string>;
|
|
16
|
+
/** the `featureField` slots, which the reader hands over as written */
|
|
17
|
+
featureFields: ReadonlySet<string>;
|
|
18
|
+
/** the slots that refuse a `jexl:` string: every one but a callback and a featureField */
|
|
19
|
+
takesNoCallback: ReadonlyMap<string, string>;
|
|
12
20
|
}
|
|
13
21
|
export declare function registerConfigurationSchema(type: IAnyType, metadata: ConfigurationSchemaMetadata): void;
|
|
14
|
-
|
|
22
|
+
/**
|
|
23
|
+
* A schema's metadata, by the schema type or a live node of it. Undefined for
|
|
24
|
+
* anything `ConfigurationSchema` did not build — a pluggable union, an array
|
|
25
|
+
* of schemas.
|
|
26
|
+
*/
|
|
27
|
+
export declare function getConfigurationSchemaMetadata(nodeOrType: AnyConfigurationModel | IAnyType): ConfigurationSchemaMetadata | undefined;
|
|
15
28
|
export declare function isRegisteredConfigurationSchema(type: IAnyType): boolean;
|
|
29
|
+
export interface ConfigurationSchemaUnionMetadata {
|
|
30
|
+
/** the name `ConfigurationSchemaUnion` was given, e.g. `MarkTransform` */
|
|
31
|
+
name: string;
|
|
32
|
+
/** each member schema, keyed by the `type` it answers to */
|
|
33
|
+
members: Record<string, AnyConfigurationSchemaType>;
|
|
34
|
+
}
|
|
35
|
+
export declare function registerConfigurationSchemaUnion(type: IAnyType, metadata: ConfigurationSchemaUnionMetadata): void;
|
|
36
|
+
/**
|
|
37
|
+
* The name and members of a union `ConfigurationSchemaUnion` built, or
|
|
38
|
+
* undefined for any other type — a pluggable element union included.
|
|
39
|
+
*/
|
|
40
|
+
export declare function getConfigurationSchemaUnion(type: IAnyType): ConfigurationSchemaUnionMetadata | undefined;
|
|
16
41
|
/**
|
|
17
42
|
* The slot/sub-schema/constant table for a config (includes slots merged in from
|
|
18
43
|
* `baseConfiguration` at schema construction). Undefined when the argument isn't
|
|
19
44
|
* a registered configuration schema. The single accessor for "what are this
|
|
20
|
-
* config's slots?" — shared by the slot facade
|
|
21
|
-
* `fullConfSnapshot`.
|
|
45
|
+
* config's slots?" — shared by the slot facade and `fullConfSnapshot`.
|
|
22
46
|
*
|
|
23
|
-
* Takes a live node *or* the schema type itself
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
* required MST identifier, so there is nothing to `create({})`.
|
|
47
|
+
* Takes a live node *or* the schema type itself: a caller enumerating
|
|
48
|
+
* registered element types (`ConfigSlotDefaults.test.ts`) holds only the type,
|
|
49
|
+
* and for a track schema it cannot get a node — `explicitIdentifier` makes
|
|
50
|
+
* `trackId` a required MST identifier, so there is nothing to `create({})`.
|
|
28
51
|
*/
|
|
29
52
|
export declare function getConfigurationSchemaDefinition(nodeOrType: AnyConfigurationModel | IAnyType): ConfigurationSchemaDefinition | undefined;
|
|
30
|
-
/**
|
|
31
|
-
* The construction options a live config node's schema was built with
|
|
32
|
-
* (identifier kind, `explicitlyTyped`, the `preProcessSnapshot` hook). Undefined
|
|
33
|
-
* when the node's type isn't a registered configuration schema.
|
|
34
|
-
*/
|
|
35
|
-
export declare function getConfigurationSchemaOptions(node: AnyConfigurationModel): MergedConfigurationSchemaOptions<any, any> | undefined;
|
|
@@ -1,50 +1,48 @@
|
|
|
1
|
-
import { getType, isType } from '@jbrowse/mobx-state-tree';
|
|
2
|
-
// Per-schema metadata keyed by the
|
|
3
|
-
//
|
|
4
|
-
// sub-schema
|
|
5
|
-
//
|
|
6
|
-
//
|
|
7
|
-
//
|
|
8
|
-
//
|
|
9
|
-
// plain MST type, "is this a config schema" is registry membership instead of a
|
|
10
|
-
// flag-or-name-match, and the metadata is reached by type identity. The map is
|
|
11
|
-
// weak, so a discarded schema type is collected normally.
|
|
1
|
+
import { getType, isType, unwrapType } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
// Per-schema metadata keyed by the model type `ConfigurationSchema` builds. A
|
|
3
|
+
// lookup arrives by any handle on it — the stripDefault wrapper the factory
|
|
4
|
+
// returns and a sub-schema property holds, an `optional` or `snapshotProcessor`
|
|
5
|
+
// around that, a resolved `types.late`, or `getType(node)` — and `unwrapType`
|
|
6
|
+
// takes each to the model. The type stays a plain MST type, "is this a config
|
|
7
|
+
// schema" is registry membership, and the map is weak, so a discarded schema
|
|
8
|
+
// type is collected normally.
|
|
12
9
|
const schemaRegistry = new WeakMap();
|
|
13
10
|
export function registerConfigurationSchema(type, metadata) {
|
|
14
11
|
schemaRegistry.set(type, metadata);
|
|
15
12
|
}
|
|
16
|
-
|
|
17
|
-
|
|
13
|
+
/**
|
|
14
|
+
* A schema's metadata, by the schema type or a live node of it. Undefined for
|
|
15
|
+
* anything `ConfigurationSchema` did not build — a pluggable union, an array
|
|
16
|
+
* of schemas.
|
|
17
|
+
*/
|
|
18
|
+
export function getConfigurationSchemaMetadata(nodeOrType) {
|
|
19
|
+
return schemaRegistry.get(unwrapType(isType(nodeOrType) ? nodeOrType : getType(nodeOrType)));
|
|
18
20
|
}
|
|
19
21
|
export function isRegisteredConfigurationSchema(type) {
|
|
20
|
-
return schemaRegistry.has(type);
|
|
22
|
+
return schemaRegistry.has(unwrapType(type));
|
|
23
|
+
}
|
|
24
|
+
const unionRegistry = new WeakMap();
|
|
25
|
+
export function registerConfigurationSchemaUnion(type, metadata) {
|
|
26
|
+
unionRegistry.set(type, metadata);
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* The name and members of a union `ConfigurationSchemaUnion` built, or
|
|
30
|
+
* undefined for any other type — a pluggable element union included.
|
|
31
|
+
*/
|
|
32
|
+
export function getConfigurationSchemaUnion(type) {
|
|
33
|
+
return unionRegistry.get(type);
|
|
21
34
|
}
|
|
22
|
-
// The three lookups above take a schema *type*; the two below take a live config
|
|
23
|
-
// *node* and make the `getType` hop themselves, which is what every reader
|
|
24
|
-
// actually wants — a node is what they hold. Leaving the hop to the call site is
|
|
25
|
-
// how `slotFacade` came to reach the registry directly for `options` while going
|
|
26
|
-
// through a helper for `definition`.
|
|
27
35
|
/**
|
|
28
36
|
* The slot/sub-schema/constant table for a config (includes slots merged in from
|
|
29
37
|
* `baseConfiguration` at schema construction). Undefined when the argument isn't
|
|
30
38
|
* a registered configuration schema. The single accessor for "what are this
|
|
31
|
-
* config's slots?" — shared by the slot facade
|
|
32
|
-
* `fullConfSnapshot`.
|
|
39
|
+
* config's slots?" — shared by the slot facade and `fullConfSnapshot`.
|
|
33
40
|
*
|
|
34
|
-
* Takes a live node *or* the schema type itself
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* required MST identifier, so there is nothing to `create({})`.
|
|
41
|
+
* Takes a live node *or* the schema type itself: a caller enumerating
|
|
42
|
+
* registered element types (`ConfigSlotDefaults.test.ts`) holds only the type,
|
|
43
|
+
* and for a track schema it cannot get a node — `explicitIdentifier` makes
|
|
44
|
+
* `trackId` a required MST identifier, so there is nothing to `create({})`.
|
|
39
45
|
*/
|
|
40
46
|
export function getConfigurationSchemaDefinition(nodeOrType) {
|
|
41
|
-
return getConfigurationSchemaMetadata(
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* The construction options a live config node's schema was built with
|
|
45
|
-
* (identifier kind, `explicitlyTyped`, the `preProcessSnapshot` hook). Undefined
|
|
46
|
-
* when the node's type isn't a registered configuration schema.
|
|
47
|
-
*/
|
|
48
|
-
export function getConfigurationSchemaOptions(node) {
|
|
49
|
-
return getConfigurationSchemaMetadata(getType(node))?.options;
|
|
47
|
+
return getConfigurationSchemaMetadata(nodeOrType)?.definition;
|
|
50
48
|
}
|
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import type { ConfigSlotDefinition } from './configurationSlot.ts';
|
|
2
|
+
import type { ConfigurationSchemaMetadata } from './schemaRegistry.ts';
|
|
2
3
|
import type { AnyConfigurationModel, AnyConfigurationSchemaType } from './types.ts';
|
|
3
4
|
/**
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* @returns Array of type names contained in the union
|
|
5
|
+
* The names an explicitly typed union's members answer to, each the name its
|
|
6
|
+
* schema was given, read through whatever wraps the union — a pluggable
|
|
7
|
+
* union's `snapshotProcessor`, a `maybe`, a `types.late`. A member that is
|
|
8
|
+
* itself a union contributes its own; a member with no type of its own throws.
|
|
9
9
|
*/
|
|
10
10
|
export declare function getTypeNamesFromExplicitlyTypedUnion(maybeUnionType: unknown): string[];
|
|
11
|
+
/** The type `ConfigurationSchema()` built, by any handle on it (`schemaRegistry.ts`). */
|
|
11
12
|
export declare function isBareConfigurationSchemaType(thing: unknown): thing is AnyConfigurationSchemaType;
|
|
13
|
+
/** A schema, or a union, array or map of them. */
|
|
12
14
|
export declare function isConfigurationSchemaType(thing: unknown): thing is AnyConfigurationSchemaType;
|
|
13
15
|
/**
|
|
14
16
|
* A configuration schema definition maps each key to exactly one of three kinds
|
|
@@ -21,3 +23,17 @@ export declare function isConfigurationSchemaType(thing: unknown): thing is AnyC
|
|
|
21
23
|
export declare function isConstantEntry(def: unknown): def is string | number;
|
|
22
24
|
export declare function isSlotDefinitionEntry(def: unknown): def is ConfigSlotDefinition;
|
|
23
25
|
export declare function isConfigurationModel(thing: unknown): thing is AnyConfigurationModel;
|
|
26
|
+
/** A bare value a schema's `shorthand` lifts. */
|
|
27
|
+
export type ShorthandForm = 'string' | 'number';
|
|
28
|
+
/**
|
|
29
|
+
* The slot a bare value of each form lifts into, off a `shorthand` option:
|
|
30
|
+
* each slot it names takes the form its own type holds, a number where it
|
|
31
|
+
* holds one (`rules: [7.3]`) and a string otherwise (`color: 'red'`), so a
|
|
32
|
+
* width naming `value` and `field` reads `size: 3` as the one and
|
|
33
|
+
* `size: 'score'` as the other.
|
|
34
|
+
*/
|
|
35
|
+
export declare function shorthandTargetsOf(definition: Record<string, unknown>, shorthand: string | readonly string[] | undefined): Partial<Record<ShorthandForm, string>>;
|
|
36
|
+
/** The shorthand form of a bare value, or undefined for any other value. */
|
|
37
|
+
export declare function bareFormOf(value: unknown): ShorthandForm | undefined;
|
|
38
|
+
/** {@link shorthandTargetsOf} a registered schema. */
|
|
39
|
+
export declare function shorthandTargets({ definition, options, }: ConfigurationSchemaMetadata): Partial<Record<ShorthandForm, string>>;
|