@jbrowse/core 5.0.0-beta.1 → 5.0.0-beta.10

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 (611) hide show
  1. package/README.md +1476 -265
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  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 +16 -9
  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 +50 -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/configSchema.d.ts +1 -1
  35. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  36. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  37. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  38. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  39. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  40. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  41. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  42. package/esm/BaseFeatureWidget/util.js +0 -17
  43. package/esm/CorePlugin.js +2 -2
  44. package/esm/PluginLoader.d.ts +24 -13
  45. package/esm/PluginLoader.js +167 -51
  46. package/esm/PluginManager.d.ts +130 -24
  47. package/esm/PluginManager.js +180 -32
  48. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  49. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  50. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  51. package/esm/ReExports/coreModules.generated.js +528 -0
  52. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  53. package/esm/ReExports/coreWorkerModules.generated.js +488 -0
  54. package/esm/ReExports/frameworkModules.d.ts +2 -0
  55. package/esm/ReExports/frameworkModules.js +68 -0
  56. package/esm/ReExports/frameworkShared.d.ts +12 -0
  57. package/esm/ReExports/frameworkShared.js +16 -0
  58. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  60. package/esm/ReExports/list.js +527 -79
  61. package/esm/ReExports/modules.d.ts +1 -1
  62. package/esm/ReExports/modules.js +10 -165
  63. package/esm/ReExports/registry.d.ts +1 -0
  64. package/esm/ReExports/registry.js +23 -5
  65. package/esm/ReExports/uiStub.d.ts +3 -0
  66. package/esm/ReExports/uiStub.js +33 -0
  67. package/esm/ReExports/workerModules.d.ts +2 -0
  68. package/esm/ReExports/workerModules.js +11 -0
  69. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  70. package/esm/TextSearch/TextSearchManager.js +77 -36
  71. package/esm/TextSearch/places.d.ts +12 -0
  72. package/esm/TextSearch/places.js +94 -0
  73. package/esm/assemblyManager/assembly.d.ts +21 -19
  74. package/esm/assemblyManager/assembly.js +28 -26
  75. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  76. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  77. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  78. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  79. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  80. package/esm/assemblyManager/assemblyManager.js +47 -51
  81. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  83. package/esm/assemblyManager/geneticCodes.js +2 -5
  84. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  85. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  86. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  87. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  88. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  89. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  90. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  91. package/esm/assemblyManager/refNameMapKey.js +12 -0
  92. package/esm/checkPlugins.d.ts +2 -0
  93. package/esm/checkPlugins.js +38 -17
  94. package/esm/configuration/bamIndexFields.d.ts +49 -0
  95. package/esm/configuration/bamIndexFields.js +41 -0
  96. package/esm/configuration/configurationSchema.d.ts +101 -71
  97. package/esm/configuration/configurationSchema.js +207 -134
  98. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  99. package/esm/configuration/configurationSchemaUnion.js +56 -0
  100. package/esm/configuration/configurationSlot.d.ts +150 -60
  101. package/esm/configuration/configurationSlot.js +103 -75
  102. package/esm/configuration/fillLocations.d.ts +14 -0
  103. package/esm/configuration/fillLocations.js +14 -0
  104. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  105. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  106. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  107. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  108. package/esm/configuration/fullConfSnapshot.js +30 -52
  109. package/esm/configuration/getConf.d.ts +45 -41
  110. package/esm/configuration/getConf.js +111 -44
  111. package/esm/configuration/index.d.ts +24 -11
  112. package/esm/configuration/index.js +15 -7
  113. package/esm/configuration/indexType.d.ts +26 -0
  114. package/esm/configuration/indexType.js +38 -0
  115. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  116. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  117. package/esm/configuration/readConfObject.d.ts +2 -24
  118. package/esm/configuration/readConfObject.js +20 -63
  119. package/esm/configuration/requirements.d.ts +37 -0
  120. package/esm/configuration/requirements.js +88 -0
  121. package/esm/configuration/schemaRegistry.d.ts +32 -15
  122. package/esm/configuration/schemaRegistry.js +33 -35
  123. package/esm/configuration/schemaTypes.d.ts +21 -5
  124. package/esm/configuration/schemaTypes.js +66 -55
  125. package/esm/configuration/slotFacade.d.ts +12 -29
  126. package/esm/configuration/slotFacade.js +44 -23
  127. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  128. package/esm/configuration/snapshotPreprocess.js +161 -0
  129. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  130. package/esm/configuration/tabixIndexFields.js +21 -4
  131. package/esm/configuration/tabixShorthand.d.ts +34 -17
  132. package/esm/configuration/tabixShorthand.js +49 -22
  133. package/esm/configuration/types.d.ts +182 -43
  134. package/esm/configuration/uriShorthand.d.ts +9 -0
  135. package/esm/configuration/uriShorthand.js +16 -0
  136. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  137. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  138. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  139. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  140. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  141. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  142. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  143. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  144. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  145. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  146. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  147. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  148. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  149. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  150. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  151. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  152. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  153. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  154. package/esm/data_adapters/dataAdapterCache.js +44 -10
  155. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  156. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  157. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  158. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  159. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  160. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  161. package/esm/pluggableElementTypes/DisplayType.d.ts +46 -16
  162. package/esm/pluggableElementTypes/DisplayType.js +22 -12
  163. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  164. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  165. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  166. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  167. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  168. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  169. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  170. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  171. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  172. package/esm/pluggableElementTypes/ViewType.js +32 -4
  173. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  174. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  175. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  176. package/esm/pluggableElementTypes/index.d.ts +2 -1
  177. package/esm/pluggableElementTypes/index.js +1 -1
  178. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  179. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +65 -27
  180. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +72 -10
  181. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  182. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  183. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +85 -16
  184. package/esm/pluggableElementTypes/models/BaseViewModel.js +53 -10
  185. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  186. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  187. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  188. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  189. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  190. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  191. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  192. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  193. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  194. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  195. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  196. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  197. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  198. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  199. package/esm/pluggableElementTypes/models/index.js +2 -3
  200. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  201. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  202. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  203. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  204. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  205. package/esm/pluginDefinitions.d.ts +34 -7
  206. package/esm/pluginDefinitions.js +54 -20
  207. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  208. package/esm/rpc/BaseRpcDriver.js +25 -30
  209. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  210. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  211. package/esm/rpc/RpcClient.d.ts +18 -6
  212. package/esm/rpc/RpcClient.js +51 -16
  213. package/esm/rpc/RpcManager.d.ts +14 -10
  214. package/esm/rpc/RpcManager.js +11 -1
  215. package/esm/rpc/RpcRegistry.d.ts +40 -7
  216. package/esm/rpc/RpcServer.d.ts +3 -1
  217. package/esm/rpc/RpcServer.js +19 -12
  218. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  219. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  220. package/esm/rpc/byteBudget.d.ts +20 -5
  221. package/esm/rpc/byteBudget.js +16 -5
  222. package/esm/rpc/configSchema.d.ts +7 -21
  223. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  224. package/esm/rpc/coreRpcMethods.js +4 -0
  225. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  226. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  227. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  228. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  229. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  230. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  231. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  232. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  233. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  234. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  235. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  236. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  237. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  238. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  239. package/esm/rpc/methods/layerFeatures.js +29 -0
  240. package/esm/svg/SvgExport.js +6 -7
  241. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  242. package/esm/svg/SvgThemeProviders.js +15 -0
  243. package/esm/svg/exportViewSvg.d.ts +28 -0
  244. package/esm/svg/exportViewSvg.js +13 -0
  245. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  246. package/esm/svg/normalizeSvgMarkup.js +99 -0
  247. package/esm/svg/serializeSvg.d.ts +7 -0
  248. package/esm/svg/serializeSvg.js +11 -0
  249. package/esm/svg/svgId.d.ts +1 -1
  250. package/esm/svg/svgId.js +1 -1
  251. package/esm/svg/svgReady.d.ts +9 -7
  252. package/esm/svg/svgReady.js +8 -7
  253. package/esm/svg/trackNames.d.ts +7 -5
  254. package/esm/svg/trackNames.js +12 -9
  255. package/esm/svg/wrapSvgExport.js +6 -74
  256. package/esm/ui/AddCustomPluginDialog.js +3 -8
  257. package/esm/ui/AppReadyMarker.d.ts +45 -0
  258. package/esm/ui/AppReadyMarker.js +89 -0
  259. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  260. package/esm/ui/CascadingMenu.js +181 -104
  261. package/esm/ui/DropDownMenu.js +2 -1
  262. package/esm/ui/ErrorBanner.js +1 -1
  263. package/esm/ui/ErrorBoundary.d.ts +2 -2
  264. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  265. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  266. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  267. package/esm/ui/FileDropZone.js +2 -1
  268. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  269. package/esm/ui/HoverMenu.d.ts +1 -2
  270. package/esm/ui/HoverMenu.js +6 -3
  271. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  272. package/esm/ui/JexlFilterDialog.js +122 -49
  273. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  274. package/esm/ui/JexlFilterRowEditors.js +90 -0
  275. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  276. package/esm/ui/LazyBaseTooltip.js +9 -0
  277. package/esm/ui/LegendSwatchGlyph.js +26 -21
  278. package/esm/ui/LoadingOverlay.d.ts +14 -0
  279. package/esm/ui/LoadingOverlay.js +4 -2
  280. package/esm/ui/MenuTypes.d.ts +23 -53
  281. package/esm/ui/MenuTypes.js +3 -0
  282. package/esm/ui/MonospaceTextField.d.ts +2 -1
  283. package/esm/ui/MonospaceTextField.js +23 -20
  284. package/esm/ui/PaletteContext.d.ts +10 -5
  285. package/esm/ui/PaletteContext.js +44 -6
  286. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  287. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  288. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  289. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  290. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  291. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  292. package/esm/ui/ResizeHandle.d.ts +3 -1
  293. package/esm/ui/ResizeHandle.js +44 -11
  294. package/esm/ui/ScrollChrome.d.ts +13 -0
  295. package/esm/ui/ScrollChrome.js +11 -0
  296. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  297. package/esm/ui/ScrollEdgeShadow.js +14 -35
  298. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  299. package/esm/ui/ScrollZoomToggle.js +34 -51
  300. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  301. package/esm/ui/SessionJsonPanel.js +14 -0
  302. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  303. package/esm/ui/SettingsChangesTable.js +49 -11
  304. package/esm/ui/ShareLinkField.d.ts +1 -3
  305. package/esm/ui/ShareLinkField.js +13 -40
  306. package/esm/ui/SizeSliderRow.d.ts +1 -3
  307. package/esm/ui/SizeSliderRow.js +4 -6
  308. package/esm/ui/SnackbarModel.js +79 -67
  309. package/esm/ui/StatusProgressBar.js +2 -2
  310. package/esm/ui/SvgColorLegend.d.ts +9 -4
  311. package/esm/ui/SvgColorLegend.js +82 -41
  312. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  313. package/esm/ui/VerticalScrollbar.js +29 -83
  314. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  315. package/esm/ui/ViewLoadingScreen.js +8 -32
  316. package/esm/ui/colorScale.d.ts +92 -0
  317. package/esm/ui/colorScale.js +72 -0
  318. package/esm/ui/colors.d.ts +64 -0
  319. package/esm/ui/colors.js +230 -1
  320. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  321. package/esm/ui/hoverBoxStyle.js +17 -2
  322. package/esm/ui/index.d.ts +12 -12
  323. package/esm/ui/index.js +14 -22
  324. package/esm/ui/launchViewMenu.js +15 -5
  325. package/esm/ui/legendMenuItem.d.ts +10 -32
  326. package/esm/ui/legendMenuItem.js +9 -36
  327. package/esm/ui/legendSpec.d.ts +15 -8
  328. package/esm/ui/legendSpec.js +14 -23
  329. package/esm/ui/makeSizeMenu.d.ts +0 -6
  330. package/esm/ui/makeSizeMenu.js +6 -30
  331. package/esm/ui/measureLegendText.js +1 -1
  332. package/esm/ui/menuItemAdornment.d.ts +9 -20
  333. package/esm/ui/menuItemAdornment.js +10 -32
  334. package/esm/ui/menuItems.d.ts +2 -7
  335. package/esm/ui/menuItems.js +1 -6
  336. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  337. package/esm/ui/palette.d.ts +118 -116
  338. package/esm/ui/palette.js +114 -75
  339. package/esm/ui/replaceViewAction.d.ts +1 -1
  340. package/esm/ui/replaceViewAction.js +1 -1
  341. package/esm/ui/theme.d.ts +43 -119
  342. package/esm/ui/theme.js +62 -78
  343. package/esm/ui/toggleMenuItems.d.ts +1 -3
  344. package/esm/ui/toggleMenuItems.js +6 -5
  345. package/esm/ui/useAssemblySelection.d.ts +4 -4
  346. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  347. package/esm/ui/viewHeaderHeight.js +1 -0
  348. package/esm/util/Base1DUtils.d.ts +5 -3
  349. package/esm/util/Base1DUtils.js +14 -6
  350. package/esm/util/Base1DViewModel.d.ts +2 -1
  351. package/esm/util/Base1DViewModel.js +3 -2
  352. package/esm/util/SvgCanvas.d.ts +15 -13
  353. package/esm/util/SvgCanvas.js +76 -56
  354. package/esm/util/aborting.d.ts +39 -0
  355. package/esm/util/aborting.js +88 -6
  356. package/esm/util/adapterMetadata.d.ts +1 -1
  357. package/esm/util/adapterMetadata.js +6 -5
  358. package/esm/util/addAndShowTrack.d.ts +2 -5
  359. package/esm/util/addAndShowTrack.js +5 -1
  360. package/esm/util/addRelativeUris.d.ts +17 -5
  361. package/esm/util/addRelativeUris.js +46 -10
  362. package/esm/util/addTrackFromWidget.d.ts +2 -5
  363. package/esm/util/addTrackFromWidget.js +5 -4
  364. package/esm/util/aggregateFieldName.d.ts +10 -0
  365. package/esm/util/aggregateFieldName.js +8 -0
  366. package/esm/util/analytics.js +46 -13
  367. package/esm/util/animationAllowed.d.ts +9 -0
  368. package/esm/util/animationAllowed.js +13 -0
  369. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  370. package/esm/util/applyRowResizeWheel.js +10 -21
  371. package/esm/util/bandHeight.d.ts +10 -0
  372. package/esm/util/bandHeight.js +29 -0
  373. package/esm/util/bandLayout.d.ts +4 -4
  374. package/esm/util/bandLayout.js +4 -4
  375. package/esm/util/bezierConnector.d.ts +4 -3
  376. package/esm/util/bezierConnector.js +38 -45
  377. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  378. package/esm/util/bgzfWorkerPool.js +20 -74
  379. package/esm/util/binnedAggregate.d.ts +17 -0
  380. package/esm/util/binnedAggregate.js +275 -0
  381. package/esm/util/cacheBudgets.d.ts +22 -19
  382. package/esm/util/cacheBudgets.js +22 -19
  383. package/esm/util/cachedSetup.d.ts +1 -1
  384. package/esm/util/cachedSetup.js +2 -2
  385. package/esm/util/categoricalField.d.ts +56 -0
  386. package/esm/util/categoricalField.js +73 -0
  387. package/esm/util/clampToContig.d.ts +17 -0
  388. package/esm/util/clampToContig.js +19 -0
  389. package/esm/util/coarseStripHTML.js +1 -2
  390. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  391. package/esm/util/color/cssColorsLevel4.js +1 -0
  392. package/esm/util/color/index.d.ts +5 -3
  393. package/esm/util/color/index.js +7 -4
  394. package/esm/util/colorBits.d.ts +3 -3
  395. package/esm/util/colorBits.js +19 -44
  396. package/esm/util/colorRamp.d.ts +49 -5
  397. package/esm/util/colorRamp.js +169 -18
  398. package/esm/util/colorScale.d.ts +156 -0
  399. package/esm/util/colorScale.js +243 -0
  400. package/esm/util/colorSchemes.d.ts +21 -0
  401. package/esm/util/colorSchemes.js +30 -0
  402. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  403. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  404. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  405. package/esm/util/cssColorParse.d.ts +15 -0
  406. package/esm/util/cssColorParse.js +53 -0
  407. package/esm/util/diagonalizeRegions.d.ts +2 -3
  408. package/esm/util/diagonalizeRegions.js +8 -13
  409. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  410. package/esm/util/expandLooseSearchIndex.js +29 -0
  411. package/esm/util/featureTable.d.ts +224 -0
  412. package/esm/util/featureTable.js +366 -0
  413. package/esm/util/featureTransforms.d.ts +80 -0
  414. package/esm/util/featureTransforms.js +1579 -0
  415. package/esm/util/featureTypes.d.ts +24 -0
  416. package/esm/util/featureTypes.js +35 -0
  417. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  418. package/esm/util/fetchContext.d.ts +7 -8
  419. package/esm/util/fetchContext.js +3 -3
  420. package/esm/util/fetchHub.d.ts +4 -2
  421. package/esm/util/fetchHub.js +2 -2
  422. package/esm/util/fetchPhases.d.ts +10 -10
  423. package/esm/util/fetchSeq.d.ts +2 -3
  424. package/esm/util/fetchSeq.js +2 -2
  425. package/esm/util/fieldReader.d.ts +17 -0
  426. package/esm/util/fieldReader.js +62 -0
  427. package/esm/util/freezeDeep.d.ts +8 -10
  428. package/esm/util/freezeDeep.js +8 -10
  429. package/esm/util/groupKeys.d.ts +77 -0
  430. package/esm/util/groupKeys.js +155 -0
  431. package/esm/util/highlights.d.ts +10 -6
  432. package/esm/util/highlights.js +12 -25
  433. package/esm/util/hooks.d.ts +31 -2
  434. package/esm/util/hooks.js +72 -3
  435. package/esm/util/index.d.ts +11 -11
  436. package/esm/util/index.js +11 -10
  437. package/esm/util/indexCandidates.d.ts +1 -31
  438. package/esm/util/indexCandidates.js +5 -63
  439. package/esm/util/installFetch.d.ts +77 -37
  440. package/esm/util/installFetch.js +65 -38
  441. package/esm/util/installInitAutorun.d.ts +14 -13
  442. package/esm/util/installInitAutorun.js +17 -17
  443. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  444. package/esm/util/installPrerequisiteFetch.js +111 -0
  445. package/esm/util/io/index.js +19 -14
  446. package/esm/util/isDataCurrent.d.ts +7 -5
  447. package/esm/util/isDataCurrent.js +9 -6
  448. package/esm/util/isTextEntryFocused.d.ts +7 -0
  449. package/esm/util/isTextEntryFocused.js +16 -0
  450. package/esm/util/jexl.js +24 -21
  451. package/esm/util/jexlFilterRows.d.ts +89 -0
  452. package/esm/util/jexlFilterRows.js +252 -0
  453. package/esm/util/jexlFilters.d.ts +20 -27
  454. package/esm/util/jexlFilters.js +23 -11
  455. package/esm/util/jexlStrings.d.ts +3 -4
  456. package/esm/util/jexlStrings.js +2 -3
  457. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  458. package/esm/util/layouts/GranularRectLayout.js +25 -8
  459. package/esm/util/lazyAfterAttach.d.ts +13 -0
  460. package/esm/util/lazyAfterAttach.js +31 -0
  461. package/esm/util/lazyWithPreload.d.ts +19 -0
  462. package/esm/util/lazyWithPreload.js +27 -0
  463. package/esm/util/legendCandidates.d.ts +72 -0
  464. package/esm/util/legendCandidates.js +138 -0
  465. package/esm/util/localStorage.js +4 -4
  466. package/esm/util/markEncoding.d.ts +150 -0
  467. package/esm/util/markEncoding.js +845 -0
  468. package/esm/util/markEncodingTypes.d.ts +588 -0
  469. package/esm/util/markEncodingTypes.js +8 -0
  470. package/esm/util/mst-reflection.d.ts +2 -20
  471. package/esm/util/mst-reflection.js +3 -53
  472. package/esm/util/mstUtils.d.ts +31 -23
  473. package/esm/util/mstUtils.js +39 -24
  474. package/esm/util/numericUtils.d.ts +7 -0
  475. package/esm/util/numericUtils.js +16 -0
  476. package/esm/util/numericValue.d.ts +14 -0
  477. package/esm/util/numericValue.js +34 -0
  478. package/esm/util/openFeatureWidget.d.ts +5 -0
  479. package/esm/util/openFeatureWidget.js +2 -2
  480. package/esm/util/openViews.d.ts +17 -0
  481. package/esm/util/openViews.js +22 -0
  482. package/esm/util/parentWalk.d.ts +1 -1
  483. package/esm/util/parentWalk.js +1 -1
  484. package/esm/util/parseLineByLine.d.ts +4 -5
  485. package/esm/util/parseLineByLine.js +8 -14
  486. package/esm/util/pluginStore.d.ts +6 -8
  487. package/esm/util/pluginStore.js +17 -16
  488. package/esm/util/preloadComponent.d.ts +5 -0
  489. package/esm/util/preloadComponent.js +11 -0
  490. package/esm/util/progress.d.ts +22 -22
  491. package/esm/util/progress.js +27 -26
  492. package/esm/util/quantileExtent.d.ts +49 -0
  493. package/esm/util/quantileExtent.js +162 -0
  494. package/esm/util/range.d.ts +13 -9
  495. package/esm/util/range.js +17 -8
  496. package/esm/util/renameRegions.d.ts +26 -6
  497. package/esm/util/renameRegions.js +68 -54
  498. package/esm/util/renderToStaticMarkup.js +24 -14
  499. package/esm/util/rxjs.d.ts +23 -8
  500. package/esm/util/rxjs.js +61 -15
  501. package/esm/util/samplesTsv.d.ts +49 -0
  502. package/esm/util/samplesTsv.js +86 -0
  503. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  504. package/esm/util/scheduleDetachedDestroy.js +24 -0
  505. package/esm/util/scrollLatch.d.ts +1 -0
  506. package/esm/util/scrollLatch.js +8 -0
  507. package/esm/util/selectEncodedFeature.d.ts +16 -0
  508. package/esm/util/selectEncodedFeature.js +34 -0
  509. package/esm/util/sessionSharing.d.ts +7 -5
  510. package/esm/util/sessionSharing.js +23 -23
  511. package/esm/util/shapeNameList.d.ts +2 -0
  512. package/esm/util/shapeNameList.js +6 -0
  513. package/esm/util/shapeNames.d.ts +7 -0
  514. package/esm/util/shapeNames.js +11 -0
  515. package/esm/util/simpleFeature.d.ts +0 -1
  516. package/esm/util/starFusion.d.ts +26 -0
  517. package/esm/util/starFusion.js +37 -0
  518. package/esm/util/stepTables.d.ts +82 -0
  519. package/esm/util/stepTables.js +243 -0
  520. package/esm/util/svAlt.d.ts +145 -0
  521. package/esm/util/svAlt.js +364 -0
  522. package/esm/util/svgColorProps.d.ts +11 -0
  523. package/esm/util/svgColorProps.js +28 -1
  524. package/esm/util/systemColorScheme.d.ts +12 -0
  525. package/esm/util/systemColorScheme.js +27 -0
  526. package/esm/util/tabix.d.ts +13 -8
  527. package/esm/util/tabix.js +17 -12
  528. package/esm/util/thresholdScale.d.ts +91 -0
  529. package/esm/util/thresholdScale.js +166 -0
  530. package/esm/util/timeGate.d.ts +4 -5
  531. package/esm/util/timeGate.js +4 -5
  532. package/esm/util/trackConfigDelta.d.ts +26 -26
  533. package/esm/util/trackConfigDelta.js +63 -47
  534. package/esm/util/tracks.d.ts +121 -40
  535. package/esm/util/tracks.js +497 -112
  536. package/esm/util/translateTranscript.d.ts +44 -0
  537. package/esm/util/translateTranscript.js +102 -0
  538. package/esm/util/types/data.d.ts +0 -2
  539. package/esm/util/types/index.d.ts +121 -22
  540. package/esm/util/types/index.js +9 -0
  541. package/esm/util/types/mst.d.ts +3 -0
  542. package/esm/util/types/mst.js +4 -0
  543. package/esm/util/types/renameIds.d.ts +1 -0
  544. package/esm/util/types/renameIds.js +29 -0
  545. package/esm/util/types/services.d.ts +1 -1
  546. package/esm/util/unknownSnapshotKeys.d.ts +51 -0
  547. package/esm/util/unknownSnapshotKeys.js +82 -0
  548. package/esm/util/useFeatureSequence.js +5 -5
  549. package/esm/util/useFetch.d.ts +3 -4
  550. package/esm/util/useFetch.js +19 -10
  551. package/esm/util/useFetchPlugins.d.ts +6 -2
  552. package/esm/util/useFetchPlugins.js +7 -3
  553. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  554. package/esm/util/usePanelVirtualScroll.js +9 -36
  555. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  556. package/esm/util/useRowVirtualScroll.js +8 -49
  557. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  558. package/esm/util/useVirtualScrollWheel.js +40 -74
  559. package/esm/util/viewHighlights.d.ts +3 -0
  560. package/esm/util/viewHighlights.js +5 -0
  561. package/esm/util/viewStatus.d.ts +47 -15
  562. package/esm/util/viewStatus.js +34 -0
  563. package/esm/util/wheelZoom.d.ts +7 -1
  564. package/esm/util/wheelZoom.js +85 -19
  565. package/esm/util/whenViewSettled.d.ts +55 -8
  566. package/esm/util/whenViewSettled.js +56 -7
  567. package/esm/util/withLaunchInput.d.ts +174 -0
  568. package/esm/util/withLaunchInput.js +274 -0
  569. package/package.json +70 -20
  570. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  571. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  572. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  573. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  574. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  575. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  576. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  577. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  578. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  579. package/esm/ReExports/index.d.ts +0 -1
  580. package/esm/ReExports/index.js +0 -1
  581. package/esm/ReExports/publicUtil.d.ts +0 -1
  582. package/esm/ReExports/publicUtil.js +0 -28
  583. package/esm/configuration/promotableDefaults.d.ts +0 -199
  584. package/esm/configuration/promotableDefaults.js +0 -326
  585. package/esm/configuration/promotablePin.d.ts +0 -55
  586. package/esm/configuration/promotablePin.js +0 -1
  587. package/esm/configuration/promotableResolve.d.ts +0 -108
  588. package/esm/configuration/promotableResolve.js +0 -117
  589. package/esm/configuration/promotableSlots.d.ts +0 -12
  590. package/esm/configuration/promotableSlots.js +0 -45
  591. package/esm/configuration/slotShape.d.ts +0 -12
  592. package/esm/configuration/slotShape.js +0 -84
  593. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  594. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  595. package/esm/ui/PinAdornment.d.ts +0 -5
  596. package/esm/ui/PinAdornment.js +0 -79
  597. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  598. package/esm/ui/SvgGradientLegend.js +0 -26
  599. package/esm/ui/highlightChipReveal.d.ts +0 -32
  600. package/esm/ui/highlightChipReveal.js +0 -39
  601. package/esm/ui/promotableMenuItems.d.ts +0 -19
  602. package/esm/ui/promotableMenuItems.js +0 -89
  603. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  604. package/esm/ui/promotablePinCoverage.js +0 -87
  605. package/esm/util/applyInitSettings.d.ts +0 -79
  606. package/esm/util/applyInitSettings.js +0 -91
  607. package/esm/util/openDisplays.d.ts +0 -23
  608. package/esm/util/openDisplays.js +0 -79
  609. package/esm/util/stopToken.d.ts +0 -211
  610. package/esm/util/stopToken.js +0 -438
  611. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -0,0 +1,111 @@
