@jbrowse/core 5.0.0-beta.8 → 5.0.0-beta.9

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 (379) hide show
  1. package/README.md +427 -130
  2. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.d.ts +3 -2
  3. package/esm/BaseFeatureWidget/BaseFeatureDetail/ArrayValue.js +5 -3
  4. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.d.ts +3 -5
  5. package/esm/BaseFeatureWidget/BaseFeatureDetail/Attributes.js +8 -9
  6. package/esm/BaseFeatureWidget/BaseFeatureDetail/CoreDetails.js +8 -13
  7. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.d.ts +2 -1
  8. package/esm/BaseFeatureWidget/BaseFeatureDetail/FeatureDetails.js +3 -3
  9. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.d.ts +8 -0
  10. package/esm/BaseFeatureWidget/BaseFeatureDetail/FieldActionsButton.js +24 -0
  11. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.d.ts +3 -2
  12. package/esm/BaseFeatureWidget/BaseFeatureDetail/SimpleField.js +5 -3
  13. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.d.ts +1 -0
  14. package/esm/BaseFeatureWidget/BaseFeatureDetail/index.js +1 -4
  15. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.d.ts +16 -0
  16. package/esm/BaseFeatureWidget/BaseFeatureDetail/jexlFilterActions.js +53 -0
  17. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.d.ts +0 -8
  18. package/esm/BaseFeatureWidget/BaseFeatureDetail/util.js +0 -16
  19. package/esm/BaseFeatureWidget/SequenceFeatureDetails/SequenceContents.js +7 -34
  20. package/esm/BaseFeatureWidget/configSchema.d.ts +1 -1
  21. package/esm/BaseFeatureWidget/formatDetails.d.ts +13 -29
  22. package/esm/BaseFeatureWidget/formatDetails.js +46 -79
  23. package/esm/BaseFeatureWidget/index.d.ts +1 -0
  24. package/esm/BaseFeatureWidget/stateModelFactory.d.ts +35 -28
  25. package/esm/BaseFeatureWidget/stateModelFactory.js +94 -102
  26. package/esm/BaseFeatureWidget/types.d.ts +3 -0
  27. package/esm/BaseFeatureWidget/util.d.ts +0 -3
  28. package/esm/BaseFeatureWidget/util.js +0 -17
  29. package/esm/PluginLoader.d.ts +14 -9
  30. package/esm/PluginLoader.js +34 -26
  31. package/esm/PluginManager.d.ts +4 -4
  32. package/esm/PluginManager.js +1 -1
  33. package/esm/ReExports/coreModules.generated.d.ts +2 -0
  34. package/esm/ReExports/coreModules.generated.js +492 -0
  35. package/esm/ReExports/coreWorkerModules.generated.d.ts +2 -0
  36. package/esm/ReExports/coreWorkerModules.generated.js +453 -0
  37. package/esm/ReExports/frameworkModules.d.ts +2 -0
  38. package/esm/ReExports/frameworkModules.js +67 -0
  39. package/esm/ReExports/frameworkShared.d.ts +12 -0
  40. package/esm/ReExports/frameworkShared.js +16 -0
  41. package/esm/ReExports/frameworkWorkerModules.generated.d.ts +2 -0
  42. package/esm/ReExports/frameworkWorkerModules.generated.js +130 -0
  43. package/esm/ReExports/list.js +493 -79
  44. package/esm/ReExports/modules.d.ts +1 -1
  45. package/esm/ReExports/modules.js +10 -87
  46. package/esm/ReExports/registry.d.ts +1 -0
  47. package/esm/ReExports/registry.js +23 -5
  48. package/esm/ReExports/uiStub.d.ts +2 -1
  49. package/esm/ReExports/uiStub.js +24 -2
  50. package/esm/ReExports/workerModules.js +8 -12
  51. package/esm/TextSearch/TextSearchManager.d.ts +3 -12
  52. package/esm/TextSearch/TextSearchManager.js +22 -10
  53. package/esm/assemblyManager/assembly.d.ts +10 -14
  54. package/esm/assemblyManager/assembly.js +10 -14
  55. package/esm/assemblyManager/assemblyConfigSchema.d.ts +23 -81
  56. package/esm/assemblyManager/assemblyManager.d.ts +10 -16
  57. package/esm/assemblyManager/assemblyManager.js +7 -10
  58. package/esm/assemblyManager/loadRefNameMap.js +3 -3
  59. package/esm/configuration/configurationSchema.d.ts +75 -31
  60. package/esm/configuration/configurationSchema.js +74 -40
  61. package/esm/configuration/configurationSchemaUnion.d.ts +39 -0
  62. package/esm/configuration/configurationSchemaUnion.js +59 -0
  63. package/esm/configuration/configurationSlot.d.ts +37 -12
  64. package/esm/configuration/configurationSlot.js +83 -22
  65. package/esm/configuration/formatAboutConfigSchema.d.ts +7 -21
  66. package/esm/configuration/formatDetailsConfigSchema.d.ts +11 -37
  67. package/esm/configuration/formatDetailsConfigSchema.js +10 -13
  68. package/esm/configuration/getConf.d.ts +17 -9
  69. package/esm/configuration/getConf.js +52 -7
  70. package/esm/configuration/index.d.ts +11 -4
  71. package/esm/configuration/index.js +7 -4
  72. package/esm/configuration/mergeFormatCallbacks.d.ts +6 -7
  73. package/esm/configuration/mergeFormatCallbacks.js +13 -10
  74. package/esm/configuration/readConfObject.d.ts +2 -22
  75. package/esm/configuration/readConfObject.js +15 -49
  76. package/esm/configuration/requirements.d.ts +37 -0
  77. package/esm/configuration/requirements.js +88 -0
  78. package/esm/configuration/schemaRegistry.d.ts +21 -1
  79. package/esm/configuration/schemaRegistry.js +11 -0
  80. package/esm/configuration/schemaTypes.d.ts +3 -0
  81. package/esm/configuration/schemaTypes.js +10 -0
  82. package/esm/configuration/slotFacade.d.ts +35 -4
  83. package/esm/configuration/slotFacade.js +96 -9
  84. package/esm/configuration/snapshotPreprocess.d.ts +27 -0
  85. package/esm/configuration/snapshotPreprocess.js +102 -0
  86. package/esm/configuration/types.d.ts +161 -22
  87. package/esm/data_adapters/BaseAdapter/BaseAdapter.d.ts +2 -2
  88. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.d.ts +11 -2
  89. package/esm/data_adapters/BaseAdapter/BaseFeatureDataAdapter.js +12 -1
  90. package/esm/data_adapters/BaseAdapter/featureDensity.d.ts +2 -3
  91. package/esm/data_adapters/BaseAdapter/featureDensity.js +2 -3
  92. package/esm/data_adapters/BaseAdapter/index.d.ts +22 -3
  93. package/esm/data_adapters/BaseAdapter/types.d.ts +3 -4
  94. package/esm/data_adapters/BaseAdapter/zoomRange.d.ts +10 -0
  95. package/esm/data_adapters/BaseAdapter/zoomRange.js +1 -0
  96. package/esm/data_adapters/CytobandAdapter/configSchema.d.ts +9 -11
  97. package/esm/data_adapters/getSequenceSubAdapter.d.ts +1 -3
  98. package/esm/data_adapters/getSequenceSubAdapter.js +1 -3
  99. package/esm/pluggableElementTypes/AdapterType.d.ts +7 -7
  100. package/esm/pluggableElementTypes/RpcMethodType.d.ts +1 -1
  101. package/esm/pluggableElementTypes/RpcMethodType.js +3 -8
  102. package/esm/pluggableElementTypes/RpcMethodTypeWithFiltersAndRenameRegions.d.ts +1 -2
  103. package/esm/pluggableElementTypes/TextSearchAdapterType.d.ts +7 -7
  104. package/esm/pluggableElementTypes/index.d.ts +1 -1
  105. package/esm/pluggableElementTypes/index.js +1 -1
  106. package/esm/pluggableElementTypes/models/BaseConnectionModelFactory.d.ts +17 -7
  107. package/esm/pluggableElementTypes/models/BaseDisplayModel.d.ts +45 -48
  108. package/esm/pluggableElementTypes/models/BaseDisplayModel.js +40 -36
  109. package/esm/pluggableElementTypes/models/BaseTrackModel.d.ts +10 -13
  110. package/esm/pluggableElementTypes/models/BaseTrackModel.js +6 -6
  111. package/esm/pluggableElementTypes/models/BaseViewModel.d.ts +37 -17
  112. package/esm/pluggableElementTypes/models/BaseViewModel.js +25 -10
  113. package/esm/pluggableElementTypes/models/InternetAccountModel.d.ts +26 -16
  114. package/esm/pluggableElementTypes/models/assertDisplayContract.d.ts +1 -1
  115. package/esm/pluggableElementTypes/models/baseConnectionConfig.d.ts +22 -18
  116. package/esm/pluggableElementTypes/models/baseConnectionConfig.js +5 -5
  117. package/esm/pluggableElementTypes/models/baseInternetAccountConfig.d.ts +26 -31
  118. package/esm/pluggableElementTypes/models/baseTrackConfig.d.ts +57 -141
  119. package/esm/pluggableElementTypes/models/baseTrackConfig.js +22 -26
  120. package/esm/pluggableElementTypes/models/components/SaveTrackData.js +2 -2
  121. package/esm/pluggableElementTypes/models/components/fetchTrackData.d.ts +3 -4
  122. package/esm/pluggableElementTypes/models/components/fetchTrackData.js +3 -3
  123. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.d.ts +15 -7
  124. package/esm/pluggableElementTypes/models/expandTrackConfigShorthand.js +38 -29
  125. package/esm/pluggableElementTypes/models/index.d.ts +1 -2
  126. package/esm/pluggableElementTypes/models/index.js +1 -2
  127. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.d.ts +3 -3
  128. package/esm/pluggableElementTypes/models/saveTrackFileTypes/genbank.js +4 -4
  129. package/esm/pluggableElementTypes/models/saveTrackFileTypes/types.d.ts +3 -3
  130. package/esm/rpc/BaseRpcDriver.d.ts +1 -2
  131. package/esm/rpc/BaseRpcDriver.js +23 -30
  132. package/esm/rpc/MainThreadRpcDriver.d.ts +2 -2
  133. package/esm/rpc/MainThreadRpcDriver.js +13 -8
  134. package/esm/rpc/RpcClient.d.ts +17 -6
  135. package/esm/rpc/RpcClient.js +42 -12
  136. package/esm/rpc/RpcManager.d.ts +8 -10
  137. package/esm/rpc/RpcManager.js +1 -1
  138. package/esm/rpc/RpcRegistry.d.ts +8 -2
  139. package/esm/rpc/RpcServer.d.ts +3 -1
  140. package/esm/rpc/RpcServer.js +19 -12
  141. package/esm/rpc/WebWorkerRpcDriver.d.ts +3 -3
  142. package/esm/rpc/WebWorkerRpcDriver.js +9 -47
  143. package/esm/rpc/byteBudget.d.ts +3 -5
  144. package/esm/rpc/byteBudget.js +4 -4
  145. package/esm/rpc/configSchema.d.ts +7 -21
  146. package/esm/rpc/coreRpcMethods.d.ts +1 -0
  147. package/esm/rpc/coreRpcMethods.js +1 -0
  148. package/esm/rpc/methods/CoreEncodeFeatures.d.ts +6 -5
  149. package/esm/rpc/methods/CoreEncodeFeatures.js +26 -31
  150. package/esm/rpc/methods/CoreGetEncodedFeature.d.ts +13 -0
  151. package/esm/rpc/methods/CoreGetEncodedFeature.js +31 -0
  152. package/esm/rpc/methods/CoreGetExportData.js +2 -2
  153. package/esm/rpc/methods/CoreGetFeatureDensity.js +2 -2
  154. package/esm/rpc/methods/CoreGetFeatures.js +2 -2
  155. package/esm/rpc/methods/CoreGetSequence.js +2 -2
  156. package/esm/rpc/methods/layerFeatures.d.ts +26 -0
  157. package/esm/rpc/methods/layerFeatures.js +40 -0
  158. package/esm/svg/SvgExport.js +3 -4
  159. package/esm/svg/SvgThemeProviders.d.ts +12 -0
  160. package/esm/svg/SvgThemeProviders.js +15 -0
  161. package/esm/svg/exportViewSvg.d.ts +32 -0
  162. package/esm/svg/exportViewSvg.js +13 -0
  163. package/esm/svg/normalizeSvgMarkup.d.ts +7 -0
  164. package/esm/svg/normalizeSvgMarkup.js +99 -0
  165. package/esm/svg/serializeSvg.d.ts +7 -0
  166. package/esm/svg/serializeSvg.js +11 -0
  167. package/esm/svg/svgReady.d.ts +8 -7
  168. package/esm/svg/svgReady.js +8 -7
  169. package/esm/svg/trackNames.d.ts +5 -5
  170. package/esm/svg/trackNames.js +6 -6
  171. package/esm/svg/wrapSvgExport.js +6 -74
  172. package/esm/ui/CascadingMenu.js +83 -86
  173. package/esm/ui/ErrorMessageStackTraceDialog.js +0 -5
  174. package/esm/ui/FileSelector/useInternetAccounts.d.ts +156 -96
  175. package/esm/ui/HoverMenu.d.ts +1 -2
  176. package/esm/ui/HoverMenu.js +6 -3
  177. package/esm/ui/JexlFilterDialog.d.ts +13 -10
  178. package/esm/ui/JexlFilterDialog.js +122 -49
  179. package/esm/ui/JexlFilterRowEditors.d.ts +15 -0
  180. package/esm/ui/JexlFilterRowEditors.js +90 -0
  181. package/esm/ui/LazyBaseTooltip.d.ts +4 -0
  182. package/esm/ui/LazyBaseTooltip.js +9 -0
  183. package/esm/ui/LoadingOverlay.js +3 -1
  184. package/esm/ui/MonospaceTextField.d.ts +2 -1
  185. package/esm/ui/MonospaceTextField.js +21 -19
  186. package/esm/ui/PaletteContext.d.ts +7 -9
  187. package/esm/ui/PaletteContext.js +24 -10
  188. package/esm/ui/RefNameAutocomplete/index.d.ts +1 -2
  189. package/esm/ui/RefNameAutocomplete/index.js +1 -1
  190. package/esm/ui/ScrollChrome.d.ts +6 -9
  191. package/esm/ui/ScrollChrome.js +5 -6
  192. package/esm/ui/ScrollEdgeShadow.d.ts +6 -9
  193. package/esm/ui/ScrollEdgeShadow.js +9 -24
  194. package/esm/ui/SettingsChangesTable.js +3 -3
  195. package/esm/ui/VerticalScrollbar.d.ts +13 -34
  196. package/esm/ui/VerticalScrollbar.js +29 -83
  197. package/esm/ui/ViewLoadingScreen.d.ts +2 -2
  198. package/esm/ui/ViewLoadingScreen.js +3 -3
  199. package/esm/ui/colorScale.d.ts +26 -1
  200. package/esm/ui/colorScale.js +28 -5
  201. package/esm/ui/colors.d.ts +49 -1
  202. package/esm/ui/colors.js +139 -4
  203. package/esm/ui/hoverBoxStyle.d.ts +14 -2
  204. package/esm/ui/hoverBoxStyle.js +17 -2
  205. package/esm/ui/index.d.ts +5 -3
  206. package/esm/ui/index.js +9 -7
  207. package/esm/ui/launchViewMenu.js +3 -3
  208. package/esm/ui/legendSpec.d.ts +2 -0
  209. package/esm/ui/legendSpec.js +3 -0
  210. package/esm/ui/palette.d.ts +0 -1
  211. package/esm/ui/palette.js +3 -27
  212. package/esm/ui/replaceViewAction.d.ts +1 -1
  213. package/esm/ui/replaceViewAction.js +1 -1
  214. package/esm/ui/theme.d.ts +1 -1
  215. package/esm/ui/theme.js +6 -40
  216. package/esm/ui/viewHeaderHeight.d.ts +1 -0
  217. package/esm/ui/viewHeaderHeight.js +1 -0
  218. package/esm/util/Base1DUtils.d.ts +1 -1
  219. package/esm/util/Base1DUtils.js +2 -2
  220. package/esm/util/SvgCanvas.d.ts +15 -13
  221. package/esm/util/SvgCanvas.js +72 -53
  222. package/esm/util/aborting.d.ts +39 -0
  223. package/esm/util/aborting.js +84 -0
  224. package/esm/util/adapterMetadata.d.ts +1 -1
  225. package/esm/util/adapterMetadata.js +6 -6
  226. package/esm/util/addAndShowTrack.d.ts +1 -4
  227. package/esm/util/addRelativeUris.d.ts +10 -2
  228. package/esm/util/addRelativeUris.js +22 -7
  229. package/esm/util/addTrackFromWidget.d.ts +2 -5
  230. package/esm/util/animationAllowed.d.ts +9 -0
  231. package/esm/util/animationAllowed.js +13 -0
  232. package/esm/util/applyRowResizeWheel.d.ts +10 -5
  233. package/esm/util/applyRowResizeWheel.js +10 -21
  234. package/esm/util/bandLayout.d.ts +4 -4
  235. package/esm/util/bandLayout.js +4 -4
  236. package/esm/util/bezierConnector.js +5 -4
  237. package/esm/util/bgzfWorkerPool.d.ts +20 -74
  238. package/esm/util/bgzfWorkerPool.js +20 -74
  239. package/esm/util/cachedSetup.d.ts +1 -1
  240. package/esm/util/cachedSetup.js +2 -2
  241. package/esm/util/categoricalField.d.ts +37 -0
  242. package/esm/util/categoricalField.js +52 -0
  243. package/esm/util/color/cssColorsLevel4.d.ts +1 -0
  244. package/esm/util/color/cssColorsLevel4.js +1 -0
  245. package/esm/util/color/index.d.ts +5 -3
  246. package/esm/util/color/index.js +7 -4
  247. package/esm/util/colorBits.d.ts +1 -2
  248. package/esm/util/colorBits.js +17 -39
  249. package/esm/util/colorRamp.d.ts +27 -1
  250. package/esm/util/colorRamp.js +56 -2
  251. package/esm/util/colorSchemes.d.ts +9 -0
  252. package/esm/util/colorSchemes.js +7 -0
  253. package/esm/util/{createStopTokenRotation.d.ts → createAbortRotation.d.ts} +11 -14
  254. package/esm/util/{createStopTokenRotation.js → createAbortRotation.js} +14 -26
  255. package/esm/util/cssColorParse.d.ts +15 -0
  256. package/esm/util/cssColorParse.js +53 -0
  257. package/esm/util/diagonalizeRegions.d.ts +2 -3
  258. package/esm/util/diagonalizeRegions.js +7 -12
  259. package/esm/util/expandLooseSearchIndex.d.ts +7 -0
  260. package/esm/util/expandLooseSearchIndex.js +25 -0
  261. package/esm/util/featureTransforms.d.ts +30 -3
  262. package/esm/util/featureTransforms.js +233 -36
  263. package/esm/util/fetchAndMaybeUnzip.js +5 -6
  264. package/esm/util/fetchContext.d.ts +5 -6
  265. package/esm/util/fetchContext.js +1 -1
  266. package/esm/util/fetchHub.d.ts +3 -1
  267. package/esm/util/fetchHub.js +2 -2
  268. package/esm/util/fetchSeq.d.ts +2 -3
  269. package/esm/util/fetchSeq.js +2 -2
  270. package/esm/util/fieldReader.d.ts +17 -0
  271. package/esm/util/fieldReader.js +62 -0
  272. package/esm/util/groupKeys.d.ts +75 -0
  273. package/esm/util/groupKeys.js +152 -0
  274. package/esm/util/highlights.d.ts +6 -4
  275. package/esm/util/highlights.js +12 -25
  276. package/esm/util/hooks.d.ts +1 -2
  277. package/esm/util/hooks.js +1 -2
  278. package/esm/util/index.d.ts +3 -3
  279. package/esm/util/index.js +4 -3
  280. package/esm/util/indexCandidates.js +1 -1
  281. package/esm/util/installFetch.d.ts +13 -10
  282. package/esm/util/installFetch.js +11 -10
  283. package/esm/util/installPrerequisiteFetch.d.ts +5 -3
  284. package/esm/util/installPrerequisiteFetch.js +3 -4
  285. package/esm/util/io/index.js +12 -12
  286. package/esm/util/isDataCurrent.d.ts +7 -5
  287. package/esm/util/isDataCurrent.js +9 -6
  288. package/esm/util/jexl.js +24 -21
  289. package/esm/util/jexlFilterRows.d.ts +89 -0
  290. package/esm/util/jexlFilterRows.js +252 -0
  291. package/esm/util/jexlFilters.d.ts +7 -5
  292. package/esm/util/jexlStrings.d.ts +3 -4
  293. package/esm/util/jexlStrings.js +2 -3
  294. package/esm/util/legendCandidates.d.ts +31 -27
  295. package/esm/util/legendCandidates.js +79 -53
  296. package/esm/util/localStorage.js +4 -4
  297. package/esm/util/markEncoding.d.ts +32 -16
  298. package/esm/util/markEncoding.js +177 -150
  299. package/esm/util/markEncodingTypes.d.ts +137 -66
  300. package/esm/util/mstUtils.d.ts +19 -22
  301. package/esm/util/mstUtils.js +19 -22
  302. package/esm/util/numericUtils.d.ts +7 -0
  303. package/esm/util/numericUtils.js +16 -0
  304. package/esm/util/numericValue.d.ts +14 -0
  305. package/esm/util/numericValue.js +34 -0
  306. package/esm/util/openFeatureWidget.js +1 -2
  307. package/esm/util/openViews.d.ts +1 -0
  308. package/esm/util/openViews.js +3 -3
  309. package/esm/util/parseLineByLine.d.ts +3 -4
  310. package/esm/util/parseLineByLine.js +7 -13
  311. package/esm/util/progress.d.ts +21 -21
  312. package/esm/util/progress.js +27 -26
  313. package/esm/util/renameRegions.d.ts +1 -2
  314. package/esm/util/renderToStaticMarkup.js +16 -16
  315. package/esm/util/rxjs.d.ts +7 -8
  316. package/esm/util/rxjs.js +12 -15
  317. package/esm/util/simpleFeature.d.ts +0 -1
  318. package/esm/util/svgColorProps.d.ts +11 -0
  319. package/esm/util/svgColorProps.js +28 -1
  320. package/esm/util/tabix.d.ts +3 -4
  321. package/esm/util/tabix.js +6 -7
  322. package/esm/util/thresholdScale.d.ts +54 -0
  323. package/esm/util/thresholdScale.js +112 -0
  324. package/esm/util/timeGate.d.ts +4 -5
  325. package/esm/util/timeGate.js +4 -5
  326. package/esm/util/trackConfigDelta.d.ts +22 -18
  327. package/esm/util/trackConfigDelta.js +40 -38
  328. package/esm/util/tracks.d.ts +27 -4
  329. package/esm/util/tracks.js +116 -43
  330. package/esm/util/translateTranscript.d.ts +44 -0
  331. package/esm/util/translateTranscript.js +102 -0
  332. package/esm/util/types/index.d.ts +19 -7
  333. package/esm/util/types/services.d.ts +1 -1
  334. package/esm/util/unknownSnapshotKeys.d.ts +15 -0
  335. package/esm/util/unknownSnapshotKeys.js +13 -0
  336. package/esm/util/useFeatureSequence.js +4 -4
  337. package/esm/util/useFetch.d.ts +3 -4
  338. package/esm/util/useFetch.js +5 -6
  339. package/esm/util/usePanelVirtualScroll.d.ts +7 -39
  340. package/esm/util/usePanelVirtualScroll.js +9 -40
  341. package/esm/util/useRowVirtualScroll.d.ts +6 -29
  342. package/esm/util/useRowVirtualScroll.js +8 -49
  343. package/esm/util/useVirtualScrollWheel.d.ts +20 -4
  344. package/esm/util/useVirtualScrollWheel.js +40 -84
  345. package/esm/util/viewHighlights.d.ts +3 -0
  346. package/esm/util/viewHighlights.js +5 -0
  347. package/esm/util/viewStatus.d.ts +24 -15
  348. package/esm/util/viewStatus.js +17 -0
  349. package/esm/util/withLaunchInput.d.ts +1 -1
  350. package/esm/util/withLaunchInput.js +0 -4
  351. package/package.json +26 -12
  352. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.d.ts +0 -80
  353. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/DLGAP3.js +0 -583
  354. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.d.ts +0 -141
  355. package/esm/BaseFeatureWidget/SequenceFeatureDetails/test_data/NCDN.js +0 -1116
  356. package/esm/ReExports/BaseFeatureDetails.d.ts +0 -1
  357. package/esm/ReExports/BaseFeatureDetails.js +0 -10
  358. package/esm/ReExports/barrelOnlyNames.d.ts +0 -5
  359. package/esm/ReExports/barrelOnlyNames.js +0 -63
  360. package/esm/ReExports/index.d.ts +0 -1
  361. package/esm/ReExports/index.js +0 -1
  362. package/esm/ReExports/publicTracks.d.ts +0 -1
  363. package/esm/ReExports/publicTracks.js +0 -14
  364. package/esm/ReExports/publicUi.d.ts +0 -4
  365. package/esm/ReExports/publicUi.js +0 -33
  366. package/esm/ReExports/publicUtil.d.ts +0 -1
  367. package/esm/ReExports/publicUtil.js +0 -32
  368. package/esm/ReExports/sharedModules.d.ts +0 -96
  369. package/esm/ReExports/sharedModules.js +0 -66
  370. package/esm/ReExports/workerNamespaceNames.d.ts +0 -11
  371. package/esm/ReExports/workerNamespaceNames.js +0 -275
  372. package/esm/pluggableElementTypes/models/HighlightsMixin.d.ts +0 -51
  373. package/esm/pluggableElementTypes/models/HighlightsMixin.js +0 -78
  374. package/esm/ui/highlightChipReveal.d.ts +0 -32
  375. package/esm/ui/highlightChipReveal.js +0 -39
  376. package/esm/util/adapterConfigKey.d.ts +0 -12
  377. package/esm/util/adapterConfigKey.js +0 -14
  378. package/esm/util/stopToken.d.ts +0 -212
  379. package/esm/util/stopToken.js +0 -438
