@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,13 +1,13 @@
1
1
  import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
2
2
  interface InitAutorunHost<T> extends IStateTreeNode {
3
- init?: T;
4
- setInit: (init?: T) => void;
3
+ pendingLaunch?: T;
4
+ setLaunch: (launch?: T) => void;
5
5
  setError: (error: unknown) => void;
6
6
  }
7
7
  export interface InitApplyContext {
8
8
  /**
9
9
  * True once this init can no longer be the one being applied: the node is
10
- * gone, or a newer `setInit` has replaced it. Any mid-apply wait that can
10
+ * gone, or a newer `setLaunch` has replaced it. Any mid-apply wait that can
11
11
  * park indefinitely must fold this into its condition — an unbounded wait on
12
12
  * state that never arrives holds the drain open, and the newer init that
13
13
  * would have superseded it is exactly what gets stranded. This is the causal
@@ -26,35 +26,36 @@ interface InitAutorunOptions<T> {
26
26
  */
27
27
  ready: () => boolean;
28
28
  /**
29
- * Whether the view has materialized — the same line each view's
30
- * postProcessSnapshot draws for persistence (dotplot: assemblyNames set;
31
- * synteny: rows built). Decides the failure policy, see below.
29
+ * Whether the view has materialized — the line `withLaunchInput`'s
30
+ * `materialized` draws for persistence, read from the live node (dotplot:
31
+ * assemblyNames set; synteny: rows built). Decides the failure policy, see
32
+ * below.
32
33
  */
33
34
  materialized: () => boolean;
34
35
  /** Apply one init blob. Owns the ordered steps; never clears `init`. */
35
36
  apply: (init: T, ctx: InitApplyContext) => Promise<void>;
36
37
  }
37
38
  /**
38
- * The init state machine shared by the views that take a declarative `init`
39
+ * The launch state machine shared by the views that take a declarative launch
39
40
  * blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
40
41
  * the readiness gate, the serialized drain, the identity-checked clear, the
41
42
  * isAlive guards, and one failure policy.
42
43
  *
43
- * The failure policy keys off `materialized`, the same line each view's
44
- * postProcessSnapshot already draws for persistence:
44
+ * The failure policy keys off `materialized`, the same line `withLaunchInput`
45
+ * draws for persistence:
45
46
  *
46
- * - Not materialized — nothing is on screen and `init` is still persisted, so
47
+ * - Not materialized — nothing is on screen and `launch` is still persisted, so
47
48
  * keep it for a reload retry and `setError`. That flips the view onto its
48
49
  * import form, which renders the error in its own banner; a snackbar would
49
50
  * state the same failure twice and the banner is the one that persists.
50
51
  * - Materialized — the view works, so a later failure is one sub-step's
51
52
  * problem and must not take the view down with it. `setError` would, since
52
53
  * showImportForm keys off `error` alone and would discard rows that loaded
53
- * fine, so report it as a snackbar instead. Clearing `init` is also what
54
+ * fine, so report it as a snackbar instead. Clearing `launch` is also what
54
55
  * disarms the re-fire: `ready` usually folds in the measured width, so
55
- * leaving it set lets any resize re-run `apply` over a half-applied init.
56
+ * leaving it set lets any resize re-run `apply` over a half-applied blob.
56
57
  *
57
- * `apply` therefore never clears `init` and never catches for reporting — it
58
+ * `apply` therefore never clears `launch` and never catches for reporting — it
58
59
  * catches only the failures it wants to keep going through (a bad locstring in
59
60
  * one row), and everything it lets escape is fatal-as-of-that-point.
60
61
  */
@@ -1,19 +1,19 @@
1
1
  import { addDisposer, isAlive } from '@jbrowse/mobx-state-tree';
2
2
  import { autorun } from 'mobx';
3
3
  import { getNotificationSink } from './sessionServices.js';
