@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,5 +1,4 @@
1
1
  import { getSnapshot, isAlive, isStateTreeNode } from '@jbrowse/mobx-state-tree';
2
- import { getSequenceAdapterConfig } from '../assemblyManager/getSequenceAdapterConfig.js';
3
2
  // Maps a region's refName to the track adapter's name (via refNameMap), and
4
3
  // sets originalRefName to the seq adapter (FASTA) name so that CRAM/BAM
5
4
  // adapters can fetch reference sequence correctly.
@@ -27,9 +26,10 @@ import { getSequenceAdapterConfig } from '../assemblyManager/getSequenceAdapterC
27
26
  // file being read and the ordinary pass is simply right — MAF's annotation
28
27
  // overlay is called that way. Thread a second name only when the two results
29
28
  // cannot be joined by the caller: GWAS LD coloring can't, because the r²-to-
30
- // feature join is per feature and features never cross the boundary, so it
31
- // resolves a second pass in `serializeArguments` and ships `ldRefName`
32
- // (`plugins/gwas/src/ManhattanRPC/GetManhattanData.ts`). That and
29
+ // feature join is per feature and features never cross the boundary, so the
30
+ // display resolves the LD file's name before the RPC and hands it to the
31
+ // adapter in `opts.ld.refName`
32
+ // (`plugins/gwas/src/LinearManhattanDisplay/ldJoinResolver.ts`). That and
33
33
  // `originalRefName` are the only two, and there is no reason to expect a third:
34
34
  // a sub-adapter is normally the same data in another form, named the same way.
35
35
  export function renameRegionIfNeeded(refNameMap, region, getSeqAdapterRefName) {
@@ -57,8 +57,7 @@ function isRegionShaped(r) {
57
57
  'start' in r &&
58
58
  'end' in r);
59
59
  }
