@genome-spy/core 0.73.0 → 0.74.0

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 (359) hide show
  1. package/dist/bundle/AbortablePromiseCache-3gHJdF3E.js +96 -0
  2. package/dist/bundle/browser-BTgw5ieH.js +126 -0
  3. package/dist/bundle/chunk-DmhlhrBa.js +11 -0
  4. package/dist/bundle/esm-BDFRLEuD.js +1248 -0
  5. package/dist/bundle/esm-BygJiwh0.js +573 -0
  6. package/dist/bundle/esm-CGX-qz1d.js +155 -0
  7. package/dist/bundle/esm-CgfVIRJ-.js +121 -0
  8. package/dist/bundle/esm-CuMSzCHy.js +298 -0
  9. package/dist/bundle/esm-DMXpJXM4.js +369 -0
  10. package/dist/bundle/esm-DQiq2Zhd.js +1426 -0
  11. package/dist/bundle/esm-DtE8VqAv.js +1015 -0
  12. package/dist/bundle/esm-sIoQYZ21.js +461 -0
  13. package/dist/bundle/index.es.js +21071 -25935
  14. package/dist/bundle/index.js +363 -379
  15. package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
  16. package/dist/schema.json +13098 -7095
  17. package/dist/src/config/axisConfig.d.ts +16 -0
  18. package/dist/src/config/axisConfig.d.ts.map +1 -0
  19. package/dist/src/config/axisConfig.js +84 -0
  20. package/dist/src/config/defaultConfig.d.ts +3 -0
  21. package/dist/src/config/defaultConfig.d.ts.map +1 -0
  22. package/dist/src/config/defaultConfig.js +38 -0
  23. package/dist/src/config/defaults/axisDefaults.d.ts +5 -0
  24. package/dist/src/config/defaults/axisDefaults.d.ts.map +1 -0
  25. package/dist/src/config/defaults/axisDefaults.js +72 -0
  26. package/dist/src/config/defaults/markDefaults.d.ts +15 -0
  27. package/dist/src/config/defaults/markDefaults.d.ts.map +1 -0
  28. package/dist/src/config/defaults/markDefaults.js +121 -0
  29. package/dist/src/config/defaults/scaleDefaults.d.ts +5 -0
  30. package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -0
  31. package/dist/src/config/defaults/scaleDefaults.js +18 -0
  32. package/dist/src/config/defaults/titleDefaults.d.ts +5 -0
  33. package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -0
  34. package/dist/src/config/defaults/titleDefaults.js +47 -0
  35. package/dist/src/config/defaults/viewDefaults.d.ts +3 -0
  36. package/dist/src/config/defaults/viewDefaults.d.ts.map +1 -0
  37. package/dist/src/config/defaults/viewDefaults.js +2 -0
  38. package/dist/src/config/markConfig.d.ts +8 -0
  39. package/dist/src/config/markConfig.d.ts.map +1 -0
  40. package/dist/src/config/markConfig.js +27 -0
  41. package/dist/src/config/mergeConfig.d.ts +8 -0
  42. package/dist/src/config/mergeConfig.d.ts.map +1 -0
  43. package/dist/src/config/mergeConfig.js +81 -0
  44. package/dist/src/config/resolveConfig.d.ts +22 -0
  45. package/dist/src/config/resolveConfig.d.ts.map +1 -0
  46. package/dist/src/config/resolveConfig.js +32 -0
  47. package/dist/src/config/scaleConfig.d.ts +40 -0
  48. package/dist/src/config/scaleConfig.d.ts.map +1 -0
  49. package/dist/src/config/scaleConfig.js +220 -0
  50. package/dist/src/config/styleUtils.d.ts +6 -0
  51. package/dist/src/config/styleUtils.d.ts.map +1 -0
  52. package/dist/src/config/styleUtils.js +10 -0
  53. package/dist/src/config/themes.d.ts +15 -0
  54. package/dist/src/config/themes.d.ts.map +1 -0
  55. package/dist/src/config/themes.js +293 -0
  56. package/dist/src/config/titleConfig.d.ts +12 -0
  57. package/dist/src/config/titleConfig.d.ts.map +1 -0
  58. package/dist/src/config/titleConfig.js +42 -0
  59. package/dist/src/config/viewConfig.d.ts +7 -0
  60. package/dist/src/config/viewConfig.d.ts.map +1 -0
  61. package/dist/src/config/viewConfig.js +29 -0
  62. package/dist/src/data/flowNode.d.ts +22 -1
  63. package/dist/src/data/flowNode.d.ts.map +1 -1
  64. package/dist/src/data/flowNode.js +37 -1
  65. package/dist/src/data/formats/bed.d.ts.map +1 -1
  66. package/dist/src/data/formats/bed.js +6 -1
  67. package/dist/src/data/formats/bedpe.d.ts.map +1 -1
  68. package/dist/src/data/formats/bedpe.js +4 -0
  69. package/dist/src/data/formats/fasta.d.ts.map +1 -1
  70. package/dist/src/data/formats/fasta.js +4 -0
  71. package/dist/src/data/formats/parquet.d.ts.map +1 -1
  72. package/dist/src/data/formats/parquet.js +4 -0
  73. package/dist/src/data/sources/dataSourceFactory.d.ts +2 -13
  74. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  75. package/dist/src/data/sources/dataSourceFactory.js +5 -141
  76. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  77. package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
  78. package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
  79. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  80. package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
  81. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  82. package/dist/src/data/sources/lazy/bamSource.js +11 -0
  83. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  84. package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
  85. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  86. package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
  87. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  88. package/dist/src/data/sources/lazy/gff3Source.js +12 -1
  89. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  90. package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
  91. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
  92. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
  93. package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
  94. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
  95. package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
  96. package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
  97. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  98. package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
  99. package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
  100. package/dist/src/data/sources/lazy/vcfSource.js +11 -0
  101. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  102. package/dist/src/data/sources/urlSource.js +5 -2
  103. package/dist/src/data/transforms/aggregate.d.ts +1 -0
  104. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  105. package/dist/src/data/transforms/aggregate.js +30 -8
  106. package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
  107. package/dist/src/data/transforms/aggregateOps.js +12 -1
  108. package/dist/src/data/transforms/coverage.js +2 -2
  109. package/dist/src/data/transforms/filter.js +1 -1
  110. package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
  111. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  112. package/dist/src/data/transforms/filterScoredLabels.js +9 -0
  113. package/dist/src/data/transforms/measureText.d.ts +1 -0
  114. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  115. package/dist/src/data/transforms/measureText.js +14 -5
  116. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  117. package/dist/src/data/transforms/pileup.js +1 -2
  118. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  119. package/dist/src/data/transforms/regexFold.js +0 -1
  120. package/dist/src/embedFactory.d.ts +13 -0
  121. package/dist/src/embedFactory.d.ts.map +1 -0
  122. package/dist/src/embedFactory.js +127 -0
  123. package/dist/src/encoder/accessor.d.ts +3 -12
  124. package/dist/src/encoder/accessor.d.ts.map +1 -1
  125. package/dist/src/encoder/accessor.js +10 -65
  126. package/dist/src/encoder/encoder.d.ts +51 -8
  127. package/dist/src/encoder/encoder.d.ts.map +1 -1
  128. package/dist/src/encoder/encoder.js +179 -55
  129. package/dist/src/fonts/bmFontManager.js +1 -1
  130. package/dist/src/full.d.ts +2 -0
  131. package/dist/src/full.d.ts.map +1 -0
  132. package/dist/src/full.js +2 -0
  133. package/dist/src/genome/genome.d.ts +8 -0
  134. package/dist/src/genome/genome.d.ts.map +1 -1
  135. package/dist/src/genome/genome.js +16 -2
  136. package/dist/src/genome/genomeStore.js +1 -1
  137. package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -1
  138. package/dist/src/genome/rootGenomeConfig.js +6 -2
  139. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  140. package/dist/src/genome/scaleLocus.js +26 -7
  141. package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
  142. package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
  143. package/dist/src/genomeSpy/cursorManager.js +131 -0
  144. package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
  145. package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
  146. package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
  147. package/dist/src/genomeSpy/interactionController.d.ts +5 -0
  148. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
  149. package/dist/src/genomeSpy/interactionController.js +212 -19
  150. package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
  151. package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
  152. package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
  153. package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
  154. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
  155. package/dist/src/genomeSpy/viewContextFactory.js +12 -4
  156. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
  157. package/dist/src/genomeSpy/viewDataInit.js +7 -3
  158. package/dist/src/genomeSpy.d.ts +1 -124
  159. package/dist/src/genomeSpy.d.ts.map +1 -1
  160. package/dist/src/genomeSpy.js +7 -688
  161. package/dist/src/genomeSpyBase.d.ts +133 -0
  162. package/dist/src/genomeSpyBase.d.ts.map +1 -0
  163. package/dist/src/genomeSpyBase.js +719 -0
  164. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  165. package/dist/src/gl/arrayBuilder.js +0 -3
  166. package/dist/src/gl/colorUtils.d.ts.map +1 -1
  167. package/dist/src/gl/colorUtils.js +3 -0
  168. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  169. package/dist/src/gl/dataToVertices.js +13 -8
  170. package/dist/src/gl/glslScaleGenerator.d.ts +2 -2
  171. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  172. package/dist/src/gl/glslScaleGenerator.js +5 -7
  173. package/dist/src/index.d.ts +3 -9
  174. package/dist/src/index.d.ts.map +1 -1
  175. package/dist/src/index.js +5 -114
  176. package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
  177. package/dist/src/marks/link.d.ts.map +1 -1
  178. package/dist/src/marks/link.js +0 -23
  179. package/dist/src/marks/mark.d.ts +8 -1
  180. package/dist/src/marks/mark.d.ts.map +1 -1
  181. package/dist/src/marks/mark.js +61 -20
  182. package/dist/src/marks/markUtils.d.ts +18 -1
  183. package/dist/src/marks/markUtils.d.ts.map +1 -1
  184. package/dist/src/marks/markUtils.js +52 -4
  185. package/dist/src/marks/point.d.ts.map +1 -1
  186. package/dist/src/marks/point.js +6 -26
  187. package/dist/src/marks/rect.d.ts.map +1 -1
  188. package/dist/src/marks/rect.js +13 -21
  189. package/dist/src/marks/rule.d.ts +7 -2
  190. package/dist/src/marks/rule.d.ts.map +1 -1
  191. package/dist/src/marks/rule.js +125 -16
  192. package/dist/src/marks/text.d.ts.map +1 -1
  193. package/dist/src/marks/text.js +5 -47
  194. package/dist/src/minimal.d.ts +8 -0
  195. package/dist/src/minimal.d.ts.map +1 -0
  196. package/dist/src/minimal.js +21 -0
  197. package/dist/src/paramRuntime/viewParamRuntime.d.ts +19 -0
  198. package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
  199. package/dist/src/paramRuntime/viewParamRuntime.js +35 -0
  200. package/dist/src/scale/scale.d.ts.map +1 -1
  201. package/dist/src/scale/scale.js +13 -7
  202. package/dist/src/scales/axisResolution.d.ts.map +1 -1
  203. package/dist/src/scales/axisResolution.js +9 -5
  204. package/dist/src/scales/domainPlanner.d.ts +28 -8
  205. package/dist/src/scales/domainPlanner.d.ts.map +1 -1
  206. package/dist/src/scales/domainPlanner.js +207 -73
  207. package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
  208. package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
  209. package/dist/src/scales/indexLikeDomainUtils.js +67 -0
  210. package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
  211. package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
  212. package/dist/src/scales/resolutionMemberOrder.js +22 -0
  213. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
  214. package/dist/src/scales/scaleInteractionController.js +43 -4
  215. package/dist/src/scales/scalePropsResolver.d.ts +3 -1
  216. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
  217. package/dist/src/scales/scalePropsResolver.js +83 -6
  218. package/dist/src/scales/scaleResolution.d.ts +23 -0
  219. package/dist/src/scales/scaleResolution.d.ts.map +1 -1
  220. package/dist/src/scales/scaleResolution.js +220 -58
  221. package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -1
  222. package/dist/src/scales/scaleResolutionTestUtils.js +6 -2
  223. package/dist/src/scales/scaleRules.d.ts.map +1 -1
  224. package/dist/src/scales/scaleRules.js +16 -2
  225. package/dist/src/scales/selectionDomainUtils.d.ts +30 -0
  226. package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
  227. package/dist/src/scales/selectionDomainUtils.js +116 -1
  228. package/dist/src/screenshotHarness.js +3 -4
  229. package/dist/src/spec/axis.d.ts +41 -30
  230. package/dist/src/spec/channel.d.ts +15 -9
  231. package/dist/src/spec/config.d.ts +264 -0
  232. package/dist/src/spec/data.d.ts +7 -0
  233. package/dist/src/spec/decoration.d.ts +51 -0
  234. package/dist/src/spec/exampleFiles.d.ts +12 -0
  235. package/dist/src/spec/exampleFiles.d.ts.map +1 -0
  236. package/dist/src/spec/exampleFiles.js +52 -0
  237. package/dist/src/spec/font.d.ts +1 -1
  238. package/dist/src/spec/mark.d.ts +97 -13
  239. package/dist/src/spec/parameter.d.ts +30 -10
  240. package/dist/src/spec/root.d.ts +14 -0
  241. package/dist/src/spec/scale.d.ts +18 -13
  242. package/dist/src/spec/title.d.ts +13 -2
  243. package/dist/src/spec/tooltip.d.ts +1 -1
  244. package/dist/src/spec/transform.d.ts +39 -4
  245. package/dist/src/spec/view.d.ts +67 -19
  246. package/dist/src/styles/genome-spy.css +55 -55
  247. package/dist/src/styles/genome-spy.css.d.ts +1 -1
  248. package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
  249. package/dist/src/styles/genome-spy.css.js +23 -22
  250. package/dist/src/testSetup.d.ts +2 -0
  251. package/dist/src/testSetup.d.ts.map +1 -0
  252. package/dist/src/testSetup.js +5 -0
  253. package/dist/src/tooltip/dataTooltipHandler.js +8 -2
  254. package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
  255. package/dist/src/tooltip/tooltipContext.js +3 -2
  256. package/dist/src/types/embedApi.d.ts +7 -0
  257. package/dist/src/types/encoder.d.ts +17 -15
  258. package/dist/src/types/scaleResolutionApi.d.ts +20 -0
  259. package/dist/src/types/viewContext.d.ts +23 -1
  260. package/dist/src/utils/expression.d.ts +2 -2
  261. package/dist/src/utils/expression.d.ts.map +1 -1
  262. package/dist/src/utils/expression.js +63 -8
  263. package/dist/src/utils/field.d.ts.map +1 -1
  264. package/dist/src/utils/field.js +0 -1
  265. package/dist/src/utils/inertia.d.ts.map +1 -1
  266. package/dist/src/utils/inertia.js +0 -1
  267. package/dist/src/utils/inputBinding.d.ts +1 -1
  268. package/dist/src/utils/interaction.d.ts +109 -0
  269. package/dist/src/utils/interaction.d.ts.map +1 -0
  270. package/dist/src/utils/interaction.js +200 -0
  271. package/dist/src/utils/interactionEvent.d.ts +21 -42
  272. package/dist/src/utils/interactionEvent.d.ts.map +1 -1
  273. package/dist/src/utils/interactionEvent.js +43 -66
  274. package/dist/src/utils/kWayMerge.js +1 -1
  275. package/dist/src/utils/mergeObjects.d.ts.map +1 -1
  276. package/dist/src/utils/mergeObjects.js +0 -2
  277. package/dist/src/utils/radixSort.d.ts.map +1 -1
  278. package/dist/src/utils/radixSort.js +0 -2
  279. package/dist/src/utils/throttle.d.ts.map +1 -1
  280. package/dist/src/utils/throttle.js +0 -2
  281. package/dist/src/utils/ui/tooltip.d.ts +1 -0
  282. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  283. package/dist/src/utils/ui/tooltip.js +1 -0
  284. package/dist/src/utils/url.js +1 -1
  285. package/dist/src/view/axisGridView.d.ts +1 -1
  286. package/dist/src/view/axisGridView.d.ts.map +1 -1
  287. package/dist/src/view/axisGridView.js +2 -47
  288. package/dist/src/view/axisView.d.ts +2 -3
  289. package/dist/src/view/axisView.d.ts.map +1 -1
  290. package/dist/src/view/axisView.js +251 -106
  291. package/dist/src/view/concatView.d.ts +2 -1
  292. package/dist/src/view/concatView.d.ts.map +1 -1
  293. package/dist/src/view/concatView.js +4 -2
  294. package/dist/src/view/containerMutationHelper.d.ts +3 -0
  295. package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
  296. package/dist/src/view/containerMutationHelper.js +4 -1
  297. package/dist/src/view/facetView.d.ts +1 -1
  298. package/dist/src/view/facetView.js +3 -3
  299. package/dist/src/view/flowBuilder.js +2 -2
  300. package/dist/src/view/gridView/gridChild.d.ts +6 -0
  301. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  302. package/dist/src/view/gridView/gridChild.js +72 -43
  303. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  304. package/dist/src/view/gridView/gridView.js +255 -101
  305. package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
  306. package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
  307. package/dist/src/view/gridView/keyboardZoomController.js +1 -1
  308. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  309. package/dist/src/view/gridView/scrollbar.js +4 -2
  310. package/dist/src/view/gridView/selectionRect.d.ts +4 -0
  311. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  312. package/dist/src/view/gridView/selectionRect.js +20 -1
  313. package/dist/src/view/gridView/separatorView.d.ts +1 -0
  314. package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
  315. package/dist/src/view/gridView/separatorView.js +9 -0
  316. package/dist/src/view/interactionRouting.d.ts +20 -0
  317. package/dist/src/view/interactionRouting.d.ts.map +1 -0
  318. package/dist/src/view/interactionRouting.js +53 -0
  319. package/dist/src/view/layerView.d.ts.map +1 -1
  320. package/dist/src/view/layerView.js +12 -9
  321. package/dist/src/view/layout/grid.js +1 -1
  322. package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
  323. package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
  324. package/dist/src/view/testUtils.d.ts +17 -3
  325. package/dist/src/view/testUtils.d.ts.map +1 -1
  326. package/dist/src/view/testUtils.js +62 -69
  327. package/dist/src/view/title.d.ts +8 -1
  328. package/dist/src/view/title.d.ts.map +1 -1
  329. package/dist/src/view/title.js +66 -76
  330. package/dist/src/view/unitView.d.ts +1 -1
  331. package/dist/src/view/unitView.d.ts.map +1 -1
  332. package/dist/src/view/unitView.js +67 -17
  333. package/dist/src/view/view.d.ts +76 -30
  334. package/dist/src/view/view.d.ts.map +1 -1
  335. package/dist/src/view/view.js +136 -47
  336. package/dist/src/view/viewFactory.d.ts +11 -3
  337. package/dist/src/view/viewFactory.d.ts.map +1 -1
  338. package/dist/src/view/viewFactory.js +37 -11
  339. package/dist/src/view/viewUtils.d.ts.map +1 -1
  340. package/dist/src/view/viewUtils.js +41 -5
  341. package/dist/src/view/zoom.d.ts +2 -2
  342. package/dist/src/view/zoom.d.ts.map +1 -1
  343. package/dist/src/view/zoom.js +21 -23
  344. package/package.json +18 -10
  345. package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
  346. package/dist/bundle/browser-0iNU5Wit.js +0 -138
  347. package/dist/bundle/index-BYsZN7b0.js +0 -1597
  348. package/dist/bundle/index-C3kClAEN.js +0 -1771
  349. package/dist/bundle/index-C7wOh6y1.js +0 -657
  350. package/dist/bundle/index-CRaQAuki.js +0 -326
  351. package/dist/bundle/index-D9v1PCj9.js +0 -507
  352. package/dist/bundle/index-GDOuv_D5.js +0 -266
  353. package/dist/bundle/index-Gt44EOIH.js +0 -628
  354. package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
  355. package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
  356. package/dist/bundle/unzip-Bac01w6X.js +0 -1492
  357. package/dist/src/config/scaleDefaults.d.ts +0 -8
  358. package/dist/src/config/scaleDefaults.d.ts.map +0 -1
  359. package/dist/src/config/scaleDefaults.js +0 -45