4
- // Clear only when `init` is still the exact object we applied. A setInit that
5
- // lands while `apply` is awaiting (React StrictMode remounts, a programmatic
6
- // re-launch) swaps in a new object; clearing unconditionally would silently
7
- // drop that pending init. Leaving it lets the drain loop apply it next.
4
+ // Clear only when the pending blob is still the exact object we applied. A
5
+ // setLaunch that lands while `apply` is awaiting (React StrictMode remounts, a
6
+ // programmatic re-launch) swaps in a new object; clearing unconditionally would
7
+ // silently drop it. Leaving it lets the drain loop apply it next.
8
8
  function clearIfUnchanged(self, init) {
9
- if (isAlive(self) && self.init === init) {
10
- self.setInit(undefined);
9
+ if (isAlive(self) && self.pendingLaunch === init) {
10
+ self.setLaunch(undefined);
11
11
  }
12
12
  }
13
13
  async function applyInitOnce(self, init, { apply, materialized }) {
14
14
  try {
15
15
  await apply(init, {
16
- superseded: () => !isAlive(self) || self.init !== init,
16
+ superseded: () => !isAlive(self) || self.pendingLaunch !== init,
17
17
  });
18
18
  clearIfUnchanged(self, init);
19
19
  }
@@ -34,7 +34,7 @@ async function applyInitOnce(self, init, { apply, materialized }) {
34
34
  }
35
35
  }
36
36
  function currentInit(self, { ready }) {
37
- return isAlive(self) && ready() ? self.init : undefined;
37
+ return isAlive(self) && ready() ? self.pendingLaunch : undefined;
38
38
  }
39
39
  // Apply pending inits one at a time until none remain. Serializing (rather
40
40
  // than letting the autorun run `apply` concurrently) is what keeps re-entrant
@@ -47,32 +47,32 @@ async function drainInit(self, opts) {
47
47
  while (pending !== undefined) {
48
48
  await applyInitOnce(self, pending, opts);
49
49
  const next = currentInit(self, opts);
50
- // a fatal failure keeps `init` for a reload retry; the same object still
50
+ // a fatal failure keeps `launch` for a reload retry; the same object still
51
51
  // sitting there means it was not consumed, so stop rather than spin on it
52
52
  pending = next === pending ? undefined : next;
53
53
  }
54
54
  }
55
55
  /**
56
- * The init state machine shared by the views that take a declarative `init`
56
+ * The launch state machine shared by the views that take a declarative launch
57
57
  * blob (LinearGenomeView, DotplotView, LinearSyntenyView): the re-entry guard,
58
58
  * the readiness gate, the serialized drain, the identity-checked clear, the
59
59
  * isAlive guards, and one failure policy.
60
60
  *
61
- * The failure policy keys off `materialized`, the same line each view's
62
- * postProcessSnapshot already draws for persistence:
61
+ * The failure policy keys off `materialized`, the same line `withLaunchInput`
62
+ * draws for persistence:
63
63
  *
64
- * - Not materialized — nothing is on screen and `init` is still persisted, so
64
+ * - Not materialized — nothing is on screen and `launch` is still persisted, so
65
65
  * keep it for a reload retry and `setError`. That flips the view onto its
66
66
  * import form, which renders the error in its own banner; a snackbar would
67
67
  * state the same failure twice and the banner is the one that persists.
68
68
  * - Materialized — the view works, so a later failure is one sub-step's
69
69
  * problem and must not take the view down with it. `setError` would, since
70
70
  * showImportForm keys off `error` alone and would discard rows that loaded
71
- * fine, so report it as a snackbar instead. Clearing `init` is also what
71
+ * fine, so report it as a snackbar instead. Clearing `launch` is also what
72
72
  * disarms the re-fire: `ready` usually folds in the measured width, so
73
- * leaving it set lets any resize re-run `apply` over a half-applied init.
73
+ * leaving it set lets any resize re-run `apply` over a half-applied blob.
74
74
  *
75
- * `apply` therefore never clears `init` and never catches for reporting — it
75
+ * `apply` therefore never clears `launch` and never catches for reporting — it
76
76
  * catches only the failures it wants to keep going through (a bad locstring in
77
77
  * one row), and everything it lets escape is fatal-as-of-that-point.
78
78
  */
@@ -93,7 +93,7 @@ export function installInitAutorun(self, opts) {
93
93
  // reading a detached node throws — here into an unawaited promise.
94
94
  const alive = isAlive(self);
95
95
  const isReady = alive && opts.ready();
96
- const init = alive ? self.init : undefined;
96
+ const init = alive ? self.pendingLaunch : undefined;
97
97
  if (isReady && init !== undefined && !draining) {
98
98
  draining = true;
99
99
  try {
@@ -0,0 +1,115 @@
1
+ import type { StatusReporter } from './createAbortRotation.ts';
2
+ import type { FetchContext } from './fetchContext.ts';
3
+ import type { FetchSkeletonHost } from './installFetch.ts';
4
+ /**
5
+ * What a prerequisite read needs of the display it runs on, beside the
6
+ * skeleton's own three. Duck-typed rather than a foundation's `Instance` type,
7
+ * because the hosts compose different foundations — one per fetch family, and
8
+ * the comparative displays compose none of them — and this is the only thing
9
+ * they have in common.
10
+ */
11
+ export interface PrerequisiteFetchHost extends FetchSkeletonHost {
12
+ /**
13
+ * Read in `prepare`, so it is **tracked**: an adapter edited in the config
14
+ * editor has to re-read, and `run`'s own reads are untracked by contract.
15
+ */
16
+ adapterConfig: Record<string, unknown>;
17
+ isMinimized: boolean;
18
+ }
19
+ /**
20
+ * A prerequisite read's answer, stamped with the adapter config it answers.
21
+ * A display holds the latest one and reads it through `readFor`, so an answer
22
+ * never outlives its adapter config and no failure path has to clear it.
23
+ */
24
+ export interface AdapterRead<T> {
25
+ adapterConfig: Record<string, unknown>;
26
+ value: T;
27
+ }
28
+ /**
29
+ * `read`'s value while it answers the adapter config `host` holds; undefined
30
+ * until a read of that config commits, which a failed read never does.
31
+ *
32
+ * Equal by value, as the fetch key is: an undo rebuilds the track's config,
33
+ * handing back an equal adapter config the fetch declines to read again.
34
+ */
35
+ export declare function readFor<T>(host: {
36
+ adapterConfig: Record<string, unknown>;
37
+ }, read: AdapterRead<T> | undefined): T | undefined;
38
+ /**
39
+ * A **prerequisite read**: one RPC about the adapter itself, beside the
40
+ * display's primary fetch. Four in the tree — HiC's `CoreGetInfo` header read,
41
+ * whose `resolutions` every contacts fetch waits on; the multi-sample sample
42
+ * list, which `fetchNeeded` declines until; the tiered alignment file's
43
+ * `CoreGetInfo` header, which decides the LOD tier a synteny fetch asks for;
44
+ * and the mark display's source list, which gives each listed source a row —
45
+ * and they sit on three different fetch foundations, which is why this sits in
46
+ * core beside the skeleton and not beside any of them.
47
+ *
48
+ * They had the shape below hand-copied, comment for comment, and each term is a
49
+ * rule rather than a preference:
50
+ *
51
+ * - **the adapter config is the whole trigger and the whole key.** Tracked in
52
+ * `prepare` so a config-editor edit re-reads; keyed on the same value so an
53
+ * un-minimize over the same file re-reads nothing. Getting one without the
54
+ * other gives either a stale header or a walk of a `.hic` norm-vector index on
55
+ * every expand.
56
+ * - **the answer carries the same key** (`AdapterRead`), and a display reads
57
+ * it through `readFor`, so an answer to a previous adapter config is never
58
+ * read as the current one, and a failed read leaves nothing to clear.
59
+ * - **an answer to a config the display no longer holds is dropped**, and so is
60
+ * its error. An undo that brings back the config already answered makes the
61
+ * skeleton decline a re-read, while the read of the abandoned config runs
62
+ * on, still current; landing, it would stamp its key, force a second read of
63
+ * the held one and hand the display a list for another file, on which the
64
+ * variant display resets its arrangement.
65
+ * - **minimized is the gate**, and a display with a second condition of its own
66
+ * passes `gate` — the sample-list read waits for the LGV to be measured as
67
+ * well, so a full-file scan does not start ahead of the display's own first
68
+ * fetch, and the tier read waits on the track declaring a tier threshold at
69
+ * all.
70
+ * - **no `contract`.** This is the second fetch on a display whose foundation
71
+ * installed both checks already: `assertDisplayContract` would report the
72
+ * double-attach it exists to catch, and a second retry check would consume the
73
+ * same `reloadCounter` bumps as the first.
74
+ * - **where the status goes is the caller's** (`report`). The two LGV reads
75
+ * lend the display's own status window, so the read takes a slot beside the
76
+ * primary fetch rather than opening a second writer over the one status field
77
+ * (ADR-081) — and it matters more here than for most fetches: a prerequisite
78
+ * runs inside the pre-first-paint window, where the scrim is up because
79
+ * nothing is drawn rather than because `isLoading` is, so `statusMessage` is
80
+ * the only thing that can say what is happening. The tier read narrates
81
+ * nothing; a header is not a load.
82
+ *
83
+ * `createAdapterMetadataFetch` keys on the same adapter config and is
84
+ * deliberately NOT one of these: no trigger, no signal and no status,
85
+ * because it is fetched lazily when a details widget opens and the widget opens
86
+ * on the result. A prerequisite read is the one a display's own fetch waits on.
87
+ *
88
+ * **A declaration, not the skeleton this name used to be.** There was an
89
+ * `installPrerequisiteFetch` until 2026-08-23, and `3c5aa7fce2` deleted it for
90
+ * a good reason: it carried a `runOne` of its own — a fifth copy of begin →
91
+ * clear → run → commit-if-current → `handleFetchError` → end — and once
92
+ * `installFetch` owned that sequence, a second one was pure drift surface. This
93
+ * one adds no sequence, no rotation and no error rule; it is terms handed to
94
+ * `installFetch`, the same shape `installGlobalFetchAutorun` and
95
+ * `installComparativeFetchAutorun` are. Add nothing here that a family could
96
+ * not state as an option to the skeleton.
97
+ *
98
+ * Everything the skeleton gives it is the point of going through the skeleton:
99
+ * the latest-wins rotation (so a superseding read aborts the one it replaced,
100
+ * and only a superseding read does — a user cancel of the primary fetch cannot
101
+ * strand the display the way sharing its signal would), the clear at the start,
102
+ * the currency-guarded error rule, the unconditional `reloadCounter` read that
103
+ * makes the chrome's Retry re-run this, and the retired status slot that keeps a
104
+ * failed read from leaving a progress chip up for good.
105
+ */
106
+ export declare function installPrerequisiteFetch<TResult>(self: PrerequisiteFetchHost, { name, delay, report, gate, run, commit, setError, }: {
107
+ name: string;
108
+ delay: number;
109
+ report: StatusReporter;
110
+ /** an extra term of the display's own, ANDed under `!isMinimized` */
111
+ gate?: () => boolean;
112
+ run: (adapterConfig: Record<string, unknown>, ctx: FetchContext) => Promise<TResult | undefined>;
113
+ commit: (read: AdapterRead<TResult>) => void;
114
+ setError: (error?: unknown) => void;
115
+ }): void;
@@ -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
+ }
@@ -28,10 +28,15 @@ export function mergeIntervals(intervals, padding = 5000) {
28
28
  * features. `padding` carries the same per-side meaning.
29
29
  */
30
30
  export function gatherOverlaps(regions, padding = 5000) {
31
- const memo = {};
31
+ const memo = new Map();
32
32
  for (const x of regions) {
33
- memo[x.refName] ??= [];
34
- memo[x.refName].push(x);
33
+ const group = memo.get(x.refName);
34
+ if (group) {
35
+ group.push(x);
36
+ }
37
+ else {
38
+ memo.set(x.refName, [x]);
39
+ }
35
40
  }
36
- return Object.values(memo).flatMap(group => mergeIntervals(group, padding));
41
+ return [...memo.values()].flatMap(group => mergeIntervals(group, padding));
37
42
  }
@@ -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;
@@ -69,7 +77,9 @@ export function openLocation(location, pluginManager) {
69
77
  if (!file) {
70
78
  throw new Error(`file ("${location.name}") requires permission. Please reopen the file from track settings`);
71
79
  }
72
- return new CachedFilehandle(new BlobFile(file), `filehandle://${location.handleId}`);
80
+ // A File is a snapshot: the handle yields a new one once the file changes
81
+ // on disk, and its chunks must not be the old snapshot's
82
+ return new CachedFilehandle(new BlobFile(file), `filehandle://${location.handleId}@${file.lastModified}:${file.size}`);
73
83
  }
74
84
  if (isUriLocation(location)) {
75
85
  // Check for empty string
@@ -82,14 +92,11 @@ export function openLocation(location, pluginManager) {
82
92
  // a config that names its files relative to itself found no account at all
83
93
  // and read every one of them unauthenticated.
84
94
  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);
95
+ // A file: URI or a bare absolute path names a file on this machine. A
96
+ // config.json opened from disk resolves `uri: 'reads.bam'` against its own
97
+ // directory to file:///dir/reads.bam, and a session built over MCP writes
98
+ // `uri: '/dir/reads.bam'` with no baseUri at all; fetched, either is a 404.
99
+ const localPath = uriToLocalPath(absoluteLocation.uri);
93
100
  if (localPath !== undefined && (isNode || isElectron)) {
94
101
  return openLocation({ localPath, locationType: 'LocalPathLocation' });
95
102
  }
@@ -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