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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (637) hide show
  1. package/README.md +1709 -390
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -5
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +34 -29
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/BaseCard.js +1 -4
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.d.ts +11 -0
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/BasicValue.js +37 -14
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.d.ts +1 -1
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +15 -31
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +4 -3
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +12 -25
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.d.ts +11 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetailsFrame.js +11 -0
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/Formatter.js +6 -4
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.d.ts +4 -0
  19. package/esm/BaseFeatureWidget/BaseFeatureDetail/ParentFeatureLine.js +17 -0
  20. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  21. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  22. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +6 -2
  23. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +7 -18
  24. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  25. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +49 -0
  26. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  27. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +6 -29
  28. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  29. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceFeaturePanel.d.ts +2 -2
  30. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceName.js +2 -2
  31. package/esm/BaseFeatureWidget/SequenceFeatureDetails/dialogs/TranscriptSelector.js +3 -1
  32. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.d.ts +12 -0
  33. package/esm/BaseFeatureWidget/SequenceFeatureDetails/model.js +12 -5
  34. package/esm/BaseFeatureWidget/SequenceFeatureDetails/useSequenceData.js +8 -5
  35. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  36. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  37. package/esm/BaseFeatureWidget/formatDetails.js +62 -83
  38. package/esm/BaseFeatureWidget/index.d.ts +2 -1
  39. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +42 -29
  40. package/esm/BaseFeatureWidget/stateModelFactory.js +98 -98
  41. package/esm/BaseFeatureWidget/types.d.ts +12 -6
  42. package/esm/BaseFeatureWidget/util.d.ts +0 -10
  43. package/esm/BaseFeatureWidget/util.js +0 -17
  44. package/esm/CorePlugin.js +34 -3
  45. package/esm/PluginLoader.d.ts +24 -13
  46. package/esm/PluginLoader.js +167 -51
  47. package/esm/PluginManager.d.ts +130 -24
  48. package/esm/PluginManager.js +180 -32
  49. package/esm/ReExports/MuiDataGridReExports.d.ts +1 -0
  50. package/esm/ReExports/MuiDataGridReExports.js +2 -2
  51. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  52. package/esm/ReExports/coreModules.generated.js +530 -0
  53. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  54. package/esm/ReExports/coreWorkerModules.generated.js +490 -0
  55. package/esm/ReExports/frameworkModules.d.ts +2 -0
  56. package/esm/ReExports/frameworkModules.js +68 -0
  57. package/esm/ReExports/frameworkShared.d.ts +12 -0
  58. package/esm/ReExports/frameworkShared.js +16 -0
  59. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  60. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  61. package/esm/ReExports/list.js +528 -79
  62. package/esm/ReExports/modules.d.ts +1 -1
  63. package/esm/ReExports/modules.js +10 -165
  64. package/esm/ReExports/registry.d.ts +1 -0
  65. package/esm/ReExports/registry.js +23 -5
  66. package/esm/ReExports/uiStub.d.ts +3 -0
  67. package/esm/ReExports/uiStub.js +33 -0
  68. package/esm/ReExports/workerModules.d.ts +2 -0
  69. package/esm/ReExports/workerModules.js +11 -0
  70. package/esm/TextSearch/TextSearchManager.d.ts +27 -13
  71. package/esm/TextSearch/TextSearchManager.js +77 -36
  72. package/esm/TextSearch/places.d.ts +12 -0
  73. package/esm/TextSearch/places.js +94 -0
  74. package/esm/assemblyManager/assembly.d.ts +21 -19
  75. package/esm/assemblyManager/assembly.js +28 -26
  76. package/esm/assemblyManager/assemblyAdapters.d.ts +1 -1
  77. package/esm/assemblyManager/assemblyAdapters.js +8 -2
  78. package/esm/assemblyManager/assemblyConfigSchema.d.ts +31 -90
  79. package/esm/assemblyManager/assemblyConfigSchema.js +35 -47
  80. package/esm/assemblyManager/assemblyManager.d.ts +35 -180
  81. package/esm/assemblyManager/assemblyManager.js +47 -51
  82. package/esm/assemblyManager/expandAssemblyConfigShorthand.d.ts +25 -18
  83. package/esm/assemblyManager/expandAssemblyConfigShorthand.js +78 -49
  84. package/esm/assemblyManager/geneticCodes.js +2 -5
  85. package/esm/assemblyManager/getSequenceAdapterConfig.d.ts +10 -0
  86. package/esm/assemblyManager/getSequenceAdapterConfig.js +10 -0
  87. package/esm/assemblyManager/indexAssemblyNames.d.ts +9 -0
  88. package/esm/assemblyManager/indexAssemblyNames.js +22 -0
  89. package/esm/assemblyManager/loadRefNameMap.d.ts +1 -1
  90. package/esm/assemblyManager/loadRefNameMap.js +4 -9
  91. package/esm/assemblyManager/refNameMapKey.d.ts +7 -0
  92. package/esm/assemblyManager/refNameMapKey.js +12 -0
  93. package/esm/checkPlugins.d.ts +2 -0
  94. package/esm/checkPlugins.js +38 -17
  95. package/esm/configuration/bamIndexFields.d.ts +49 -0
  96. package/esm/configuration/bamIndexFields.js +41 -0
  97. package/esm/configuration/configurationSchema.d.ts +101 -71
  98. package/esm/configuration/configurationSchema.js +207 -134
  99. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  100. package/esm/configuration/configurationSchemaUnion.js +56 -0
  101. package/esm/configuration/configurationSlot.d.ts +150 -60
  102. package/esm/configuration/configurationSlot.js +103 -75
  103. package/esm/configuration/fillLocations.d.ts +14 -0
  104. package/esm/configuration/fillLocations.js +14 -0
  105. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  106. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  107. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  108. package/esm/configuration/fullConfSnapshot.d.ts +4 -19
  109. package/esm/configuration/fullConfSnapshot.js +30 -52
  110. package/esm/configuration/getConf.d.ts +45 -41
  111. package/esm/configuration/getConf.js +111 -44
  112. package/esm/configuration/index.d.ts +26 -11
  113. package/esm/configuration/index.js +16 -7
  114. package/esm/configuration/indexType.d.ts +26 -0
  115. package/esm/configuration/indexType.js +38 -0
  116. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  117. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  118. package/esm/configuration/plot.d.ts +61 -0
  119. package/esm/configuration/plot.js +142 -0
  120. package/esm/configuration/readConfObject.d.ts +2 -24
  121. package/esm/configuration/readConfObject.js +20 -63
  122. package/esm/configuration/requirements.d.ts +37 -0
  123. package/esm/configuration/requirements.js +88 -0
  124. package/esm/configuration/schemaRegistry.d.ts +32 -15
  125. package/esm/configuration/schemaRegistry.js +33 -35
  126. package/esm/configuration/schemaTypes.d.ts +21 -5
  127. package/esm/configuration/schemaTypes.js +66 -55
  128. package/esm/configuration/slotFacade.d.ts +12 -29
  129. package/esm/configuration/slotFacade.js +44 -23
  130. package/esm/configuration/snapshotPreprocess.d.ts +43 -0
  131. package/esm/configuration/snapshotPreprocess.js +161 -0
  132. package/esm/configuration/tabixIndexFields.d.ts +30 -4
  133. package/esm/configuration/tabixIndexFields.js +21 -4
  134. package/esm/configuration/tabixShorthand.d.ts +34 -17
  135. package/esm/configuration/tabixShorthand.js +49 -22
  136. package/esm/configuration/types.d.ts +182 -43
  137. package/esm/configuration/uriShorthand.d.ts +9 -0
  138. package/esm/configuration/uriShorthand.js +16 -0
  139. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +13 -19
  140. package/esm/data_adapters/BaseAdapter/BaseAdapter.js +12 -19
  141. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +40 -2
  142. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +68 -5
  143. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +40 -0
  144. package/esm/data_adapters/BaseAdapter/featureDensity.js +31 -0
  145. package/esm/data_adapters/BaseAdapter/index.d.ts +23 -3
  146. package/esm/data_adapters/BaseAdapter/index.js +1 -0
  147. package/esm/data_adapters/BaseAdapter/rowSources.d.ts +37 -0
  148. package/esm/data_adapters/BaseAdapter/rowSources.js +7 -0
  149. package/esm/data_adapters/BaseAdapter/stats.d.ts +33 -1
  150. package/esm/data_adapters/BaseAdapter/stats.js +52 -13
  151. package/esm/data_adapters/BaseAdapter/types.d.ts +8 -12
  152. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  153. package/esm/data_adapters/CytobandAdapter/CytobandAdapter.js +1 -1
  154. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +7 -11
  155. package/esm/data_adapters/CytobandAdapter/configSchema.js +3 -17
  156. package/esm/data_adapters/dataAdapterCache.d.ts +19 -2
  157. package/esm/data_adapters/dataAdapterCache.js +44 -10
  158. package/esm/data_adapters/getFeatureAdapter.d.ts +6 -4
  159. package/esm/data_adapters/getFeatureAdapter.js +8 -8
  160. package/esm/data_adapters/getSequenceSubAdapter.d.ts +7 -9
  161. package/esm/data_adapters/getSequenceSubAdapter.js +8 -10
  162. package/esm/pluggableElementTypes/AdapterType.d.ts +8 -8
  163. package/esm/pluggableElementTypes/AdapterType.js +1 -1
  164. package/esm/pluggableElementTypes/DisplayType.d.ts +53 -16
  165. package/esm/pluggableElementTypes/DisplayType.js +28 -12
  166. package/esm/pluggableElementTypes/LazyStateModelElement.d.ts +32 -0
  167. package/esm/pluggableElementTypes/LazyStateModelElement.js +77 -0
  168. package/esm/pluggableElementTypes/PluggableElementBase.d.ts +3 -5
  169. package/esm/pluggableElementTypes/PluggableElementBase.js +3 -5
  170. package/esm/pluggableElementTypes/RpcMethodType.d.ts +11 -1
  171. package/esm/pluggableElementTypes/RpcMethodType.js +25 -9
  172. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  173. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  174. package/esm/pluggableElementTypes/ViewType.d.ts +20 -4
  175. package/esm/pluggableElementTypes/ViewType.js +32 -4
  176. package/esm/pluggableElementTypes/WidgetType.d.ts +6 -0
  177. package/esm/pluggableElementTypes/WidgetType.js +6 -0
  178. package/esm/pluggableElementTypes/addMenuItems.d.ts +3 -2
  179. package/esm/pluggableElementTypes/extendElementType.d.ts +1 -2
  180. package/esm/pluggableElementTypes/extendElementType.js +9 -5
  181. package/esm/pluggableElementTypes/index.d.ts +2 -1
  182. package/esm/pluggableElementTypes/index.js +2 -9
  183. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +19 -9
  184. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +122 -28
  185. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +155 -11
  186. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +65 -16
  187. package/esm/pluggableElementTypes/models/BaseTrackModel.js +179 -117
  188. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +87 -18
  189. package/esm/pluggableElementTypes/models/BaseViewModel.js +54 -11
  190. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  191. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +15 -11
  192. package/esm/pluggableElementTypes/models/assertDisplayContract.js +25 -32
  193. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  194. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  195. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  196. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +108 -147
  197. package/esm/pluggableElementTypes/models/baseTrackConfig.js +96 -73
  198. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +4 -6
  199. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  200. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  201. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +23 -13
  202. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +80 -48
  203. package/esm/pluggableElementTypes/models/index.d.ts +2 -3
  204. package/esm/pluggableElementTypes/models/index.js +2 -3
  205. package/esm/pluggableElementTypes/models/migrateTrackConfig.d.ts +15 -1
  206. package/esm/pluggableElementTypes/models/migrateTrackConfig.js +85 -25
  207. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +4 -3
  208. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +141 -19
  209. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  210. package/esm/pluginDefinitions.d.ts +34 -7
  211. package/esm/pluginDefinitions.js +54 -20
  212. package/esm/rpc/BaseRpcDriver.d.ts +2 -2
  213. package/esm/rpc/BaseRpcDriver.js +25 -30
  214. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  215. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  216. package/esm/rpc/RpcClient.d.ts +18 -6
  217. package/esm/rpc/RpcClient.js +51 -16
  218. package/esm/rpc/RpcManager.d.ts +14 -10
  219. package/esm/rpc/RpcManager.js +11 -1
  220. package/esm/rpc/RpcRegistry.d.ts +40 -7
  221. package/esm/rpc/RpcServer.d.ts +3 -1
  222. package/esm/rpc/RpcServer.js +19 -12
  223. package/esm/rpc/WebWorkerRpcDriver.d.ts +11 -4
  224. package/esm/rpc/WebWorkerRpcDriver.js +64 -68
  225. package/esm/rpc/byteBudget.d.ts +20 -5
  226. package/esm/rpc/byteBudget.js +16 -5
  227. package/esm/rpc/configSchema.d.ts +7 -21
  228. package/esm/rpc/coreRpcMethods.d.ts +4 -0
  229. package/esm/rpc/coreRpcMethods.js +4 -0
  230. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  231. package/esm/rpc/methods/CoreGetEncodedFeature.js +32 -0
  232. package/esm/rpc/methods/CoreGetEncodedLayers.d.ts +16 -0
  233. package/esm/rpc/methods/CoreGetEncodedLayers.js +59 -0
  234. package/esm/rpc/methods/CoreGetExportData.js +3 -4
  235. package/esm/rpc/methods/CoreGetFeatureDensity.d.ts +11 -0
  236. package/esm/rpc/methods/CoreGetFeatureDensity.js +22 -0
  237. package/esm/rpc/methods/CoreGetFeatures.js +3 -5
  238. package/esm/rpc/methods/CoreGetRefNames.js +2 -12
  239. package/esm/rpc/methods/CoreGetRegionByteEstimate.js +1 -1
  240. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  241. package/esm/rpc/methods/CoreLoadAdapterCode.d.ts +13 -0
  242. package/esm/rpc/methods/CoreLoadAdapterCode.js +16 -0
  243. package/esm/rpc/methods/layerFeatures.d.ts +33 -0
  244. package/esm/rpc/methods/layerFeatures.js +29 -0
  245. package/esm/svg/SvgExport.js +6 -7
  246. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  247. package/esm/svg/SvgThemeProviders.js +15 -0
  248. package/esm/svg/exportViewSvg.d.ts +28 -0
  249. package/esm/svg/exportViewSvg.js +13 -0
  250. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  251. package/esm/svg/normalizeSvgMarkup.js +99 -0
  252. package/esm/svg/serializeSvg.d.ts +7 -0
  253. package/esm/svg/serializeSvg.js +11 -0
  254. package/esm/svg/svgId.d.ts +1 -1
  255. package/esm/svg/svgId.js +1 -1
  256. package/esm/svg/svgReady.d.ts +9 -7
  257. package/esm/svg/svgReady.js +8 -7
  258. package/esm/svg/trackNames.d.ts +7 -5
  259. package/esm/svg/trackNames.js +12 -9
  260. package/esm/svg/wrapSvgExport.js +6 -74
  261. package/esm/ui/AddCustomPluginDialog.js +3 -8
  262. package/esm/ui/AppReadyMarker.d.ts +45 -0
  263. package/esm/ui/AppReadyMarker.js +89 -0
  264. package/esm/ui/BaseExportSvgDialog.d.ts +1 -1
  265. package/esm/ui/CascadingMenu.js +181 -104
  266. package/esm/ui/DropDownMenu.js +2 -1
  267. package/esm/ui/ErrorBanner.js +1 -1
  268. package/esm/ui/ErrorBoundary.d.ts +2 -2
  269. package/esm/ui/ErrorMessageStackTraceContents.js +2 -1
  270. package/esm/ui/ErrorMessageStackTraceDialog.js +5 -11
  271. package/esm/ui/ExportSvgDialog.d.ts +1 -1
  272. package/esm/ui/FileDropZone.js +2 -1
  273. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  274. package/esm/ui/HoverMenu.d.ts +1 -2
  275. package/esm/ui/HoverMenu.js +6 -3
  276. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  277. package/esm/ui/JexlFilterDialog.js +122 -50
  278. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  279. package/esm/ui/JexlFilterRowEditors.js +90 -0
  280. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  281. package/esm/ui/LazyBaseTooltip.js +9 -0
  282. package/esm/ui/LegendSwatchGlyph.js +26 -21
  283. package/esm/ui/LoadingOverlay.d.ts +14 -0
  284. package/esm/ui/LoadingOverlay.js +4 -2
  285. package/esm/ui/MenuTypes.d.ts +23 -53
  286. package/esm/ui/MenuTypes.js +3 -0
  287. package/esm/ui/MonospaceTextField.d.ts +2 -1
  288. package/esm/ui/MonospaceTextField.js +23 -20
  289. package/esm/ui/PaletteContext.d.ts +10 -5
  290. package/esm/ui/PaletteContext.js +44 -6
  291. package/esm/ui/RefNameAutocomplete/SearchOption.d.ts +13 -0
  292. package/esm/ui/RefNameAutocomplete/SearchOption.js +45 -0
  293. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  294. package/esm/ui/RefNameAutocomplete/index.js +8 -2
  295. package/esm/ui/RefNameAutocomplete/util.d.ts +13 -0
  296. package/esm/ui/RefNameAutocomplete/util.js +42 -1
  297. package/esm/ui/ResizeHandle.d.ts +3 -1
  298. package/esm/ui/ResizeHandle.js +44 -11
  299. package/esm/ui/ScrollChrome.d.ts +13 -0
  300. package/esm/ui/ScrollChrome.js +11 -0
  301. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  302. package/esm/ui/ScrollEdgeShadow.js +14 -35
  303. package/esm/ui/ScrollZoomToggle.d.ts +4 -27
  304. package/esm/ui/ScrollZoomToggle.js +34 -51
  305. package/esm/ui/SessionJsonPanel.d.ts +3 -0
  306. package/esm/ui/SessionJsonPanel.js +14 -0
  307. package/esm/ui/SettingsChangesTable.d.ts +1 -0
  308. package/esm/ui/SettingsChangesTable.js +49 -11
  309. package/esm/ui/ShareLinkField.d.ts +1 -3
  310. package/esm/ui/ShareLinkField.js +13 -40
  311. package/esm/ui/SizeSliderRow.d.ts +1 -3
  312. package/esm/ui/SizeSliderRow.js +4 -6
  313. package/esm/ui/SnackbarModel.js +79 -67
  314. package/esm/ui/StatusProgressBar.js +2 -2
  315. package/esm/ui/SvgColorLegend.d.ts +9 -4
  316. package/esm/ui/SvgColorLegend.js +82 -41
  317. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  318. package/esm/ui/VerticalScrollbar.js +29 -83
  319. package/esm/ui/ViewLoadingScreen.d.ts +5 -4
  320. package/esm/ui/ViewLoadingScreen.js +8 -32
  321. package/esm/ui/colorScale.d.ts +92 -0
  322. package/esm/ui/colorScale.js +72 -0
  323. package/esm/ui/colors.d.ts +64 -0
  324. package/esm/ui/colors.js +230 -1
  325. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  326. package/esm/ui/hoverBoxStyle.js +17 -2
  327. package/esm/ui/index.d.ts +12 -12
  328. package/esm/ui/index.js +14 -22
  329. package/esm/ui/launchViewMenu.js +15 -5
  330. package/esm/ui/legendMenuItem.d.ts +10 -32
  331. package/esm/ui/legendMenuItem.js +9 -36
  332. package/esm/ui/legendSpec.d.ts +15 -8
  333. package/esm/ui/legendSpec.js +14 -23
  334. package/esm/ui/makeSizeMenu.d.ts +0 -6
  335. package/esm/ui/makeSizeMenu.js +6 -30
  336. package/esm/ui/measureLegendText.js +1 -1
  337. package/esm/ui/menuItemAdornment.d.ts +9 -20
  338. package/esm/ui/menuItemAdornment.js +10 -32
  339. package/esm/ui/menuItems.d.ts +2 -7
  340. package/esm/ui/menuItems.js +1 -6
  341. package/esm/ui/multiTrackMenuItems.d.ts +6 -0
  342. package/esm/ui/palette.d.ts +118 -116
  343. package/esm/ui/palette.js +114 -75
  344. package/esm/ui/replaceViewAction.d.ts +1 -1
  345. package/esm/ui/replaceViewAction.js +1 -1
  346. package/esm/ui/theme.d.ts +43 -119
  347. package/esm/ui/theme.js +62 -78
  348. package/esm/ui/toggleMenuItems.d.ts +1 -3
  349. package/esm/ui/toggleMenuItems.js +6 -5
  350. package/esm/ui/useAssemblySelection.d.ts +4 -4
  351. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  352. package/esm/ui/viewHeaderHeight.js +1 -0
  353. package/esm/util/Base1DUtils.d.ts +5 -3
  354. package/esm/util/Base1DUtils.js +14 -6
  355. package/esm/util/Base1DViewModel.d.ts +2 -1
  356. package/esm/util/Base1DViewModel.js +3 -2
  357. package/esm/util/SvgCanvas.d.ts +15 -13
  358. package/esm/util/SvgCanvas.js +76 -56
  359. package/esm/util/TimeTraveller.d.ts +3 -0
  360. package/esm/util/TimeTraveller.js +34 -2
  361. package/esm/util/aborting.d.ts +39 -0
  362. package/esm/util/aborting.js +88 -6
  363. package/esm/util/adapterMetadata.d.ts +1 -1
  364. package/esm/util/adapterMetadata.js +6 -5
  365. package/esm/util/addAndShowTrack.d.ts +2 -5
  366. package/esm/util/addAndShowTrack.js +5 -1
  367. package/esm/util/addRelativeUris.d.ts +17 -5
  368. package/esm/util/addRelativeUris.js +46 -10
  369. package/esm/util/addTrackFromWidget.d.ts +2 -5
  370. package/esm/util/addTrackFromWidget.js +5 -4
  371. package/esm/util/aggregateFieldName.d.ts +10 -0
  372. package/esm/util/aggregateFieldName.js +8 -0
  373. package/esm/util/analytics.js +46 -13
  374. package/esm/util/animationAllowed.d.ts +9 -0
  375. package/esm/util/animationAllowed.js +13 -0
  376. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  377. package/esm/util/applyRowResizeWheel.js +10 -21
  378. package/esm/util/bandHeight.d.ts +10 -0
  379. package/esm/util/bandHeight.js +29 -0
  380. package/esm/util/bandLayout.d.ts +4 -4
  381. package/esm/util/bandLayout.js +4 -4
  382. package/esm/util/baseDisplayConfig.d.ts +8 -0
  383. package/esm/util/baseDisplayConfig.js +27 -0
  384. package/esm/util/bezierConnector.d.ts +4 -3
  385. package/esm/util/bezierConnector.js +38 -45
  386. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  387. package/esm/util/bgzfWorkerPool.js +20 -74
  388. package/esm/util/binnedAggregate.d.ts +17 -0
  389. package/esm/util/binnedAggregate.js +275 -0
  390. package/esm/util/cacheBudgets.d.ts +22 -19
  391. package/esm/util/cacheBudgets.js +22 -19
  392. package/esm/util/cachedSetup.d.ts +16 -6
  393. package/esm/util/cachedSetup.js +108 -38
  394. package/esm/util/categoricalField.d.ts +56 -0
  395. package/esm/util/categoricalField.js +73 -0
  396. package/esm/util/cellMatches.d.ts +23 -0
  397. package/esm/util/cellMatches.js +264 -0
  398. package/esm/util/cellsStep.d.ts +29 -0
  399. package/esm/util/cellsStep.js +437 -0
  400. package/esm/util/clampToContig.d.ts +17 -0
  401. package/esm/util/clampToContig.js +19 -0
  402. package/esm/util/coarseStripHTML.js +1 -2
  403. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  404. package/esm/util/color/cssColorsLevel4.js +1 -0
  405. package/esm/util/color/index.d.ts +5 -3
  406. package/esm/util/color/index.js +7 -4
  407. package/esm/util/colorBits.d.ts +3 -3
  408. package/esm/util/colorBits.js +19 -44
  409. package/esm/util/colorRamp.d.ts +49 -5
  410. package/esm/util/colorRamp.js +169 -18
  411. package/esm/util/colorScale.d.ts +156 -0
  412. package/esm/util/colorScale.js +243 -0
  413. package/esm/util/colorSchemes.d.ts +21 -0
  414. package/esm/util/colorSchemes.js +30 -0
  415. package/esm/util/copyToClipboard.js +8 -1
  416. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +21 -23
  417. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +21 -52
  418. package/esm/util/createSvgRasterCanvas.d.ts +10 -0
  419. package/esm/util/cssColorParse.d.ts +15 -0
  420. package/esm/util/cssColorParse.js +53 -0
  421. package/esm/util/diagonalizeRegions.d.ts +2 -3
  422. package/esm/util/diagonalizeRegions.js +8 -13
  423. package/esm/util/expandLooseSearchIndex.d.ts +19 -0
  424. package/esm/util/expandLooseSearchIndex.js +29 -0
  425. package/esm/util/featureTable.d.ts +224 -0
  426. package/esm/util/featureTable.js +366 -0
  427. package/esm/util/featureTransforms.d.ts +81 -0
  428. package/esm/util/featureTransforms.js +1231 -0
  429. package/esm/util/featureTypes.d.ts +24 -0
  430. package/esm/util/featureTypes.js +35 -0
  431. package/esm/util/fetchAndMaybeUnzip.js +16 -9
  432. package/esm/util/fetchContext.d.ts +7 -8
  433. package/esm/util/fetchContext.js +3 -3
  434. package/esm/util/fetchHub.d.ts +4 -2
  435. package/esm/util/fetchHub.js +2 -2
  436. package/esm/util/fetchPhases.d.ts +10 -10
  437. package/esm/util/fetchSeq.d.ts +2 -3
  438. package/esm/util/fetchSeq.js +2 -2
  439. package/esm/util/fieldReader.d.ts +17 -0
  440. package/esm/util/fieldReader.js +62 -0
  441. package/esm/util/formatBytes.js +1 -1
  442. package/esm/util/formatGuessers.d.ts +25 -14
  443. package/esm/util/formatGuessers.js +42 -27
  444. package/esm/util/formatRelativeTime.js +1 -1
  445. package/esm/util/freezeDeep.d.ts +8 -10
  446. package/esm/util/freezeDeep.js +8 -10
  447. package/esm/util/getLocationUri.d.ts +2 -1
  448. package/esm/util/getLocationUri.js +8 -2
  449. package/esm/util/groupKeys.d.ts +76 -0
  450. package/esm/util/groupKeys.js +156 -0
  451. package/esm/util/highlights.d.ts +10 -6
  452. package/esm/util/highlights.js +12 -25
  453. package/esm/util/hooks.d.ts +31 -2
  454. package/esm/util/hooks.js +72 -3
  455. package/esm/util/index.d.ts +11 -11
  456. package/esm/util/index.js +11 -10
  457. package/esm/util/indexCandidates.d.ts +1 -31
  458. package/esm/util/indexCandidates.js +5 -63
  459. package/esm/util/installFetch.d.ts +77 -37
  460. package/esm/util/installFetch.js +65 -38
  461. package/esm/util/installInitAutorun.d.ts +14 -13
  462. package/esm/util/installInitAutorun.js +17 -17
  463. package/esm/util/installPrerequisiteFetch.d.ts +115 -0
  464. package/esm/util/installPrerequisiteFetch.js +111 -0
  465. package/esm/util/intervals.js +9 -4
  466. package/esm/util/io/index.js +22 -15
  467. package/esm/util/isDataCurrent.d.ts +7 -5
  468. package/esm/util/isDataCurrent.js +9 -6
  469. package/esm/util/isTextEntryFocused.d.ts +7 -0
  470. package/esm/util/isTextEntryFocused.js +16 -0
  471. package/esm/util/jexl.js +24 -21
  472. package/esm/util/jexlFilterRows.d.ts +89 -0
  473. package/esm/util/jexlFilterRows.js +252 -0
  474. package/esm/util/jexlFilters.d.ts +32 -57
  475. package/esm/util/jexlFilters.js +31 -29
  476. package/esm/util/jexlStrings.d.ts +3 -4
  477. package/esm/util/jexlStrings.js +2 -3
  478. package/esm/util/layouts/GranularRectLayout.d.ts +8 -1
  479. package/esm/util/layouts/GranularRectLayout.js +25 -8
  480. package/esm/util/lazyAfterAttach.d.ts +13 -0
  481. package/esm/util/lazyAfterAttach.js +31 -0
  482. package/esm/util/lazyWithPreload.d.ts +19 -0
  483. package/esm/util/lazyWithPreload.js +27 -0
  484. package/esm/util/legendCandidates.d.ts +72 -0
  485. package/esm/util/legendCandidates.js +138 -0
  486. package/esm/util/locString.js +5 -2
  487. package/esm/util/localStorage.js +4 -4
  488. package/esm/util/markEncoding.d.ts +150 -0
  489. package/esm/util/markEncoding.js +885 -0
  490. package/esm/util/markEncodingTypes.d.ts +595 -0
  491. package/esm/util/markEncodingTypes.js +8 -0
  492. package/esm/util/mst-reflection.d.ts +2 -20
  493. package/esm/util/mst-reflection.js +3 -53
  494. package/esm/util/mstUtils.d.ts +31 -23
  495. package/esm/util/mstUtils.js +39 -24
  496. package/esm/util/numericUtils.d.ts +7 -0
  497. package/esm/util/numericUtils.js +16 -0
  498. package/esm/util/numericValue.d.ts +14 -0
  499. package/esm/util/numericValue.js +34 -0
  500. package/esm/util/openFeatureWidget.d.ts +5 -0
  501. package/esm/util/openFeatureWidget.js +2 -2
  502. package/esm/util/openViews.d.ts +17 -0
  503. package/esm/util/openViews.js +22 -0
  504. package/esm/util/parentWalk.d.ts +1 -1
  505. package/esm/util/parentWalk.js +1 -1
  506. package/esm/util/parseLineByLine.d.ts +4 -5
  507. package/esm/util/parseLineByLine.js +8 -14
  508. package/esm/util/pluginStore.d.ts +6 -8
  509. package/esm/util/pluginStore.js +17 -16
  510. package/esm/util/preloadComponent.d.ts +5 -0
  511. package/esm/util/preloadComponent.js +11 -0
  512. package/esm/util/progress.d.ts +22 -22
  513. package/esm/util/progress.js +27 -26
  514. package/esm/util/quantileExtent.d.ts +49 -0
  515. package/esm/util/quantileExtent.js +162 -0
  516. package/esm/util/range.d.ts +13 -9
  517. package/esm/util/range.js +17 -8
  518. package/esm/util/renameRegions.d.ts +26 -6
  519. package/esm/util/renameRegions.js +68 -54
  520. package/esm/util/renderToStaticMarkup.js +24 -14
  521. package/esm/util/rxjs.d.ts +23 -8
  522. package/esm/util/rxjs.js +61 -15
  523. package/esm/util/samplesTsv.d.ts +49 -0
  524. package/esm/util/samplesTsv.js +86 -0
  525. package/esm/util/scheduleDetachedDestroy.d.ts +18 -0
  526. package/esm/util/scheduleDetachedDestroy.js +24 -0
  527. package/esm/util/scrollLatch.d.ts +1 -0
  528. package/esm/util/scrollLatch.js +8 -0
  529. package/esm/util/selectEncodedFeature.d.ts +16 -0
  530. package/esm/util/selectEncodedFeature.js +34 -0
  531. package/esm/util/sessionSharing.d.ts +7 -5
  532. package/esm/util/sessionSharing.js +23 -23
  533. package/esm/util/shapeNameList.d.ts +2 -0
  534. package/esm/util/shapeNameList.js +6 -0
  535. package/esm/util/shapeNames.d.ts +7 -0
  536. package/esm/util/shapeNames.js +11 -0
  537. package/esm/util/simpleFeature.d.ts +0 -1
  538. package/esm/util/springAnimate.js +1 -1
  539. package/esm/util/starFusion.d.ts +26 -0
  540. package/esm/util/starFusion.js +37 -0
  541. package/esm/util/stepTables.d.ts +96 -0
  542. package/esm/util/stepTables.js +277 -0
  543. package/esm/util/svAlt.d.ts +145 -0
  544. package/esm/util/svAlt.js +364 -0
  545. package/esm/util/svgColorProps.d.ts +11 -0
  546. package/esm/util/svgColorProps.js +28 -1
  547. package/esm/util/systemColorScheme.d.ts +12 -0
  548. package/esm/util/systemColorScheme.js +27 -0
  549. package/esm/util/tabix.d.ts +19 -10
  550. package/esm/util/tabix.js +19 -14
  551. package/esm/util/thresholdScale.d.ts +91 -0
  552. package/esm/util/thresholdScale.js +166 -0
  553. package/esm/util/timeGate.d.ts +4 -5
  554. package/esm/util/timeGate.js +4 -5
  555. package/esm/util/trackConfigDelta.d.ts +26 -26
  556. package/esm/util/trackConfigDelta.js +63 -47
  557. package/esm/util/tracks.d.ts +120 -66
  558. package/esm/util/tracks.js +501 -151
  559. package/esm/util/translateTranscript.d.ts +44 -0
  560. package/esm/util/translateTranscript.js +102 -0
  561. package/esm/util/types/data.d.ts +0 -2
  562. package/esm/util/types/index.d.ts +121 -22
  563. package/esm/util/types/index.js +9 -0
  564. package/esm/util/types/mst.d.ts +3 -0
  565. package/esm/util/types/mst.js +4 -0
  566. package/esm/util/types/renameIds.d.ts +1 -0
  567. package/esm/util/types/renameIds.js +29 -0
  568. package/esm/util/types/services.d.ts +1 -1
  569. package/esm/util/unknownSnapshotKeys.d.ts +53 -0
  570. package/esm/util/unknownSnapshotKeys.js +76 -0
  571. package/esm/util/useFeatureSequence.js +5 -5
  572. package/esm/util/useFetch.d.ts +3 -4
  573. package/esm/util/useFetch.js +19 -10
  574. package/esm/util/useFetchPlugins.d.ts +6 -2
  575. package/esm/util/useFetchPlugins.js +7 -3
  576. package/esm/util/usePanZoom.js +10 -3
  577. package/esm/util/usePanelVirtualScroll.d.ts +7 -35
  578. package/esm/util/usePanelVirtualScroll.js +9 -36
  579. package/esm/util/useRafCommit.js +1 -0
  580. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  581. package/esm/util/useRowVirtualScroll.js +8 -49
  582. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  583. package/esm/util/useVirtualScrollWheel.js +40 -74
  584. package/esm/util/viewHighlights.d.ts +3 -0
  585. package/esm/util/viewHighlights.js +5 -0
  586. package/esm/util/viewStatus.d.ts +47 -15
  587. package/esm/util/viewStatus.js +34 -0
  588. package/esm/util/wheelZoom.d.ts +7 -1
  589. package/esm/util/wheelZoom.js +85 -19
  590. package/esm/util/whenViewSettled.d.ts +55 -8
  591. package/esm/util/whenViewSettled.js +56 -7
  592. package/esm/util/withFeatureDetails.js +4 -0
  593. package/esm/util/withLaunchInput.d.ts +174 -0
  594. package/esm/util/withLaunchInput.js +274 -0
  595. package/package.json +75 -24
  596. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.d.ts +0 -2
  597. package/esm/BaseFeatureWidget/BaseFeatureDetail/Position.js +0 -8
  598. package/esm/BaseFeatureWidget/BaseFeatureDetail/types.d.ts +0 -8
  599. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  600. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  601. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  602. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  603. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  604. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  605. package/esm/ReExports/index.d.ts +0 -1
  606. package/esm/ReExports/index.js +0 -1
  607. package/esm/ReExports/publicUtil.d.ts +0 -1
  608. package/esm/ReExports/publicUtil.js +0 -28
  609. package/esm/configuration/promotableDefaults.d.ts +0 -199
  610. package/esm/configuration/promotableDefaults.js +0 -326
  611. package/esm/configuration/promotablePin.d.ts +0 -55
  612. package/esm/configuration/promotablePin.js +0 -1
  613. package/esm/configuration/promotableResolve.d.ts +0 -108
  614. package/esm/configuration/promotableResolve.js +0 -117
  615. package/esm/configuration/promotableSlots.d.ts +0 -12
  616. package/esm/configuration/promotableSlots.js +0 -45
  617. package/esm/configuration/slotShape.d.ts +0 -12
  618. package/esm/configuration/slotShape.js +0 -84
  619. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  620. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  621. package/esm/ui/PinAdornment.d.ts +0 -5
  622. package/esm/ui/PinAdornment.js +0 -79
  623. package/esm/ui/SvgGradientLegend.d.ts +0 -26
  624. package/esm/ui/SvgGradientLegend.js +0 -26
  625. package/esm/ui/highlightChipReveal.d.ts +0 -32
  626. package/esm/ui/highlightChipReveal.js +0 -39
  627. package/esm/ui/promotableMenuItems.d.ts +0 -19
  628. package/esm/ui/promotableMenuItems.js +0 -89
  629. package/esm/ui/promotablePinCoverage.d.ts +0 -44
  630. package/esm/ui/promotablePinCoverage.js +0 -87
  631. package/esm/util/applyInitSettings.d.ts +0 -79
  632. package/esm/util/applyInitSettings.js +0 -91
  633. package/esm/util/openDisplays.d.ts +0 -23
  634. package/esm/util/openDisplays.js +0 -79
  635. package/esm/util/stopToken.d.ts +0 -211
  636. package/esm/util/stopToken.js +0 -438
  637. /package/esm/{BaseFeatureWidget/BaseFeatureDetail/types.js → data_adapters/BaseAdapter/zoomRange.js} +0 -0
