@jbrowse/core 4.3.0 → 5.0.0-beta.2

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 (1140) hide show
  1. package/README.md +822 -0
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +13 -3
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +33 -22
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +8 -3
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +117 -19
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.d.ts +2 -8
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseAttributes.js +4 -4
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.d.ts +1 -1
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +2 -2
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.d.ts +1 -1
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCoreDetails.js +4 -4
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +1 -1
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +12 -5
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +28 -17
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.d.ts +1 -1
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/DataGridDetails.js +19 -40
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +6 -4
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +46 -30
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.d.ts +20 -0
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureWash.js +66 -0
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.d.ts +1 -1
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldName.js +2 -2
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.d.ts +3 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +17 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +1 -1
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +3 -9
  28. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  29. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +3 -3
  30. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.d.ts +3 -2
  31. package/esm/BaseFeatureWidget/BaseFeatureDetail/UriField.js +7 -14
  32. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +2 -1
  33. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +19 -13
  34. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +5 -4
  35. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +8 -1
  36. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +32 -10
  37. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.d.ts +18 -0
  38. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceBody.js +10 -0
  39. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.d.ts +7 -4
  40. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +62 -24
  41. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.d.ts +10 -5
  42. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeatureDetails.js +64 -41
  43. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +1 -1
  44. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.js +17 -8
  45. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.d.ts +6 -0
  46. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceLegend.js +19 -0
  47. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.d.ts +5 -4
  48. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +15 -18
  49. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.d.ts +1 -1
  50. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequencePanel.js +33 -17
  51. package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.d.ts +3 -3
  52. package/esm/BaseFeatureWidget/SequenceFeatureDetails/consts.js +7 -3
  53. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.d.ts +11 -0
  54. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/FeatureSequenceDialog.js +29 -0
  55. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.d.ts +1 -1
  56. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/HelpDialog.js +4 -6
  57. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.d.ts +18 -6
  58. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceDialog.js +11 -29
  59. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.d.ts +9 -2
  60. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceFeatureMenu.js +63 -58
  61. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.d.ts +7 -3
  62. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SequenceTypeSelector.js +38 -51
  63. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.d.ts +1 -1
  64. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/SettingsDialog.js +19 -27
  65. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.d.ts +6 -0
  66. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +18 -0
  67. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.d.ts +12 -0
  68. package/esm/BaseFeatureWidget/SequenceFeatureDetails/featureTypeUtil.js +97 -0
  69. package/esm/BaseFeatureWidget/SequenceFeatureDetails/index.js +1 -1
  70. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +50 -63
  71. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +62 -59
  72. package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.d.ts +21 -0
  73. package/esm/BaseFeatureWidget/SequenceFeatureDetails/panelAssemblyName.js +24 -0
  74. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.d.ts +5 -3
  75. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDNASequence.js +93 -75
  76. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.d.ts +1 -1
  77. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/CDSSequence.js +4 -11
  78. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.d.ts +5 -2
  79. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/GenomicSequence.js +21 -48
  80. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.d.ts +8 -0
  81. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/PlainSequence.js +20 -0
  82. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.d.ts +6 -3
  83. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/ProteinSequence.js +33 -13
  84. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.d.ts +7 -4
  85. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/SequenceDisplay.js +67 -11
  86. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.d.ts +14 -0
  87. package/esm/BaseFeatureWidget/SequenceFeatureDetails/seqtypes/renderSequenceSegments.js +42 -0
  88. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +1 -1
  89. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +7 -7
  90. package/esm/BaseFeatureWidget/SequenceFeatureDetails/types.d.ts +8 -1
  91. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.d.ts +9 -9
  92. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +28 -44
  93. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.d.ts +23 -0
  94. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceFetch.js +31 -0
  95. package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.d.ts +90 -1
  96. package/esm/BaseFeatureWidget/SequenceFeatureDetails/util.js +145 -23
  97. package/esm/BaseFeatureWidget/configSchema.js +1 -1
  98. package/esm/BaseFeatureWidget/formatDetails.d.ts +38 -0
  99. package/esm/BaseFeatureWidget/formatDetails.js +103 -0
  100. package/esm/BaseFeatureWidget/index.d.ts +3 -1
  101. package/esm/BaseFeatureWidget/index.js +2 -2
  102. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +80 -62
  103. package/esm/BaseFeatureWidget/stateModelFactory.js +128 -29
  104. package/esm/BaseFeatureWidget/types.d.ts +4 -3
  105. package/esm/BaseFeatureWidget/util.d.ts +4 -29
  106. package/esm/BaseFeatureWidget/util.js +20 -84
  107. package/esm/CorePlugin.js +11 -6
  108. package/esm/PhasedScheduler.d.ts +4 -2
  109. package/esm/PhasedScheduler.js +18 -2
  110. package/esm/Plugin.d.ts +6 -1
  111. package/esm/Plugin.js +7 -0
  112. package/esm/PluginLoader.d.ts +41 -40
  113. package/esm/PluginLoader.js +206 -78
  114. package/esm/PluginManager.d.ts +421 -55
  115. package/esm/PluginManager.js +461 -89
  116. package/esm/ReExports/BaseFeatureDetails.js +7 -6
  117. package/esm/ReExports/MuiDataGridReExports.d.ts +2 -2
  118. package/esm/ReExports/MuiDataGridReExports.js +58 -130
  119. package/esm/ReExports/MuiReExports.d.ts +3 -134
  120. package/esm/ReExports/MuiReExports.js +43 -16
  121. package/esm/ReExports/MuiStylesReExports.d.ts +66 -0
  122. package/esm/ReExports/MuiStylesReExports.js +55 -0
  123. package/esm/ReExports/index.js +1 -1
  124. package/esm/ReExports/lazify.d.ts +2 -2
  125. package/esm/ReExports/lazify.js +16 -3
  126. package/esm/ReExports/list.js +54 -229
  127. package/esm/ReExports/modules.js +62 -93
  128. package/esm/ReExports/muiComponentNames.d.ts +18 -0
  129. package/esm/ReExports/muiComponentNames.js +130 -0
  130. package/esm/ReExports/publicUtil.d.ts +1 -0
  131. package/esm/ReExports/publicUtil.js +28 -0
  132. package/esm/ReExports/registry.d.ts +2 -0
  133. package/esm/ReExports/registry.js +28 -0
  134. package/esm/ReExports/sharedModules.d.ts +96 -0
  135. package/esm/ReExports/sharedModules.js +59 -0
  136. package/esm/ReExports/uiStub.d.ts +1 -0
  137. package/esm/ReExports/uiStub.js +13 -0
  138. package/esm/ReExports/workerModules.d.ts +2 -0
  139. package/esm/ReExports/workerModules.js +10 -0
  140. package/esm/TextSearch/BaseResults.d.ts +20 -21
  141. package/esm/TextSearch/BaseResults.js +8 -33
  142. package/esm/TextSearch/TextSearchManager.d.ts +14 -34
  143. package/esm/TextSearch/TextSearchManager.js +87 -34
  144. package/esm/assemblyManager/assembly.d.ts +307 -34
  145. package/esm/assemblyManager/assembly.js +551 -262
  146. package/esm/assemblyManager/assemblyAdapters.d.ts +12 -0
  147. package/esm/assemblyManager/assemblyAdapters.js +18 -0
  148. package/esm/assemblyManager/assemblyConfigSchema.d.ts +192 -17
  149. package/esm/assemblyManager/assemblyConfigSchema.js +213 -19
  150. package/esm/assemblyManager/assemblyManager.d.ts +711 -303
  151. package/esm/assemblyManager/assemblyManager.js +351 -46
  152. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +32 -0
  153. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +85 -0
  154. package/esm/assemblyManager/geneticCodes.d.ts +21 -0
  155. package/esm/assemblyManager/geneticCodes.js +47 -0
  156. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +9 -0
  157. package/esm/assemblyManager/getSequenceAdapterConfig.js +12 -0
  158. package/esm/assemblyManager/index.d.ts +1 -1
  159. package/esm/assemblyManager/index.js +2 -2
  160. package/esm/assemblyManager/loadRefNameMap.d.ts +5 -0
  161. package/esm/assemblyManager/loadRefNameMap.js +80 -0
  162. package/esm/assemblyManager/refNameColors.d.ts +1 -0
  163. package/esm/assemblyManager/refNameColors.js +32 -0
  164. package/esm/assemblyManager/refNameMaps.d.ts +26 -0
  165. package/esm/assemblyManager/refNameMaps.js +87 -0
  166. package/esm/assemblyManager/refNameMismatch.d.ts +54 -0
  167. package/esm/assemblyManager/refNameMismatch.js +66 -0
  168. package/esm/checkPlugins.d.ts +11 -0
  169. package/esm/checkPlugins.js +77 -0
  170. package/esm/configuration/configurationSchema.d.ts +122 -20
  171. package/esm/configuration/configurationSchema.js +374 -140
  172. package/esm/configuration/configurationSlot.d.ts +283 -30
  173. package/esm/configuration/configurationSlot.js +205 -226
  174. package/esm/configuration/formatAboutConfigSchema.d.ts +55 -0
  175. package/esm/configuration/formatAboutConfigSchema.js +58 -0
  176. package/esm/configuration/formatDetailsConfigSchema.d.ts +80 -0
  177. package/esm/configuration/formatDetailsConfigSchema.js +90 -0
  178. package/esm/configuration/fullConfSnapshot.d.ts +28 -0
  179. package/esm/configuration/fullConfSnapshot.js +66 -0
  180. package/esm/configuration/getConf.d.ts +88 -0
  181. package/esm/configuration/getConf.js +74 -0
  182. package/esm/configuration/index.d.ts +19 -3
  183. package/esm/configuration/index.js +19 -2
  184. package/esm/configuration/mergeFormatCallbacks.d.ts +15 -0
  185. package/esm/configuration/mergeFormatCallbacks.js +24 -0
  186. package/esm/configuration/promotableDefaults.d.ts +199 -0
  187. package/esm/configuration/promotableDefaults.js +332 -0
  188. package/esm/configuration/promotablePin.d.ts +55 -0
  189. package/esm/configuration/promotableResolve.d.ts +108 -0
  190. package/esm/configuration/promotableResolve.js +117 -0
  191. package/esm/configuration/promotableSlots.d.ts +12 -0
  192. package/esm/configuration/promotableSlots.js +45 -0
  193. package/esm/configuration/readConfObject.d.ts +56 -0
  194. package/esm/configuration/readConfObject.js +161 -0
  195. package/esm/configuration/schemaRegistry.d.ts +35 -0
  196. package/esm/configuration/schemaRegistry.js +50 -0
  197. package/esm/configuration/schemaTypes.d.ts +23 -0
  198. package/esm/configuration/schemaTypes.js +94 -0
  199. package/esm/configuration/slotFacade.d.ts +82 -0
  200. package/esm/configuration/slotFacade.js +89 -0
  201. package/esm/configuration/slotShape.d.ts +12 -0
  202. package/esm/configuration/slotShape.js +84 -0
  203. package/esm/configuration/slotValueUtils.d.ts +17 -0
  204. package/esm/configuration/slotValueUtils.js +25 -0
  205. package/esm/configuration/tabixIndexFields.d.ts +44 -0
  206. package/esm/configuration/tabixIndexFields.js +45 -0
  207. package/esm/configuration/tabixShorthand.d.ts +34 -0
  208. package/esm/configuration/tabixShorthand.js +45 -0
  209. package/esm/configuration/types.d.ts +170 -7
  210. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +24 -10
  211. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +23 -15
  212. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +132 -7
  213. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +136 -25
  214. package/esm/data_adapters/BaseAdapter/BaseRefNameAliasAdapter.d.ts +1 -0
  215. package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.d.ts +13 -5
  216. package/esm/data_adapters/BaseAdapter/BaseSequenceAdapter.js +9 -7
  217. package/esm/data_adapters/BaseAdapter/BaseTextSearchAdapter.d.ts +2 -1
  218. package/esm/data_adapters/BaseAdapter/CytobandAdapter.d.ts +7 -0
  219. package/esm/data_adapters/BaseAdapter/RegionsAdapter.d.ts +2 -1
  220. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +29 -0
  221. package/esm/data_adapters/BaseAdapter/featureDensity.js +17 -0
  222. package/esm/data_adapters/BaseAdapter/getAdapterId.d.ts +2 -0
  223. package/esm/data_adapters/BaseAdapter/getAdapterId.js +9 -0
  224. package/esm/data_adapters/BaseAdapter/index.d.ts +7 -4
  225. package/esm/data_adapters/BaseAdapter/index.js +6 -5
  226. package/esm/data_adapters/BaseAdapter/stats.d.ts +37 -5
  227. package/esm/data_adapters/BaseAdapter/stats.js +89 -24
  228. package/esm/data_adapters/BaseAdapter/types.d.ts +11 -8
  229. package/esm/data_adapters/BaseAdapter/types.js +1 -0
  230. package/esm/data_adapters/BaseAdapter/util.d.ts +5 -1
  231. package/esm/data_adapters/BaseAdapter/util.js +14 -3
  232. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.d.ts +1 -1
  233. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +4 -4
  234. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +36 -4
  235. package/esm/data_adapters/CytobandAdapter/configSchema.js +46 -2
  236. package/esm/data_adapters/CytobandAdapter/index.js +3 -3
  237. package/esm/data_adapters/adapterSessionRefcount.d.ts +61 -0
  238. package/esm/data_adapters/adapterSessionRefcount.js +96 -0
  239. package/esm/data_adapters/dataAdapterCache.d.ts +35 -1
  240. package/esm/data_adapters/dataAdapterCache.js +62 -22
  241. package/esm/data_adapters/getFeatureAdapter.d.ts +22 -0
  242. package/esm/data_adapters/getFeatureAdapter.js +27 -0
  243. package/esm/data_adapters/getSequenceSubAdapter.d.ts +21 -0
  244. package/esm/data_adapters/getSequenceSubAdapter.js +44 -0
  245. package/esm/pluggableElementTypes/AdapterType.d.ts +52 -2
  246. package/esm/pluggableElementTypes/AdapterType.js +44 -5
  247. package/esm/pluggableElementTypes/AddTrackWorkflowType.d.ts +6 -1
  248. package/esm/pluggableElementTypes/AddTrackWorkflowType.js +3 -1
  249. package/esm/pluggableElementTypes/ConnectionType.d.ts +5 -5
  250. package/esm/pluggableElementTypes/ConnectionType.js +1 -1
  251. package/esm/pluggableElementTypes/DisplayType.d.ts +19 -10
  252. package/esm/pluggableElementTypes/DisplayType.js +53 -5
  253. package/esm/pluggableElementTypes/InternetAccountType.js +1 -1
  254. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +13 -0
  255. package/esm/pluggableElementTypes/PluggableElementBase.js +13 -0
  256. package/esm/pluggableElementTypes/RpcMethodType.d.ts +132 -12
  257. package/esm/pluggableElementTypes/RpcMethodType.js +263 -98
  258. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +19 -9
  259. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.js +26 -20
  260. package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.d.ts +5 -0
  261. package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegion.js +18 -0
  262. package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.d.ts +5 -0
  263. package/esm/pluggableElementTypes/RpcMethodTypeWithRenameRegions.js +10 -0
  264. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +3 -3
  265. package/esm/pluggableElementTypes/TextSearchAdapterType.js +3 -1
  266. package/esm/pluggableElementTypes/TrackType.d.ts +2 -1
  267. package/esm/pluggableElementTypes/TrackType.js +1 -1
  268. package/esm/pluggableElementTypes/ViewType.d.ts +27 -3
  269. package/esm/pluggableElementTypes/ViewType.js +84 -4
  270. package/esm/pluggableElementTypes/WidgetType.d.ts +2 -2
  271. package/esm/pluggableElementTypes/WidgetType.js +1 -1
  272. package/esm/pluggableElementTypes/addMenuItems.d.ts +87 -0
  273. package/esm/pluggableElementTypes/addMenuItems.js +82 -0
  274. package/esm/pluggableElementTypes/extendElementType.d.ts +30 -0
  275. package/esm/pluggableElementTypes/extendElementType.js +73 -0
  276. package/esm/pluggableElementTypes/index.d.ts +7 -7
  277. package/esm/pluggableElementTypes/index.js +24 -14
  278. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +70 -15
  279. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.js +90 -10
  280. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +646 -84
  281. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +241 -60
  282. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +216 -35
  283. package/esm/pluggableElementTypes/models/BaseTrackModel.js +365 -83
  284. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +216 -16
  285. package/esm/pluggableElementTypes/models/BaseViewModel.js +150 -16
  286. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +51 -0
  287. package/esm/pluggableElementTypes/models/HighlightsMixin.js +78 -0
  288. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +163 -29
  289. package/esm/pluggableElementTypes/models/InternetAccountModel.js +218 -48
  290. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +177 -0
  291. package/esm/pluggableElementTypes/models/assertDisplayContract.js +239 -0
  292. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -8
  293. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +18 -2
  294. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +39 -20
  295. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.js +23 -2
  296. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +181 -65
  297. package/esm/pluggableElementTypes/models/baseTrackConfig.js +191 -89
  298. package/esm/pluggableElementTypes/models/components/SaveTrackData.d.ts +3 -8
  299. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +113 -139
  300. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +55 -0
  301. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +83 -0
  302. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +40 -0
  303. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +115 -0
  304. package/esm/pluggableElementTypes/models/index.d.ts +6 -3
  305. package/esm/pluggableElementTypes/models/index.js +10 -8
  306. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +34 -0
  307. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +54 -0
  308. package/esm/pluggableElementTypes/models/saveTrackFileTypes/bed.js +75 -7
  309. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +9 -3
  310. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +153 -103
  311. package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.d.ts +6 -1
  312. package/esm/pluggableElementTypes/models/saveTrackFileTypes/gff3.js +70 -74
  313. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +9 -1
  314. package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.d.ts +21 -0
  315. package/esm/pluggableElementTypes/models/saveTrackFileTypes/util.js +51 -0
  316. package/esm/pluggableElementTypes/models/uriMatchesDomains.d.ts +29 -0
  317. package/esm/pluggableElementTypes/models/uriMatchesDomains.js +62 -0
  318. package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.d.ts +5 -4
  319. package/esm/pluggableElementTypes/renderers/util/serializableFilterChain.js +20 -10
  320. package/esm/pluginDefinitions.d.ts +198 -0
  321. package/esm/pluginDefinitions.js +220 -0
  322. package/esm/rpc/BaseRpcDriver.d.ts +27 -35
  323. package/esm/rpc/BaseRpcDriver.js +74 -107
  324. package/esm/rpc/MainThreadRpcDriver.d.ts +9 -10
  325. package/esm/rpc/MainThreadRpcDriver.js +18 -29
  326. package/esm/rpc/RpcClient.d.ts +38 -0
  327. package/esm/rpc/RpcClient.js +154 -0
  328. package/esm/rpc/RpcManager.d.ts +116 -27
  329. package/esm/rpc/RpcManager.js +177 -50
  330. package/esm/rpc/RpcRegistry.d.ts +275 -0
  331. package/esm/rpc/RpcRegistry.js +1 -0
  332. package/esm/rpc/RpcServer.d.ts +41 -0
  333. package/esm/rpc/RpcServer.js +235 -0
  334. package/esm/rpc/WebWorkerRpcDriver.d.ts +71 -24
  335. package/esm/rpc/WebWorkerRpcDriver.js +312 -27
  336. package/esm/rpc/byteBudget.d.ts +58 -0
  337. package/esm/rpc/byteBudget.js +50 -0
  338. package/esm/rpc/configSchema.d.ts +27 -5
  339. package/esm/rpc/configSchema.js +40 -16
  340. package/esm/rpc/coreRpcMethods.d.ts +3 -5
  341. package/esm/rpc/coreRpcMethods.js +10 -12
  342. package/esm/rpc/explainTransferError.d.ts +35 -0
  343. package/esm/rpc/explainTransferError.js +158 -0
  344. package/esm/rpc/methods/CoreFreeResources.d.ts +19 -4
  345. package/esm/rpc/methods/CoreFreeResources.js +17 -6
  346. package/esm/rpc/methods/CoreGetExportData.d.ts +5 -18
  347. package/esm/rpc/methods/CoreGetExportData.js +26 -15
  348. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  349. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  350. package/esm/rpc/methods/CoreGetFeatures.d.ts +6 -15
  351. package/esm/rpc/methods/CoreGetFeatures.js +15 -17
  352. package/esm/rpc/methods/CoreGetInfo.d.ts +6 -0
  353. package/esm/rpc/methods/CoreGetInfo.js +12 -0
  354. package/esm/rpc/methods/CoreGetMetadata.d.ts +4 -7
  355. package/esm/rpc/methods/CoreGetMetadata.js +6 -9
  356. package/esm/rpc/methods/CoreGetRefNames.d.ts +4 -8
  357. package/esm/rpc/methods/CoreGetRefNames.js +24 -13
  358. package/esm/rpc/methods/CoreGetRegionByteEstimate.d.ts +6 -0
  359. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +19 -0
  360. package/esm/rpc/methods/CoreGetRegions.d.ts +4 -6
  361. package/esm/rpc/methods/CoreGetRegions.js +6 -9
  362. package/esm/rpc/methods/CoreGetSequence.d.ts +4 -11
  363. package/esm/rpc/methods/CoreGetSequence.js +12 -13
  364. package/esm/rpc/serializeError/index.d.ts +9 -0
  365. package/esm/rpc/serializeError/index.js +86 -0
  366. package/esm/svg/SvgExport.d.ts +30 -0
  367. package/esm/svg/SvgExport.js +53 -0
  368. package/esm/svg/constants.d.ts +1 -0
  369. package/esm/svg/constants.js +5 -0
  370. package/esm/svg/saveSvgAsImage.d.ts +6 -0
  371. package/esm/svg/saveSvgAsImage.js +90 -0
  372. package/esm/svg/svgId.d.ts +42 -0
  373. package/esm/svg/svgId.js +84 -0
  374. package/esm/svg/svgReady.d.ts +137 -0
  375. package/esm/svg/svgReady.js +164 -0
  376. package/esm/svg/trackNames.d.ts +27 -0
  377. package/esm/svg/trackNames.js +31 -0
  378. package/esm/svg/wrapSvgExport.d.ts +12 -0
  379. package/esm/svg/wrapSvgExport.js +78 -0
  380. package/esm/ui/ActionLink.d.ts +7 -0
  381. package/esm/ui/ActionLink.js +9 -0
  382. package/esm/ui/AddCustomPluginDialog.d.ts +14 -0
  383. package/esm/ui/AddCustomPluginDialog.js +61 -0
  384. package/esm/ui/AddGenomePane.d.ts +8 -0
  385. package/esm/ui/AddGenomePane.js +228 -0
  386. package/esm/ui/AdvancedOptions.d.ts +6 -0
  387. package/esm/ui/AdvancedOptions.js +17 -0
  388. package/esm/ui/AppLogo.d.ts +1 -1
  389. package/esm/ui/AppLogo.js +2 -2
  390. package/esm/ui/AssemblySelector.d.ts +5 -8
  391. package/esm/ui/AssemblySelector.js +8 -26
  392. package/esm/ui/BaseExportSvgDialog.d.ts +16 -0
  393. package/esm/ui/BaseExportSvgDialog.js +84 -0
  394. package/esm/ui/BaseTooltip.d.ts +14 -3
  395. package/esm/ui/BaseTooltip.js +151 -34
  396. package/esm/ui/CascadingMenu.d.ts +9 -18
  397. package/esm/ui/CascadingMenu.js +390 -41
  398. package/esm/ui/CascadingMenuButton.d.ts +9 -11
  399. package/esm/ui/CascadingMenuButton.js +36 -18
  400. package/esm/ui/CascadingMenuHelpDialog.d.ts +2 -2
  401. package/esm/ui/CascadingMenuHelpDialog.js +4 -5
  402. package/esm/ui/CascadingMenuHelpIconButton.d.ts +2 -1
  403. package/esm/ui/CascadingMenuHelpIconButton.js +18 -9
  404. package/esm/ui/ColorPicker.d.ts +6 -9
  405. package/esm/ui/ColorPicker.js +36 -39
  406. package/esm/ui/ConfirmDialog.d.ts +2 -9
  407. package/esm/ui/ConfirmDialog.js +6 -9
  408. package/esm/ui/ContextMenu.d.ts +50 -0
  409. package/esm/ui/ContextMenu.js +55 -0
  410. package/esm/ui/CopyToClipboardButton.d.ts +10 -0
  411. package/esm/ui/CopyToClipboardButton.js +14 -0
  412. package/esm/ui/Crosshairs.d.ts +10 -0
  413. package/esm/ui/Crosshairs.js +15 -0
  414. package/esm/ui/DOMPurifySanitizedHTML.d.ts +1 -1
  415. package/esm/ui/DOMPurifySanitizedHTML.js +5 -5
  416. package/esm/ui/DataGridFlexContainer.d.ts +9 -2
  417. package/esm/ui/DataGridFlexContainer.js +4 -3
  418. package/esm/ui/Dialog.d.ts +5 -2
  419. package/esm/ui/Dialog.js +35 -27
  420. package/esm/ui/DraggableDialog.d.ts +3 -3
  421. package/esm/ui/DraggableDialog.js +50 -12
  422. package/esm/ui/DropDownMenu.d.ts +4 -2
  423. package/esm/ui/DropDownMenu.js +4 -4
  424. package/esm/ui/EditableTypography.d.ts +3 -1
  425. package/esm/ui/EditableTypography.js +34 -26
  426. package/esm/ui/ErrorActions.d.ts +24 -0
  427. package/esm/ui/ErrorActions.js +20 -0
  428. package/esm/ui/ErrorBanner.d.ts +7 -0
  429. package/esm/ui/ErrorBanner.js +35 -0
  430. package/esm/ui/ErrorBar.d.ts +6 -0
  431. package/esm/ui/ErrorBar.js +35 -0
  432. package/esm/ui/ErrorBoundary.d.ts +29 -5
  433. package/esm/ui/ErrorBoundary.js +32 -2
  434. package/esm/ui/ErrorMessage.d.ts +2 -4
  435. package/esm/ui/ErrorMessage.js +17 -52
  436. package/esm/ui/ErrorMessageStackTraceContents.d.ts +1 -1
  437. package/esm/ui/ErrorMessageStackTraceContents.js +3 -3
  438. package/esm/ui/ErrorMessageStackTraceDialog.d.ts +1 -1
  439. package/esm/ui/ErrorMessageStackTraceDialog.js +57 -96
  440. package/esm/ui/ErrorOverlay.d.ts +8 -0
  441. package/esm/ui/ErrorOverlay.js +5 -0
  442. package/esm/ui/ExportSvgDialog.d.ts +7 -0
  443. package/esm/ui/ExportSvgDialog.js +9 -0
  444. package/esm/ui/ExternalLink.d.ts +1 -1
  445. package/esm/ui/FactoryResetDialog.d.ts +1 -1
  446. package/esm/ui/FactoryResetDialog.js +6 -15
  447. package/esm/ui/FatalErrorDialog.d.ts +3 -2
  448. package/esm/ui/FatalErrorDialog.js +6 -5
  449. package/esm/ui/FileDropZone.d.ts +25 -0
  450. package/esm/ui/FileDropZone.js +128 -0
  451. package/esm/ui/FileSelector/FileSelector.d.ts +1 -1
  452. package/esm/ui/FileSelector/FileSelector.js +59 -30
  453. package/esm/ui/FileSelector/LocalFileChooser.d.ts +7 -2
  454. package/esm/ui/FileSelector/LocalFileChooser.js +61 -47
  455. package/esm/ui/FileSelector/LocationInput.d.ts +1 -1
  456. package/esm/ui/FileSelector/LocationInput.js +8 -12
  457. package/esm/ui/FileSelector/SourceTypeSelector.d.ts +5 -5
  458. package/esm/ui/FileSelector/SourceTypeSelector.js +9 -7
  459. package/esm/ui/FileSelector/UrlChooser.d.ts +1 -1
  460. package/esm/ui/FileSelector/UrlChooser.js +26 -2
  461. package/esm/ui/FileSelector/emptySourceType.d.ts +2 -0
  462. package/esm/ui/FileSelector/emptySourceType.js +14 -0
  463. package/esm/ui/FileSelector/useInternetAccounts.d.ts +383 -71
  464. package/esm/ui/FileSelector/useInternetAccounts.js +13 -6
  465. package/esm/ui/FileSelector/util.d.ts +58 -3
  466. package/esm/ui/FileSelector/util.js +128 -11
  467. package/esm/ui/GpuFallbackButton.d.ts +12 -0
  468. package/esm/ui/GpuFallbackButton.js +20 -0
  469. package/esm/ui/HoverMenu.d.ts +12 -3
  470. package/esm/ui/HoverMenu.js +31 -9
  471. package/esm/ui/HoverTooltip.d.ts +27 -0
  472. package/esm/ui/HoverTooltip.js +24 -0
  473. package/esm/ui/Icons.d.ts +6 -4
  474. package/esm/ui/Icons.js +9 -0
  475. package/esm/ui/InfoDialog.d.ts +7 -0
  476. package/esm/ui/InfoDialog.js +16 -0
  477. package/esm/ui/InlineMenuControls.d.ts +6 -0
  478. package/esm/ui/InlineMenuControls.js +17 -0
  479. package/esm/ui/JexlFilterDialog.d.ts +23 -0
  480. package/esm/ui/JexlFilterDialog.js +94 -0
  481. package/esm/ui/LabeledCheckbox.d.ts +9 -0
  482. package/esm/ui/LabeledCheckbox.js +7 -0
  483. package/esm/ui/LegendSwatchGlyph.d.ts +7 -0
  484. package/esm/ui/LegendSwatchGlyph.js +25 -0
  485. package/esm/ui/LoadingDots.d.ts +1 -0
  486. package/esm/ui/LoadingDots.js +30 -0
  487. package/esm/ui/LoadingEllipses.d.ts +17 -1
  488. package/esm/ui/LoadingEllipses.js +20 -29
  489. package/esm/ui/LoadingOverlay.d.ts +23 -0
  490. package/esm/ui/LoadingOverlay.js +137 -0
  491. package/esm/ui/LoadingProgress.d.ts +16 -0
  492. package/esm/ui/LoadingProgress.js +16 -0
  493. package/esm/ui/Logo.d.ts +2 -2
  494. package/esm/ui/Logo.js +23 -24
  495. package/esm/ui/Menu.js +1 -1
  496. package/esm/ui/MenuItemChevron.d.ts +3 -0
  497. package/esm/ui/MenuItemChevron.js +19 -0
  498. package/esm/ui/MenuItemEndDecoration.d.ts +4 -0
  499. package/esm/ui/MenuItemEndDecoration.js +28 -0
  500. package/esm/ui/MenuItemTrailing.d.ts +12 -0
  501. package/esm/ui/MenuItemTrailing.js +42 -0
  502. package/esm/ui/MenuTypes.d.ts +134 -5
  503. package/esm/ui/MenuTypes.js +16 -1
  504. package/esm/ui/MonospaceTextField.d.ts +9 -0
  505. package/esm/ui/MonospaceTextField.js +37 -0
  506. package/esm/ui/NumberTextField.d.ts +31 -0
  507. package/esm/ui/NumberTextField.js +33 -0
  508. package/esm/ui/PaletteContext.d.ts +92 -0
  509. package/esm/ui/PaletteContext.js +133 -0
  510. package/esm/ui/PinAdornment.d.ts +5 -0
  511. package/esm/ui/PinAdornment.js +85 -0
  512. package/esm/ui/PluggableComponent.d.ts +10 -0
  513. package/esm/ui/PluggableComponent.js +19 -0
  514. package/esm/ui/PluggableComponents.d.ts +29 -0
  515. package/esm/ui/PluggableComponents.js +28 -0
  516. package/esm/ui/PluggableElements.d.ts +23 -0
  517. package/esm/ui/PluggableElements.js +24 -0
  518. package/esm/ui/PluginStoreCard.d.ts +17 -0
  519. package/esm/ui/PluginStoreCard.js +45 -0
  520. package/esm/ui/PopoverPicker.d.ts +6 -0
  521. package/esm/ui/PopoverPicker.js +25 -0
  522. package/esm/ui/PrerenderedCanvas.d.ts +1 -1
  523. package/esm/ui/PrerenderedCanvas.js +5 -4
  524. package/esm/ui/ProgressChip.d.ts +37 -0
  525. package/esm/ui/ProgressChip.js +66 -0
  526. package/esm/ui/RedErrorMessageBox.d.ts +1 -1
  527. package/esm/ui/RedErrorMessageBox.js +9 -3
  528. package/esm/ui/RefNameAutocomplete/EndAdornment.d.ts +5 -0
  529. package/esm/ui/RefNameAutocomplete/EndAdornment.js +31 -0
  530. package/esm/ui/RefNameAutocomplete/HelpDialog.d.ts +3 -0
  531. package/esm/ui/RefNameAutocomplete/HelpDialog.js +7 -0
  532. package/esm/ui/RefNameAutocomplete/index.d.ts +22 -0
  533. package/esm/ui/RefNameAutocomplete/index.js +78 -0
  534. package/esm/ui/RefNameAutocomplete/util.d.ts +49 -0
  535. package/esm/ui/RefNameAutocomplete/util.js +168 -0
  536. package/esm/ui/ReplaceCurrentViewButton.d.ts +19 -0
  537. package/esm/ui/ReplaceCurrentViewButton.js +22 -0
  538. package/esm/ui/ResizeHandle.d.ts +13 -7
  539. package/esm/ui/ResizeHandle.js +42 -55
  540. package/esm/ui/ReturnToImportFormDialog.d.ts +1 -1
  541. package/esm/ui/ReturnToImportFormDialog.js +7 -9
  542. package/esm/ui/SanitizedHTML.d.ts +6 -1
  543. package/esm/ui/SanitizedHTML.js +7 -47
  544. package/esm/ui/ScrollEdgeShadow.d.ts +44 -0
  545. package/esm/ui/ScrollEdgeShadow.js +98 -0
  546. package/esm/ui/ScrollZoomToggle.d.ts +38 -0
  547. package/esm/ui/ScrollZoomToggle.js +92 -0
  548. package/esm/ui/SequenceAdapterInputs.d.ts +9 -0
  549. package/esm/ui/SequenceAdapterInputs.js +30 -0
  550. package/esm/ui/SettingsChangesTable.d.ts +14 -0
  551. package/esm/ui/SettingsChangesTable.js +49 -0
  552. package/esm/ui/ShareLinkField.d.ts +6 -0
  553. package/esm/ui/ShareLinkField.js +42 -0
  554. package/esm/ui/SingleSlider.d.ts +8 -0
  555. package/esm/ui/SingleSlider.js +11 -0
  556. package/esm/ui/SizeSliderRow.d.ts +16 -0
  557. package/esm/ui/SizeSliderRow.js +50 -0
  558. package/esm/ui/SliderTooltip.d.ts +2 -0
  559. package/esm/ui/SliderTooltip.js +17 -0
  560. package/esm/ui/Snackbar.d.ts +4 -2
  561. package/esm/ui/Snackbar.js +11 -8
  562. package/esm/ui/SnackbarContents.d.ts +1 -1
  563. package/esm/ui/SnackbarContents.js +21 -3
  564. package/esm/ui/SnackbarModel.d.ts +40 -0
  565. package/esm/ui/SnackbarModel.js +43 -11
  566. package/esm/ui/StackTraceButton.d.ts +5 -0
  567. package/esm/ui/StackTraceButton.js +16 -0
  568. package/esm/ui/StatusProgressBar.d.ts +37 -0
  569. package/esm/ui/StatusProgressBar.js +76 -0
  570. package/esm/ui/SubmitDialog.d.ts +6 -0
  571. package/esm/ui/SubmitDialog.js +9 -0
  572. package/esm/ui/SubmitForm.d.ts +23 -0
  573. package/esm/ui/SubmitForm.js +23 -0
  574. package/esm/ui/SvgColorLegend.d.ts +13 -0
  575. package/esm/ui/SvgColorLegend.js +65 -0
  576. package/esm/ui/SvgGradientLegend.d.ts +26 -0
  577. package/esm/ui/SvgGradientLegend.js +26 -0
  578. package/esm/ui/TagTextField.d.ts +40 -0
  579. package/esm/ui/TagTextField.js +32 -0
  580. package/esm/ui/VerticalScrollbar.d.ts +45 -0
  581. package/esm/ui/VerticalScrollbar.js +158 -0
  582. package/esm/ui/ViewLoadingScreen.d.ts +24 -0
  583. package/esm/ui/ViewLoadingScreen.js +76 -0
  584. package/esm/ui/addExtensionElement.d.ts +18 -0
  585. package/esm/ui/addExtensionElement.js +23 -0
  586. package/esm/ui/buildExtraTrackMenuItems.d.ts +22 -0
  587. package/esm/ui/buildExtraTrackMenuItems.js +14 -0
  588. package/esm/ui/colorSwatchStyle.d.ts +9 -0
  589. package/esm/ui/colorSwatchStyle.js +11 -0
  590. package/esm/ui/colors.d.ts +61 -8
  591. package/esm/ui/colors.js +135 -1
  592. package/esm/ui/extensionSelectors.d.ts +38 -0
  593. package/esm/ui/extensionSelectors.js +49 -0
  594. package/esm/ui/filterMenuItems.d.ts +112 -0
  595. package/esm/ui/filterMenuItems.js +86 -0
  596. package/esm/ui/formatErrorStack.d.ts +1 -0
  597. package/esm/ui/formatErrorStack.js +56 -0
  598. package/esm/ui/gpuFallback.d.ts +33 -0
  599. package/esm/ui/gpuFallback.js +39 -0
  600. package/esm/ui/highlightChipReveal.d.ts +32 -0
  601. package/esm/ui/highlightChipReveal.js +39 -0
  602. package/esm/ui/hoverBoxStyle.d.ts +11 -0
  603. package/esm/ui/hoverBoxStyle.js +13 -0
  604. package/esm/ui/index.d.ts +76 -4
  605. package/esm/ui/index.js +90 -19
  606. package/esm/ui/inlineMenuRowWidth.d.ts +1 -0
  607. package/esm/ui/inlineMenuRowWidth.js +8 -0
  608. package/esm/ui/launchTargetsMenuItem.d.ts +18 -0
  609. package/esm/ui/launchTargetsMenuItem.js +24 -0
  610. package/esm/ui/launchViewMenu.d.ts +4 -0
  611. package/esm/ui/launchViewMenu.js +42 -0
  612. package/esm/ui/legendMenuItem.d.ts +38 -0
  613. package/esm/ui/legendMenuItem.js +44 -0
  614. package/esm/ui/legendSpec.d.ts +62 -0
  615. package/esm/ui/legendSpec.js +78 -0
  616. package/esm/ui/loadingDotKeyframes.d.ts +18 -0
  617. package/esm/ui/loadingDotKeyframes.js +17 -0
  618. package/esm/ui/makeSizeMenu.d.ts +30 -0
  619. package/esm/ui/makeSizeMenu.js +82 -0
  620. package/esm/ui/mapStackTrace.d.ts +8 -0
  621. package/esm/ui/mapStackTrace.js +108 -0
  622. package/esm/ui/measureLegendText.d.ts +1 -0
  623. package/esm/ui/measureLegendText.js +8 -0
  624. package/esm/ui/menuItemAdornment.d.ts +33 -0
  625. package/esm/ui/menuItemAdornment.js +50 -0
  626. package/esm/ui/menuItems.d.ts +28 -0
  627. package/esm/ui/menuItems.js +26 -0
  628. package/esm/ui/menuLabels.d.ts +41 -0
  629. package/esm/ui/menuLabels.js +43 -0
  630. package/esm/ui/multiTrackMenuItems.d.ts +19 -0
  631. package/esm/ui/multiTrackMenuItems.js +15 -0
  632. package/esm/ui/palette.d.ts +559 -0
  633. package/esm/ui/palette.js +746 -0
  634. package/esm/ui/parseError.d.ts +4 -0
  635. package/esm/ui/parseError.js +18 -0
  636. package/esm/ui/persistentScrollbarStyle.d.ts +49 -0
  637. package/esm/ui/persistentScrollbarStyle.js +53 -0
  638. package/esm/ui/promotableMenuItems.d.ts +19 -0
  639. package/esm/ui/promotableMenuItems.js +91 -0
  640. package/esm/ui/promotablePinCoverage.d.ts +44 -0
  641. package/esm/ui/promotablePinCoverage.js +88 -0
  642. package/esm/ui/radioSubMenu.d.ts +33 -0
  643. package/esm/ui/radioSubMenu.js +32 -0
  644. package/esm/ui/react-colorful.js +5 -1
  645. package/esm/ui/replaceViewAction.d.ts +31 -0
  646. package/esm/ui/replaceViewAction.js +39 -0
  647. package/esm/ui/rewriteExternalAnchors.d.ts +1 -0
  648. package/esm/ui/rewriteExternalAnchors.js +8 -0
  649. package/esm/ui/scrollZoomLabels.d.ts +17 -0
  650. package/esm/ui/scrollZoomLabels.js +22 -0
  651. package/esm/ui/showSubMenu.d.ts +19 -0
  652. package/esm/ui/showSubMenu.js +30 -0
  653. package/esm/ui/sliderScale.d.ts +6 -0
  654. package/esm/ui/sliderScale.js +30 -0
  655. package/esm/ui/statusProgressKeyframes.d.ts +6 -0
  656. package/esm/ui/statusProgressKeyframes.js +14 -0
  657. package/esm/ui/stripStackTraceMessage.d.ts +1 -0
  658. package/esm/ui/stripStackTraceMessage.js +9 -0
  659. package/esm/ui/styleTheme.d.ts +158 -0
  660. package/esm/ui/styleTheme.js +115 -0
  661. package/esm/ui/submenuAim.d.ts +30 -0
  662. package/esm/ui/submenuAim.js +37 -0
  663. package/esm/ui/theme.d.ts +343 -29
  664. package/esm/ui/theme.js +258 -342
  665. package/esm/ui/toggleMenuItems.d.ts +42 -0
  666. package/esm/ui/toggleMenuItems.js +60 -0
  667. package/esm/ui/useAssemblySelection.d.ts +153 -0
  668. package/esm/ui/useAssemblySelection.js +54 -0
  669. package/esm/ui/useCoalescedPointer.d.ts +36 -0
  670. package/esm/ui/useCoalescedPointer.js +60 -0
  671. package/esm/ui/useCopyToClipboard.d.ts +15 -0
  672. package/esm/ui/useCopyToClipboard.js +41 -0
  673. package/esm/ui/useExportSvgPreference.d.ts +1 -0
  674. package/esm/ui/useExportSvgPreference.js +4 -0
  675. package/esm/ui/useMouseTracking.d.ts +71 -0
  676. package/esm/ui/useMouseTracking.js +179 -0
  677. package/esm/ui/useRecentLocations.d.ts +28 -0
  678. package/esm/ui/useRecentLocations.js +31 -0
  679. package/esm/ui/wrapComponent.d.ts +47 -0
  680. package/esm/ui/wrapComponent.js +58 -0
  681. package/esm/ui/zIndexes.d.ts +28 -0
  682. package/esm/ui/zIndexes.js +38 -0
  683. package/esm/util/Base1DUtils.d.ts +204 -16
  684. package/esm/util/Base1DUtils.js +310 -175
  685. package/esm/util/Base1DViewModel.d.ts +97 -20
  686. package/esm/util/Base1DViewModel.js +148 -39
  687. package/esm/util/FileSaver/index.d.ts +1 -0
  688. package/esm/util/FileSaver/index.js +27 -0
  689. package/esm/util/IntervalTree.d.ts +18 -39
  690. package/esm/util/IntervalTree.js +63 -244
  691. package/esm/util/SvgCanvas.d.ts +81 -0
  692. package/esm/util/SvgCanvas.js +500 -0
  693. package/esm/util/TimeTraveller.d.ts +12 -0
  694. package/esm/util/TimeTraveller.js +130 -27
  695. package/esm/util/aborting.d.ts +17 -4
  696. package/esm/util/aborting.js +30 -25
  697. package/esm/util/adapterMetadata.d.ts +20 -0
  698. package/esm/util/adapterMetadata.js +39 -0
  699. package/esm/util/addAndShowTrack.d.ts +22 -0
  700. package/esm/util/addAndShowTrack.js +27 -0
  701. package/esm/util/addRelativeUris.d.ts +17 -0
  702. package/esm/util/addRelativeUris.js +42 -0
  703. package/esm/util/addTrackComponent.d.ts +72 -0
  704. package/esm/util/addTrackComponent.js +53 -0
  705. package/esm/util/addTrackFromWidget.d.ts +94 -0
  706. package/esm/util/addTrackFromWidget.js +90 -0
  707. package/esm/util/analytics.d.ts +32 -3
  708. package/esm/util/analytics.js +102 -49
  709. package/esm/util/animationAllowed.d.ts +17 -0
  710. package/esm/util/animationAllowed.js +22 -0
  711. package/esm/util/applyRowResizeWheel.d.ts +10 -0
  712. package/esm/util/applyRowResizeWheel.js +34 -0
  713. package/esm/util/assemblyConfigUtils.d.ts +144 -0
  714. package/esm/util/assemblyConfigUtils.js +498 -0
  715. package/esm/util/bandHeight.d.ts +53 -0
  716. package/esm/util/bandHeight.js +56 -0
  717. package/esm/util/bandLayout.d.ts +51 -0
  718. package/esm/util/bandLayout.js +36 -0
  719. package/esm/util/bezierConnector.d.ts +14 -0
  720. package/esm/util/bezierConnector.js +108 -0
  721. package/esm/util/bgzfWorkerPool.d.ts +78 -0
  722. package/esm/util/bgzfWorkerPool.js +81 -0
  723. package/esm/util/blockTypes.d.ts +64 -45
  724. package/esm/util/blockTypes.js +67 -74
  725. package/esm/util/bpUtils.d.ts +81 -0
  726. package/esm/util/bpUtils.js +103 -0
  727. package/esm/util/cacheBudgets.d.ts +55 -0
  728. package/esm/util/cacheBudgets.js +55 -0
  729. package/esm/util/cachedSetup.d.ts +51 -0
  730. package/esm/util/cachedSetup.js +87 -0
  731. package/esm/util/calculateDynamicBlocks.d.ts +5 -0
  732. package/esm/util/calculateDynamicBlocks.js +85 -82
  733. package/esm/util/calculateStaticBlocks.d.ts +2 -3
  734. package/esm/util/calculateStaticBlocks.js +48 -71
  735. package/esm/util/chooseGridPitch.d.ts +9 -0
  736. package/esm/util/chooseGridPitch.js +31 -0
  737. package/esm/util/clampToContig.d.ts +26 -0
  738. package/esm/util/clampToContig.js +28 -0
  739. package/esm/util/cmpStr.d.ts +1 -0
  740. package/esm/util/cmpStr.js +7 -0
  741. package/esm/util/coarseStripHTML.js +3 -15
  742. package/esm/util/color/cssColorsLevel4.js +6 -2
  743. package/esm/util/color/index.d.ts +81 -2
  744. package/esm/util/color/index.js +194 -25
  745. package/esm/util/color-bits/bit.d.ts +4 -0
  746. package/esm/util/color-bits/bit.js +37 -0
  747. package/esm/util/color-bits/convert.d.ts +23 -0
  748. package/esm/util/color-bits/convert.js +294 -0
  749. package/esm/util/color-bits/core.d.ts +34 -0
  750. package/esm/util/color-bits/core.js +67 -0
  751. package/esm/util/color-bits/format.d.ts +24 -0
  752. package/esm/util/color-bits/format.js +82 -0
  753. package/esm/util/color-bits/functions.d.ts +33 -0
  754. package/esm/util/color-bits/functions.js +70 -0
  755. package/esm/util/color-bits/index.d.ts +5 -0
  756. package/esm/util/color-bits/index.js +4 -0
  757. package/esm/util/color-bits/parse.d.ts +17 -0
  758. package/esm/util/color-bits/parse.js +382 -0
  759. package/esm/util/colorBits.d.ts +39 -0
  760. package/esm/util/colorBits.js +180 -0
  761. package/esm/util/colorRamp.d.ts +37 -0
  762. package/esm/util/colorRamp.js +93 -0
  763. package/esm/util/colord.d.ts +8 -0
  764. package/esm/util/colord.js +43 -191
  765. package/esm/util/convertCodingSequenceToPeptides.d.ts +17 -3
  766. package/esm/util/convertCodingSequenceToPeptides.js +51 -4
  767. package/esm/util/copyText.d.ts +18 -0
  768. package/esm/util/copyText.js +30 -0
  769. package/esm/util/copyToClipboard.d.ts +4 -0
  770. package/esm/util/copyToClipboard.js +58 -0
  771. package/esm/util/createStopTokenRotation.d.ts +118 -0
  772. package/esm/util/createStopTokenRotation.js +127 -0
  773. package/esm/util/createSvgRasterCanvas.d.ts +7 -0
  774. package/esm/util/createSvgRasterCanvas.js +22 -0
  775. package/esm/util/crypto.d.ts +24 -0
  776. package/esm/util/crypto.js +85 -2
  777. package/esm/util/dataGridUtils.d.ts +9 -0
  778. package/esm/util/dataGridUtils.js +36 -0
  779. package/esm/util/dedupe.js +1 -0
  780. package/esm/util/deepEqual.d.ts +8 -0
  781. package/esm/util/deepEqual.js +22 -0
  782. package/esm/util/deepMerge.d.ts +20 -0
  783. package/esm/util/deepMerge.js +44 -0
  784. package/esm/util/diagonalizeRegions.d.ts +23 -0
  785. package/esm/util/diagonalizeRegions.js +192 -0
  786. package/esm/util/environment.d.ts +4 -0
  787. package/esm/util/environment.js +43 -0
  788. package/esm/util/eventPoint.d.ts +32 -0
  789. package/esm/util/eventPoint.js +28 -0
  790. package/esm/util/fetchAndMaybeUnzip.d.ts +6 -0
  791. package/esm/util/fetchAndMaybeUnzip.js +64 -0
  792. package/esm/util/fetchContext.d.ts +82 -0
  793. package/esm/util/fetchContext.js +59 -0
  794. package/esm/util/fetchHub.d.ts +15 -0
  795. package/esm/util/fetchHub.js +31 -0
  796. package/esm/util/fetchJson.d.ts +1 -0
  797. package/esm/util/fetchJson.js +7 -0
  798. package/esm/util/fetchPhases.d.ts +77 -0
  799. package/esm/util/fetchPhases.js +1 -0
  800. package/esm/util/fetchSeq.d.ts +5 -1
  801. package/esm/util/fetchSeq.js +18 -6
  802. package/esm/util/fileHandleStore.d.ts +19 -2
  803. package/esm/util/fileHandleStore.js +95 -35
  804. package/esm/util/flatbush/index.d.ts +27 -6
  805. package/esm/util/flatbush/index.js +194 -218
  806. package/esm/util/formatBytes.d.ts +9 -0
  807. package/esm/util/formatBytes.js +18 -0
  808. package/esm/util/formatFastaStrings.d.ts +13 -0
  809. package/esm/util/formatFastaStrings.js +13 -0
  810. package/esm/util/formatGuessers.d.ts +30 -0
  811. package/esm/util/formatGuessers.js +69 -0
  812. package/esm/util/formatRelativeTime.d.ts +1 -0
  813. package/esm/util/formatRelativeTime.js +25 -0
  814. package/esm/util/frameCoalescer.d.ts +30 -0
  815. package/esm/util/frameCoalescer.js +22 -0
  816. package/esm/util/freezeDeep.d.ts +28 -0
  817. package/esm/util/freezeDeep.js +41 -0
  818. package/esm/util/geneticCodes.d.ts +56 -0
  819. package/esm/util/geneticCodes.js +371 -0
  820. package/esm/util/getFileName.d.ts +11 -0
  821. package/esm/util/getFileName.js +34 -0
  822. package/esm/util/getLocationUri.d.ts +49 -0
  823. package/esm/util/getLocationUri.js +63 -0
  824. package/esm/util/getRelativeX.d.ts +4 -0
  825. package/esm/util/getRelativeX.js +7 -0
  826. package/esm/util/getStr.d.ts +6 -0
  827. package/esm/util/getStr.js +15 -0
  828. package/esm/util/highlights.d.ts +21 -0
  829. package/esm/util/highlights.js +100 -0
  830. package/esm/util/hooks.d.ts +168 -0
  831. package/esm/util/hooks.js +443 -0
  832. package/esm/util/htmlText.d.ts +13 -0
  833. package/esm/util/htmlText.js +66 -0
  834. package/esm/util/idMaker.d.ts +1 -1
  835. package/esm/util/idMaker.js +31 -18
  836. package/esm/util/index.d.ts +81 -268
  837. package/esm/util/index.js +135 -853
  838. package/esm/util/indexCandidates.d.ts +50 -0
  839. package/esm/util/indexCandidates.js +101 -0
  840. package/esm/util/installClearHoverOnSurfaceMove.d.ts +40 -0
  841. package/esm/util/installClearHoverOnSurfaceMove.js +41 -0
  842. package/esm/util/installFetch.d.ts +220 -0
  843. package/esm/util/installFetch.js +206 -0
  844. package/esm/util/installInitAutorun.d.ts +62 -0
  845. package/esm/util/installInitAutorun.js +107 -0
  846. package/esm/util/intervals.d.ts +20 -0
  847. package/esm/util/intervals.js +37 -0
  848. package/esm/util/io/RemoteFileWithRangeCache.d.ts +10 -11
  849. package/esm/util/io/RemoteFileWithRangeCache.js +10 -148
  850. package/esm/util/io/index.d.ts +39 -2
  851. package/esm/util/io/index.js +115 -12
  852. package/esm/util/isDataCurrent.d.ts +7 -0
  853. package/esm/util/isDataCurrent.js +9 -0
  854. package/esm/util/isWebWorker.js +1 -2
  855. package/esm/util/iupac.d.ts +4 -0
  856. package/esm/util/iupac.js +59 -0
  857. package/esm/util/jexl.js +141 -17
  858. package/esm/util/jexlFilters.d.ts +75 -0
  859. package/esm/util/jexlFilters.js +49 -0
  860. package/esm/util/jexlStrings.d.ts +22 -1
  861. package/esm/util/jexlStrings.js +21 -14
  862. package/esm/util/layouts/GranularRectLayout.d.ts +13 -25
  863. package/esm/util/layouts/GranularRectLayout.js +99 -356
  864. package/esm/util/layouts/index.d.ts +1 -7
  865. package/esm/util/layouts/index.js +2 -6
  866. package/esm/util/layouts/intervalUtils.d.ts +12 -1
  867. package/esm/util/layouts/intervalUtils.js +13 -31
  868. package/esm/util/layouts/placeRect.d.ts +50 -0
  869. package/esm/util/layouts/placeRect.js +97 -0
  870. package/esm/util/lazyAfterAttach.d.ts +13 -0
  871. package/esm/util/lazyAfterAttach.js +31 -0
  872. package/esm/util/leadingEdgeAutorun.d.ts +40 -0
  873. package/esm/util/leadingEdgeAutorun.js +51 -0
  874. package/esm/util/legendCandidates.d.ts +50 -0
  875. package/esm/util/legendCandidates.js +87 -0
  876. package/esm/util/librpc.d.ts +5 -2
  877. package/esm/util/librpc.js +6 -1
  878. package/esm/util/linkify.js +2 -0
  879. package/esm/util/locString.d.ts +72 -0
  880. package/esm/util/locString.js +178 -7
  881. package/esm/util/locStringsToRegions.d.ts +10 -0
  882. package/esm/util/locStringsToRegions.js +35 -0
  883. package/esm/util/localStorage.d.ts +36 -0
  884. package/esm/util/localStorage.js +137 -0
  885. package/esm/util/makeAssembly.d.ts +54 -0
  886. package/esm/util/makeAssembly.js +52 -0
  887. package/esm/util/makeTrackId.d.ts +14 -0
  888. package/esm/util/makeTrackId.js +14 -0
  889. package/esm/util/matchTrackId.d.ts +11 -0
  890. package/esm/util/matchTrackId.js +14 -0
  891. package/esm/util/measureText.d.ts +24 -0
  892. package/esm/util/measureText.js +51 -0
  893. package/esm/util/mst-reflection.d.ts +14 -4
  894. package/esm/util/mst-reflection.js +33 -32
  895. package/esm/util/mstUtils.d.ts +100 -0
  896. package/esm/util/mstUtils.js +140 -0
  897. package/esm/util/nanoid.d.ts +0 -4
  898. package/esm/util/nanoid.js +10 -20
  899. package/esm/util/numericUtils.d.ts +20 -0
  900. package/esm/util/numericUtils.js +127 -0
  901. package/esm/util/objectUtils.d.ts +2 -0
  902. package/esm/util/objectUtils.js +9 -0
  903. package/esm/util/offscreenCanvasPonyfill.d.ts +5 -4
  904. package/esm/util/offscreenCanvasPonyfill.js +5 -47
  905. package/esm/util/openDisplays.d.ts +23 -0
  906. package/esm/util/openDisplays.js +79 -0
  907. package/esm/util/openFeatureWidget.d.ts +33 -0
  908. package/esm/util/openFeatureWidget.js +64 -0
  909. package/esm/util/paintLayer.d.ts +32 -0
  910. package/esm/util/paintLayer.js +33 -0
  911. package/esm/util/parentWalk.d.ts +32 -0
  912. package/esm/util/parentWalk.js +84 -0
  913. package/esm/util/parseLineByLine.d.ts +45 -2
  914. package/esm/util/parseLineByLine.js +156 -15
  915. package/esm/util/parseMotifList.d.ts +17 -0
  916. package/esm/util/parseMotifList.js +69 -0
  917. package/esm/util/pluginStore.d.ts +114 -0
  918. package/esm/util/pluginStore.js +260 -0
  919. package/esm/util/pointerPresence.d.ts +5 -0
  920. package/esm/util/pointerPresence.js +21 -0
  921. package/esm/util/progress.d.ts +459 -0
  922. package/esm/util/progress.js +820 -0
  923. package/esm/util/range.d.ts +46 -1
  924. package/esm/util/range.js +68 -2
  925. package/esm/util/renameRegions.d.ts +21 -0
  926. package/esm/util/renameRegions.js +129 -0
  927. package/esm/util/renderToStaticMarkup.d.ts +2 -0
  928. package/esm/util/renderToStaticMarkup.js +50 -0
  929. package/esm/util/reorder.d.ts +35 -0
  930. package/esm/util/reorder.js +83 -0
  931. package/esm/util/resolveRowHeight.d.ts +27 -0
  932. package/esm/util/resolveRowHeight.js +30 -0
  933. package/esm/util/revlist.d.ts +13 -0
  934. package/esm/util/revlist.js +14 -0
  935. package/esm/util/rowStackGeometry.d.ts +66 -0
  936. package/esm/util/rowStackGeometry.js +70 -0
  937. package/esm/util/rpc.d.ts +16 -1
  938. package/esm/util/rpc.js +12 -1
  939. package/esm/util/rxjs.d.ts +30 -1
  940. package/esm/util/rxjs.js +88 -10
  941. package/esm/util/sameStrings.d.ts +16 -0
  942. package/esm/util/sameStrings.js +20 -0
  943. package/esm/util/scrollLatch.d.ts +4 -0
  944. package/esm/util/scrollLatch.js +59 -0
  945. package/esm/util/selectNamedRegions.d.ts +136 -0
  946. package/esm/util/selectNamedRegions.js +222 -0
  947. package/esm/util/seqUtils.d.ts +17 -0
  948. package/esm/util/seqUtils.js +80 -0
  949. package/esm/util/sessionServices.d.ts +29 -0
  950. package/esm/util/sessionServices.js +46 -0
  951. package/esm/util/sessionSharing.d.ts +38 -0
  952. package/esm/util/sessionSharing.js +154 -0
  953. package/esm/util/sessionStorage.d.ts +1 -0
  954. package/esm/util/sessionStorage.js +15 -0
  955. package/esm/util/setStackTraceLimit.d.ts +6 -0
  956. package/esm/util/setStackTraceLimit.js +20 -0
  957. package/esm/util/simpleFeature.d.ts +112 -4
  958. package/esm/util/simpleFeature.js +181 -29
  959. package/esm/util/springAnimate.d.ts +20 -0
  960. package/esm/util/springAnimate.js +80 -0
  961. package/esm/util/stats.d.ts +25 -2
  962. package/esm/util/stats.js +39 -8
  963. package/esm/util/stopToken.d.ts +207 -15
  964. package/esm/util/stopToken.js +403 -55
  965. package/esm/util/stringUtils.d.ts +5 -0
  966. package/esm/util/stringUtils.js +34 -0
  967. package/esm/util/svgColorProps.d.ts +7 -0
  968. package/esm/util/svgColorProps.js +28 -0
  969. package/esm/util/tabix.d.ts +126 -0
  970. package/esm/util/tabix.js +149 -0
  971. package/esm/util/tags.d.ts +2 -0
  972. package/esm/util/tags.js +5 -0
  973. package/esm/util/temporaryAssembly.d.ts +21 -0
  974. package/esm/util/temporaryAssembly.js +29 -0
  975. package/esm/util/tickLabels.d.ts +36 -0
  976. package/esm/util/tickLabels.js +45 -0
  977. package/esm/util/timeGate.d.ts +26 -0
  978. package/esm/util/timeGate.js +79 -0
  979. package/esm/util/trackConfigDelta.d.ts +84 -0
  980. package/esm/util/trackConfigDelta.js +190 -0
  981. package/esm/util/tracks.d.ts +398 -30
  982. package/esm/util/tracks.js +699 -191
  983. package/esm/util/tss-react/cssAndCx.js +11 -66
  984. package/esm/util/tss-react/index.d.ts +11 -2
  985. package/esm/util/tss-react/index.js +9 -2
  986. package/esm/util/tss-react/makeStyles.js +7 -4
  987. package/esm/util/tss-react/mergeClasses.js +1 -0
  988. package/esm/util/tss-react/tools/classnames.d.ts +3 -0
  989. package/esm/util/tss-react/tools/classnames.js +3 -0
  990. package/esm/util/tss-react/tools/getDependencyArrayRef.d.ts +18 -0
  991. package/esm/util/tss-react/tools/getDependencyArrayRef.js +19 -0
  992. package/esm/util/tss-react/types.d.ts +1 -1
  993. package/esm/util/tss-react/types.js +1 -6
  994. package/esm/util/types/ElementId.js +1 -1
  995. package/esm/util/types/data.d.ts +75 -0
  996. package/esm/util/types/data.js +41 -0
  997. package/esm/util/types/index.d.ts +402 -120
  998. package/esm/util/types/index.js +90 -64
  999. package/esm/util/types/isAny.d.ts +11 -0
  1000. package/esm/util/types/isAny.js +1 -0
  1001. package/esm/util/types/mst.d.ts +71 -47
  1002. package/esm/util/types/mst.js +27 -22
  1003. package/esm/util/types/predicate.d.ts +9 -0
  1004. package/esm/util/types/predicate.js +1 -0
  1005. package/esm/util/types/renderingServices.d.ts +16 -0
  1006. package/esm/util/types/renderingServices.js +1 -0
  1007. package/esm/util/types/services.d.ts +55 -0
  1008. package/esm/util/types/services.js +10 -0
  1009. package/esm/util/types/util.d.ts +8 -2
  1010. package/esm/util/unknownSnapshotKeys.d.ts +36 -0
  1011. package/esm/util/unknownSnapshotKeys.js +69 -0
  1012. package/esm/util/unzip.d.ts +1 -0
  1013. package/esm/util/unzip.js +6 -0
  1014. package/esm/util/useEventCallback.d.ts +1 -0
  1015. package/esm/util/useEventCallback.js +16 -0
  1016. package/esm/util/useFeatureSequence.d.ts +13 -7
  1017. package/esm/util/useFeatureSequence.js +56 -78
  1018. package/esm/util/useFetch.d.ts +56 -0
  1019. package/esm/util/useFetch.js +188 -0
  1020. package/esm/util/useFetchPlugins.d.ts +12 -0
  1021. package/esm/util/useFetchPlugins.js +14 -0
  1022. package/esm/util/useMeasure.d.ts +11 -1
  1023. package/esm/util/useMeasure.js +20 -6
  1024. package/esm/util/usePanZoom.d.ts +75 -0
  1025. package/esm/util/usePanZoom.js +175 -0
  1026. package/esm/util/usePanelVirtualScroll.d.ts +37 -0
  1027. package/esm/util/usePanelVirtualScroll.js +42 -0
  1028. package/esm/util/usePointerDrag.d.ts +37 -0
  1029. package/esm/util/usePointerDrag.js +61 -0
  1030. package/esm/util/useRafCommit.d.ts +4 -0
  1031. package/esm/util/useRafCommit.js +50 -0
  1032. package/esm/util/useResizeDrag.d.ts +91 -0
  1033. package/esm/util/useResizeDrag.js +105 -0
  1034. package/esm/util/useRowVirtualScroll.d.ts +32 -0
  1035. package/esm/util/useRowVirtualScroll.js +63 -0
  1036. package/esm/util/useVirtualScrollWheel.d.ts +7 -0
  1037. package/esm/util/useVirtualScrollWheel.js +108 -0
  1038. package/esm/util/viewStatus.d.ts +81 -0
  1039. package/esm/util/viewStatus.js +37 -0
  1040. package/esm/util/virtualRange.d.ts +36 -0
  1041. package/esm/util/virtualRange.js +26 -0
  1042. package/esm/util/webStorage.d.ts +26 -0
  1043. package/esm/util/webStorage.js +92 -0
  1044. package/esm/util/wheelZoom.d.ts +59 -0
  1045. package/esm/util/wheelZoom.js +231 -0
  1046. package/esm/util/whenViewSettled.d.ts +40 -0
  1047. package/esm/util/whenViewSettled.js +41 -0
  1048. package/esm/util/withFeatureDetails.d.ts +34 -0
  1049. package/esm/util/withFeatureDetails.js +59 -0
  1050. package/esm/util/withLaunchInput.d.ts +123 -0
  1051. package/esm/util/withLaunchInput.js +228 -0
  1052. package/package.json +243 -820
  1053. package/esm/ReExports/DataGrid.d.ts +0 -1
  1054. package/esm/ReExports/DataGrid.js +0 -1
  1055. package/esm/configuration/util.d.ts +0 -10
  1056. package/esm/configuration/util.js +0 -123
  1057. package/esm/data_adapters/BaseAdapter/BaseOptions.d.ts +0 -18
  1058. package/esm/data_adapters/util.d.ts +0 -1
  1059. package/esm/data_adapters/util.js +0 -6
  1060. package/esm/pluggableElementTypes/GlyphType.d.ts +0 -43
  1061. package/esm/pluggableElementTypes/GlyphType.js +0 -18
  1062. package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.d.ts +0 -5
  1063. package/esm/pluggableElementTypes/models/saveTrackFileTypes/fetchSequence.js +0 -17
  1064. package/esm/pluggableElementTypes/renderers/BoxRendererType.d.ts +0 -52
  1065. package/esm/pluggableElementTypes/renderers/BoxRendererType.js +0 -78
  1066. package/esm/pluggableElementTypes/renderers/CircularChordRendererType.d.ts +0 -4
  1067. package/esm/pluggableElementTypes/renderers/CircularChordRendererType.js +0 -4
  1068. package/esm/pluggableElementTypes/renderers/FeatureRendererType.d.ts +0 -58
  1069. package/esm/pluggableElementTypes/renderers/FeatureRendererType.js +0 -77
  1070. package/esm/pluggableElementTypes/renderers/LayoutSession.d.ts +0 -31
  1071. package/esm/pluggableElementTypes/renderers/LayoutSession.js +0 -40
  1072. package/esm/pluggableElementTypes/renderers/RendererType.d.ts +0 -28
  1073. package/esm/pluggableElementTypes/renderers/RendererType.js +0 -20
  1074. package/esm/pluggableElementTypes/renderers/ServerSideRendererType.d.ts +0 -58
  1075. package/esm/pluggableElementTypes/renderers/ServerSideRendererType.js +0 -108
  1076. package/esm/pluggableElementTypes/renderers/index.d.ts +0 -6
  1077. package/esm/pluggableElementTypes/renderers/index.js +0 -6
  1078. package/esm/pluggableElementTypes/renderers/util.d.ts +0 -3
  1079. package/esm/pluggableElementTypes/renderers/util.js +0 -14
  1080. package/esm/rpc/baseRpcConfig.d.ts +0 -8
  1081. package/esm/rpc/baseRpcConfig.js +0 -10
  1082. package/esm/rpc/mainThreadRpcConfig.d.ts +0 -8
  1083. package/esm/rpc/mainThreadRpcConfig.js +0 -8
  1084. package/esm/rpc/methods/CoreGetFeatureDensityStats.d.ts +0 -17
  1085. package/esm/rpc/methods/CoreGetFeatureDensityStats.js +0 -25
  1086. package/esm/rpc/methods/CoreGetFeatureDetails.d.ts +0 -11
  1087. package/esm/rpc/methods/CoreGetFeatureDetails.js +0 -24
  1088. package/esm/rpc/methods/CoreGetFileInfo.d.ts +0 -9
  1089. package/esm/rpc/methods/CoreGetFileInfo.js +0 -15
  1090. package/esm/rpc/methods/CoreRender.d.ts +0 -14
  1091. package/esm/rpc/methods/CoreRender.js +0 -40
  1092. package/esm/rpc/methods/CoreSaveFeatureData.d.ts +0 -16
  1093. package/esm/rpc/methods/CoreSaveFeatureData.js +0 -32
  1094. package/esm/rpc/methods/util.d.ts +0 -15
  1095. package/esm/rpc/methods/util.js +0 -7
  1096. package/esm/rpc/webWorkerRpcConfig.d.ts +0 -8
  1097. package/esm/rpc/webWorkerRpcConfig.js +0 -8
  1098. package/esm/ui/MenuButton.d.ts +0 -1
  1099. package/esm/ui/MenuButton.js +0 -1
  1100. package/esm/ui/MenuItems.d.ts +0 -15
  1101. package/esm/ui/MenuItems.js +0 -59
  1102. package/esm/ui/useEvent.d.ts +0 -1
  1103. package/esm/ui/useEvent.js +0 -10
  1104. package/esm/util/blobToDataURL.d.ts +0 -1
  1105. package/esm/util/blobToDataURL.js +0 -14
  1106. package/esm/util/compositeMap.d.ts +0 -11
  1107. package/esm/util/compositeMap.js +0 -59
  1108. package/esm/util/flatqueue/index.d.ts +0 -11
  1109. package/esm/util/flatqueue/index.js +0 -61
  1110. package/esm/util/layouts/BaseLayout.d.ts +0 -30
  1111. package/esm/util/layouts/MultiLayout.d.ts +0 -12
  1112. package/esm/util/layouts/MultiLayout.js +0 -40
  1113. package/esm/util/layouts/PileupLayout.d.ts +0 -41
  1114. package/esm/util/layouts/PileupLayout.js +0 -202
  1115. package/esm/util/layouts/PrecomputedLayout.d.ts +0 -30
  1116. package/esm/util/layouts/PrecomputedLayout.js +0 -71
  1117. package/esm/util/layouts/SceneGraph.d.ts +0 -31
  1118. package/esm/util/layouts/SceneGraph.js +0 -121
  1119. package/esm/util/makeAbortableReaction.d.ts +0 -3
  1120. package/esm/util/makeAbortableReaction.js +0 -47
  1121. package/esm/util/map-obj/index.d.ts +0 -13
  1122. package/esm/util/map-obj/index.js +0 -92
  1123. package/esm/util/nextTick.d.ts +0 -1
  1124. package/esm/util/nextTick.js +0 -3
  1125. package/esm/util/offscreenCanvasGetSerializingSvg.d.ts +0 -5
  1126. package/esm/util/offscreenCanvasGetSerializingSvg.js +0 -9
  1127. package/esm/util/offscreenCanvasUtils.d.ts +0 -12
  1128. package/esm/util/offscreenCanvasUtils.js +0 -19
  1129. package/esm/util/renderToAbstractCanvas.d.ts +0 -17
  1130. package/esm/util/renderToAbstractCanvas.js +0 -53
  1131. package/esm/util/transferables.d.ts +0 -2
  1132. package/esm/util/transferables.js +0 -35
  1133. package/esm/util/tss-react/mui/index.d.ts +0 -1
  1134. package/esm/util/tss-react/mui/index.js +0 -1
  1135. package/esm/util/tss-react/mui/mui.d.ts +0 -10
  1136. package/esm/util/tss-react/mui/mui.js +0 -5
  1137. package/esm/util/when.d.ts +0 -1
  1138. package/esm/util/when.js +0 -1
  1139. /package/esm/{data_adapters/BaseAdapter/BaseOptions.js → configuration/promotablePin.js} +0 -0
  1140. /package/esm/{util/layouts/BaseLayout.js → data_adapters/BaseAdapter/CytobandAdapter.js} +0 -0
