@genome-spy/core 0.48.2 → 0.50.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/index.es.js +7434 -7107
- package/dist/bundle/index.js +116 -103
- package/dist/schema.json +3975 -2819
- package/dist/src/data/collector.test.d.ts +2 -0
- package/dist/src/data/collector.test.d.ts.map +1 -0
- package/dist/src/data/dataFlow.test.d.ts +2 -0
- package/dist/src/data/dataFlow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.d.ts +2 -0
- package/dist/src/data/flow.test.d.ts.map +1 -0
- package/dist/src/data/flow.test.js +19 -14
- package/dist/src/data/flowNode.test.d.ts +2 -0
- package/dist/src/data/flowNode.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.d.ts +2 -0
- package/dist/src/data/flowOptimizer.test.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.test.js +9 -10
- package/dist/src/data/formats/fasta.test.d.ts +2 -0
- package/dist/src/data/formats/fasta.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.d.ts +2 -0
- package/dist/src/data/sources/inlineSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.test.js +23 -16
- package/dist/src/data/sources/sequenceSource.test.d.ts +2 -0
- package/dist/src/data/sources/sequenceSource.test.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.test.js +59 -42
- package/dist/src/data/transforms/clone.test.d.ts +2 -0
- package/dist/src/data/transforms/clone.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.d.ts +2 -0
- package/dist/src/data/transforms/coverage.test.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.test.js +1 -1
- package/dist/src/data/transforms/filter.d.ts +10 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -1
- package/dist/src/data/transforms/filter.js +30 -1
- package/dist/src/data/transforms/filter.test.d.ts +2 -0
- package/dist/src/data/transforms/filter.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.d.ts +2 -0
- package/dist/src/data/transforms/flatten.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.test.js +10 -7
- package/dist/src/data/transforms/flattenDelimited.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenDelimited.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +16 -13
- package/dist/src/data/transforms/flattenSequence.test.d.ts +2 -0
- package/dist/src/data/transforms/flattenSequence.test.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.test.js +1 -1
- package/dist/src/data/transforms/formula.test.d.ts +2 -0
- package/dist/src/data/transforms/formula.test.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.test.js +1 -1
- package/dist/src/data/transforms/identifier.test.d.ts +2 -0
- package/dist/src/data/transforms/identifier.test.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.test.d.ts +2 -0
- package/dist/src/data/transforms/pileup.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.d.ts +2 -0
- package/dist/src/data/transforms/project.test.d.ts.map +1 -0
- package/dist/src/data/transforms/project.test.js +1 -1
- package/dist/src/data/transforms/regexExtract.test.d.ts +2 -0
- package/dist/src/data/transforms/regexExtract.test.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.test.js +6 -3
- package/dist/src/data/transforms/regexFold.test.d.ts +2 -0
- package/dist/src/data/transforms/regexFold.test.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.test.d.ts +2 -0
- package/dist/src/data/transforms/sample.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.d.ts +2 -0
- package/dist/src/data/transforms/stack.test.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.test.js +8 -8
- package/dist/src/encoder/accessor.d.ts +17 -14
- package/dist/src/encoder/accessor.d.ts.map +1 -1
- package/dist/src/encoder/accessor.js +127 -56
- package/dist/src/encoder/accessor.test.d.ts +2 -0
- package/dist/src/encoder/accessor.test.d.ts.map +1 -0
- package/dist/src/encoder/accessor.test.js +145 -31
- package/dist/src/encoder/encoder.d.ts +26 -13
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +98 -114
- package/dist/src/encoder/encoder.test.d.ts +2 -0
- package/dist/src/encoder/encoder.test.d.ts.map +1 -0
- package/dist/src/encoder/encoder.test.js +85 -82
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -1
- package/dist/src/fonts/bmFontManager.js +10 -4
- package/dist/src/genome/genome.test.d.ts +2 -0
- package/dist/src/genome/genome.test.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.test.d.ts +2 -0
- package/dist/src/genome/scaleIndex.test.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.test.d.ts +2 -0
- package/dist/src/genome/scaleLocus.test.d.ts.map +1 -0
- package/dist/src/genomeSpy.d.ts +3 -2
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +15 -6
- package/dist/src/gl/dataToVertices.d.ts +6 -8
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +42 -33
- package/dist/src/gl/glslScaleGenerator.d.ts +84 -15
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
- package/dist/src/gl/glslScaleGenerator.js +260 -73
- package/dist/src/gl/includes/common.glsl.js +1 -1
- package/dist/src/marks/link.common.glsl.js +1 -1
- package/dist/src/marks/link.d.ts +8 -1
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.fragment.glsl.js +1 -1
- package/dist/src/marks/link.js +47 -31
- package/dist/src/marks/link.vertex.glsl.js +1 -1
- package/dist/src/marks/mark.d.ts +24 -25
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +246 -118
- package/dist/src/marks/markUtils.d.ts +25 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -1
- package/dist/src/marks/markUtils.js +41 -1
- package/dist/src/marks/point.common.glsl.js +1 -1
- package/dist/src/marks/point.d.ts +8 -1
- package/dist/src/marks/point.d.ts.map +1 -1
- package/dist/src/marks/point.js +34 -25
- package/dist/src/marks/point.vertex.glsl.js +1 -1
- package/dist/src/marks/rect.d.ts +8 -1
- package/dist/src/marks/rect.d.ts.map +1 -1
- package/dist/src/marks/rect.js +28 -23
- package/dist/src/marks/rule.d.ts +8 -1
- package/dist/src/marks/rule.d.ts.map +1 -1
- package/dist/src/marks/rule.js +23 -16
- package/dist/src/marks/text.d.ts +10 -1
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.fragment.glsl.js +1 -1
- package/dist/src/marks/text.js +53 -47
- package/dist/src/marks/text.vertex.glsl.js +1 -1
- package/dist/src/scale/scale.test.d.ts +2 -0
- package/dist/src/scale/scale.test.d.ts.map +1 -0
- package/dist/src/scale/scale.test.js +2 -0
- package/dist/src/scale/ticks.test.d.ts +2 -0
- package/dist/src/scale/ticks.test.d.ts.map +1 -0
- package/dist/src/scale/ticks.test.js +6 -0
- package/dist/src/selection/selection.d.ts +39 -0
- package/dist/src/selection/selection.d.ts.map +1 -0
- package/dist/src/selection/selection.js +78 -0
- package/dist/src/spec/channel.d.ts +150 -83
- package/dist/src/spec/mark.d.ts +133 -78
- package/dist/src/spec/parameter.d.ts +112 -3
- package/dist/src/spec/root.d.ts +0 -1
- package/dist/src/spec/transform.d.ts +19 -1
- package/dist/src/spec/view.d.ts +5 -10
- package/dist/src/tooltip/dataTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -1
- package/dist/src/tooltip/dataTooltipHandler.js +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +1 -1
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -1
- package/dist/src/types/encoder.d.ts +80 -26
- package/dist/src/types/rendering.d.ts +1 -0
- package/dist/src/types/selectionTypes.d.ts +44 -0
- package/dist/src/types/viewContext.d.ts +1 -4
- package/dist/src/utils/addBaseUrl.test.d.ts +2 -0
- package/dist/src/utils/addBaseUrl.test.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.test.d.ts +2 -0
- package/dist/src/utils/binnedIndex.test.d.ts.map +1 -0
- package/dist/src/utils/cloner.test.d.ts +2 -0
- package/dist/src/utils/cloner.test.d.ts.map +1 -0
- package/dist/src/utils/coalesce.test.d.ts +2 -0
- package/dist/src/utils/coalesce.test.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.test.d.ts +2 -0
- package/dist/src/utils/concatIterables.test.d.ts.map +1 -0
- package/dist/src/utils/domainArray.test.d.ts +2 -0
- package/dist/src/utils/domainArray.test.d.ts.map +1 -0
- 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 +11 -2
- package/dist/src/utils/indexer.test.d.ts +2 -0
- package/dist/src/utils/indexer.test.d.ts.map +1 -0
- package/dist/src/utils/inputBinding.d.ts.map +1 -1
- package/dist/src/utils/inputBinding.js +4 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts +2 -0
- package/dist/src/utils/iterateNestedMaps.test.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.test.d.ts +2 -0
- package/dist/src/utils/kWayMerge.test.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.test.d.ts +2 -0
- package/dist/src/utils/mergeObjects.test.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.test.d.ts +2 -0
- package/dist/src/utils/numberExtractor.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.test.d.ts +2 -0
- package/dist/src/utils/propertyCacher.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts +2 -0
- package/dist/src/utils/propertyCoalescer.test.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.test.js +3 -0
- package/dist/src/utils/radixSort.test.d.ts +2 -0
- package/dist/src/utils/radixSort.test.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.test.d.ts +2 -0
- package/dist/src/utils/reservationMap.test.d.ts.map +1 -0
- package/dist/src/utils/ringBuffer.test.d.ts +2 -0
- package/dist/src/utils/ringBuffer.test.d.ts.map +1 -0
- package/dist/src/utils/topK.test.d.ts +2 -0
- package/dist/src/utils/topK.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.d.ts +2 -0
- package/dist/src/utils/trees.test.d.ts.map +1 -0
- package/dist/src/utils/trees.test.js +8 -3
- package/dist/src/utils/variableTools.test.d.ts +2 -0
- package/dist/src/utils/variableTools.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.d.ts +19 -6
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +16 -7
- package/dist/src/view/axisResolution.test.d.ts +2 -0
- package/dist/src/view/axisResolution.test.d.ts.map +1 -0
- package/dist/src/view/axisResolution.test.js +16 -11
- package/dist/src/view/axisView.js +2 -2
- package/dist/src/view/facetView.d.ts +1 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.d.ts +1 -1
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +34 -5
- package/dist/src/view/flowBuilder.test.d.ts +2 -0
- package/dist/src/view/flowBuilder.test.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.test.js +1 -1
- package/dist/src/view/gridView.d.ts +0 -6
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView.js +1 -1
- package/dist/src/view/layerView.d.ts +0 -6
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layout/flexLayout.test.d.ts +2 -0
- package/dist/src/view/layout/flexLayout.test.d.ts.map +1 -0
- package/dist/src/view/layout/grid.test.d.ts +2 -0
- package/dist/src/view/layout/grid.test.d.ts.map +1 -0
- package/dist/src/view/layout/rectangle.test.d.ts +2 -0
- package/dist/src/view/layout/rectangle.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.d.ts +39 -5
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +120 -9
- package/dist/src/view/paramMediator.test.d.ts +2 -0
- package/dist/src/view/paramMediator.test.d.ts.map +1 -0
- package/dist/src/view/paramMediator.test.js +37 -1
- package/dist/src/view/scaleResolution.d.ts +17 -15
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +70 -68
- package/dist/src/view/scaleResolution.test.d.ts +2 -0
- package/dist/src/view/scaleResolution.test.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.test.js +2 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +15 -3
- package/dist/src/view/unitView.d.ts +8 -20
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +100 -102
- package/dist/src/view/view.d.ts +1 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.test.d.ts +2 -0
- package/dist/src/view/view.test.d.ts.map +1 -0
- package/dist/src/view/view.test.js +73 -55
- package/dist/src/view/viewFactory.test.d.ts +2 -0
- package/dist/src/view/viewFactory.test.d.ts.map +1 -0
- package/dist/src/view/viewFactory.test.js +2 -2
- package/dist/src/view/viewUtils.d.ts +1 -1
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/zoom.js +2 -2
- package/package.json +5 -2
|
@@ -3,20 +3,23 @@
|
|
|
3
3
|
*
|
|
4
4
|
* TODO: This method should have a test. But how to mock Mark...
|
|
5
5
|
*
|
|
6
|
-
* @param {import("../
|
|
7
|
-
* @param {import("../spec/channel.js").Encoding}
|
|
6
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
7
|
+
* @param {import("../spec/channel.js").Encoding} encoding
|
|
8
8
|
* @returns {Partial<Record<Channel, Encoder>>}
|
|
9
9
|
*/
|
|
10
|
-
export default function createEncoders(
|
|
10
|
+
export default function createEncoders(unitView: import("../view/unitView.js").default, encoding: import("../spec/channel.js").Encoding): Partial<Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>>;
|
|
11
|
+
/**
|
|
12
|
+
* @param {import("../types/encoder.js").Accessor[]} accessors
|
|
13
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
14
|
+
* @returns {Encoder}
|
|
15
|
+
*/
|
|
16
|
+
export function createSimpleOrConditionalEncoder(accessors: import("../types/encoder.js").Accessor[], scaleSource: (channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale): import("../types/encoder.js").Encoder;
|
|
11
17
|
/**
|
|
12
|
-
* @param {import("../marks/mark.js").default} mark
|
|
13
|
-
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
14
|
-
* @param {any} scale
|
|
15
18
|
* @param {Accessor} accessor
|
|
16
|
-
* @param {
|
|
19
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
17
20
|
* @returns {Encoder}
|
|
18
21
|
*/
|
|
19
|
-
export function createEncoder(
|
|
22
|
+
export function createEncoder(accessor: import("../types/encoder.js").Accessor<import("../spec/channel.js").Scalar>, scaleSource: (channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale): import("../types/encoder.js").Encoder;
|
|
20
23
|
/**
|
|
21
24
|
* TODO: Move to a more generic place
|
|
22
25
|
*
|
|
@@ -26,14 +29,14 @@ export function createEncoder(mark: import("../marks/mark.js").default, channelD
|
|
|
26
29
|
export function isValueDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").ValueDef<import("../spec/channel.js").Scalar>;
|
|
27
30
|
/**
|
|
28
31
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
29
|
-
* @returns {channelDef is import("../spec/channel.js").FieldDefBase
|
|
32
|
+
* @returns {channelDef is import("../spec/channel.js").FieldDefBase}
|
|
30
33
|
*/
|
|
31
|
-
export function isFieldDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").FieldDefBase
|
|
34
|
+
export function isFieldDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").FieldDefBase;
|
|
32
35
|
/**
|
|
33
36
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
34
37
|
* @returns {channelDef is import("../spec/channel.js").DatumDef}
|
|
35
38
|
*/
|
|
36
|
-
export function isDatumDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").DatumDef
|
|
39
|
+
export function isDatumDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").DatumDef<import("../spec/parameter.js").ExprRef | import("../spec/channel.js").Scalar>;
|
|
37
40
|
/**
|
|
38
41
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
39
42
|
* @returns {channelDef is import("../spec/channel.js").ChannelDefWithScale}
|
|
@@ -43,7 +46,7 @@ export function isChannelDefWithScale(channelDef: import("../spec/channel.js").C
|
|
|
43
46
|
* @param {import("../view/unitView.js").default} view
|
|
44
47
|
* @param {import("../spec/channel.js").Channel} channel
|
|
45
48
|
*/
|
|
46
|
-
export function getChannelDefWithScale(view: import("../view/unitView.js").default, channel: import("../spec/channel.js").Channel): import("../spec/channel.js").
|
|
49
|
+
export function getChannelDefWithScale(view: import("../view/unitView.js").default, channel: import("../spec/channel.js").Channel): import("../spec/channel.js").FieldOrDatumDefWithCondition<import("../spec/channel.js").MarkPropFieldDef<import("../spec/channel.js").Type>, string> | import("../spec/channel.js").PositionFieldDef | import("../spec/channel.js").PositionDatumDef | import("../spec/channel.js").ChromPosDef | import("../spec/channel.js").FieldOrDatumDefWithCondition<import("../spec/channel.js").MarkPropFieldDef<import("../spec/channel.js").Type>, number> | import("../spec/channel.js").FieldOrDatumDefWithCondition<import("../spec/channel.js").MarkPropFieldDef<import("../spec/channel.js").TypeForShape>, string> | (import("../spec/channel.js").FieldDefBase & import("../spec/channel.js").TitleMixins & import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type> & import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").XIndexDef) | (import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").DatumDef<import("../spec/parameter.js").ExprRef | import("../spec/channel.js").Scalar> & import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type> & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").XIndexDef) | (import("../spec/channel.js").ChromPosDefBase & import("../spec/channel.js").TitleMixins & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").TypeMixins<"locus"> & import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").XIndexDef);
|
|
47
50
|
/**
|
|
48
51
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
49
52
|
* @returns {channelDef is import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type>}
|
|
@@ -59,6 +62,16 @@ export function isChromPosDef(channelDef: import("../spec/channel.js").ChannelDe
|
|
|
59
62
|
* @returns {channelDef is import("../spec/channel.js").ExprDef}
|
|
60
63
|
*/
|
|
61
64
|
export function isExprDef(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").ExprDef;
|
|
65
|
+
/**
|
|
66
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
67
|
+
* @returns {channelDef is import("../spec/channel.js").FieldOrDatumDefWithCondition}
|
|
68
|
+
*/
|
|
69
|
+
export function isFieldOrDatumDefWithCondition(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").FieldOrDatumDefWithCondition<import("../spec/channel.js").FieldDef<any> | import("../spec/channel.js").DatumDef<any>, import("../spec/channel.js").Value>;
|
|
70
|
+
/**
|
|
71
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
72
|
+
* @returns {channelDef is import("../spec/channel.js").ValueDefWithCondition}
|
|
73
|
+
*/
|
|
74
|
+
export function isValueDefWithCondition(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").ValueDefWithCondition<import("../spec/channel.js").Value>;
|
|
62
75
|
/**
|
|
63
76
|
* @param {import("../spec/channel.js").Channel} channel
|
|
64
77
|
* @returns {channel is import("../spec/channel.js").PrimaryPositionalChannel}
|
|
@@ -92,7 +105,7 @@ export function getPrimaryChannel(channel: import("../spec/channel.js").Channel)
|
|
|
92
105
|
*
|
|
93
106
|
* @param {import("../spec/channel.js").Channel} channel
|
|
94
107
|
*/
|
|
95
|
-
export function getChannelWithSecondarys(channel: import("../spec/channel.js").Channel):
|
|
108
|
+
export function getChannelWithSecondarys(channel: import("../spec/channel.js").Channel): ("search" | "fill" | "stroke" | "angle" | "sample" | "color" | "fillOpacity" | "opacity" | "strokeOpacity" | "strokeWidth" | "text" | "size" | "x" | "y" | "x2" | "y2" | "shape" | "dx" | "dy" | "uniqueId" | "facetIndex" | "semanticScore")[];
|
|
96
109
|
/**
|
|
97
110
|
* @param {import("../spec/channel.js").Channel} channel
|
|
98
111
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.js"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,iDAJW,OAAO,qBAAqB,EAAE,OAAO,YACrC,OAAO,oBAAoB,EAAE,QAAQ,gGAgC/C;AAED;;;;GAIG;AACH,4DAJW,OAAO,qBAAqB,EAAE,QAAQ,EAAE,yBAC9B,OAAO,oBAAoB,EAAE,gBAAgB,KAAK,OAAO,qBAAqB,EAAE,SAAS,yCAqC7G;AAED;;;;GAIG;AACH,4IAHqB,OAAO,oBAAoB,EAAE,gBAAgB,KAAK,OAAO,qBAAqB,EAAE,SAAS,yCAqC7G;AAED;;;;;GAKG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,4FAKjD;AAED;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,2DAKjD;AAED;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,qIAKjD;AAED;;;GAGG;AACH,kDAHW,OAAO,oBAAoB,EAAE,UAAU,kEAWjD;AAED;;;GAGG;AACH,6CAHW,OAAO,qBAAqB,EAAE,OAAO,WACrC,OAAO,oBAAoB,EAAE,OAAO,s9CAS9C;AAED;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,UAAU,4FAKjD;AAED;;;GAGG;AACH,0CAHW,OAAO,oBAAoB,EAAE,UAAU,0DAKjD;AAED;;;GAGG;AACH,sCAHW,OAAO,oBAAoB,EAAE,UAAU,sDAKjD;AAED;;;GAGG;AACH,2DAHW,OAAO,oBAAoB,EAAE,UAAU,wMAQjD;AAED;;;GAGG;AACH,oDAHW,OAAO,oBAAoB,EAAE,UAAU,wGAKjD;AAoBD;;;GAGG;AACH,oDAHW,OAAO,oBAAoB,EAAE,OAAO,oEAM9C;AAED;;;GAGG;AACH,6CAHW,OAAO,oBAAoB,EAAE,OAAO,6DAM9C;AAqBD;;;GAGG;AACH,4CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,oDAFW,OAAO,oBAAoB,EAAE,OAAO,2DAS9C;AAED;;;;;GAKG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,wCAI9C;AAED;;;;GAIG;AACH,kDAFW,OAAO,oBAAoB,EAAE,OAAO,mPAM9C;AAED;;GAEG;AACH,wCAFW,OAAO,oBAAoB,EAAE,OAAO,WAI9C;AAED;;;;GAIG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,WAI9C;AAED;;;GAGG;AACH,4CAHW,OAAO,oBAAoB,EAAE,OAAO,4DAsB9C;AAED;;;;;GAKG;AACH,0CAHW,OAAO,oBAAoB,EAAE,OAAO,GAClC,GAAG,EAAE,CAsBjB;AAED;;;GAGG;AACH,gDAHW,OAAO,oBAAoB,EAAE,OAAO,UACzB,GAAG,KAAE,MAAM,CAmBhC;AA5LD;;GAEG;AACH,wCAFU,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,CAEb;AAEpD;;GAEG;AACH,0CAFU,OAAO,oBAAoB,EAAE,0BAA0B,EAAE,CAEX;AAExD;;GAEG;AACH,iCAFU,OAAO,oBAAoB,EAAE,iBAAiB,EAAE,CAKxD;AAoBF;;;;GAIG;AACH,gCAFU,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,oBAAoB,EAAE,0BAA0B,CAAC,CAAC,CAKtH;AAEF;;;;GAIG;AACH,8BAFU,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAInG"}
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import createIndexer from "../utils/indexer.js";
|
|
3
|
-
import scaleNull from "../utils/scaleNull.js";
|
|
4
|
-
import { isExprRef } from "../view/paramMediator.js";
|
|
1
|
+
import { createConditionalAccessors } from "./accessor.js";
|
|
5
2
|
|
|
6
3
|
/**
|
|
7
4
|
* Creates an object that contains encoders for every channel of a mark
|
|
8
5
|
*
|
|
9
6
|
* TODO: This method should have a test. But how to mock Mark...
|
|
10
7
|
*
|
|
11
|
-
* @param {import("../
|
|
12
|
-
* @param {import("../spec/channel.js").Encoding}
|
|
8
|
+
* @param {import("../view/unitView.js").default} unitView
|
|
9
|
+
* @param {import("../spec/channel.js").Encoding} encoding
|
|
13
10
|
* @returns {Partial<Record<Channel, Encoder>>}
|
|
14
11
|
*/
|
|
15
|
-
export default function createEncoders(
|
|
12
|
+
export default function createEncoders(unitView, encoding) {
|
|
16
13
|
/**
|
|
17
14
|
* @typedef {import("../spec/channel.js").Channel} Channel
|
|
18
15
|
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
@@ -21,29 +18,22 @@ export default function createEncoders(mark, encoding) {
|
|
|
21
18
|
/** @type {Partial<Record<Channel, Encoder>>} */
|
|
22
19
|
const encoders = {};
|
|
23
20
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
21
|
+
const scaleSource = (
|
|
22
|
+
/** @type {import("../spec/channel.js").ChannelWithScale}*/ channel
|
|
23
|
+
) => unitView.getScaleResolution(channel)?.scale;
|
|
27
24
|
|
|
28
25
|
for (const [channel, channelDef] of Object.entries(encoding)) {
|
|
29
26
|
if (!channelDef) {
|
|
30
27
|
continue;
|
|
31
28
|
}
|
|
32
29
|
|
|
33
|
-
|
|
34
|
-
(
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
encoders[channel] = createEncoder(
|
|
42
|
-
mark,
|
|
43
|
-
encoding[channel],
|
|
44
|
-
resolution?.scale,
|
|
45
|
-
mark.unitView.getAccessor(channel),
|
|
46
|
-
channel
|
|
30
|
+
encoders[channel] = createSimpleOrConditionalEncoder(
|
|
31
|
+
createConditionalAccessors(
|
|
32
|
+
channel,
|
|
33
|
+
channelDef,
|
|
34
|
+
unitView.paramMediator
|
|
35
|
+
),
|
|
36
|
+
scaleSource
|
|
47
37
|
);
|
|
48
38
|
}
|
|
49
39
|
|
|
@@ -51,109 +41,85 @@ export default function createEncoders(mark, encoding) {
|
|
|
51
41
|
}
|
|
52
42
|
|
|
53
43
|
/**
|
|
54
|
-
* @param {import("../
|
|
55
|
-
* @param {import("../spec/channel.js").
|
|
56
|
-
* @param {any} scale
|
|
57
|
-
* @param {Accessor} accessor
|
|
58
|
-
* @param {Channel} channel
|
|
44
|
+
* @param {import("../types/encoder.js").Accessor[]} accessors
|
|
45
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
59
46
|
* @returns {Encoder}
|
|
60
47
|
*/
|
|
61
|
-
export function
|
|
48
|
+
export function createSimpleOrConditionalEncoder(accessors, scaleSource) {
|
|
62
49
|
/**
|
|
63
|
-
* @typedef {import("../spec/channel.js").Channel} Channel
|
|
64
50
|
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
65
51
|
* @typedef {import("../types/encoder.js").Accessor} Accessor
|
|
52
|
+
* @typedef {import("../data/flowNode.js").Datum} Datum
|
|
66
53
|
*/
|
|
54
|
+
if (accessors.length === 1) {
|
|
55
|
+
return createEncoder(accessors[0], scaleSource);
|
|
56
|
+
}
|
|
67
57
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
encoder.constant = true;
|
|
78
|
-
encoder.constantValue = false;
|
|
79
|
-
encoder.accessor = accessor;
|
|
80
|
-
} else {
|
|
81
|
-
const value = channelDef.value;
|
|
82
|
-
encoder = /** @type {Encoder} */ ((datum) => value);
|
|
83
|
-
encoder.constant = true;
|
|
84
|
-
encoder.constantValue = true;
|
|
85
|
-
encoder.accessor = undefined;
|
|
86
|
-
}
|
|
87
|
-
} else if (accessor) {
|
|
88
|
-
if (channel == "text") {
|
|
89
|
-
// TODO: Define somewhere channels that don't use a scale
|
|
90
|
-
encoder = /** @type {Encoder} */ ((datum) => undefined);
|
|
91
|
-
encoder.accessor = accessor;
|
|
92
|
-
encoder.constant = accessor.constant;
|
|
93
|
-
} else {
|
|
94
|
-
if (!scale) {
|
|
95
|
-
if (!isChannelWithScale(channel)) {
|
|
96
|
-
// Channels like uniqueId are passed as is.
|
|
97
|
-
scale = scaleNull();
|
|
98
|
-
} else {
|
|
99
|
-
throw new Error(
|
|
100
|
-
`Missing scale! "${channel}": ${JSON.stringify(
|
|
101
|
-
channelDef
|
|
102
|
-
)}`
|
|
103
|
-
);
|
|
58
|
+
const predicates = accessors.map((a) => a.predicate);
|
|
59
|
+
|
|
60
|
+
const encoders = accessors.map((a) => createEncoder(a, scaleSource));
|
|
61
|
+
|
|
62
|
+
const encoder = Object.assign(
|
|
63
|
+
(/** @type {Datum} */ datum) => {
|
|
64
|
+
for (let i = 0; i < encoders.length; i++) {
|
|
65
|
+
if (predicates[i](datum)) {
|
|
66
|
+
return encoders[i](datum);
|
|
104
67
|
}
|
|
105
68
|
}
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
constant: false,
|
|
72
|
+
accessors: /** @type {Accessor[]} */ (
|
|
73
|
+
encoders.map((e) => e.accessors[0])
|
|
74
|
+
),
|
|
75
|
+
dataAccessor: encoders.map((e) => e.dataAccessor).find((a) => a),
|
|
76
|
+
scale: encoders.map((e) => e.scale).find((s) => s),
|
|
77
|
+
channelDef: accessors.at(-1).channelDef,
|
|
78
|
+
}
|
|
79
|
+
);
|
|
106
80
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
);
|
|
110
|
-
|
|
111
|
-
if (isDiscrete(scale.type)) {
|
|
112
|
-
// TODO: pass the found values back to the scale/resolution
|
|
113
|
-
const indexer = createIndexer();
|
|
114
|
-
// Warning: There's a chance that the domain and indexer get out of sync.
|
|
115
|
-
// TODO: Make this more robust
|
|
116
|
-
indexer.addAll(scale.domain());
|
|
117
|
-
encoder.indexer = indexer;
|
|
118
|
-
}
|
|
81
|
+
return encoder;
|
|
82
|
+
}
|
|
119
83
|
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
84
|
+
/**
|
|
85
|
+
* @param {Accessor} accessor
|
|
86
|
+
* @param {(channel: import("../spec/channel.js").ChannelWithScale) => import("../types/encoder.js").VegaScale} scaleSource
|
|
87
|
+
* @returns {Encoder}
|
|
88
|
+
*/
|
|
89
|
+
export function createEncoder(accessor, scaleSource) {
|
|
90
|
+
/**
|
|
91
|
+
* @typedef {import("../types/encoder.js").Encoder} Encoder
|
|
92
|
+
* @typedef {import("../types/encoder.js").Accessor} Accessor
|
|
93
|
+
* @typedef {import("../data/flowNode.js").Datum} Datum
|
|
94
|
+
*/
|
|
95
|
+
|
|
96
|
+
const { channel, scaleChannel, channelDef } = accessor;
|
|
97
|
+
|
|
98
|
+
const scale = accessor.scaleChannel ? scaleSource(scaleChannel) : undefined;
|
|
99
|
+
|
|
100
|
+
if (scaleChannel && !scale) {
|
|
125
101
|
throw new Error(
|
|
126
|
-
`Missing
|
|
127
|
-
channelDef
|
|
128
|
-
)}`
|
|
102
|
+
`Missing scale! "${channel}": ${JSON.stringify(channelDef)}`
|
|
129
103
|
);
|
|
130
104
|
}
|
|
131
105
|
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
for (const prop in encoder) {
|
|
148
|
-
if (prop in encoder) {
|
|
149
|
-
// @ts-ignore
|
|
150
|
-
target[prop] = encoder[prop];
|
|
151
|
-
}
|
|
106
|
+
return Object.assign(
|
|
107
|
+
scale
|
|
108
|
+
? (/** @type {Datum} */ datum) =>
|
|
109
|
+
scale(
|
|
110
|
+
// @ts-ignore Bad d3 types
|
|
111
|
+
accessor(datum)
|
|
112
|
+
)
|
|
113
|
+
: (/** @type {Datum} */ datum) => accessor(datum),
|
|
114
|
+
{
|
|
115
|
+
scale,
|
|
116
|
+
constant: accessor.constant,
|
|
117
|
+
accessors: [accessor],
|
|
118
|
+
dataAccessor: accessor.constant ? undefined : accessor,
|
|
119
|
+
// TODO: Accessor already has the channelDef
|
|
120
|
+
channelDef,
|
|
152
121
|
}
|
|
153
|
-
|
|
154
|
-
};
|
|
155
|
-
|
|
156
|
-
return encoder;
|
|
122
|
+
);
|
|
157
123
|
}
|
|
158
124
|
|
|
159
125
|
/**
|
|
@@ -168,7 +134,7 @@ export function isValueDef(channelDef) {
|
|
|
168
134
|
|
|
169
135
|
/**
|
|
170
136
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
171
|
-
* @returns {channelDef is import("../spec/channel.js").FieldDefBase
|
|
137
|
+
* @returns {channelDef is import("../spec/channel.js").FieldDefBase}
|
|
172
138
|
*/
|
|
173
139
|
export function isFieldDef(channelDef) {
|
|
174
140
|
return channelDef && "field" in channelDef;
|
|
@@ -233,6 +199,25 @@ export function isExprDef(channelDef) {
|
|
|
233
199
|
return channelDef && "expr" in channelDef;
|
|
234
200
|
}
|
|
235
201
|
|
|
202
|
+
/**
|
|
203
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
204
|
+
* @returns {channelDef is import("../spec/channel.js").FieldOrDatumDefWithCondition}
|
|
205
|
+
*/
|
|
206
|
+
export function isFieldOrDatumDefWithCondition(channelDef) {
|
|
207
|
+
return (
|
|
208
|
+
(isFieldDef(channelDef) || isDatumDef(channelDef)) &&
|
|
209
|
+
"condition" in channelDef
|
|
210
|
+
);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
/**
|
|
214
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
215
|
+
* @returns {channelDef is import("../spec/channel.js").ValueDefWithCondition}
|
|
216
|
+
*/
|
|
217
|
+
export function isValueDefWithCondition(channelDef) {
|
|
218
|
+
return isValueDef(channelDef) && "condition" in channelDef;
|
|
219
|
+
}
|
|
220
|
+
|
|
236
221
|
/**
|
|
237
222
|
* @type {import("../spec/channel.js").PrimaryPositionalChannel[]}
|
|
238
223
|
*/
|
|
@@ -344,7 +329,7 @@ export function isColorChannel(channel) {
|
|
|
344
329
|
* @param {import("../spec/channel.js").Channel} channel
|
|
345
330
|
*/
|
|
346
331
|
export function isDiscreteChannel(channel) {
|
|
347
|
-
return ["shape"
|
|
332
|
+
return ["shape"].includes(channel);
|
|
348
333
|
}
|
|
349
334
|
|
|
350
335
|
/**
|
|
@@ -369,7 +354,6 @@ export function isChannelWithScale(channel) {
|
|
|
369
354
|
"angle",
|
|
370
355
|
"dx",
|
|
371
356
|
"dy",
|
|
372
|
-
"sample",
|
|
373
357
|
].includes(channel);
|
|
374
358
|
}
|
|
375
359
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encoder.test.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.test.js"],"names":[],"mappings":""}
|
|
@@ -1,101 +1,104 @@
|
|
|
1
1
|
import { describe, expect, test } from "vitest";
|
|
2
|
-
import AccessorFactory from "./accessor.js";
|
|
3
|
-
import { scale as vegaScale } from "vega-scale";
|
|
4
2
|
|
|
5
|
-
import {
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
3
|
+
import { createAccessor, createConditionalAccessors } from "./accessor.js";
|
|
4
|
+
import ParamMediator from "../view/paramMediator.js";
|
|
5
|
+
import { createEncoder, createSimpleOrConditionalEncoder } from "./encoder.js";
|
|
6
|
+
import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
|
|
7
|
+
import { createSinglePointSelection } from "../selection/selection.js";
|
|
8
|
+
import { isArray } from "vega-util";
|
|
9
|
+
import { scaleLinear } from "d3-scale";
|
|
10
|
+
|
|
11
|
+
/** @type {import("../spec/channel.js").Encoding} */
|
|
12
|
+
const encoding = {
|
|
13
|
+
x: { value: 42 },
|
|
14
|
+
y: {
|
|
15
|
+
field: "a",
|
|
16
|
+
type: "quantitative",
|
|
17
|
+
scale: { domain: [0, 100], range: [0, 1] },
|
|
18
|
+
},
|
|
19
|
+
size: {
|
|
20
|
+
field: "a",
|
|
21
|
+
type: "quantitative",
|
|
22
|
+
scale: { domain: [0, 100], range: [0, 10] },
|
|
23
|
+
condition: {
|
|
24
|
+
param: "p",
|
|
25
|
+
empty: false,
|
|
26
|
+
value: 5000,
|
|
27
|
+
},
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const scaleSource = (
|
|
32
|
+
/** @type {import("../spec/channel.js").ChannelWithScale} */ channel
|
|
33
|
+
) => {
|
|
34
|
+
// @ts-ignore
|
|
35
|
+
const props = encoding[channel].scale ?? encoding[channel].condition?.scale;
|
|
36
|
+
|
|
37
|
+
return Object.assign(
|
|
38
|
+
scaleLinear().domain(props.domain).range(props.range),
|
|
39
|
+
{
|
|
40
|
+
type: "linear",
|
|
38
41
|
}
|
|
39
|
-
|
|
40
|
-
|
|
42
|
+
);
|
|
43
|
+
};
|
|
41
44
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
45
|
+
const datum = {
|
|
46
|
+
a: 100,
|
|
47
|
+
b: 6,
|
|
48
|
+
c: "Pink Floyd",
|
|
49
|
+
[UNIQUE_ID_KEY]: 1234,
|
|
50
|
+
};
|
|
47
51
|
|
|
48
|
-
|
|
49
|
-
|
|
52
|
+
describe("Encoder", () => {
|
|
53
|
+
const pm = new ParamMediator();
|
|
54
|
+
/** @type {Partial<Record<import("../spec/channel.js").Channel, import("../types/encoder.js").Encoder>>} */
|
|
55
|
+
const e = Object.fromEntries(
|
|
56
|
+
Object.entries(encoding).map(([channel, channelDef]) => {
|
|
57
|
+
const accessor = createAccessor(channel, channelDef, pm);
|
|
58
|
+
return [channel, createEncoder(accessor, scaleSource)];
|
|
59
|
+
})
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
test("has a single accessors", () => {
|
|
63
|
+
expect(e.x.accessors?.length).toBe(1);
|
|
64
|
+
});
|
|
50
65
|
|
|
51
|
-
|
|
66
|
+
test("provides a data accessor for a FieldDef", () =>
|
|
67
|
+
expect(e.y.dataAccessor.fields).toContain("a"));
|
|
52
68
|
|
|
53
|
-
test("
|
|
54
|
-
expect(
|
|
55
|
-
["x", "y", "z", "size"].every(
|
|
56
|
-
(channel) => typeof encoders[channel] === "function"
|
|
57
|
-
)
|
|
58
|
-
).toBeTruthy());
|
|
69
|
+
test("doesn't provide a data accessor for a ValueDef", () =>
|
|
70
|
+
expect(e.x.dataAccessor).toBeUndefined());
|
|
59
71
|
|
|
60
|
-
test("
|
|
72
|
+
test("returns a value", () => expect(e.x(datum)).toEqual(42));
|
|
61
73
|
|
|
62
|
-
test("
|
|
63
|
-
expect(encoders.z(datum)).toBeCloseTo(0.1));
|
|
74
|
+
test("accesses a field and uses a scale", () => expect(e.y(datum)).toBe(1));
|
|
64
75
|
|
|
65
|
-
|
|
66
|
-
|
|
76
|
+
// TODO: Text ExprRef
|
|
77
|
+
});
|
|
67
78
|
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
*/
|
|
79
|
+
describe("Conditional encoder with a field and a conditional value", () => {
|
|
80
|
+
const pm = new ParamMediator();
|
|
81
|
+
const setter = pm.allocateSetter("p", createSinglePointSelection(null));
|
|
72
82
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
});
|
|
83
|
+
const e = createSimpleOrConditionalEncoder(
|
|
84
|
+
createConditionalAccessors("size", encoding.size, pm),
|
|
85
|
+
scaleSource
|
|
86
|
+
);
|
|
78
87
|
|
|
79
|
-
test("
|
|
80
|
-
expect(
|
|
81
|
-
expect(encoders.z.constantValue).toBeFalsy();
|
|
82
|
-
expect(encoders.size.constantValue).toBeTruthy();
|
|
88
|
+
test("has multiple accessors", () => {
|
|
89
|
+
expect(e.accessors.length).toBe(2);
|
|
83
90
|
});
|
|
84
91
|
|
|
85
|
-
test("
|
|
86
|
-
expect(
|
|
87
|
-
expect(encoders.z.invert(0.5)).toBeCloseTo(10);
|
|
88
|
-
// A value, no scale, can't invert
|
|
89
|
-
expect(() => encoders.size.invert(123)).toThrow();
|
|
90
|
-
});
|
|
92
|
+
test("accesses the field using the dataAccessor", () =>
|
|
93
|
+
expect(e.dataAccessor(datum)).toBe(100));
|
|
91
94
|
|
|
92
|
-
test("
|
|
93
|
-
|
|
94
|
-
expect(
|
|
95
|
-
expect(encoders.x.accessor).toBeUndefined();
|
|
95
|
+
test("encodes the default when a predicate is false", () => {
|
|
96
|
+
setter(createSinglePointSelection(null));
|
|
97
|
+
expect(e(datum)).toBe(10);
|
|
96
98
|
});
|
|
97
99
|
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
test("encodes the conditional value when a predicate is true", () => {
|
|
101
|
+
setter(createSinglePointSelection(datum));
|
|
102
|
+
expect(e(datum)).toBe(5000);
|
|
103
|
+
});
|
|
101
104
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bmFontManager.d.ts","sourceRoot":"","sources":["../../../src/fonts/bmFontManager.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;OAEG;IACH,0BAFW,OAAO,sBAAsB,EAAE,OAAO,EAgChD;IA7BG,qDAA+B;IAE/B,uBACiF;IAEjF;;OAEG;IACH,QAFU,IAAI,OAAO,EAAE,SAAS,CAAC,CAEc;IAE/C,8DAA8D;IAC9D,mBADW,IAAI,MAAM,EAAE,QAAQ,uBAAuB,EAAE,CAAC,CAAC,CACxB;IAElC,kDAAkD;IAClD,eADW,IAAI,MAAM,EAAE,QAAQ,aAAa,CAAC,CAAC,CAChB;IAE9B,uEAAuE;IACvE,WADW,QAAQ,IAAI,CAAC,EAAE,CACP;IAEnB;;;OAGG;IACH,mBAFU,SAAS,CAOlB;IAGL,gCAEC;IAED;;;;;;OAMG;IACH,gBALW,MAAM,UACN,SAAS,WACT,UAAU,GAAG;;;;;;;;KAAa,GACxB,SAAS,CAyBrB;IAED;;;;OAIG;IACH,0BAHW,SAAS,OACT,OAAO,
|
|
1
|
+
{"version":3,"file":"bmFontManager.d.ts","sourceRoot":"","sources":["../../../src/fonts/bmFontManager.js"],"names":[],"mappings":"AAiBA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH;IACI;;OAEG;IACH,0BAFW,OAAO,sBAAsB,EAAE,OAAO,EAgChD;IA7BG,qDAA+B;IAE/B,uBACiF;IAEjF;;OAEG;IACH,QAFU,IAAI,OAAO,EAAE,SAAS,CAAC,CAEc;IAE/C,8DAA8D;IAC9D,mBADW,IAAI,MAAM,EAAE,QAAQ,uBAAuB,EAAE,CAAC,CAAC,CACxB;IAElC,kDAAkD;IAClD,eADW,IAAI,MAAM,EAAE,QAAQ,aAAa,CAAC,CAAC,CAChB;IAE9B,uEAAuE;IACvE,WADW,QAAQ,IAAI,CAAC,EAAE,CACP;IAEnB;;;OAGG;IACH,mBAFU,SAAS,CAOlB;IAGL,gCAEC;IAED;;;;;;OAMG;IACH,gBALW,MAAM,UACN,SAAS,WACT,UAAU,GAAG;;;;;;;;KAAa,GACxB,SAAS,CAyBrB;IAED;;;;OAIG;IACH,0BAHW,SAAS,OACT,OAAO,iBA0BjB;IAED;;OAEG;IACH,eAFW,MAAM,uDAoBhB;IAED;;;OAGG;IACH,sBAFW,MAAM,sCA+BhB;IAED,4BAEC;IAED;;;;OAIG;IACH,0BAHW,MAAM,GACJ,QAAQ,YAAY,CAAC,CAqBjC;IAED;;;;OAIG;IACH,6BAHW,MAAM,GACJ,YAAY,CA0BxB;CACJ;;;;;;;;;;UAgBS,MAAM;;;;WACN,MAAM;;;;YACN,MAAM;;;;cACN,MAAM;;;;sBACN,MAAM;;;;eACN,MAAM;;;;eACN,MAAM;;;;;;;;;qBAlQH,OAAO,oBAAoB,EAAE,MAAM;;;;;;;;4BACnC,OAAO,oBAAoB,EAAE,aAAa;;;;;;;;wBAE1C,QAAQ,GAAG,QAAQ;;;;;;;;yBACnB,MAAM;;;;;;;;;YAGT,MAAM;WACN,SAAS;YACT,UAAU;;;;;;;;;;aAGV,aAAa;aACb,YAAY"}
|
|
@@ -132,7 +132,9 @@ export default class BmFontManager {
|
|
|
132
132
|
fontEntry.texture = await texturePromise;
|
|
133
133
|
fontEntry.metrics = await metricsPromise;
|
|
134
134
|
} catch (error) {
|
|
135
|
-
console.
|
|
135
|
+
console.warn(
|
|
136
|
+
`Cannot load font: "${key.family}". Using the embedded default font.`
|
|
137
|
+
);
|
|
136
138
|
|
|
137
139
|
fontEntry.metrics = this._defaultFontEntry.metrics;
|
|
138
140
|
fontEntry.texture = this._defaultFontEntry.texture;
|
|
@@ -171,11 +173,15 @@ export default class BmFontManager {
|
|
|
171
173
|
|
|
172
174
|
let promise = this._metadataPromises.get(dir);
|
|
173
175
|
if (!promise) {
|
|
174
|
-
|
|
176
|
+
const url = this.fontRepository + dir + "/METADATA.pb";
|
|
177
|
+
promise = fetch(url)
|
|
175
178
|
.then((response) => {
|
|
176
179
|
if (!response.ok) {
|
|
177
180
|
throw new Error(
|
|
178
|
-
"Could not load font metadata: " +
|
|
181
|
+
"Could not load font metadata. Response status: " +
|
|
182
|
+
response.status +
|
|
183
|
+
", url: " +
|
|
184
|
+
url
|
|
179
185
|
);
|
|
180
186
|
}
|
|
181
187
|
return response;
|
|
@@ -183,7 +189,7 @@ export default class BmFontManager {
|
|
|
183
189
|
.then((response) => response.text())
|
|
184
190
|
.then((text) => parseMetadataPb(text))
|
|
185
191
|
.catch((error) => {
|
|
186
|
-
console.warn(error);
|
|
192
|
+
console.warn(error.message);
|
|
187
193
|
return undefined;
|
|
188
194
|
});
|
|
189
195
|
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"genome.test.d.ts","sourceRoot":"","sources":["../../../src/genome/genome.test.js"],"names":[],"mappings":""}
|