@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.
- package/dist/bundle/AbortablePromiseCache-3gHJdF3E.js +96 -0
- package/dist/bundle/browser-BTgw5ieH.js +126 -0
- package/dist/bundle/chunk-DmhlhrBa.js +11 -0
- package/dist/bundle/esm-BDFRLEuD.js +1248 -0
- package/dist/bundle/esm-BygJiwh0.js +573 -0
- package/dist/bundle/esm-CGX-qz1d.js +155 -0
- package/dist/bundle/esm-CgfVIRJ-.js +121 -0
- package/dist/bundle/esm-CuMSzCHy.js +298 -0
- package/dist/bundle/esm-DMXpJXM4.js +369 -0
- package/dist/bundle/esm-DQiq2Zhd.js +1426 -0
- package/dist/bundle/esm-DtE8VqAv.js +1015 -0
- package/dist/bundle/esm-sIoQYZ21.js +461 -0
- package/dist/bundle/index.es.js +21071 -25935
- package/dist/bundle/index.js +363 -379
- package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
- package/dist/schema.json +13098 -7095
- package/dist/src/config/axisConfig.d.ts +16 -0
- package/dist/src/config/axisConfig.d.ts.map +1 -0
- package/dist/src/config/axisConfig.js +84 -0
- package/dist/src/config/defaultConfig.d.ts +3 -0
- package/dist/src/config/defaultConfig.d.ts.map +1 -0
- package/dist/src/config/defaultConfig.js +38 -0
- package/dist/src/config/defaults/axisDefaults.d.ts +5 -0
- package/dist/src/config/defaults/axisDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/axisDefaults.js +72 -0
- package/dist/src/config/defaults/markDefaults.d.ts +15 -0
- package/dist/src/config/defaults/markDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/markDefaults.js +121 -0
- package/dist/src/config/defaults/scaleDefaults.d.ts +5 -0
- package/dist/src/config/defaults/scaleDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/scaleDefaults.js +18 -0
- package/dist/src/config/defaults/titleDefaults.d.ts +5 -0
- package/dist/src/config/defaults/titleDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/titleDefaults.js +47 -0
- package/dist/src/config/defaults/viewDefaults.d.ts +3 -0
- package/dist/src/config/defaults/viewDefaults.d.ts.map +1 -0
- package/dist/src/config/defaults/viewDefaults.js +2 -0
- package/dist/src/config/markConfig.d.ts +8 -0
- package/dist/src/config/markConfig.d.ts.map +1 -0
- package/dist/src/config/markConfig.js +27 -0
- package/dist/src/config/mergeConfig.d.ts +8 -0
- package/dist/src/config/mergeConfig.d.ts.map +1 -0
- package/dist/src/config/mergeConfig.js +81 -0
- package/dist/src/config/resolveConfig.d.ts +22 -0
- package/dist/src/config/resolveConfig.d.ts.map +1 -0
- package/dist/src/config/resolveConfig.js +32 -0
- package/dist/src/config/scaleConfig.d.ts +40 -0
- package/dist/src/config/scaleConfig.d.ts.map +1 -0
- package/dist/src/config/scaleConfig.js +220 -0
- package/dist/src/config/styleUtils.d.ts +6 -0
- package/dist/src/config/styleUtils.d.ts.map +1 -0
- package/dist/src/config/styleUtils.js +10 -0
- package/dist/src/config/themes.d.ts +15 -0
- package/dist/src/config/themes.d.ts.map +1 -0
- package/dist/src/config/themes.js +293 -0
- package/dist/src/config/titleConfig.d.ts +12 -0
- package/dist/src/config/titleConfig.d.ts.map +1 -0
- package/dist/src/config/titleConfig.js +42 -0
- package/dist/src/config/viewConfig.d.ts +7 -0
- package/dist/src/config/viewConfig.d.ts.map +1 -0
- package/dist/src/config/viewConfig.js +29 -0
- package/dist/src/data/flowNode.d.ts +22 -1
- package/dist/src/data/flowNode.d.ts.map +1 -1
- package/dist/src/data/flowNode.js +37 -1
- package/dist/src/data/formats/bed.d.ts.map +1 -1
- package/dist/src/data/formats/bed.js +6 -1
- package/dist/src/data/formats/bedpe.d.ts.map +1 -1
- package/dist/src/data/formats/bedpe.js +4 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -1
- package/dist/src/data/formats/fasta.js +4 -0
- package/dist/src/data/formats/parquet.d.ts.map +1 -1
- package/dist/src/data/formats/parquet.js +4 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +2 -13
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
- package/dist/src/data/sources/dataSourceFactory.js +5 -141
- package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/axisGenomeSource.js +11 -0
- package/dist/src/data/sources/lazy/axisTickSource.d.ts +1 -1
- package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/axisTickSource.js +19 -8
- package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bamSource.js +11 -0
- package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +12 -1
- package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +11 -0
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +12 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +11 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts +27 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/lazyDataSourceRegistry.js +65 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts +2 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.d.ts.map +1 -0
- package/dist/src/data/sources/lazy/registerBuiltInLazySources.js +8 -0
- package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/singleAxisLazySource.js +11 -2
- package/dist/src/data/sources/lazy/vcfSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/vcfSource.js +11 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +5 -2
- package/dist/src/data/transforms/aggregate.d.ts +1 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
- package/dist/src/data/transforms/aggregate.js +30 -8
- package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -1
- package/dist/src/data/transforms/aggregateOps.js +12 -1
- package/dist/src/data/transforms/coverage.js +2 -2
- package/dist/src/data/transforms/filter.js +1 -1
- package/dist/src/data/transforms/filterScoredLabels.d.ts +6 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
- package/dist/src/data/transforms/filterScoredLabels.js +9 -0
- package/dist/src/data/transforms/measureText.d.ts +1 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -1
- package/dist/src/data/transforms/measureText.js +14 -5
- package/dist/src/data/transforms/pileup.d.ts.map +1 -1
- package/dist/src/data/transforms/pileup.js +1 -2
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
- package/dist/src/data/transforms/regexFold.js +0 -1
- package/dist/src/embedFactory.d.ts +13 -0
- package/dist/src/embedFactory.d.ts.map +1 -0
- package/dist/src/embedFactory.js +127 -0
- package/dist/src/encoder/accessor.d.ts +3 -12
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +10 -65
- package/dist/src/encoder/encoder.d.ts +51 -8
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +179 -55
- package/dist/src/fonts/bmFontManager.js +1 -1
- package/dist/src/full.d.ts +2 -0
- package/dist/src/full.d.ts.map +1 -0
- package/dist/src/full.js +2 -0
- package/dist/src/genome/genome.d.ts +8 -0
- package/dist/src/genome/genome.d.ts.map +1 -1
- package/dist/src/genome/genome.js +16 -2
- package/dist/src/genome/genomeStore.js +1 -1
- package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -1
- package/dist/src/genome/rootGenomeConfig.js +6 -2
- package/dist/src/genome/scaleLocus.d.ts.map +1 -1
- package/dist/src/genome/scaleLocus.js +26 -7
- package/dist/src/genomeSpy/cursorManager.d.ts +69 -0
- package/dist/src/genomeSpy/cursorManager.d.ts.map +1 -0
- package/dist/src/genomeSpy/cursorManager.js +131 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts +113 -0
- package/dist/src/genomeSpy/headlessBootstrap.d.ts.map +1 -0
- package/dist/src/genomeSpy/headlessBootstrap.js +246 -0
- package/dist/src/genomeSpy/interactionController.d.ts +5 -0
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
- package/dist/src/genomeSpy/interactionController.js +212 -19
- package/dist/src/genomeSpy/interactionDispatcher.d.ts +50 -0
- package/dist/src/genomeSpy/interactionDispatcher.d.ts.map +1 -0
- package/dist/src/genomeSpy/interactionDispatcher.js +203 -0
- package/dist/src/genomeSpy/viewContextFactory.d.ts +4 -2
- package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewContextFactory.js +12 -4
- package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -1
- package/dist/src/genomeSpy/viewDataInit.js +7 -3
- package/dist/src/genomeSpy.d.ts +1 -124
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +7 -688
- package/dist/src/genomeSpyBase.d.ts +133 -0
- package/dist/src/genomeSpyBase.d.ts.map +1 -0
- package/dist/src/genomeSpyBase.js +719 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
- package/dist/src/gl/arrayBuilder.js +0 -3
- package/dist/src/gl/colorUtils.d.ts.map +1 -1
- package/dist/src/gl/colorUtils.js +3 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +13 -8
- package/dist/src/gl/glslScaleGenerator.d.ts +2 -2
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +5 -7
- package/dist/src/index.d.ts +3 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -114
- package/dist/src/marks/__snapshots__/shaderSnapshot.test.js.snap +4462 -0
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +0 -23
- package/dist/src/marks/mark.d.ts +8 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +61 -20
- package/dist/src/marks/markUtils.d.ts +18 -1
- package/dist/src/marks/markUtils.d.ts.map +1 -1
- package/dist/src/marks/markUtils.js +52 -4
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +6 -26
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +13 -21
- package/dist/src/marks/rule.d.ts +7 -2
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +125 -16
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +5 -47
- package/dist/src/minimal.d.ts +8 -0
- package/dist/src/minimal.d.ts.map +1 -0
- package/dist/src/minimal.js +21 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts +19 -0
- package/dist/src/paramRuntime/viewParamRuntime.d.ts.map +1 -1
- package/dist/src/paramRuntime/viewParamRuntime.js +35 -0
- package/dist/src/scale/scale.d.ts.map +1 -1
- package/dist/src/scale/scale.js +13 -7
- package/dist/src/scales/axisResolution.d.ts.map +1 -1
- package/dist/src/scales/axisResolution.js +9 -5
- package/dist/src/scales/domainPlanner.d.ts +28 -8
- package/dist/src/scales/domainPlanner.d.ts.map +1 -1
- package/dist/src/scales/domainPlanner.js +207 -73
- package/dist/src/scales/indexLikeDomainUtils.d.ts +29 -0
- package/dist/src/scales/indexLikeDomainUtils.d.ts.map +1 -0
- package/dist/src/scales/indexLikeDomainUtils.js +67 -0
- package/dist/src/scales/resolutionMemberOrder.d.ts +15 -0
- package/dist/src/scales/resolutionMemberOrder.d.ts.map +1 -0
- package/dist/src/scales/resolutionMemberOrder.js +22 -0
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +43 -4
- package/dist/src/scales/scalePropsResolver.d.ts +3 -1
- package/dist/src/scales/scalePropsResolver.d.ts.map +1 -1
- package/dist/src/scales/scalePropsResolver.js +83 -6
- package/dist/src/scales/scaleResolution.d.ts +23 -0
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +220 -58
- package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -1
- package/dist/src/scales/scaleResolutionTestUtils.js +6 -2
- package/dist/src/scales/scaleRules.d.ts.map +1 -1
- package/dist/src/scales/scaleRules.js +16 -2
- package/dist/src/scales/selectionDomainUtils.d.ts +30 -0
- package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -1
- package/dist/src/scales/selectionDomainUtils.js +116 -1
- package/dist/src/screenshotHarness.js +3 -4
- package/dist/src/spec/axis.d.ts +41 -30
- package/dist/src/spec/channel.d.ts +15 -9
- package/dist/src/spec/config.d.ts +264 -0
- package/dist/src/spec/data.d.ts +7 -0
- package/dist/src/spec/decoration.d.ts +51 -0
- package/dist/src/spec/exampleFiles.d.ts +12 -0
- package/dist/src/spec/exampleFiles.d.ts.map +1 -0
- package/dist/src/spec/exampleFiles.js +52 -0
- package/dist/src/spec/font.d.ts +1 -1
- package/dist/src/spec/mark.d.ts +97 -13
- package/dist/src/spec/parameter.d.ts +30 -10
- package/dist/src/spec/root.d.ts +14 -0
- package/dist/src/spec/scale.d.ts +18 -13
- package/dist/src/spec/title.d.ts +13 -2
- package/dist/src/spec/tooltip.d.ts +1 -1
- package/dist/src/spec/transform.d.ts +39 -4
- package/dist/src/spec/view.d.ts +67 -19
- package/dist/src/styles/genome-spy.css +55 -55
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +23 -22
- package/dist/src/testSetup.d.ts +2 -0
- package/dist/src/testSetup.d.ts.map +1 -0
- package/dist/src/testSetup.js +5 -0
- package/dist/src/tooltip/dataTooltipHandler.js +8 -2
- package/dist/src/tooltip/tooltipContext.d.ts.map +1 -1
- package/dist/src/tooltip/tooltipContext.js +3 -2
- package/dist/src/types/embedApi.d.ts +7 -0
- package/dist/src/types/encoder.d.ts +17 -15
- package/dist/src/types/scaleResolutionApi.d.ts +20 -0
- package/dist/src/types/viewContext.d.ts +23 -1
- package/dist/src/utils/expression.d.ts +2 -2
- package/dist/src/utils/expression.d.ts.map +1 -1
- package/dist/src/utils/expression.js +63 -8
- package/dist/src/utils/field.d.ts.map +1 -1
- package/dist/src/utils/field.js +0 -1
- package/dist/src/utils/inertia.d.ts.map +1 -1
- package/dist/src/utils/inertia.js +0 -1
- package/dist/src/utils/inputBinding.d.ts +1 -1
- package/dist/src/utils/interaction.d.ts +109 -0
- package/dist/src/utils/interaction.d.ts.map +1 -0
- package/dist/src/utils/interaction.js +200 -0
- package/dist/src/utils/interactionEvent.d.ts +21 -42
- package/dist/src/utils/interactionEvent.d.ts.map +1 -1
- package/dist/src/utils/interactionEvent.js +43 -66
- package/dist/src/utils/kWayMerge.js +1 -1
- package/dist/src/utils/mergeObjects.d.ts.map +1 -1
- package/dist/src/utils/mergeObjects.js +0 -2
- package/dist/src/utils/radixSort.d.ts.map +1 -1
- package/dist/src/utils/radixSort.js +0 -2
- package/dist/src/utils/throttle.d.ts.map +1 -1
- package/dist/src/utils/throttle.js +0 -2
- package/dist/src/utils/ui/tooltip.d.ts +1 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
- package/dist/src/utils/ui/tooltip.js +1 -0
- package/dist/src/utils/url.js +1 -1
- package/dist/src/view/axisGridView.d.ts +1 -1
- package/dist/src/view/axisGridView.d.ts.map +1 -1
- package/dist/src/view/axisGridView.js +2 -47
- package/dist/src/view/axisView.d.ts +2 -3
- package/dist/src/view/axisView.d.ts.map +1 -1
- package/dist/src/view/axisView.js +251 -106
- package/dist/src/view/concatView.d.ts +2 -1
- package/dist/src/view/concatView.d.ts.map +1 -1
- package/dist/src/view/concatView.js +4 -2
- package/dist/src/view/containerMutationHelper.d.ts +3 -0
- package/dist/src/view/containerMutationHelper.d.ts.map +1 -1
- package/dist/src/view/containerMutationHelper.js +4 -1
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.js +3 -3
- package/dist/src/view/flowBuilder.js +2 -2
- package/dist/src/view/gridView/gridChild.d.ts +6 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +72 -43
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +255 -101
- package/dist/src/view/gridView/keyboardZoomController.d.ts +2 -2
- package/dist/src/view/gridView/keyboardZoomController.d.ts.map +1 -1
- package/dist/src/view/gridView/keyboardZoomController.js +1 -1
- package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
- package/dist/src/view/gridView/scrollbar.js +4 -2
- package/dist/src/view/gridView/selectionRect.d.ts +4 -0
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +20 -1
- package/dist/src/view/gridView/separatorView.d.ts +1 -0
- package/dist/src/view/gridView/separatorView.d.ts.map +1 -1
- package/dist/src/view/gridView/separatorView.js +9 -0
- package/dist/src/view/interactionRouting.d.ts +20 -0
- package/dist/src/view/interactionRouting.d.ts.map +1 -0
- package/dist/src/view/interactionRouting.js +53 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +12 -9
- package/dist/src/view/layout/grid.js +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -1
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +0 -2
- package/dist/src/view/testUtils.d.ts +17 -3
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +62 -69
- package/dist/src/view/title.d.ts +8 -1
- package/dist/src/view/title.d.ts.map +1 -1
- package/dist/src/view/title.js +66 -76
- package/dist/src/view/unitView.d.ts +1 -1
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +67 -17
- package/dist/src/view/view.d.ts +76 -30
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +136 -47
- package/dist/src/view/viewFactory.d.ts +11 -3
- package/dist/src/view/viewFactory.d.ts.map +1 -1
- package/dist/src/view/viewFactory.js +37 -11
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +41 -5
- package/dist/src/view/zoom.d.ts +2 -2
- package/dist/src/view/zoom.d.ts.map +1 -1
- package/dist/src/view/zoom.js +21 -23
- package/package.json +18 -10
- package/dist/bundle/AbortablePromiseCache-Dj0vzLnp.js +0 -149
- package/dist/bundle/browser-0iNU5Wit.js +0 -138
- package/dist/bundle/index-BYsZN7b0.js +0 -1597
- package/dist/bundle/index-C3kClAEN.js +0 -1771
- package/dist/bundle/index-C7wOh6y1.js +0 -657
- package/dist/bundle/index-CRaQAuki.js +0 -326
- package/dist/bundle/index-D9v1PCj9.js +0 -507
- package/dist/bundle/index-GDOuv_D5.js +0 -266
- package/dist/bundle/index-Gt44EOIH.js +0 -628
- package/dist/bundle/inflate-GtwLkvSP.js +0 -1048
- package/dist/bundle/parquetRead-BnAGCa4_.js +0 -1663
- package/dist/bundle/unzip-Bac01w6X.js +0 -1492
- package/dist/src/config/scaleDefaults.d.ts +0 -8
- package/dist/src/config/scaleDefaults.d.ts.map +0 -1
- 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 {
|
|
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
|
-
*
|
|
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
|
-
|
|
83
|
-
|
|
100
|
+
/**
|
|
101
|
+
* @param {{ includeSelectionInitial?: boolean }} [options]
|
|
102
|
+
*/
|
|
103
|
+
hasConfiguredDomain(options = {}) {
|
|
104
|
+
return !!this.getConfiguredDomain(options);
|
|
84
105
|
}
|
|
85
106
|
|
|
86
107
|
hasSelectionConfiguredDomain() {
|
|
87
|
-
this.
|
|
108
|
+
this.getSelectionConfiguredDomainBindingInfo();
|
|
88
109
|
return !!this.#selectionDomainLinkInfo;
|
|
89
110
|
}
|
|
90
111
|
|
|
91
112
|
/**
|
|
92
113
|
* @returns {SelectionDomainLinkInfo | undefined}
|
|
93
114
|
*/
|
|
94
|
-
|
|
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(
|
|
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
|
-
|
|
141
|
-
|
|
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
|
|
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(
|
|
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 {
|
|
239
|
-
let
|
|
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 (
|
|
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
|
-
|
|
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
|
-
|
|
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 (
|
|
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
|
-
|
|
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 (
|
|
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
|
-
*
|
|
401
|
+
* hasInitial: boolean,
|
|
402
|
+
* runtime: any,
|
|
342
403
|
* }}
|
|
343
404
|
*/
|
|
344
|
-
function resolveSelectionDomain(
|
|
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
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
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:
|
|
373
|
-
key,
|
|
438
|
+
domain: initialDomain,
|
|
374
439
|
description,
|
|
375
440
|
param: paramName,
|
|
376
441
|
encoding: resolvedChannel,
|
|
377
|
-
|
|
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
|
-
|
|
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":"
|
|
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"}
|