@@ -1,48 +1,122 @@
1
- import { getParent, getSnapshot, isRoot, isStateTreeNode, } from '@jbrowse/mobx-state-tree';
2
- import { getFileHandle, storeFileHandle, verifyPermission, } from "./fileHandleStore.js";
3
- import { getEnv, getSession, objectHash } from "./index.js";
4
- import { readConfObject } from "../configuration/index.js";
5
- const trackAssemblyNamesCache = new WeakMap();
1
+ // Re-exported because `@jbrowse/core/util/tracks` is the path plugins import it
2
+ // from. It must come first: `../configuration` imports the util barrel, which
3
+ // imports this module back, and a re-export declared after that cycle has a
4
+ // getter that fires before its own require has run.
5
+ export { getFileName } from './getFileName.js';
6
+ // Lives in `./mstUtils.ts` with the rest of the tree walks, and is re-exported
7
+ // here because `@jbrowse/core/util/tracks` is a plugin ABI module that offers
8
+ // it. `fetchContext.ts` takes it from mstUtils instead, which is what keeps the
9
+ // configuration schemas this file pulls in out of the fetch harness's graph.
10
+ export { getRpcSessionId } from './parentWalk.js';
11
+ import { getParent, getSnapshot, hasParent, isAlive, isStateTreeNode, } from '@jbrowse/mobx-state-tree';
12
+ import { observable, runInAction, untracked } from 'mobx';
13
+ import { readConfObject } from '../configuration/index.js';
14
+ import { getFileHandle, storeFileHandle, verifyPermission, } from './fileHandleStore.js';
15
+ import { getFileName } from './getFileName.js';
16
+ import { getContainingView, getEnv, getSession, objectHash, } from './mstUtils.js';
17
+ import { isViewModel } from './types/index.js';
18
+ // Deliberately uncached. This used to memoize on a permanent WeakMap keyed by
19
+ // track, but every caller reads it from inside a reactive getter or autorun: the
20
+ // memo meant the reaction never subscribed to the config, so editing
21
+ // assemblyNames in the config editor did not invalidate it. The reads are
22
+ // per-view-change, not per-feature, so MobX's own computed caching is enough.
6
23
  export function getTrackAssemblyNames(track) {
7
- let cached = trackAssemblyNamesCache.get(track);
8
- if (!cached) {
9
- cached = getConfAssemblyNames(track.configuration);
10
- trackAssemblyNamesCache.set(track, cached);
11
- }
12
- return cached;
13
- }
14
- export function getConfAssemblyNames(conf) {
24
+ return getConfAssemblyNames(track.configuration);
25
+ }
26
+ /**
27
+ * Assembly names as the aliases resolve them, so a track configured against
28
+ * `hg38` compares equal to a view on `GRCh38`. Every "does this track belong to
29
+ * these assemblies" test should run both sides through this, or the same track
30
+ * is offered by one picker and hidden by another.
31
+ *
32
+ * A name the assembly manager doesn't know is kept **as written**, not dropped.
33
+ * Dropping it means "matches nothing" on the track side but "no constraint at
34
+ * all" on the list side, and those disagree; kept, both sides compare the same
35
+ * raw string and matching degrades to the exact name — which is also the right
36
+ * answer in the window before the assembly manager has built its models. Empty
37
+ * names are dropped: a half-initialized view pads its assembly list with them.
38
+ */
39
+ export function canonicalAssemblyNames(names, assemblyManager) {
40
+ return names
41
+ .filter(name => !!name)
42
+ .map(name => assemblyManager.getCanonicalAssemblyName(name) ?? name);
43
+ }
44
+ /**
45
+ * Whether two names name the same assembly, resolving aliases on both sides.
46
+ *
47
+ * The pairwise counterpart to {@link canonicalAssemblyNames}, for the two
48
+ * places a list cannot be mapped: an index-aligned array, which that function's
49
+ * empty-name filter would desync, and a comparison where one side must come
50
+ * back in the caller's own spelling rather than the canonical one.
51
+ *
52
+ * **Both sides, or it buys nothing.** The names meeting at these comparisons
53
+ * come from different places — a view holds what the session opened it on, a
54
+ * track config holds what its author wrote, and a synteny mate holds whatever
55
+ * the adapter resolved a PanSN prefix to. Any two of those can be aliases of
56
+ * one assembly, and `===` says no.
57
+ *
58
+ * A name the assembly manager doesn't know compares as written, the same
59
+ * degradation {@link canonicalAssemblyNames} makes and for the same reason: an
60
+ * all-vs-all file carries sample names no config declares, and those still have
61
+ * to compare equal to themselves.
62
+ */
63
+ export function isSameAssemblyName(a, b, assemblyManager) {
64
+ if (!a || !b) {
65
+ return false;
66
+ }
67
+ return (a === b ||
68
+ (assemblyManager.getCanonicalAssemblyName(a) ?? a) ===
69
+ (assemblyManager.getCanonicalAssemblyName(b) ?? b));
70
+ }
71
+ /**
72
+ * The assemblies a track config names, or `undefined` when it names none.
73
+ *
74
+ * Two shapes, and the second is why this is a function rather than a slot read.
75
+ * A track built on `createBaseTrackConfig` carries `assemblyNames`.
76
+ * `ReferenceSequenceTrack` does not — its schema omits the slot deliberately
77
+ * (see `createReferenceSeqTrackConfig`), because the assembly config holding it
78
+ * IS its assembly, so the name is read off the parent instead.
79
+ *
80
+ * That makes a sequence track's assembly **positional**, so a copy of one that
81
+ * is not inside its assembly cannot answer at all — and a detached config is
82
+ * what every hydration path produces (`hydrateTrackConfig`, and the working
83
+ * copy a non-admin's edits would go to, ADR-032). `hasParent` is the guard:
84
+ * without it the walk raises MST's "Failed to find the parent" from a helper
85
+ * whose other two failure modes are a plain `undefined`.
86
+ */
87
+ function confAssemblyNames(conf) {
15
88
  const trackAssemblyNames = readConfObject(conf, 'assemblyNames');
16
- if (!trackAssemblyNames) {
17
- const parent = getParent(conf);
18
- if ('sequence' in parent) {
19
- return [readConfObject(parent, 'name')];
20
- }
21
- else {
22
- throw new Error('unknown assembly names');
23
- }
89
+ if (trackAssemblyNames) {
90
+ return trackAssemblyNames;
24
91
  }
25
- return trackAssemblyNames;
26
- }
27
- export function getRpcSessionId(thisNode) {
28
- let highestRpcSessionId;
29
- for (let node = thisNode; !isRoot(node); node = getParent(node)) {
30
- if ('rpcSessionId' in node) {
31
- highestRpcSessionId = node.rpcSessionId;
32
- }
33
- }
34
- if (!highestRpcSessionId) {
35
- throw new Error('getRpcSessionId failed, no parent node in the state tree has an `rpcSessionId` attribute');
92
+ if (!hasParent(conf)) {
93
+ return undefined;
36
94
  }
37
- return highestRpcSessionId;
95
+ const parent = getParent(conf);
96
+ return 'sequence' in parent
97
+ ? [readConfObject(parent, 'name')]
98
+ : undefined;
38
99
  }
39
- export function getParentRenderProps(node) {
40
- for (let currentNode = getParent(node); !isRoot(currentNode); currentNode = getParent(currentNode)) {
41
- if ('renderProps' in currentNode) {
42
- return currentNode.renderProps();
43
- }
44
- }
45
- return {};
100
+ export function getConfAssemblyNames(conf) {
101
+ const names = confAssemblyNames(conf);
102
+ if (!names) {
103
+ throw new Error('unknown assembly names');
104
+ }
105
+ return names;
106
+ }
107
+ /**
108
+ * {@link getConfAssemblyNames} for a caller that cannot afford its throw — a
109
+ * config answering neither way leaves the question unanswered instead.
110
+ *
111
+ * `BaseTrackModel.refNameMismatch` is the caller: it runs on every render of
112
+ * every track label, so an unanswerable question must not become a thrown
113
+ * getter. It used to read the raw `assemblyNames` slot itself for that reason,
114
+ * which is a second, subtly different copy of the walk above — and one that
115
+ * answers `[]` for a ReferenceSequenceTrack whose assembly this already knows
116
+ * how to name.
117
+ */
118
+ export function getConfAssemblyNamesOrNone(conf) {
119
+ return confAssemblyNames(conf) ?? [];
46
120
  }
47
121
  export const UNKNOWN = 'UNKNOWN';
48
122
  export const UNSUPPORTED = 'UNSUPPORTED';
@@ -53,10 +127,17 @@ export function getBlob(id) {
53
127
  export function getBlobMap() {
54
128
  return blobMap;
55
129
  }
130
+ // Populates the blobMap in a fresh JS realm (e.g. a web worker, which starts
131
+ // with an empty module-level blobMap). RPC args are the only channel into the
132
+ // worker, so the main thread ships its full blobMap and the worker replaces its
133
+ // own here before adapters call the synchronous getBlob() during openLocation.
56
134
  export function setBlobMap(map) {
57
135
  blobMap = map;
58
136
  }
59
137
  let counter = 0;
138
+ // blob files are stored in a global map. the blobId is based on a combination
139
+ // of timestamp plus counter to be unique across sessions and fast repeated
140
+ // calls
60
141
  export function storeBlobLocation(location) {
61
142
  if ('blob' in location) {
62
143
  const blobId = `b${Date.now()}-${counter++}`;
@@ -69,24 +150,33 @@ export function storeBlobLocation(location) {
69
150
  }
70
151
  return location;
71
152
  }
72
- let fileHandleCache = {};
153
+ // openLocation is synchronous, so File objects are cached here after async handle
154
+ // resolution. Observable so an open LocalFileChooser reactively clears its "needs
155
+ // reload" notice once a restore (afterAttach / "Restore access") populates the
156
+ // cache; the worker/RPC readers run outside any reaction so nothing else
157
+ // subscribes.
158
+ const fileHandleCache = observable.map();
73
159
  export function getFileFromCache(handleId) {
74
- return fileHandleCache[handleId];
160
+ return fileHandleCache.get(handleId);
75
161
  }
76
162
  export function setFileInCache(handleId, file) {
77
- fileHandleCache[handleId] = file;
163
+ runInAction(() => {
164
+ fileHandleCache.set(handleId, file);
165
+ });
78
166
  }
79
167
  export function clearFileFromCache(handleId) {
80
- delete fileHandleCache[handleId];
81
- }
82
- export function getFileHandleCache() {
83
- return fileHandleCache;
168
+ runInAction(() => {
169
+ fileHandleCache.delete(handleId);
170
+ });
84
171
  }
85
- export function setFileHandleCache(cache) {
86
- fileHandleCache = cache;
172
+ export function hasFileHandlesInCache() {
173
+ // read in RpcMethodType.serializeArguments, which an RPC-fetch autorun can
174
+ // reach; untracked so populating the cache never re-triggers that autorun
175
+ // eslint-disable-next-line no-restricted-syntax -- self-write: the fetch this is reached from populates the cache
176
+ return untracked(() => fileHandleCache.size > 0);
87
177
  }
88
178
  export async function ensureFileHandleReady(handleId, requestPermission = true) {
89
- const cached = fileHandleCache[handleId];
179
+ const cached = fileHandleCache.get(handleId);
90
180
  if (cached) {
91
181
  return cached;
92
182
  }
@@ -99,88 +189,100 @@ export async function ensureFileHandleReady(handleId, requestPermission = true)
99
189
  throw new Error(`Permission denied for file "${handle.name}". Click "Restore access" to grant permission.`);
100
190
  }
101
191
  const file = await handle.getFile();
102
- fileHandleCache[handleId] = file;
192
+ setFileInCache(handleId, file);
103
193
  return file;
104
194
  }
105
195
  export async function storeFileHandleLocation(handle) {
106
196
  const handleId = await storeFileHandle(handle);
107
197
  const file = await handle.getFile();
108
- fileHandleCache[handleId] = file;
198
+ setFileInCache(handleId, file);
109
199
  return {
110
200
  locationType: 'FileHandleLocation',
111
201
  name: handle.name,
112
202
  handleId,
113
203
  };
114
204
  }
205
+ async function settleFileHandle(handleId, requestPermission) {
206
+ try {
207
+ await ensureFileHandleReady(handleId, requestPermission);
208
+ return { handleId, success: true };
209
+ }
210
+ catch (error) {
211
+ return { handleId, success: false, error };
212
+ }
213
+ }
214
+ /**
215
+ * Resolves a batch of stored file handles, one result per id.
216
+ *
217
+ * With `requestPermission` set these run ONE AT A TIME, and that is the whole
218
+ * point of the branch. `requestPermission()` needs transient user activation and
219
+ * the browser puts a single file-access prompt on screen at a time, so N of them
220
+ * fired off one "Restore access" click means the first call takes the prompt and
221
+ * the rest are refused without the user ever seeing a dialog — files reported
222
+ * back as permission failures that nobody was asked about. Taking turns, each
223
+ * prompt waits for the one before it to be answered, and whatever the activation
224
+ * window no longer covers is simply still pending for the next click instead of
225
+ * being spent.
226
+ *
227
+ * Without it nothing can prompt, so there is nothing to take turns over and the
228
+ * batch runs at once.
229
+ */
115
230
  export async function restoreFileHandles(handleIds, requestPermission = false) {
231
+ if (!requestPermission) {
232
+ return Promise.all(handleIds.map(id => settleFileHandle(id, false)));
233
+ }
116
234
  const results = [];
117
235
  for (const handleId of handleIds) {
118
- try {
119
- await ensureFileHandleReady(handleId, requestPermission);
120
- results.push({ handleId, success: true });
121
- }
122
- catch (e) {
123
- results.push({ handleId, success: false, error: e });
124
- }
236
+ results.push(await settleFileHandle(handleId, true));
125
237
  }
126
238
  return results;
127
239
  }
128
- export function findFileHandleIds(obj, handleIds = new Set(), seen = new WeakSet()) {
129
- if (!obj || typeof obj !== 'object') {
130
- return handleIds;
131
- }
132
- if (seen.has(obj)) {
133
- return handleIds;
134
- }
135
- seen.add(obj);
136
- if (Array.isArray(obj)) {
137
- for (const item of obj) {
138
- findFileHandleIds(item, handleIds, seen);
240
+ export function findFileHandleIds(obj) {
241
+ const handleIds = new Set();
242
+ const seen = new WeakSet();
243
+ function walk(o) {
244
+ if (!o || typeof o !== 'object' || seen.has(o)) {
245
+ return;
139
246
  }
140
- }
141
- else {
142
- const record = obj;
143
- if (record.locationType === 'FileHandleLocation' &&
144
- typeof record.handleId === 'string') {
145
- handleIds.add(record.handleId);
247
+ seen.add(o);
248
+ if (Array.isArray(o)) {
249
+ for (const item of o) {
250
+ walk(item);
251
+ }
146
252
  }
147
- for (const value of Object.values(record)) {
148
- findFileHandleIds(value, handleIds, seen);
253
+ else {
254
+ const record = o;
255
+ if (record.locationType === 'FileHandleLocation' &&
256
+ typeof record.handleId === 'string') {
257
+ handleIds.add(record.handleId);
258
+ }
259
+ for (const value of Object.values(record)) {
260
+ walk(value);
261
+ }
149
262
  }
150
263
  }
264
+ walk(obj);
151
265
  return handleIds;
152
266
  }
153
267
  export async function restoreFileHandlesFromSnapshot(sessionSnapshot, requestPermission = false) {
154
- const handleIds = findFileHandleIds(sessionSnapshot);
155
- if (handleIds.size > 0) {
156
- return restoreFileHandles([...handleIds], requestPermission);
157
- }
158
- return [];
159
- }
160
- let pendingFileHandleIds = [];
161
- export function getPendingFileHandleIds() {
162
- return pendingFileHandleIds;
163
- }
164
- export function setPendingFileHandleIds(ids) {
165
- pendingFileHandleIds = ids;
166
- }
167
- export function clearPendingFileHandleIds() {
168
- pendingFileHandleIds = [];
169
- }
170
- export async function restorePendingFileHandles() {
171
- if (pendingFileHandleIds.length === 0) {
172
- return [];
173
- }
174
- const results = await restoreFileHandles(pendingFileHandleIds, true);
175
- const stillFailed = results.filter(r => !r.success).map(r => r.handleId);
176
- pendingFileHandleIds = stillFailed;
177
- return results;
178
- }
268
+ return restoreFileHandles([...findFileHandleIds(sessionSnapshot)], requestPermission);
269
+ }
270
+ /**
271
+ * creates a new location from the provided location including the appropriate
272
+ * suffix and location type
273
+ *
274
+ * @param location - the FileLocation
275
+ * @param suffix - the file suffix (e.g. .bam)
276
+ * @returns the constructed location object from the provided parameters
277
+ */
179
278
  export function makeIndex(location, suffix) {
180
279
  if ('uri' in location) {
181
280
  return {
182
281
  uri: location.uri + suffix,
183
282
  locationType: 'UriLocation',
283
+ // carry the parent's baseUri so a derived sibling index resolves against
284
+ // the same config location as the file it indexes
285
+ ...(location.baseUri ? { baseUri: location.baseUri } : {}),
184
286
  };
185
287
  }
186
288
  else if ('localPath' in location) {
@@ -193,36 +295,78 @@ export function makeIndex(location, suffix) {
193
295
  return location;
194
296
  }
195
297
  }
298
+ /**
299
+ * constructs a potential index file (with suffix) from the provided file name
300
+ *
301
+ * @param name - the name of the index file
302
+ * @param typeA - one option of a potential two file suffix (e.g. CSI, BAI)
303
+ * @param typeB - the second option of a potential two file suffix (e.g. CSI, BAI)
304
+ * @returns a likely name of the index file for a given filename
305
+ */
196
306
  export function makeIndexType(name, typeA, typeB) {
197
307
  return name?.toUpperCase().endsWith(typeA) ? typeA : typeB;
198
308
  }
199
- export function getFileName(track) {
200
- const uri = 'uri' in track ? track.uri : undefined;
201
- const localPath = 'localPath' in track ? track.localPath : undefined;
202
- const blob = 'blobId' in track ? track : undefined;
203
- const fileHandle = 'handleId' in track ? track : undefined;
204
- if (blob?.name) {
205
- return blob.name;
206
- }
207
- if (fileHandle?.name) {
208
- return fileHandle.name;
209
- }
210
- if (uri) {
211
- const normalized = uri.replace(/\\/g, '/');
212
- return normalized.slice(normalized.lastIndexOf('/') + 1);
213
- }
214
- if (localPath) {
215
- const normalized = localPath.replace(/\\/g, '/');
216
- return normalized.slice(normalized.lastIndexOf('/') + 1);
217
- }
218
- return '';
309
+ /**
310
+ * The `index` block a tabix-indexed adapter's guess writes: where the index is,
311
+ * and which of the two kinds it is.
312
+ *
313
+ * Eight guessers spelled this pair out by hand, which is the crossed-pair hazard
314
+ * `tabixIndexSnapshot` was extracted for on the config side: a `.csi` location
315
+ * filed under `indexType: 'TBI'` is a valid-looking config that opens no index
316
+ * at all, and nothing downstream can tell it from a correct one.
317
+ *
318
+ * BAM is deliberately not here, for the reason `tabixIndexFields` gives: BAI/CSI
319
+ * is a different enumeration over a different default, and folding the two would
320
+ * mean a slot whose vocabulary depends on its adapter.
321
+ */
322
+ export function guessTabixIndex(file, index) {
323
+ return {
324
+ location: index ?? makeIndex(file, '.tbi'),
325
+ indexType: makeIndexType(index && getFileName(index), 'CSI', 'TBI'),
326
+ };
327
+ }
328
+ /**
329
+ * Register a guess on `Core-guessAdapterForLocation`. Return an adapter config
330
+ * to claim the file, or `undefined` to defer to the plugins registered before
331
+ * this one.
332
+ *
333
+ * Prefer this over calling `addToExtensionPoint` directly: the chaining is done
334
+ * once here, so a plugin cannot break the chain by forgetting to delegate, nor
335
+ * drop an argument on the way through.
336
+ */
337
+ export function addAdapterGuesser(pluginManager, guess) {
338
+ pluginManager.addToExtensionPoint('Core-guessAdapterForLocation', next => (file, index, adapterHint) => guess(file, index, adapterHint) ?? next(file, index, adapterHint));
339
+ }
340
+ /**
341
+ * Register a guess on `Core-guessTrackTypeForLocation`. Return a track type
342
+ * name to claim the adapter, or `undefined` to defer. See `addAdapterGuesser`
343
+ * for why this wrapper exists — hand-written delegates here used to drop the
344
+ * optional `file`, which hid it from every guesser registered earlier in the
345
+ * chain.
346
+ */
347
+ export function addTrackTypeGuesser(pluginManager, guess) {
348
+ pluginManager.addToExtensionPoint('Core-guessTrackTypeForLocation', next => (adapterName, file) => guess(adapterName, file) ?? next(adapterName, file));
349
+ }
350
+ const COMPRESSION_SUFFIXES = ['.gz', '.bgz', '.bz2', '.zst'];
351
+ /**
352
+ * Drop the format extension from a filename, plus any compression suffix, so
353
+ * `volvox.vcf.gz` becomes `volvox` rather than `volvox.vcf`. Names with no
354
+ * extension, and dotfiles, are returned unchanged.
355
+ */
356
+ export function stripFileExtension(name) {
357
+ const lower = name.toLowerCase();
358
+ const base = COMPRESSION_SUFFIXES.some(suffix => lower.endsWith(suffix))
359
+ ? name.slice(0, name.lastIndexOf('.'))
360
+ : name;
361
+ const dot = base.lastIndexOf('.');
362
+ return dot > 0 ? base.slice(0, dot) : base;
219
363
  }
220
364
  export function guessAdapter(file, index, adapterHint, model) {
221
365
  if (model) {
222
366
  const { pluginManager } = getEnv(model);
223
- const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', (_file, _index, _adapterHint) => {
224
- return undefined;
225
- });
367
+ const adapterGuesser = pluginManager.evaluateExtensionPoint(
368
+ /** #extensionPoint Core-guessAdapterForLocation | sync | Guess an adapter config from a file location */
369
+ 'Core-guessAdapterForLocation', () => undefined);
226
370
  const adapter = adapterGuesser(file, index, adapterHint);
227
371
  if (adapter) {
228
372
  return adapter;
@@ -234,10 +378,14 @@ export function guessAdapter(file, index, adapterHint, model) {
234
378
  }
235
379
  export function guessTrackType(adapterType, model, file) {
236
380
  if (model) {
237
- const session = getSession(model);
238
- const trackTypeGuesser = getEnv(session).pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', (_adapterName) => {
239
- return undefined;
240
- });
381
+ // getEnv(model), not getEnv(getSession(model)): the env is tree-wide, so
382
+ // the session hop only narrowed what may be passed here — a session itself
383
+ // has no session ancestor, so guessAdapter above accepted one and this
384
+ // threw on it
385
+ const { pluginManager } = getEnv(model);
386
+ const trackTypeGuesser = pluginManager.evaluateExtensionPoint(
387
+ /** #extensionPoint Core-guessTrackTypeForLocation | sync | Guess a track type from a file location */
388
+ 'Core-guessTrackTypeForLocation', () => undefined);
241
389
  const trackType = trackTypeGuesser(adapterType, file);
242
390
  if (trackType) {
243
391
  return trackType;
@@ -245,102 +393,462 @@ export function guessTrackType(adapterType, model, file) {
245
393
  }
246
394
  return 'FeatureTrack';
247
395
  }
248
- export function generateUnsupportedTrackConf(trackName, trackUrl, categories) {
249
- const conf = {
250
- type: 'FeatureTrack',
251
- name: `${trackName} (Unsupported)`,
252
- description: `Support not yet implemented for "${trackUrl}"`,
253
- category: categories,
254
- trackId: '',
396
+ /**
397
+ * Expand a loose track description — a bare data-file URI, or an object with
398
+ * `uri` (and optional `index`) plus any extra config keys — into a full track
399
+ * config, the same inference the "Add track" flow does: the adapter and track
400
+ * type are guessed from the file via the format plugins, a stable `trackId` and
401
+ * a `name` are derived from the filename, and the assembly is stamped on. Extra
402
+ * keys on the input (`name`, `category`, `displays`, ...) override the inferred
403
+ * defaults. Takes a `pluginManager` (not a model) so it runs headlessly — in a
404
+ * worker/Node export as well as the browser. Throws when no format matches, so
405
+ * the caller can ask for a full config instead.
406
+ */
407
+ export function guessTrackConf(input, pluginManager, assemblyName) {
408
+ const { uri, index, ...extra } = typeof input === 'string' ? { uri: input } : input;
409
+ return {
410
+ ...guessTrackConfForLocation({ uri, locationType: 'UriLocation' }, index ? { uri: index, locationType: 'UriLocation' } : undefined, pluginManager, assemblyName),
411
+ ...extra,
255
412
  };
256
- conf.trackId = objectHash(conf);
257
- return conf;
258
413
  }
259
- export function generateUnknownTrackConf(trackName, trackUrl, categories) {
414
+ /**
415
+ * {@link guessTrackConf} over an already-built {@link FileLocation}, for a
416
+ * caller holding a location the loose `{ uri }` vocabulary cannot spell — a
417
+ * desktop local path. Kept separate so `LooseTrackInput` stays URI-only: it
418
+ * sits on the track-config union and the root config's `tracks`, where a
419
+ * local path would be a config a web deployment could not open.
420
+ *
421
+ * The `trackId` is a content hash of the adapter, not a timestamp, so adding
422
+ * the same file twice is idempotent — `addToSession` dedupes on it.
423
+ */
424
+ export function guessTrackConfForLocation(file, index, pluginManager, assemblyName) {
425
+ const adapterGuesser = pluginManager.evaluateExtensionPoint('Core-guessAdapterForLocation', () => undefined);
426
+ const adapter = adapterGuesser(file, index, undefined);
427
+ const name = getFileName(file);
428
+ if (!adapter || adapter.type === UNKNOWN) {
429
+ throw new Error(`could not infer a track type from "${name}"; pass a full track config instead`);
430
+ }
431
+ const trackTypeGuesser = pluginManager.evaluateExtensionPoint('Core-guessTrackTypeForLocation', () => undefined);
432
+ return {
433
+ trackId: `${name}-${objectHash(adapter).slice(0, 8)}`,
434
+ type: trackTypeGuesser(adapter.type, file) ?? 'FeatureTrack',
435
+ name,
436
+ assemblyNames: assemblyName ? [assemblyName] : [],
437
+ adapter,
438
+ };
439
+ }
440
+ /**
441
+ * Whether a track snapshot is the loose `{ uri, ... }` form — a data file with
442
+ * no `adapter` — that {@link expandLooseTrackConfig} expands.
443
+ */
444
+ export function isLooseTrackConfig(snap) {
445
+ return (typeof snap === 'object' &&
446
+ snap !== null &&
447
+ !Array.isArray(snap) &&
448
+ typeof snap.uri === 'string' &&
449
+ !('adapter' in snap));
450
+ }
451
+ /**
452
+ * Expand a loose track config into a full one and leave any other snapshot
453
+ * untouched, so it can sit on every path a track snapshot enters the tree by:
454
+ * the track config union, the root config's frozen `tracks`, `addTrackConf`,
455
+ * and `showTrackGeneric`'s inline config.
456
+ *
457
+ * `{ "trackId": "reads", "uri": "reads.bam", "assemblyNames": ["hg38"] }` is a
458
+ * whole track: the adapter and track type come from the file's extension
459
+ * through the format plugins' guessers, the same inference the "Add track"
460
+ * flow runs, and `name` defaults to the file name. Any key written beside
461
+ * `uri` — `trackId`, `name`, `category`, `displayDefaults`, an explicit `type`
462
+ * — overrides what was inferred. `assemblyName` fills `assemblyNames` when the
463
+ * snapshot has none, for a config or embed that has exactly one assembly.
464
+ */
465
+ export function expandLooseTrackConfig(snap, pluginManager, assemblyName) {
466
+ return isLooseTrackConfig(snap)
467
+ ? guessTrackConf(snap, pluginManager, assemblyName)
468
+ : snap;
469
+ }
470
+ function generateProblemTrackConf(trackName, categories, label, description) {
260
471
  const conf = {
261
472
  type: 'FeatureTrack',
262
- name: `${trackName} (Unknown)`,
263
- description: `Could not determine track type for "${trackUrl}"`,
473
+ name: `${trackName} (${label})`,
474
+ description,
264
475
  category: categories,
265
476
  trackId: '',
266
477
  };
267
478
  conf.trackId = objectHash(conf);
268
479
  return conf;
269
480
  }
481
+ export function generateUnsupportedTrackConf(trackName, trackUrl, categories) {
482
+ return generateProblemTrackConf(trackName, categories, 'Unsupported', `Support not yet implemented for "${trackUrl}"`);
483
+ }
484
+ export function generateUnknownTrackConf(trackName, trackUrl, categories) {
485
+ return generateProblemTrackConf(trackName, categories, 'Unknown', `Could not determine track type for "${trackUrl}"`);
486
+ }
270
487
  export function getTrackName(conf, session) {
271
- const trackName = isStateTreeNode(conf)
488
+ const isMst = isStateTreeNode(conf);
489
+ const trackName = isMst
272
490
  ? readConfObject(conf, 'name')
273
491
  : (conf.name ?? '');
274
- const trackType = isStateTreeNode(conf)
275
- ? readConfObject(conf, 'type')
276
- : conf.type;
492
+ const trackType = isMst ? readConfObject(conf, 'type') : conf.type;
277
493
  if (!trackName && trackType === 'ReferenceSequenceTrack') {
278
494
  const asm = session.assemblies.find(a => a.sequence === conf);
279
495
  return asm
280
496
  ? `Reference sequence (${readConfObject(asm, 'displayName') || readConfObject(asm, 'name')})`
281
497
  : 'Reference sequence';
282
498
  }
283
- return trackName;
499
+ const trackId = isMst
500
+ ? readConfObject(conf, 'trackId')
501
+ : (conf.trackId ?? '');
502
+ return trackName || trackId;
503
+ }
504
+ /**
505
+ * Which display a track opens with in a given view, and the display config that
506
+ * display must use: `{ type, conf }`, or undefined when the view supports none
507
+ * of the track's displays.
508
+ *
509
+ * Two decisions, in this order, and the order is the point. The **type** is what
510
+ * the caller asked for, else the track's first declared display the view
511
+ * supports, else the track type's first supported display. The **config** is
512
+ * then whichever declared entry has that type — never "the first supported one",
513
+ * which is what let a display be created wearing another display's config node
514
+ * (a multi-sample VCF declares both the matrix and the regular display, so the
515
+ * regular one inherited the matrix's 20px connector-line zone and drew its
516
+ * clustering tree offset from the rows it labels). `display.type ===
517
+ * display.configuration.type` is the invariant `DisplayConfigurationReference`
518
+ * already assumes when it falls back to resolving a display config by type; this
519
+ * is where it has to hold.
520
+ *
521
+ * `conf` is undefined when the track config declares no entry of that type;
522
+ * `baseTrackConfig.preProcessSnapshot` injects one for every registered display
523
+ * type, so the caller's `${trackId}-${type}` id resolves to it.
524
+ */
525
+ /**
526
+ * The display type names a view can render, as a lookup set. Built once per
527
+ * view and handed to {@link viewCanDisplayTrack} for every track, rather than
528
+ * rebuilt per track.
529
+ */
530
+ export function viewDisplayNames(pluginManager, viewType) {
531
+ return new Set(pluginManager.getViewType(viewType).displayTypes.map(d => d.name));
532
+ }
533
+ /**
534
+ * Whether a view rendering `viewDisplays` can open a track of this type at all
535
+ * — does the track type declare a display the view draws. The coarse half of
536
+ * the question {@link pickDisplayForView} answers precisely: a picker that
537
+ * offers a track this says no to is offering one `showTrackGeneric` will
538
+ * refuse.
539
+ *
540
+ * Reads the *track type's* registered displays rather than a config's own
541
+ * `displays` array, which is both cheaper and the only form available on an
542
+ * un-hydrated frozen track config (ADR-032). The two agree, since
543
+ * `preprocessTrackConfigSnapshot` injects a stub display for every display the
544
+ * track type registers.
545
+ *
546
+ * Two answers that are easy to get wrong, and both have been:
547
+ *
548
+ * - A type **no plugin registered** answers false rather than throwing.
549
+ * `getTrackType` throws on an unknown name, and a frozen track config never
550
+ * passes the schema that would have rejected it at load — so a config naming
551
+ * a plugin that failed to load put that throw inside whatever loop was
552
+ * filtering tracks, and one unopenable track took out the entire list. The
553
+ * track selector and jb2export's circular-view filter met this separately.
554
+ * - A view type registering **no displays at all** constrains nothing, so
555
+ * every track passes. That is a policy rather than a fact, and it lives here
556
+ * so the pickers agree on it.
557
+ */
558
+ export function viewCanDisplayTrack(pluginManager, viewDisplays, trackType) {
559
+ if (!pluginManager.trackTypes.has(trackType)) {
560
+ return false;
561
+ }
562
+ return (viewDisplays.size === 0 ||
563
+ pluginManager
564
+ .getTrackType(trackType)
565
+ .displayTypes.some(d => viewDisplays.has(d.name)));
566
+ }
567
+ export function pickDisplayForView({ declaredDisplays, requestedType, trackDisplayTypes, viewDisplayTypes, }) {
568
+ const supported = new Set(viewDisplayTypes);
569
+ const type = requestedType ??
570
+ declaredDisplays.find(d => supported.has(d.type))?.type ??
571
+ trackDisplayTypes.find(name => supported.has(name));
572
+ return type === undefined
573
+ ? undefined
574
+ : { type, conf: declaredDisplays.find(d => d.type === type) };
575
+ }
576
+ // #endregion
577
+ // Resolve a session-spec `TrackInit` into the (trackId, trackSnapshot,
578
+ // displaySnapshot) triple that `showTrackGeneric` expects. Display props written
579
+ // inline on the track object (everything except trackId/trackSnapshot/
580
+ // displaySnapshot) fold into the display snapshot, so a spec can write
581
+ // `{ trackId, showDescriptions: false }` instead of nesting under
582
+ // `displaySnapshot`. An explicit `displaySnapshot` still wins over an inline
583
+ // key of the same name, and the older nested form keeps working unchanged.
584
+ // `showTrackGeneric` then routes any inline key that is a real config slot (e.g.
585
+ // `forceLoad`) onto the display config, so a session spec can declaratively
586
+ // force-load a track with `{ trackId, forceLoad: true }`.
587
+ export function normalizeTrackInit(t) {
588
+ if (typeof t === 'string') {
589
+ return { trackId: t, trackSnapshot: {}, displaySnapshot: {} };
590
+ }
591
+ else {
592
+ const { trackId, trackSnapshot, displaySnapshot, ...rest } = t;
593
+ return {
594
+ trackId,
595
+ trackSnapshot: trackSnapshot ?? {},
596
+ displaySnapshot: { ...rest, ...displaySnapshot },
597
+ };
598
+ }
284
599
  }
285
- export function showTrackGeneric(self, trackId, initialSnapshot = {}, displayInitialSnapshot = {}) {
600
+ function resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf) {
286
601
  const { pluginManager } = getEnv(self);
287
602
  const session = getSession(self);
288
- const found = self.tracks.find(t => t.configuration.trackId === trackId);
289
- if (found) {
290
- return found;
291
- }
292
- const rawConf = session.getTracksById()[trackId];
603
+ // `trackId` seeds the expansion because `guessTrackConf` otherwise
604
+ // synthesizes one from the filename, and the dedupe in the callers and
605
+ // `hideTrackGeneric` both look the track up by the id the caller passed.
606
+ // Only for the loose form: spreading a live MST node (SvInspector's
607
+ // circular track) would flatten it out of the `isStateTreeNode` branch.
608
+ const inlineRawConf = isLooseTrackConfig(inlineConf)
609
+ ? expandLooseTrackConfig({ trackId, ...inlineConf }, pluginManager)
610
+ : inlineConf;
611
+ const rawConf = inlineRawConf ?? session.getTrackById(trackId);
293
612
  if (!rawConf) {
294
613
  throw new Error(`Could not resolve identifier "${trackId}"`);
295
614
  }
296
- const confSnapshot = isStateTreeNode(rawConf)
297
- ? getSnapshot(rawConf)
298
- : structuredClone(rawConf);
615
+ const confSnapshot = structuredClone(isStateTreeNode(rawConf) ? getSnapshot(rawConf) : rawConf);
299
616
  const conf = pluginManager.evaluateExtensionPoint('Core-preProcessTrackConfig', confSnapshot);
300
617
  const trackType = pluginManager.getTrackType(conf.type);
301
- if (!trackType) {
302
- throw new Error(`Unknown track type ${conf.type}`);
303
- }
304
- const viewType = pluginManager.getViewType(self.type);
305
- const supportedDisplays = new Set(viewType.displayTypes.map(d => d.name));
306
- const displays = conf.displays ?? [];
307
- const displayConf = displays.find((d) => supportedDisplays.has(d.type));
308
- const snapshotType = displayInitialSnapshot.type;
309
- const defaultDisplayType = displayConf?.type ??
310
- trackType.displayTypes.find(d => supportedDisplays.has(d.name))?.name;
311
- const displayType = snapshotType ?? defaultDisplayType;
312
- if (!displayType) {
313
- throw new Error(`Could not find a compatible display for view type ${self.type}`);
314
- }
315
- const displayId = displayConf?.displayId ?? `${trackId}-${displayType}`;
316
- const { type: _type, displayId: _displayId, ...displayConfState } = displayConf ?? {};
317
- const track = trackType.stateModel.create({
318
- ...initialSnapshot,
319
- type: conf.type,
320
- configuration: trackId,
321
- displays: [
322
- {
323
- type: displayType,
324
- configuration: displayId,
325
- ...displayConfState,
326
- ...displayInitialSnapshot,
327
- },
328
- ],
618
+ // Validate only a conf that is not already in the tree. `configSchema.create`
619
+ // here builds an entire config node and throws it away purely to surface a
620
+ // nice error; its preProcessSnapshot also re-runs Core-preProcessTrackConfig
621
+ // on a snapshot this function just preprocessed. A conf that is a state tree
622
+ // node was validated when MST created it, so all of that is pure waste on
623
+ // the common showTrack path.
624
+ if (!isStateTreeNode(rawConf)) {
625
+ try {
626
+ trackType.configSchema.create(conf, getEnv(self));
627
+ }
628
+ catch (e) {
629
+ throw new Error(`Track "${trackId}" has an invalid configuration: ${e}`, {
630
+ cause: e,
631
+ });
632
+ }
633
+ }
634
+ // A track container that isn't itself a view — a synteny level, which owns
635
+ // a track list but has no width and no registered view type — takes the
636
+ // display choice from the view it sits in, which is the same node
637
+ // getContainingView already resolves to for everything else beneath it.
638
+ const view = isViewModel(self) ? self : getContainingView(self);
639
+ const viewType = pluginManager.getViewType(view.type);
640
+ const picked = pickDisplayForView({
641
+ declaredDisplays: conf.displays ?? [],
642
+ requestedType: displayInitialSnapshot.type,
643
+ trackDisplayTypes: trackType.displayTypes.map(d => d.name),
644
+ viewDisplayTypes: viewType.displayTypes.map(d => d.name),
329
645
  });
330
- self.tracks.push(track);
331
- return track;
646
+ if (!picked) {
647
+ throw new Error(`Could not find a compatible display for view type ${view.type}`);
648
+ }
649
+ return { rawConf, conf, trackType, picked };
650
+ }
651
+ export function showTrackGeneric(self, trackId,
652
+ // `object`, annotated, rather than inferred from the default. A bare `{}`
653
+ // accepts every non-nullish value, numbers included, which is how a synteny
654
+ // level index typechecked its way into a track snapshot — see the dotplot and
655
+ // comparative views' own `showTrack`, whose second parameter is this one.
656
+ //
657
+ // `object` and not `Record<string, unknown>`: the hazard is a primitive, and
658
+ // an index signature additionally rejects the precise snapshot interfaces
659
+ // callers legitimately pass (jbrowse-img's `DisplaySnapshot` is one).
660
+ initialSnapshot = {}, displayInitialSnapshot = {},
661
+ // The config itself, for a track no session list holds: a view that
662
+ // synthesizes a track only it can draw passes the config here and it lives on
663
+ // the track node, so closing the track takes the config with it. Without it
664
+ // such a config has to be parked in a session list that outlives the view.
665
+ inlineConf) {
666
+ const { pluginManager } = getEnv(self);
667
+ const session = getSession(self);
668
+ const found = self.tracks.find(t => t.configuration.trackId === trackId);
669
+ if (found) {
670
+ return found;
671
+ }
672
+ // Single choke point for all "open a track" paths — errors surface as
673
+ // snackbars. Config is validated before the push so the open set never holds
674
+ // a broken track.
675
+ try {
676
+ const { rawConf, conf, trackType, picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
677
+ const { type: displayType, conf: displayConf } = picked;
678
+ const displayId = displayConf?.displayId ?? `${trackId}-${displayType}`;
679
+ // a registered display whose model is not loaded yet: the load re-enters
680
+ // through the view's own showTrack action, so a synchronous caller gets the
681
+ // track a tick late; a caller that needs it back awaits launchTrack
682
+ const displayRecord = pluginManager.resolveDisplayTypeRecord(displayType);
683
+ if (displayRecord && !displayRecord.isStateModelLoaded) {
684
+ void launchTrackGeneric(self, trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
685
+ return undefined;
686
+ }
687
+ const track = trackType.stateModel.create({
688
+ ...initialSnapshot,
689
+ type: conf.type,
690
+ // `rawConf`, not the caller's `inlineConf`: the loose `{ trackId, uri }`
691
+ // form has no `type` for the config schema to dispatch on, and the
692
+ // concrete schema this lands on carries no loose preprocessor — that one
693
+ // is on `pluggableConfigSchemaType('track')`, which a track model's
694
+ // `ConfigurationReference` is not. Not `conf` either: that has already
695
+ // run Core-preProcessTrackConfig, which the schema's own
696
+ // preProcessSnapshot runs again.
697
+ configuration: inlineConf ? rawConf : trackId,
698
+ displays: [
699
+ {
700
+ ...displayConf,
701
+ type: displayType,
702
+ configuration: displayId,
703
+ ...displayInitialSnapshot,
704
+ },
705
+ ],
706
+ });
707
+ self.tracks.push(track);
708
+ // Display settings (height, color, …) are config slots now, not display
709
+ // instance props — passed in the display snapshot they'd be dropped as
710
+ // unknown MST keys. applyDisplaySettings routes the ones that are real
711
+ // slots onto the persistent display config so they take effect and
712
+ // survive hide/retick (#5591), running the schema's preProcessSnapshot
713
+ // first so shorthand expansions and legacy-key migrations reach this path
714
+ // too — a session spec, share link, or embed writes slots here rather
715
+ // than creating a config from a snapshot, and those surfaces are meant to
716
+ // speak the same vocabulary. Runs after the push so the display's config
717
+ // reference can resolve. Slots only, deliberately: this is the
718
+ // declarative surface, and `allowSetters` stays off so a spec key cannot
719
+ // reach internal display actions.
720
+ //
721
+ // `type` is dropped first because this function already consumed it
722
+ // (pickDisplayForView above), and only `failed` — a key whose write threw —
723
+ // is notified: `unapplied` here also holds the MST display props the
724
+ // snapshot spread above already applied, so notifying on it would report a
725
+ // correct call as broken. A throwing slot value used to reach the outer
726
+ // catch and raise a snackbar; per-key catching kept the track intact but
727
+ // took the message away with it.
728
+ const displaySettings = Object.fromEntries(Object.entries(displayInitialSnapshot).filter(([key]) => key !== 'type'));
729
+ const report = track.applyDisplaySettings(displaySettings);
730
+ if (report.failed.length) {
731
+ session.notifyError(`Track "${trackId}" rejected ${report.failed
732
+ .map(f => `${f.key}: ${f.error}`)
733
+ .join('; ')}`);
734
+ }
735
+ // if this track came from a connection, persist its config so it survives
736
+ // reload without re-establishing the connection (no-op otherwise)
737
+ session.captureConnectionTrack?.(trackId);
738
+ return track;
739
+ }
740
+ catch (e) {
741
+ session.notifyError(`${e}`, e);
742
+ return undefined;
743
+ }
744
+ }
745
+ // Strip a track's identifier and its nested display identifiers (both are
746
+ // types.identifier) so a duplicated/copied snapshot doesn't collide with the
747
+ // source's ids when added back into the same session tree.
748
+ export function stripTrackIds(tracks) {
749
+ return tracks.map(({ id, displays, ...rest }) => ({
750
+ ...rest,
751
+ displays: displays.map(({ id, ...d }) => d),
752
+ }));
332
753
  }
333
754
  export function hideTrackGeneric(self, trackId) {
334
755
  const t = self.tracks.find(t => t.configuration.trackId === trackId);
335
756
  if (t) {
336
757
  self.tracks.remove(t);
337
- return 1;
758
+ // drop the persisted connection-track config if no other view holds it
759
+ // (persisted → guards saved-session size; the volatile working-copy cache
760
+ // in SessionTracks is deliberately not pruned, see editableTrackConfigs)
761
+ getSession(self).pruneConnectionTrackConfig?.(trackId);
762
+ return true;
338
763
  }
339
- return 0;
764
+ return false;
340
765
  }
766
+ // Returns true if the track is now shown, false if it was hidden or failed to
767
+ // open (callers use this to e.g. record only newly-opened tracks as recent).
341
768
  export function toggleTrackGeneric(self, trackId) {
342
- const hiddenCount = hideTrackGeneric(self, trackId);
343
- if (!hiddenCount) {
344
- showTrackGeneric(self, trackId);
769
+ return hideTrackGeneric(self, trackId)
770
+ ? false
771
+ : !!showTrackGeneric(self, trackId);
772
+ }
773
+ export async function launchTrackGeneric(self, trackId, initialSnapshot = {}, displayInitialSnapshot = {}, inlineConf) {
774
+ const { pluginManager } = getEnv(self);
775
+ const session = getSession(self);
776
+ const found = self.tracks.find(t => t.configuration.trackId === trackId);
777
+ if (found) {
778
+ return found;
779
+ }
780
+ try {
781
+ const { picked } = resolveTrackDisplayChoice(self, trackId, displayInitialSnapshot, inlineConf);
782
+ await pluginManager.resolveDisplayTypeRecord(picked.type)?.loadStateModel();
783
+ }
784
+ catch (e) {
785
+ session.notifyError(`${e}`, e);
786
+ return undefined;
787
+ }
788
+ if (!isAlive(self)) {
789
+ return undefined;
790
+ }
791
+ return self.showTrack?.(trackId, initialSnapshot, displayInitialSnapshot, inlineConf);
792
+ }
793
+ // the hide runs in the synchronous prologue, so it keeps action context
794
+ export async function launchToggleTrackGeneric(self, trackId) {
795
+ return hideTrackGeneric(self, trackId)
796
+ ? false
797
+ : !!(await launchTrackGeneric(self, trackId));
798
+ }
799
+ /**
800
+ * Every track config the session can show, connection-supplied ones included.
801
+ *
802
+ * `session.tracks` is only sessionTracks plus the admin config (see
803
+ * product-core's SessionTracks), so a track that arrived from a hub or registry
804
+ * connection is absent from it while still being toggleable from the track
805
+ * selector, which unions the same two sources. Anything answering "what tracks
806
+ * exist for X" wants this, or a feature silently can't see connection tracks.
807
+ *
808
+ * Note `session.tracks` already contains `sessionTracks` — unioning those two
809
+ * yields every session track twice.
810
+ */
811
+ export function allSessionTracks(session) {
812
+ const connectionTracks = (session.connectionInstances ?? []).flatMap(conn => conn.tracks);
813
+ return connectionTracks.length
814
+ ? [...session.tracks, ...connectionTracks]
815
+ : session.tracks;
816
+ }
817
+ /**
818
+ * The session's annotation for `assemblyName`, as trackIds: what a view opened
819
+ * on another genome starts with. Only FeatureTracks, not everything configured
820
+ * for the assembly — an alignments track turned on behind the user's back
821
+ * fetches data nobody asked for, and a FeatureTrack over a few kb is one tabix
822
+ * range query.
823
+ */
824
+ export function annotationTrackIds(session, assemblyName) {
825
+ return allSessionTracks(session).flatMap(track => readConfObject(track, 'type') === 'FeatureTrack' &&
826
+ readConfObject(track, 'assemblyNames').some(name => isSameAssemblyName(name, assemblyName, session.assemblyManager))
827
+ ? [readConfObject(track, 'trackId')]
828
+ : []);
829
+ }
830
+ function isNavigableView(view) {
831
+ return 'navToLocString' in view;
832
+ }
833
+ /**
834
+ * One assembly on its own in a linear genome view, at `loc`. Keyed on `id`:
835
+ * following several alignments to one genome re-navigates the view rather than
836
+ * stacking a new one each time.
837
+ */
838
+ export async function openAssemblyInLinearView({ session, id, assemblyName, loc, tracks, }) {
839
+ const view = session.views.find(v => v.id === id);
840
+ if (view && isNavigableView(view)) {
841
+ await view.navToLocString(loc, assemblyName);
842
+ }
843
+ else {
844
+ session.addView('LinearGenomeView', {
845
+ id,
846
+ assembly: assemblyName,
847
+ loc,
848
+ tracks,
849
+ });
345
850
  }
346
851
  }
852
+ export function openMateLabel(assemblyName) {
853
+ return `Open ${assemblyName} at the matching region`;
854
+ }