@jbrowse/core 5.0.0-beta.11 → 5.0.0-beta.14

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 (439) hide show
  1. package/README.md +450 -132
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +4 -2
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +6 -2
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +18 -3
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -1
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -2
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +2 -1
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +4 -2
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +2 -1
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -2
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +5 -4
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +6 -4
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +2 -1
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +4 -2
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +3 -2
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +4 -2
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +2 -2
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +3 -2
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +4 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +3 -2
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +4 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +3 -2
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +4 -2
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -2
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +4 -2
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +3 -2
  28. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +4 -2
  29. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  30. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +4 -2
  31. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
  32. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +4 -2
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +3 -2
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +4 -2
  35. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +3 -1
  36. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +15 -24
  37. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +1 -1
  38. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +3 -2
  39. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +4 -2
  40. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +4 -4
  41. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.d.ts +3 -1
  42. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.js +2 -2
  43. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +3 -2
  44. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -2
  45. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +1 -2
  46. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +2 -2
  47. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +1 -2
  48. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +15 -36
  49. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +3 -2
  50. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +4 -2
  51. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +4 -2
  52. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +29 -20
  53. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +13 -1
  54. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +28 -1
  55. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +3 -3
  56. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +2 -2
  57. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +9 -0
  58. package/esm/BaseFeatureWidget/stateModelFactory.js +11 -0
  59. package/esm/BaseFeatureWidget/types.d.ts +2 -0
  60. package/esm/PluginManager.d.ts +7 -3
  61. package/esm/PluginManager.js +12 -3
  62. package/esm/ReExports/coreModules.generated.js +538 -518
  63. package/esm/ReExports/coreWorkerModules.generated.js +456 -438
  64. package/esm/ReExports/lazify.js +3 -2
  65. package/esm/ReExports/list.js +22 -6
  66. package/esm/ReExports/names.d.ts +1 -0
  67. package/esm/ReExports/names.generated.d.ts +2 -0
  68. package/esm/ReExports/names.generated.js +566 -0
  69. package/esm/ReExports/names.js +3 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +3 -3
  71. package/esm/TextSearch/TextSearchManager.js +6 -13
  72. package/esm/assemblyManager/assembly.d.ts +9 -0
  73. package/esm/assemblyManager/assembly.js +13 -0
  74. package/esm/assemblyManager/assemblyConfigSchema.d.ts +6 -1
  75. package/esm/assemblyManager/assemblyConfigSchema.js +23 -22
  76. package/esm/assemblyManager/assemblyManager.d.ts +11 -0
  77. package/esm/assemblyManager/assemblyManager.js +2 -0
  78. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +9 -0
  79. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +23 -0
  80. package/esm/checkPlugins.js +10 -4
  81. package/esm/configuration/configurationSchema.d.ts +51 -100
  82. package/esm/configuration/configurationSchema.js +59 -225
  83. package/esm/configuration/configurationSchemaUnion.d.ts +2 -1
  84. package/esm/configuration/configurationSchemaUnion.js +2 -1
  85. package/esm/configuration/configurationSlot.d.ts +18 -64
  86. package/esm/configuration/configurationSlot.js +32 -98
  87. package/esm/configuration/fillLocations.d.ts +4 -2
  88. package/esm/configuration/fillLocations.js +9 -3
  89. package/esm/configuration/formatAboutConfigSchema.d.ts +2 -2
  90. package/esm/configuration/formatAboutConfigSchema.js +2 -2
  91. package/esm/configuration/formatDetailsConfigSchema.d.ts +2 -2
  92. package/esm/configuration/formatDetailsConfigSchema.js +7 -5
  93. package/esm/configuration/getConf.d.ts +7 -36
  94. package/esm/configuration/getConf.js +20 -41
  95. package/esm/configuration/index.d.ts +4 -3
  96. package/esm/configuration/index.js +3 -2
  97. package/esm/configuration/partitionAdvanced.d.ts +12 -0
  98. package/esm/configuration/partitionAdvanced.js +42 -0
  99. package/esm/configuration/plot.d.ts +6 -0
  100. package/esm/configuration/plot.js +56 -9
  101. package/esm/configuration/readConfObject.d.ts +15 -17
  102. package/esm/configuration/readConfObject.js +19 -50
  103. package/esm/configuration/schemaRegistry.d.ts +0 -2
  104. package/esm/configuration/schemaTypes.js +5 -1
  105. package/esm/configuration/slotFacade.js +2 -2
  106. package/esm/configuration/snapshotPreprocess.d.ts +42 -18
  107. package/esm/configuration/snapshotPreprocess.js +95 -37
  108. package/esm/configuration/tabixShorthand.js +1 -3
  109. package/esm/configuration/types.d.ts +60 -159
  110. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +7 -0
  111. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +7 -0
  112. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +0 -22
  113. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +0 -55
  114. package/esm/data_adapters/BaseAdapter/index.d.ts +0 -1
  115. package/esm/data_adapters/BaseAdapter/index.js +0 -1
  116. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +2 -2
  117. package/esm/data_adapters/BaseAdapter/types.d.ts +1 -0
  118. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +2 -0
  119. package/esm/data_adapters/CytobandAdapter/configSchema.js +5 -0
  120. package/esm/data_adapters/dataAdapterCache.d.ts +25 -13
  121. package/esm/data_adapters/dataAdapterCache.js +68 -24
  122. package/esm/data_adapters/getFeatureAdapter.d.ts +9 -0
  123. package/esm/data_adapters/getFeatureAdapter.js +17 -0
  124. package/esm/pluggableElementTypes/DisplayType.d.ts +7 -0
  125. package/esm/pluggableElementTypes/DisplayType.js +7 -0
  126. package/esm/pluggableElementTypes/RpcMethodType.d.ts +7 -0
  127. package/esm/pluggableElementTypes/RpcMethodType.js +9 -0
  128. package/esm/pluggableElementTypes/addMenuItems.d.ts +2 -1
  129. package/esm/pluggableElementTypes/addMenuItems.js +2 -1
  130. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +2 -0
  131. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +2 -0
  132. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +40 -5
  133. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +57 -9
  134. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +5 -7
  135. package/esm/pluggableElementTypes/models/BaseTrackModel.js +9 -10
  136. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +2 -0
  137. package/esm/pluggableElementTypes/models/BaseViewModel.js +2 -0
  138. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +3 -0
  139. package/esm/pluggableElementTypes/models/InternetAccountModel.js +3 -0
  140. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +3 -0
  141. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +3 -0
  142. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +3 -1
  143. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +3 -1
  144. package/esm/pluggableElementTypes/models/baseTrackConfig.js +12 -1
  145. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +2 -2
  146. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +1 -1
  147. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +1 -1
  148. package/esm/pluginDefinitions.d.ts +7 -0
  149. package/esm/pluginDefinitions.js +20 -0
  150. package/esm/rpc/RpcRegistry.d.ts +2 -11
  151. package/esm/rpc/byteBudget.d.ts +15 -0
  152. package/esm/rpc/byteBudget.js +23 -0
  153. package/esm/rpc/configSchema.d.ts +2 -0
  154. package/esm/rpc/configSchema.js +3 -1
  155. package/esm/rpc/coreRpcMethods.d.ts +1 -2
  156. package/esm/rpc/coreRpcMethods.js +1 -2
  157. package/esm/rpc/explainTransferError.js +3 -3
  158. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +2 -2
  159. package/esm/rpc/methods/CoreGetEncodedLayers.js +7 -5
  160. package/esm/rpc/methods/CoreLoadTrackCode.d.ts +17 -0
  161. package/esm/rpc/methods/CoreLoadTrackCode.js +24 -0
  162. package/esm/rpc/methods/layerFeatures.d.ts +9 -6
  163. package/esm/rpc/methods/layerFeatures.js +21 -5
  164. package/esm/ui/ActionLink.d.ts +3 -2
  165. package/esm/ui/ActionLink.js +4 -2
  166. package/esm/ui/AddCustomPluginDialog.d.ts +3 -2
  167. package/esm/ui/AddCustomPluginDialog.js +6 -4
  168. package/esm/ui/AppLogo.js +43 -3
  169. package/esm/ui/BaseTooltip.d.ts +3 -2
  170. package/esm/ui/BaseTooltip.js +4 -2
  171. package/esm/ui/CascadingMenu.js +14 -12
  172. package/esm/ui/CascadingMenuButton.d.ts +2 -2
  173. package/esm/ui/CascadingMenuButton.js +5 -4
  174. package/esm/ui/CascadingMenuHelpDialog.d.ts +3 -2
  175. package/esm/ui/CascadingMenuHelpDialog.js +4 -2
  176. package/esm/ui/CascadingMenuHelpIconButton.d.ts +4 -3
  177. package/esm/ui/CascadingMenuHelpIconButton.js +9 -5
  178. package/esm/ui/ColorPicker.d.ts +5 -4
  179. package/esm/ui/ColorPicker.js +6 -4
  180. package/esm/ui/ContextMenu.d.ts +1 -1
  181. package/esm/ui/ContextMenu.js +1 -1
  182. package/esm/ui/CopyToClipboardButton.d.ts +3 -2
  183. package/esm/ui/CopyToClipboardButton.js +4 -2
  184. package/esm/ui/Crosshairs.js +13 -10
  185. package/esm/ui/DOMPurifySanitizedHTML.d.ts +3 -2
  186. package/esm/ui/DOMPurifySanitizedHTML.js +4 -2
  187. package/esm/ui/DataGridFlexContainer.d.ts +3 -2
  188. package/esm/ui/DataGridFlexContainer.js +4 -2
  189. package/esm/ui/Dialog.d.ts +1 -1
  190. package/esm/ui/Dialog.js +5 -4
  191. package/esm/ui/DropDownMenu.js +2 -2
  192. package/esm/ui/EditableTypography.d.ts +1 -1
  193. package/esm/ui/EditableTypography.js +3 -2
  194. package/esm/ui/ErrorActions.d.ts +3 -2
  195. package/esm/ui/ErrorActions.js +4 -2
  196. package/esm/ui/ErrorBanner.d.ts +2 -2
  197. package/esm/ui/ErrorBanner.js +3 -2
  198. package/esm/ui/ErrorBar.d.ts +3 -2
  199. package/esm/ui/ErrorBar.js +4 -2
  200. package/esm/ui/ErrorMessage.d.ts +3 -2
  201. package/esm/ui/ErrorMessage.js +4 -2
  202. package/esm/ui/ErrorMessageStackTraceContents.d.ts +3 -2
  203. package/esm/ui/ErrorMessageStackTraceContents.js +4 -2
  204. package/esm/ui/ErrorMessageStackTraceDialog.d.ts +3 -2
  205. package/esm/ui/ErrorMessageStackTraceDialog.js +4 -2
  206. package/esm/ui/ErrorOverlay.d.ts +3 -2
  207. package/esm/ui/ErrorOverlay.js +4 -2
  208. package/esm/ui/ExportSvgDialog.d.ts +3 -2
  209. package/esm/ui/ExportSvgDialog.js +4 -2
  210. package/esm/ui/ExternalLink.d.ts +2 -1
  211. package/esm/ui/ExternalLink.js +4 -2
  212. package/esm/ui/FactoryResetDialog.d.ts +3 -2
  213. package/esm/ui/FactoryResetDialog.js +4 -2
  214. package/esm/ui/FatalErrorDialog.d.ts +3 -2
  215. package/esm/ui/FatalErrorDialog.js +6 -4
  216. package/esm/ui/FileDropZone.d.ts +3 -2
  217. package/esm/ui/FileDropZone.js +4 -2
  218. package/esm/ui/FileSelector/LocalFileChooser.js +4 -4
  219. package/esm/ui/FileSelector/LocationInput.d.ts +3 -2
  220. package/esm/ui/FileSelector/LocationInput.js +4 -2
  221. package/esm/ui/FileSelector/SourceTypeSelector.d.ts +3 -2
  222. package/esm/ui/FileSelector/SourceTypeSelector.js +8 -6
  223. package/esm/ui/GpuFallbackButton.d.ts +3 -2
  224. package/esm/ui/GpuFallbackButton.js +4 -2
  225. package/esm/ui/HoverMenu.d.ts +2 -2
  226. package/esm/ui/HoverMenu.js +7 -3
  227. package/esm/ui/HoverTooltip.d.ts +3 -2
  228. package/esm/ui/HoverTooltip.js +4 -2
  229. package/esm/ui/Icons.d.ts +5 -5
  230. package/esm/ui/Icons.js +11 -10
  231. package/esm/ui/InlineMenuControls.d.ts +2 -2
  232. package/esm/ui/InlineMenuControls.js +4 -3
  233. package/esm/ui/JexlFilterRowEditors.d.ts +4 -4
  234. package/esm/ui/JexlFilterRowEditors.js +9 -8
  235. package/esm/ui/LabeledCheckbox.d.ts +3 -2
  236. package/esm/ui/LabeledCheckbox.js +4 -2
  237. package/esm/ui/LazyBaseTooltip.d.ts +12 -3
  238. package/esm/ui/LazyBaseTooltip.js +4 -2
  239. package/esm/ui/LegendSwatchGlyph.js +1 -0
  240. package/esm/ui/LoadingDots.d.ts +2 -1
  241. package/esm/ui/LoadingDots.js +4 -2
  242. package/esm/ui/LoadingEllipses.d.ts +5 -2
  243. package/esm/ui/LoadingEllipses.js +5 -3
  244. package/esm/ui/LoadingOverlay.d.ts +3 -2
  245. package/esm/ui/LoadingOverlay.js +4 -2
  246. package/esm/ui/LoadingProgress.d.ts +3 -2
  247. package/esm/ui/LoadingProgress.js +4 -2
  248. package/esm/ui/Logo.d.ts +2 -2
  249. package/esm/ui/Logo.js +9 -8
  250. package/esm/ui/MenuItemChevron.d.ts +2 -2
  251. package/esm/ui/MenuItemChevron.js +3 -2
  252. package/esm/ui/MenuItemEndDecoration.d.ts +2 -2
  253. package/esm/ui/MenuItemEndDecoration.js +3 -2
  254. package/esm/ui/MenuItemTrailing.d.ts +2 -2
  255. package/esm/ui/MenuItemTrailing.js +7 -6
  256. package/esm/ui/MenuTypes.d.ts +21 -1
  257. package/esm/ui/MenuTypes.js +20 -0
  258. package/esm/ui/MonospaceTextField.d.ts +3 -2
  259. package/esm/ui/MonospaceTextField.js +4 -2
  260. package/esm/ui/NumberTextField.d.ts +2 -2
  261. package/esm/ui/NumberTextField.js +4 -2
  262. package/esm/ui/PaletteContext.d.ts +11 -9
  263. package/esm/ui/PaletteContext.js +33 -18
  264. package/esm/ui/PluginStoreCard.d.ts +3 -2
  265. package/esm/ui/PluginStoreCard.js +4 -2
  266. package/esm/ui/PopoverPicker.d.ts +3 -2
  267. package/esm/ui/PopoverPicker.js +4 -2
  268. package/esm/ui/PrerenderedCanvas.d.ts +2 -2
  269. package/esm/ui/PrerenderedCanvas.js +3 -2
  270. package/esm/ui/RedErrorMessageBox.d.ts +3 -2
  271. package/esm/ui/RedErrorMessageBox.js +4 -2
  272. package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +3 -2
  273. package/esm/ui/RefNameAutocomplete/EndAdornment.js +4 -2
  274. package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -2
  275. package/esm/ui/RefNameAutocomplete/HelpDialog.js +4 -2
  276. package/esm/ui/ReplaceCurrentViewButton.d.ts +3 -2
  277. package/esm/ui/ReplaceCurrentViewButton.js +4 -2
  278. package/esm/ui/ResizeHandle.d.ts +2 -2
  279. package/esm/ui/ResizeHandle.js +3 -2
  280. package/esm/ui/SanitizedHTML.d.ts +3 -2
  281. package/esm/ui/SanitizedHTML.js +6 -4
  282. package/esm/ui/ScrollChrome.d.ts +3 -2
  283. package/esm/ui/ScrollChrome.js +4 -2
  284. package/esm/ui/ScrollEdgeShadow.d.ts +2 -2
  285. package/esm/ui/ScrollEdgeShadow.js +2 -2
  286. package/esm/ui/SessionJsonPanel.d.ts +3 -2
  287. package/esm/ui/SessionJsonPanel.js +4 -2
  288. package/esm/ui/ShareLinkField.d.ts +3 -2
  289. package/esm/ui/ShareLinkField.js +4 -2
  290. package/esm/ui/SingleSlider.d.ts +2 -2
  291. package/esm/ui/SingleSlider.js +4 -2
  292. package/esm/ui/SliderTooltip.d.ts +2 -1
  293. package/esm/ui/SliderTooltip.js +4 -2
  294. package/esm/ui/SnackbarContents.d.ts +3 -2
  295. package/esm/ui/SnackbarContents.js +4 -2
  296. package/esm/ui/SnackbarModel.d.ts +2 -0
  297. package/esm/ui/SnackbarModel.js +2 -0
  298. package/esm/ui/StackTraceButton.d.ts +3 -2
  299. package/esm/ui/StackTraceButton.js +4 -2
  300. package/esm/ui/StatusProgressBar.d.ts +3 -2
  301. package/esm/ui/StatusProgressBar.js +4 -2
  302. package/esm/ui/SubmitForm.d.ts +2 -1
  303. package/esm/ui/SubmitForm.js +4 -2
  304. package/esm/ui/SvgColorLegend.d.ts +3 -4
  305. package/esm/ui/SvgColorLegend.js +27 -18
  306. package/esm/ui/TagTextField.d.ts +2 -2
  307. package/esm/ui/TagTextField.js +4 -2
  308. package/esm/ui/ViewLoadingScreen.d.ts +3 -2
  309. package/esm/ui/ViewLoadingScreen.js +4 -2
  310. package/esm/ui/buildExtraTrackMenuItems.d.ts +2 -2
  311. package/esm/ui/colorScale.d.ts +5 -1
  312. package/esm/ui/colorScale.js +12 -10
  313. package/esm/ui/colors.d.ts +42 -31
  314. package/esm/ui/colors.js +85 -48
  315. package/esm/ui/filterMenuItems.d.ts +10 -31
  316. package/esm/ui/filterMenuItems.js +13 -14
  317. package/esm/ui/index.d.ts +1 -1
  318. package/esm/ui/index.js +1 -1
  319. package/esm/ui/launchTargetsMenuItem.js +9 -13
  320. package/esm/ui/legendMenuItem.d.ts +4 -4
  321. package/esm/ui/legendMenuItem.js +4 -4
  322. package/esm/ui/menuItemAdornment.d.ts +1 -1
  323. package/esm/ui/menuItemAdornment.js +1 -1
  324. package/esm/ui/menuItems.d.ts +1 -1
  325. package/esm/ui/menuItems.js +1 -1
  326. package/esm/ui/menuLabels.d.ts +2 -2
  327. package/esm/ui/menuLabels.js +2 -2
  328. package/esm/ui/multiTrackMenuItems.d.ts +2 -2
  329. package/esm/ui/palette.d.ts +2 -2
  330. package/esm/ui/palette.js +10 -10
  331. package/esm/ui/radioSubMenu.d.ts +5 -3
  332. package/esm/ui/radioSubMenu.js +2 -2
  333. package/esm/ui/rampKey.d.ts +15 -0
  334. package/esm/ui/rampKey.js +17 -0
  335. package/esm/ui/showSubMenu.d.ts +0 -5
  336. package/esm/ui/showSubMenu.js +6 -15
  337. package/esm/ui/theme.d.ts +2 -2
  338. package/esm/ui/theme.js +1 -1
  339. package/esm/ui/useAssemblySelection.d.ts +2 -0
  340. package/esm/ui/useMouseTracking.d.ts +8 -20
  341. package/esm/ui/useMouseTracking.js +23 -62
  342. package/esm/ui/usePlacedMenuFocus.d.ts +19 -0
  343. package/esm/ui/usePlacedMenuFocus.js +28 -0
  344. package/esm/util/Base1DViewModel.d.ts +5 -3
  345. package/esm/util/Base1DViewModel.js +5 -3
  346. package/esm/util/SvgCanvas.js +1 -1
  347. package/esm/util/aggregateFieldName.d.ts +1 -10
  348. package/esm/util/aggregateFieldName.js +1 -8
  349. package/esm/util/alignedBytes.d.ts +19 -0
  350. package/esm/util/alignedBytes.js +37 -0
  351. package/esm/util/analytics.d.ts +6 -9
  352. package/esm/util/analytics.js +148 -15
  353. package/esm/util/bezierConnector.d.ts +20 -0
  354. package/esm/util/bezierConnector.js +34 -96
  355. package/esm/util/cacheBudgets.d.ts +3 -0
  356. package/esm/util/cacheBudgets.js +3 -0
  357. package/esm/util/categoricalField.d.ts +24 -4
  358. package/esm/util/categoricalField.js +38 -5
  359. package/esm/util/cellMatches.js +14 -14
  360. package/esm/util/cellsStep.d.ts +3 -5
  361. package/esm/util/cellsStep.js +31 -29
  362. package/esm/util/color/index.d.ts +1 -1
  363. package/esm/util/color/index.js +2 -2
  364. package/esm/util/color-bits/bit.js +1 -1
  365. package/esm/util/color-bits/parse.js +28 -17
  366. package/esm/util/colorBits.d.ts +15 -4
  367. package/esm/util/colorBits.js +38 -15
  368. package/esm/util/colorRamp.d.ts +3 -3
  369. package/esm/util/colorRamp.js +20 -2
  370. package/esm/util/colorScale.d.ts +123 -22
  371. package/esm/util/colorScale.js +157 -28
  372. package/esm/util/colorSchemes.d.ts +7 -3
  373. package/esm/util/colorSchemes.js +8 -2
  374. package/esm/util/createSvgRasterCanvas.d.ts +14 -1
  375. package/esm/util/createSvgRasterCanvas.js +36 -12
  376. package/esm/util/diagonalizeRegions.js +18 -9
  377. package/esm/util/featureTransforms.d.ts +2 -2
  378. package/esm/util/featureTransforms.js +85 -135
  379. package/esm/util/fileHandleStore.js +5 -0
  380. package/esm/util/groupKeys.d.ts +5 -4
  381. package/esm/util/groupKeys.js +15 -9
  382. package/esm/util/index.js +1 -1
  383. package/esm/util/installFetch.d.ts +2 -2
  384. package/esm/util/installPrerequisiteFetch.d.ts +8 -3
  385. package/esm/util/installPrerequisiteFetch.js +9 -7
  386. package/esm/util/io/RemoteFileWithRangeCache.d.ts +1 -1
  387. package/esm/util/io/RemoteFileWithRangeCache.js +1 -1
  388. package/esm/util/isoformRank.d.ts +39 -0
  389. package/esm/util/isoformRank.js +118 -0
  390. package/esm/util/jexl.js +1 -1
  391. package/esm/util/layouts/GranularRectLayout.d.ts +19 -3
  392. package/esm/util/layouts/GranularRectLayout.js +57 -34
  393. package/esm/util/leadingEdgeAutorun.d.ts +9 -1
  394. package/esm/util/leadingEdgeAutorun.js +5 -2
  395. package/esm/util/markEncoding.d.ts +10 -8
  396. package/esm/util/markEncoding.js +50 -12
  397. package/esm/util/markEncodingTypes.d.ts +77 -21
  398. package/esm/util/originCut.d.ts +14 -0
  399. package/esm/util/originCut.js +19 -0
  400. package/esm/util/paintLayer.d.ts +1 -1
  401. package/esm/util/paintLayer.js +4 -3
  402. package/esm/util/pathSeries.d.ts +18 -0
  403. package/esm/util/pathSeries.js +143 -0
  404. package/esm/util/pressOwner.d.ts +20 -0
  405. package/esm/util/pressOwner.js +26 -0
  406. package/esm/util/quantileExtent.d.ts +23 -1
  407. package/esm/util/quantileExtent.js +25 -2
  408. package/esm/util/rowStackGeometry.d.ts +1 -1
  409. package/esm/util/rowStackGeometry.js +1 -1
  410. package/esm/util/sessionActivity.d.ts +36 -0
  411. package/esm/util/sessionActivity.js +88 -0
  412. package/esm/util/stepOutputs.d.ts +165 -0
  413. package/esm/util/stepOutputs.js +201 -0
  414. package/esm/util/stepTables.d.ts +7 -3
  415. package/esm/util/stepTables.js +86 -3
  416. package/esm/util/systemColorScheme.d.ts +4 -0
  417. package/esm/util/systemColorScheme.js +21 -0
  418. package/esm/util/tabix.d.ts +1 -1
  419. package/esm/util/tabix.js +1 -1
  420. package/esm/util/temporaryAssembly.d.ts +2 -2
  421. package/esm/util/temporaryAssembly.js +2 -3
  422. package/esm/util/thresholdScale.d.ts +1 -1
  423. package/esm/util/thresholdScale.js +1 -1
  424. package/esm/util/trackConfigDelta.d.ts +1 -1
  425. package/esm/util/tracks.d.ts +25 -15
  426. package/esm/util/tracks.js +68 -44
  427. package/esm/util/types/index.d.ts +15 -7
  428. package/esm/util/types/index.js +21 -2
  429. package/esm/util/usePanZoom.js +4 -10
  430. package/esm/util/useRowVirtualScroll.d.ts +1 -0
  431. package/esm/util/windowStep.d.ts +6 -0
  432. package/esm/util/windowStep.js +153 -0
  433. package/package.json +27 -16
  434. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +0 -40
  435. package/esm/data_adapters/BaseAdapter/featureDensity.js +0 -31
  436. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +0 -11
  437. package/esm/rpc/methods/CoreGetFeatureDensity.js +0 -22
  438. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +0 -13
  439. package/esm/rpc/methods/CoreLoadAdapterCode.js +0 -16