@@ -1,9 +1,8 @@
1
- import type { StopToken, StopTokenChecker } from './stopToken.ts';
2
1
  /**
3
2
  * Indeterminate phase: set `label` on the status channel, run `fn`, then restore
4
- * whatever phase encloses it — `''` when there is none. Pass `stopToken` and the
3
+ * whatever phase encloses it — `''` when there is none. Pass `signal` and the
5
4
  * phase becomes a cancellation boundary too: this is the labelled form of
6
- * {@link withStopTokenCheck}, so `fn` is checked on both sides of its await and
5
+ * {@link withAbortCheck}, so `fn` is checked on both sides of its await and
7
6
  * neither check has to be remembered at the call site. The determinate
8
7
  * counterpart is {@link withProgress}.
9
8
  *
@@ -15,7 +14,7 @@ import type { StopToken, StopTokenChecker } from './stopToken.ts';
15
14
  * fetching — `downloadPhase(label, location)` builds one — and a plain string
16
15
  * everywhere else. It nests and retires identically either way.
17
16
  */
18
- export declare function updateStatus<U>(msg: string | StatusPhase, cb: StatusCallback | undefined, fn: () => U | Promise<U>, stopToken?: StopToken): Promise<U>;
17
+ export declare function updateStatus<U>(msg: string | StatusPhase, cb: StatusCallback | undefined, fn: () => U | Promise<U>, signal?: AbortSignal): Promise<U>;
19
18
  /**
20
19
  * A determinate reading on the status channel: a phase label plus how far
21
20
  * through it the operation is. The loading UI renders the message and a bar.
@@ -238,7 +237,7 @@ export declare function throttleStatusEmits(emit: StatusCallback): (status: RpcS
238
237
  * of a burst, not each one in turn.
239
238
  *
240
239
  * Both fetch families own one: `FetchMixin` for the LGV displays, and
241
- * `createStopTokenRotation` for the bare-autorun fetches (dotplot, synteny)
240
+ * `createAbortRotation` for the bare-autorun fetches (dotplot, synteny)
242
241
  * that compose no fetch mixin — and a display that has both lends the mixin's
243
242
  * to the rotation rather than opening a second on one field. A plain function
244
243
  * rather than shared model state because the two families declare their status
@@ -298,13 +297,13 @@ declare function downloadStatusReporter(statusCallback: StatusCallback | undefin
298
297
  * which: bytes for the index readers, blocks and expected-value chunks for
299
298
  * `@gmod/hic`. All of them report `(current, total?)`.
300
299
  *
301
- * `stopToken` makes the phase a cancellation boundary, exactly as it does on
300
+ * `signal` makes the phase a cancellation boundary, exactly as it does on
302
301
  * {@link updateStatus} — `fn` is checked on both sides of its await.
303
302
  *
304
303
  * A {@link StatusPhase} `label` carries its source onto the readings too, so a
305
304
  * download that stalls part-way through still names the file it was reading.
306
305
  */
