@genome-spy/core 0.72.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/LICENSE +1 -1
- 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 +21078 -24556
- package/dist/bundle/index.js +379 -383
- package/dist/bundle/parquetRead-DG_-F5j5.js +1609 -0
- package/dist/schema.json +13349 -7082
- 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 +8 -0
- package/dist/src/data/formats/bed.d.ts.map +1 -0
- package/dist/src/data/formats/bed.js +58 -0
- package/dist/src/data/formats/bedpe.d.ts +8 -0
- package/dist/src/data/formats/bedpe.d.ts.map +1 -0
- package/dist/src/data/formats/bedpe.js +164 -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/dataUtils.d.ts +16 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
- package/dist/src/data/sources/dataUtils.js +53 -3
- 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 +4 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -1
- package/dist/src/data/sources/urlSource.js +138 -16
- 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/assemblyPreflight.d.ts +31 -0
- package/dist/src/genome/assemblyPreflight.d.ts.map +1 -0
- package/dist/src/genome/assemblyPreflight.js +99 -0
- package/dist/src/genome/genome.d.ts +10 -2
- package/dist/src/genome/genome.d.ts.map +1 -1
- package/dist/src/genome/genome.js +20 -2
- package/dist/src/genome/genomeStore.d.ts +34 -3
- package/dist/src/genome/genomeStore.d.ts.map +1 -1
- package/dist/src/genome/genomeStore.js +409 -18
- package/dist/src/genome/rootGenomeConfig.d.ts +26 -0
- package/dist/src/genome/rootGenomeConfig.d.ts.map +1 -0
- package/dist/src/genome/rootGenomeConfig.js +98 -0
- 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 +10 -1
- package/dist/src/genomeSpy/interactionController.d.ts.map +1 -1
- package/dist/src/genomeSpy/interactionController.js +448 -40
- 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/renderCoordinator.js +1 -1
- 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 -114
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +7 -614
- 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/canvasSizeHelper.d.ts +74 -0
- package/dist/src/gl/canvasSizeHelper.d.ts.map +1 -0
- package/dist/src/gl/canvasSizeHelper.js +203 -0
- 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/gl/webGLHelper.d.ts +25 -11
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +59 -33
- package/dist/src/index.d.ts +3 -9
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -111
- 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 +5 -26
- 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 +67 -21
- 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 +58 -7
- package/dist/src/scales/domainPlanner.d.ts.map +1 -1
- package/dist/src/scales/domainPlanner.js +395 -40
- 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/scaleInstanceManager.d.ts +2 -1
- package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -1
- package/dist/src/scales/scaleInstanceManager.js +10 -11
- package/dist/src/scales/scaleInteractionController.d.ts.map +1 -1
- package/dist/src/scales/scaleInteractionController.js +59 -18
- 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 +39 -0
- package/dist/src/scales/scaleResolution.d.ts.map +1 -1
- package/dist/src/scales/scaleResolution.js +504 -82
- package/dist/src/scales/scaleResolutionTestUtils.d.ts +21 -0
- package/dist/src/scales/scaleResolutionTestUtils.d.ts.map +1 -0
- package/dist/src/scales/scaleResolutionTestUtils.js +37 -0
- 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 +52 -0
- package/dist/src/scales/selectionDomainUtils.d.ts.map +1 -0
- package/dist/src/scales/selectionDomainUtils.js +194 -0
- package/dist/src/scales/zoomDomainUtils.d.ts +18 -0
- package/dist/src/scales/zoomDomainUtils.d.ts.map +1 -0
- package/dist/src/scales/zoomDomainUtils.js +69 -0
- package/dist/src/screenshotHarness.d.ts +16 -0
- package/dist/src/screenshotHarness.d.ts.map +1 -0
- package/dist/src/screenshotHarness.js +241 -0
- package/dist/src/singlePageApp.js +1 -1
- 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 +30 -3
- 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/genome.d.ts +22 -2
- package/dist/src/spec/mark.d.ts +97 -13
- package/dist/src/spec/parameter.d.ts +62 -5
- package/dist/src/spec/root.d.ts +34 -1
- package/dist/src/spec/scale.d.ts +46 -5
- 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 +63 -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 +31 -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 +66 -11
- 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 +26 -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/inferSpecBaseUrl.d.ts +14 -0
- package/dist/src/utils/inferSpecBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/inferSpecBaseUrl.js +73 -0
- 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 +62 -33
- package/dist/src/utils/interactionEvent.d.ts.map +1 -1
- package/dist/src/utils/interactionEvent.js +86 -48
- 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 +12 -1
- package/dist/src/view/dataReadiness.d.ts +2 -2
- package/dist/src/view/dataReadiness.d.ts.map +1 -1
- package/dist/src/view/dataReadiness.js +63 -58
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.js +4 -4
- package/dist/src/view/flowBuilder.js +2 -2
- package/dist/src/view/gridView/gridChild.d.ts +13 -0
- package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
- package/dist/src/view/gridView/gridChild.js +247 -49
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +296 -99
- 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 +15 -3
- package/dist/src/view/zoom.d.ts.map +1 -1
- package/dist/src/view/zoom.js +375 -80
- package/package.json +20 -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,28 +1,51 @@
|
|
|
1
1
|
import { span } from "vega-util";
|
|
2
2
|
import { isContinuous } from "vega-scale";
|
|
3
3
|
|
|
4
|
-
import { LOCUS } from "./scaleResolutionConstants.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";
|
|
5
13
|
import createDomain from "../utils/domainArray.js";
|
|
6
14
|
import { getAccessorDomainKey, isScaleAccessor } from "../encoder/accessor.js";
|
|
15
|
+
import { getEncoderAccessors, getPrimaryChannel } from "../encoder/encoder.js";
|
|
16
|
+
import {
|
|
17
|
+
hasExplicitLocusUpperBound,
|
|
18
|
+
isChromosomalLocusInterval,
|
|
19
|
+
} from "../genome/genome.js";
|
|
7
20
|
|
|
8
21
|
/**
|
|
9
22
|
* @typedef {import("../utils/domainArray.js").DomainArray} DomainArray
|
|
10
23
|
* @typedef {import("../spec/scale.js").ComplexDomain} ComplexDomain
|
|
11
24
|
* @typedef {import("../spec/scale.js").ScalarDomain} ScalarDomain
|
|
25
|
+
* @typedef {import("../spec/scale.js").SelectionDomainRef} SelectionDomainRef
|
|
12
26
|
* @typedef {import("./scaleResolution.js").ScaleResolutionMember} ScaleResolutionMember
|
|
27
|
+
* @typedef {{
|
|
28
|
+
* param: string,
|
|
29
|
+
* encoding: "x" | "y",
|
|
30
|
+
* hasInitial: boolean,
|
|
31
|
+
* runtime: any,
|
|
32
|
+
* }} SelectionDomainLinkInfo
|
|
13
33
|
*/
|
|
14
34
|
|
|
15
35
|
export default class DomainPlanner {
|
|
16
36
|
/** @type {() => Set<ScaleResolutionMember>} */
|
|
17
37
|
#getMembers;
|
|
18
38
|
|
|
39
|
+
/** @type {() => Set<ScaleResolutionMember>} */
|
|
40
|
+
#getAllMembers;
|
|
41
|
+
|
|
19
42
|
/** @type {() => Set<ScaleResolutionMember>} */
|
|
20
43
|
#getDataMembers;
|
|
21
44
|
|
|
22
45
|
/** @type {() => import("../spec/channel.js").Type} */
|
|
23
46
|
#getType;
|
|
24
47
|
|
|
25
|
-
/** @type {() => number[]} */
|
|
48
|
+
/** @type {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} */
|
|
26
49
|
#getLocusExtent;
|
|
27
50
|
|
|
28
51
|
/** @type {(interval: ScalarDomain | ComplexDomain) => number[]} */
|
|
@@ -31,30 +54,36 @@ export default class DomainPlanner {
|
|
|
31
54
|
/** @type {any[]} */
|
|
32
55
|
#initialDomain;
|
|
33
56
|
|
|
34
|
-
/** @type {
|
|
35
|
-
#
|
|
57
|
+
/** @type {SelectionDomainLinkInfo | undefined} */
|
|
58
|
+
#selectionDomainLinkInfo = undefined;
|
|
36
59
|
|
|
37
60
|
#configuredDomainDirty = true;
|
|
38
61
|
|
|
62
|
+
/** @type {Map<boolean, DomainArray | undefined>} */
|
|
63
|
+
#configuredDomainsByInitialMode = new Map();
|
|
64
|
+
|
|
39
65
|
/** @type {WeakMap<ScaleResolutionMember, import("../types/encoder.js").ScaleAccessor[]>} */
|
|
40
66
|
#accessorsByMember = new WeakMap();
|
|
41
67
|
|
|
42
68
|
/**
|
|
43
69
|
* @param {object} options
|
|
44
70
|
* @param {() => Set<ScaleResolutionMember>} options.getMembers
|
|
71
|
+
* @param {() => Set<ScaleResolutionMember>} [options.getAllMembers]
|
|
45
72
|
* @param {() => Set<ScaleResolutionMember>} [options.getDataMembers]
|
|
46
73
|
* @param {() => import("../spec/channel.js").Type} options.getType
|
|
47
|
-
* @param {() => number[]} options.getLocusExtent
|
|
74
|
+
* @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} options.getLocusExtent
|
|
48
75
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} options.fromComplexInterval
|
|
49
76
|
*/
|
|
50
77
|
constructor({
|
|
51
78
|
getMembers,
|
|
79
|
+
getAllMembers,
|
|
52
80
|
getDataMembers,
|
|
53
81
|
getType,
|
|
54
82
|
getLocusExtent,
|
|
55
83
|
fromComplexInterval,
|
|
56
84
|
}) {
|
|
57
85
|
this.#getMembers = getMembers;
|
|
86
|
+
this.#getAllMembers = getAllMembers ?? getMembers;
|
|
58
87
|
this.#getDataMembers = getDataMembers ?? getMembers;
|
|
59
88
|
this.#getType = getType;
|
|
60
89
|
this.#getLocusExtent = getLocusExtent;
|
|
@@ -68,49 +97,118 @@ export default class DomainPlanner {
|
|
|
68
97
|
return this.#initialDomain;
|
|
69
98
|
}
|
|
70
99
|
|
|
71
|
-
|
|
72
|
-
|
|
100
|
+
/**
|
|
101
|
+
* @param {{ includeSelectionInitial?: boolean }} [options]
|
|
102
|
+
*/
|
|
103
|
+
hasConfiguredDomain(options = {}) {
|
|
104
|
+
return !!this.getConfiguredDomain(options);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
hasSelectionConfiguredDomain() {
|
|
108
|
+
this.getSelectionConfiguredDomainBindingInfo();
|
|
109
|
+
return !!this.#selectionDomainLinkInfo;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* @returns {SelectionDomainLinkInfo | undefined}
|
|
114
|
+
*/
|
|
115
|
+
getSelectionConfiguredDomainBindingInfo() {
|
|
116
|
+
if (this.#selectionDomainLinkInfo || !this.#configuredDomainDirty) {
|
|
117
|
+
return this.#selectionDomainLinkInfo;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
this.getConfiguredDomain();
|
|
121
|
+
return this.#selectionDomainLinkInfo;
|
|
122
|
+
}
|
|
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
|
+
};
|
|
73
134
|
}
|
|
74
135
|
|
|
75
136
|
invalidateConfiguredDomain() {
|
|
76
137
|
this.#configuredDomainDirty = true;
|
|
138
|
+
this.#selectionDomainLinkInfo = undefined;
|
|
139
|
+
this.#configuredDomainsByInitialMode.clear();
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* Returns the default domain without considering configured domains.
|
|
144
|
+
*
|
|
145
|
+
* @param {boolean} [extractDataDomain]
|
|
146
|
+
* @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
|
|
147
|
+
* @returns {any[]}
|
|
148
|
+
*/
|
|
149
|
+
getDefaultDomain(extractDataDomain = false, locusAssembly) {
|
|
150
|
+
return resolveDefaultDomain(
|
|
151
|
+
this.#getType(),
|
|
152
|
+
this.#getLocusExtent,
|
|
153
|
+
extractDataDomain ? this.getDataDomain() : undefined,
|
|
154
|
+
locusAssembly
|
|
155
|
+
);
|
|
77
156
|
}
|
|
78
157
|
|
|
79
158
|
/**
|
|
80
159
|
* Returns the configured domain or a data-derived/default domain.
|
|
81
160
|
*
|
|
82
161
|
* @param {boolean} [extractDataDomain]
|
|
162
|
+
* @param {import("../spec/scale.js").Scale["assembly"]} [locusAssembly]
|
|
163
|
+
* @param {{ includeSelectionInitial?: boolean }} [options]
|
|
83
164
|
* @returns {any[]}
|
|
84
165
|
*/
|
|
85
|
-
getConfiguredOrDefaultDomain(
|
|
166
|
+
getConfiguredOrDefaultDomain(
|
|
167
|
+
extractDataDomain = false,
|
|
168
|
+
locusAssembly,
|
|
169
|
+
options = {}
|
|
170
|
+
) {
|
|
86
171
|
// TODO: intersect the domain with zoom extent (if it's defined)
|
|
87
172
|
return (
|
|
88
|
-
this.getConfiguredDomain() ??
|
|
89
|
-
|
|
90
|
-
this.#getType(),
|
|
91
|
-
this.#getLocusExtent,
|
|
92
|
-
extractDataDomain ? this.getDataDomain() : undefined
|
|
93
|
-
)
|
|
173
|
+
this.getConfiguredDomain(options) ??
|
|
174
|
+
this.getDefaultDomain(extractDataDomain, locusAssembly)
|
|
94
175
|
);
|
|
95
176
|
}
|
|
96
177
|
|
|
97
178
|
/**
|
|
98
179
|
* Unions the configured domains of all participating views.
|
|
99
180
|
*
|
|
181
|
+
* @param {{ includeSelectionInitial?: boolean }} [options]
|
|
100
182
|
* @return {DomainArray}
|
|
101
183
|
*/
|
|
102
|
-
getConfiguredDomain() {
|
|
103
|
-
|
|
104
|
-
|
|
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
|
+
);
|
|
105
194
|
}
|
|
106
195
|
|
|
107
|
-
const
|
|
196
|
+
const configuredDomain = resolveConfiguredDomain(
|
|
108
197
|
this.#getMembers(),
|
|
109
|
-
this.#fromComplexInterval
|
|
198
|
+
this.#fromComplexInterval,
|
|
199
|
+
includeSelectionInitial
|
|
200
|
+
);
|
|
201
|
+
validateSharedSelectionDomain(
|
|
202
|
+
this.#getAllMembers(),
|
|
203
|
+
configuredDomain.selectionRef
|
|
204
|
+
);
|
|
205
|
+
this.#selectionDomainLinkInfo = configuredDomain.selectionRef;
|
|
206
|
+
this.#configuredDomainsByInitialMode.set(
|
|
207
|
+
includeSelectionInitial,
|
|
208
|
+
configuredDomain.domain
|
|
110
209
|
);
|
|
111
|
-
this.#configuredDomain = domain;
|
|
112
210
|
this.#configuredDomainDirty = false;
|
|
113
|
-
return domain;
|
|
211
|
+
return configuredDomain.domain;
|
|
114
212
|
}
|
|
115
213
|
|
|
116
214
|
/**
|
|
@@ -129,18 +227,19 @@ export default class DomainPlanner {
|
|
|
129
227
|
/**
|
|
130
228
|
* @param {import("../types/encoder.js").VegaScale} scale
|
|
131
229
|
* @param {boolean} domainWasInitialized
|
|
230
|
+
* @param {any[]} [snapshotDomain]
|
|
132
231
|
* @returns {boolean} true if listeners should be notified immediately
|
|
133
232
|
*/
|
|
134
|
-
captureInitialDomain(scale, domainWasInitialized) {
|
|
233
|
+
captureInitialDomain(scale, domainWasInitialized, snapshotDomain) {
|
|
135
234
|
if (!this.#initialDomain && isContinuous(scale.type)) {
|
|
136
|
-
const domain = scale.domain();
|
|
235
|
+
const domain = snapshotDomain ?? scale.domain();
|
|
137
236
|
if (span(domain) > 0) {
|
|
138
237
|
this.#initialDomain = domain;
|
|
139
238
|
}
|
|
140
239
|
}
|
|
141
240
|
|
|
142
241
|
if (!domainWasInitialized) {
|
|
143
|
-
this.#initialDomain = scale.domain();
|
|
242
|
+
this.#initialDomain = snapshotDomain ?? scale.domain();
|
|
144
243
|
return true;
|
|
145
244
|
}
|
|
146
245
|
|
|
@@ -167,7 +266,7 @@ export default class DomainPlanner {
|
|
|
167
266
|
return [];
|
|
168
267
|
}
|
|
169
268
|
|
|
170
|
-
const accessors = encoder
|
|
269
|
+
const accessors = getEncoderAccessors(encoder);
|
|
171
270
|
if (accessors.length === 0) {
|
|
172
271
|
return [];
|
|
173
272
|
}
|
|
@@ -184,25 +283,277 @@ export default class DomainPlanner {
|
|
|
184
283
|
/**
|
|
185
284
|
* @param {Set<ScaleResolutionMember>} members
|
|
186
285
|
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
|
|
187
|
-
* @
|
|
286
|
+
* @param {boolean} includeSelectionInitial
|
|
287
|
+
* @returns {{
|
|
288
|
+
* domain: DomainArray | undefined,
|
|
289
|
+
* selectionRef: SelectionDomainLinkInfo | undefined,
|
|
290
|
+
* }}
|
|
188
291
|
*/
|
|
189
|
-
function resolveConfiguredDomain(
|
|
190
|
-
|
|
292
|
+
function resolveConfiguredDomain(
|
|
293
|
+
members,
|
|
294
|
+
fromComplexInterval,
|
|
295
|
+
includeSelectionInitial
|
|
296
|
+
) {
|
|
297
|
+
const domainMembers = Array.from(members)
|
|
191
298
|
.filter((member) => member.contributesToDomain)
|
|
192
|
-
.
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
299
|
+
.filter((member) => member.channelDef.scale?.domain);
|
|
300
|
+
|
|
301
|
+
/** @type {DomainArray[]} */
|
|
302
|
+
const domains = [];
|
|
303
|
+
|
|
304
|
+
/** @type {any} */
|
|
305
|
+
let selectionRefRuntime = undefined;
|
|
306
|
+
/** @type {string | undefined} */
|
|
307
|
+
let selectionRefDescription = undefined;
|
|
308
|
+
/** @type {SelectionDomainLinkInfo | undefined} */
|
|
309
|
+
let selectionRef = undefined;
|
|
310
|
+
let hasLiteralDomain = false;
|
|
311
|
+
|
|
312
|
+
for (const member of domainMembers) {
|
|
313
|
+
const domainDef = member.channelDef.scale.domain;
|
|
314
|
+
if (isSelectionDomainRef(domainDef)) {
|
|
315
|
+
if (hasLiteralDomain) {
|
|
316
|
+
throw new Error(
|
|
317
|
+
"Cannot mix selection-driven and literal configured domains on a shared scale."
|
|
318
|
+
);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
const resolved = resolveSelectionDomain(
|
|
322
|
+
member,
|
|
323
|
+
domainDef,
|
|
324
|
+
fromComplexInterval,
|
|
325
|
+
includeSelectionInitial
|
|
326
|
+
);
|
|
327
|
+
|
|
328
|
+
if (
|
|
329
|
+
selectionRef &&
|
|
330
|
+
(selectionRef.runtime !== resolved.runtime ||
|
|
331
|
+
selectionRef.param !== resolved.param ||
|
|
332
|
+
selectionRef.encoding !== resolved.encoding)
|
|
333
|
+
) {
|
|
334
|
+
throw new Error(
|
|
335
|
+
"Conflicting selection domain references on a shared scale: " +
|
|
336
|
+
selectionRefDescription +
|
|
337
|
+
" vs " +
|
|
338
|
+
resolved.description +
|
|
339
|
+
"."
|
|
340
|
+
);
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
selectionRefRuntime = resolved.runtime;
|
|
344
|
+
selectionRefDescription = resolved.description;
|
|
345
|
+
selectionRef = {
|
|
346
|
+
param: resolved.param,
|
|
347
|
+
encoding: resolved.encoding,
|
|
348
|
+
hasInitial:
|
|
349
|
+
(selectionRef?.hasInitial ?? false) || resolved.hasInitial,
|
|
350
|
+
runtime: resolved.runtime,
|
|
351
|
+
};
|
|
352
|
+
|
|
353
|
+
if (resolved.domain) {
|
|
354
|
+
domains.push(resolved.domain);
|
|
355
|
+
}
|
|
356
|
+
continue;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (selectionRefRuntime) {
|
|
360
|
+
throw new Error(
|
|
361
|
+
"Cannot mix literal configured domains with selection-driven domains on a shared scale."
|
|
362
|
+
);
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
hasLiteralDomain = true;
|
|
366
|
+
domains.push(
|
|
367
|
+
resolveConfiguredIntervalDomain(
|
|
368
|
+
member.channelDef.type,
|
|
369
|
+
domainDef,
|
|
370
|
+
fromComplexInterval
|
|
200
371
|
)
|
|
201
372
|
);
|
|
373
|
+
}
|
|
202
374
|
|
|
203
375
|
if (domains.length > 0) {
|
|
204
|
-
return
|
|
376
|
+
return {
|
|
377
|
+
domain: domains.reduce((acc, curr) => acc.extendAll(curr)),
|
|
378
|
+
selectionRef,
|
|
379
|
+
};
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (selectionRefRuntime) {
|
|
383
|
+
// Selection refs are still the source of truth even when the
|
|
384
|
+
// selection interval currently resolves to no domain.
|
|
385
|
+
return { domain: undefined, selectionRef };
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
return { domain: undefined, selectionRef: undefined };
|
|
389
|
+
}
|
|
390
|
+
|
|
391
|
+
/**
|
|
392
|
+
* @param {ScaleResolutionMember} member
|
|
393
|
+
* @param {SelectionDomainRef} domainRef
|
|
394
|
+
* @param {(interval: ScalarDomain | ComplexDomain) => number[]} fromComplexInterval
|
|
395
|
+
* @param {boolean} includeSelectionInitial
|
|
396
|
+
* @returns {{
|
|
397
|
+
* domain: DomainArray | undefined,
|
|
398
|
+
* description: string,
|
|
399
|
+
* param: string,
|
|
400
|
+
* encoding: "x" | "y",
|
|
401
|
+
* hasInitial: boolean,
|
|
402
|
+
* runtime: any,
|
|
403
|
+
* }}
|
|
404
|
+
*/
|
|
405
|
+
function resolveSelectionDomain(
|
|
406
|
+
member,
|
|
407
|
+
domainRef,
|
|
408
|
+
fromComplexInterval,
|
|
409
|
+
includeSelectionInitial
|
|
410
|
+
) {
|
|
411
|
+
const paramName = domainRef.param;
|
|
412
|
+
|
|
413
|
+
const resolvedChannel = resolveSelectionDomainChannel(
|
|
414
|
+
member.channel,
|
|
415
|
+
domainRef,
|
|
416
|
+
paramName
|
|
417
|
+
);
|
|
418
|
+
|
|
419
|
+
const binding = resolveIntervalSelectionBinding(
|
|
420
|
+
member.view,
|
|
421
|
+
paramName,
|
|
422
|
+
resolvedChannel
|
|
423
|
+
);
|
|
424
|
+
const hasInitial = domainRef.initial !== undefined;
|
|
425
|
+
const interval = binding.selection.intervals[resolvedChannel];
|
|
426
|
+
const description = paramName + "." + resolvedChannel;
|
|
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;
|
|
437
|
+
return {
|
|
438
|
+
domain: initialDomain,
|
|
439
|
+
description,
|
|
440
|
+
param: paramName,
|
|
441
|
+
encoding: resolvedChannel,
|
|
442
|
+
hasInitial,
|
|
443
|
+
runtime: binding.runtime,
|
|
444
|
+
};
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
return {
|
|
448
|
+
// Selection intervals already use internal scale-domain coordinates.
|
|
449
|
+
domain: createDomain(
|
|
450
|
+
member.channelDef.type,
|
|
451
|
+
fromComplexInterval(interval)
|
|
452
|
+
),
|
|
453
|
+
description,
|
|
454
|
+
param: paramName,
|
|
455
|
+
encoding: resolvedChannel,
|
|
456
|
+
hasInitial,
|
|
457
|
+
runtime: binding.runtime,
|
|
458
|
+
};
|
|
459
|
+
}
|
|
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;
|
|
205
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
|
+
|
|
525
|
+
/**
|
|
526
|
+
* @param {import("../spec/channel.js").ChannelWithScale} channel
|
|
527
|
+
* @param {SelectionDomainRef} domainRef
|
|
528
|
+
* @param {string} paramName
|
|
529
|
+
* @returns {"x" | "y"}
|
|
530
|
+
*/
|
|
531
|
+
function resolveSelectionDomainChannel(channel, domainRef, paramName) {
|
|
532
|
+
if (domainRef.encoding) {
|
|
533
|
+
return domainRef.encoding;
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
const primaryChannel = getPrimaryChannel(channel);
|
|
537
|
+
if (primaryChannel === "x" || primaryChannel === "y") {
|
|
538
|
+
return primaryChannel;
|
|
539
|
+
}
|
|
540
|
+
|
|
541
|
+
throw new Error(
|
|
542
|
+
`Selection domain reference "${paramName}" on channel "${channel}" requires an explicit "encoding" ("x" or "y").`
|
|
543
|
+
);
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
/**
|
|
547
|
+
* @param {any} domain
|
|
548
|
+
* @returns {domain is SelectionDomainRef}
|
|
549
|
+
*/
|
|
550
|
+
export function isSelectionDomainRef(domain) {
|
|
551
|
+
return (
|
|
552
|
+
typeof domain === "object" &&
|
|
553
|
+
domain !== null &&
|
|
554
|
+
!Array.isArray(domain) &&
|
|
555
|
+
typeof domain.param === "string"
|
|
556
|
+
);
|
|
206
557
|
}
|
|
207
558
|
|
|
208
559
|
/**
|
|
@@ -273,13 +624,17 @@ function resolveDataDomain(members, getType, getAccessorsForMember) {
|
|
|
273
624
|
|
|
274
625
|
/**
|
|
275
626
|
* @param {import("../spec/channel.js").Type} type
|
|
276
|
-
* @param {() => number[]} getLocusExtent
|
|
627
|
+
* @param {(assembly: import("../spec/scale.js").Scale["assembly"] | undefined) => number[]} getLocusExtent
|
|
277
628
|
* @param {DomainArray | undefined} dataDomain
|
|
629
|
+
* @param {import("../spec/scale.js").Scale["assembly"] | undefined} locusAssembly
|
|
278
630
|
* @returns {any[]}
|
|
279
631
|
*/
|
|
280
|
-
function resolveDefaultDomain(type, getLocusExtent, dataDomain) {
|
|
632
|
+
function resolveDefaultDomain(type, getLocusExtent, dataDomain, locusAssembly) {
|
|
281
633
|
if (type == LOCUS) {
|
|
282
|
-
return getLocusExtent();
|
|
634
|
+
return getLocusExtent(locusAssembly);
|
|
635
|
+
}
|
|
636
|
+
if (type == INDEX) {
|
|
637
|
+
return toInternalIndexLikeDataDomain(type, dataDomain) ?? [];
|
|
283
638
|
}
|
|
284
639
|
return dataDomain ?? [];
|
|
285
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"}
|