@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1709 -390
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
- package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
- package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
- package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
- package/esm/BaseFeatureWidget/formatDetails.js +62 -83
- package/esm/BaseFeatureWidget/index.d.ts +2 -1
- package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
- package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
- package/esm/BaseFeatureWidget/types.d.ts +12 -6
- package/esm/BaseFeatureWidget/util.d.ts +0 -10
- package/esm/BaseFeatureWidget/util.js +0 -17
- package/esm/CorePlugin.js +34 -3
- package/esm/PluginLoader.d.ts +24 -13
- package/esm/PluginLoader.js +167 -51
- package/esm/PluginManager.d.ts +130 -24
- package/esm/PluginManager.js +180 -32
- package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
- package/esm/ReExports/MuiDataGridReExports.js +2 -2
- package/esm/ReExports/coreModules.generated.d.ts +2 -0
- package/esm/ReExports/coreModules.generated.js +530 -0
- package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/coreWorkerModules.generated.js +490 -0
- package/esm/ReExports/frameworkModules.d.ts +2 -0
- package/esm/ReExports/frameworkModules.js +68 -0
- package/esm/ReExports/frameworkShared.d.ts +12 -0
- package/esm/ReExports/frameworkShared.js +16 -0
- package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
- package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
- package/esm/ReExports/list.js +528 -79
- package/esm/ReExports/modules.d.ts +1 -1
- package/esm/ReExports/modules.js +10 -165
- package/esm/ReExports/registry.d.ts +1 -0
- package/esm/ReExports/registry.js +23 -5
- package/esm/ReExports/uiStub.d.ts +3 -0
- package/esm/ReExports/uiStub.js +33 -0
- package/esm/ReExports/workerModules.d.ts +2 -0
- package/esm/ReExports/workerModules.js +11 -0
- package/esm/TextSearch/TextSearchManager.d.ts +27 -13
- package/esm/TextSearch/TextSearchManager.js +77 -36
- package/esm/TextSearch/places.d.ts +12 -0
- package/esm/TextSearch/places.js +94 -0
- package/esm/assemblyManager/assembly.d.ts +21 -19
- package/esm/assemblyManager/assembly.js +28 -26
- package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
- package/esm/assemblyManager/assemblyAdapters.js +8 -2
- package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
- package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
- package/esm/assemblyManager/assemblyManager.d.ts +35 -180
- package/esm/assemblyManager/assemblyManager.js +47 -51
- package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
- package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
- package/esm/assemblyManager/geneticCodes.js +2 -5
- package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
- package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
- package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
- package/esm/assemblyManager/indexAssemblyNames.js +22 -0
- package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
- package/esm/assemblyManager/loadRefNameMap.js +4 -9
- package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
- package/esm/assemblyManager/refNameMapKey.js +12 -0
- package/esm/checkPlugins.d.ts +2 -0
- package/esm/checkPlugins.js +38 -17
- package/esm/configuration/bamIndexFields.d.ts +49 -0
- package/esm/configuration/bamIndexFields.js +41 -0
- package/esm/configuration/configurationSchema.d.ts +101 -71
- package/esm/configuration/configurationSchema.js +207 -134
- package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
- package/esm/configuration/configurationSchemaUnion.js +56 -0
- package/esm/configuration/configurationSlot.d.ts +150 -60
- package/esm/configuration/configurationSlot.js +103 -75
- package/esm/configuration/fillLocations.d.ts +14 -0
- package/esm/configuration/fillLocations.js +14 -0
- package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
- package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
- package/esm/configuration/formatDetailsConfigSchema.js +10 -13
- package/esm/configuration/fullConfSnapshot.d.ts +4 -19
- package/esm/configuration/fullConfSnapshot.js +30 -52
- package/esm/configuration/getConf.d.ts +45 -41
- package/esm/configuration/getConf.js +111 -44
- package/esm/configuration/index.d.ts +26 -11
- package/esm/configuration/index.js +16 -7
- package/esm/configuration/indexType.d.ts +26 -0
- package/esm/configuration/indexType.js +38 -0
- package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
- package/esm/configuration/mergeFormatCallbacks.js +13 -10
- package/esm/configuration/plot.d.ts +61 -0
- package/esm/configuration/plot.js +142 -0
- package/esm/configuration/readConfObject.d.ts +2 -24
- package/esm/configuration/readConfObject.js +20 -63
- package/esm/configuration/requirements.d.ts +37 -0
- package/esm/configuration/requirements.js +88 -0
- package/esm/configuration/schemaRegistry.d.ts +32 -15
- package/esm/configuration/schemaRegistry.js +33 -35
- package/esm/configuration/schemaTypes.d.ts +21 -5
- package/esm/configuration/schemaTypes.js +66 -55
- package/esm/configuration/slotFacade.d.ts +12 -29
- package/esm/configuration/slotFacade.js +44 -23
- package/esm/configuration/snapshotPreprocess.d.ts +43 -0
- package/esm/configuration/snapshotPreprocess.js +161 -0
- package/esm/configuration/tabixIndexFields.d.ts +30 -4
- package/esm/configuration/tabixIndexFields.js +21 -4
- package/esm/configuration/tabixShorthand.d.ts +34 -17
- package/esm/configuration/tabixShorthand.js +49 -22
- package/esm/configuration/types.d.ts +182 -43
- package/esm/configuration/uriShorthand.d.ts +9 -0
- package/esm/configuration/uriShorthand.js +16 -0
- package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
- package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
- package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
- package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
- package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
- package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
- package/esm/data_adapters/BaseAdapter/index.js +1 -0
- package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
- package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
- package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
- package/esm/data_adapters/BaseAdapter/stats.js +52 -13
- package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
- package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
- package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
- package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
- package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
- package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
- package/esm/data_adapters/dataAdapterCache.js +44 -10
- package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
- package/esm/data_adapters/getFeatureAdapter.js +8 -8
- package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
- package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
- package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
- package/esm/pluggableElementTypes/AdapterType.js +1 -1
- package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
- package/esm/pluggableElementTypes/DisplayType.js +28 -12
- package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
- package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
- package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
- package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
- package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
- package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
- package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
- package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
- package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
- package/esm/pluggableElementTypes/ViewType.js +32 -4
- package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
- package/esm/pluggableElementTypes/WidgetType.js +6 -0
- package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
- package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
- package/esm/pluggableElementTypes/extendElementType.js +9 -5
- package/esm/pluggableElementTypes/index.d.ts +2 -1
- package/esm/pluggableElementTypes/index.js +2 -9
- package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
- package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
- package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
- package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
- package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
- package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
- package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
- package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
- package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
- package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
- package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
- package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
- package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
- package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
- package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
- package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
- package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
- package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
- package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
- package/esm/pluggableElementTypes/models/index.d.ts +2 -3
- package/esm/pluggableElementTypes/models/index.js +2 -3
- package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
- package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
- package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
- package/esm/pluginDefinitions.d.ts +34 -7
- package/esm/pluginDefinitions.js +54 -20
- package/esm/rpc/BaseRpcDriver.d.ts +2 -2
- package/esm/rpc/BaseRpcDriver.js +25 -30
- package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
- package/esm/rpc/MainThreadRpcDriver.js +13 -8
- package/esm/rpc/RpcClient.d.ts +18 -6
- package/esm/rpc/RpcClient.js +51 -16
- package/esm/rpc/RpcManager.d.ts +14 -10
- package/esm/rpc/RpcManager.js +11 -1
- package/esm/rpc/RpcRegistry.d.ts +40 -7
- package/esm/rpc/RpcServer.d.ts +3 -1
- package/esm/rpc/RpcServer.js +19 -12
- package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
- package/esm/rpc/WebWorkerRpcDriver.js +64 -68
- package/esm/rpc/byteBudget.d.ts +20 -5
- package/esm/rpc/byteBudget.js +16 -5
- package/esm/rpc/configSchema.d.ts +7 -21
- package/esm/rpc/coreRpcMethods.d.ts +4 -0
- package/esm/rpc/coreRpcMethods.js +4 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
- package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
- package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
- package/esm/rpc/methods/CoreGetExportData.js +3 -4
- package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
- package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
- package/esm/rpc/methods/CoreGetFeatures.js +3 -5
- package/esm/rpc/methods/CoreGetRefNames.js +2 -12
- package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
- package/esm/rpc/methods/CoreGetSequence.js +2 -2
- package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
- package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
- package/esm/rpc/methods/layerFeatures.d.ts +33 -0
- package/esm/rpc/methods/layerFeatures.js +29 -0
- package/esm/svg/SvgExport.js +6 -7
- package/esm/svg/SvgThemeProviders.d.ts +12 -0
- package/esm/svg/SvgThemeProviders.js +15 -0
- package/esm/svg/exportViewSvg.d.ts +28 -0
- package/esm/svg/exportViewSvg.js +13 -0
- package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
- package/esm/svg/normalizeSvgMarkup.js +99 -0
- package/esm/svg/serializeSvg.d.ts +7 -0
- package/esm/svg/serializeSvg.js +11 -0
- package/esm/svg/svgId.d.ts +1 -1
- package/esm/svg/svgId.js +1 -1
- package/esm/svg/svgReady.d.ts +9 -7
- package/esm/svg/svgReady.js +8 -7
- package/esm/svg/trackNames.d.ts +7 -5
- package/esm/svg/trackNames.js +12 -9
- package/esm/svg/wrapSvgExport.js +6 -74
- package/esm/ui/AddCustomPluginDialog.js +3 -8
- package/esm/ui/AppReadyMarker.d.ts +45 -0
- package/esm/ui/AppReadyMarker.js +89 -0
- package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
- package/esm/ui/CascadingMenu.js +181 -104
- package/esm/ui/DropDownMenu.js +2 -1
- package/esm/ui/ErrorBanner.js +1 -1
- package/esm/ui/ErrorBoundary.d.ts +2 -2
- package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
- package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
- package/esm/ui/ExportSvgDialog.d.ts +1 -1
- package/esm/ui/FileDropZone.js +2 -1
- package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
- package/esm/ui/HoverMenu.d.ts +1 -2
- package/esm/ui/HoverMenu.js +6 -3
- package/esm/ui/JexlFilterDialog.d.ts +13 -10
- package/esm/ui/JexlFilterDialog.js +122 -50
- package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
- package/esm/ui/JexlFilterRowEditors.js +90 -0
- package/esm/ui/LazyBaseTooltip.d.ts +4 -0
- package/esm/ui/LazyBaseTooltip.js +9 -0
- package/esm/ui/LegendSwatchGlyph.js +26 -21
- package/esm/ui/LoadingOverlay.d.ts +14 -0
- package/esm/ui/LoadingOverlay.js +4 -2
- package/esm/ui/MenuTypes.d.ts +23 -53
- package/esm/ui/MenuTypes.js +3 -0
- package/esm/ui/MonospaceTextField.d.ts +2 -1
- package/esm/ui/MonospaceTextField.js +23 -20
- package/esm/ui/PaletteContext.d.ts +10 -5
- package/esm/ui/PaletteContext.js +44 -6
- package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
- package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
- package/esm/ui/RefNameAutocomplete/index.js +8 -2
- package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
- package/esm/ui/RefNameAutocomplete/util.js +42 -1
- package/esm/ui/ResizeHandle.d.ts +3 -1
- package/esm/ui/ResizeHandle.js +44 -11
- package/esm/ui/ScrollChrome.d.ts +13 -0
- package/esm/ui/ScrollChrome.js +11 -0
- package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
- package/esm/ui/ScrollEdgeShadow.js +14 -35
- package/esm/ui/ScrollZoomToggle.d.ts +4 -27
- package/esm/ui/ScrollZoomToggle.js +34 -51
- package/esm/ui/SessionJsonPanel.d.ts +3 -0
- package/esm/ui/SessionJsonPanel.js +14 -0
- package/esm/ui/SettingsChangesTable.d.ts +1 -0
- package/esm/ui/SettingsChangesTable.js +49 -11
- package/esm/ui/ShareLinkField.d.ts +1 -3
- package/esm/ui/ShareLinkField.js +13 -40
- package/esm/ui/SizeSliderRow.d.ts +1 -3
- package/esm/ui/SizeSliderRow.js +4 -6
- package/esm/ui/SnackbarModel.js +79 -67
- package/esm/ui/StatusProgressBar.js +2 -2
- package/esm/ui/SvgColorLegend.d.ts +9 -4
- package/esm/ui/SvgColorLegend.js +82 -41
- package/esm/ui/VerticalScrollbar.d.ts +13 -34
- package/esm/ui/VerticalScrollbar.js +29 -83
- package/esm/ui/ViewLoadingScreen.d.ts +5 -4
- package/esm/ui/ViewLoadingScreen.js +8 -32
- package/esm/ui/colorScale.d.ts +92 -0
- package/esm/ui/colorScale.js +72 -0
- package/esm/ui/colors.d.ts +64 -0
- package/esm/ui/colors.js +230 -1
- package/esm/ui/hoverBoxStyle.d.ts +14 -2
- package/esm/ui/hoverBoxStyle.js +17 -2
- package/esm/ui/index.d.ts +12 -12
- package/esm/ui/index.js +14 -22
- package/esm/ui/launchViewMenu.js +15 -5
- package/esm/ui/legendMenuItem.d.ts +10 -32
- package/esm/ui/legendMenuItem.js +9 -36
- package/esm/ui/legendSpec.d.ts +15 -8
- package/esm/ui/legendSpec.js +14 -23
- package/esm/ui/makeSizeMenu.d.ts +0 -6
- package/esm/ui/makeSizeMenu.js +6 -30
- package/esm/ui/measureLegendText.js +1 -1
- package/esm/ui/menuItemAdornment.d.ts +9 -20
- package/esm/ui/menuItemAdornment.js +10 -32
- package/esm/ui/menuItems.d.ts +2 -7
- package/esm/ui/menuItems.js +1 -6
- package/esm/ui/multiTrackMenuItems.d.ts +6 -0
- package/esm/ui/palette.d.ts +118 -116
- package/esm/ui/palette.js +114 -75
- package/esm/ui/replaceViewAction.d.ts +1 -1
- package/esm/ui/replaceViewAction.js +1 -1
- package/esm/ui/theme.d.ts +43 -119
- package/esm/ui/theme.js +62 -78
- package/esm/ui/toggleMenuItems.d.ts +1 -3
- package/esm/ui/toggleMenuItems.js +6 -5
- package/esm/ui/useAssemblySelection.d.ts +4 -4
- package/esm/ui/viewHeaderHeight.d.ts +1 -0
- package/esm/ui/viewHeaderHeight.js +1 -0
- package/esm/util/Base1DUtils.d.ts +5 -3
- package/esm/util/Base1DUtils.js +14 -6
- package/esm/util/Base1DViewModel.d.ts +2 -1
- package/esm/util/Base1DViewModel.js +3 -2
- package/esm/util/SvgCanvas.d.ts +15 -13
- package/esm/util/SvgCanvas.js +76 -56
- package/esm/util/TimeTraveller.d.ts +3 -0
- package/esm/util/TimeTraveller.js +34 -2
- package/esm/util/aborting.d.ts +39 -0
- package/esm/util/aborting.js +88 -6
- package/esm/util/adapterMetadata.d.ts +1 -1
- package/esm/util/adapterMetadata.js +6 -5
- package/esm/util/addAndShowTrack.d.ts +2 -5
- package/esm/util/addAndShowTrack.js +5 -1
- package/esm/util/addRelativeUris.d.ts +17 -5
- package/esm/util/addRelativeUris.js +46 -10
- package/esm/util/addTrackFromWidget.d.ts +2 -5
- package/esm/util/addTrackFromWidget.js +5 -4
- package/esm/util/aggregateFieldName.d.ts +10 -0
- package/esm/util/aggregateFieldName.js +8 -0
- package/esm/util/analytics.js +46 -13
- package/esm/util/animationAllowed.d.ts +9 -0
- package/esm/util/animationAllowed.js +13 -0
- package/esm/util/applyRowResizeWheel.d.ts +10 -5
- package/esm/util/applyRowResizeWheel.js +10 -21
- package/esm/util/bandHeight.d.ts +10 -0
- package/esm/util/bandHeight.js +29 -0
- package/esm/util/bandLayout.d.ts +4 -4
- package/esm/util/bandLayout.js +4 -4
- package/esm/util/baseDisplayConfig.d.ts +8 -0
- package/esm/util/baseDisplayConfig.js +27 -0
- package/esm/util/bezierConnector.d.ts +4 -3
- package/esm/util/bezierConnector.js +38 -45
- package/esm/util/bgzfWorkerPool.d.ts +20 -74
- package/esm/util/bgzfWorkerPool.js +20 -74
- package/esm/util/binnedAggregate.d.ts +17 -0
- package/esm/util/binnedAggregate.js +275 -0
- package/esm/util/cacheBudgets.d.ts +22 -19
- package/esm/util/cacheBudgets.js +22 -19
- package/esm/util/cachedSetup.d.ts +16 -6
- package/esm/util/cachedSetup.js +108 -38
- package/esm/util/categoricalField.d.ts +56 -0
- package/esm/util/categoricalField.js +73 -0
- package/esm/util/cellMatches.d.ts +23 -0
- package/esm/util/cellMatches.js +264 -0
- package/esm/util/cellsStep.d.ts +29 -0
- package/esm/util/cellsStep.js +437 -0
- package/esm/util/clampToContig.d.ts +17 -0
- package/esm/util/clampToContig.js +19 -0
- package/esm/util/coarseStripHTML.js +1 -2
- package/esm/util/color/cssColorsLevel4.d.ts +1 -0
- package/esm/util/color/cssColorsLevel4.js +1 -0
- package/esm/util/color/index.d.ts +5 -3
- package/esm/util/color/index.js +7 -4
- package/esm/util/colorBits.d.ts +3 -3
- package/esm/util/colorBits.js +19 -44
- package/esm/util/colorRamp.d.ts +49 -5
- package/esm/util/colorRamp.js +169 -18
- package/esm/util/colorScale.d.ts +156 -0
- package/esm/util/colorScale.js +243 -0
- package/esm/util/colorSchemes.d.ts +21 -0
- package/esm/util/colorSchemes.js +30 -0
- package/esm/util/copyToClipboard.js +8 -1
- package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
- package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
- package/esm/util/createSvgRasterCanvas.d.ts +10 -0
- package/esm/util/cssColorParse.d.ts +15 -0
- package/esm/util/cssColorParse.js +53 -0
- package/esm/util/diagonalizeRegions.d.ts +2 -3
- package/esm/util/diagonalizeRegions.js +8 -13
- package/esm/util/expandLooseSearchIndex.d.ts +19 -0
- package/esm/util/expandLooseSearchIndex.js +29 -0
- package/esm/util/featureTable.d.ts +224 -0
- package/esm/util/featureTable.js +366 -0
- package/esm/util/featureTransforms.d.ts +81 -0
- package/esm/util/featureTransforms.js +1231 -0
- package/esm/util/featureTypes.d.ts +24 -0
- package/esm/util/featureTypes.js +35 -0
- package/esm/util/fetchAndMaybeUnzip.js +16 -9
- package/esm/util/fetchContext.d.ts +7 -8
- package/esm/util/fetchContext.js +3 -3
- package/esm/util/fetchHub.d.ts +4 -2
- package/esm/util/fetchHub.js +2 -2
- package/esm/util/fetchPhases.d.ts +10 -10
- package/esm/util/fetchSeq.d.ts +2 -3
- package/esm/util/fetchSeq.js +2 -2
- package/esm/util/fieldReader.d.ts +17 -0
- package/esm/util/fieldReader.js +62 -0
- package/esm/util/formatBytes.js +1 -1
- package/esm/util/formatGuessers.d.ts +25 -14
- package/esm/util/formatGuessers.js +42 -27
- package/esm/util/formatRelativeTime.js +1 -1
- package/esm/util/freezeDeep.d.ts +8 -10
- package/esm/util/freezeDeep.js +8 -10
- package/esm/util/getLocationUri.d.ts +2 -1
- package/esm/util/getLocationUri.js +8 -2
- package/esm/util/groupKeys.d.ts +76 -0
- package/esm/util/groupKeys.js +156 -0
- package/esm/util/highlights.d.ts +10 -6
- package/esm/util/highlights.js +12 -25
- package/esm/util/hooks.d.ts +31 -2
- package/esm/util/hooks.js +72 -3
- package/esm/util/index.d.ts +11 -11
- package/esm/util/index.js +11 -10
- package/esm/util/indexCandidates.d.ts +1 -31
- package/esm/util/indexCandidates.js +5 -63
- package/esm/util/installFetch.d.ts +77 -37
- package/esm/util/installFetch.js +65 -38
- package/esm/util/installInitAutorun.d.ts +14 -13
- package/esm/util/installInitAutorun.js +17 -17
- package/esm/util/installPrerequisiteFetch.d.ts +115 -0
- package/esm/util/installPrerequisiteFetch.js +111 -0
- package/esm/util/intervals.js +9 -4
- package/esm/util/io/index.js +22 -15
- package/esm/util/isDataCurrent.d.ts +7 -5
- package/esm/util/isDataCurrent.js +9 -6
- package/esm/util/isTextEntryFocused.d.ts +7 -0
- package/esm/util/isTextEntryFocused.js +16 -0
- package/esm/util/jexl.js +24 -21
- package/esm/util/jexlFilterRows.d.ts +89 -0
- package/esm/util/jexlFilterRows.js +252 -0
- package/esm/util/jexlFilters.d.ts +32 -57
- package/esm/util/jexlFilters.js +31 -29
- package/esm/util/jexlStrings.d.ts +3 -4
- package/esm/util/jexlStrings.js +2 -3
- package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
- package/esm/util/layouts/GranularRectLayout.js +25 -8
- package/esm/util/lazyAfterAttach.d.ts +13 -0
- package/esm/util/lazyAfterAttach.js +31 -0
- package/esm/util/lazyWithPreload.d.ts +19 -0
- package/esm/util/lazyWithPreload.js +27 -0
- package/esm/util/legendCandidates.d.ts +72 -0
- package/esm/util/legendCandidates.js +138 -0
- package/esm/util/locString.js +5 -2
- package/esm/util/localStorage.js +4 -4
- package/esm/util/markEncoding.d.ts +150 -0
- package/esm/util/markEncoding.js +885 -0
- package/esm/util/markEncodingTypes.d.ts +595 -0
- package/esm/util/markEncodingTypes.js +8 -0
- package/esm/util/mst-reflection.d.ts +2 -20
- package/esm/util/mst-reflection.js +3 -53
- package/esm/util/mstUtils.d.ts +31 -23
- package/esm/util/mstUtils.js +39 -24
- package/esm/util/numericUtils.d.ts +7 -0
- package/esm/util/numericUtils.js +16 -0
- package/esm/util/numericValue.d.ts +14 -0
- package/esm/util/numericValue.js +34 -0
- package/esm/util/openFeatureWidget.d.ts +5 -0
- package/esm/util/openFeatureWidget.js +2 -2
- package/esm/util/openViews.d.ts +17 -0
- package/esm/util/openViews.js +22 -0
- package/esm/util/parentWalk.d.ts +1 -1
- package/esm/util/parentWalk.js +1 -1
- package/esm/util/parseLineByLine.d.ts +4 -5
- package/esm/util/parseLineByLine.js +8 -14
- package/esm/util/pluginStore.d.ts +6 -8
- package/esm/util/pluginStore.js +17 -16
- package/esm/util/preloadComponent.d.ts +5 -0
- package/esm/util/preloadComponent.js +11 -0
- package/esm/util/progress.d.ts +22 -22
- package/esm/util/progress.js +27 -26
- package/esm/util/quantileExtent.d.ts +49 -0
- package/esm/util/quantileExtent.js +162 -0
- package/esm/util/range.d.ts +13 -9
- package/esm/util/range.js +17 -8
- package/esm/util/renameRegions.d.ts +26 -6
- package/esm/util/renameRegions.js +68 -54
- package/esm/util/renderToStaticMarkup.js +24 -14
- package/esm/util/rxjs.d.ts +23 -8
- package/esm/util/rxjs.js +61 -15
- package/esm/util/samplesTsv.d.ts +49 -0
- package/esm/util/samplesTsv.js +86 -0
- package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
- package/esm/util/scheduleDetachedDestroy.js +24 -0
- package/esm/util/scrollLatch.d.ts +1 -0
- package/esm/util/scrollLatch.js +8 -0
- package/esm/util/selectEncodedFeature.d.ts +16 -0
- package/esm/util/selectEncodedFeature.js +34 -0
- package/esm/util/sessionSharing.d.ts +7 -5
- package/esm/util/sessionSharing.js +23 -23
- package/esm/util/shapeNameList.d.ts +2 -0
- package/esm/util/shapeNameList.js +6 -0
- package/esm/util/shapeNames.d.ts +7 -0
- package/esm/util/shapeNames.js +11 -0
- package/esm/util/simpleFeature.d.ts +0 -1
- package/esm/util/springAnimate.js +1 -1
- package/esm/util/starFusion.d.ts +26 -0
- package/esm/util/starFusion.js +37 -0
- package/esm/util/stepTables.d.ts +96 -0
- package/esm/util/stepTables.js +277 -0
- package/esm/util/svAlt.d.ts +145 -0
- package/esm/util/svAlt.js +364 -0
- package/esm/util/svgColorProps.d.ts +11 -0
- package/esm/util/svgColorProps.js +28 -1
- package/esm/util/systemColorScheme.d.ts +12 -0
- package/esm/util/systemColorScheme.js +27 -0
- package/esm/util/tabix.d.ts +19 -10
- package/esm/util/tabix.js +19 -14
- package/esm/util/thresholdScale.d.ts +91 -0
- package/esm/util/thresholdScale.js +166 -0
- package/esm/util/timeGate.d.ts +4 -5
- package/esm/util/timeGate.js +4 -5
- package/esm/util/trackConfigDelta.d.ts +26 -26
- package/esm/util/trackConfigDelta.js +63 -47
- package/esm/util/tracks.d.ts +120 -66
- package/esm/util/tracks.js +501 -151
- package/esm/util/translateTranscript.d.ts +44 -0
- package/esm/util/translateTranscript.js +102 -0
- package/esm/util/types/data.d.ts +0 -2
- package/esm/util/types/index.d.ts +121 -22
- package/esm/util/types/index.js +9 -0
- package/esm/util/types/mst.d.ts +3 -0
- package/esm/util/types/mst.js +4 -0
- package/esm/util/types/renameIds.d.ts +1 -0
- package/esm/util/types/renameIds.js +29 -0
- package/esm/util/types/services.d.ts +1 -1
- package/esm/util/unknownSnapshotKeys.d.ts +53 -0
- package/esm/util/unknownSnapshotKeys.js +76 -0
- package/esm/util/useFeatureSequence.js +5 -5
- package/esm/util/useFetch.d.ts +3 -4
- package/esm/util/useFetch.js +19 -10
- package/esm/util/useFetchPlugins.d.ts +6 -2
- package/esm/util/useFetchPlugins.js +7 -3
- package/esm/util/usePanZoom.js +10 -3
- package/esm/util/usePanelVirtualScroll.d.ts +7 -35
- package/esm/util/usePanelVirtualScroll.js +9 -36
- package/esm/util/useRafCommit.js +1 -0
- package/esm/util/useRowVirtualScroll.d.ts +6 -29
- package/esm/util/useRowVirtualScroll.js +8 -49
- package/esm/util/useVirtualScrollWheel.d.ts +20 -4
- package/esm/util/useVirtualScrollWheel.js +40 -74
- package/esm/util/viewHighlights.d.ts +3 -0
- package/esm/util/viewHighlights.js +5 -0
- package/esm/util/viewStatus.d.ts +47 -15
- package/esm/util/viewStatus.js +34 -0
- package/esm/util/wheelZoom.d.ts +7 -1
- package/esm/util/wheelZoom.js +85 -19
- package/esm/util/whenViewSettled.d.ts +55 -8
- package/esm/util/whenViewSettled.js +56 -7
- package/esm/util/withFeatureDetails.js +4 -0
- package/esm/util/withLaunchInput.d.ts +174 -0
- package/esm/util/withLaunchInput.js +274 -0
- package/package.json +75 -24
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
- package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
- package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
- package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
- package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
- package/esm/ReExports/BaseFeatureDetails.js +0 -10
- package/esm/ReExports/index.d.ts +0 -1
- package/esm/ReExports/index.js +0 -1
- package/esm/ReExports/publicUtil.d.ts +0 -1
- package/esm/ReExports/publicUtil.js +0 -28
- package/esm/configuration/promotableDefaults.d.ts +0 -199
- package/esm/configuration/promotableDefaults.js +0 -326
- package/esm/configuration/promotablePin.d.ts +0 -55
- package/esm/configuration/promotablePin.js +0 -1
- package/esm/configuration/promotableResolve.d.ts +0 -108
- package/esm/configuration/promotableResolve.js +0 -117
- package/esm/configuration/promotableSlots.d.ts +0 -12
- package/esm/configuration/promotableSlots.js +0 -45
- package/esm/configuration/slotShape.d.ts +0 -12
- package/esm/configuration/slotShape.js +0 -84
- package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
- package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
- package/esm/ui/PinAdornment.d.ts +0 -5
- package/esm/ui/PinAdornment.js +0 -79
- package/esm/ui/SvgGradientLegend.d.ts +0 -26
- package/esm/ui/SvgGradientLegend.js +0 -26
- package/esm/ui/highlightChipReveal.d.ts +0 -32
- package/esm/ui/highlightChipReveal.js +0 -39
- package/esm/ui/promotableMenuItems.d.ts +0 -19
- package/esm/ui/promotableMenuItems.js +0 -89
- package/esm/ui/promotablePinCoverage.d.ts +0 -44
- package/esm/ui/promotablePinCoverage.js +0 -87
- package/esm/util/applyInitSettings.d.ts +0 -79
- package/esm/util/applyInitSettings.js +0 -91
- package/esm/util/openDisplays.d.ts +0 -23
- package/esm/util/openDisplays.js +0 -79
- package/esm/util/stopToken.d.ts +0 -211
- package/esm/util/stopToken.js +0 -438
- /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { getEnv, isArrayType, isMapType, isStateTreeNode, types, } from '@jbrowse/mobx-state-tree';
|
|
1
|
+
import { getEnv, isArrayType, isMapType, isOptionalType, isStateTreeNode, types, } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { isObservableArray } from 'mobx';
|
|
2
3
|
import { getContainingTrack, getSession } from '../util/mstUtils.js';
|
|
3
|
-
import {
|
|
4
|
-
import ConfigSlot from './configurationSlot.js';
|
|
4
|
+
import { isSessionWithEditableTrackConfig } from '../util/types/index.js';
|
|
5
|
+
import ConfigSlot, { slotWriteRefusal } from './configurationSlot.js';
|
|
6
|
+
import { checkRequirements } from './requirements.js';
|
|
5
7
|
import { getConfigurationSchemaMetadata, registerConfigurationSchema, } from './schemaRegistry.js';
|
|
6
|
-
import { isConfigurationSchemaType, isConstantEntry, isSlotDefinitionEntry, } from './schemaTypes.js';
|
|
8
|
+
import { isConfigurationSchemaType, isConstantEntry, isSlotDefinitionEntry, shorthandTargetsOf, } from './schemaTypes.js';
|
|
9
|
+
import { preProcessSnapshotWith } from './snapshotPreprocess.js';
|
|
7
10
|
function hookList(hook) {
|
|
8
11
|
return hook === undefined ? [] : Array.isArray(hook) ? hook : [hook];
|
|
9
12
|
}
|
|
@@ -20,12 +23,8 @@ function chainHooks(base, child) {
|
|
|
20
23
|
* **redeclares merges field-by-field over the base's** — so an override states
|
|
21
24
|
* only what actually differs and inherits the rest. (`type` comes along
|
|
22
25
|
* regardless: it is what marks an entry as a slot rather than a nested
|
|
23
|
-
* sub-schema, per `isSlotDefinitionEntry`.)
|
|
24
|
-
*
|
|
25
|
-
* A subclass that really wants a plain slot states `promotedBase: undefined`,
|
|
26
|
-
* which works *because* this is a spread: a stated `undefined` overwrites the
|
|
27
|
-
* base's value where an omitted key would inherit it. The four cases are pinned
|
|
28
|
-
* by the "baseConfiguration slot override merge" tests.
|
|
26
|
+
* sub-schema, per `isSlotDefinitionEntry`.) The cases are pinned by the
|
|
27
|
+
* "baseConfiguration slot override merge" tests.
|
|
29
28
|
*/
|
|
30
29
|
function mergeSchemaDefinition(baseDefinition, childDefinition) {
|
|
31
30
|
const merged = {
|
|
@@ -42,6 +41,19 @@ function mergeSchemaDefinition(baseDefinition, childDefinition) {
|
|
|
42
41
|
}
|
|
43
42
|
return merged;
|
|
44
43
|
}
|
|
44
|
+
// No two slots a shorthand names take the same bare form, since a bare value
|
|
45
|
+
// lifts by its form alone. A name may be a key `preProcessSnapshot` expands
|
|
46
|
+
// rather than a slot, as an assembly sidecar's `uri` is.
|
|
47
|
+
function checkShorthand(modelName, definition, shorthand) {
|
|
48
|
+
const slots = shorthand === undefined
|
|
49
|
+
? []
|
|
50
|
+
: typeof shorthand === 'string'
|
|
51
|
+
? [shorthand]
|
|
52
|
+
: shorthand;
|
|
53
|
+
if (Object.keys(shorthandTargetsOf(definition, shorthand)).length < slots.length) {
|
|
54
|
+
throw new Error(`${modelName}'s shorthand names ${slots.join(' and ')}, which take the same bare form, so a bare value could not say which it means`);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
45
57
|
function preprocessConfigurationSchemaArguments(modelName, inputSchemaDefinition, inputOptions = {}) {
|
|
46
58
|
if (typeof modelName !== 'string') {
|
|
47
59
|
throw new Error('first arg must be string name of the model that this config schema goes with');
|
|
@@ -55,24 +67,29 @@ function preprocessConfigurationSchemaArguments(modelName, inputSchemaDefinition
|
|
|
55
67
|
: undefined;
|
|
56
68
|
// A base with no registry entry used to be skipped in silence, producing a
|
|
57
69
|
// schema missing every inherited slot with nothing thrown anywhere, and
|
|
58
|
-
// reachable without doing anything obviously wrong:
|
|
59
|
-
//
|
|
60
|
-
//
|
|
61
|
-
// Neither is registered, because only the type `ConfigurationSchema` itself
|
|
62
|
-
// returns carries the slot table.
|
|
70
|
+
// reachable without doing anything obviously wrong:
|
|
71
|
+
// `pluginManager.pluggableConfigSchemaType(…)` hands back a `types.union`,
|
|
72
|
+
// which carries no slot table of its own.
|
|
63
73
|
if (inputOptions.baseConfiguration && !baseMeta) {
|
|
64
|
-
throw new Error(`${modelName}'s baseConfiguration is not a configuration schema: it has no registered slot table, so every slot it was meant to inherit would be dropped silently. Pass the type ConfigurationSchema() returned, not a
|
|
74
|
+
throw new Error(`${modelName}'s baseConfiguration is not a configuration schema: it has no registered slot table, so every slot it was meant to inherit would be dropped silently. Pass the type ConfigurationSchema() returned, not a union (pluginManager.pluggableConfigSchemaType) or a plain MST model.`);
|
|
65
75
|
}
|
|
66
76
|
if (baseMeta) {
|
|
67
77
|
schemaDefinition = mergeSchemaDefinition(baseMeta.definition, schemaDefinition);
|
|
68
78
|
// Everything else merges as a shallow `{...base, ...child}` spread, where
|
|
69
|
-
// the child's value replaces the base's. The four hooks
|
|
70
|
-
// `createBaseTrackConfig` alone declares two of
|
|
71
|
-
// meant no track config schema could ever declare its
|
|
72
|
-
// dropping display-stub injection and the legacy-key
|
|
73
|
-
//
|
|
79
|
+
// the child's value replaces the base's. The four hooks, `requires` and
|
|
80
|
+
// `retired` must not: `createBaseTrackConfig` alone declares two of the hooks, so
|
|
81
|
+
// replace-semantics meant no track config schema could ever declare its
|
|
82
|
+
// own without silently dropping display-stub injection and the legacy-key
|
|
83
|
+
// migration, and a subclass stating one requirement would have dropped
|
|
84
|
+
// every one its base stated. They compose instead, base first, and
|
|
85
|
+
// `retired` merges per key so a subclass adds a spelling without dropping
|
|
86
|
+
// the ones its base retired. See MergedConfigurationSchemaOptions.
|
|
74
87
|
const basePreProcess = baseMeta.options.preProcessSnapshot;
|
|
75
88
|
const childPreProcess = inputOptions.preProcessSnapshot;
|
|
89
|
+
const requires = [
|
|
90
|
+
...(baseMeta.options.requires ?? []),
|
|
91
|
+
...(inputOptions.requires ?? []),
|
|
92
|
+
];
|
|
76
93
|
options = {
|
|
77
94
|
...baseMeta.options,
|
|
78
95
|
...inputOptions,
|
|
@@ -83,6 +100,10 @@ function preprocessConfigurationSchemaArguments(modelName, inputSchemaDefinition
|
|
|
83
100
|
preProcessSnapshot: basePreProcess && childPreProcess
|
|
84
101
|
? snapshot => childPreProcess(basePreProcess(snapshot))
|
|
85
102
|
: (childPreProcess ?? basePreProcess),
|
|
103
|
+
retired: baseMeta.options.retired || inputOptions.retired
|
|
104
|
+
? { ...baseMeta.options.retired, ...inputOptions.retired }
|
|
105
|
+
: undefined,
|
|
106
|
+
requires: requires.length ? requires : undefined,
|
|
86
107
|
};
|
|
87
108
|
}
|
|
88
109
|
return { schemaDefinition, options };
|
|
@@ -90,51 +111,42 @@ function preprocessConfigurationSchemaArguments(modelName, inputSchemaDefinition
|
|
|
90
111
|
function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
91
112
|
// now assemble the MST model of the configuration schema
|
|
92
113
|
const modelDefinition = {};
|
|
93
|
-
let identifier;
|
|
94
114
|
if (options.explicitlyTyped) {
|
|
95
115
|
modelDefinition.type = types.optional(types.literal(modelName), modelName);
|
|
96
116
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
// explicit identifiers are plain MST identifiers (caller-supplied id);
|
|
101
|
-
// implicit identifiers auto-generate via ElementId. Both name the field after
|
|
102
|
-
// the option string, or default to `id` when the option is just `true`.
|
|
103
|
-
const idSpec = options.explicitIdentifier
|
|
104
|
-
? { name: options.explicitIdentifier, idType: types.identifier }
|
|
105
|
-
: options.implicitIdentifier
|
|
106
|
-
? { name: options.implicitIdentifier, idType: ElementId }
|
|
107
|
-
: undefined;
|
|
108
|
-
if (idSpec) {
|
|
109
|
-
identifier = typeof idSpec.name === 'string' ? idSpec.name : 'id';
|
|
110
|
-
modelDefinition[identifier] = idSpec.idType;
|
|
117
|
+
const identifier = options.explicitIdentifier;
|
|
118
|
+
if (identifier) {
|
|
119
|
+
modelDefinition[identifier] = types.identifier;
|
|
111
120
|
}
|
|
112
121
|
// String/number entries in the schema definition become volatile instance
|
|
113
122
|
// constants (read via `model.someName`). Per-slot metadata lives in the
|
|
114
123
|
// schema registry (a WeakMap keyed by the MST type, see schemaRegistry.ts),
|
|
115
124
|
// not on the instance.
|
|
116
125
|
const volatileConstants = {};
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
//
|
|
120
|
-
// excluded here — collected as the loop classifies each entry rather than
|
|
121
|
-
// re-scanning modelDefinition afterward.
|
|
126
|
+
// The members `setSubschema` replaces: a single sub-schema, swapped for a
|
|
127
|
+
// node built from the data, or a collection of them, assigned whole so MST
|
|
128
|
+
// reconciles the entries. Collected as the loop classifies each entry.
|
|
122
129
|
const subSchemaKeys = new Set();
|
|
130
|
+
const collectionKeys = new Set();
|
|
123
131
|
// The actual slots, which is a strictly smaller set than `modelDefinition`:
|
|
124
132
|
// that also holds the sub-schema properties and the identifier, neither of
|
|
125
133
|
// which setSlot may write. Same collect-as-you-classify as subSchemaKeys.
|
|
126
134
|
const slotKeys = new Set();
|
|
135
|
+
const storesNull = new Set();
|
|
136
|
+
const featureFields = new Set();
|
|
137
|
+
const takesNoCallback = new Map();
|
|
127
138
|
for (const [slotName, slotDefinition] of Object.entries(schemaDefinition)) {
|
|
128
139
|
if (isConfigurationSchemaType(slotDefinition)) {
|
|
129
140
|
// a sub-configuration. A bare sub-schema is already stripDefault-wrapped
|
|
130
141
|
// (so it strips when all-default); an array/map of sub-schemas gets
|
|
131
|
-
// wrapped so an empty
|
|
132
|
-
//
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
142
|
+
// wrapped so an empty collection is likewise omitted from the snapshot,
|
|
143
|
+
// unless it is wrapped in a default of its own: a display built on
|
|
144
|
+
// another names its own default plot that way.
|
|
145
|
+
if (isArrayType(slotDefinition) || isMapType(slotDefinition)) {
|
|
146
|
+
modelDefinition[slotName] = isOptionalType(slotDefinition)
|
|
147
|
+
? slotDefinition
|
|
148
|
+
: types.stripDefault(slotDefinition, isArrayType(slotDefinition) ? [] : {});
|
|
149
|
+
collectionKeys.add(slotName);
|
|
138
150
|
}
|
|
139
151
|
else {
|
|
140
152
|
modelDefinition[slotName] = slotDefinition;
|
|
@@ -149,6 +161,15 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
149
161
|
slotKeys.add(slotName);
|
|
150
162
|
try {
|
|
151
163
|
modelDefinition[slotName] = ConfigSlot(slotDefinition);
|
|
164
|
+
if (modelDefinition[slotName].is(null)) {
|
|
165
|
+
storesNull.add(slotName);
|
|
166
|
+
}
|
|
167
|
+
if (slotDefinition.type === 'featureField') {
|
|
168
|
+
featureFields.add(slotName);
|
|
169
|
+
}
|
|
170
|
+
else if (!slotDefinition.contextVariable?.length) {
|
|
171
|
+
takesNoCallback.set(slotName, slotDefinition.type);
|
|
172
|
+
}
|
|
152
173
|
}
|
|
153
174
|
catch (e) {
|
|
154
175
|
throw new Error(`invalid config slot definition for ${modelName}.${slotName}: ${e}`, { cause: e });
|
|
@@ -163,10 +184,23 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
163
184
|
throw new Error(`invalid configuration schema definition, "${slotName}" must be either a valid configuration slot definition, a constant, or a nested configuration schema`);
|
|
164
185
|
}
|
|
165
186
|
}
|
|
187
|
+
checkRequirements(modelName, schemaDefinition, options.requires ?? []);
|
|
188
|
+
checkShorthand(modelName, schemaDefinition, options.shorthand);
|
|
166
189
|
let completeModel = types
|
|
167
190
|
.model(`${modelName}ConfigurationSchema`, modelDefinition)
|
|
168
|
-
|
|
191
|
+
// annotated so `ConfigurationSchemaType['Type']`, which has to name these
|
|
192
|
+
// two by hand (the model's own props are a `Record<string, any>`, so
|
|
193
|
+
// nothing derived off them keeps a signature), cannot drift from them
|
|
194
|
+
.actions((self) => ({
|
|
195
|
+
// Replace a sub-schema member whole. `data` is whatever the sub-schema's
|
|
196
|
+
// `preProcessSnapshot` takes, a string shorthand included; for a
|
|
197
|
+
// collection it is the whole list or map, and `null` resets it to its
|
|
198
|
+
// default, empty unless the collection names one.
|
|
169
199
|
setSubschema(slotName, data) {
|
|
200
|
+
if (collectionKeys.has(slotName)) {
|
|
201
|
+
self[slotName] = data ?? undefined;
|
|
202
|
+
return self[slotName];
|
|
203
|
+
}
|
|
170
204
|
if (!subSchemaKeys.has(slotName)) {
|
|
171
205
|
throw new Error(`${slotName} is not a subschema, cannot replace`);
|
|
172
206
|
}
|
|
@@ -177,7 +211,8 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
177
211
|
return newSchema;
|
|
178
212
|
},
|
|
179
213
|
// generic slot setter the config editor's slot facade routes through. A
|
|
180
|
-
// slot is a bare value-union property, so this is a plain assignment
|
|
214
|
+
// slot is a bare value-union property, so this is a plain assignment,
|
|
215
|
+
// save an array, which `refillArray` writes.
|
|
181
216
|
//
|
|
182
217
|
// **Don't weaken the membership check to a warning, and don't check
|
|
183
218
|
// against `modelDefinition`** — that also holds the identifier and the
|
|
@@ -185,7 +220,14 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
185
220
|
// Slot-name safety is a write guard (ADR-052); `setSlot`'s tests in
|
|
186
221
|
// `configurationSchema.test.ts` pin both halves. `slotKeys` already has
|
|
187
222
|
// base-schema slots merged in, so an inherited slot passes.
|
|
188
|
-
|
|
223
|
+
// `null` resets, the same thing `undefined` does, because a JSON-borne
|
|
224
|
+
// caller cannot spell `undefined`: a session spec, share link or agent
|
|
225
|
+
// call can set a slot and then has no way to put it back. Omitting the
|
|
226
|
+
// key is not that — this action is the merge path, where an absent key
|
|
227
|
+
// means "leave it alone". A sub-schema reads `null` the same way, and
|
|
228
|
+
// no slot stores `null` as a value.
|
|
229
|
+
setSlot(slotName, rawValue) {
|
|
230
|
+
const value = rawValue ?? undefined;
|
|
189
231
|
if (!slotKeys.has(slotName)) {
|
|
190
232
|
// the sub-schema branch re-classifies off the definition rather than
|
|
191
233
|
// carrying a second Set: it runs only on the way to a throw, and the
|
|
@@ -198,7 +240,24 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
198
240
|
.sort()
|
|
199
241
|
.join(', ')}`);
|
|
200
242
|
}
|
|
201
|
-
|
|
243
|
+
// MST skips its own type check in a production build, and a value the
|
|
244
|
+
// slot's union cannot take is then dropped with no throw: the write
|
|
245
|
+
// reported success and the slot kept its old value. `is` still runs
|
|
246
|
+
// there, so the guard holds in both builds.
|
|
247
|
+
if (!modelDefinition[slotName].is(value)) {
|
|
248
|
+
const declared = schemaDefinition[slotName];
|
|
249
|
+
const slotType = isSlotDefinitionEntry(declared)
|
|
250
|
+
? declared.type
|
|
251
|
+
: 'value';
|
|
252
|
+
throw new Error(slotWriteRefusal(`${modelName}.${slotName}`, slotType, value));
|
|
253
|
+
}
|
|
254
|
+
const held = self[slotName];
|
|
255
|
+
if (isObservableArray(held) && Array.isArray(value)) {
|
|
256
|
+
refillArray(held, value);
|
|
257
|
+
}
|
|
258
|
+
else {
|
|
259
|
+
self[slotName] = value;
|
|
260
|
+
}
|
|
202
261
|
},
|
|
203
262
|
}));
|
|
204
263
|
if (Object.keys(volatileConstants).length) {
|
|
@@ -215,9 +274,15 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
215
274
|
for (const hook of hookList(options.extend)) {
|
|
216
275
|
completeModel = completeModel.extend(hook);
|
|
217
276
|
}
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
277
|
+
const metadata = {
|
|
278
|
+
name: modelName,
|
|
279
|
+
definition: schemaDefinition,
|
|
280
|
+
options,
|
|
281
|
+
storesNull,
|
|
282
|
+
featureFields,
|
|
283
|
+
takesNoCallback,
|
|
284
|
+
};
|
|
285
|
+
completeModel = completeModel.preProcessSnapshot(snapshot => preProcessSnapshotWith(metadata, snapshot));
|
|
221
286
|
const identifierDefault = identifier ? { [identifier]: 'placeholderId' } : {};
|
|
222
287
|
const modelDefault = options.explicitlyTyped
|
|
223
288
|
? { type: modelName, ...identifierDefault }
|
|
@@ -225,73 +290,58 @@ function makeConfigurationSchemaModel(modelName, schemaDefinition, options) {
|
|
|
225
290
|
// stripDefault (not optional) so a nested all-default sub-schema is omitted
|
|
226
291
|
// from its parent's snapshot: the slot props strip themselves, the sub-schema
|
|
227
292
|
// collapses to its default, and the parent's stripDefault drops the key.
|
|
228
|
-
const wrappedModel = types.stripDefault(completeModel, modelDefault);
|
|
229
|
-
// Register metadata against BOTH handles: the inner model (what getType(node)
|
|
230
|
-
// returns for a live config — the config editor's slot facade looks it up
|
|
231
|
-
// from there) and the stripDefault wrapper (what ConfigurationSchema returns
|
|
232
|
-
// and what sub-schema properties hold), so a lookup succeeds from either.
|
|
233
|
-
const metadata = { definition: schemaDefinition, options };
|
|
234
293
|
registerConfigurationSchema(completeModel, metadata);
|
|
235
|
-
|
|
236
|
-
|
|
294
|
+
return types.stripDefault(completeModel, modelDefault);
|
|
295
|
+
}
|
|
296
|
+
// Assigning an array makes MST reconcile it, scanning ahead for a node to reuse
|
|
297
|
+
// at each mismatch: seconds for a reorder of 5,000 row names. A slot array
|
|
298
|
+
// holds scalars, so no reused node keeps anything of its own, and emptying and
|
|
299
|
+
// refilling it takes 50 ms for the 5,000. spliceWithArray, since spreading into
|
|
300
|
+
// `push` overflows the stack past about 120,000 names. An unchanged array is
|
|
301
|
+
// left alone, so it fires no observer.
|
|
302
|
+
function refillArray(held, value) {
|
|
303
|
+
if (held.length !== value.length || held.some((v, i) => v !== value[i])) {
|
|
304
|
+
held.clear();
|
|
305
|
+
held.spliceWithArray(0, 0, value);
|
|
306
|
+
}
|
|
237
307
|
}
|
|
238
308
|
export function ConfigurationSchema(modelName, inputSchemaDefinition, inputOptions) {
|
|
239
309
|
const { schemaDefinition, options } = preprocessConfigurationSchemaArguments(modelName, inputSchemaDefinition, inputOptions);
|
|
240
310
|
return makeConfigurationSchemaModel(modelName, schemaDefinition, options);
|
|
241
311
|
}
|
|
242
|
-
// The hydration cache lives on the PluginManager instance (see
|
|
243
|
-
// trackConfigHydrationCache's doc comment there and ADR-031), not as a
|
|
244
|
-
// module-level singleton: it must never hand a track resolved on one
|
|
245
|
-
// PluginManager instance a node built with another instance's env, and
|
|
246
|
-
// scoping it to the instance rules that out structurally rather than by
|
|
247
|
-
// convention. Nested a second level by schemaType, since one PluginManager
|
|
248
|
-
// registers a distinct schemaType per track type.
|
|
249
|
-
function frozenTrackHydrationCache(pluginManager, schemaType) {
|
|
250
|
-
const byType = pluginManager.trackConfigHydrationCache;
|
|
251
|
-
let cache = byType.get(schemaType);
|
|
252
|
-
if (!cache) {
|
|
253
|
-
cache = new WeakMap();
|
|
254
|
-
byType.set(schemaType, cache);
|
|
255
|
-
}
|
|
256
|
-
return cache;
|
|
257
|
-
}
|
|
258
312
|
// The frozen -> live half of TrackConfigurationReference's `get`, shared with
|
|
259
|
-
// hydrateTrackConfig below so there is one hydration
|
|
260
|
-
//
|
|
313
|
+
// hydrateTrackConfig below so there is one hydration rather than two that can
|
|
314
|
+
// drift on which env they build with. The memo it goes through belongs to the
|
|
315
|
+
// PluginManager instance (ADR-031): a node built with one instance's env must
|
|
316
|
+
// never be handed to another, and `pluginManager.hydratedTrackConfig` scopes
|
|
317
|
+
// that structurally rather than by convention.
|
|
261
318
|
function hydrateInto(pluginManager, schemaType, frozen) {
|
|
262
|
-
|
|
263
|
-
const cached = cache.get(frozen);
|
|
264
|
-
if (cached) {
|
|
265
|
-
return cached;
|
|
266
|
-
}
|
|
267
|
-
const model = schemaType.create(frozen, { pluginManager });
|
|
268
|
-
cache.set(frozen, model);
|
|
269
|
-
return model;
|
|
319
|
+
return pluginManager.hydratedTrackConfig(schemaType, frozen, () => schemaType.create(frozen, { pluginManager }));
|
|
270
320
|
}
|
|
271
321
|
/**
|
|
272
322
|
* #api core/configuration
|
|
273
323
|
* Hydrate a plain track config into a live config node, dispatching on its
|
|
274
324
|
* `type` to find the schema. `session.tracks` holds `types.frozen` plain
|
|
275
|
-
* objects until something references a track (ADR-031)
|
|
276
|
-
*
|
|
277
|
-
*
|
|
278
|
-
* nothing that walks a live node — the promotable cascade above all — applies
|
|
325
|
+
* objects until something references a track (ADR-031). One of those holds only
|
|
326
|
+
* what was literally authored: a slot at its schema default is absent,
|
|
327
|
+
* `preProcessSnapshot` has not run, and nothing that walks a live node applies
|
|
279
328
|
* to it.
|
|
280
329
|
*
|
|
281
|
-
*
|
|
282
|
-
*
|
|
283
|
-
* config" is the case this exists for: it is reached from two menus, and one of
|
|
330
|
+
* Use it where a caller needs the resolved config and may be handed either
|
|
331
|
+
* form. The About dialog's "Copy config" is reached from two menus, and one of
|
|
284
332
|
* them passes a `session.tracks` entry.
|
|
285
333
|
*
|
|
286
|
-
* Returns **undefined**
|
|
287
|
-
*
|
|
288
|
-
*
|
|
289
|
-
*
|
|
290
|
-
* it as the plain object it is.
|
|
334
|
+
* Returns **undefined** when the config names a track type no plugin
|
|
335
|
+
* registered, or when `create` rejects it as invalid. An un-hydrated config has
|
|
336
|
+
* never been validated, so the dialog opening over it should not throw. Callers
|
|
337
|
+
* fall back to using the plain object.
|
|
291
338
|
*
|
|
292
339
|
* Shares `TrackConfigurationReference`'s per-PluginManager cache, so hydrating
|
|
293
|
-
* the same entry twice returns the same node and
|
|
294
|
-
*
|
|
340
|
+
* the same entry twice returns the same node, and in an admin session a track
|
|
341
|
+
* opened later resolves to that same node. A non-admin's open track
|
|
342
|
+
* resolves to the session's private working copy (ADR-032), and this function
|
|
343
|
+
* returns the pristine mirror beside it. The two have the same content;
|
|
344
|
+
* `CopyConfigEntryPoints.test.ts` tests both cases.
|
|
295
345
|
*/
|
|
296
346
|
export function hydrateTrackConfig(pluginManager, config) {
|
|
297
347
|
const type = config.type;
|
|
@@ -315,7 +365,18 @@ export function hydrateTrackConfig(pluginManager, config) {
|
|
|
315
365
|
// config snapshot (held as a standalone schema instance). Both reference kinds
|
|
316
366
|
// resolve to `schemaType` instances, so MST can't auto-dispatch on the instance
|
|
317
367
|
// side — the explicit snapshot dispatcher (string → ref, object → schema)
|
|
318
|
-
// disambiguates. Shared by TrackConfigurationReference/DisplayConfigurationReference
|
|
368
|
+
// disambiguates. Shared by TrackConfigurationReference/DisplayConfigurationReference,
|
|
369
|
+
// and by neither accident nor oversight NOT by the plain branch — see the note
|
|
370
|
+
// on it in `ConfigurationReference`.
|
|
371
|
+
//
|
|
372
|
+
// One consequence, because both refs' `set` callbacks read as if it were not
|
|
373
|
+
// true: assigning a config **node** here does not store a reference to it. The
|
|
374
|
+
// dispatcher sees a non-string and picks `schemaType`, so MST tries to adopt the
|
|
375
|
+
// node as an inline child — which throws if it already has a parent. `set` is
|
|
376
|
+
// therefore unreachable on both refs (checked by making it throw: 231 suites
|
|
377
|
+
// stayed green), and exists only because MST rejects a custom reference
|
|
378
|
+
// declaring `get` without it. The plain branch, with no dispatcher, does the
|
|
379
|
+
// opposite and stores the reference.
|
|
319
380
|
function idOrSnapshotUnion(ref, schemaType) {
|
|
320
381
|
return types.union({
|
|
321
382
|
dispatcher: snapshot => (typeof snapshot === 'string' ? ref : schemaType),
|
|
@@ -335,33 +396,26 @@ function idOrSnapshotUnion(ref, schemaType) {
|
|
|
335
396
|
* to just the object branch, forcing callers to wrap string ids in
|
|
336
397
|
* `@ts-expect-error`. The inferred union SnapshotIn is `string | SnapshotIn<schema>`.
|
|
337
398
|
*/
|
|
338
|
-
|
|
399
|
+
function TrackConfigurationReference(schemaType) {
|
|
339
400
|
const trackRef = types.reference(schemaType, {
|
|
340
401
|
get(id, parent) {
|
|
341
402
|
const session = getSession(parent);
|
|
403
|
+
const trackId = String(id);
|
|
342
404
|
// Per-id lookup: subscribes only to this trackId's derivation, so
|
|
343
|
-
// resolving one track's config doesn't re-render the others.
|
|
344
|
-
//
|
|
345
|
-
|
|
405
|
+
// resolving one track's config doesn't re-render the others. A session
|
|
406
|
+
// with track deltas hands back a private, per-track working copy so a
|
|
407
|
+
// shown track's in-place quick-edits mutate that copy and never the
|
|
408
|
+
// shared frozen base (ADR-032); any other session falls through to the
|
|
409
|
+
// frozen hydration cache (ADR-031).
|
|
410
|
+
const ret = isSessionWithEditableTrackConfig(session)
|
|
411
|
+
? session.getEditableTrackConfig(trackId, schemaType)
|
|
412
|
+
: session.getTrackById(trackId);
|
|
346
413
|
if (!ret) {
|
|
347
414
|
throw new Error(`Could not resolve trackId "${id}"`);
|
|
348
415
|
}
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
// never the shared frozen base node (see agent-docs/ADR-032). Admin and
|
|
353
|
-
// embedded sessions return undefined here and fall through to the frozen
|
|
354
|
-
// hydration cache (ADR-031) — admin edits the frozen entry in place.
|
|
355
|
-
const editable = session.getEditableTrackConfig?.(String(id), ret, schemaType);
|
|
356
|
-
if (editable) {
|
|
357
|
-
ret = editable;
|
|
358
|
-
}
|
|
359
|
-
else {
|
|
360
|
-
const env = getEnv(parent);
|
|
361
|
-
ret = hydrateInto(env.pluginManager, schemaType, ret);
|
|
362
|
-
}
|
|
363
|
-
}
|
|
364
|
-
return ret;
|
|
416
|
+
return isStateTreeNode(ret)
|
|
417
|
+
? ret
|
|
418
|
+
: hydrateInto(getEnv(parent).pluginManager, schemaType, ret);
|
|
365
419
|
},
|
|
366
420
|
set(value) {
|
|
367
421
|
return value.trackId;
|
|
@@ -381,15 +435,26 @@ export function TrackConfigurationReference(schemaType) {
|
|
|
381
435
|
* Step 2 is the safety net because `baseTrackConfig.preProcessSnapshot`
|
|
382
436
|
* already injects a stub display for every registered displayType on the
|
|
383
437
|
* track, so a same-type lookup always succeeds at runtime for properly
|
|
384
|
-
* loaded tracks.
|
|
385
|
-
*
|
|
386
|
-
*
|
|
387
|
-
*
|
|
438
|
+
* loaded tracks. It is what carries a **renamed display type** across for a
|
|
439
|
+
* catalog track: the injected stub is named for the new type, the display
|
|
440
|
+
* model's own `preProcessSnapshot` rewrites the state model's, and the saved
|
|
441
|
+
* `configuration` id still spells the old name, so only the type match
|
|
442
|
+
* reconnects them. Not every pre-rename session reaches it — a track config
|
|
443
|
+
* that itself declares the old display entry keeps that entry's `displayId`
|
|
444
|
+
* through the alias rewrite (`{ ...d, type: canonical }`) and wins the
|
|
445
|
+
* first-wins dedupe, so its session resolves by id. An older third step
|
|
446
|
+
* auto-created a *detached* config when neither matched — that produced an
|
|
447
|
+
* orphaned MST node whose edits silently didn't persist. Removed in favor of a
|
|
448
|
+
* clear throw.
|
|
388
449
|
*
|
|
389
|
-
*
|
|
390
|
-
*
|
|
450
|
+
* The union's schemaType branch is symmetry with `TrackConfigurationReference`
|
|
451
|
+
* rather than a path anything in tree takes: the two production writers,
|
|
452
|
+
* `showTrackGeneric` and `BaseTrackModel.replaceDisplay`, both write a
|
|
453
|
+
* displayId string, because a display config belongs in its track config's
|
|
454
|
+
* `displays` array. It stays because it costs nothing and because dropping it
|
|
455
|
+
* narrows `SnapshotIn` for every caller.
|
|
391
456
|
*/
|
|
392
|
-
|
|
457
|
+
function DisplayConfigurationReference(schemaType) {
|
|
393
458
|
const displayRef = types.reference(schemaType, {
|
|
394
459
|
get(id, parent) {
|
|
395
460
|
// track.configuration is a hydrated MST node (hydrated lazily via
|
|
@@ -443,9 +508,17 @@ export function ConfigurationReference(schemaType) {
|
|
|
443
508
|
? TrackConfigurationReference(schemaType)
|
|
444
509
|
: id === 'displayId'
|
|
445
510
|
? DisplayConfigurationReference(schemaType)
|
|
446
|
-
: // Plain (non-track/display) ref
|
|
447
|
-
//
|
|
448
|
-
//
|
|
511
|
+
: // Plain (non-track/display) ref — internet accounts, connections —
|
|
512
|
+
// resolved by MST's own identifier lookup rather than through the
|
|
513
|
+
// session. **Deliberately not `idOrSnapshotUnion`**, even though it is
|
|
514
|
+
// the same two members: this branch is also handed a *live, in-tree*
|
|
515
|
+
// config node (`initializeInternetAccount` pushes
|
|
516
|
+
// `jbrowse.internetAccounts[i]` straight through), and an undispatched
|
|
517
|
+
// union sends that to the reference member because
|
|
518
|
+
// `BaseReferenceType.isAssignableFrom` defers to its target type. A
|
|
519
|
+
// `typeof snapshot === 'string'` dispatcher sends it to the schema
|
|
520
|
+
// member instead, and MST refuses to adopt a node that already has a
|
|
521
|
+
// parent. `InternetAccounts.test.ts` is the canary.
|
|
449
522
|
types.union(types.reference(schemaType), schemaType);
|
|
450
523
|
return ref;
|
|
451
524
|
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ConfigurationSchemaOptions, ConfigurationSchemaType } from './configurationSchema.ts';
|
|
2
|
+
import type { AnyConfigurationSchemaType } from './types.ts';
|
|
3
|
+
import type { IAnyType, ISimpleType, IType, SnapshotIn, SnapshotOut } from '@jbrowse/mobx-state-tree';
|
|
4
|
+
interface NamedTypeSlotDef<NAME extends string> {
|
|
5
|
+
type: 'stringEnum';
|
|
6
|
+
model: ISimpleType<NAME>;
|
|
7
|
+
}
|
|
8
|
+
type Named<SCHEMA, NAME extends string> = SCHEMA extends ConfigurationSchemaType<infer D, infer O extends ConfigurationSchemaOptions<any, any>> ? ConfigurationSchemaType<{
|
|
9
|
+
[K in keyof D]: K extends 'type' ? NamedTypeSlotDef<NAME> : D[K];
|
|
10
|
+
}, O> : never;
|
|
11
|
+
type UnionNode<MEMBERS> = {
|
|
12
|
+
[K in keyof MEMBERS & string]: Named<MEMBERS[K], K>['Type'];
|
|
13
|
+
}[keyof MEMBERS & string];
|
|
14
|
+
/**
|
|
15
|
+
* A union of configuration schemas, each member's node reading its `type` as
|
|
16
|
+
* the key it is listed under — so a `switch` over it narrows to that member's
|
|
17
|
+
* own slots.
|
|
18
|
+
*/
|
|
19
|
+
export type ConfigurationSchemaUnionType<MEMBERS extends Record<string, AnyConfigurationSchemaType>> = Omit<IType<SnapshotIn<MEMBERS[keyof MEMBERS]>, SnapshotOut<MEMBERS[keyof MEMBERS]>, UnionNode<MEMBERS>>, 'Type'> & {
|
|
20
|
+
readonly Type: UnionNode<MEMBERS>;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* #api core/configuration
|
|
24
|
+
* A list entry that is one of several configuration schemas, each keyed by the
|
|
25
|
+
* `type` it answers to: `types.array(ConfigurationSchemaUnion('Step', { filter,
|
|
26
|
+
* bin }))`. The keys are the vocabulary, the snapshot's `type` picks the
|
|
27
|
+
* member, and a `type` naming no member is refused in every build — where a
|
|
28
|
+
* bare `types.union` would load it as its first member. Each member is an
|
|
29
|
+
* `explicitlyTyped`, `closed` schema named by its key, so a key belonging to
|
|
30
|
+
* another member is refused rather than dropped; one that is not throws here.
|
|
31
|
+
*/
|
|
32
|
+
export declare function ConfigurationSchemaUnion<const MEMBERS extends Record<string, AnyConfigurationSchemaType>>(name: string, members: MEMBERS): ConfigurationSchemaUnionType<MEMBERS>;
|
|
33
|
+
/**
|
|
34
|
+
* #api core/configuration
|
|
35
|
+
* The `ConfigurationSchemaUnion` an array slot's entries answer to, read off
|
|
36
|
+
* the slot's MST type, or undefined for any other slot.
|
|
37
|
+
*/
|
|
38
|
+
export declare function arraySlotUnion(slotType: IAnyType): import("./schemaRegistry.ts").ConfigurationSchemaUnionMetadata | undefined;
|
|
39
|
+
export {};
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { asArrayType, types } from '@jbrowse/mobx-state-tree';
|
|
2
|
+
import { getConfigurationSchemaMetadata, getConfigurationSchemaUnion, registerConfigurationSchemaUnion, } from './schemaRegistry.js';
|
|
3
|
+
import { listed } from './snapshotPreprocess.js';
|
|
4
|
+
function memberRefusal(key, member) {
|
|
5
|
+
const meta = getConfigurationSchemaMetadata(member);
|
|
6
|
+
return !meta
|
|
7
|
+
? 'which is not a configuration schema'
|
|
8
|
+
: meta.name !== key
|
|
9
|
+
? `whose schema names itself "${meta.name}"`
|
|
10
|
+
: !meta.options.explicitlyTyped
|
|
11
|
+
? 'which is not explicitlyTyped, so its snapshot names no type to dispatch on'
|
|
12
|
+
: !meta.options.closed
|
|
13
|
+
? 'which is not closed, so a key of another member would be dropped in silence'
|
|
14
|
+
: undefined;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* #api core/configuration
|
|
18
|
+
* A list entry that is one of several configuration schemas, each keyed by the
|
|
19
|
+
* `type` it answers to: `types.array(ConfigurationSchemaUnion('Step', { filter,
|
|
20
|
+
* bin }))`. The keys are the vocabulary, the snapshot's `type` picks the
|
|
21
|
+
* member, and a `type` naming no member is refused in every build — where a
|
|
22
|
+
* bare `types.union` would load it as its first member. Each member is an
|
|
23
|
+
* `explicitlyTyped`, `closed` schema named by its key, so a key belonging to
|
|
24
|
+
* another member is refused rather than dropped; one that is not throws here.
|
|
25
|
+
*/
|
|
26
|
+
export function ConfigurationSchemaUnion(name, members) {
|
|
27
|
+
for (const [key, member] of Object.entries(members)) {
|
|
28
|
+
const refusal = memberRefusal(key, member);
|
|
29
|
+
if (refusal) {
|
|
30
|
+
throw new Error(`${name} lists "${key}", ${refusal}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
const names = Object.keys(members);
|
|
34
|
+
const union = types.union({
|
|
35
|
+
dispatcher: (snapshot) => {
|
|
36
|
+
const type = snapshot?.type;
|
|
37
|
+
if (typeof type === 'string' && Object.hasOwn(members, type)) {
|
|
38
|
+
return members[type];
|
|
39
|
+
}
|
|
40
|
+
throw new Error(`a ${name} names its type, one of ${listed(names)}, ${type === undefined
|
|
41
|
+
? 'and names none'
|
|
42
|
+
: `not ${JSON.stringify(type)}`}`);
|
|
43
|
+
},
|
|
44
|
+
}, ...Object.values(members));
|
|
45
|
+
registerConfigurationSchemaUnion(union, { name, members });
|
|
46
|
+
return union;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* #api core/configuration
|
|
50
|
+
* The `ConfigurationSchemaUnion` an array slot's entries answer to, read off
|
|
51
|
+
* the slot's MST type, or undefined for any other slot.
|
|
52
|
+
*/
|
|
53
|
+
export function arraySlotUnion(slotType) {
|
|
54
|
+
const array = asArrayType(slotType);
|
|
55
|
+
return array ? getConfigurationSchemaUnion(array.getChildType()) : undefined;
|
|
56
|
+
}
|