@genome-spy/core 0.36.0 → 0.37.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/README.md +1 -0
- package/dist/{index.es.js → bundled/index.es.js} +4227 -4085
- package/dist/{index.js → bundled/index.js} +191 -55
- package/dist/src/data/collector.d.ts +36 -0
- package/dist/src/data/collector.d.ts.map +1 -0
- package/dist/src/data/collector.js +184 -0
- package/dist/src/data/collector.test.js +84 -0
- package/dist/src/data/dataFlow.d.ts +65 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -0
- package/dist/src/data/dataFlow.js +142 -0
- package/dist/src/data/dataFlow.test.js +5 -0
- package/dist/src/data/facetNode.d.ts +17 -0
- package/dist/src/data/facetNode.d.ts.map +1 -0
- package/dist/src/data/facetNode.js +17 -0
- package/dist/src/data/flow.test.js +72 -0
- package/dist/src/data/flowNode.d.ts +136 -0
- package/dist/src/data/flowNode.d.ts.map +1 -0
- package/dist/src/data/flowNode.js +286 -0
- package/dist/src/data/flowNode.test.js +50 -0
- package/dist/src/data/flowOptimizer.d.ts +27 -0
- package/dist/src/data/flowOptimizer.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.js +133 -0
- package/dist/src/data/flowOptimizer.test.js +193 -0
- package/dist/src/data/flowTestUtils.d.ts +30 -0
- package/dist/src/data/flowTestUtils.d.ts.map +1 -0
- package/dist/src/data/flowTestUtils.js +63 -0
- package/dist/src/data/formats/fasta.d.ts +20 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -0
- package/dist/src/data/formats/fasta.js +32 -0
- package/dist/src/data/formats/fasta.test.js +27 -0
- package/dist/src/data/sources/dataSource.d.ts +12 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.js +25 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
- package/dist/src/data/sources/dataSourceFactory.js +127 -0
- package/dist/src/data/sources/dataUtils.d.ts +50 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
- package/dist/src/data/sources/dataUtils.js +83 -0
- package/dist/src/data/sources/dynamic/README.md +3 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bamSource.js +115 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
- package/dist/src/data/sources/inlineSource.d.ts +16 -0
- package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.js +68 -0
- package/dist/src/data/sources/inlineSource.test.js +56 -0
- package/dist/src/data/sources/namedSource.d.ts +25 -0
- package/dist/src/data/sources/namedSource.d.ts.map +1 -0
- package/dist/src/data/sources/namedSource.js +80 -0
- package/dist/src/data/sources/sequenceSource.d.ts +17 -0
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.js +47 -0
- package/dist/src/data/sources/sequenceSource.test.js +46 -0
- package/dist/src/data/sources/urlSource.d.ts +16 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -0
- package/dist/src/data/sources/urlSource.js +74 -0
- package/dist/src/data/transforms/aggregate.d.ts +18 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
- package/dist/src/data/transforms/aggregate.js +67 -0
- package/dist/src/data/transforms/clone.d.ts +15 -0
- package/dist/src/data/transforms/clone.d.ts.map +1 -0
- package/dist/src/data/transforms/clone.js +40 -0
- package/dist/src/data/transforms/clone.test.js +11 -0
- package/dist/src/data/transforms/coverage.d.ts +30 -0
- package/dist/src/data/transforms/coverage.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.js +183 -0
- package/dist/src/data/transforms/coverage.test.js +123 -0
- package/dist/src/data/transforms/filter.d.ts +12 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -0
- package/dist/src/data/transforms/filter.js +33 -0
- package/dist/src/data/transforms/filter.test.js +18 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/filterScoredLabels.js +134 -0
- package/dist/src/data/transforms/flatten.d.ts +10 -0
- package/dist/src/data/transforms/flatten.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.js +68 -0
- package/dist/src/data/transforms/flatten.test.js +93 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.js +66 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
- package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
- package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.js +35 -0
- package/dist/src/data/transforms/flattenSequence.test.js +34 -0
- package/dist/src/data/transforms/formula.d.ts +13 -0
- package/dist/src/data/transforms/formula.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.js +35 -0
- package/dist/src/data/transforms/formula.test.js +19 -0
- package/dist/src/data/transforms/identifier.d.ts +40 -0
- package/dist/src/data/transforms/identifier.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.js +106 -0
- package/dist/src/data/transforms/identifier.test.js +83 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
- package/dist/src/data/transforms/measureText.d.ts +18 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -0
- package/dist/src/data/transforms/measureText.js +42 -0
- package/dist/src/data/transforms/pileup.d.ts +10 -0
- package/dist/src/data/transforms/pileup.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.js +126 -0
- package/dist/src/data/transforms/pileup.test.js +70 -0
- package/dist/src/data/transforms/project.d.ts +13 -0
- package/dist/src/data/transforms/project.d.ts.map +1 -0
- package/dist/src/data/transforms/project.js +38 -0
- package/dist/src/data/transforms/project.test.js +32 -0
- package/dist/src/data/transforms/regexExtract.d.ts +13 -0
- package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.js +57 -0
- package/dist/src/data/transforms/regexExtract.test.js +67 -0
- package/dist/src/data/transforms/regexFold.d.ts +14 -0
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
- package/dist/src/data/transforms/regexFold.js +139 -0
- package/dist/src/data/transforms/regexFold.test.js +160 -0
- package/dist/src/data/transforms/sample.d.ts +42 -0
- package/dist/src/data/transforms/sample.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.js +99 -0
- package/dist/src/data/transforms/sample.test.js +38 -0
- package/dist/src/data/transforms/stack.d.ts +11 -0
- package/dist/src/data/transforms/stack.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.js +134 -0
- package/dist/src/data/transforms/stack.test.js +91 -0
- package/dist/src/data/transforms/transformFactory.d.ts +12 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
- package/dist/src/data/transforms/transformFactory.js +59 -0
- package/dist/src/encoder/accessor.d.ts +15 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -0
- package/dist/src/encoder/accessor.js +76 -0
- package/dist/src/encoder/accessor.test.js +47 -0
- package/dist/src/encoder/encoder.d.ts +144 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -0
- package/dist/src/encoder/encoder.js +400 -0
- package/dist/src/encoder/encoder.test.js +98 -0
- package/dist/src/fonts/Lato-Regular.json +1267 -0
- package/dist/src/fonts/Lato-Regular.png +0 -0
- package/dist/src/fonts/OFL.txt +93 -0
- package/dist/src/fonts/README.md +3 -0
- package/dist/src/fonts/bmFontManager.d.ts +182 -0
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
- package/dist/src/fonts/bmFontManager.js +359 -0
- package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
- package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
- package/dist/src/fonts/bmFontMetrics.js +108 -0
- package/dist/src/genome/genome.d.ts +172 -0
- package/dist/src/genome/genome.d.ts.map +1 -0
- package/dist/src/genome/genome.js +379 -0
- package/dist/src/genome/genome.test.js +226 -0
- package/dist/src/genome/genomeStore.d.ts +20 -0
- package/dist/src/genome/genomeStore.d.ts.map +1 -0
- package/dist/src/genome/genomeStore.js +54 -0
- package/dist/src/genome/locusFormat.d.ts +14 -0
- package/dist/src/genome/locusFormat.d.ts.map +1 -0
- package/dist/src/genome/locusFormat.js +37 -0
- package/dist/src/genome/scaleIndex.d.ts +6 -0
- package/dist/src/genome/scaleIndex.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.js +165 -0
- package/dist/src/genome/scaleIndex.test.js +78 -0
- package/dist/src/genome/scaleLocus.d.ts +3 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.js +101 -0
- package/dist/src/genome/scaleLocus.test.js +4 -0
- package/dist/src/genomeSpy.d.ts +141 -0
- package/dist/src/genomeSpy.d.ts.map +1 -0
- package/dist/src/genomeSpy.js +788 -0
- package/dist/src/gl/arrayBuilder.d.ts +71 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
- package/dist/src/gl/arrayBuilder.js +199 -0
- package/dist/src/gl/dataToVertices.d.ts +194 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -0
- package/dist/src/gl/dataToVertices.js +639 -0
- package/dist/src/gl/includes/common.glsl.js +2 -0
- package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
- package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
- package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
- package/dist/src/gl/includes/scales.glsl.js +2 -0
- package/dist/src/gl/link.fragment.glsl.js +2 -0
- package/dist/src/gl/link.vertex.glsl.js +2 -0
- package/dist/src/gl/point.fragment.glsl.js +2 -0
- package/dist/src/gl/point.vertex.glsl.js +2 -0
- package/dist/src/gl/rect.fragment.glsl.js +2 -0
- package/dist/src/gl/rect.vertex.glsl.js +2 -0
- package/dist/src/gl/rule.fragment.glsl.js +2 -0
- package/dist/src/gl/rule.vertex.glsl.js +2 -0
- package/dist/src/gl/text.fragment.glsl.js +2 -0
- package/dist/src/gl/text.vertex.glsl.js +2 -0
- package/dist/src/gl/webGLHelper.d.ts +118 -0
- package/dist/src/gl/webGLHelper.d.ts.map +1 -0
- package/dist/src/gl/webGLHelper.js +513 -0
- package/dist/src/img/bowtie.svg +1 -0
- package/dist/src/img/genomespy-favicon.svg +34 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.html +11 -0
- package/dist/src/index.js +129 -0
- package/dist/src/marks/link.d.ts +11 -0
- package/dist/src/marks/link.d.ts.map +1 -0
- package/dist/src/marks/link.js +175 -0
- package/dist/src/marks/mark.d.ts +226 -0
- package/dist/src/marks/mark.d.ts.map +1 -0
- package/dist/src/marks/mark.js +1004 -0
- package/dist/src/marks/markUtils.d.ts +23 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -0
- package/dist/src/marks/markUtils.js +125 -0
- package/dist/src/marks/pointMark.d.ts +11 -0
- package/dist/src/marks/pointMark.d.ts.map +1 -0
- package/dist/src/marks/pointMark.js +251 -0
- package/dist/src/marks/rectMark.d.ts +18 -0
- package/dist/src/marks/rectMark.d.ts.map +1 -0
- package/dist/src/marks/rectMark.js +255 -0
- package/dist/src/marks/rule.d.ts +6 -0
- package/dist/src/marks/rule.d.ts.map +1 -0
- package/dist/src/marks/rule.js +250 -0
- package/dist/src/marks/text.d.ts +13 -0
- package/dist/src/marks/text.d.ts.map +1 -0
- package/dist/src/marks/text.js +279 -0
- package/dist/src/scale/colorUtils.d.ts +34 -0
- package/dist/src/scale/colorUtils.d.ts.map +1 -0
- package/dist/src/scale/colorUtils.js +184 -0
- package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
- package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/scale/glslScaleGenerator.js +506 -0
- package/dist/src/scale/scale.d.ts +10 -0
- package/dist/src/scale/scale.d.ts.map +1 -0
- package/dist/src/scale/scale.js +456 -0
- package/dist/src/scale/scale.test.js +324 -0
- package/dist/src/scale/ticks.d.ts +47 -0
- package/dist/src/scale/ticks.d.ts.map +1 -0
- package/dist/src/scale/ticks.js +203 -0
- package/dist/src/scale/ticks.test.js +40 -0
- package/dist/src/singlePageApp.d.ts +2 -0
- package/dist/src/singlePageApp.d.ts.map +1 -0
- package/dist/src/singlePageApp.js +13 -0
- package/dist/src/spec/axis.d.ts +402 -0
- package/dist/src/spec/channel.d.ts +440 -0
- package/dist/src/spec/data.d.ts +370 -0
- package/dist/src/spec/font.d.ts +15 -0
- package/dist/src/spec/genome.d.ts +35 -0
- package/dist/src/spec/mark.d.ts +435 -0
- package/dist/src/spec/root.d.ts +22 -0
- package/dist/src/spec/sampleView.d.ts +185 -0
- package/dist/src/spec/scale.d.ts +273 -0
- package/dist/src/spec/title.d.ts +102 -0
- package/dist/src/spec/tooltip.d.ts +9 -0
- package/dist/src/spec/transform.d.ts +504 -0
- package/dist/src/spec/view.d.ts +214 -0
- package/dist/src/styles/genome-spy.css.d.ts +3 -0
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
- package/dist/src/styles/genome-spy.css.js +114 -0
- package/dist/src/styles/genome-spy.scss +153 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/dataTooltipHandler.js +64 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.ts +12 -0
- package/dist/src/types/bmFont.d.ts +58 -0
- package/dist/src/types/embedApi.d.ts +67 -0
- package/dist/src/types/encoder.d.ts +84 -0
- package/dist/src/types/flowBatch.d.ts +40 -0
- package/dist/src/types/rendering.d.ts +65 -0
- package/dist/src/types/scaleResolutionApi.d.ts +40 -0
- package/dist/src/types/viewContext.d.ts +85 -0
- package/dist/src/utils/addBaseUrl.d.ts +6 -0
- package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/addBaseUrl.js +19 -0
- package/dist/src/utils/addBaseUrl.test.js +22 -0
- package/dist/src/utils/animator.d.ts +41 -0
- package/dist/src/utils/animator.d.ts.map +1 -0
- package/dist/src/utils/animator.js +83 -0
- package/dist/src/utils/arrayUtils.d.ts +34 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -0
- package/dist/src/utils/arrayUtils.js +61 -0
- package/dist/src/utils/binnedIndex.d.ts +23 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.js +167 -0
- package/dist/src/utils/binnedIndex.test.js +155 -0
- package/dist/src/utils/clamp.d.ts +7 -0
- package/dist/src/utils/clamp.d.ts.map +1 -0
- package/dist/src/utils/clamp.js +8 -0
- package/dist/src/utils/cloner.d.ts +16 -0
- package/dist/src/utils/cloner.d.ts.map +1 -0
- package/dist/src/utils/cloner.js +34 -0
- package/dist/src/utils/cloner.test.js +24 -0
- package/dist/src/utils/coalesce.d.ts +6 -0
- package/dist/src/utils/coalesce.d.ts.map +1 -0
- package/dist/src/utils/coalesce.js +11 -0
- package/dist/src/utils/coalesce.test.js +16 -0
- package/dist/src/utils/concatIterables.d.ts +8 -0
- package/dist/src/utils/concatIterables.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.js +26 -0
- package/dist/src/utils/concatIterables.test.js +8 -0
- package/dist/src/utils/debounce.d.ts +8 -0
- package/dist/src/utils/debounce.d.ts.map +1 -0
- package/dist/src/utils/debounce.js +37 -0
- package/dist/src/utils/domainArray.d.ts +61 -0
- package/dist/src/utils/domainArray.d.ts.map +1 -0
- package/dist/src/utils/domainArray.js +216 -0
- package/dist/src/utils/domainArray.test.js +130 -0
- package/dist/src/utils/eerp.d.ts +12 -0
- package/dist/src/utils/eerp.d.ts.map +1 -0
- package/dist/src/utils/eerp.js +13 -0
- package/dist/src/utils/expression.d.ts +9 -0
- package/dist/src/utils/expression.d.ts.map +1 -0
- package/dist/src/utils/expression.js +32 -0
- package/dist/src/utils/field.d.ts +17 -0
- package/dist/src/utils/field.d.ts.map +1 -0
- package/dist/src/utils/field.js +28 -0
- package/dist/src/utils/formatObject.d.ts +7 -0
- package/dist/src/utils/formatObject.d.ts.map +1 -0
- package/dist/src/utils/formatObject.js +37 -0
- package/dist/src/utils/indexer.d.ts +16 -0
- package/dist/src/utils/indexer.d.ts.map +1 -0
- package/dist/src/utils/indexer.js +43 -0
- package/dist/src/utils/indexer.test.js +47 -0
- package/dist/src/utils/inertia.d.ts +42 -0
- package/dist/src/utils/inertia.d.ts.map +1 -0
- package/dist/src/utils/inertia.js +124 -0
- package/dist/src/utils/interactionEvent.d.ts +26 -0
- package/dist/src/utils/interactionEvent.d.ts.map +1 -0
- package/dist/src/utils/interactionEvent.js +33 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
- package/dist/src/utils/iterateNestedMaps.js +21 -0
- package/dist/src/utils/iterateNestedMaps.test.js +33 -0
- package/dist/src/utils/kWayMerge.d.ts +9 -0
- package/dist/src/utils/kWayMerge.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.js +42 -0
- package/dist/src/utils/kWayMerge.test.js +26 -0
- package/dist/src/utils/layout/flexLayout.d.ts +182 -0
- package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
- package/dist/src/utils/layout/flexLayout.js +381 -0
- package/dist/src/utils/layout/flexLayout.test.js +323 -0
- package/dist/src/utils/layout/grid.d.ts +29 -0
- package/dist/src/utils/layout/grid.d.ts.map +1 -0
- package/dist/src/utils/layout/grid.js +95 -0
- package/dist/src/utils/layout/grid.test.js +71 -0
- package/dist/src/utils/layout/padding.d.ts +83 -0
- package/dist/src/utils/layout/padding.d.ts.map +1 -0
- package/dist/src/utils/layout/padding.js +155 -0
- package/dist/src/utils/layout/point.d.ts +16 -0
- package/dist/src/utils/layout/point.d.ts.map +1 -0
- package/dist/src/utils/layout/point.js +23 -0
- package/dist/src/utils/layout/rectangle.d.ts +142 -0
- package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
- package/dist/src/utils/layout/rectangle.js +296 -0
- package/dist/src/utils/layout/rectangle.test.js +172 -0
- package/dist/src/utils/mergeObjects.d.ts +15 -0
- package/dist/src/utils/mergeObjects.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.js +99 -0
- package/dist/src/utils/mergeObjects.test.js +42 -0
- package/dist/src/utils/numberExtractor.d.ts +9 -0
- package/dist/src/utils/numberExtractor.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.js +24 -0
- package/dist/src/utils/numberExtractor.test.js +6 -0
- package/dist/src/utils/point.d.ts +9 -0
- package/dist/src/utils/point.d.ts.map +1 -0
- package/dist/src/utils/point.js +14 -0
- package/dist/src/utils/propertyCacher.d.ts +30 -0
- package/dist/src/utils/propertyCacher.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.js +70 -0
- package/dist/src/utils/propertyCacher.test.js +85 -0
- package/dist/src/utils/propertyCoalescer.d.ts +15 -0
- package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.js +42 -0
- package/dist/src/utils/propertyCoalescer.test.js +22 -0
- package/dist/src/utils/reservationMap.d.ts +42 -0
- package/dist/src/utils/reservationMap.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.js +103 -0
- package/dist/src/utils/reservationMap.test.js +20 -0
- package/dist/src/utils/scaleNull.d.ts +13 -0
- package/dist/src/utils/scaleNull.d.ts.map +1 -0
- package/dist/src/utils/scaleNull.js +21 -0
- package/dist/src/utils/setOperations.d.ts +31 -0
- package/dist/src/utils/setOperations.d.ts.map +1 -0
- package/dist/src/utils/setOperations.js +75 -0
- package/dist/src/utils/smoothstep.d.ts +7 -0
- package/dist/src/utils/smoothstep.d.ts.map +1 -0
- package/dist/src/utils/smoothstep.js +10 -0
- package/dist/src/utils/throttle.d.ts +8 -0
- package/dist/src/utils/throttle.d.ts.map +1 -0
- package/dist/src/utils/throttle.js +34 -0
- package/dist/src/utils/topK.d.ts +22 -0
- package/dist/src/utils/topK.d.ts.map +1 -0
- package/dist/src/utils/topK.js +76 -0
- package/dist/src/utils/topK.test.js +64 -0
- package/dist/src/utils/transition.d.ts +44 -0
- package/dist/src/utils/transition.d.ts.map +1 -0
- package/dist/src/utils/transition.js +74 -0
- package/dist/src/utils/trees.d.ts +56 -0
- package/dist/src/utils/trees.d.ts.map +1 -0
- package/dist/src/utils/trees.js +92 -0
- package/dist/src/utils/trees.test.js +130 -0
- package/dist/src/utils/ui/tooltip.d.ts +50 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
- package/dist/src/utils/ui/tooltip.js +189 -0
- package/dist/src/utils/url.d.ts +9 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +22 -0
- package/dist/src/utils/variableTools.d.ts +14 -0
- package/dist/src/utils/variableTools.d.ts.map +1 -0
- package/dist/src/utils/variableTools.js +24 -0
- package/dist/src/utils/variableTools.test.js +13 -0
- package/dist/src/view/axisGridView.d.ts +39 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -0
- package/dist/src/view/axisGridView.js +246 -0
- package/dist/src/view/axisResolution.d.ts +24 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -0
- package/dist/src/view/axisResolution.js +141 -0
- package/dist/src/view/axisResolution.test.js +201 -0
- package/dist/src/view/axisView.d.ts +49 -0
- package/dist/src/view/axisView.d.ts.map +1 -0
- package/dist/src/view/axisView.js +629 -0
- package/dist/src/view/concatView.d.ts +16 -0
- package/dist/src/view/concatView.d.ts.map +1 -0
- package/dist/src/view/concatView.js +84 -0
- package/dist/src/view/containerView.d.ts +43 -0
- package/dist/src/view/containerView.d.ts.map +1 -0
- package/dist/src/view/containerView.js +137 -0
- package/dist/src/view/facetView.d.ts +71 -0
- package/dist/src/view/facetView.d.ts.map +1 -0
- package/dist/src/view/facetView.js +492 -0
- package/dist/src/view/flowBuilder.d.ts +37 -0
- package/dist/src/view/flowBuilder.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.js +383 -0
- package/dist/src/view/flowBuilder.test.js +125 -0
- package/dist/src/view/gridView.d.ts +111 -0
- package/dist/src/view/gridView.d.ts.map +1 -0
- package/dist/src/view/gridView.js +1086 -0
- package/dist/src/view/implicitRootView.d.ts +9 -0
- package/dist/src/view/implicitRootView.d.ts.map +1 -0
- package/dist/src/view/implicitRootView.js +23 -0
- package/dist/src/view/importView.d.ts +17 -0
- package/dist/src/view/importView.d.ts.map +1 -0
- package/dist/src/view/importView.js +22 -0
- package/dist/src/view/layerView.d.ts +25 -0
- package/dist/src/view/layerView.d.ts.map +1 -0
- package/dist/src/view/layerView.js +77 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
- package/dist/src/view/scaleResolution.d.ts +170 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.js +874 -0
- package/dist/src/view/scaleResolution.test.js +658 -0
- package/dist/src/view/testUtils.d.ts +30 -0
- package/dist/src/view/testUtils.d.ts.map +1 -0
- package/dist/src/view/testUtils.js +101 -0
- package/dist/src/view/title.d.ts +6 -0
- package/dist/src/view/title.d.ts.map +1 -0
- package/dist/src/view/title.js +165 -0
- package/dist/src/view/unitView.d.ts +93 -0
- package/dist/src/view/unitView.d.ts.map +1 -0
- package/dist/src/view/unitView.js +345 -0
- package/dist/src/view/view.d.ts +291 -0
- package/dist/src/view/view.d.ts.map +1 -0
- package/dist/src/view/view.js +691 -0
- package/dist/src/view/view.test.js +214 -0
- package/dist/src/view/viewFactory.d.ts +76 -0
- package/dist/src/view/viewFactory.d.ts.map +1 -0
- package/dist/src/view/viewFactory.js +178 -0
- package/dist/src/view/viewFactory.test.js +17 -0
- package/dist/src/view/viewUtils.d.ts +90 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -0
- package/dist/src/view/viewUtils.js +326 -0
- package/dist/src/view/zoom.d.ts +23 -0
- package/dist/src/view/zoom.d.ts.map +1 -0
- package/dist/src/view/zoom.js +89 -0
- package/package.json +15 -12
- package/dist/style.css +0 -1
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
3
|
+
* @returns {flowBatch is import("../types/flowBatch").FileBatch}
|
|
4
|
+
*/
|
|
5
|
+
export function isFileBatch(flowBatch: import("../types/flowBatch").FlowBatch): flowBatch is import("../types/flowBatch").FileBatch;
|
|
6
|
+
/**
|
|
7
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
8
|
+
* @returns {flowBatch is import("../types/flowBatch").FacetBatch}
|
|
9
|
+
*/
|
|
10
|
+
export function isFacetBatch(flowBatch: import("../types/flowBatch").FlowBatch): flowBatch is import("../types/flowBatch").FacetBatch;
|
|
11
|
+
/**
|
|
12
|
+
* The FlowNode clones the data objects passing through or creates entirely
|
|
13
|
+
* new objects.
|
|
14
|
+
*/
|
|
15
|
+
export const BEHAVIOR_CLONES: number;
|
|
16
|
+
/**
|
|
17
|
+
* FlowNode modifies the objects that pass through. Creating defensive copies
|
|
18
|
+
* (clones) in an upstream node may be appropriate, depending on branching.
|
|
19
|
+
*/
|
|
20
|
+
export const BEHAVIOR_MODIFIES: number;
|
|
21
|
+
/**
|
|
22
|
+
* The flow node collects data objects and may emit the to its children.
|
|
23
|
+
* The collected data objects must not be modified by downstream transforms.
|
|
24
|
+
*/
|
|
25
|
+
export const BEHAVIOR_COLLECTS: number;
|
|
26
|
+
/**
|
|
27
|
+
* This is heavily inspired by Vega's and Vega-Lite's data flow system.
|
|
28
|
+
*
|
|
29
|
+
* @typedef {Record<string, any>} Datum
|
|
30
|
+
* @typedef {Datum[]} Data
|
|
31
|
+
*/
|
|
32
|
+
export default class FlowNode {
|
|
33
|
+
get behavior(): number;
|
|
34
|
+
/** @type {FlowNode[]} */
|
|
35
|
+
children: FlowNode[];
|
|
36
|
+
/** @type {FlowNode} */
|
|
37
|
+
parent: FlowNode;
|
|
38
|
+
/** True if all data have been processed */
|
|
39
|
+
completed: boolean;
|
|
40
|
+
/**
|
|
41
|
+
* Resets the node and all its descendants to their initial state, i.e., preparing
|
|
42
|
+
* for a new batch of data.
|
|
43
|
+
*/
|
|
44
|
+
reset(): void;
|
|
45
|
+
/**
|
|
46
|
+
* Allows for doing final initialization after the flow structure has been
|
|
47
|
+
* built and optimized. Must be called before any data are to be propagated.
|
|
48
|
+
*/
|
|
49
|
+
initialize(): void;
|
|
50
|
+
/**
|
|
51
|
+
* Dynamically updates the propagator method to allow the JavaScript engine
|
|
52
|
+
* to employ optimizations such as inlining.
|
|
53
|
+
*/
|
|
54
|
+
_updatePropagator(): void;
|
|
55
|
+
/**
|
|
56
|
+
*
|
|
57
|
+
* @param {any} datum
|
|
58
|
+
*/
|
|
59
|
+
_propagate(datum: any): void;
|
|
60
|
+
/**
|
|
61
|
+
*
|
|
62
|
+
* @param {FlowNode} parent
|
|
63
|
+
*/
|
|
64
|
+
setParent(parent: FlowNode): void;
|
|
65
|
+
/**
|
|
66
|
+
*
|
|
67
|
+
* @param {FlowNode} child
|
|
68
|
+
*/
|
|
69
|
+
addChild(child: FlowNode): FlowNode;
|
|
70
|
+
/**
|
|
71
|
+
* @param {FlowNode} node
|
|
72
|
+
*/
|
|
73
|
+
adopt(node: FlowNode): void;
|
|
74
|
+
/**
|
|
75
|
+
* @param {FlowNode} otherParent
|
|
76
|
+
*/
|
|
77
|
+
adoptChildrenOf(otherParent: FlowNode): void;
|
|
78
|
+
/**
|
|
79
|
+
* @param {FlowNode} newParent
|
|
80
|
+
*/
|
|
81
|
+
insertAsParent(newParent: FlowNode): void;
|
|
82
|
+
/**
|
|
83
|
+
*
|
|
84
|
+
* @param {FlowNode} child
|
|
85
|
+
*/
|
|
86
|
+
removeChild(child: FlowNode): void;
|
|
87
|
+
/**
|
|
88
|
+
* Removes this node and ligates (connects) the preceding and succeeding nodes.
|
|
89
|
+
*/
|
|
90
|
+
excise(): void;
|
|
91
|
+
isRoot(): boolean;
|
|
92
|
+
isBranching(): boolean;
|
|
93
|
+
isTerminal(): boolean;
|
|
94
|
+
/**
|
|
95
|
+
* Visits child nodes in depth-first order.
|
|
96
|
+
*
|
|
97
|
+
* @param {(function(FlowNode):void) & { afterChildren?: function(FlowNode):void}} visitor
|
|
98
|
+
*/
|
|
99
|
+
visit(visitor: ((arg0: FlowNode) => void) & {
|
|
100
|
+
afterChildren?: (arg0: FlowNode) => void;
|
|
101
|
+
}): void;
|
|
102
|
+
/**
|
|
103
|
+
* @param {number} [depth]
|
|
104
|
+
* @returns {string}
|
|
105
|
+
*/
|
|
106
|
+
subtreeToString(depth?: number): string;
|
|
107
|
+
/**
|
|
108
|
+
* The global object for expressions (in formula and filter transforms).
|
|
109
|
+
* Nodes in the hierarchy may extend the object using Object.create to
|
|
110
|
+
* introduce variables that are visible downstream the flow.
|
|
111
|
+
*
|
|
112
|
+
* @returns {Record<string, any>}
|
|
113
|
+
*/
|
|
114
|
+
getGlobalObject(): Record<string, any>;
|
|
115
|
+
/**
|
|
116
|
+
*
|
|
117
|
+
* @param {Datum} datum
|
|
118
|
+
*/
|
|
119
|
+
handle(datum: Datum): void;
|
|
120
|
+
complete(): void;
|
|
121
|
+
/**
|
|
122
|
+
* Signals that a new batch of data will be propagated.
|
|
123
|
+
*
|
|
124
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
125
|
+
*/
|
|
126
|
+
beginBatch(flowBatch: import("../types/flowBatch").FlowBatch): void;
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* This is heavily inspired by Vega's and Vega-Lite's data flow system.
|
|
130
|
+
*/
|
|
131
|
+
export type Datum = Record<string, any>;
|
|
132
|
+
/**
|
|
133
|
+
* This is heavily inspired by Vega's and Vega-Lite's data flow system.
|
|
134
|
+
*/
|
|
135
|
+
export type Data = Datum[];
|
|
136
|
+
//# sourceMappingURL=flowNode.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowNode.d.ts","sourceRoot":"","sources":["../../../src/data/flowNode.js"],"names":[],"mappings":"AA+QA;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,SAAS,uDAKhD;AAED;;;GAGG;AACH,wCAHW,OAAO,oBAAoB,EAAE,SAAS,wDAKhD;AA3RD;;;GAGG;AACH,qCAAsC;AAEtC;;;GAGG;AACH,uCAAwC;AAExC;;;GAGG;AACH,uCAAwC;AAIxC;;;;;GAKG;AACH;IACI,uBAEC;IAGG,yBAAyB;IACzB,UADW,QAAQ,EAAE,CACH;IAElB,uBAAuB;IACvB,QADW,QAAQ,CACI;IAEvB,2CAA2C;IAC3C,mBAAsB;IAG1B;;;OAGG;IACH,cAMC;IAED;;;OAGG;IACH,mBAEC;IAED;;;OAGG;IACH,0BAUC;IAwLD;;;OAGG;IACH,kBAFW,GAAG,QAIb;IA5LD;;;OAGG;IACH,kBAFW,QAAQ,QAIlB;IAED;;;OAGG;IACH,gBAFW,QAAQ,YAUlB;IAED;;OAEG;IACH,YAFW,QAAQ,QAQlB;IAED;;OAEG;IACH,6BAFW,QAAQ,QAMlB;IAED;;OAEG;IACH,0BAFW,QAAQ,QAalB;IAED;;;OAGG;IACH,mBAFW,QAAQ,QAWlB;IAED;;OAEG;IACH,eAiBC;IAED,kBAEC;IAED,uBAEC;IAED,sBAEC;IAED;;;;OAIG;IACH,eAFW,QAAU,QAAQ,KAAE,IAAI,CAAC,GAAG;QAAE,aAAa,CAAC,SAAW,QAAQ,KAAE,IAAI,CAAA;KAAC,QAchF;IAED;;;OAGG;IACH,wBAHW,MAAM,GACJ,MAAM,CAWlB;IAED;;;;;;OAMG;IACH,mBAFa,OAAO,MAAM,EAAE,GAAG,CAAC,CAM/B;IAED;;;OAGG;IACH,cAFW,KAAK,QAKf;IAED,iBAMC;IAED;;;;OAIG;IACH,sBAFW,OAAO,oBAAoB,EAAE,SAAS,QAMhD;CASJ;;;;oBApPY,OAAO,MAAM,EAAE,GAAG,CAAC;;;;mBACnB,KAAK,EAAE"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
import { range } from "d3-array";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The FlowNode clones the data objects passing through or creates entirely
|
|
5
|
+
* new objects.
|
|
6
|
+
*/
|
|
7
|
+
export const BEHAVIOR_CLONES = 1 << 0;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* FlowNode modifies the objects that pass through. Creating defensive copies
|
|
11
|
+
* (clones) in an upstream node may be appropriate, depending on branching.
|
|
12
|
+
*/
|
|
13
|
+
export const BEHAVIOR_MODIFIES = 1 << 1;
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The flow node collects data objects and may emit the to its children.
|
|
17
|
+
* The collected data objects must not be modified by downstream transforms.
|
|
18
|
+
*/
|
|
19
|
+
export const BEHAVIOR_COLLECTS = 1 << 2;
|
|
20
|
+
|
|
21
|
+
const ROOT_CONTEXT_OBJECT = {};
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* This is heavily inspired by Vega's and Vega-Lite's data flow system.
|
|
25
|
+
*
|
|
26
|
+
* @typedef {Record<string, any>} Datum
|
|
27
|
+
* @typedef {Datum[]} Data
|
|
28
|
+
*/
|
|
29
|
+
export default class FlowNode {
|
|
30
|
+
get behavior() {
|
|
31
|
+
return 0;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
constructor() {
|
|
35
|
+
/** @type {FlowNode[]} */
|
|
36
|
+
this.children = [];
|
|
37
|
+
|
|
38
|
+
/** @type {FlowNode} */
|
|
39
|
+
this.parent = undefined;
|
|
40
|
+
|
|
41
|
+
/** True if all data have been processed */
|
|
42
|
+
this.completed = false;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Resets the node and all its descendants to their initial state, i.e., preparing
|
|
47
|
+
* for a new batch of data.
|
|
48
|
+
*/
|
|
49
|
+
reset() {
|
|
50
|
+
this.completed = false;
|
|
51
|
+
|
|
52
|
+
for (const child of this.children) {
|
|
53
|
+
child.reset();
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
/**
|
|
58
|
+
* Allows for doing final initialization after the flow structure has been
|
|
59
|
+
* built and optimized. Must be called before any data are to be propagated.
|
|
60
|
+
*/
|
|
61
|
+
initialize() {
|
|
62
|
+
// override
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Dynamically updates the propagator method to allow the JavaScript engine
|
|
67
|
+
* to employ optimizations such as inlining.
|
|
68
|
+
*/
|
|
69
|
+
_updatePropagator() {
|
|
70
|
+
this._propagate = Function(
|
|
71
|
+
"children",
|
|
72
|
+
range(this.children.length)
|
|
73
|
+
.map((i) => `const child${i} = children[${i}];`)
|
|
74
|
+
.join("\n") +
|
|
75
|
+
`return function propagate(datum) {${range(this.children.length)
|
|
76
|
+
.map((i) => `child${i}.handle(datum);`)
|
|
77
|
+
.join("\n")}}`
|
|
78
|
+
)(this.children);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
*
|
|
83
|
+
* @param {FlowNode} parent
|
|
84
|
+
*/
|
|
85
|
+
setParent(parent) {
|
|
86
|
+
this.parent = parent;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
*
|
|
91
|
+
* @param {FlowNode} child
|
|
92
|
+
*/
|
|
93
|
+
addChild(child) {
|
|
94
|
+
if (child.parent) {
|
|
95
|
+
throw new Error("Cannot add the child! It already has a parent.");
|
|
96
|
+
}
|
|
97
|
+
this.children.push(child);
|
|
98
|
+
child.setParent(this);
|
|
99
|
+
this._updatePropagator();
|
|
100
|
+
return this;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/**
|
|
104
|
+
* @param {FlowNode} node
|
|
105
|
+
*/
|
|
106
|
+
adopt(node) {
|
|
107
|
+
if (node.parent) {
|
|
108
|
+
node.parent.removeChild(node);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
this.addChild(node);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/**
|
|
115
|
+
* @param {FlowNode} otherParent
|
|
116
|
+
*/
|
|
117
|
+
adoptChildrenOf(otherParent) {
|
|
118
|
+
for (const child of otherParent.children) {
|
|
119
|
+
this.adopt(child);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* @param {FlowNode} newParent
|
|
125
|
+
*/
|
|
126
|
+
insertAsParent(newParent) {
|
|
127
|
+
if (this.isRoot()) {
|
|
128
|
+
// Root should always be a data source
|
|
129
|
+
throw new Error("Cannot insert a new parent for a root node!");
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
newParent.parent = this.parent;
|
|
133
|
+
this.parent.children[this.parent.children.indexOf(this)] = newParent;
|
|
134
|
+
this.parent._updatePropagator();
|
|
135
|
+
this.parent = undefined;
|
|
136
|
+
newParent.addChild(this);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
/**
|
|
140
|
+
*
|
|
141
|
+
* @param {FlowNode} child
|
|
142
|
+
*/
|
|
143
|
+
removeChild(child) {
|
|
144
|
+
const index = this.children.indexOf(child);
|
|
145
|
+
if (index > -1) {
|
|
146
|
+
this.children.splice(index, 1);
|
|
147
|
+
child.parent = undefined;
|
|
148
|
+
this._updatePropagator();
|
|
149
|
+
} else {
|
|
150
|
+
throw new Error("Trying to remove an unknown child node!");
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
/**
|
|
155
|
+
* Removes this node and ligates (connects) the preceding and succeeding nodes.
|
|
156
|
+
*/
|
|
157
|
+
excise() {
|
|
158
|
+
if (this.isRoot()) {
|
|
159
|
+
// TODO: Implement
|
|
160
|
+
throw new Error("Cannot excise root node!");
|
|
161
|
+
} else if (this.isTerminal()) {
|
|
162
|
+
this.parent.removeChild(this);
|
|
163
|
+
} else if (this.children.length == 1) {
|
|
164
|
+
const child = this.children[0];
|
|
165
|
+
child.setParent(this.parent);
|
|
166
|
+
this.parent.children[this.parent.children.indexOf(this)] = child;
|
|
167
|
+
this.parent._updatePropagator();
|
|
168
|
+
this.setParent(undefined);
|
|
169
|
+
this.children.length = 0;
|
|
170
|
+
} else {
|
|
171
|
+
// TODO: Implement
|
|
172
|
+
throw new Error("Cannot excise a node that has multiple children!");
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
isRoot() {
|
|
177
|
+
return !this.parent;
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
isBranching() {
|
|
181
|
+
return this.children.length > 1;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
isTerminal() {
|
|
185
|
+
return this.children.length == 0;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Visits child nodes in depth-first order.
|
|
190
|
+
*
|
|
191
|
+
* @param {(function(FlowNode):void) & { afterChildren?: function(FlowNode):void}} visitor
|
|
192
|
+
*/
|
|
193
|
+
visit(visitor) {
|
|
194
|
+
// pre-order
|
|
195
|
+
visitor(this);
|
|
196
|
+
|
|
197
|
+
for (const child of this.children) {
|
|
198
|
+
child.visit(visitor);
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
// post-oder
|
|
202
|
+
if (visitor.afterChildren) {
|
|
203
|
+
visitor.afterChildren(this);
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* @param {number} [depth]
|
|
209
|
+
* @returns {string}
|
|
210
|
+
*/
|
|
211
|
+
subtreeToString(depth = 0) {
|
|
212
|
+
const childTree = this.children
|
|
213
|
+
.map((child) => child.subtreeToString(depth + 1))
|
|
214
|
+
.join("");
|
|
215
|
+
return `${" ".repeat(depth * 2)}* ${this.constructor.name}${
|
|
216
|
+
("identifier" in this && this.identifier
|
|
217
|
+
? ": " + this.identifier
|
|
218
|
+
: "") ?? ""
|
|
219
|
+
} \n${childTree}`;
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
/**
|
|
223
|
+
* The global object for expressions (in formula and filter transforms).
|
|
224
|
+
* Nodes in the hierarchy may extend the object using Object.create to
|
|
225
|
+
* introduce variables that are visible downstream the flow.
|
|
226
|
+
*
|
|
227
|
+
* @returns {Record<string, any>}
|
|
228
|
+
*/
|
|
229
|
+
getGlobalObject() {
|
|
230
|
+
return this.parent
|
|
231
|
+
? this.parent.getGlobalObject()
|
|
232
|
+
: ROOT_CONTEXT_OBJECT;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
/**
|
|
236
|
+
*
|
|
237
|
+
* @param {Datum} datum
|
|
238
|
+
*/
|
|
239
|
+
handle(datum) {
|
|
240
|
+
// Default implementation just passes through
|
|
241
|
+
this._propagate(datum);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
complete() {
|
|
245
|
+
this.completed = true;
|
|
246
|
+
|
|
247
|
+
for (const child of this.children) {
|
|
248
|
+
child.complete();
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Signals that a new batch of data will be propagated.
|
|
254
|
+
*
|
|
255
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
256
|
+
*/
|
|
257
|
+
beginBatch(flowBatch) {
|
|
258
|
+
for (const child of this.children) {
|
|
259
|
+
child.beginBatch(flowBatch);
|
|
260
|
+
}
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
*
|
|
265
|
+
* @param {any} datum
|
|
266
|
+
*/
|
|
267
|
+
_propagate(datum) {
|
|
268
|
+
// Implementation is set dynamically in add/removeChild
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
274
|
+
* @returns {flowBatch is import("../types/flowBatch").FileBatch}
|
|
275
|
+
*/
|
|
276
|
+
export function isFileBatch(flowBatch) {
|
|
277
|
+
return flowBatch.type == "file";
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
/**
|
|
281
|
+
* @param {import("../types/flowBatch").FlowBatch} flowBatch
|
|
282
|
+
* @returns {flowBatch is import("../types/flowBatch").FacetBatch}
|
|
283
|
+
*/
|
|
284
|
+
export function isFacetBatch(flowBatch) {
|
|
285
|
+
return flowBatch.type == "facet";
|
|
286
|
+
}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { describe, expect, test } from "vitest";
|
|
2
|
+
import FlowNode from "./flowNode";
|
|
3
|
+
import { validateLinks } from "./flowOptimizer";
|
|
4
|
+
|
|
5
|
+
describe("Flow mutation", () => {
|
|
6
|
+
test("Excise a terminal node", () => {
|
|
7
|
+
const a = new FlowNode();
|
|
8
|
+
const b = new FlowNode();
|
|
9
|
+
|
|
10
|
+
a.addChild(b);
|
|
11
|
+
b.excise();
|
|
12
|
+
|
|
13
|
+
expect(a.children[0]).toBeUndefined();
|
|
14
|
+
expect(b.parent).toBeUndefined();
|
|
15
|
+
|
|
16
|
+
expect(validateLinks(a)).toBeTruthy();
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
test("Excise a node in the middle", () => {
|
|
20
|
+
const a = new FlowNode();
|
|
21
|
+
const b = new FlowNode();
|
|
22
|
+
const c = new FlowNode();
|
|
23
|
+
|
|
24
|
+
a.addChild(b);
|
|
25
|
+
b.addChild(c);
|
|
26
|
+
b.excise();
|
|
27
|
+
|
|
28
|
+
expect(a.children[0]).toBe(c);
|
|
29
|
+
expect(c.parent).toBe(a);
|
|
30
|
+
|
|
31
|
+
expect(validateLinks(a)).toBeTruthy();
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
test("Insert as parent", () => {
|
|
35
|
+
const a = new FlowNode();
|
|
36
|
+
const b = new FlowNode();
|
|
37
|
+
const c = new FlowNode();
|
|
38
|
+
const d = new FlowNode();
|
|
39
|
+
|
|
40
|
+
a.addChild(c);
|
|
41
|
+
a.addChild(d);
|
|
42
|
+
c.insertAsParent(b);
|
|
43
|
+
|
|
44
|
+
expect(a.children[0]).toBe(b);
|
|
45
|
+
expect(a.children[1]).toBe(d);
|
|
46
|
+
expect(a.children[0].children[0]).toBe(c);
|
|
47
|
+
|
|
48
|
+
expect(validateLinks(a)).toBeTruthy();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @param {import("./flowNode").default} node
|
|
3
|
+
* @param {import("./flowNode").default} [parent]
|
|
4
|
+
*/
|
|
5
|
+
export function validateLinks(node: import("./flowNode").default, parent?: import("./flowNode").default): boolean;
|
|
6
|
+
/**
|
|
7
|
+
* Removes possible redundant CloneTransforms that were added during graph construction.
|
|
8
|
+
*
|
|
9
|
+
* @param {import("./flowNode").default} node
|
|
10
|
+
*/
|
|
11
|
+
export function removeRedundantCloneTransforms(node: import("./flowNode").default, cloneRequired?: boolean): void;
|
|
12
|
+
export function removeRedundantCollectors(): void;
|
|
13
|
+
export function combineAndPullCollectorsUp(): void;
|
|
14
|
+
/**
|
|
15
|
+
* @param {import("./dataFlow").default<any>} dataFlow
|
|
16
|
+
*/
|
|
17
|
+
export function combineIdenticalDataSources(dataFlow: import("./dataFlow").default<any>): void;
|
|
18
|
+
/**
|
|
19
|
+
*
|
|
20
|
+
* @param {import("./flowNode").default} root
|
|
21
|
+
*/
|
|
22
|
+
export function optimizeFlowGraph(root: import("./flowNode").default): void;
|
|
23
|
+
/**
|
|
24
|
+
* @param {import("./dataFlow").default<any>} dataFlow
|
|
25
|
+
*/
|
|
26
|
+
export function optimizeDataFlow(dataFlow: import("./dataFlow").default<any>): void;
|
|
27
|
+
//# sourceMappingURL=flowOptimizer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"flowOptimizer.d.ts","sourceRoot":"","sources":["../../../src/data/flowOptimizer.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH,oCAHW,OAAO,YAAY,EAAE,OAAO,WAC5B,OAAO,YAAY,EAAE,OAAO,WActC;AAED;;;;GAIG;AACH,qDAFW,OAAO,YAAY,EAAE,OAAO,iCAgCtC;AAED,kDAEC;AAED,mDAEC;AAmBD;;GAEG;AACH,sDAFW,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAwB3C;AAED;;;GAGG;AACH,wCAFW,OAAO,YAAY,EAAE,OAAO,QAStC;AAED;;GAEG;AACH,2CAFW,OAAO,YAAY,EAAE,OAAO,CAAC,GAAG,CAAC,QAQ3C"}
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { BEHAVIOR_CLONES, BEHAVIOR_COLLECTS } from "./flowNode";
|
|
2
|
+
import CloneTransform from "./transforms/clone";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* @param {import("./flowNode").default} node
|
|
6
|
+
* @param {import("./flowNode").default} [parent]
|
|
7
|
+
*/
|
|
8
|
+
export function validateLinks(node, parent = undefined) {
|
|
9
|
+
if (node.parent !== parent) {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
for (const child of node.children) {
|
|
14
|
+
if (!validateLinks(child, node)) {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
return true;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Removes possible redundant CloneTransforms that were added during graph construction.
|
|
24
|
+
*
|
|
25
|
+
* @param {import("./flowNode").default} node
|
|
26
|
+
*/
|
|
27
|
+
export function removeRedundantCloneTransforms(node, cloneRequired = false) {
|
|
28
|
+
if (node.behavior & BEHAVIOR_COLLECTS) {
|
|
29
|
+
// If an object is modified downstream of a collector, it must be cloned
|
|
30
|
+
cloneRequired = true;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
if (node instanceof CloneTransform) {
|
|
34
|
+
if (cloneRequired) {
|
|
35
|
+
cloneRequired = false;
|
|
36
|
+
} else {
|
|
37
|
+
const child = node.children[0];
|
|
38
|
+
node.excise();
|
|
39
|
+
if (child) {
|
|
40
|
+
removeRedundantCloneTransforms(child, cloneRequired);
|
|
41
|
+
}
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
if (node.behavior & BEHAVIOR_CLONES) {
|
|
47
|
+
cloneRequired = false;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
for (let i = 0, n = node.children.length; i < n; i++) {
|
|
51
|
+
// Clone transforms must be preserved at branches
|
|
52
|
+
removeRedundantCloneTransforms(
|
|
53
|
+
node.children[i],
|
|
54
|
+
cloneRequired || n > 1
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
export function removeRedundantCollectors() {
|
|
60
|
+
// TODO: Remove chained collectors, e.g., first collect and sort, then just collect
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function combineAndPullCollectorsUp() {
|
|
64
|
+
// TODO:
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// TODO: Combine identical branches to prevent redundant work
|
|
68
|
+
// Example:
|
|
69
|
+
//
|
|
70
|
+
// --B--C--D
|
|
71
|
+
// /
|
|
72
|
+
// --A----B--C--E
|
|
73
|
+
// \
|
|
74
|
+
// --F--G
|
|
75
|
+
//
|
|
76
|
+
// should become:
|
|
77
|
+
//
|
|
78
|
+
// --D
|
|
79
|
+
// /
|
|
80
|
+
// --A----B--C----E
|
|
81
|
+
// \
|
|
82
|
+
// --F--G
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* @param {import("./dataFlow").default<any>} dataFlow
|
|
86
|
+
*/
|
|
87
|
+
export function combineIdenticalDataSources(dataFlow) {
|
|
88
|
+
const dataSourceEntries = [...dataFlow._dataSourcesByHost.entries()];
|
|
89
|
+
|
|
90
|
+
/** @type {Map<string, import("./sources/dataSource").default>} */
|
|
91
|
+
const sourcesByIdentifiers = new Map();
|
|
92
|
+
for (const e of dataSourceEntries) {
|
|
93
|
+
const ds = e[1];
|
|
94
|
+
if (ds.identifier && !sourcesByIdentifiers.has(ds.identifier)) {
|
|
95
|
+
sourcesByIdentifiers.set(ds.identifier, ds);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
dataFlow._dataSourcesByHost.clear();
|
|
100
|
+
|
|
101
|
+
for (let [key, dataSource] of dataSourceEntries) {
|
|
102
|
+
const target = sourcesByIdentifiers.get(dataSource.identifier);
|
|
103
|
+
if (target) {
|
|
104
|
+
target.adoptChildrenOf(dataSource);
|
|
105
|
+
dataSource = target;
|
|
106
|
+
}
|
|
107
|
+
dataFlow.addDataSource(dataSource, key);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
*
|
|
113
|
+
* @param {import("./flowNode").default} root
|
|
114
|
+
*/
|
|
115
|
+
export function optimizeFlowGraph(root) {
|
|
116
|
+
removeRedundantCloneTransforms(root);
|
|
117
|
+
if (!validateLinks(root)) {
|
|
118
|
+
throw new Error(
|
|
119
|
+
"Encountered a bug! There's a problem in the data flow structure."
|
|
120
|
+
);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* @param {import("./dataFlow").default<any>} dataFlow
|
|
126
|
+
*/
|
|
127
|
+
export function optimizeDataFlow(dataFlow) {
|
|
128
|
+
for (const dataSource of dataFlow.dataSources) {
|
|
129
|
+
optimizeFlowGraph(dataSource);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
combineIdenticalDataSources(dataFlow);
|
|
133
|
+
}
|