1
+ import { isAlive } from '@jbrowse/mobx-state-tree';
2
+ import { installFetch } from './installFetch.js';
3
+ import { isDataCurrent } from './isDataCurrent.js';
4
+ /**
5
+ * `read`'s value while it answers the adapter config `host` holds; undefined
6
+ * until a read of that config commits, which a failed read never does.
7
+ *
8
+ * Equal by value, as the fetch key is: an undo rebuilds the track's config,
9
+ * handing back an equal adapter config the fetch declines to read again.
10
+ */
11
+ export function readFor(host, read) {
12
+ return read !== undefined &&
13
+ isDataCurrent(read.adapterConfig, host.adapterConfig)
14
+ ? read.value
15
+ : undefined;
16
+ }
17
+ /**
18
+ * A **prerequisite read**: one RPC about the adapter itself, beside the
19
+ * display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
20
+ * whose `resolutions` every contacts fetch waits on; the multi-sample sample
21
+ * list, which `fetchNeeded` declines until; the tiered alignment file's
22
+ * `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
23
+ * and the mark display's source list, which gives each listed source a row —
24
+ * and they sit on three different fetch foundations, which is why this sits in
25
+ * core beside the skeleton and not beside any of them.
26
+ *
27
+ * They had the shape below hand-copied, comment for comment, and each term is a
28
+ * rule rather than a preference:
29
+ *
30
+ * - **the adapter config is the whole trigger and the whole key.** Tracked in
31
+ * `prepare` so a config-editor edit re-reads; keyed on the same value so an
32
+ * un-minimize over the same file re-reads nothing. Getting one without the
33
+ * other gives either a stale header or a walk of a `.hic` norm-vector index on
34
+ * every expand.
35
+ * - **the answer carries the same key** (`AdapterRead`), and a display reads
36
+ * it through `readFor`, so an answer to a previous adapter config is never
37
+ * read as the current one, and a failed read leaves nothing to clear.
38
+ * - **an answer to a config the display no longer holds is dropped**, and so is
39
+ * its error. An undo that brings back the config already answered makes the
40
+ * skeleton decline a re-read, while the read of the abandoned config runs
41
+ * on, still current; landing, it would stamp its key, force a second read of
42
+ * the held one and hand the display a list for another file, on which the
43
+ * variant display resets its arrangement.
44
+ * - **minimized is the gate**, and a display with a second condition of its own
45
+ * passes `gate` — the sample-list read waits for the LGV to be measured as
46
+ * well, so a full-file scan does not start ahead of the display's own first
47
+ * fetch, and the tier read waits on the track declaring a tier threshold at
48
+ * all.
49
+ * - **no `contract`.** This is the second fetch on a display whose foundation
50
+ * installed both checks already: `assertDisplayContract` would report the
51
+ * double-attach it exists to catch, and a second retry check would consume the
52
+ * same `reloadCounter` bumps as the first.
53
+ * - **where the status goes is the caller's** (`report`). The two LGV reads
54
+ * lend the display's own status window, so the read takes a slot beside the
55
+ * primary fetch rather than opening a second writer over the one status field
56
+ * (ADR-081) — and it matters more here than for most fetches: a prerequisite
57
+ * runs inside the pre-first-paint window, where the scrim is up because
58
+ * nothing is drawn rather than because `isLoading` is, so `statusMessage` is
59
+ * the only thing that can say what is happening. The tier read narrates
60
+ * nothing; a header is not a load.
61
+ *
62
+ * `createAdapterMetadataFetch` keys on the same adapter config and is
63
+ * deliberately NOT one of these: no trigger, no signal and no status,
64
+ * because it is fetched lazily when a details widget opens and the widget opens
65
+ * on the result. A prerequisite read is the one a display's own fetch waits on.
66
+ *
67
+ * **A declaration, not the skeleton this name used to be.** There was an
68
+ * `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
69
+ * a good reason: it carried a `runOne` of its own — a fifth copy of begin →
70
+ * clear → run → commit-if-current → `handleFetchError` → end — and once
71
+ * `installFetch` owned that sequence, a second one was pure drift surface. This
72
+ * one adds no sequence, no rotation and no error rule; it is terms handed to
73
+ * `installFetch`, the same shape `installGlobalFetchAutorun` and
74
+ * `installComparativeFetchAutorun` are. Add nothing here that a family could
75
+ * not state as an option to the skeleton.
76
+ *
77
+ * Everything the skeleton gives it is the point of going through the skeleton:
78
+ * the latest-wins rotation (so a superseding read aborts the one it replaced,
79
+ * and only a superseding read does — a user cancel of the primary fetch cannot
80
+ * strand the display the way sharing its signal would), the clear at the start,
81
+ * the currency-guarded error rule, the unconditional `reloadCounter` read that
82
+ * makes the chrome's Retry re-run this, and the retired status slot that keeps a
83
+ * failed read from leaving a progress chip up for good.
84
+ */
85
+ export function installPrerequisiteFetch(self, { name, delay, report, gate = () => true, run, commit, setError, }) {
86
+ installFetch(self, {
87
+ name,
88
+ delay,
89
+ report,
90
+ gate: () => !self.isMinimized && gate(),
91
+ prepare: () => ({ adapterConfig: self.adapterConfig }),
92
+ fetchKey: ({ adapterConfig }) => adapterConfig,
93
+ run: async ({ adapterConfig }, ctx) => {
94
+ const held = () => isAlive(self) && isDataCurrent(adapterConfig, self.adapterConfig);
95
+ try {
96
+ const value = await run(adapterConfig, ctx);
97
+ return held() ? value : undefined;
98
+ }
99
+ catch (e) {
100
+ if (held()) {
101
+ throw e;
102
+ }
103
+ return undefined;
104
+ }
105
+ },
106
+ commit: (value, { adapterConfig }) => {
107
+ commit({ adapterConfig, value });
108
+ },
109
+ setError,
110
+ });
111
+ }
@@ -19,18 +19,26 @@ export function resolveUriLocation(location) {
19
19
  : location;
20
20
  }