60
- export async function renameRegionsIfNeeded(assemblyManager, args) {
61
- const { regions = [], adapterConfig } = args;
60
+ function checkRenameArgs(args) {
62
61
  if (!args.sessionId) {
63
62
  throw new Error('sessionId is required');
64
63
  }
@@ -69,61 +68,76 @@ export async function renameRegionsIfNeeded(assemblyManager, args) {
69
68
  // `chr5`. The legitimate singular base class (RpcMethodTypeWithRenameRegion)
70
69
  // always mirrors `region` into a populated `regions`, so flag only the
71
70
  // un-mirrored case and fail loudly instead of returning wrong data.
72
- if (regions.length === 0 &&
71
+ if (!args.regions?.length &&
73
72
  isRegionShaped(args.region)) {
74
73
  throw new Error('renameRegionsIfNeeded got a singular `region` but no `regions` array; ' +
75
74
  'refName renaming applies only to `regions`. Pass `regions: [region]` ' +
76
75
  '(or extend RpcMethodTypeWithRenameRegion) so the region is renamed.');
77
76
  }
78
- // capture assembly names before the await, since MST regions may be dead after
77
+ }
78
+ // What one assembly contributes to a rename, off the loaded assembly: resolved
79
+ // via requireAssembly (which awaits registration and load) so the refName map
80
+ // and getSeqAdapterRefName come from one handle. A synchronous
81
+ // assemblyManager.get() could miss an assembly still registering, leaving
82
+ // originalRefName (CRAM/BAM's reference fetch name) on the canonical name
83
+ // instead of the FASTA's. Require, not wait: a region names an assembly, so
84
+ // failing to resolve it is renaming that cannot be done, not nothing to rename,
85
+ // and an empty map would query un-renamed refNames and draw an empty track
86
+ // with no word about why. Only an unnamed assembly is a legitimate no-op.
87
+ async function assemblyRenameData(assemblyManager, assemblyName, args) {
88
+ if (!assemblyName) {
89
+ return undefined;
90
+ }
91
+ const assembly = await assemblyManager.requireAssembly(assemblyName);
92
+ return {
93
+ refNameMap: await assembly.getRefNameMapForAdapter(args.adapterConfig, args),
94
+ getSeqAdapterRefName: (r) => assembly.getSeqAdapterRefName(r),
95
+ };
96
+ }
97
+ function renamed(region, data) {
98
+ return renameRegionIfNeeded(data?.refNameMap, region, data?.getSeqAdapterRefName);
99
+ }
100
+ /**
101
+ * Rename for a request about one genome, which is every request but a
102
+ * comparative one. The call's genome is its regions' genome, and renaming
103
+ * writes it as the call's `assemblyName`, the one field a call names its
104
+ * genome in: `RpcMethodType.serializeArguments` turns it into the reference a
105
+ * BAM/CRAM or scan adapter is built with. A region on another assembly is
106
+ * refused: a request over a synteny adapter renames with
107
+ * {@link renameComparativeRegions}.
108
+ */
109
+ export async function renameRegionsIfNeeded(assemblyManager, args) {
110
+ checkRenameArgs(args);
111
+ const { regions = [] } = args;
112
+ // read before the await, since MST regions may be dead after
113
+ const assemblyName = regions[0]?.assemblyName;
114
+ const stray = regions.find(r => r.assemblyName !== assemblyName);
115
+ if (stray) {
116
+ throw new Error(`regions on ${assemblyName} and ${stray.assemblyName} in one request: a request is about one genome, and a comparative request (synteny, dotplot) renames with renameComparativeRegions`);
117
+ }
118
+ const data = await assemblyRenameData(assemblyManager, assemblyName, args);
119
+ return {
120
+ ...args,
121
+ assemblyName,
122
+ regions: regions.map(region => renamed(region, data)),
123
+ };
124
+ }
125
+ /**
126
+ * Rename for a comparative request (synteny, dotplot, chords), whose regions
127
+ * sit on two or more assemblies and are each renamed against their own. Such a
128
+ * request has no genome of its own, so it names none and no reference rides
129
+ * on it; a synteny adapter reads no reference.
130
+ */
131
+ export async function renameComparativeRegions(assemblyManager, args) {
132
+ checkRenameArgs(args);
133
+ const { regions = [] } = args;
79
134
  const assemblyNames = regions.map(r => r.assemblyName);
80
- const uniqueAssemblyNames = [...new Set(assemblyNames)];
81
- // annotated, because Object.fromEntries over an array whose element type is
82
- // not a tuple selects its `any` overload — which left refNameMap and
83
- // getSeqAdapterRefName unchecked all the way to renameRegionIfNeeded
84
- const assemblyData = Object.fromEntries(await Promise.all(uniqueAssemblyNames.map(async (name) => {
85
- // resolve the assembly once via requireAssembly (which awaits both
86
- // registration and load) and derive the refName map AND
87
- // getSeqAdapterRefName from this single loaded handle. A synchronous
88
- // assemblyManager.get() here could miss an assembly still being
89
- // registered, leaving getSeqAdapterRefName undefined so
90
- // originalRefName (used by CRAM/BAM to fetch reference bases) falls
91
- // back to the canonical name instead of the FASTA name.
92
- //
93
- // require, not wait: a region names an assembly, so failing to
94
- // resolve it is not "nothing to rename", it is renaming that cannot
95
- // be done. Substituting an empty map leaves the adapter querying
96
- // un-renamed refNames, which finds nothing and draws an empty track
97
- // with no indication that the assembly is what is missing. Only an
98
- // unnamed assembly is a legitimate no-op.
99
- const assembly = name
100
- ? await assemblyManager.requireAssembly(name)
101
- : undefined;
102
- return [
103
- name,
104
- {
105
- refNameMap: assembly
106
- ? await assembly.getRefNameMapForAdapter(adapterConfig, args)
107
- : {},
108
- getSeqAdapterRefName: assembly
109
- ? (r) => assembly.getSeqAdapterRefName(r)
110
- : undefined,
111
- sequenceAdapter: getSequenceAdapterConfig(assembly),
112
- },
113
- ];
114
- })));
135
+ const data = new Map(await Promise.all([...new Set(assemblyNames)].map(async (name) => [
136
+ name,
137
+ await assemblyRenameData(assemblyManager, name, args),
138
+ ])));
115
139
  return {
116
140
  ...args,
117
- // Supplied here, not by each caller: this is the one place that has already
118
- // resolved the assembly a fetch is against, and it is the same handle
119
- // `originalRefName` is a name into. Every caller that passed its own wrote
120
- // these same two lines, and the three that forgot — `CoreGetExportData`,
121
- // `BreakpointGetFeatures`, `fetchTrackData` — failed silently, saved only by
122
- // whichever call happened to prime the adapter instance first.
123
- sequenceAdapter: assemblyData[assemblyNames[0]]?.sequenceAdapter,
124
- regions: regions.map((region, i) => {
125
- const data = assemblyData[assemblyNames[i]];
126
- return renameRegionIfNeeded(data?.refNameMap, region, data?.getSeqAdapterRefName);
127
- }),
141
+ regions: regions.map((region, i) => renamed(region, data.get(assemblyNames[i]))),
128
142
  };
129
143
  }
@@ -7,6 +7,18 @@ import { createRoot } from 'react-dom/client';
7
7
  // reason to pull react/react-dom/@emotion, and the barrel is imported by
8
8
  // worker-side adapter code that never renders.
9
9
  //
10
+ // It is not part of the plugin ABI either, and that removal did break two
11
+ // published bundles before anyone noticed: react-msaview's SVG export read it
12
+ // off `@jbrowse/core/util`, and jbrowse-plugin-msaview and -tview bundle
13
+ // react-msaview. Resolved on their side -- react-msaview owns its own copy now
14
+ // (packages/lib/src/renderToStaticMarkup.ts there) -- because a rendering
15
+ // library asking its host for a renderer was the coupling worth removing, and
16
+ // because react-dom is a host external for a plugin anyway, so it costs them a
17
+ // few hundred bytes rather than a duplicate react. Re-exporting it from the
18
+ // barrel would also stub `@jbrowse/core/util` in the worker, since the
19
+ // generator stubs a module whose graph reaches react-dom; workerModules.test.ts
20
+ // fails on that.
21
+ //
10
22
  // https://react.dev/reference/react-dom/server/renderToString#removing-rendertostring-from-the-client-code
11
23
  export function renderToStaticMarkup(node) {
12
24
  const div = document.createElement('div');
@@ -15,13 +27,23 @@ export function renderToStaticMarkup(node) {
15
27
  // jbrowse-img) loads @emotion/react before `document` exists, so its default
16
28
  // cache context is null — provide one explicitly here.
17
29
  const cache = createCache({ key: 'css' });
18
- const root = createRoot(div);
30
+ // a client root reports a render error and unmounts, so without this the
31
+ // export is an empty string its caller writes as a file
32
+ const uncaught = [];
33
+ const root = createRoot(div, {
34
+ onUncaughtError: error => {
35
+ uncaught.push(error);
36
+ },
37
+ });
19
38
  let html;
20
39
  try {
21
40
  // eslint-disable-next-line @eslint-react/dom-no-flush-sync
22
41
  flushSync(() => {
23
42
  root.render(React.createElement(CacheProvider, { value: cache }, node));
24
43
  });
44
+ if (uncaught.length > 0) {
45
+ throw uncaught[0];
46
+ }
25
47
  html = div.innerHTML;
26
48
  }
27
49
  finally {
@@ -34,17 +56,5 @@ export function renderToStaticMarkup(node) {
34
56
  // once the markup is a string, which no longer depends on the DOM.
35
57
  root.unmount();
36
58
  }
37
- // SVG 1.1 presentation attributes (`fill`, `stroke`) take a <color>, which
38
- // does not include rgba() — alpha belongs in a separate fill-opacity /
39
- // stroke-opacity. Illustrator and older Inkscape drop an element whose fill
40
- // they cannot parse, so the alpha is stripped rather than left to break the
41
- // whole shape. It is *dropped*, not converted, so a translucent color exports
42
- // fully opaque: components that need transparency to survive set a separate
43
- // opacity attribute instead (`CrossHatches`, `MultiWiggleOverlayLines`).
44
- //
45
- // Rewriting `fill="rgba(r,g,b,a)"` into `fill="rgb(r,g,b)" fill-opacity="a"`
46
- // would preserve the appearance and let those two drop their workarounds, but
47
- // it changes the pixels of every export carrying an rgba color, so it needs a
48
- // visual pass before the snapshots are regenerated.
49
- return html.replaceAll(/\brgba\((.+?),[^,]+?\)/g, 'rgb($1)');
59
+ return html;
50
60
  }
@@ -1,17 +1,32 @@
1
1
  import { Observable } from 'rxjs';
2
- import type { StopToken } from './stopToken.ts';
3
2
  import type { Observer } from 'rxjs';
4
3
  /**
5
4
  * Wrapper for rxjs Observable.create with improved error handling and aborting
6
5
  * support.
7
6
  *
8
- * A `stopToken` errors the subscriber with an abort error the moment the token
9
- * is stopped, rather than waiting for `func` to finish work whose result is
10
- * already discarded. The fetch paths filter abort errors out (`isAbortException`)
11
- * so a cancel does not surface as a track error. It cannot interrupt `func`
12
- * itself — a body doing long synchronous work still needs its own
13
- * `checkStopToken` ticks — but it does stop delivery downstream.
7
+ * A `signal` errors the subscriber with an abort error the moment it aborts,
8
+ * rather than waiting for `func` to finish work whose result is already
9
+ * discarded. The fetch paths filter abort errors out (`isAbortException`) so a
10
+ * cancel does not surface as a track error. It cannot interrupt `func` itself
11
+ * — a body doing long synchronous work still needs its own `checkAbortSignal`
12
+ * ticks — but it does stop delivery downstream.
14
13
  *
15
14
  * @param func - observer function, could be async
16
15
  */
17
- export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, stopToken?: StopToken): Observable<T>;
16
+ export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, signal?: AbortSignal): Observable<T>;
17
+ /**
18
+ * Subscribe to an observable and resolve when it completes, running `onNext` per
19
+ * item as it arrives — the streaming shape for parsing items out of a feature
20
+ * stream rather than collecting them first.
21
+ *
22
+ * **`onNext` throwing rejects the promise.** rxjs does not do that on its own:
23
+ * an exception out of a `next` handler goes to its global unhandled-error hook,
24
+ * so the subscriber keeps being fed and `complete` still fires — a bare promise
25
+ * around that resolves as *success* with the items silently missing. Beside
26
+ * `ObservableCreate` because it is the other half of the pattern: the adapter
27
+ * wraps its body in that, the RPC `await`s this, so a per-item parse failure
28
+ * surfaces as a track error instead of a blank-but-loaded track.
29
+ *
30
+ * The source is unsubscribed on the first throw.
31
+ */
32
+ export declare function subscribeToObservable<T>(observable: Observable<T>, onNext: (item: T) => void): Promise<void>;
package/esm/util/rxjs.js CHANGED
@@ -1,30 +1,28 @@
1
1
  import { Observable } from 'rxjs';
2
- import { stopTokenSignal } from './stopToken.js';
3
2
  /**
4
3
  * Wrapper for rxjs Observable.create with improved error handling and aborting
5
4
  * support.
6
5
  *
7
- * A `stopToken` errors the subscriber with an abort error the moment the token
8
- * is stopped, rather than waiting for `func` to finish work whose result is
9
- * already discarded. The fetch paths filter abort errors out (`isAbortException`)
10
- * so a cancel does not surface as a track error. It cannot interrupt `func`
11
- * itself — a body doing long synchronous work still needs its own
12
- * `checkStopToken` ticks — but it does stop delivery downstream.
6
+ * A `signal` errors the subscriber with an abort error the moment it aborts,
7
+ * rather than waiting for `func` to finish work whose result is already
8
+ * discarded. The fetch paths filter abort errors out (`isAbortException`) so a
9
+ * cancel does not surface as a track error. It cannot interrupt `func` itself
10
+ * — a body doing long synchronous work still needs its own `checkAbortSignal`
11
+ * ticks — but it does stop delivery downstream.
13
12
  *
14
13
  * @param func - observer function, could be async
15
14
  */
16
- export function ObservableCreate(func, stopToken) {
15
+ export function ObservableCreate(func, signal) {
17
16
  return new Observable((observer) => {
18
- const { signal, dispose } = stopTokenSignal(stopToken);
19
17
  const stop = () => {
20
- observer.error(signal.reason);
18
+ observer.error(signal?.reason);
21
19
  };
22
- if (signal.aborted) {
23
- // stopped before subscribe: no 'abort' event is coming
20
+ if (signal?.aborted) {
21
+ // aborted before subscribe: no 'abort' event is coming
24
22
  stop();
25
23
  }
26
24
  else {
27
- signal.addEventListener('abort', stop);
25
+ signal?.addEventListener('abort', stop);
28
26
  try {
29
27
  const ret = func(observer);
30
28
  if (ret?.catch) {
@@ -38,8 +36,56 @@ export function ObservableCreate(func, stopToken) {
38
36
  }
39
37
  }
40
38
  return () => {
41
- signal.removeEventListener('abort', stop);
42
- dispose();
39
+ signal?.removeEventListener('abort', stop);
43
40
  };
44
41
  });
45
42
  }
43
+ /**
44
+ * Subscribe to an observable and resolve when it completes, running `onNext` per
45
+ * item as it arrives — the streaming shape for parsing items out of a feature
46
+ * stream rather than collecting them first.
47
+ *
48
+ * **`onNext` throwing rejects the promise.** rxjs does not do that on its own:
49
+ * an exception out of a `next` handler goes to its global unhandled-error hook,
50
+ * so the subscriber keeps being fed and `complete` still fires — a bare promise
51
+ * around that resolves as *success* with the items silently missing. Beside
52
+ * `ObservableCreate` because it is the other half of the pattern: the adapter
53
+ * wraps its body in that, the RPC `await`s this, so a per-item parse failure
54
+ * surfaces as a track error instead of a blank-but-loaded track.
55
+ *
56
+ * The source is unsubscribed on the first throw.
57
+ */
58
+ export function subscribeToObservable(observable, onNext) {
59
+ return new Promise((resolve, reject) => {
60
+ // A box rather than two bare `let`s: oxlint narrows a flag assigned only
61
+ // inside a closure to its initializer and reports the reads as always-false.
62
+ // `subscription` is genuinely still undefined during a synchronous source's
63
+ // first emissions, which is why it is read optionally below.
64
+ const state = {
65
+ failed: false,
66
+ };
67
+ state.subscription = observable.subscribe({
68
+ next: item => {
69
+ if (!state.failed) {
70
+ try {
71
+ onNext(item);
72
+ }
73
+ catch (e) {
74
+ state.failed = true;
75
+ // A parser throws an Error in every real case here; the wrap is for
76
+ // the rule that a rejection reason must be one, and keeps whatever
77
+ // was actually thrown as the `cause`.
78
+ reject(e instanceof Error ? e : new Error(String(e), { cause: e }));
79
+ state.subscription?.unsubscribe();
80
+ }
81
+ }
82
+ },
83
+ error: reject,
84
+ complete: () => {
85
+ if (!state.failed) {
86
+ resolve();
87
+ }
88
+ },
89
+ });
90
+ });
91
+ }
@@ -0,0 +1,49 @@
1
+ import type PluginManager from '../PluginManager.ts';
2
+ import type { BaseOptions } from '../data_adapters/BaseAdapter/types.ts';
3
+ import type { FileLocation } from './types/data.ts';
4
+ export type SamplesTsvRow = Record<string, string> & {
5
+ name: string;
6
+ };
7
+ export interface SamplesTsvResult {
8
+ sources: SamplesTsvRow[];
9
+ warnings: string[];
10
+ }
11
+ export declare const samplesTsvAdapterConfigSchemaFields: {
12
+ /**
13
+ * #slot
14
+ */
15
+ readonly samplesTsvLocation: {
16
+ readonly type: 'maybeFileLocation';
17
+ readonly description: "optional tab-separated table of per-sample metadata. It needs a header row, and its first column is the sample name exactly as the adapter spells it: a VCF sample, a MultiWiggle subtrack's name, a MAF species id. Every other column (`population`, `tissue`, ...) becomes an attribute of that sample, which the multi-row displays group, sort, color and tooltip rows by; a MAF adapter reads the `label`, `color` and `assemblyName` columns onto its species rows, over its `samples` entries. The table also narrows the adapter's samples to the ones it lists, and a table naming none of them is an error. An adapter that lists no samples of its own (a MAF track discovering its species from the file) takes the table's rows as its samples";
18
+ };
19
+ };
20
+ /**
21
+ * The metadata rows for the samples an adapter names, plus a warning for the
22
+ * samples the table leaves out, which no row is drawn for. Rows naming samples
23
+ * the adapter lacks are dropped silently: one project-wide table serving
24
+ * several tracks is the normal shape. `names` undefined means the adapter lists
25
+ * no samples of its own, so the rows become the set.
26
+ *
27
+ * A table matching none of `names` throws. Falling back to `names` would show
28
+ * every sample when the config asked for a curated subset, and an empty result
29
+ * draws a blank track with no banner. The message quotes both sides of the
30
+ * mismatch, because a prefix is what separates `1000GP_HG00096` from
31
+ * `HG00096`.
32
+ *
33
+ * `fileLabel` names the file in a message; `namesLabel` names where `names`
34
+ * came from ("the VCF").
35
+ */
36
+ export declare function parseSamplesTsv(txt: string, names: readonly string[] | undefined, fileLabel: string, namesLabel: string): SamplesTsvResult;
37
+ /**
38
+ * An adapter's samples merged with its `samplesTsvLocation` table: the bare
39
+ * `names` when the slot is unset, otherwise {@link parseSamplesTsv}'s rows.
40
+ * The warnings come back rather than going to `console.warn`, because this runs
41
+ * in a worker whose console nobody reads.
42
+ */
43
+ export declare function getSamplesTsvSources({ location, names, namesLabel, pluginManager, opts, }: {
44
+ location: FileLocation | undefined;
45
+ names: readonly string[] | undefined;
46
+ namesLabel: string;
47
+ pluginManager?: PluginManager;
48
+ opts?: BaseOptions;
49
+ }): Promise<SamplesTsvResult>;
@@ -0,0 +1,86 @@
1
+ import { fetchAndMaybeUnzipText } from './fetchAndMaybeUnzip.js';
2
+ import { getFileName } from './getFileName.js';
3
+ import { openLocation } from './io/index.js';
4
+ import { shorten2 } from './stringUtils.js';
5
+ export const samplesTsvAdapterConfigSchemaFields = {
6
+ /**
7
+ * #slot
8
+ */
9
+ samplesTsvLocation: {
10
+ type: 'maybeFileLocation',
11
+ description: "optional tab-separated table of per-sample metadata. It needs a header row, and its first column is the sample name exactly as the adapter spells it: a VCF sample, a MultiWiggle subtrack's name, a MAF species id. Every other column (`population`, `tissue`, ...) becomes an attribute of that sample, which the multi-row displays group, sort, color and tooltip rows by; a MAF adapter reads the `label`, `color` and `assemblyName` columns onto its species rows, over its `samples` entries. The table also narrows the adapter's samples to the ones it lists, and a table naming none of them is an error. An adapter that lists no samples of its own (a MAF track discovering its species from the file) takes the table's rows as its samples",
12
+ },
13
+ };
14
+ /**
15
+ * The metadata rows for the samples an adapter names, plus a warning for the
16
+ * samples the table leaves out, which no row is drawn for. Rows naming samples
17
+ * the adapter lacks are dropped silently: one project-wide table serving
18
+ * several tracks is the normal shape. `names` undefined means the adapter lists
19
+ * no samples of its own, so the rows become the set.
20
+ *
21
+ * A table matching none of `names` throws. Falling back to `names` would show
22
+ * every sample when the config asked for a curated subset, and an empty result
23
+ * draws a blank track with no banner. The message quotes both sides of the
24
+ * mismatch, because a prefix is what separates `1000GP_HG00096` from
25
+ * `HG00096`.
26
+ *
27
+ * `fileLabel` names the file in a message; `namesLabel` names where `names`
28
+ * came from ("the VCF").
29
+ */
30
+ export function parseSamplesTsv(txt, names, fileLabel, namesLabel) {
31
+ const lines = txt.split(/\n|\r\n|\r/);
32
+ const header = lines[0].split('\t');
33
+ const metadataSet = new Set();
34
+ const duplicates = new Set();
35
+ const metadataLines = lines
36
+ .slice(1)
37
+ .filter(Boolean)
38
+ .map(line => {
39
+ const [name, ...rest] = line.split('\t');
40
+ return {
41
+ ...Object.fromEntries(header.slice(1).map((col, idx) => [col, rest[idx] ?? ''])),
42
+ name: name,
43
+ };
44
+ })
45
+ .filter(row => {
46
+ if (metadataSet.has(row.name)) {
47
+ duplicates.add(row.name);
48
+ return false;
49
+ }
50
+ metadataSet.add(row.name);
51
+ return true;
52
+ });
53
+ const warnings = [];
54
+ if (duplicates.size) {
55
+ warnings.push(`${duplicates.size} samples appear more than once in the metadata file ${fileLabel}; the first row of each is used: ${shorten2([...duplicates].join(','))}`);
56
+ }
57
+ if (!names) {
58
+ return { sources: metadataLines, warnings };
59
+ }
60
+ const nameSet = new Set(names);
61
+ const namesNotInMetadata = [...nameSet].filter(f => !metadataSet.has(f));
62
+ const sources = metadataLines.filter(f => nameSet.has(f.name));
63
+ if (sources.length === 0 && names.length > 0) {
64
+ const example = metadataLines[0]?.name;
65
+ throw new Error(example === undefined
66
+ ? `The samples metadata file ${fileLabel} has a header but no sample rows, so this track has no rows to draw`
67
+ : `No sample in the metadata file ${fileLabel} matches ${namesLabel}, so this track has no rows to draw: its first column reads "${example}" where ${namesLabel} names "${names[0]}". Check for an added prefix or suffix, or for the sample IDs being in a different column.`);
68
+ }
69
+ if (namesNotInMetadata.length) {
70
+ warnings.push(`${namesNotInMetadata.length} of the ${names.length} samples in ${namesLabel} are not in the metadata file ${fileLabel} (${metadataLines.length} lines) and are not shown: ${shorten2(namesNotInMetadata.join(','))}`);
71
+ }
72
+ return { sources, warnings };
73
+ }
74
+ /**
75
+ * An adapter's samples merged with its `samplesTsvLocation` table: the bare
76
+ * `names` when the slot is unset, otherwise {@link parseSamplesTsv}'s rows.
77
+ * The warnings come back rather than going to `console.warn`, because this runs
78
+ * in a worker whose console nobody reads.
79
+ */
80
+ export async function getSamplesTsvSources({ location, names, namesLabel, pluginManager, opts, }) {
81
+ if (!location) {
82
+ return { sources: (names ?? []).map(name => ({ name })), warnings: [] };
83
+ }
84
+ const txt = await fetchAndMaybeUnzipText(openLocation(location, pluginManager), opts, 'Downloading sample metadata');
85
+ return parseSamplesTsv(txt, names, 'uri' in location ? location.uri : getFileName(location), namesLabel);
86
+ }
@@ -0,0 +1,18 @@
1
+ import type { IAnyStateTreeNode } from '@jbrowse/mobx-state-tree';
2
+ /**
3
+ * Free a tree an action has already let go of — a superseded session, a view
4
+ * taken out of one, a superseded rootModel the React host has detached.
5
+ *
6
+ * A task rather than a microtask: the wait is for React to unmount the
7
+ * components rendering it, which happens on the re-render that the action's own
8
+ * reactions schedule. Deferring is acceptable here, and is not elsewhere,
9
+ * because the node stays alive and detached until it fires — a late read gets a
10
+ * live tree nobody is rendering. ADR-069.
11
+ *
12
+ * The destroy itself is not optional. `beforeDestroy` is a plugin-facing
13
+ * contract (jbrowse-plugin-apollo aborts its in-flight fetches there) and core's
14
+ * `BaseTrackModel` releases the `rpcSessionId` claim that lets
15
+ * `CoreFreeResources` evict a parsed adapter from the worker — so detaching and
16
+ * forgetting would trade a console warning for an unbounded leak.
17
+ */
18
+ export declare function scheduleDetachedDestroy(node: IAnyStateTreeNode): void;
@@ -0,0 +1,24 @@
1
+ import { destroy, isAlive } from '@jbrowse/mobx-state-tree';
2
+ /**
3
+ * Free a tree an action has already let go of — a superseded session, a view
4
+ * taken out of one, a superseded rootModel the React host has detached.
5
+ *
6
+ * A task rather than a microtask: the wait is for React to unmount the
7
+ * components rendering it, which happens on the re-render that the action's own
8
+ * reactions schedule. Deferring is acceptable here, and is not elsewhere,
9
+ * because the node stays alive and detached until it fires — a late read gets a
10
+ * live tree nobody is rendering. ADR-069.
11
+ *
12
+ * The destroy itself is not optional. `beforeDestroy` is a plugin-facing
13
+ * contract (jbrowse-plugin-apollo aborts its in-flight fetches there) and core's
14
+ * `BaseTrackModel` releases the `rpcSessionId` claim that lets
15
+ * `CoreFreeResources` evict a parsed adapter from the worker — so detaching and
16
+ * forgetting would trade a console warning for an unbounded leak.
17
+ */
18
+ export function scheduleDetachedDestroy(node) {
19
+ setTimeout(() => {
20
+ if (isAlive(node)) {
21
+ destroy(node);
22
+ }
23
+ }, 0);
24
+ }
@@ -1,4 +1,5 @@
1
1
  export declare function createScrollLatch(timeoutMs?: number): {
2
2
  scroll(e: WheelEvent, cur: number, delta: number, max: number, min?: number): number | null;
3
+ holds(e: WheelEvent): boolean;
3
4
  reset(): void;
4
5
  };
@@ -47,6 +47,14 @@ export function createScrollLatch(timeoutMs = LATCH_TIMEOUT_MS) {
47
47
  }
48
48
  return null;
49
49
  },
50
+ // Whether this panel already owns the gesture `e` belongs to, i.e. it has
51
+ // scrolled during a run of events this one continues. Callers ask before
52
+ // declining an event on their own rules: a gesture that has latched keeps
53
+ // every event it fires, cross-axis momentum included, which is the whole
54
+ // point of latching.
55
+ holds(e) {
56
+ return latched && e.timeStamp - lastEvent < timeoutMs;
57
+ },
50
58
  // Forget the gesture state so the next event is treated as a fresh gesture.
51
59
  // Called when the pointer leaves the panel: a gesture the browser has
52
60
  // latched to this element must not keep the page suppressed once the cursor
@@ -0,0 +1,16 @@
1
+ import type { createAbortRotation } from './createAbortRotation.ts';
2
+ import type { CoreGetEncodedLayersArgs } from './markEncodingTypes.ts';
3
+ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
4
+ /**
5
+ * #api
6
+ * Open the feature widget on the feature behind one instance of a
7
+ * `CoreGetEncodedLayers` answer. A display holds channels, not records, so it
8
+ * sends `CoreGetEncodedFeature` the request the instance's region came back
9
+ * under, and the worker answers the entry of `layer`'s list that the
10
+ * instance's `featureIndex` names: the record as the adapter wrote it, or the
11
+ * bin or run the steps made. A second click aborts the first.
12
+ */
13
+ export declare function selectEncodedFeature(self: IStateTreeNode, rotation: ReturnType<typeof createAbortRotation>, args: Omit<CoreGetEncodedLayersArgs, 'byteLimit'> & {
14
+ layer: number;
15
+ featureIndex: number;
16
+ }): void;
@@ -0,0 +1,34 @@
1
+ import { openFeatureWidget } from './openFeatureWidget.js';
2
+ import { getRpcSessionId } from './parentWalk.js';
3
+ import { getRpcHost } from './sessionServices.js';
4
+ import SimpleFeature from './simpleFeature.js';
5
+ import { withFeatureDetails } from './withFeatureDetails.js';
6
+ /**
7
+ * #api
8
+ * Open the feature widget on the feature behind one instance of a
9
+ * `CoreGetEncodedLayers` answer. A display holds channels, not records, so it
10
+ * sends `CoreGetEncodedFeature` the request the instance's region came back
11
+ * under, and the worker answers the entry of `layer`'s list that the
12
+ * instance's `featureIndex` names: the record as the adapter wrote it, or the
13
+ * bin or run the steps made. A second click aborts the first.
14
+ */
15
+ export function selectEncodedFeature(self, rotation, args) {
16
+ const fetch = rotation.begin();
17
+ void withFeatureDetails(self, async () => {
18
+ try {
19
+ const feature = await getRpcHost(self).rpcManager.call(getRpcSessionId(self), 'CoreGetEncodedFeature', {
20
+ ...args,
21
+ signal: fetch.signal,
22
+ statusCallback: fetch.statusCallback,
23
+ });
24
+ return feature && fetch.isCurrent()
25
+ ? new SimpleFeature(feature)
26
+ : undefined;
27
+ }
28
+ finally {
29
+ fetch.end();
30
+ }
31
+ }, feature => {
32
+ openFeatureWidget(self, feature.toJSON(), { feature });
33
+ });
34
+ }
@@ -2,6 +2,9 @@ export declare function b64PadSuffix(b64: string): string;
2
2
  /**
3
3
  * Decode and inflate a url-safe base64 to a string
4
4
  * See {@link https://en.wikipedia.org/wiki/Base64#URL_applications}
5
+ *
6
+ * A truncated input rejects rather than inflating to a prefix: a link cut short
7
+ * in transit has to say so, not fail later as a JSON syntax error.
5
8
  */
6
9
  export declare function fromUrlSafeB64(b64: string): Promise<string>;
7
10
  /**
@@ -10,9 +13,9 @@ export declare function fromUrlSafeB64(b64: string): Promise<string>;
10
13
  */
11
14
  export declare function toUrlSafeB64(str: string): Promise<string>;
12
15
  /**
13
- * The `?session=` value prefixes, named here because this module is what
14
- * produces them. The decoder half (jbrowse-web's SessionLoader) has its own
15
- * list covering the two prefixes nothing here writes (`spec-`, `local-`).
16
+ * The `?session=` value prefixes for a session carried by or behind the link.
17
+ * The decoder half (jbrowse-web's SessionLoader) has its own list covering
18
+ * `spec-` and `local-` too.
16
19
  */
17
20
  export declare const SHARE_PREFIX = "share-";
18
21
  export declare const ENCODED_PREFIX = "encoded-";
@@ -25,11 +28,10 @@ export declare const JSON_PREFIX = "json-";
25
28
  * alone: web honors an explicit empty string as "resolve relative to the page".
26
29
  */
27
30
  export declare function shareEndpoint(shareURL: string, path: 'share' | 'load'): string;
28
- export type SessionShareMode = 'short' | 'long' | 'json';
31
+ export type SessionShareMode = 'short' | 'long';
29
32
  export interface EncodedSessionParam {
30
33
  sessionParam: string;
31
34
  password?: string;
32
- plaintext?: string;
33
35
  }
34
36
  export declare function encodeSessionParam(mode: SessionShareMode, session: unknown, options: {
35
37
  shareURL: string;