307
- export declare function downloadStatus<T>(label: string | StatusPhase, statusCallback: StatusCallback | undefined, fn: (onProgress: ReturnType<typeof downloadStatusReporter>) => T | Promise<T>, stopToken?: StopToken): Promise<T>;
306
+ export declare function downloadStatus<T>(label: string | StatusPhase, statusCallback: StatusCallback | undefined, fn: (onProgress: ReturnType<typeof downloadStatusReporter>) => T | Promise<T>, signal?: AbortSignal): Promise<T>;
308
307
  /**
309
308
  * One concurrent operation's contribution to a fan-out's shared status: what it
310
309
  * is reporting right now, plus how much of each phase it has already finished
@@ -415,20 +414,22 @@ export declare function createStatusFanOut(statusCallback: StatusCallback | unde
415
414
  */
416
415
  export type ProgressReporter = (current?: number) => void;
417
416
  /**
418
- * The single per-iteration callback for long synchronous worker loops. The
419
- * returned `report(current)` is called once per outer-loop iteration and does
420
- * two throttled jobs on each call:
417
+ * The single per-iteration callback for long worker loops. The returned
418
+ * `report(current)` is called once per outer-loop iteration and does two jobs
419
+ * on each call:
421
420
  *
422
- * - checks the stop token via the existing throttled {@link checkStopTokenThrottled}
423
- * machinery, so cancellation interrupts the loop within milliseconds instead
424
- * of only at phase boundaries, and
421
+ * - checks `signal`, which sees only an abort that landed at the loop's last
422
+ * await, and
425
423
  * - emits a {@link StatusWithProgress} through `statusCallback` at most once per
426
424
  * `throttleMs`, so the main thread gets a live percentage without flooding
427
425
  * the postMessage channel.
428
426
  *
427
+ * `report()` never yields, so it does not make a loop interruptible. A loop
428
+ * that can run for seconds takes `createAbortBreakpoint` beside it.
429
+ *
429
430
  * Both jobs are optional: with no `statusCallback`/`total` this is purely a
430
- * throttled cancellation tick, so a loop has exactly one inner callback whether
431
- * or not it drives the progress UI.
431
+ * cancellation tick, so a loop has exactly one inner callback whether or not
432
+ * it drives the progress UI.
432
433
  *
433
434
  * Emission is gated on wall-clock time (`throttleMs`) through {@link
434
435
  * createTimeGate}, which thins the `Date.now()` reads as well as the emits —
@@ -436,24 +437,23 @@ export type ProgressReporter = (current?: number) => void;
436
437
  * plain `for` and call `report()` once per item (it owns the counter), or
437
438
  * `report(n)` for an explicit position.
438
439
  */
