@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
|
@@ -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>>;
|
|
@@ -5,75 +5,50 @@
|
|
|
5
5
|
* schema construction, every reader, and the config editor — so "is this a
|
|
6
6
|
* config schema?" and "what kind of entry is this?" have one answer everywhere.
|
|
7
7
|
*/
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { isRegisteredConfigurationSchema } from './schemaRegistry.js';
|
|
8
|
+
import { asArrayType, asMapType, getType, getUnionSubtypes, isStateTreeNode, isType, isUnionType, } from '@jbrowse/mobx-state-tree';
|
|
9
|
+
import { getConfigurationSchemaMetadata, isRegisteredConfigurationSchema, } from './schemaRegistry.js';
|
|
11
10
|
/**
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
* @returns Array of type names contained in the union
|
|
11
|
+
* The names an explicitly typed union's members answer to, each the name its
|
|
12
|
+
* schema was given, read through whatever wraps the union — a pluggable
|
|
13
|
+
* union's `snapshotProcessor`, a `maybe`, a `types.late`. A member that is
|
|
14
|
+
* itself a union contributes its own; a member with no type of its own throws.
|
|
17
15
|
*/
|
|
18
16
|
export function getTypeNamesFromExplicitlyTypedUnion(maybeUnionType) {
|
|
19
|
-
if (isType(maybeUnionType)) {
|
|
20
|
-
|
|
21
|
-
if (isUnionType(resolved)) {
|
|
22
|
-
const typeNames = [];
|
|
23
|
-
for (const subType of getUnionSubTypes(resolved)) {
|
|
24
|
-
const resolvedSub = resolveLateType(subType);
|
|
25
|
-
// a nested union contributes its own names; otherwise the subtype is a
|
|
26
|
-
// single explicitly-typed schema whose name is its default's `type`
|
|
27
|
-
const nested = getTypeNamesFromExplicitlyTypedUnion(resolvedSub);
|
|
28
|
-
if (nested.length) {
|
|
29
|
-
typeNames.push(...nested);
|
|
30
|
-
}
|
|
31
|
-
else {
|
|
32
|
-
const typeName = getDefaultValue(resolvedSub).type;
|
|
33
|
-
if (!typeName) {
|
|
34
|
-
throw new Error(`invalid config schema type ${resolvedSub}`);
|
|
35
|
-
}
|
|
36
|
-
typeNames.push(typeName);
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
return typeNames;
|
|
40
|
-
}
|
|
17
|
+
if (!isType(maybeUnionType) || !isUnionType(maybeUnionType)) {
|
|
18
|
+
return [];
|
|
41
19
|
}
|
|
42
|
-
return
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
if (isModelType(thing) && isRegisteredConfigurationSchema(thing)) {
|
|
47
|
-
return true;
|
|
20
|
+
return getUnionSubtypes(maybeUnionType).flatMap(member => {
|
|
21
|
+
const meta = getConfigurationSchemaMetadata(member);
|
|
22
|
+
if (meta?.options.explicitlyTyped) {
|
|
23
|
+
return [meta.name];
|
|
48
24
|
}
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return true;
|
|
25
|
+
if (isUnionType(member)) {
|
|
26
|
+
return getTypeNamesFromExplicitlyTypedUnion(member);
|
|
52
27
|
}
|
|
53
|
-
|
|
54
|
-
|
|
28
|
+
// the branch a `maybe`-like union adds so the slot can be absent
|
|
29
|
+
if (member.name === 'undefined') {
|
|
30
|
+
return [];
|
|
31
|
+
}
|
|
32
|
+
throw new Error(`invalid config schema type ${member.name}`);
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
/** The type `ConfigurationSchema()` built, by any handle on it (`schemaRegistry.ts`). */
|
|
36
|
+
export function isBareConfigurationSchemaType(thing) {
|
|
37
|
+
return isType(thing) && isRegisteredConfigurationSchema(thing);
|
|
55
38
|
}
|
|
39
|
+
/** A schema, or a union, array or map of them. */
|
|
56
40
|
export function isConfigurationSchemaType(thing) {
|
|
57
|
-
// written as a series of if-statements instead of a big logical because this
|
|
58
|
-
// construction gives much better debugging backtraces.
|
|
59
|
-
// also, note that the order of these statements matters, because for example
|
|
60
|
-
// some union types are also optional types
|
|
61
41
|
if (!isType(thing)) {
|
|
62
42
|
return false;
|
|
63
43
|
}
|
|
64
|
-
|
|
44
|
+
if (isBareConfigurationSchemaType(thing)) {
|
|
65
45
|
return true;
|
|
66
46
|
}
|
|
67
|
-
|
|
68
|
-
return
|
|
69
|
-
}
|
|
70
|
-
else if ((isOptionalType(thing) || isArrayType(thing) || isMapType(thing)) &&
|
|
71
|
-
isConfigurationSchemaType(getSubType(thing))) {
|
|
72
|
-
return true;
|
|
73
|
-
}
|
|
74
|
-
else {
|
|
75
|
-
return false;
|
|
47
|
+
if (isUnionType(thing)) {
|
|
48
|
+
return getUnionSubtypes(thing).every(t => isConfigurationSchemaType(t) || t.name === 'undefined');
|
|
76
49
|
}
|
|
50
|
+
const collection = asArrayType(thing) ?? asMapType(thing);
|
|
51
|
+
return !!collection && isConfigurationSchemaType(collection.getChildType());
|
|
77
52
|
}
|
|
78
53
|
/**
|
|
79
54
|
* A configuration schema definition maps each key to exactly one of three kinds
|
|
@@ -92,3 +67,39 @@ export function isSlotDefinitionEntry(def) {
|
|
|
92
67
|
export function isConfigurationModel(thing) {
|
|
93
68
|
return isStateTreeNode(thing) && isConfigurationSchemaType(getType(thing));
|
|
94
69
|
}
|
|
70
|
+
const NUMBER_SLOT_TYPES = new Set(['number', 'integer', 'maybeNumber']);
|
|
71
|
+
/**
|
|
72
|
+
* The slot a bare value of each form lifts into, off a `shorthand` option:
|
|
73
|
+
* each slot it names takes the form its own type holds, a number where it
|
|
74
|
+
* holds one (`rules: [7.3]`) and a string otherwise (`color: 'red'`), so a
|
|
75
|
+
* width naming `value` and `field` reads `size: 3` as the one and
|
|
76
|
+
* `size: 'score'` as the other.
|
|
77
|
+
*/
|
|
78
|
+
export function shorthandTargetsOf(definition, shorthand) {
|
|
79
|
+
const slots = shorthand === undefined
|
|
80
|
+
? []
|
|
81
|
+
: typeof shorthand === 'string'
|
|
82
|
+
? [shorthand]
|
|
83
|
+
: shorthand;
|
|
84
|
+
return Object.fromEntries(slots.map(slot => {
|
|
85
|
+
const entry = definition[slot];
|
|
86
|
+
return [
|
|
87
|
+
isSlotDefinitionEntry(entry) && NUMBER_SLOT_TYPES.has(entry.type)
|
|
88
|
+
? 'number'
|
|
89
|
+
: 'string',
|
|
90
|
+
slot,
|
|
91
|
+
];
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/** The shorthand form of a bare value, or undefined for any other value. */
|
|
95
|
+
export function bareFormOf(value) {
|
|
96
|
+
return typeof value === 'string'
|
|
97
|
+
? 'string'
|
|
98
|
+
: typeof value === 'number'
|
|
99
|
+
? 'number'
|
|
100
|
+
: undefined;
|
|
101
|
+
}
|
|
102
|
+
/** {@link shorthandTargetsOf} a registered schema. */
|
|
103
|
+
export function shorthandTargets({ definition, options, }) {
|
|
104
|
+
return shorthandTargetsOf(definition, options.shorthand);
|
|
105
|
+
}
|
|
@@ -1,24 +1,19 @@
|
|
|
1
1
|
import type PluginManager from '../PluginManager.ts';
|
|
2
2
|
import type { ConfigSlotDefinition, ConfigSlotType } from './configurationSlot.ts';
|
|
3
3
|
import type { AnyConfigurationModel } from './types.ts';
|
|
4
|
+
import type { IAnyType } from '@jbrowse/mobx-state-tree';
|
|
4
5
|
/**
|
|
5
6
|
* Whether `slotName` on a config node is a slot (vs a nested sub-schema or a
|
|
6
7
|
* string/number constant).
|
|
7
8
|
*/
|
|
8
9
|
export declare function isConfigurationSlot(node: AnyConfigurationModel, slotName: string): boolean;
|
|
9
10
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* path writes slots one `setSlot` at a time onto an already-created config, so
|
|
15
|
-
* without this a schema's shorthand expansions and legacy-key migrations apply
|
|
16
|
-
* to `config.json` and silently no-op in a session spec, share link, or embed —
|
|
17
|
-
* the surfaces that are supposed to speak the same vocabulary. The hooks are
|
|
18
|
-
* written to normalize whatever subset of keys they're handed, so a partial bag
|
|
19
|
-
* is the same shape they already tolerate.
|
|
11
|
+
* Why a config of type `schema` cannot hold `value` at `key`, or undefined
|
|
12
|
+
* when it can: the schema's own lift first, then the slot's type, or a
|
|
13
|
+
* sub-schema's lift and checks. Also undefined for a key the schema does not
|
|
14
|
+
* declare, which is a question for its caller.
|
|
20
15
|
*/
|
|
21
|
-
export declare function
|
|
16
|
+
export declare function slotValueRefusal(schema: IAnyType, key: string, value: unknown): string | undefined;
|
|
22
17
|
/**
|
|
23
18
|
* The duck-typed object the config editor's leaf components consume. They never
|
|
24
19
|
* touch MST internals — only this shape (see ColorEditor.test.tsx, which passes
|
|
@@ -33,20 +28,9 @@ export interface SlotFacade {
|
|
|
33
28
|
contextVariable: string[];
|
|
34
29
|
defaultValue: unknown;
|
|
35
30
|
/**
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* `defaultValue` is already the concrete value.
|
|
39
|
-
*
|
|
40
|
-
* Here because a promotable slot's `defaultValue` is always the `undefined`
|
|
41
|
-
* inherit sentinel, so an editor rendering `defaultValue` for an unset slot
|
|
42
|
-
* shows nothing at all — for a `maybeBoolean` that reads as a concrete
|
|
43
|
-
* `false`, which is wrong for every slot whose base is `true`. The editor
|
|
44
|
-
* still cannot see the *session* tier of the cascade (its target is often a
|
|
45
|
-
* detached config node), so this is the honest answer it can give: what unset
|
|
46
|
-
* means with nothing promoted.
|
|
31
|
+
* enum choices, present only for the enum slot types; a `stringEnumArray`'s
|
|
32
|
+
* are the choices of each entry
|
|
47
33
|
*/
|
|
48
|
-
promotedBase?: unknown;
|
|
49
|
-
/** enum choices, present only for `stringEnum`/`maybeStringEnum` slots */
|
|
50
34
|
choices?: string[];
|
|
51
35
|
pluginManager: PluginManager;
|
|
52
36
|
readonly value: unknown;
|
|
@@ -54,17 +38,16 @@ export interface SlotFacade {
|
|
|
54
38
|
* Whether the slot holds a non-default value. Each slot is `stripDefault`-
|
|
55
39
|
* wrapped, so an at-default slot is omitted from the config snapshot — the
|
|
56
40
|
* same signal the persistence/delta layer uses (robust for map/array slots
|
|
57
|
-
* where a live-value `deepEqual` against the plain default would misfire).
|
|
58
|
-
* a promotable slot, "non-default" means customized rather than inheriting.
|
|
41
|
+
* where a live-value `deepEqual` against the plain default would misfire).
|
|
59
42
|
*/
|
|
60
43
|
readonly modified: boolean;
|
|
61
44
|
set: (val: unknown) => void;
|
|
62
45
|
}
|
|
63
46
|
/**
|
|
64
47
|
* The vocabulary an enum slot offers, or undefined for any other slot. Reads the
|
|
65
|
-
* author's own `types.enumeration` off `model` —
|
|
66
|
-
*
|
|
67
|
-
*
|
|
48
|
+
* author's own `types.enumeration` off `model` — the enum types are the only
|
|
49
|
+
* ones the editor takes choices from, so a slot typed anything else renders as
|
|
50
|
+
* free text however valid its `model` is.
|
|
68
51
|
*
|
|
69
52
|
* Shared by the config editor's facade below and by
|
|
70
53
|
* `ConfigSlotDefaults.test.ts`, which snapshots every schema's vocabularies:
|
|
@@ -1,8 +1,11 @@
|
|
|
1
|
-
import { getSnapshot } from '@jbrowse/mobx-state-tree';
|
|
1
|
+
import { asModelType, getSnapshot } from '@jbrowse/mobx-state-tree';
|
|
2
2
|
import { getEnumerationValues } from '../util/mst-reflection.js';
|
|
3
3
|
import { getEnv } from '../util/mstUtils.js';
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
4
|
+
import { slotWriteRefusal } from './configurationSlot.js';
|
|
5
|
+
import { setConf } from './getConf.js';
|
|
6
|
+
import { getConfigurationSchemaDefinition, getConfigurationSchemaMetadata, } from './schemaRegistry.js';
|
|
7
|
+
import { isConfigurationSchemaType, isSlotDefinitionEntry, } from './schemaTypes.js';
|
|
8
|
+
import { preProcessSnapshotWith } from './snapshotPreprocess.js';
|
|
6
9
|
/**
|
|
7
10
|
* The slot's metadata entry, or undefined when `slotName` names a nested
|
|
8
11
|
* sub-schema or a string/number constant rather than a slot.
|
|
@@ -19,26 +22,42 @@ export function isConfigurationSlot(node, slotName) {
|
|
|
19
22
|
return !!slotDefinition(node, slotName);
|
|
20
23
|
}
|
|
21
24
|
/**
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
26
|
-
* path writes slots one `setSlot` at a time onto an already-created config, so
|
|
27
|
-
* without this a schema's shorthand expansions and legacy-key migrations apply
|
|
28
|
-
* to `config.json` and silently no-op in a session spec, share link, or embed —
|
|
29
|
-
* the surfaces that are supposed to speak the same vocabulary. The hooks are
|
|
30
|
-
* written to normalize whatever subset of keys they're handed, so a partial bag
|
|
31
|
-
* is the same shape they already tolerate.
|
|
25
|
+
* Why a config of type `schema` cannot hold `value` at `key`, or undefined
|
|
26
|
+
* when it can: the schema's own lift first, then the slot's type, or a
|
|
27
|
+
* sub-schema's lift and checks. Also undefined for a key the schema does not
|
|
28
|
+
* declare, which is a question for its caller.
|
|
32
29
|
*/
|
|
33
|
-
export function
|
|
34
|
-
const
|
|
35
|
-
|
|
30
|
+
export function slotValueRefusal(schema, key, value) {
|
|
31
|
+
const meta = getConfigurationSchemaMetadata(schema);
|
|
32
|
+
const entry = meta?.definition[key];
|
|
33
|
+
if (!meta || entry === undefined) {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
const subSchema = isConfigurationSchemaType(entry)
|
|
37
|
+
? entry
|
|
38
|
+
: undefined;
|
|
39
|
+
// the slot's own property type, built once with the schema: what `setSlot`
|
|
40
|
+
// checks a write against
|
|
41
|
+
const slotType = asModelType(schema)?.properties[key];
|
|
42
|
+
try {
|
|
43
|
+
const lifted = preProcessSnapshotWith(meta, { [key]: value })[key];
|
|
44
|
+
if (subSchema) {
|
|
45
|
+
subSchema.create(lifted);
|
|
46
|
+
}
|
|
47
|
+
else if (isSlotDefinitionEntry(entry) && !slotType?.is(lifted)) {
|
|
48
|
+
return slotWriteRefusal(`${meta.name}.${key}`, entry.type, value);
|
|
49
|
+
}
|
|
50
|
+
return undefined;
|
|
51
|
+
}
|
|
52
|
+
catch (e) {
|
|
53
|
+
return e instanceof Error ? e.message : String(e);
|
|
54
|
+
}
|
|
36
55
|
}
|
|
37
56
|
/**
|
|
38
57
|
* The vocabulary an enum slot offers, or undefined for any other slot. Reads the
|
|
39
|
-
* author's own `types.enumeration` off `model` —
|
|
40
|
-
*
|
|
41
|
-
*
|
|
58
|
+
* author's own `types.enumeration` off `model` — the enum types are the only
|
|
59
|
+
* ones the editor takes choices from, so a slot typed anything else renders as
|
|
60
|
+
* free text however valid its `model` is.
|
|
42
61
|
*
|
|
43
62
|
* Shared by the config editor's facade below and by
|
|
44
63
|
* `ConfigSlotDefaults.test.ts`, which snapshots every schema's vocabularies:
|
|
@@ -47,7 +66,10 @@ export function preProcessSlotValues(node, values) {
|
|
|
47
66
|
*/
|
|
48
67
|
export function slotChoices(def) {
|
|
49
68
|
const { type, model } = def;
|
|
50
|
-
return (type === 'stringEnum' ||
|
|
69
|
+
return (type === 'stringEnum' ||
|
|
70
|
+
type === 'maybeStringEnum' ||
|
|
71
|
+
type === 'stringEnumArray') &&
|
|
72
|
+
model
|
|
51
73
|
? getEnumerationValues(model)
|
|
52
74
|
: undefined;
|
|
53
75
|
}
|
|
@@ -66,14 +88,13 @@ export function getSlotDefinition(node, slotName) {
|
|
|
66
88
|
}
|
|
67
89
|
export function makeSlotFacade(node, slotName) {
|
|
68
90
|
const definition = getSlotDefinition(node, slotName);
|
|
69
|
-
const { type, description = '', defaultValue,
|
|
91
|
+
const { type, description = '', defaultValue, contextVariable = [], } = definition;
|
|
70
92
|
return {
|
|
71
93
|
name: slotName,
|
|
72
94
|
description,
|
|
73
95
|
type,
|
|
74
96
|
contextVariable,
|
|
75
97
|
defaultValue,
|
|
76
|
-
promotedBase,
|
|
77
98
|
choices: slotChoices(definition),
|
|
78
99
|
pluginManager: getEnv(node).pluginManager,
|
|
79
100
|
get value() {
|
|
@@ -83,7 +104,7 @@ export function makeSlotFacade(node, slotName) {
|
|
|
83
104
|
return slotName in getSnapshot(node);
|
|
84
105
|
},
|
|
85
106
|
set(val) {
|
|
86
|
-
node
|
|
107
|
+
setConf(node, slotName, val);
|
|
87
108
|
},
|
|
88
109
|
};
|
|
89
110
|
}
|