@@ -1,11 +1,22 @@
1
1
  import { span } from "vega-util";
2
2
  import { isContinuous } from "vega-scale";
3
3
 
4
- import { LOCUS } from "./scaleResolutionConstants.js";
5
- import { requireIntervalSelection } from "./selectionDomainUtils.js";
4
+ import { INDEX, LOCUS } from "./scaleResolutionConstants.js";
5
+ import {
6
+ toInternalIndexLikeDataDomain,
7
+ toInternalIndexLikeInterval,
8
+ } from "./indexLikeDomainUtils.js";
9
+ import {
10
+ hasIntervalSelectionBindingInScope,
11
+ resolveIntervalSelectionBinding,
12
+ } from "./selectionDomainUtils.js";
6
13
  import createDomain from "../utils/domainArray.js";
7
14
  import { getAccessorDomainKey, isScaleAccessor } from "../encoder/accessor.js";
8
- import { getPrimaryChannel } from "../encoder/encoder.js";
15
+ import { getEncoderAccessors, getPrimaryChannel } from "../encoder/encoder.js";
16
+ import {
17
+ hasExplicitLocusUpperBound,
18
+ isChromosomalLocusInterval,
19
+ } from "../genome/genome.js";
9
20
 
10
21
  /**
11
22
  * @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
@@ -16,7 +27,8 @@ import { getPrimaryChannel } from "../encoder/encoder.js";
16
27
  * @typedef {{
17
28
  * param: string,
18
29
  * encoding: "x" | "y",
19
- * sync: "auto" | "oneWay" | "twoWay",
30
+ * hasInitial: boolean,
31
+ * runtime: any,
20
32
  * }} SelectionDomainLinkInfo
21
33
  */