@@ -24,15 +24,21 @@ function readsReference(pluginManager, adapterConfig) {
24
24
  }
25
25
  // Pruned by storeWithEvict (rejections) and by freeAdapterResources, which the
26
26
  // CoreFreeResources RPC reaches when the last track holding an adapter config is
27
- // closed (releaseAdapterSession). There is still no size bound: an adapter
28
- // whose track stays open lives as long as its worker, by design.
29
- let adapterCache = {};
27
+ // closed (releaseAdapterSession). The browser sets no size bound: an adapter
28
+ // whose track stays open lives as long as its worker, by design. A host with no
29
+ // tracks to close bounds it with keepAdapters. Ordered least recently
30
+ // requested first.
31
+ let adapterCache = new Map();
32
+ let requests = 0;
33
+ const lastRequests = new WeakMap();
30
34
  /** stores a promise in the cache and auto-evicts if it rejects */
31
35
  function storeWithEvict(key, p) {
32
36
  p.catch(() => {
33
- delete adapterCache[key];
37
+ if (adapterCache.get(key) === p) {
38
+ adapterCache.delete(key);
39
+ }
34
40
  });
35
- adapterCache[key] = p;
41
+ adapterCache.set(key, p);
36
42
  return p;
37
43
  }
38
44
  async function getAdapterPre(pluginManager, sessionId, adapterConfigSnapshot, keyedSequence) {
@@ -65,8 +71,13 @@ function getOrCreateEntry(pluginManager, sessionId, adapterConfigSnapshot, seque
65
71
  const cacheKey = keyedSequence
66
72
  ? `${configKey}|${adapterConfigCacheKey(keyedSequence)}`
67
73
  : configKey;
68
- return (adapterCache[cacheKey] ??
69
- storeWithEvict(cacheKey, getAdapterPre(pluginManager, sessionId, adapterConfigSnapshot, keyedSequence)));
74
+ const cached = adapterCache.get(cacheKey);
75
+ if (cached) {
76
+ adapterCache.delete(cacheKey);
77
+ adapterCache.set(cacheKey, cached);
78
+ return cached;
79
+ }
80
+ return storeWithEvict(cacheKey, getAdapterPre(pluginManager, sessionId, adapterConfigSnapshot, keyedSequence));
70
81
  }
71
82
  /**
72
83
  * instantiate a data adapter, or return a cached one with the same config.
@@ -77,6 +88,7 @@ function getOrCreateEntry(pluginManager, sessionId, adapterConfigSnapshot, seque
77
88
  export async function getAdapter(pluginManager, sessionId, adapterConfigSnapshot, sequenceAdapter) {
78
89
  const ret = await getOrCreateEntry(pluginManager, sessionId, adapterConfigSnapshot, sequenceAdapter);
79
90
  ret.sessionIds.add(sessionId);
91
+ lastRequests.set(ret, ++requests);
80
92
  return ret;
81
93
  }
82
94
  /**
@@ -84,20 +96,19 @@ export async function getAdapter(pluginManager, sessionId, adapterConfigSnapshot
84
96
  * other session still claims. Reached from the CoreFreeResources RPC when the
85
97
  * last track using an adapter config closes.
86
98
  *
87
- * Deleting the key is the whole reclamation: the cache is the only strong
88
- * reference to an adapter, so once it goes the instance and everything it holds
89
- * — a whole parsed GFF3, a BAM chunk cache — become unreachable and are
90
- * collected normally. There is nothing to free by hand.
99
+ * Deleting the key makes the instance unreachable from here, and for most
100
+ * adapters that is the whole reclamation: a parsed GFF3 goes with it.
91
101
  *
92
- * "Collected normally" is not the same as "collected now", and for the indexed
93
- * adapters it is not even soon. @gmod/bam, @gmod/cram and @gmod/tabix each hold
94
- * their parsed chunks in a SharedReadCache that sweeps itself on a setInterval,
95
- * and a pending timer is a GC root — so the instance stays reachable through its
96
- * own sweep timer until that sweep empties the cache and stops itself, three
97
- * minutes later. Measured: closing a panned alignments track reclaims nothing at
98
- * the time it happens, and the worker falls from 296 MB to 7 MB four minutes on.
99
- * Deleting the key is still the only thing to do here; just don't read a heap
100
- * immediately after a close and conclude this did nothing.
102
+ * The indexed adapters are the exception, which is why an evicted adapter is
103
+ * also told so (`freeResources`). @gmod/bam, @gmod/cram and @gmod/tabix each
104
+ * hold their parsed chunks in a SharedReadCache charged to the shared budget,
105
+ * and the budget credits a dropped cache back only once the collector has
106
+ * taken it. A run that opens and closes a track per image has no GC to wait
107
+ * for. `jb2export batch` drew a callset from CRAM slices of long reads at
108
+ * about a record every two seconds, and before @gmod/shared-read-cache 2.1 two
109
+ * of its four processes reached the 4 GB heap limit 135 s in, with the budget
110
+ * at 3,100 MB against its 1,024 MB limit: the budget left each of 54 caches
111
+ * its last entry. 2.1 keeps one entry per budget instead.
101
112
  *
102
113
  * The refcount is what makes this safe to call on any track close: an adapter
103
114
  * pulled in as a sub-adapter carries its parent's sessionId (getSubAdapter
@@ -109,20 +120,53 @@ export async function freeAdapterResources(args) {
109
120
  if (!sessionId) {
110
121
  return;
111
122
  }
112
- for (const [cacheKey, cacheEntryP] of Object.entries(adapterCache)) {
123
+ for (const [cacheKey, cacheEntryP] of [...adapterCache]) {
113
124
  try {
114
125
  const cacheEntry = await cacheEntryP;
115
126
  cacheEntry.sessionIds.delete(sessionId);
116
127
  if (cacheEntry.sessionIds.size === 0) {
117
- delete adapterCache[cacheKey];
128
+ evict(cacheKey, cacheEntryP);
129
+ cacheEntry.dataAdapter.freeResources();
118
130
  }
119
131
  }
120
132
  catch (e) {
121
133
  console.error(`dataAdapterCache: evicting failed adapter "${cacheKey}"`, e);
122
- delete adapterCache[cacheKey];
134
+ evict(cacheKey, cacheEntryP);
123
135
  }
124
136
  }
125
137
  }
138
+ function evict(cacheKey, entry) {
139
+ if (adapterCache.get(cacheKey) === entry) {
140
+ adapterCache.delete(cacheKey);
141
+ }
142
+ }
143
+ /** How many adapter requests the cache has answered. */
144
+ export function adapterRequests() {
145
+ return requests;
146
+ }
147
+ /**
148
+ * Evict every cached adapter `keep` declines, each told to free what it holds,
149
+ * whatever sessions claim it. `keep` sees the settled adapters most recently
150
+ * requested first, each with the {@link adapterRequests} count at its latest
151
+ * request. For a host with no tracks to close, such as `@jbrowse/tables`,
152
+ * which would otherwise keep an adapter, its parsed index and its share of the
153
+ * decoded-bytes budget for every file it ever read.
154
+ */
155
+ export async function keepAdapters(keep) {
156
+ const cached = [...adapterCache].reverse();
157
+ const settled = await Promise.all(cached.map(([, entry]) => entry.catch(() => undefined)));
158
+ cached.forEach(([cacheKey, entry], i) => {
159
+ const adapter = settled[i];
160
+ if (adapter && !keep(adapter.dataAdapter, lastRequests.get(adapter) ?? 0)) {
161
+ evict(cacheKey, entry);
162
+ adapter.dataAdapter.freeResources();
163
+ }
164
+ });
165
+ }
166
+ /** How many adapters the cache holds, failed and pending ones included. */
167
+ export function cachedAdapterCount() {
168
+ return adapterCache.size;
169
+ }
126
170
  export function clearAdapterCache() {
127
- adapterCache = {};
171
+ adapterCache = new Map();
128
172
  }
@@ -22,3 +22,12 @@ export declare function getFeatureAdapter({ pluginManager, sessionId, adapterCon
22
22
  * undefined, so callers get a definite type and no cast.
23
23
  */
24
24
  export declare function getFeatureAdapterOrThrow(args: GetFeatureAdapterArgs): Promise<BaseFeatureDataAdapter>;
25
+ /**
26
+ * The cached adapter a `@jbrowse/tables` read uses, which every tables
27
+ * lookup goes through. A `READS_REFERENCE` adapter is keyed on its
28
+ * config and `sequenceAdapter`, so a lookup without the one the read uses
29
+ * builds a second instance with its own index.
30
+ */
31
+ export declare function tablesAdapter(pluginManager: PluginManager, adapterConfig: Record<string, unknown>, sequenceAdapter: Record<string, unknown> | undefined): Promise<import("./BaseAdapter/util.ts").AnyDataAdapter>;
32
+ /** {@link tablesAdapter}, refusing an adapter that serves no features. */
33
+ export declare function tablesFeatureAdapter(pluginManager: PluginManager, adapterConfig: Record<string, unknown>, sequenceAdapter: Record<string, unknown> | undefined): Promise<BaseFeatureDataAdapter<import("../configuration/types.ts").AnyConfigurationModel> | BaseFeatureDataAdapter<import("../configuration/types.ts").AnyConfigurationModel> | import("./BaseAdapter/BaseSequenceAdapter.ts").BaseSequenceAdapter<import("../configuration/types.ts").AnyConfigurationModel>>;
@@ -25,3 +25,20 @@ export async function getFeatureAdapterOrThrow(args) {
25
25
  }
26
26
  return dataAdapter;
27
27
  }
28
+ /**
29
+ * The cached adapter a `@jbrowse/tables` read uses, which every tables
30
+ * lookup goes through. A `READS_REFERENCE` adapter is keyed on its
31
+ * config and `sequenceAdapter`, so a lookup without the one the read uses
32
+ * builds a second instance with its own index.
33
+ */
34
+ export async function tablesAdapter(pluginManager, adapterConfig, sequenceAdapter) {
35
+ return (await getAdapter(pluginManager, 'tables', adapterConfig, sequenceAdapter)).dataAdapter;
36
+ }
37
+ /** {@link tablesAdapter}, refusing an adapter that serves no features. */
38
+ export async function tablesFeatureAdapter(pluginManager, adapterConfig, sequenceAdapter) {
39
+ const adapter = await tablesAdapter(pluginManager, adapterConfig, sequenceAdapter);
40
+ if (!isFeatureAdapter(adapter)) {
41
+ throw new Error(`adapter "${adapterConfig.type}" is not a feature adapter`);
42
+ }
43
+ return adapter;
44
+ }
@@ -53,6 +53,12 @@ export default class DisplayType extends LazyStateModelElement {
53
53
  * not given one.
54
54
  */
55
55
  adapterCapabilities: readonly string[];
56
+ /**
57
+ * The RPC methods this display's first fetch calls. A track launching with
58
+ * it loads their code in its worker beside the adapter's
59
+ * (`RpcMethodType.preload`).
60
+ */
61
+ rpcMethods: readonly string[];
56
62
  retiredTypes: readonly RetiredDisplayType[];
57
63
  retiredState?: RetiredDisplayState;
58
64
  /**
@@ -70,6 +76,7 @@ export default class DisplayType extends LazyStateModelElement {
70
76
  ReactComponent: AnyReactComponentType;
71
77
  helpText?: string;
72
78
  adapterCapabilities?: readonly string[];
79
+ rpcMethods?: readonly string[];
73
80
  retiredTypes?: readonly RetiredDisplayType[];
74
81
  retiredState?: RetiredDisplayState;
75
82
  plotExamples?: readonly PlotExample[];
@@ -24,6 +24,12 @@ export default class DisplayType extends LazyStateModelElement {
24
24
  * not given one.
25
25
  */
26
26
  adapterCapabilities;
27
+ /**
28
+ * The RPC methods this display's first fetch calls. A track launching with
29
+ * it loads their code in its worker beside the adapter's
30
+ * (`RpcMethodType.preload`).
31
+ */
32
+ rpcMethods;
27
33
  retiredTypes;
28
34
  retiredState;
29
35
  /**
@@ -42,6 +48,7 @@ export default class DisplayType extends LazyStateModelElement {
42
48
  this.viewType = stuff.viewType;
43
49
  this.helpText = stuff.helpText;
44
50
  this.adapterCapabilities = stuff.adapterCapabilities ?? [];
51
+ this.rpcMethods = stuff.rpcMethods ?? [];
45
52
  this.retiredTypes = stuff.retiredTypes ?? [];
46
53
  this.retiredState = stuff.retiredState;
47
54
  this.plotExamples = stuff.plotExamples ?? [];
@@ -70,6 +70,13 @@ export default abstract class RpcMethodType<MethodName extends string = string>
70
70
  name: MethodName;
71
71
  pluginManager: PluginManager;
72
72
  constructor(pluginManager: PluginManager);
73
+ /**
74
+ * Start loading the code `execute` runs, for a method whose body is a dynamic
75
+ * import. A display that names the method in `rpcMethods` has its worker call
76
+ * this when its track launches, so the import lands beside the adapter's code
77
+ * instead of after the first request's refName lookup.
78
+ */
79
+ preload(): Promise<unknown>;
73
80
  serializeArguments(args: object): Promise<Record<string, unknown>>;
74
81
  /**
75
82
  * The reference sequence of the genome a call names in `assemblyName`, as a
@@ -167,6 +167,15 @@ export default class RpcMethodType extends PluggableElementBase {
167
167
  super();
168
168
  this.pluginManager = pluginManager;
169
169
  }
170
+ /**
171
+ * Start loading the code `execute` runs, for a method whose body is a dynamic
172
+ * import. A display that names the method in `rpcMethods` has its worker call
173
+ * this when its track launches, so the import lands beside the adapter's code
174
+ * instead of after the first request's refName lookup.
175
+ */
176
+ async preload() {
177
+ return undefined;
178
+ }
170
179
  async serializeArguments(args) {
171
180
  const augmented = await this.augmentLocationObjects(this.attachReference(args));
172
181
  return {
@@ -71,7 +71,8 @@ export declare function addViewMenuItems<N extends ViewTypeName, K extends MenuM
71
71
  * Add items to a menu on a display type belonging to another plugin, e.g. an
72
72
  * "open this read in a dotplot" entry on the alignments display's context menu.
73
73
  * See {@link addViewMenuItems}; the name is checked against
74
- * `DisplayTypeRegistry`.
74
+ * `DisplayTypeRegistry`. It matches the registered name only, so an item added
75
+ * to `LinearMarkDisplay` misses `LinearManhattanDisplay`, which subtypes it.
75
76
  *
76
77
  * ```ts
77
78
  * addDisplayMenuItems(pluginManager, 'LinearAlignmentsDisplay', {
@@ -63,7 +63,8 @@ export function addViewMenuItems(pluginManager, name, options) {
63
63
  * Add items to a menu on a display type belonging to another plugin, e.g. an
64
64
  * "open this read in a dotplot" entry on the alignments display's context menu.
65
65
  * See {@link addViewMenuItems}; the name is checked against
66
- * `DisplayTypeRegistry`.
66
+ * `DisplayTypeRegistry`. It matches the registered name only, so an item added
67
+ * to `LinearMarkDisplay` misses `LinearManhattanDisplay`, which subtypes it.
67
68
  *
68
69
  * ```ts
69
70
  * addDisplayMenuItems(pluginManager, 'LinearAlignmentsDisplay', {
@@ -3,6 +3,8 @@ import type { AnyConfigurationModel } from '../../configuration/index.ts';
3
3
  type TrackConf = AnyConfigurationModel | Record<string, unknown>;
4
4
  /**
5
5
  * #stateModel BaseConnectionModel
6
+ * Holds the tracks a connection has loaded. Each connection type overrides
7
+ * `connect` to fetch them from its source.
6
8
  */
7
9
  declare function stateModelFactory(pluginManager: PluginManager): import("@jbrowse/mobx-state-tree").IModelType<{
8
10
  /**
@@ -3,6 +3,8 @@ import { ConfigurationReference, readConfObject, } from '../../configuration/ind
3
3
  import configSchema from './baseConnectionConfig.js';
4
4
  /**
5
5
  * #stateModel BaseConnectionModel
6
+ * Holds the tracks a connection has loaded. Each connection type overrides
7
+ * `connect` to fetch them from its source.
6
8
  */
7
9
  function stateModelFactory(pluginManager) {
8
10
  return types
@@ -655,6 +655,21 @@ export declare const BaseDisplay: import("@jbrowse/mobx-state-tree").IModelType<
655
655
  * #method
656
656
  */
657
657
  trackMenuItems(): MenuItem[];
658
+ /**
659
+ * #method
660
+ * What a config says that cannot be drawn as written: by default the
661
+ * schema's rules over its color objects and `scales.y`, the ones
662
+ * `jbrowse validate` runs. A display with rules of its own overrides it.
663
+ * `plotProblems` asks it of a draft and `notices` of the live config,
664
+ * so Edit plot and the corner never disagree.
665
+ */
666
+ configProblemsOf(conf: AnyConfigurationModel): string[];
667
+ /**
668
+ * #getter
669
+ * What the loaded data says beside the config, such as a field no
670
+ * fetched feature carries. None unless a display overrides it.
671
+ */
672
+ readonly liveNotices: string[];
658
673
  } & {
659
674
  /**
660
675
  * #action
@@ -689,9 +704,11 @@ export declare const BaseDisplay: import("@jbrowse/mobx-state-tree").IModelType<
689
704
  * were applied. Each key runs through the display config schema's
690
705
  * `preProcessSnapshot` (shorthand expansions and legacy-key migrations,
691
706
  * as `showTrackGeneric` applies to a session spec's inline track keys),
692
- * then writes the matching config slot. A key naming a sub-schema
693
- * (`facet`, `color`) replaces the whole object, its string shorthand
694
- * lifted by that schema, and `null` clears it. Keys that are not slots
707
+ * then writes the matching config slot. A key naming a channel (`facet`,
708
+ * `color`, `rows`, any object with a one-value shorthand) replaces the
709
+ * whole object, its string shorthand lifted by that schema, and `null`
710
+ * clears it; `scales` names members inside it and leaves the rest. Keys
711
+ * that are not slots
695
712
  * come back in `unapplied` as `{ key, reason }`, so a caller can tell a
696
713
  * misspelling from a key that has an action instead of a slot.
697
714
  *
@@ -738,6 +755,24 @@ export declare const BaseDisplay: import("@jbrowse/mobx-state-tree").IModelType<
738
755
  * checks it with `plotProblems` and hands it to `applyPlot`.
739
756
  */
740
757
  readonly plot: Plot;
758
+ /**
759
+ * #getter
760
+ * `configProblemsOf` the live config.
761
+ */
762
+ readonly configNotices: string[];
763
+ /**
764
+ * #getter
765
+ * Every line the display has to say about what it cannot draw as
766
+ * written, as an agent's settle report reads them: `configNotices`,
767
+ * then `liveNotices`.
768
+ */
769
+ readonly notices: string[];
770
+ /**
771
+ * #getter
772
+ * The lines the display chrome's corner chip lists: `notices`, less any
773
+ * a display shows in a chip of its own.
774
+ */
775
+ readonly cornerNotices: string[];
741
776
  /**
742
777
  * #getter
743
778
  * The worked examples this display type declares, which "Edit plot..."
@@ -759,8 +794,8 @@ export declare const BaseDisplay: import("@jbrowse/mobx-state-tree").IModelType<
759
794
  /**
760
795
  * #method
761
796
  * What a draft would report once applied, throwing a refusal as
762
- * `liftPlot` does. A display with a rule list over its settings
763
- * overrides it; the draft still applies, and draws what it can.
797
+ * `liftPlot` does: `configProblemsOf` the lifted draft. The draft still
798
+ * applies, and draws what it can.
764
799
  */
765
800
  plotProblems(draft: Plot): string[];
766
801
  /**
@@ -1,12 +1,15 @@
1
1
  import { hasParent, isAlive, types } from '@jbrowse/mobx-state-tree';
2
2
  import { applyConfSettings, getConfigurationSchemaMetadata, getConf, setConf, } from '../../configuration/index.js';
3
- import { liftPlot as liftPlotDraft, plotKeysOf, plotOf, plotWrites as plotWritesOf, } from '../../configuration/plot.js';
3
+ import { liftPlot as liftPlotDraft, plotKeysOf, plotOf, plotWrites as plotWritesOf, schemaPlotProblems, } from '../../configuration/plot.js';
4
4
  import { getContainingTrack, getEnv, statusFraction, statusMessageText, } from '../../util/index.js';
5
5
  import { ElementId } from '../../util/types/mst.js';
6
6
  import { displaySetterName } from '../../util/unknownSnapshotKeys.js';
7
7
  /**
8
8
  * #stateModel BaseDisplay
9
9
  * #category display
10
+ * Holds a display's parent track, the adapter config read from that track, its
11
+ * load status and error, and the component that draws it. Every display
12
+ * composes this model.
10
13
  */
11
14
  function stateModelFactory() {
12
15
  return types
@@ -77,7 +80,7 @@ function stateModelFactory() {
77
80
  // This is a snapshot, so read a specific slot with an array path off the
78
81
  // live node (`getConf(track, ['adapter', 'x'])`) rather than off this —
79
82
  // `types.stripDefault` omits a slot at its default. See
80
- // ../../configuration/CLAUDE.md.
83
+ // agent-docs/reference/CONFIG_PATTERN.md.
81
84
  return getConf(self.parentTrack, 'adapter');
82
85
  },
83
86
  /**
@@ -175,6 +178,25 @@ function stateModelFactory() {
175
178
  trackMenuItems() {
176
179
  return [];
177
180
  },
181
+ /**
182
+ * #method
183
+ * What a config says that cannot be drawn as written: by default the
184
+ * schema's rules over its color objects and `scales.y`, the ones
185
+ * `jbrowse validate` runs. A display with rules of its own overrides it.
186
+ * `plotProblems` asks it of a draft and `notices` of the live config,
187
+ * so Edit plot and the corner never disagree.
188
+ */
189
+ configProblemsOf(conf) {
190
+ return schemaPlotProblems(conf);
191
+ },
192
+ /**
193
+ * #getter
194
+ * What the loaded data says beside the config, such as a field no
195
+ * fetched feature carries. None unless a display overrides it.
196
+ */
197
+ get liveNotices() {
198
+ return [];
199
+ },
178
200
  }))
179
201
  .actions(self => ({
180
202
  /**
@@ -217,9 +239,11 @@ function stateModelFactory() {
217
239
  * were applied. Each key runs through the display config schema's
218
240
  * `preProcessSnapshot` (shorthand expansions and legacy-key migrations,
219
241
  * as `showTrackGeneric` applies to a session spec's inline track keys),
220
- * then writes the matching config slot. A key naming a sub-schema
221
- * (`facet`, `color`) replaces the whole object, its string shorthand
222
- * lifted by that schema, and `null` clears it. Keys that are not slots
242
+ * then writes the matching config slot. A key naming a channel (`facet`,
243
+ * `color`, `rows`, any object with a one-value shorthand) replaces the
244
+ * whole object, its string shorthand lifted by that schema, and `null`
245
+ * clears it; `scales` names members inside it and leaves the rest. Keys
246
+ * that are not slots
223
247
  * come back in `unapplied` as `{ key, reason }`, so a caller can tell a
224
248
  * misspelling from a key that has an action instead of a slot.
225
249
  *
@@ -293,6 +317,31 @@ function stateModelFactory() {
293
317
  get plot() {
294
318
  return plotOf(self.configuration);
295
319
  },
320
+ /**
321
+ * #getter
322
+ * `configProblemsOf` the live config.
323
+ */
324
+ get configNotices() {
325
+ return self.configProblemsOf(self.configuration);
326
+ },
327
+ /**
328
+ * #getter
329
+ * Every line the display has to say about what it cannot draw as
330
+ * written, as an agent's settle report reads them: `configNotices`,
331
+ * then `liveNotices`.
332
+ */
333
+ get notices() {
334
+ const { configNotices } = self;
335
+ return [...configNotices, ...self.liveNotices];
336
+ },
337
+ /**
338
+ * #getter
339
+ * The lines the display chrome's corner chip lists: `notices`, less any
340
+ * a display shows in a chip of its own.
341
+ */
342
+ get cornerNotices() {
343
+ return self.notices;
344
+ },
296
345
  /**
297
346
  * #getter
298
347
  * The worked examples this display type declares, which "Edit plot..."
@@ -324,12 +373,11 @@ function stateModelFactory() {
324
373
  /**
325
374
  * #method
326
375
  * What a draft would report once applied, throwing a refusal as
327
- * `liftPlot` does. A display with a rule list over its settings
328
- * overrides it; the draft still applies, and draws what it can.
376
+ * `liftPlot` does: `configProblemsOf` the lifted draft. The draft still
377
+ * applies, and draws what it can.
329
378
  */
330
379
  plotProblems(draft) {
331
- this.liftPlot(draft);
332
- return [];
380
+ return self.configProblemsOf(liftPlotDraft(self.configuration, draft));
333
381
  },
334
382
  /**
335
383
  * #method
@@ -9,9 +9,9 @@ import type { IType, Instance } from '@jbrowse/mobx-state-tree';
9
9
  * #stateModel BaseTrackModel
10
10
  * #category track
11
11
  *
12
- * these MST models only exist for tracks that are *shown*. they should contain
13
- * only UI state for the track, and have a reference to a track configuration.
14
- * note that multiple displayed tracks could use the same configuration.
12
+ * Holds the UI state of a track that is *shown* in a view, with a reference to
13
+ * its track configuration and the displays drawing it. Only shown tracks have
14
+ * this model, and several shown tracks can use the same configuration.
15
15
  */
16
16
  export declare function createBaseTrackModel(pm: PluginManager, trackType: string, baseTrackConfig: AnyConfigurationSchemaType): import("@jbrowse/mobx-state-tree").IModelType<{
17
17
  /**
@@ -200,10 +200,8 @@ export declare function createBaseTrackModel(pm: PluginManager, trackType: strin
200
200
  * completely untouched ones — `reaction` only fires on an actual change.
201
201
  *
202
202
  * `equals: compareStructural` is load-bearing, not an optimization:
203
- * `self.configuration` is a re-resolving reference, and persisting a save
204
- * can swap the resolved node identity (the delta path reconciles in place
205
- * but still churns once, and a session without deltas replaces the frozen
206
- * `jbrowse.tracks` entry, rehydrating a brand-new MST node every write).
203
+ * `self.configuration` is a re-resolving reference, and an undo or a
204
+ * session restore swaps the resolved node for a new working copy.
207
205
  * Referential comparison would treat every such swap as a fresh change
208
206
  * and re-fire the save, an unbounded debounced loop. Structural
209
207
  * comparison settles once the content stops changing.
@@ -6,6 +6,7 @@ import { ConfigurationReference, getConf } from '../../configuration/index.js';
6
6
  import { releaseAdapterSession, retainAdapterSession, } from '../../data_adapters/adapterSessionRefcount.js';
7
7
  import { adapterConfigCacheKey } from '../../data_adapters/dataAdapterCache.js';
8
8
  import { adapterByteLimit } from '../../rpc/byteBudget.js';
9
+ import { TRACK_MENU_PRIORITY } from '../../ui/MenuTypes.js';
9
10
  import { getContainingView, getDialogHost, getEnv, getSession, } from '../../util/index.js';
10
11
  import { getConfAssemblyNamesOrNone, viewDisplayNames, } from '../../util/tracks.js';
11
12
  import { isSessionModelWithConfigEditing } from '../../util/types/index.js';
@@ -36,9 +37,9 @@ function getDisplayConf(displays, displayId) {
36
37
  * #stateModel BaseTrackModel
37
38
  * #category track
38
39
  *
39
- * these MST models only exist for tracks that are *shown*. they should contain
40
- * only UI state for the track, and have a reference to a track configuration.
41
- * note that multiple displayed tracks could use the same configuration.
40
+ * Holds the UI state of a track that is *shown* in a view, with a reference to
41
+ * its track configuration and the displays drawing it. Only shown tracks have
42
+ * this model, and several shown tracks can use the same configuration.
42
43
  */
43
44
  export function createBaseTrackModel(pm, trackType, baseTrackConfig) {
44
45
  return types
@@ -324,10 +325,8 @@ export function createBaseTrackModel(pm, trackType, baseTrackConfig) {
324
325
  * completely untouched ones — `reaction` only fires on an actual change.
325
326
  *
326
327
  * `equals: compareStructural` is load-bearing, not an optimization:
327
- * `self.configuration` is a re-resolving reference, and persisting a save
328
- * can swap the resolved node identity (the delta path reconciles in place
329
- * but still churns once, and a session without deltas replaces the frozen
330
- * `jbrowse.tracks` entry, rehydrating a brand-new MST node every write).
328
+ * `self.configuration` is a re-resolving reference, and an undo or a
329
+ * session restore swaps the resolved node for a new working copy.
331
330
  * Referential comparison would treat every such swap as a fresh change
332
331
  * and re-fire the save, an unbounded debounced loop. Structural
333
332
  * comparison settles once the content stops changing.
@@ -449,9 +448,9 @@ export function createBaseTrackModel(pm, trackType, baseTrackConfig) {
449
448
  */
450
449
  get saveTrackDataMenuItem() {
451
450
  return {
452
- label: 'Save track data',
451
+ label: 'Save track data...',
453
452
  icon: Save,
454
- priority: 998,
453
+ priority: TRACK_MENU_PRIORITY.saveTrackData,
455
454
  onClick: () => {
456
455
  getDialogHost(self).queueDialog(handleClose => [
457
456
  SaveTrackDataDlg,
@@ -477,7 +476,7 @@ export function createBaseTrackModel(pm, trackType, baseTrackConfig) {
477
476
  {
478
477
  type: 'subMenu',
479
478
  label: 'Display types',
480
- priority: -1000,
479
+ priority: TRACK_MENU_PRIORITY.displayTypes,
481
480
  subMenu: compatDisp.map(d => {
482
481
  const displayType = pm.getDisplayType(d.type);
483
482
  return {
@@ -4,6 +4,8 @@ import type { Instance } from '@jbrowse/mobx-state-tree';
4
4
  /**
5
5
  * #stateModel BaseViewModel
6
6
  * #category view
7
+ * Holds a view's id, the name shown in its header, its width and whether it is
8
+ * minimized. Every view composes this model.
7
9
  */
8
10
  declare const BaseViewModel: import("@jbrowse/mobx-state-tree").IModelType<{
9
11
  /**
@@ -27,6 +27,8 @@ function bodyInDom(view) {
27
27
  /**
28
28
  * #stateModel BaseViewModel
29
29
  * #category view
30
+ * Holds a view's id, the name shown in its header, its width and whether it is
31
+ * minimized. Every view composes this model.
30
32
  */
31
33
  const BaseViewModel = types
32
34
  .model('BaseView', {
@@ -5,6 +5,9 @@ import type React from 'react';
5
5
  /**
6
6
  * #stateModel BaseInternetAccountModel
7
7
  * #category internetAccount
8
+ * Adds a token header to each request for a file on one of the account's
9
+ * domains, keeping the token in `sessionStorage`. Every internet account type
10
+ * builds on this model.
8
11
  */
9
12
  export declare const InternetAccount: import("@jbrowse/mobx-state-tree").IModelType<{
10
13
  /**
@@ -9,6 +9,9 @@ import { uriMatchesDomains } from './uriMatchesDomains.js';
9
9
  /**
10
10
  * #stateModel BaseInternetAccountModel
11
11
  * #category internetAccount
12
+ * Adds a token header to each request for a file on one of the account's
13
+ * domains, keeping the token in `sessionStorage`. Every internet account type
14
+ * builds on this model.
12
15
  */
13
16
  export const InternetAccount = types
14
17
  .model('InternetAccount', {
@@ -1,6 +1,9 @@
1
1
  import type { Instance } from '@jbrowse/mobx-state-tree';
2
2
  /**
3
3
  * #config BaseConnection
4
+ * Holds a connection's name and the assemblies its tracks belong to. Every
5
+ * connection type has these slots.
6
+ *
4
7
  * #gotcha JBrowse fetches the hub's track list when the connection loads and
5
8
  * holds it in memory, and does **not** write it into a saved or shared session.
6
9
  * The session stores only the tracks you open (under `connectionTrackConfigs`,
@@ -1,6 +1,9 @@
1
1
  import { ConfigurationSchema } from '../../configuration/index.js';
2
2
  /**
3
3
  * #config BaseConnection
4
+ * Holds a connection's name and the assemblies its tracks belong to. Every
5
+ * connection type has these slots.
6
+ *
4
7
  * #gotcha JBrowse fetches the hub's track list when the connection loads and
5
8
  * holds it in memory, and does **not** write it into a saved or shared session.
6
9
  * The session stores only the tracks you open (under `connectionTrackConfigs`,
@@ -1,6 +1,8 @@
1
1
  /**
2
2
  * #config BaseInternetAccount
3
- * the "base" internet account type
3
+ * Holds an internet account's name and description, the domains it handles,
4
+ * and the request header it sends credentials in. Every internet account type
5
+ * has these slots.
4
6
  */
5
7
  export declare const BaseInternetAccountConfig: import("../../configuration/configurationSchema.ts").ConfigurationSchemaType<{
6
8
  readonly name: {