@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.
Files changed (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /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 { ElementId } from '../util/types/mst.js';
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: `isBareConfigurationSchemaType`
59
- // answers true for a `types.late` wrapper, and
60
- // `pluginManager.pluggableConfigSchemaType(…)` hands back a `types.union`.
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 types.late wrapper, a union (pluginManager.pluggableConfigSchemaType), or a plain MST model.`);
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 below must not:
70
- // `createBaseTrackConfig` alone declares two of them, so replace-semantics
71
- // meant no track config schema could ever declare its own without silently
72
- // dropping display-stub injection and the legacy-key migration. They
73
- // compose instead, base first. See MergedConfigurationSchemaOptions.
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
- if (options.explicitIdentifier && options.implicitIdentifier) {
98
- throw new Error(`Cannot have both explicit and implicit identifiers in ${modelName}`);
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
- // Keys of single sub-schema slots (not array/map-of-sub-schema). setSubschema
118
- // replaces such a node via `.create(data)`, which throws a confusing MST
119
- // validation error if pointed at an array/map-typed slot, so those are
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/default collection is likewise omitted from the
132
- // snapshot.
133
- if (isArrayType(slotDefinition)) {
134
- modelDefinition[slotName] = types.stripDefault(slotDefinition, []);
135
- }
136
- else if (isMapType(slotDefinition)) {
137
- modelDefinition[slotName] = types.stripDefault(slotDefinition, {});
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
- .actions(self => ({
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
- setSlot(slotName, value) {
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
- self[slotName] = value;
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
- if (options.preProcessSnapshot) {
219
- completeModel = completeModel.preProcessSnapshot(options.preProcessSnapshot);
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
- registerConfigurationSchema(wrappedModel, metadata);
236
- return wrappedModel;
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 and one cache rather than
260
- // two that can drift on which env or which key they use.
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
- const cache = frozenTrackHydrationCache(pluginManager, schemaType);
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), so a caller handed one
276
- * of those has a config that reads nothing but what was literally authored: a
277
- * slot at its schema default is absent, `preProcessSnapshot` has not run, and
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
- * For the callers that need the resolved answer rather than the authored one
282
- * and cannot know which of the two they were handed. The About dialog's "Copy
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** rather than throwing when the config names a track type
287
- * no plugin registered, or when it is invalid enough that `create` rejects it —
288
- * an un-hydrated config has never been validated, so a dialog that opens over
289
- * it must not be the thing that discovers this. Callers fall back to treating
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 a track that gets opened later
294
- * reuses it.
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
- export function TrackConfigurationReference(schemaType) {
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. Derived on
344
- // read, so it's fresh during hydration and add-and-show — no dual path.
345
- let ret = session.getTrackById(String(id));
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
- if (!isStateTreeNode(ret)) {
350
- // A non-admin session hands back a private, per-track working copy so a
351
- // shown track's in-place quick-edits (setSlot) mutate that copy and
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. An older third step auto-created a *detached* config when
385
- * neither matched — that produced an orphaned MST node whose edits silently
386
- * didn't persist. Removed in favor of a clear throw, since
387
- * preProcessSnapshot's injection makes the path effectively dead.
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
- * Union-with-schemaType branch is for the same reason as `TrackConfigurationReference`:
390
- * `CircularView.addTrackConf` passes inline display configs as MST instances.
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
- export function DisplayConfigurationReference(schemaType) {
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. The union accepts either an id
447
- // string (resolved via `types.reference`) or an inline schema
448
- // snapshot (held as a standalone schema instance).
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
+ }