22
34
 
@@ -24,6 +36,9 @@ export default class DomainPlanner {
24
36
  /** @type {() => Set<ScaleResolutionMember>} */
25
37
  #getMembers;
26
38
 
39
+ /** @type {() => Set<ScaleResolutionMember>} */
40
+ #getAllMembers;
41
+
27
42
  /** @type {() => Set<ScaleResolutionMember>} */
28
43
  #getDataMembers;
29
44
 
@@ -39,20 +54,21 @@ export default class DomainPlanner {
39
54
  /** @type {any[]} */
40
55
  #initialDomain;
41
56
 
42
- /** @type {DomainArray | undefined} */
43
- #configuredDomain;
44
-
45
57
  /** @type {SelectionDomainLinkInfo | undefined} */
46
58
  #selectionDomainLinkInfo = undefined;
47
59
 
48
60
  #configuredDomainDirty = true;
49
61
 
62
+ /** @type {Map<boolean, DomainArray | undefined>} */
63
+ #configuredDomainsByInitialMode = new Map();
64
+
50
65
  /** @type {WeakMap<ScaleResolutionMember, import("../types/encoder.js").ScaleAccessor[]>} */
51
66
  #accessorsByMember = new WeakMap();
52
67
 
53
68
  /**
54
69
  * @param {object} options
55
70
  * @param {() => Set<ScaleResolutionMember>} options.getMembers
71
+ * @param {() => Set<ScaleResolutionMember>} [options.getAllMembers]
56
72
  * @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
57
73
  * @param {() => import("../spec/channel.js").Type} options.getType
58
74
  * @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} options.getLocusExtent
@@ -60,12 +76,14 @@ export default class DomainPlanner {
60
76
  */
61
77
  constructor({
62
78
  getMembers,
79
+ getAllMembers,
63
80
  getDataMembers,
64
81
  getType,
65
82
  getLocusExtent,
66
83
  fromComplexInterval,
67
84
  }) {
68
85
  this.#getMembers = getMembers;
86
+ this.#getAllMembers = getAllMembers ?? getMembers;
69
87
  this.#getDataMembers = getDataMembers ?? getMembers;
70
88
  this.#getType = getType;
71
89
  this.#getLocusExtent = getLocusExtent;
@@ -79,25 +97,46 @@ export default class DomainPlanner {
79
97
  return this.#initialDomain;
80
98
  }
81
99
 
82
- hasConfiguredDomain() {
83
- return !!this.getConfiguredDomain();
100
+ /**
101
+ * @param {{ includeSelectionInitial?: boolean }} [options]
102
+ */
103
+ hasConfiguredDomain(options = {}) {
104
+ return !!this.getConfiguredDomain(options);
84
105
  }
85
106
 
86
107
  hasSelectionConfiguredDomain() {
87
- this.getConfiguredDomain();
108
+ this.getSelectionConfiguredDomainBindingInfo();
88
109
  return !!this.#selectionDomainLinkInfo;
89
110
  }
90
111
 
91
112
  /**
92
113
  * @returns {SelectionDomainLinkInfo | undefined}
93
114
  */
94
- getSelectionConfiguredDomainInfo() {
115
+ getSelectionConfiguredDomainBindingInfo() {
116
+ if (this.#selectionDomainLinkInfo || !this.#configuredDomainDirty) {
117
+ return this.#selectionDomainLinkInfo;
118
+ }
119
+
95
120
  this.getConfiguredDomain();
96
121
  return this.#selectionDomainLinkInfo;
97
122
  }
98
123
 
124
+ getSelectionConfiguredDomainInfo() {
125
+ const bindingInfo = this.getSelectionConfiguredDomainBindingInfo();
126
+ if (!bindingInfo) {
127
+ return;
128
+ }
129
+
130
+ return {
131
+ param: bindingInfo.param,
132
+ encoding: bindingInfo.encoding,
133
+ };
134
+ }
135
+
99
136
  invalidateConfiguredDomain() {
100
137
  this.#configuredDomainDirty = true;
138
+ this.#selectionDomainLinkInfo = undefined;
139
+ this.#configuredDomainsByInitialMode.clear();
101
140
  }
102
141
 
103
142
  /**
@@ -121,12 +160,17 @@ export default class DomainPlanner {
121
160
  *
122
161
  * @param {boolean} [extractDataDomain]
123
162
  * @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
163
+ * @param {{ includeSelectionInitial?: boolean }} [options]
124
164
  * @returns {any[]}
125
165
  */
126
- getConfiguredOrDefaultDomain(extractDataDomain = false, locusAssembly) {
166
+ getConfiguredOrDefaultDomain(
167
+ extractDataDomain = false,
168
+ locusAssembly,
169
+ options = {}
170
+ ) {
127
171
  // TODO: intersect the domain with zoom extent (if it's defined)
128
172
  return (
129
- this.getConfiguredDomain() ??
173
+ this.getConfiguredDomain(options) ??
130
174
  this.getDefaultDomain(extractDataDomain, locusAssembly)
131
175
  );
132
176
  }
@@ -134,19 +178,35 @@ export default class DomainPlanner {
134
178
  /**
135
179
  * Unions the configured domains of all participating views.
136
180
  *
181
+ * @param {{ includeSelectionInitial?: boolean }} [options]
137
182
  * @return {DomainArray}
138
183
  */
139
- getConfiguredDomain() {
140
- if (!this.#configuredDomainDirty) {
141
- return this.#configuredDomain;
184
+ getConfiguredDomain(options = {}) {
185
+ const includeSelectionInitial = options.includeSelectionInitial ?? true;
186
+
187
+ if (
188
+ !this.#configuredDomainDirty &&
189
+ this.#configuredDomainsByInitialMode.has(includeSelectionInitial)
190
+ ) {
191
+ return this.#configuredDomainsByInitialMode.get(
192
+ includeSelectionInitial
193
+ );
142
194
  }
143
195
 
144
196
  const configuredDomain = resolveConfiguredDomain(
145
197
  this.#getMembers(),
146
- this.#fromComplexInterval
198
+ this.#fromComplexInterval,
199
+ includeSelectionInitial
200
+ );
201
+ validateSharedSelectionDomain(
202
+ this.#getAllMembers(),
203
+ configuredDomain.selectionRef
147
204
  );
148
- this.#configuredDomain = configuredDomain.domain;
149
205
  this.#selectionDomainLinkInfo = configuredDomain.selectionRef;
206
+ this.#configuredDomainsByInitialMode.set(
207
+ includeSelectionInitial,
208
+ configuredDomain.domain
209
+ );
150
210
  this.#configuredDomainDirty = false;
151
211
  return configuredDomain.domain;
152
212
  }
@@ -167,18 +227,19 @@ export default class DomainPlanner {
167
227
  /**
168
228
  * @param {import("../types/encoder.js").VegaScale} scale
169
229
  * @param {boolean} domainWasInitialized
230
+ * @param {any[]} [snapshotDomain]
170
231
  * @returns {boolean} true if listeners should be notified immediately
171
232
  */
172
- captureInitialDomain(scale, domainWasInitialized) {
233
+ captureInitialDomain(scale, domainWasInitialized, snapshotDomain) {
173
234
  if (!this.#initialDomain && isContinuous(scale.type)) {
174
- const domain = scale.domain();
235
+ const domain = snapshotDomain ?? scale.domain();
175
236
  if (span(domain) > 0) {
176
237
  this.#initialDomain = domain;
177
238
  }
178
239
  }
179
240
 
180
241
  if (!domainWasInitialized) {
181
- this.#initialDomain = scale.domain();
242
+ this.#initialDomain = snapshotDomain ?? scale.domain();
182
243
  return true;
183
244
  }
184
245
 
@@ -205,7 +266,7 @@ export default class DomainPlanner {
205
266
  return [];
206
267
  }
207
268
 
208
- const accessors = encoder.accessors ?? [];
269
+ const accessors = getEncoderAccessors(encoder);
209
270
  if (accessors.length === 0) {
210
271
  return [];
211
272
  }
@@ -222,12 +283,17 @@ export default class DomainPlanner {
222
283
  /**
223
284
  * @param {Set<ScaleResolutionMember>} members
224
285
  * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
286
+ * @param {boolean} includeSelectionInitial
225
287
  * @returns {{
226
288
  * domain: DomainArray | undefined,
227
289
  * selectionRef: SelectionDomainLinkInfo | undefined,
228
290
  * }}
229
291
  */
230
- function resolveConfiguredDomain(members, fromComplexInterval) {
292
+ function resolveConfiguredDomain(
293
+ members,
294
+ fromComplexInterval,
295
+ includeSelectionInitial
296
+ ) {
231
297
  const domainMembers = Array.from(members)
232
298
  .filter((member) => member.contributesToDomain)
233
299
  .filter((member) => member.channelDef.scale?.domain);
@@ -235,12 +301,10 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
235
301
  /** @type {DomainArray[]} */
236
302
  const domains = [];
237
303
 
238
- /** @type {string | undefined} */
239
- let selectionRefKey = undefined;
304
+ /** @type {any} */
305
+ let selectionRefRuntime = undefined;
240
306
  /** @type {string | undefined} */
241
307
  let selectionRefDescription = undefined;
242
- /** @type {"auto" | "oneWay" | "twoWay" | undefined} */
243
- let selectionRefSync = undefined;
244
308
  /** @type {SelectionDomainLinkInfo | undefined} */
245
309
  let selectionRef = undefined;
246
310
  let hasLiteralDomain = false;
@@ -257,10 +321,16 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
257
321
  const resolved = resolveSelectionDomain(
258
322
  member,
259
323
  domainDef,
260
- fromComplexInterval
324
+ fromComplexInterval,
325
+ includeSelectionInitial
261
326
  );
262
327
 
263
- if (selectionRefKey && selectionRefKey !== resolved.key) {
328
+ if (
329
+ selectionRef &&
330
+ (selectionRef.runtime !== resolved.runtime ||
331
+ selectionRef.param !== resolved.param ||
332
+ selectionRef.encoding !== resolved.encoding)
333
+ ) {
264
334
  throw new Error(
265
335
  "Conflicting selection domain references on a shared scale: " +
266
336
  selectionRefDescription +
@@ -270,28 +340,14 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
270
340
  );
271
341
  }
272
342
 
273
- if (!selectionRefSync) {
274
- selectionRefSync = resolved.sync;
275
- } else if (selectionRefSync === "auto") {
276
- selectionRefSync = resolved.sync;
277
- } else if (resolved.sync !== "auto") {
278
- if (selectionRefSync !== resolved.sync) {
279
- throw new Error(
280
- "Conflicting selection domain sync modes on a shared scale: " +
281
- selectionRefSync +
282
- " vs " +
283
- resolved.sync +
284
- "."
285
- );
286
- }
287
- }
288
-
289
- selectionRefKey = resolved.key;
343
+ selectionRefRuntime = resolved.runtime;
290
344
  selectionRefDescription = resolved.description;
291
345
  selectionRef = {
292
346
  param: resolved.param,
293
347
  encoding: resolved.encoding,
294
- sync: selectionRefSync,
348
+ hasInitial:
349
+ (selectionRef?.hasInitial ?? false) || resolved.hasInitial,
350
+ runtime: resolved.runtime,
295
351
  };
296
352
 
297
353
  if (resolved.domain) {
@@ -300,7 +356,7 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
300
356
  continue;
301
357
  }
302
358
 
303
- if (selectionRefKey) {
359
+ if (selectionRefRuntime) {
304
360
  throw new Error(
305
361
  "Cannot mix literal configured domains with selection-driven domains on a shared scale."
306
362
  );
@@ -308,7 +364,11 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
308
364
 
309
365
  hasLiteralDomain = true;
310
366
  domains.push(
311
- createDomain(member.channelDef.type, fromComplexInterval(domainDef))
367
+ resolveConfiguredIntervalDomain(
368
+ member.channelDef.type,
369
+ domainDef,
370
+ fromComplexInterval
371
+ )
312
372
  );
313
373
  }
314
374
 
@@ -319,7 +379,7 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
319
379
  };
320
380
  }
321
381
 
322
- if (selectionRefKey) {
382
+ if (selectionRefRuntime) {
323
383
  // Selection refs are still the source of truth even when the
324
384
  // selection interval currently resolves to no domain.
325
385
  return { domain: undefined, selectionRef };
@@ -332,24 +392,23 @@ function resolveConfiguredDomain(members, fromComplexInterval) {
332
392
  * @param {ScaleResolutionMember} member
333
393
  * @param {SelectionDomainRef} domainRef
334
394
  * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
395
+ * @param {boolean} includeSelectionInitial
335
396
  * @returns {{
336
397
  * domain: DomainArray | undefined,
337
- * key: string,
338
398
  * description: string,
339
399
  * param: string,
340
400
  * encoding: "x" | "y",
341
- * sync: "auto" | "oneWay" | "twoWay",
401
+ * hasInitial: boolean,
402
+ * runtime: any,
342
403
  * }}
343
404
  */
344
- function resolveSelectionDomain(member, domainRef, fromComplexInterval) {
405
+ function resolveSelectionDomain(
406
+ member,
407
+ domainRef,
408
+ fromComplexInterval,
409
+ includeSelectionInitial
410
+ ) {
345
411
  const paramName = domainRef.param;
346
- const syncMode = domainRef.sync ?? "auto";
347
-
348
- if (syncMode !== "auto" && syncMode !== "oneWay" && syncMode !== "twoWay") {
349
- throw new Error(
350
- `Invalid selection domain sync mode "${syncMode}" for parameter "${paramName}".`
351
- );
352
- }
353
412
 
354
413
  const resolvedChannel = resolveSelectionDomainChannel(
355
414
  member.channel,
@@ -357,40 +416,112 @@ function resolveSelectionDomain(member, domainRef, fromComplexInterval) {
357
416
  paramName
358
417
  );
359
418
 
360
- const paramRuntime = member.view.paramRuntime;
361
- const selection = requireIntervalSelection(
362
- paramRuntime?.findValue(paramName),
363
- paramName
419
+ const binding = resolveIntervalSelectionBinding(
420
+ member.view,
421
+ paramName,
422
+ resolvedChannel
364
423
  );
365
-
366
- const interval = selection.intervals[resolvedChannel];
367
- const key = [paramName, resolvedChannel].join("|");
424
+ const hasInitial = domainRef.initial !== undefined;
425
+ const interval = binding.selection.intervals[resolvedChannel];
368
426
  const description = paramName + "." + resolvedChannel;
369
-
370
427
  if (!interval || interval.length !== 2) {
428
+ const initialDomain = includeSelectionInitial
429
+ ? domainRef.initial
430
+ ? resolveConfiguredIntervalDomain(
431
+ member.channelDef.type,
432
+ domainRef.initial,
433
+ fromComplexInterval
434
+ )
435
+ : undefined
436
+ : undefined;
371
437
  return {
372
- domain: undefined,
373
- key,
438
+ domain: initialDomain,
374
439
  description,
375
440
  param: paramName,
376
441
  encoding: resolvedChannel,
377
- sync: syncMode,
442
+ hasInitial,
443
+ runtime: binding.runtime,
378
444
  };
379
445
  }
380
446
 
381
447
  return {
448
+ // Selection intervals already use internal scale-domain coordinates.
382
449
  domain: createDomain(
383
450
  member.channelDef.type,
384
451
  fromComplexInterval(interval)
385
452
  ),
386
- key,
387
453
  description,
388
454
  param: paramName,
389
455
  encoding: resolvedChannel,
390
- sync: syncMode,
456
+ hasInitial,
457
+ runtime: binding.runtime,
391
458
  };
392
459
  }
393
460
 
461
+ /**
462
+ * @param {import("../spec/channel.js").Type} type
463
+ * @param {ScalarDomain | ComplexDomain} interval
464
+ * @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
465
+ * @returns {DomainArray}
466
+ */
467
+ function resolveConfiguredIntervalDomain(type, interval, fromComplexInterval) {
468
+ const numericDomain = fromComplexInterval(interval);
469
+ const internalDomain =
470
+ type === LOCUS &&
471
+ isChromosomalLocusInterval(interval) &&
472
+ !hasExplicitLocusUpperBound(interval)
473
+ ? numericDomain
474
+ : toInternalIndexLikeInterval(type, numericDomain);
475
+
476
+ return createDomain(type, internalDomain);
477
+ }
478
+
479
+ /**
480
+ * Fails fast when a selection-driven scale domain ends up sharing the same
481
+ * scale resolution as the interval selection that drives it. This typically
482
+ * happens when an overview/detail spec forgets to make the linked positional
483
+ * scale independent.
484
+ *
485
+ * @param {Set<ScaleResolutionMember>} members
486
+ * @param {SelectionDomainLinkInfo | undefined} selectionRef
487
+ */
488
+ function validateSharedSelectionDomain(members, selectionRef) {
489
+ if (
490
+ !selectionRef ||
491
+ members.size < 2 ||
492
+ !Array.from(members).some((member) =>
493
+ hasIntervalSelectionBindingInScope(
494
+ member.view,
495
+ selectionRef.runtime,
496
+ selectionRef.param,
497
+ selectionRef.encoding
498
+ )
499
+ )
500
+ ) {
501
+ return;
502
+ }
503
+
504
+ const viewPaths = Array.from(
505
+ new Set(
506
+ Array.from(members)
507
+ .filter((member) => member.contributesToDomain)
508
+ .map(
509
+ (member) =>
510
+ member.view.getPathString?.() ??
511
+ member.view.name ??
512
+ "(unknown)"
513
+ )
514
+ )
515
+ );
516
+
517
+ throw new Error(
518
+ `Selection domain reference "${selectionRef.param}.${selectionRef.encoding}" cannot use a shared ${selectionRef.encoding} scale when the same interval selection is defined in that shared view group (${viewPaths.join(", ")}). ` +
519
+ `This creates a feedback loop between brushing and the scale domain. ` +
520
+ `Make the linked ${selectionRef.encoding} scale independent, for example with ` +
521
+ `"resolve": { "scale": { "${selectionRef.encoding}": "independent" } } on the common ancestor.`
522
+ );
523
+ }
524
+
394
525
  /**
395
526
  * @param {import("../spec/channel.js").ChannelWithScale} channel
396
527
  * @param {SelectionDomainRef} domainRef
@@ -502,5 +633,8 @@ function resolveDefaultDomain(type, getLocusExtent, dataDomain, locusAssembly) {
502
633
  if (type == LOCUS) {
503
634
  return getLocusExtent(locusAssembly);
504
635
  }
636
+ if (type == INDEX) {
637
+ return toInternalIndexLikeDataDomain(type, dataDomain) ?? [];
638
+ }
505
639
  return dataDomain ?? [];
506
640
  }
@@ -0,0 +1,29 @@
1
+ /**
2
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
3
+ * @returns {boolean}
4
+ */
5
+ export function isIndexLikeDomainType(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType): boolean;
6
+ /**
7
+ * Converts a numeric user-facing inclusive interval into the internal half-open
8
+ * form used by index-like scales.
9
+ *
10
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
11
+ * @param {number[]} interval
12
+ * @returns {number[]}
13
+ */
14
+ export function toInternalIndexLikeInterval(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[]): number[];
15
+ /**
16
+ * Converts an internal half-open interval into a user-facing inclusive form.
17
+ *
18
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
19
+ * @param {number[]} interval
20
+ * @returns {number[]}
21
+ */
22
+ export function toExternalIndexLikeInterval(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[]): number[];
23
+ /**
24
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
25
+ * @param {number[] | undefined} interval
26
+ * @returns {number[] | undefined}
27
+ */
28
+ export function toInternalIndexLikeDataDomain(type: import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType, interval: number[] | undefined): number[] | undefined;
29
+ //# sourceMappingURL=indexLikeDomainUtils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"indexLikeDomainUtils.d.ts","sourceRoot":"","sources":["../../../src/scales/indexLikeDomainUtils.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH,4CAHW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,GACtE,OAAO,CAInB;AAED;;;;;;;GAOG;AACH,kDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GACN,MAAM,EAAE,CAIpB;AAED;;;;;;GAMG;AACH,kDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GACN,MAAM,EAAE,CAIpB;AAED;;;;GAIG;AACH,oDAJW,OAAO,oBAAoB,EAAE,IAAI,GAAG,OAAO,kBAAkB,EAAE,SAAS,YACxE,MAAM,EAAE,GAAG,SAAS,GAClB,MAAM,EAAE,GAAG,SAAS,CAMhC"}
@@ -0,0 +1,67 @@
1
+ import { INDEX, LOCUS } from "./scaleResolutionConstants.js";
2
+
3
+ /**
4
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
5
+ * @returns {boolean}
6
+ */
7
+ export function isIndexLikeDomainType(type) {
8
+ return type === INDEX || type === LOCUS;
9
+ }
10
+
11
+ /**
12
+ * Converts a numeric user-facing inclusive interval into the internal half-open
13
+ * form used by index-like scales.
14
+ *
15
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
16
+ * @param {number[]} interval
17
+ * @returns {number[]}
18
+ */
19
+ export function toInternalIndexLikeInterval(type, interval) {
20
+ return isIndexLikeDomainType(type) ? expandUpperBound(interval) : interval;
21
+ }
22
+
23
+ /**
24
+ * Converts an internal half-open interval into a user-facing inclusive form.
25
+ *
26
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
27
+ * @param {number[]} interval
28
+ * @returns {number[]}
29
+ */
30
+ export function toExternalIndexLikeInterval(type, interval) {
31
+ return isIndexLikeDomainType(type) ? shrinkUpperBound(interval) : interval;
32
+ }
33
+
34
+ /**
35
+ * @param {import("../spec/channel.js").Type | import("../spec/scale.js").ScaleType} type
36
+ * @param {number[] | undefined} interval
37
+ * @returns {number[] | undefined}
38
+ */
39
+ export function toInternalIndexLikeDataDomain(type, interval) {
40
+ return interval && isIndexLikeDomainType(type)
41
+ ? expandUpperBound(interval)
42
+ : interval;
43
+ }
44
+
45
+ /**
46
+ * @param {number[]} interval
47
+ * @returns {number[]}
48
+ */
49
+ function expandUpperBound(interval) {
50
+ return [interval[0], interval[1] + getDirection(interval)];
51
+ }
52
+
53
+ /**
54
+ * @param {number[]} interval
55
+ * @returns {number[]}
56
+ */
57
+ function shrinkUpperBound(interval) {
58
+ return [interval[0], interval[1] - getDirection(interval)];
59
+ }
60
+
61
+ /**
62
+ * @param {number[]} interval
63
+ * @returns {1 | -1}
64
+ */
65
+ function getDirection(interval) {
66
+ return interval[1] >= interval[0] ? 1 : -1;
67
+ }
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Stable ordering for resolution members so merge behavior does not depend on
3
+ * registration order.
4
+ *
5
+ * @template {{ view: { getPathString(): string }, channel?: string }} T
6
+ * @param {Set<T> | Iterable<T>} members
7
+ * @returns {T[]}
8
+ */
9
+ export function orderResolutionMembers<T extends {
10
+ view: {
11
+ getPathString(): string;
12
+ };
13
+ channel?: string;
14
+ }>(members: Set<T> | Iterable<T>): T[];
15
+ //# sourceMappingURL=resolutionMemberOrder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolutionMemberOrder.d.ts","sourceRoot":"","sources":["../../../src/scales/resolutionMemberOrder.js"],"names":[],"mappings":"AASA;;;;;;;GAOG;AACH,uCAJuE,CAAC,SAA3D;IAAG,IAAI,EAAE;QAAE,aAAa,IAAI,MAAM,CAAA;KAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAG,WAC3D,GAAG,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,GAClB,CAAC,EAAE,CAMf"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * @param {{ view: { getPathString(): string }, channel?: string }} member
3
+ */
4
+ function memberKey(member) {
5
+ const path = member.view.getPathString();
6
+ const channel = member.channel ?? "";
7
+ return path + "|" + channel;
8
+ }
9
+
10
+ /**
11
+ * Stable ordering for resolution members so merge behavior does not depend on
12
+ * registration order.
13
+ *
14
+ * @template {{ view: { getPathString(): string }, channel?: string }} T
15
+ * @param {Set<T> | Iterable<T>} members
16
+ * @returns {T[]}
17
+ */
18
+ export function orderResolutionMembers(members) {
19
+ return Array.from(members).sort((a, b) =>
20
+ memberKey(a).localeCompare(memberKey(b))
21
+ );
22
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AAEH;IAsBI;;;;;;;;OAQG;IACH,wHAPG;QAAsC,QAAQ,EAAtC,MAAM,cAAc;QACkC,WAAW,EAAjE,MAAM,OAAO,sBAAsB,EAAE,OAAO;QACpB,wBAAwB,EAAhD,MAAM,MAAM,EAAE;QACU,cAAc,EAAtC,MAAM,MAAM,EAAE;QAC8C,mBAAmB,EAA/E,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;QAC1B,eAAe,EAAvC,MAAM,MAAM,EAAE;KACxB,EAeA;IAED,0BAUC;IAED,sBAEC;IAED,8BAGC;IAED;;;;OAIG;IACH,sCAJW,MAAM,EAAE,aACR,MAAM,EAAE,GACN,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAarD;IAED;;;;OAIG;IACH,oBAQC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CA2BnB;IAED;;;;;;OAMG;IACH,eAJW,aAAa,GAAG,aAAa,aAC7B,OAAO,GAAG,MAAM,iBA+D1B;IASD;;;;OAIG;IACH,qBAcC;IAED;;OAEG;IACH,uBAOC;;CACJ;4BA5PY,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;4BACvC,OAAO,kBAAkB,EAAE,aAAa;yBACxC,OAAO,kBAAkB,EAAE,UAAU;wBACrC,OAAO,qBAAqB,EAAE,SAAS;6BACvC,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAA;CAAE"}
1
+ {"version":3,"file":"scaleInteractionController.d.ts","sourceRoot":"","sources":["../../../src/scales/scaleInteractionController.js"],"names":[],"mappings":"AAuBA;;;;;;;GAOG;AAEH;IAsBI;;;;;;;;OAQG;IACH,wHAPG;QAAsC,QAAQ,EAAtC,MAAM,cAAc;QACkC,WAAW,EAAjE,MAAM,OAAO,sBAAsB,EAAE,OAAO;QACpB,wBAAwB,EAAhD,MAAM,MAAM,EAAE;QACU,cAAc,EAAtC,MAAM,MAAM,EAAE;QAC8C,mBAAmB,EAA/E,CAAC,MAAM,EAAE,YAAY,GAAG,aAAa,KAAK,MAAM,EAAE;QAC1B,eAAe,EAAvC,MAAM,MAAM,EAAE;KACxB,EAeA;IAED,0BAUC;IAED,sBAEC;IAED,8BAGC;IAED;;;;OAIG;IACH,sCAJW,MAAM,EAAE,aACR,MAAM,EAAE,GACN,SAAS,GAAG,SAAS,GAAG,QAAQ,GAAG,MAAM,CAarD;IAED;;;;OAIG;IACH,oBAQC;IAED;;;;;;;OAOG;IACH,kBALW,MAAM,eACN,MAAM,OACN,MAAM,GACJ,OAAO,CA2BnB;IAED;;;;;;OAMG;IACH,eAJW,aAAa,GAAG,aAAa,aAC7B,OAAO,GAAG,MAAM,iBAkE1B;IASD;;;;OAIG;IACH,qBAcC;IAED;;OAEG;IACH,uBAOC;;CACJ;4BA/PY,OAAO,kBAAkB,EAAE,aAAa;2BACxC,OAAO,kBAAkB,EAAE,YAAY;4BACvC,OAAO,kBAAkB,EAAE,aAAa;yBACxC,OAAO,kBAAkB,EAAE,UAAU;wBACrC,OAAO,qBAAqB,EAAE,SAAS;6BACvC,SAAS,GAAG;IAAE,KAAK,EAAE,OAAO,kBAAkB,EAAE,KAAK,CAAA;CAAE"}