@jbrowse/core 4.3.0 → 5.0.0-beta.10

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