@@ -1,4 +1,5 @@
1
1
  import { measureText as measureTextWidth } from './measureText.js';
2
+ import { splitPaintAlpha } from './svgColorProps.js';
2
3
  const XML_ESCAPES = {
3
4
  '&': '&',
4
5
  '<': '&lt;',
@@ -29,14 +30,16 @@ function parseFont(font) {
29
30
  // SVG-compatible attributes. The default sans-serif family is left off so
30
31
  // feature labels match the raw-JSX <text> elements (ruler, scalebar, etc.),
31
32
  // which set no family either; an explicitly-set family is still emitted.
32
- function fontAttrs(font) {
33
+ function fontAttrs(font, scale) {
33
34
  const { prefix, size, family } = parseFont(font);
34
35
  const tokens = prefix.split(/\s+/).filter(Boolean);
35
36
  const weight = tokens.find(t => fontWeightTokens.has(t) || /^\d{1,4}$/.test(t));
36
37
  const style = tokens.find(t => fontStyleTokens.has(t));
37
38
  return [
38
- ` font-size="${size}"`,
39
- family === '' || family === 'sans-serif' ? '' : ` font-family="${family}"`,
39
+ ` font-size="${Number(size) * scale}"`,
40
+ family === '' || family === 'sans-serif'
41
+ ? ''
42
+ : ` font-family="${escapeXml(family)}"`,
40
43
  weight ? ` font-weight="${weight}"` : '',
41
44
  style ? ` font-style="${style}"` : '',
42
45
  ].join('');
@@ -47,25 +50,34 @@ function fontAttrs(font) {
47
50
  // mint `svgcanvas-clip-0`, whereupon `url(#svgcanvas-clip-0)` resolves to the
48
51
  // first and every later layer is clipped to some other layer's rect.
49
52
  //
50
- // Document-global, not process-global: `resetSvgClipIds` below.
53
+ // Document-global, not process-global: `withFreshSvgClipIds` below.
51
54
  let clipIdCounter = 0;
52
55
  /**
53
- * Restart clip-id numbering for a new export document.
56
+ * Run `render` as one document's clip-id numbering run, starting at 0, then put
57
+ * the counter back.
54
58
  *
55
- * Without it the counter runs for the lifetime of the process, so an export is
56
- * numbered from wherever the previous one stopped and the same view exported
57
- * twice differs in every clip id. That is the churn `svgNodeId` was written to
58
- * get rid of, arriving by a second route: diffing two saved SVGs shows changes
59
- * that aren't real, and `jest -t` on any export test but the first fails its
60
- * checked-in snapshot with a diff that is nothing but renumbering.
59
+ * Starting at 0 is what makes the same view export to the same bytes: a counter
60
+ * left running numbers each export from wherever the previous one stopped, so
61
+ * diffing two saved SVGs shows changes that aren't real and `jest -t` on any
62
+ * export test but the first fails its snapshot on renumbering alone.
61
63
  *
62
- * Called by `wrapSvgExport`, and safe there and only there: the
63
- * `renderToStaticMarkup` it wraps is synchronous, so every `PaintLayer` in the
64
- * document draws before any other export can begin. Anything that resets on a
65
- * boundary an `await` can cross would let two exports share a numbering run.
64
+ * Putting it back is what keeps a file export from renumbering the page: live
65
+ * figures (`useViewSvgFigure`) mint from the same counter into one DOM, where
66
+ * ids must not repeat, so a reset that stuck would let the next figure reuse an
67
+ * id another figure still points at.
68
+ *
69
+ * `render` must be synchronous — an `await` inside it would let two documents
70
+ * share a numbering run.
66
71
  */
67
- export function resetSvgClipIds() {
72
+ export function withFreshSvgClipIds(render) {
73
+ const saved = clipIdCounter;
68
74
  clipIdCounter = 0;
75
+ try {
76
+ return render();
77
+ }
78
+ finally {
79
+ clipIdCounter = saved;
80
+ }
69
81
  }
70
82
  export class SvgCanvas {
71
83
  parts = [];
@@ -115,6 +127,13 @@ export class SvgCanvas {
115
127
  get axisAligned() {
116
128
  return this.b === 0 && this.c === 0;
117
129
  }
130
+ // How much the CTM scales a length, for what SVG draws at a size of its own
131
+ // rather than through transformed coordinates: stroke widths, dashes and
132
+ // font sizes. Exact for a uniform scale; the geometric mean otherwise, where
133
+ // a Canvas2D pen would draw an ellipse no stroke-width can state.
134
+ get lengthScale() {
135
+ return Math.sqrt(Math.abs(this.a * this.d - this.b * this.c));
136
+ }
118
137
  transformPoint(x, y) {
119
138
  return [this.a * x + this.c * y + this.e, this.b * x + this.d * y + this.f];
120
139
  }
@@ -170,23 +189,20 @@ export class SvgCanvas {
170
189
  ? 'end'
171
190
  : 'start';
172
191
  }
173
- // Split rgba(r,g,b,a) into separate color + opacity SVG attributes for
174
- // compatibility with SVG 1.1 consumers like Inkscape that don't honor the
175
- // alpha component of CSS3 rgba() fill/stroke values. Whitespace-tolerant so
176
- // spaced forms (MUI alpha(), colord toRgbString → "rgba(255, 177, 29, 0.12)")
177
- // are separated too, not just the compact "rgba(255,177,29,0.12)".
178
192
  paintAttr(name, style) {
179
193
  const s = `${style}`;
180
- const m = /^rgba\(\s*(\d+)\s*,\s*(\d+)\s*,\s*(\d+)\s*,\s*([\d.]+)\s*\)$/.exec(s);
181
- if (m) {
182
- const a = Number.parseFloat(m[4]);
183
- const base = `${name}="rgb(${m[1]},${m[2]},${m[3]})"`;
184
- return a < 1 ? `${base} ${name}-opacity="${a}"` : base;
194
+ const split = splitPaintAlpha(s);
195
+ if (!split) {
196
+ return `${name}="${s}"`;
185
197
  }
186
- return `${name}="${s}"`;
198
+ const base = `${name}="${split.color}"`;
199
+ return split.opacity < 1
200
+ ? `${base} ${name}-opacity="${split.opacity}"`
201
+ : base;
187
202
  }
188
203
  strokeAttrs() {
189
- let attrs = ` ${this.paintAttr('stroke', this.strokeStyle)} stroke-width="${this.lineWidth}"`;
204
+ const scale = this.lengthScale;
205
+ let attrs = ` ${this.paintAttr('stroke', this.strokeStyle)} stroke-width="${this.lineWidth * scale}"`;
190
206
  if (this.lineCap !== 'butt') {
191
207
  attrs += ` stroke-linecap="${this.lineCap}"`;
192
208
  }
@@ -194,7 +210,7 @@ export class SvgCanvas {
194
210
  attrs += ` stroke-linejoin="${this.lineJoin}"`;
195
211
  }
196
212
  if (this.lineDash.length > 0) {
197
- attrs += ` stroke-dasharray="${this.lineDash.join(',')}"`;
213
+ attrs += ` stroke-dasharray="${this.lineDash.map(d => d * scale).join(',')}"`;
198
214
  }
199
215
  return attrs;
200
216
  }
@@ -358,34 +374,40 @@ export class SvgCanvas {
358
374
  this.ellipse(x, y, radius, radius, 0, startAngle, endAngle, counterclockwise);
359
375
  }
360
376
  ellipse(x, y, radiusX, radiusY, rotation, startAngle, endAngle, counterclockwise = false) {
361
- const [cx, cy] = this.transformPoint(x, y);
362
377
  const [rx, ry] = this.transformSize(radiusX, radiusY);
363
- const sweep = counterclockwise ? 0 : 1;
364
- const diff = endAngle - startAngle;
365
- const deg = (rotation * 180) / Math.PI;
378
+ // A mirrored CTM turns a clockwise sweep counterclockwise on the page, and
379
+ // its rotation the other way.
380
+ const mirrored = this.a * this.d < 0;
381
+ const sweep = counterclockwise === mirrored ? 1 : 0;
382
+ const deg = ((mirrored ? -rotation : rotation) * 180) / Math.PI;
366
383
  // Canvas measures the angle on the UNROTATED ellipse and then spins the
367
384
  // whole thing, so the endpoint is the parametric point rotated — not the
368
- // point at (angle + rotation).
385
+ // point at (angle + rotation) — and then placed by the CTM.
369
386
  const at = (angle) => {
370
- const px = rx * Math.cos(angle);
371
- const py = ry * Math.sin(angle);
372
- return [
373
- cx + px * Math.cos(rotation) - py * Math.sin(rotation),
374
- cy + px * Math.sin(rotation) + py * Math.cos(rotation),
375
- ];
387
+ const px = radiusX * Math.cos(angle);
388
+ const py = radiusY * Math.sin(angle);
389
+ return this.transformPoint(x + px * Math.cos(rotation) - py * Math.sin(rotation), y + px * Math.sin(rotation) + py * Math.cos(rotation));
376
390
  };
377
- if (Math.abs(diff) >= 2 * Math.PI) {
391
+ // The angle actually swept, as Canvas2D resolves it: in the stated
392
+ // direction, a whole turn once it reaches 2π, and otherwise wrapped into
393
+ // [0, 2π) — so a clockwise sweep from 0.5π back to 0 goes the long way.
394
+ const TAU = 2 * Math.PI;
395
+ const signed = counterclockwise
396
+ ? startAngle - endAngle
397
+ : endAngle - startAngle;
398
+ const swept = signed >= TAU ? TAU : ((signed % TAU) + TAU) % TAU;
399
+ const [sx, sy] = at(startAngle);
400
+ if (swept === TAU) {
378
401
  // A closed ellipse has coincident endpoints, which an SVG arc command
379
- // degenerates on — so go round in two halves.
380
- const [mx, my] = at(startAngle);
381
- const [halfX, halfY] = at(startAngle + Math.PI);
382
- this.pathData += `M${mx},${my}A${rx},${ry} ${deg} 1 ${sweep} ${halfX},${halfY}A${rx},${ry} ${deg} 1 ${sweep} ${mx},${my}`;
402
+ // degenerates on — so go round in two halves, as a subpath of its own.
403
+ const half = counterclockwise ? -Math.PI : Math.PI;
404
+ const [hx, hy] = at(startAngle + half);
405
+ this.pathData += `M${sx},${sy}A${rx},${ry} ${deg} 1 ${sweep} ${hx},${hy}A${rx},${ry} ${deg} 1 ${sweep} ${sx},${sy}`;
383
406
  return;
384
407
  }
385
- const [sx, sy2] = at(startAngle);
386
408
  const [ex, ey] = at(endAngle);
387
- const largeArc = Math.abs(diff) > Math.PI ? 1 : 0;
388
- this.pathData += !this.pathData ? `M${sx},${sy2}` : `L${sx},${sy2}`;
409
+ const largeArc = swept > Math.PI ? 1 : 0;
410
+ this.pathData += !this.pathData ? `M${sx},${sy}` : `L${sx},${sy}`;
389
411
  this.pathData += `A${rx},${ry} ${deg} ${largeArc} ${sweep} ${ex},${ey}`;
390
412
  }
391
413
  bezierCurveTo(cp1x, cp1y, cp2x, cp2y, x, y) {
@@ -441,19 +463,16 @@ export class SvgCanvas {
441
463
  fillText(text, x, y) {
442
464
  const [tx, ty] = this.transformPoint(x, y);
443
465
  const escaped = escapeXml(text);
444
- this.emit(`<text x="${tx}" y="${ty}" ${this.paintAttr('fill', this.fillStyle)}${fontAttrs(this.font)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
466
+ this.emit(`<text x="${tx}" y="${ty}" ${this.paintAttr('fill', this.fillStyle)}${fontAttrs(this.font, this.lengthScale)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
445
467
  }
446
468
  strokeText(text, x, y) {
447
469
  const [tx, ty] = this.transformPoint(x, y);
448
470
  const escaped = escapeXml(text);
449
- this.emit(`<text x="${tx}" y="${ty}" fill="none"${this.strokeAttrs()}${fontAttrs(this.font)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
471
+ this.emit(`<text x="${tx}" y="${ty}" fill="none"${this.strokeAttrs()}${fontAttrs(this.font, this.lengthScale)} text-anchor="${this.textAnchor()}" dominant-baseline="${this.dominantBaseline()}">${escaped}</text>`);
450
472
  }
451
473
  drawImage(..._args) {
452
474
  // no-op: raster images can't be meaningfully serialized to SVG paths
453
475
  }
454
- putImageData(..._args) {
455
- // no-op
456
- }
457
476
  clip(..._args) {
458
477
  // Use the current path as a clipPath, then open a `<g clip-path>`
459
478
  // group that subsequent draws will land inside. The group is closed by
@@ -479,9 +498,10 @@ export class SvgCanvas {
479
498
  // The family goes through, not just the size: `measureText` switches to the
480
499
  // fixed monospace advance on seeing one, so dropping it measured a monospace
481
500
  // string against the proportional table — the same string, laid out one way on
482
- // a real canvas and another in the export, with nothing to show which. No draw
483
- // function calls ctx.measureText today; this is here so the first one to do it
484
- // doesn't inherit a silent discrepancy.
501
+ // a real canvas and another in the export, with nothing to show which. An
502
+ // estimate all the same: a draw whose layout turns on a width (synteny's
503
+ // off-screen mate labels) measures through a real canvas and passes the
504
+ // result in, so the figure names what the screen named.
485
505
  measureText(text) {
486
506
  const { size, family } = parseFont(this.font);
487
507
  return { width: measureTextWidth(text, Number(size), family) };
@@ -9,10 +9,13 @@ declare const TimeTraveller: import("@jbrowse/mobx-state-tree").IModelType<{
9
9
  }, {
10
10
  history: unknown[];
11
11
  notTrackingUndo: boolean;
12
+ hasPendingRecord: boolean;
12
13
  } & {
13
14
  readonly canUndo: boolean;
14
15
  readonly canRedo: boolean;
15
16
  } & {
17
+ setHasPendingRecord(value: boolean): void;
18
+ flushPendingRecord(): void;
16
19
  stopTrackingUndo(): void;
17
20
  resumeTrackingUndo(): void;
18
21
  addUndoState(snapshot: unknown): void;
@@ -14,13 +14,16 @@ const TimeTraveller = types
14
14
  .volatile(() => ({
15
15
  history: [],
16
16
  notTrackingUndo: false,
17
+ hasPendingRecord: false,
17
18
  }))
18
19
  .views(self => ({
19
20
  get canUndo() {
20
- return self.undoIdx > 0 && !self.notTrackingUndo;
21
+ return ((self.undoIdx > 0 || self.hasPendingRecord) && !self.notTrackingUndo);
21
22
  },
22
23
  get canRedo() {
23
- return self.undoIdx < self.history.length - 1 && !self.notTrackingUndo;
24
+ return (self.undoIdx < self.history.length - 1 &&
25
+ !self.hasPendingRecord &&
26
+ !self.notTrackingUndo);
24
27
  },
25
28
  }))
26
29
  .actions(self => {
@@ -93,7 +96,21 @@ const TimeTraveller = types
93
96
  skipNextUndoState = false;
94
97
  }
95
98
  }
99
+ let recordPending;
96
100
  return {
101
+ setHasPendingRecord(value) {
102
+ self.hasPendingRecord = value;
103
+ },
104
+ flushPendingRecord() {
105
+ if (debounceTimer) {
106
+ clearTimeout(debounceTimer);
107
+ debounceTimer = undefined;
108
+ }
109
+ if (self.hasPendingRecord) {
110
+ self.hasPendingRecord = false;
111
+ recordPending?.();
112
+ }
113
+ },
97
114
  stopTrackingUndo() {
98
115
  self.notTrackingUndo = true;
99
116
  },
@@ -141,14 +158,17 @@ const TimeTraveller = types
141
158
  skipNextUndoState = false;
142
159
  self.history = [];
143
160
  self.undoIdx = -1;
161
+ self.hasPendingRecord = false;
144
162
  // read the target's current state rather than a snapshot captured per
145
163
  // change: any change inside the debounce window re-times it, so when it
146
164
  // does fire the two agree
147
165
  const record = () => {
166
+ this.setHasPendingRecord(false);
148
167
  if (targetStore) {
149
168
  this.addUndoState(getSnapshot(targetStore));
150
169
  }
151
170
  };
171
+ recordPending = record;
152
172
  // onPatch, not onSnapshot: this only needs to know *that* the target
153
173
  // changed, and the snapshot is taken once per debounce window below.
154
174
  // onSnapshot would serialize the whole target on every single change to
@@ -178,17 +198,29 @@ const TimeTraveller = types
178
198
  clearTimeout(debounceTimer);
179
199
  debounceTimer = undefined;
180
200
  }
201
+ this.setHasPendingRecord(false);
181
202
  return;
182
203
  }
204
+ if (!self.hasPendingRecord) {
205
+ this.setHasPendingRecord(true);
206
+ }
183
207
  armRecording(record);
184
208
  });
185
209
  this.addUndoState(getSnapshot(targetStore));
186
210
  },
187
211
  undo() {
212
+ this.flushPendingRecord();
213
+ if (self.undoIdx <= 0) {
214
+ return;
215
+ }
188
216
  self.undoIdx--;
189
217
  applyHistoryState(self.undoIdx);
190
218
  },
191
219
  redo() {
220
+ this.flushPendingRecord();
221
+ if (self.undoIdx >= self.history.length - 1) {
222
+ return;
223
+ }
192
224
  self.undoIdx++;
193
225
  applyHistoryState(self.undoIdx);
194
226
  },
@@ -20,4 +20,43 @@ export declare function handleFetchError(exception: unknown, isCurrent: () => bo
20
20
  * @param exception -
21
21
  */
22
22
  export declare function isAbortException(exception: unknown): boolean;
23
+ /**
24
+ * Throw an AbortError if `signal` has aborted. A `signal.aborted` read, so it
25
+ * is cheap enough for the body of a loop; place it after any await and in any
26
+ * per-item callback a reader hands you.
27
+ */
28
+ export declare function checkAbortSignal(signal?: AbortSignal): void;
29
+ /**
30
+ * Run an awaited stage under `signal`: checked before it starts, and again
31
+ * once it settles. The check after is the one that gets left out when the two
32
+ * are placed by hand — a stop landing during a long await otherwise goes
33
+ * unseen until the next stage.
34
+ */
35
+ export declare function withAbortCheck<T>(signal: AbortSignal | undefined, fn: () => T | Promise<T>): Promise<T>;
36
+ export interface AbortBreakpoint {
37
+ /** True once every ~50 ms of wall time, otherwise a counter bump. */
38
+ due(): boolean;
39
+ /** Yield a task so a posted abort can land, then throw if it did. */
40
+ yield(): Promise<void>;
41
+ }
42
+ /**
43
+ * Cancellation for a loop that can run for seconds without awaiting — a
44
+ * whole-genome projection, a matrix fill. A `signal.aborted` read inside such a
45
+ * loop never changes, because the abort is a posted message; the loop has to
46
+ * give the event loop a turn now and then. A loop bounded by the byte gate or
47
+ * one region's features finishes before this would matter and only checks.
48
+ *
49
+ * const breakpoint = createAbortBreakpoint(signal)
50
+ * for (const row of rows) {
51
+ * if (breakpoint.due()) {
52
+ * await breakpoint.yield()
53
+ * }
54
+ * …
55
+ * }
56
+ *
57
+ * Two calls rather than one because an `await` on a non-promise still costs a
58
+ * microtask, about 60 ns against 2 ns for the `due()` read, and a loop over
59
+ * every read in a pileup notices the difference.
60
+ */
61
+ export declare function createAbortBreakpoint(signal?: AbortSignal): AbortBreakpoint;
23
62
  export {};
@@ -1,3 +1,5 @@
1
+ import { isElectron, isNode } from './environment.js';
2
+ import { createTimeGate } from './timeGate.js';
1
3
  class AbortError extends Error {
2
4
  code;
3
5
  }
@@ -33,15 +35,95 @@ export function handleFetchError(exception, isCurrent, setError) {
33
35
  */
34
36
  export function isAbortException(exception) {
35
37
  return (
36
- // DOMException
37
- // message contains aborted for bubbling through RPC
38
- // things we have seen that we want to catch here
39
- // Error: aborted
40
- // AbortError: aborted
41
- // AbortError: The user aborted a request.
38
+ // The message test is for an abort whose name did not survive a boundary
39
+ // (Electron IPC, RpcServer's message-only fallback). A timeout is a failure
40
+ // even though Node words it "The operation was aborted due to timeout".
42
41
  exception instanceof Error &&
42
+ exception.name !== 'TimeoutError' &&
43
43
  (exception.name === 'AbortError' ||
44
44
  // standard-ish non-DOM abort exception
45
45
  (exception instanceof AbortError && exception.code === 'ERR_ABORTED') ||
46
46
  /\b(aborted|aborterror)\b/i.test(exception.message)));
47
47
  }
48
+ /**
49
+ * Throw an AbortError if `signal` has aborted. A `signal.aborted` read, so it
50
+ * is cheap enough for the body of a loop; place it after any await and in any
51
+ * per-item callback a reader hands you.
52
+ */
53
+ export function checkAbortSignal(signal) {
54
+ if (signal?.aborted) {
55
+ throw makeAbortError();
56
+ }
57
+ }
58
+ /**
59
+ * Run an awaited stage under `signal`: checked before it starts, and again
60
+ * once it settles. The check after is the one that gets left out when the two
61
+ * are placed by hand — a stop landing during a long await otherwise goes
62
+ * unseen until the next stage.
63
+ */
64
+ export async function withAbortCheck(signal, fn) {
65
+ checkAbortSignal(signal);
66
+ const result = await fn();
67
+ checkAbortSignal(signal);
68
+ return result;
69
+ }
70
+ const YIELD_INTERVAL_MS = 50;
71
+ /**
72
+ * Give the event loop one turn. A worker learns of an abort through a posted
73
+ * message, and a message is a task: an `await` on an already-settled promise
74
+ * drains only microtasks and delivers nothing. A browser realm, Electron's
75
+ * included, gets a MessageChannel task, which unlike `setTimeout` is not
76
+ * clamped. Not `scheduler.yield`: Chromium runs its continuation ahead of a
77
+ * posted message, so a worker loop yielding that way never sees the abort.
78
+ * Plain Node and jsdom get the timer: a MessagePort turn there runs no due
79
+ * timer, and under jest the abort is one.
80
+ */
81
+ const yieldToEventLoop = (() => {
82
+ if ((isElectron || !isNode) && typeof MessageChannel !== 'undefined') {
83
+ const channel = new MessageChannel();
84
+ let resolvers = [];
85
+ channel.port1.onmessage = () => {
86
+ const pending = resolvers;
87
+ resolvers = [];
88
+ for (const resolve of pending) {
89
+ resolve();
90
+ }
91
+ };
92
+ return () => new Promise(resolve => {
93
+ resolvers.push(resolve);
94
+ channel.port2.postMessage(0);
95
+ });
96
+ }
97
+ return () => new Promise(resolve => {
98
+ setTimeout(resolve, 0);
99
+ });
100
+ })();
101
+ /**
102
+ * Cancellation for a loop that can run for seconds without awaiting — a
103
+ * whole-genome projection, a matrix fill. A `signal.aborted` read inside such a
104
+ * loop never changes, because the abort is a posted message; the loop has to
105
+ * give the event loop a turn now and then. A loop bounded by the byte gate or
106
+ * one region's features finishes before this would matter and only checks.
107
+ *
108
+ * const breakpoint = createAbortBreakpoint(signal)
109
+ * for (const row of rows) {
110
+ * if (breakpoint.due()) {
111
+ * await breakpoint.yield()
112
+ * }
113
+ * …
114
+ * }
115
+ *
116
+ * Two calls rather than one because an `await` on a non-promise still costs a
117
+ * microtask, about 60 ns against 2 ns for the `due()` read, and a loop over
118
+ * every read in a pileup notices the difference.
119
+ */
120
+ export function createAbortBreakpoint(signal) {
121
+ const gate = createTimeGate();
122
+ return {
123
+ due: () => gate(YIELD_INTERVAL_MS),
124
+ async yield() {
125
+ await yieldToEventLoop();
126
+ checkAbortSignal(signal);
127
+ },
128
+ };
129
+ }
@@ -11,7 +11,7 @@ import type { IStateTreeNode } from '@jbrowse/mobx-state-tree';
11
11
  *
12
12
  * Keyed on the adapter config rather than memoized for the display's life, so
13
13
  * a track re-pointed in the config editor stops serving the old header's
14
- * descriptions. Cleared on failure so a later click retries. No stop token and
14
+ * descriptions. Cleared on failure so a later click retries. No signal and
15
15
  * no status: nothing to narrate, and nothing a cancel could save — the widget
16
16
  * opens on the result.
17
17
  */
@@ -1,3 +1,4 @@
1
+ import { isDataCurrent } from './isDataCurrent.js';
1
2
  import { getRpcSessionId } from './parentWalk.js';
2
3
  import { getRpcHost } from './sessionServices.js';
3
4
  /**
@@ -12,19 +13,19 @@ import { getRpcHost } from './sessionServices.js';
12
13
  *
13
14
  * Keyed on the adapter config rather than memoized for the display's life, so
14
15
  * a track re-pointed in the config editor stops serving the old header's
15
- * descriptions. Cleared on failure so a later click retries. No stop token and
16
+ * descriptions. Cleared on failure so a later click retries. No signal and
16
17
  * no status: nothing to narrate, and nothing a cancel could save — the widget
17
18
  * opens on the result.
18
19
  */
19
20
  export function createAdapterMetadataFetch(self) {
20
21
  let cached;
21
22
  return () => {
22
- const key = JSON.stringify(self.adapterConfig);
23
- if (cached?.key !== key) {
23
+ const { adapterConfig } = self;
24
+ if (!cached || !isDataCurrent(cached.adapterConfig, adapterConfig)) {
24
25
  const promise = getRpcHost(self)
25
26
  // eslint-disable-next-line no-restricted-syntax -- nothing to narrate, nothing a cancel could save
26
27
  .rpcManager.call(getRpcSessionId(self), 'CoreGetMetadata', {
27
- adapterConfig: self.adapterConfig,
28
+ adapterConfig,
28
29
  })
29
30
  .catch((e) => {
30
31
  if (cached?.promise === promise) {
@@ -32,7 +33,7 @@ export function createAdapterMetadataFetch(self) {
32
33
  }
33
34
  throw e;
34
35
  });
35
- cached = { key, promise };
36
+ cached = { adapterConfig, promise };
36
37
  }
37
38
  return cached.promise;
38
39
  };
@@ -15,8 +15,5 @@ import type { SessionWithAddSessionTrack } from './types/index.ts';
15
15
  export declare function addAndShowTrack(session: SessionWithAddSessionTrack, conf: Parameters<SessionWithAddSessionTrack['addSessionTrackConf']>[0] & {
16
16
  trackId: string;
17
17
  }, view?: {
18
- showTrack: (trackId: string) => void;
19
- }): (import("@jbrowse/mobx-state-tree").ModelInstanceTypeProps<Record<string, any>> & {
20
- setSubschema(slotName: string, data: Record<string, unknown>): any;
21
- setSlot(slotName: string, value: unknown): void;
22
- } & import("@jbrowse/mobx-state-tree").IStateTreeNode<import("../configuration/types.ts").AnyConfigurationSchemaType>) | undefined;
18
+ launchTrack: (trackId: string) => Promise<unknown>;
19
+ }): import("../configuration/types.ts").AnyConfigurationModel | undefined;
@@ -16,8 +16,12 @@ export function addAndShowTrack(session, conf, view) {
16
16
  // addSessionTrackConf already notified on an invalid conf; showing a trackId
17
17
  // that was never added would only add a second "Could not resolve identifier"
18
18
  // snackbar
19
+ //
20
+ // `launchTrack`, voided: the display's state model may still be a dynamic
21
+ // import away, and every caller here is a menu item or a dialog button whose
22
+ // return value is the added config rather than the opened track
19
23
  if (added) {
20
- view?.showTrack(conf.trackId);
24
+ void view?.launchTrack(conf.trackId);
21
25
  }
22
26
  return added;
23
27
  }
@@ -1,14 +1,26 @@
1
1
  /**
2
- * Stamp `baseUri` next to every `uri` in a config so relative URIs resolve
3
- * against the location the config itself was loaded from. jbrowse-web runs this
4
- * when it fetches a config.json from a URL; anything that injects a fetched
5
- * config as an object (a hub, a track hub connection, a headless render) has to
6
- * run it too, or the config's relative data URIs resolve against the page.
2
+ * Stamp `baseUri` next to every `uri` in a config, and beside a MultiWiggle
3
+ * `bigWigs` array of bare URI strings, so relative URIs resolve against the
4
+ * location the config itself was loaded from. A file written as a bare string
5
+ * where a location object can go (a search index, `refNameAliases`,
6
+ * `cytobands`, a `bedLocations` entry) has no object to stamp, so it becomes
7
+ * `{ uri, baseUri }`.
8
+ * jbrowse-web runs this when it fetches a config.json from a URL; anything that
9
+ * injects a fetched config as an object (a hub, a track hub connection, a
10
+ * headless render) has to run it too, or the config's relative data URIs
11
+ * resolve against the page.
7
12
  *
8
13
  * Lives in core because core is what consumes the result — the assembly config
9
14
  * schema and expandAssemblyConfigShorthand read `baseUri` back out.
10
15
  */
11
16
  export declare function addRelativeUris(config: Record<string, unknown> | null, base: URL): void;
17
+ /**
18
+ * A copy of `config` with every relative URI stamped against the page, which
19
+ * is what the page itself would resolve it against. An RPC worker started from
20
+ * a `blob:` URL has no such base, so a location it receives without one fails
21
+ * to parse there.
22
+ */
23
+ export declare function withPageBaseUri<T>(config: T): T;
12
24
  /**
13
25
  * Inverse of {@link addRelativeUris}: recursively delete every synthetic
14
26
  * `baseUri` key (mutates in place), e.g. before serializing a config snapshot