21
21
  /**
22
- * The local path a `file:` URI names, or undefined for any other scheme. A
23
- * Windows URL parses as `/C:/data/x.bam`, whose leading slash is part of the URL
24
- * grammar rather than the path.
22
+ * The local path a `file:` URI or a bare absolute path names, or undefined for
23
+ * anything else. A Windows URL parses as `/C:/data/x.bam`, whose leading slash
24
+ * is part of the URL grammar rather than the path, and a host is a network
25
+ * share: `\\server\share\x.bam` is `file://server/share/x.bam`.
25
26
  */
26
- function fileUrlToLocalPath(uri) {
27
+ function uriToLocalPath(uri) {
28
+ if (uri.startsWith('/') || /^[a-z]:[\\/]/i.test(uri)) {
29
+ return uri;
30
+ }
27
31
  if (!uri.startsWith('file:')) {
28
32
  return undefined;
29
33
  }
30
34
  try {
31
- const { pathname } = new URL(uri);
35
+ const { host, pathname } = new URL(uri);
32
36
  const decoded = decodeURIComponent(pathname);
33
- return /^\/[a-z]:/i.test(decoded) ? decoded.slice(1) : decoded;
37
+ return host && host !== 'localhost'
38
+ ? `//${host}${decoded}`
39
+ : /^\/[a-z]:/i.test(decoded)
40
+ ? decoded.slice(1)
41
+ : decoded;
34
42
  }
35
43
  catch {
36
44
  return undefined;
@@ -82,14 +90,11 @@ export function openLocation(location, pluginManager) {
82
90
  // a config that names its files relative to itself found no account at all
83
91
  // and read every one of them unauthenticated.
84
92
  const absoluteLocation = resolveUriLocation(location);
85
- // A file: URI names a path on this machine, not something to fetch. Desktop
86
- // reaches this by way of the shorthand forms: a config.json opened from disk
87
- // carries a baseUri of its own directory, so `{ type: 'BamAdapter', uri:
88
- // 'reads.bam' }` resolves here as file:///dir/reads.bam — and so does every
89
- // sibling the shorthand derived from it (.bai, .fai, .gzi). Reading them as
90
- // localPath keeps that whole chain on the one code path that can open a
91
- // local file, instead of a fetch that no range request survives.
92
- const localPath = fileUrlToLocalPath(absoluteLocation.uri);
93
+ // A file: URI or a bare absolute path names a file on this machine. A
94
+ // config.json opened from disk resolves `uri: 'reads.bam'` against its own
95
+ // directory to file:///dir/reads.bam, and a session built over MCP writes
96
+ // `uri: '/dir/reads.bam'` with no baseUri at all; fetched, either is a 404.
97
+ const localPath = uriToLocalPath(absoluteLocation.uri);
93
98
  if (localPath !== undefined && (isNode || isElectron)) {
94
99
  return openLocation({ localPath, locationType: 'LocalPathLocation' });
95
100
  }
@@ -1,7 +1,9 @@
1
1
  /**
2
- * The signature-based analog of the spatial `viewportWithinLoadedData`
3
- * (MultiRegionDisplayMixin) freshness check, for a display whose liveness is one
4
- * string rather than a per-region coverage map. An `undefined` loaded signature
5
- * is nothing fetched yet, so never current.
2
+ * Whether the key held data was committed under still equals the key a fetch
3
+ * issued now would carry. Keys are values compared structurally, so a stamp
4
+ * that kept its identity short-circuits on `===`, and an `undefined`-valued
5
+ * field or a fieldless class instance is still a distinct state — the two
6
+ * shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
7
+ * fetched yet, so never current.
6
8
  */
7
- export declare function isDataCurrent(loadedSignature: string | undefined, currentSignature: string | undefined): boolean;
9
+ export declare function isDataCurrent(loaded: unknown, current: unknown): boolean;
@@ -1,9 +1,12 @@
1
+ import { compareStructural } from 'mobx';
1
2
  /**
2
- * The signature-based analog of the spatial `viewportWithinLoadedData`
3
- * (MultiRegionDisplayMixin) freshness check, for a display whose liveness is one
4
- * string rather than a per-region coverage map. An `undefined` loaded signature
5
- * is nothing fetched yet, so never current.
3
+ * Whether the key held data was committed under still equals the key a fetch
4
+ * issued now would carry. Keys are values compared structurally, so a stamp
5
+ * that kept its identity short-circuits on `===`, and an `undefined`-valued
6
+ * field or a fieldless class instance is still a distinct state — the two
7
+ * shapes `JSON.stringify` flattened. An `undefined` loaded key is nothing
8
+ * fetched yet, so never current.
6
9
  */
7
- export function isDataCurrent(loadedSignature, currentSignature) {
8
- return loadedSignature !== undefined && loadedSignature === currentSignature;
10
+ export function isDataCurrent(loaded, current) {
11
+ return loaded !== undefined && compareStructural(loaded, current);
9
12
  }
@@ -0,0 +1,7 @@
1
+ /**
2
+ * Whether the user is typing into a text field, for a document-level shortcut
3
+ * that must leave that field's own keys alone: ctrl+z undoing typing rather
4
+ * than the session, ctrl+arrow moving the caret rather than the view. A
5
+ * `<textarea>` counts, which the multiline config and JSON editors render.
6
+ */
7
+ export declare function isTextEntryFocused(): boolean;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Whether the user is typing into a text field, for a document-level shortcut
3
+ * that must leave that field's own keys alone: ctrl+z undoing typing rather
4
+ * than the session, ctrl+arrow moving the caret rather than the view. A
5
+ * `<textarea>` counts, which the multiline config and JSON editors render.
6
+ */
7
+ export function isTextEntryFocused() {
8
+ const el = document.activeElement;
9
+ if (!(el instanceof HTMLElement)) {
10
+ return false;
11
+ }
12
+ const tag = el.tagName.toUpperCase();
13
+ // coerced: isContentEditable is declared boolean but is undefined in jsdom,
14
+ // so the raw expression returns undefined for an ordinary focused element
15
+ return tag === 'INPUT' || tag === 'TEXTAREA' || !!el.isContentEditable;
16
+ }
package/esm/util/jexl.js CHANGED
@@ -1,23 +1,10 @@
1
1
  import { Jexl } from '@jbrowse/jexl';
2
+ import { categoricalColor } from '../ui/colors.js';
2
3
  import { randomColor } from './color/index.js';
3
4
  import { colord } from './colord.js';
4
5
  import { jexlFeatureProxy, unwrapFeature } from './simpleFeature.js';
5
6
  export default function JexlF( /* config?: any*/) {
6
7
  const j = new Jexl();
7
- // Memoize compilation on the instance itself. A compiled Expression closes
8
- // over this instance's grammar (its registered functions), so the cache
9
- // belongs here and is naturally per-instance — there is no shared cache that
10
- // could bind an expression to the wrong instance's functions.
11
- const rawCompile = j.compile.bind(j);
12
- const cache = new Map();
13
- j.compile = (code) => {
14
- let expr = cache.get(code);
15
- if (expr === undefined) {
16
- expr = rawCompile(code);
17
- cache.set(code, expr);
18
- }
19
- return expr;
20
- };
21
8
  // someday will make sure all of configs callbacks are added in, including
22
9
  // ones passed in
23
10
  // below are core functions
@@ -31,15 +18,29 @@ export default function JexlF( /* config?: any*/) {
31
18
  return p ? jexlFeatureProxy(p) : undefined;
32
19
  });
33
20
  j.addFunction('id', (feature) => unwrapFeature(feature).id());
21
+ /**
22
+ * #jexlFunction Feature operations - getInherited | getInherited(feature, 'gene_biotype') | the attribute from the feature, or from its nearest ancestor that has it, so a CDS reads its gene's value
23
+ */
24
+ j.addFunction('getInherited', (feature, name) => {
25
+ let cur = unwrapFeature(feature);
26
+ while (cur !== undefined) {
27
+ const value = cur.get(name);
28
+ if (value !== undefined) {
29
+ return value;
30
+ }
31
+ cur = cur.parent?.();
32
+ }
33
+ return undefined;
34
+ });
34
35
  // let user cast a jexl type into a javascript type
35
36
  j.addFunction('cast', (arg) => arg);
36
- // math
37
- // addfunction added in jexl 2.3 but types/jexl still on 2.2
38
- /** #jexlFunction Math functions | max(0, 2) */
39
- j.addFunction('max', Math.max);
40
- /** #jexlFunction Math functions | min(0, 2) */
41
- j.addFunction('min', Math.min);
42
- /** #jexlFunction Math functions | sqrt(4) */
37
+ // jexl's own list-aware min and max take varargs too; a Math.min
38
+ // registration would replace them
39
+ /**
40
+ * #jexlFunction Math functions | max(0, 2)
41
+ * #jexlFunction Math functions | min(feature.INFO.AF)
42
+ * #jexlFunction Math functions | sqrt(4)
43
+ */
43
44
  j.addFunction('sqrt', Math.sqrt);
44
45
  /** #jexlFunction Math functions | ceil(0.5) */
45
46
  j.addFunction('ceil', Math.ceil);
@@ -148,6 +149,8 @@ export default function JexlF( /* config?: any*/) {
148
149
  // color helpers
149
150
  /** #jexlFunction Color functions | randomColor(feature.type) | deterministic color from a string (e.g. a feature type) */
150
151
  j.addFunction('randomColor', randomColor);
152
+ /** #jexlFunction Color functions | categoricalColor(getInherited(feature, 'biotype'), ['protein_coding']) | a palette color per value: the values listed take the palette (an optional third argument) in order, any other value a stable color no listed value paints, a missing one grey */
153
+ j.addFunction('categoricalColor', categoricalColor);
151
154
  // These take and return CSS color *strings*, not Colord objects: a config
152
155
  // `jexl:` expression has no way to construct a Colord, and a color slot
153
156
  // holding one resolves to the invalid-color sentinel rather than a color. So
@@ -0,0 +1,89 @@
1
+ import type { AstNode, Subject } from '@jbrowse/jexl';
2
+ export type JexlFilterFieldType = 'number' | 'text' | 'flag';
3
+ export type JexlFilterField = {
4
+ label: string;
5
+ /** unset for a field whose values may be numbers or text */
6
+ type?: JexlFilterFieldType;
7
+ group?: string;
8
+ description?: string;
9
+ /** holds several values per feature, so a comparison asks whether any does */
10
+ multi?: boolean;
11
+ values?: string[];
12
+ } & ({
13
+ path: string[];
14
+ } | {
15
+ call: string;
16
+ });
17
+ export interface FieldChoice {
18
+ key: string;
19
+ label: string;
20
+ type?: JexlFilterFieldType;
21
+ subject: Subject;
22
+ group?: string;
23
+ description?: string;
24
+ multi?: boolean;
25
+ values?: string[];
26
+ }
27
+ export type RowOp = '>' | '>=' | '<' | '<=' | '==' | '!=' | 'in' | '~' | 'set' | '!set';
28
+ export declare const OPERATORS: Record<JexlFilterFieldType | 'any', {
29
+ op: RowOp;
30
+ label: string;
31
+ }[]>;
32
+ export interface ConditionRow {
33
+ kind: 'condition';
34
+ id: number;
35
+ line?: number;
36
+ field?: FieldChoice;
37
+ op: RowOp;
38
+ value: string | string[];
39
+ }
40
+ export interface TextRow {
41
+ kind: 'text';
42
+ id: number;
43
+ line?: number;
44
+ text: string;
45
+ }
46
+ export type FilterRow = ConditionRow | TextRow;
47
+ /**
48
+ * Rows keep the index of the stored line they came from until one of that
49
+ * line's rows changes, so an untouched line is written back byte-identical.
50
+ */
51
+ export interface FilterRows {
52
+ lines: readonly string[];
53
+ rows: FilterRow[];
54
+ }
55
+ interface Parser {
56
+ parse: (text: string) => AstNode | null;
57
+ }
58
+ export declare function resolveFields(fields: readonly JexlFilterField[]): {
59
+ key: string;
60
+ label: string;
61
+ type: JexlFilterFieldType | undefined;
62
+ group: string | undefined;
63
+ description: string | undefined;
64
+ multi: boolean | undefined;
65
+ values: string[] | undefined;
66
+ subject: Subject;
67
+ }[];
68
+ /**
69
+ * The columns an adapter's metadata describes as `{column: description}`, as
70
+ * a BigBed's autoSql does, less those `fields` already lists. Any other
71
+ * metadata describes none.
72
+ */
73
+ export declare function describedColumns(metadata: unknown, fields: readonly JexlFilterField[]): JexlFilterField[];
74
+ /** A field typed into the picker rather than chosen, read as a dotted path. */
75
+ export declare function typedField(text: string): FieldChoice;
76
+ export declare function stripJexlPrefix(line: string): string;
77
+ export declare function readFilterRows(lines: readonly string[], parser: Parser, choices: readonly FieldChoice[]): FilterRows;
78
+ export declare function addRow(state: FilterRows): FilterRows;
79
+ export declare function replaceRow(state: FilterRows, row: FilterRow): FilterRows;
80
+ export declare function removeRow(state: FilterRows, id: number): FilterRows;
81
+ export declare function withField(row: ConditionRow, field: FieldChoice): ConditionRow;
82
+ export declare function withOp(row: ConditionRow, op: RowOp): ConditionRow;
83
+ /**
84
+ * The stored filters: an untouched line as it was, and every row of an edited
85
+ * line as a line of its own, which is equivalent because lines AND together.
86
+ * Rows left incomplete are dropped.
87
+ */
88
+ export declare function writeFilterRows({ lines, rows }: FilterRows): string[];
89
+ export {};
@@ -0,0 +1,252 @@
1
+ import { callSubject, conditions, pathSubject, print, printCondition, } from '@jbrowse/jexl';
2
+ import { JEXL_PREFIX, ensureJexlPrefix, isJexl } from './jexlStrings.js';
3
+ export const OPERATORS = {
4
+ number: [
5
+ { op: '>', label: '>' },
6
+ { op: '>=', label: '≥' },
7
+ { op: '<', label: '<' },
8
+ { op: '<=', label: '≤' },
9
+ { op: '==', label: '=' },
10
+ { op: '!=', label: '≠' },
11
+ ],
12
+ text: [
13
+ { op: '==', label: 'is' },
14
+ { op: '!=', label: 'is not' },
15
+ { op: 'in', label: 'is one of' },
16
+ { op: '~', label: 'matches' },
17
+ ],
18
+ flag: [
19
+ { op: 'set', label: 'is set' },
20
+ { op: '!set', label: 'is not set' },
21
+ ],
22
+ any: [
23
+ { op: '==', label: 'is' },
24
+ { op: '!=', label: 'is not' },
25
+ { op: '>', label: '>' },
26
+ { op: '>=', label: '≥' },
27
+ { op: '<', label: '<' },
28
+ { op: '<=', label: '≤' },
29
+ { op: 'in', label: 'is one of' },
30
+ { op: '~', label: 'matches' },
31
+ ],
32
+ };
33
+ const ROW = 'feature';
34
+ function subjectKey(subject) {
35
+ return JSON.stringify(subject.kind === 'path'
36
+ ? ['path', ...subject.path]
37
+ : ['call', subject.name, ...subject.args]);
38
+ }
39
+ export function resolveFields(fields) {
40
+ return fields.map(({ label, type, group, description, multi, values, ...source }) => {
41
+ const subject = 'call' in source
42
+ ? callSubject(ROW, source.call)
43
+ : pathSubject(ROW, source.path);
44
+ return {
45
+ key: subjectKey(subject),
46
+ label,
47
+ type,
48
+ group,
49
+ description,
50
+ multi,
51
+ values,
52
+ subject,
53
+ };
54
+ });
55
+ }
56
+ // a feature carries these as refName, start and end
57
+ const BED_LOCUS_COLUMNS = new Set(['chrom', 'chromStart', 'chromEnd']);
58
+ /**
59
+ * The columns an adapter's metadata describes as `{column: description}`, as
60
+ * a BigBed's autoSql does, less those `fields` already lists. Any other
61
+ * metadata describes none.
62
+ */
63
+ export function describedColumns(metadata, fields) {
64
+ const entries = metadata && typeof metadata === 'object' ? Object.entries(metadata) : [];
65
+ const listed = new Set(fields.map(field => field.label));
66
+ return entries.every((entry) => typeof entry[1] === 'string')
67
+ ? entries
68
+ .filter(([name]) => !listed.has(name) && !BED_LOCUS_COLUMNS.has(name))
69
+ .map(([name, description]) => ({
70
+ label: name,
71
+ path: [name],
72
+ description: description || undefined,
73
+ }))
74
+ : [];
75
+ }
76
+ /** A field typed into the picker rather than chosen, read as a dotted path. */
77
+ export function typedField(text) {
78
+ const subject = pathSubject(ROW, text.split('.'));
79
+ return { key: subjectKey(subject), label: text, subject };
80
+ }
81
+ export function stripJexlPrefix(line) {
82
+ return isJexl(line) ? line.slice(JEXL_PREFIX.length) : line;
83
+ }
84
+ /** A field of no known type writes a value that reads as a number as one. */
85
+ function scalar(type, text) {
86
+ const number = Number(text);
87
+ return type === 'number' ||
88
+ (!type && text.trim() !== '' && Number.isFinite(number))
89
+ ? number
90
+ : text;
91
+ }
92
+ function subjectLabel(subject) {
93
+ return subject.kind === 'path'
94
+ ? subject.path
95
+ .map((key, i) => typeof key === 'number' ? `[${key}]` : i === 0 ? key : `.${key}`)
96
+ .join('')
97
+ : print(subject.node);
98
+ }
99
+ function conditionRow(c, choices, id, line) {
100
+ const value = 'value' in c ? c.value : undefined;
101
+ const key = subjectKey(c.subject);
102
+ const field = choices.find(f => f.key === key) ?? {
103
+ key,
104
+ label: subjectLabel(c.subject),
105
+ type: value === undefined ? 'flag' : undefined,
106
+ subject: c.subject,
107
+ };
108
+ const op = c.op;
109
+ const values = value === undefined ? [] : [value].flat();
110
+ const writesBack = (v) => op === '~' ? typeof v === 'string' : scalar(field.type, String(v)) === v;
111
+ return OPERATORS[field.type ?? 'any'].some(o => o.op === op) &&
112
+ values.every(writesBack)
113
+ ? {
114
+ kind: 'condition',
115
+ id,
116
+ line,
117
+ field,
118
+ op,
119
+ value: Array.isArray(value) ? value.map(String) : String(value ?? ''),
120
+ }
121
+ : undefined;
122
+ }
123
+ function parseConditions(text, parser, calls) {
124
+ try {
125
+ return conditions(parser.parse(text), {
126
+ row: ROW,
127
+ accessors: { get: [] },
128
+ calls,
129
+ });
130
+ }
131
+ catch {
132
+ return undefined;
133
+ }
134
+ }
135
+ export function readFilterRows(lines, parser, choices) {
136
+ const calls = choices.flatMap(f => f.subject.kind === 'call' ? [f.subject.name] : []);
137
+ const rows = [];
138
+ for (const [line, stored] of lines.entries()) {
139
+ const text = stripJexlPrefix(stored);
140
+ const id = rows.length;
141
+ const read = parseConditions(text, parser, calls)?.map((c, i) => conditionRow(c, choices, id + i, line));
142
+ rows.push(...(read?.every(row => row !== undefined)
143
+ ? read
144
+ : [{ kind: 'text', id, line, text: text.trim() }]));
145
+ }
146
+ return { lines, rows };
147
+ }
148
+ function nextId(rows) {
149
+ return rows.reduce((max, row) => Math.max(max, row.id + 1), 0);
150
+ }
151
+ function emptyRow(id) {
152
+ return { kind: 'condition', id, op: '==', value: '' };
153
+ }
154
+ export function addRow(state) {
155
+ return { ...state, rows: [...state.rows, emptyRow(nextId(state.rows))] };
156
+ }
157
+ function detach(rows, id) {
158
+ const line = rows.find(row => row.id === id)?.line;
159
+ return line === undefined
160
+ ? rows
161
+ : rows.map(row => (row.line === line ? { ...row, line: undefined } : row));
162
+ }
163
+ export function replaceRow(state, row) {
164
+ return {
165
+ ...state,
166
+ rows: detach(state.rows, row.id).map(r => r.id === row.id ? { ...row, line: undefined } : r),
167
+ };
168
+ }
169
+ export function removeRow(state, id) {
170
+ return {
171
+ ...state,
172
+ rows: detach(state.rows, id).filter(row => row.id !== id),
173
+ };
174
+ }
175
+ export function withField(row, field) {
176
+ const sameType = row.field?.type === field.type;
177
+ const ops = OPERATORS[field.type ?? 'any'];
178
+ return {
179
+ ...row,
180
+ field,
181
+ op: sameType ? row.op : ops[0].op,
182
+ value: sameType ? row.value : '',
183
+ };
184
+ }
185
+ export function withOp(row, op) {
186
+ const { value } = row;
187
+ return {
188
+ ...row,
189
+ op,
190
+ value: op === 'in'
191
+ ? Array.isArray(value)
192
+ ? value
193
+ : value
194
+ ? [value]
195
+ : []
196
+ : Array.isArray(value)
197
+ ? (value[0] ?? '')
198
+ : value,
199
+ };
200
+ }
201
+ function writeCondition({ field, op, value }) {
202
+ if (!field) {
203
+ return undefined;
204
+ }
205
+ const { subject, type } = field;
206
+ const usable = (v) => v.trim() !== '' && (type !== 'number' || Number.isFinite(Number(v)));
207
+ if (op === 'set' || op === '!set') {
208
+ return printCondition({ subject, op });
209
+ }
210
+ if (op === 'in') {
211
+ const list = [value].flat().filter(usable);
212
+ return list.length > 0
213
+ ? printCondition({
214
+ subject,
215
+ op,
216
+ value: list.map(v => scalar(type, v)),
217
+ })
218
+ : undefined;
219
+ }
220
+ const text = [value].flat()[0] ?? '';
221
+ return !usable(text)
222
+ ? undefined
223
+ : op === '~'
224
+ ? printCondition({ subject, op, value: text })
225
+ : printCondition({ subject, op, value: scalar(type, text) });
226
+ }
227
+ function writeRow(row) {
228
+ const text = row.kind === 'text' ? row.text.trim() || undefined : writeCondition(row);
229
+ return text === undefined ? undefined : ensureJexlPrefix(text);
230
+ }
231
+ /**
232
+ * The stored filters: an untouched line as it was, and every row of an edited
233
+ * line as a line of its own, which is equivalent because lines AND together.
234
+ * Rows left incomplete are dropped.
235
+ */
236
+ export function writeFilterRows({ lines, rows }) {
237
+ const out = [];
238
+ let previous;
239
+ for (const row of rows) {
240
+ if (row.line === undefined) {
241
+ const text = writeRow(row);
242
+ if (text !== undefined) {
243
+ out.push(text);
244
+ }
245
+ }
246
+ else if (row.line !== previous) {
247
+ out.push(lines[row.line]);
248
+ }
249
+ previous = row.line;
250
+ }
251
+ return out;
252
+ }