439
- export declare function createProgressReporter({ label, total, statusCallback, stopToken, stopTokenCheck, throttleMs, }: {
440
+ export declare function createProgressReporter({ label, total, statusCallback, signal, throttleMs, }: {
440
441
  label?: string;
441
442
  total?: number;
442
443
  statusCallback?: (status: RpcStatus) => void;
443
- stopToken?: StopToken;
444
- stopTokenCheck?: StopTokenChecker;
444
+ signal?: AbortSignal;
445
445
  throttleMs?: number;
446
446
  }): ProgressReporter;
447
447
  /**
448
448
  * Run a measurable phase: shows `label` at 0%, hands `fn` a {@link
449
- * ProgressReporter} to drive during the work, then checks the stop token once
449
+ * ProgressReporter} to drive during the work, then checks the signal once
450
450
  * more and restores the enclosing phase. The determinate counterpart to
451
451
  * `updateStatus`, and it nests the same way — see {@link openPhase}.
452
452
  */
453
- export declare function withProgress<T>({ label, total, statusCallback, stopToken, }: {
453
+ export declare function withProgress<T>({ label, total, statusCallback, signal, }: {
454
454
  label: string;
455
455
  total: number;
456
456
  statusCallback?: (status: RpcStatus) => void;
457
- stopToken?: StopToken;
457
+ signal?: AbortSignal;
458
458
  }, fn: (report: ProgressReporter) => T | Promise<T>): Promise<T>;
459
459
  export {};
@@ -1,4 +1,4 @@
1
- import { checkStopTokenThrottled, createStopTokenChecker, withStopTokenCheck, } from './stopToken.js';
1
+ import { checkAbortSignal, withAbortCheck } from './aborting.js';
2
2
  import { createTimeGate } from './timeGate.js';
3
3
  const openPhases = new WeakMap();
4
4
  /**
@@ -41,9 +41,9 @@ function openPhase(cb, label) {
41
41
  }
42
42
  /**
43
43
  * Indeterminate phase: set `label` on the status channel, run `fn`, then restore
44
- * whatever phase encloses it — `''` when there is none. Pass `stopToken` and the
44
+ * whatever phase encloses it — `''` when there is none. Pass `signal` and the
45
45
  * phase becomes a cancellation boundary too: this is the labelled form of
46
- * {@link withStopTokenCheck}, so `fn` is checked on both sides of its await and
46
+ * {@link withAbortCheck}, so `fn` is checked on both sides of its await and
47
47
  * neither check has to be remembered at the call site. The determinate
48
48
  * counterpart is {@link withProgress}.
49
49
  *
@@ -55,7 +55,7 @@ function openPhase(cb, label) {
55
55
  * fetching — `downloadPhase(label, location)` builds one — and a plain string
56
56
  * everywhere else. It nests and retires identically either way.
57
57
  */
58
- export async function updateStatus(msg, cb, fn, stopToken) {
58
+ export async function updateStatus(msg, cb, fn, signal) {
59
59
  const endPhase = openPhase(cb, msg);
60
60
  // pessimistic, so anything leaving this scope other than a value — a throw, a
61
61
  // cancel — retires the phase as unfinished
@@ -65,7 +65,7 @@ export async function updateStatus(msg, cb, fn, stopToken) {
65
65
  // forever — the error surfaces under a stale "Downloading file"
66
66
  try {
67
67
  cb?.(msg);
68
- const result = await withStopTokenCheck(stopToken, fn);
68
+ const result = await withAbortCheck(signal, fn);
69
69
  outcome = 'completed';
70
70
  return result;
71
71
  }
@@ -341,7 +341,7 @@ export function throttleStatusEmits(emit) {
341
341
  * of a burst, not each one in turn.
342
342
  *
343
343
  * Both fetch families own one: `FetchMixin` for the LGV displays, and
344
- * `createStopTokenRotation` for the bare-autorun fetches (dotplot, synteny)
344
+ * `createAbortRotation` for the bare-autorun fetches (dotplot, synteny)
345
345
  * that compose no fetch mixin — and a display that has both lends the mixin's
346
346
  * to the rotation rather than opening a second on one field. A plain function
347
347
  * rather than shared model state because the two families declare their status
@@ -531,14 +531,14 @@ function downloadStatusReporter(statusCallback, label) {
531
531
  * which: bytes for the index readers, blocks and expected-value chunks for
532
532
  * `@gmod/hic`. All of them report `(current, total?)`.
533
533
  *
534
- * `stopToken` makes the phase a cancellation boundary, exactly as it does on
534
+ * `signal` makes the phase a cancellation boundary, exactly as it does on
535
535
  * {@link updateStatus} — `fn` is checked on both sides of its await.
536
536
  *
537
537
  * A {@link StatusPhase} `label` carries its source onto the readings too, so a
538
538
  * download that stalls part-way through still names the file it was reading.
539
539
  */
540
- export async function downloadStatus(label, statusCallback, fn, stopToken) {
541
- return updateStatus(label, statusCallback, () => fn(downloadStatusReporter(statusCallback, label)), stopToken);
540
+ export async function downloadStatus(label, statusCallback, fn, signal) {
541
+ return updateStatus(label, statusCallback, () => fn(downloadStatusReporter(statusCallback, label)), signal);
542
542
  }
543
543
  /** How much of `message` this slot has already finished. */
544
544
  function finished(slot, message) {
@@ -751,20 +751,22 @@ function continuesPhase(previous, status) {
751
751
  reading.current >= previous.current);
752
752
  }
753
753
  /**
754
- * The single per-iteration callback for long synchronous worker loops. The
755
- * returned `report(current)` is called once per outer-loop iteration and does
756
- * two throttled jobs on each call:
754
+ * The single per-iteration callback for long worker loops. The returned
755
+ * `report(current)` is called once per outer-loop iteration and does two jobs
756
+ * on each call:
757
757
  *
758
- * - checks the stop token via the existing throttled {@link checkStopTokenThrottled}
759
- * machinery, so cancellation interrupts the loop within milliseconds instead
760
- * of only at phase boundaries, and
758
+ * - checks `signal`, which sees only an abort that landed at the loop's last
759
+ * await, and
761
760
  * - emits a {@link StatusWithProgress} through `statusCallback` at most once per
762
761
  * `throttleMs`, so the main thread gets a live percentage without flooding
763
762
  * the postMessage channel.
764
763
  *
764
+ * `report()` never yields, so it does not make a loop interruptible. A loop
765
+ * that can run for seconds takes `createAbortBreakpoint` beside it.
766
+ *
765
767
  * Both jobs are optional: with no `statusCallback`/`total` this is purely a
766
- * throttled cancellation tick, so a loop has exactly one inner callback whether
767
- * or not it drives the progress UI.
768
+ * cancellation tick, so a loop has exactly one inner callback whether or not
769
+ * it drives the progress UI.
768
770
  *
769
771
  * Emission is gated on wall-clock time (`throttleMs`) through {@link
770
772
  * createTimeGate}, which thins the `Date.now()` reads as well as the emits —
@@ -772,13 +774,12 @@ function continuesPhase(previous, status) {
772
774
  * plain `for` and call `report()` once per item (it owns the counter), or
773
775
  * `report(n)` for an explicit position.
774
776
  */
775
- export function createProgressReporter({ label = '', total, statusCallback, stopToken, stopTokenCheck, throttleMs = 100, }) {
776
- const checker = stopTokenCheck ?? createStopTokenChecker(stopToken);
777
+ export function createProgressReporter({ label = '', total, statusCallback, signal, throttleMs = 100, }) {
777
778
  const emitDue = createTimeGate();
778
779
  let count = 0;
779
780
  return (current = count) => {
780
781
  count = current + 1;
781
- checkStopTokenThrottled(checker);
782
+ checkAbortSignal(signal);
782
783
  if (statusCallback !== undefined &&
783
784
  total !== undefined &&
784
785
  emitDue(throttleMs)) {
@@ -788,29 +789,29 @@ export function createProgressReporter({ label = '', total, statusCallback, stop
788
789
  }
789
790
  /**
790
791
  * Run a measurable phase: shows `label` at 0%, hands `fn` a {@link
791
- * ProgressReporter} to drive during the work, then checks the stop token once
792
+ * ProgressReporter} to drive during the work, then checks the signal once
792
793
  * more and restores the enclosing phase. The determinate counterpart to
793
794
  * `updateStatus`, and it nests the same way — see {@link openPhase}.
794
795
  */
795
- export async function withProgress({ label, total, statusCallback, stopToken, }, fn) {
796
+ export async function withProgress({ label, total, statusCallback, signal, }, fn) {
796
797
  const report = createProgressReporter({
797
798
  label,
798
799
  total,
799
800
  statusCallback,
800
- stopToken,
801
+ signal,
801
802
  });
802
803
  const endPhase = openPhase(statusCallback, label);
803
804
  // pessimistic for the same reason as `updateStatus`: a phase that leaves this
804
805
  // scope any way other than returning did not finish its work
805
806
  let outcome = 'failed';
806
807
  try {
807
- // inside the try, because `report` checks the stop token before it emits and
808
- // so throws here on a token already stopped. Outside, that threw past the
808
+ // inside the try, because `report` checks the signal before it emits and
809
+ // so throws here on one already aborted. Outside, that threw past the
809
810
  // close and left the phase open on the channel — a slot whose last word is a
810
811
  // label is one `aggregateStatus` counts as in flight for the rest of the
811
812
  // batch.
812
813
  report(0);
813
- const result = await withStopTokenCheck(stopToken, () => fn(report));
814
+ const result = await withAbortCheck(signal, () => fn(report));
814
815
  outcome = 'completed';
815
816
  return result;
816
817
  }
@@ -1,5 +1,4 @@
1
1
  import type { StatusCallback } from './progress.ts';
2
- import type { StopToken } from './stopToken.ts';
3
2
  import type { AssemblyManager, Region } from './types/index.ts';
4
3
  import type { Region as MUIRegion } from './types/mst.ts';
5
4
  import type { Instance } from '@jbrowse/mobx-state-tree';
@@ -9,7 +8,7 @@ export declare function renameRegionIfNeeded(refNameMap: Record<string, string>
9
8
  export declare function renameRegionsIfNeeded<ARGTYPE extends {
10
9
  assemblyName?: string;
11
10
  regions?: Region[];
12
- stopToken?: StopToken;
11
+ signal?: AbortSignal;
13
12
  adapterConfig: Record<string, unknown>;
14
13
  sessionId: string;
15
14
  statusCallback?: StatusCallback;
@@ -14,8 +14,10 @@ import { createRoot } from 'react-dom/client';
14
14
  // (packages/lib/src/renderToStaticMarkup.ts there) -- because a rendering
15
15
  // library asking its host for a renderer was the coupling worth removing, and
16
16
  // because react-dom is a host external for a plugin anyway, so it costs them a
17
- // few hundred bytes rather than a duplicate react. sharedModules.purity.test.ts
18
- // is what keeps this file off the worker's graph now.
17
+ // few hundred bytes rather than a duplicate react. Re-exporting it from the
18
+ // barrel would also stub `@jbrowse/core/util` in the worker, since the
19
+ // generator stubs a module whose graph reaches react-dom; workerModules.test.ts
20
+ // fails on that.
19
21
  //
20
22
  // https://react.dev/reference/react-dom/server/renderToString#removing-rendertostring-from-the-client-code
21
23
  export function renderToStaticMarkup(node) {
@@ -25,13 +27,23 @@ export function renderToStaticMarkup(node) {
25
27
  // jbrowse-img) loads @emotion/react before `document` exists, so its default
26
28
  // cache context is null — provide one explicitly here.
27
29
  const cache = createCache({ key: 'css' });
28
- const root = createRoot(div);
30
+ // a client root reports a render error and unmounts, so without this the
31
+ // export is an empty string its caller writes as a file
32
+ const uncaught = [];
33
+ const root = createRoot(div, {
34
+ onUncaughtError: error => {
35
+ uncaught.push(error);
36
+ },
37
+ });
29
38
  let html;
30
39
  try {
31
40
  // eslint-disable-next-line @eslint-react/dom-no-flush-sync
32
41
  flushSync(() => {
33
42
  root.render(React.createElement(CacheProvider, { value: cache }, node));
34
43
  });
44
+ if (uncaught.length > 0) {
45
+ throw uncaught[0];
46
+ }
35
47
  html = div.innerHTML;
36
48
  }
37
49
  finally {
@@ -44,17 +56,5 @@ export function renderToStaticMarkup(node) {
44
56
  // once the markup is a string, which no longer depends on the DOM.
45
57
  root.unmount();
46
58
  }
47
- // SVG 1.1 presentation attributes (`fill`, `stroke`) take a <color>, which
48
- // does not include rgba() — alpha belongs in a separate fill-opacity /
49
- // stroke-opacity. Illustrator and older Inkscape drop an element whose fill
50
- // they cannot parse, so the alpha is stripped rather than left to break the
51
- // whole shape. It is *dropped*, not converted, so a translucent color exports
52
- // fully opaque: components that need transparency to survive set a separate
53
- // opacity attribute instead (`CrossHatches`, `RowSeparatorLines`).
54
- //
55
- // Rewriting `fill="rgba(r,g,b,a)"` into `fill="rgb(r,g,b)" fill-opacity="a"`
56
- // would preserve the appearance and let those two drop their workarounds, but
57
- // it changes the pixels of every export carrying an rgba color, so it needs a
58
- // visual pass before the snapshots are regenerated.
59
- return html.replaceAll(/\brgba\((.+?),[^,]+?\)/g, 'rgb($1)');
59
+ return html;
60
60
  }
@@ -1,20 +1,19 @@
1
1
  import { Observable } from 'rxjs';
2
- import type { StopToken } from './stopToken.ts';
3
2
  import type { Observer } from 'rxjs';
4
3
  /**
5
4
  * Wrapper for rxjs Observable.create with improved error handling and aborting
6
5
  * support.
7
6
  *
8
- * A `stopToken` errors the subscriber with an abort error the moment the token
9
- * is stopped, rather than waiting for `func` to finish work whose result is
10
- * already discarded. The fetch paths filter abort errors out (`isAbortException`)
11
- * so a cancel does not surface as a track error. It cannot interrupt `func`
12
- * itself — a body doing long synchronous work still needs its own
13
- * `checkStopToken` ticks — but it does stop delivery downstream.
7
+ * A `signal` errors the subscriber with an abort error the moment it aborts,
8
+ * rather than waiting for `func` to finish work whose result is already
9
+ * discarded. The fetch paths filter abort errors out (`isAbortException`) so a
10
+ * cancel does not surface as a track error. It cannot interrupt `func` itself
11
+ * — a body doing long synchronous work still needs its own `checkAbortSignal`
12
+ * ticks — but it does stop delivery downstream.
14
13
  *
15
14
  * @param func - observer function, could be async
16
15
  */
17
- export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, stopToken?: StopToken): Observable<T>;
16
+ export declare function ObservableCreate<T>(func: (arg: Observer<T>) => void | Promise<void>, signal?: AbortSignal): Observable<T>;
18
17
  /**
19
18
  * Subscribe to an observable and resolve when it completes, running `onNext` per
20
19
  * item as it arrives — the streaming shape for parsing items out of a feature
package/esm/util/rxjs.js CHANGED
@@ -1,30 +1,28 @@
1
1
  import { Observable } from 'rxjs';
2
- import { stopTokenSignal } from './stopToken.js';
3
2
  /**
4
3
  * Wrapper for rxjs Observable.create with improved error handling and aborting
5
4
  * support.
6
5
  *
7
- * A `stopToken` errors the subscriber with an abort error the moment the token
8
- * is stopped, rather than waiting for `func` to finish work whose result is
9
- * already discarded. The fetch paths filter abort errors out (`isAbortException`)
10
- * so a cancel does not surface as a track error. It cannot interrupt `func`
11
- * itself — a body doing long synchronous work still needs its own
12
- * `checkStopToken` ticks — but it does stop delivery downstream.
6
+ * A `signal` errors the subscriber with an abort error the moment it aborts,
7
+ * rather than waiting for `func` to finish work whose result is already
8
+ * discarded. The fetch paths filter abort errors out (`isAbortException`) so a
9
+ * cancel does not surface as a track error. It cannot interrupt `func` itself
10
+ * — a body doing long synchronous work still needs its own `checkAbortSignal`
11
+ * ticks — but it does stop delivery downstream.
13
12
  *
14
13
  * @param func - observer function, could be async
15
14
  */
16
- export function ObservableCreate(func, stopToken) {
15
+ export function ObservableCreate(func, signal) {
17
16
  return new Observable((observer) => {
18
- const { signal, dispose } = stopTokenSignal(stopToken);
19
17
  const stop = () => {
20
- observer.error(signal.reason);
18
+ observer.error(signal?.reason);
21
19
  };
22
- if (signal.aborted) {
23
- // stopped before subscribe: no 'abort' event is coming
20
+ if (signal?.aborted) {
21
+ // aborted before subscribe: no 'abort' event is coming
24
22
  stop();
25
23
  }
26
24
  else {
27
- signal.addEventListener('abort', stop);
25
+ signal?.addEventListener('abort', stop);
28
26
  try {
29
27
  const ret = func(observer);
30
28
  if (ret?.catch) {
@@ -38,8 +36,7 @@ export function ObservableCreate(func, stopToken) {
38
36
  }
39
37
  }
40
38
  return () => {
41
- signal.removeEventListener('abort', stop);
42
- dispose();
39
+ signal?.removeEventListener('abort', stop);
43
40
  };
44
41
  });
45
42
  }
@@ -90,7 +90,6 @@ export interface SimpleFeatureSerializedNoId {
90
90
  name?: string;
91
91
  id?: string | number;
92
92
  uniqueId?: string;
93
- __jbrowsefmt?: Record<string, unknown>;
94
93
  mate?: {
95
94
  refName: string;
96
95
  start: number;
@@ -5,3 +5,14 @@ export declare function getStrokeProps(str: string): {
5
5
  export declare function getFillProps(str: string): {
6
6
  [x: string]: string | number;
7
7
  };
8
+ /**
9
+ * A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
10
+ * alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
11
+ * drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
12
+ * and `transparent` have to be split before they reach a file. Undefined for a
13
+ * value that is already an SVG color, `none` or a `url()`.
14
+ */
15
+ export declare function splitPaintAlpha(value: string): {
16
+ color: string;
17
+ opacity: number;
18
+ } | undefined;
@@ -1,4 +1,4 @@
1
- import { formatHEX, getAlpha, newColor, parseCssColorOr } from './colorBits.js';
1
+ import { formatHEX, getAlpha, getBlue, getGreen, getRed, newColor, parseCssColorOr, } from './colorBits.js';
2
2
  // Matches colord()'s fallback for unparsable input.
3
3
  const FALLBACK = newColor(0, 0, 0, 255);
4
4
  // Works on the packed Color directly rather than via colord(): these run per
@@ -26,3 +26,30 @@ export function getStrokeProps(str) {
26
26
  export function getFillProps(str) {
27
27
  return svgColorProps(str, 'fill', 'fillOpacity');
28
28
  }
29
+ // four channels, comma- or slash-separated, so a three-channel `rgb(4,5,6)`
30
+ // never reads its blue as an alpha
31
+ const FUNCTIONAL_ALPHA = /^(?:rgb|hsl)a?\((?:[^,/)]+,){3}\s*([\d.]+)(%?)\s*\)$|^(?:rgb|hsl)a?\([^,/)]+\/\s*([\d.]+)(%?)\s*\)$/i;
32
+ const HEX_ALPHA = /^#(?:[\da-f]{4}|[\da-f]{8})$/i;
33
+ const NOT_SVG_COLOR = /^(?:rgba|hsla?)\(|^transparent$/i;
34
+ /**
35
+ * A paint value split into the `rgb()` an SVG 1.1 `<color>` can carry and the
36
+ * alpha it cannot, for a separate `*-opacity`. Illustrator and older Inkscape
37
+ * drop an element whose fill they cannot parse, so `rgba()`, `hsl()`, `#rgba`
38
+ * and `transparent` have to be split before they reach a file. Undefined for a
39
+ * value that is already an SVG color, `none` or a `url()`.
40
+ */
41
+ export function splitPaintAlpha(value) {
42
+ const m = FUNCTIONAL_ALPHA.exec(value);
43
+ if (!m && !HEX_ALPHA.test(value) && !NOT_SVG_COLOR.test(value)) {
44
+ return undefined;
45
+ }
46
+ const c = parseCssColorOr(value, FALLBACK);
47
+ const digits = m?.[1] ?? m?.[3];
48
+ const percent = (m?.[2] ?? m?.[4]) === '%';
49
+ return {
50
+ color: `rgb(${getRed(c)},${getGreen(c)},${getBlue(c)})`,
51
+ opacity: digits === undefined
52
+ ? getAlpha(c) / 255
53
+ : Math.min(1, Number(digits) / (percent ? 100 : 1)),
54
+ };
55
+ }
@@ -1,5 +1,4 @@
1
1
  import type { StatusCallback } from './progress.ts';
2
- import type { StopToken } from './stopToken.ts';
3
2
  /**
4
3
  * A raw tabix line paired with the metadata the GFF3/GTF adapters need before
5
4
  * parsing: `offset` (the tabix byte offset) mints a stable per-feature id that
@@ -34,13 +33,13 @@ interface TabixLineSource {
34
33
  * label, capturing each line's byte offset, indexed start/end, and feature type
35
34
  * into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
36
35
  *
37
- * The stop token becomes the read's `AbortSignal`, so a cancelled fetch drops
36
+ * The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
38
37
  * its block reads at the socket instead of downloading them and discarding the
39
38
  * lines. @gmod/tabix aborts a block shared between callers only once every
40
39
  * joined caller has aborted (`AggregateAbortController`), so this can't cancel a
41
40
  * chunk another region still needs.
42
41
  */
43
- export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback, stopToken?: StopToken): Promise<TabixLine[]>;
42
+ export declare function readTabixLines(gff: TabixLineSource, refName: string, start: number, end: number, statusCallback?: StatusCallback, signal?: AbortSignal): Promise<TabixLine[]>;
44
43
  /**
45
44
  * Read a region's tabix lines, then — if any feature found there extends past
46
45
  * the query — read the overhang on either side, so a parent line's children (a
@@ -84,7 +83,7 @@ export declare function readTabixLinesRedispatched(file: TabixLineSource, query:
84
83
  end: number;
85
84
  }, expands: (line: TabixLine) => boolean, opts?: {
86
85
  statusCallback?: StatusCallback;
87
- stopToken?: StopToken;
86
+ signal?: AbortSignal;
88
87
  }): Promise<TabixLine[]>;
89
88
  /**
90
89
  * Minimal structural view of the `@gmod/tabix` call a header read needs, kept
package/esm/util/tabix.js CHANGED
@@ -1,6 +1,5 @@
1
1
  import { createStatusFanOut, downloadStatus } from './progress.js';
2
2
  import { calculateRedispatchRange } from './range.js';
3
- import { withStopTokenSignal } from './stopToken.js';
4
3
  /**
5
4
  * Read the feature type (column 3) from a raw GFF3/GTF line without a full
6
5
  * split. Used only to classify a line for redispatch.
@@ -18,15 +17,15 @@ function extractType(line) {
18
17
  * label, capturing each line's byte offset, indexed start/end, and feature type
19
18
  * into a {@link TabixLine}. Shared by the GFF3 and GTF tabix adapters.
20
19
  *
21
- * The stop token becomes the read's `AbortSignal`, so a cancelled fetch drops
20
+ * The signal becomes the read's `AbortSignal`, so a cancelled fetch drops
22
21
  * its block reads at the socket instead of downloading them and discarding the
23
22
  * lines. @gmod/tabix aborts a block shared between callers only once every
24
23
  * joined caller has aborted (`AggregateAbortController`), so this can't cancel a
25
24
  * chunk another region still needs.
26
25
  */
27
- export function readTabixLines(gff, refName, start, end, statusCallback, stopToken) {
26
+ export function readTabixLines(gff, refName, start, end, statusCallback, signal) {
28
27
  const lines = [];
29
- return withStopTokenSignal(stopToken, signal => downloadStatus('Downloading features', statusCallback, onProgress => gff.getLines(refName, start, end, {
28
+ return downloadStatus('Downloading features', statusCallback, onProgress => gff.getLines(refName, start, end, {
30
29
  lineCallback: (line, offset, s, e) => {
31
30
  lines.push({
32
31
  line,
@@ -38,7 +37,7 @@ export function readTabixLines(gff, refName, start, end, statusCallback, stopTok
38
37
  },
39
38
  onProgress,
40
39
  signal,
41
- }))).then(() => lines);
40
+ })).then(() => lines);
42
41
  }
43
42
  /**
44
43
  * Read a region's tabix lines, then — if any feature found there extends past
@@ -81,10 +80,10 @@ export async function readTabixLinesRedispatched(file,
81
80
  // the region's locus only — kept structural, like TabixLineSource above, so
82
81
  // this module stays free of the `types` barrel and its MST models
83
82
  query, expands, opts = {}) {
84
- const { statusCallback, stopToken } = opts;
83
+ const { statusCallback, signal } = opts;
85
84
  // `cb` is not optional: each read decides where it reports, and the flanks
86
85
  // report somewhere the first read does not
87
- const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb, stopToken);
86
+ const read = (start, end, cb) => readTabixLines(file, query.refName, start, end, cb, signal);
88
87
  const lines = await read(query.start, query.end, statusCallback);
89
88
  const redispatch = calculateRedispatchRange(lines, expands, query.start, query.end);
90
89
  if (redispatch) {
@@ -0,0 +1,54 @@
1
+ import type { CategoricalField } from './categoricalField.ts';
2
+ /**
3
+ * #api
4
+ * A domain written as strings — the shared `domain` slot is a `stringArray` —
5
+ * read back as the numbers it names. A member that is not a number reads NaN,
6
+ * which every comparison against it declines.
7
+ */
8
+ export declare function numericDomain(domain: readonly (string | number)[]): number[];
9
+ /**
10
+ * #api
11
+ * A threshold scale's cut points as {@link thresholdIndex} walks them: the
12
+ * numbers the domain names, ascending. Cuts written high to low, as p-value
13
+ * thresholds often are, left the middle interval unreachable, the walk stopping
14
+ * at the first cut a value is under.
15
+ */
16
+ export declare function thresholdCuts(domain: readonly (string | number)[]): number[];
17
+ /**
18
+ * #api
19
+ * The bin a value falls in: how many of the ascending cut points it is at or
20
+ * past, so a palette with one more entry than the domain paints it as
21
+ * `palette[thresholdIndex(value, domain)]`. A value that is not a finite
22
+ * number is in no bin and answers -1.
23
+ */
24
+ export declare function thresholdIndex(value: unknown, domain: readonly number[]): number;
25
+ /**
26
+ * #api
27
+ * The colour of each interval, in order: the declared palette, and the
28
+ * default categorical palette where it runs out.
29
+ */
30
+ export declare function thresholdPalette(bins: number, palette?: readonly string[]): string[];
31
+ /**
32
+ * #api
33
+ * What a threshold scale's bins are called in a key, one label per palette
34
+ * entry: `< a` below the first cut, `a – b` between two, `≥ b` past the last.
35
+ */
36
+ export declare function thresholdLabels(domain: readonly number[]): string[];
37
+ /**
38
+ * #api
39
+ * The key a value holding text that is no number files under on a threshold
40
+ * scale, painted the misconfiguration grey rather than passing for a missing
41
+ * value.
42
+ */
43
+ export declare const NOT_A_NUMBER_LABEL = "(not a number)";
44
+ /**
45
+ * #api
46
+ * A threshold scale read the way every categorical channel reads its field: a
47
+ * value files under the label of the bin it falls in, a feature with no value
48
+ * under `''`, and text that is no number under {@link NOT_A_NUMBER_LABEL}.
49
+ * The bins are the whole domain, so a key lists each one.
50
+ */
51
+ export declare function thresholdField(field: string, { domain, range, }?: {
52
+ domain?: readonly string[];
53
+ range?: readonly string[];
54
+ }): CategoricalField;