@genome-spy/core 0.65.0 → 0.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/bundle/browser-BRemItdO.js +138 -0
  2. package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
  3. package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
  4. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  5. package/dist/bundle/index-D28m8tSW.js +1607 -0
  6. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  7. package/dist/bundle/index.es.js +15821 -14601
  8. package/dist/bundle/index.js +214 -212
  9. package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
  10. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  11. package/dist/schema.json +13 -3
  12. package/dist/src/config/scaleDefaults.d.ts +8 -0
  13. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  14. package/dist/src/config/scaleDefaults.js +45 -0
  15. package/dist/src/data/flowHandle.d.ts +2 -0
  16. package/dist/src/data/flowHandle.d.ts.map +1 -1
  17. package/dist/src/data/flowHandle.js +1 -0
  18. package/dist/src/data/flowInit.d.ts +12 -4
  19. package/dist/src/data/flowInit.d.ts.map +1 -1
  20. package/dist/src/data/flowInit.js +115 -16
  21. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  22. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  23. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  25. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  27. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  28. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  29. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  30. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  31. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  32. package/dist/src/encoder/encoder.d.ts +1 -1
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/encoder/encoder.js +1 -1
  35. package/dist/src/genome/scaleLocus.d.ts +39 -0
  36. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  37. package/dist/src/genome/scaleLocus.js +76 -0
  38. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  39. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  40. package/dist/src/genomeSpy/canvasExport.js +66 -0
  41. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  42. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  43. package/dist/src/genomeSpy/containerUi.js +78 -0
  44. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  45. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  46. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  47. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  48. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  49. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  50. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  51. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  52. package/dist/src/genomeSpy/interactionController.js +371 -0
  53. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  54. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  55. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  56. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  57. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  58. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  59. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  60. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  61. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  62. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  63. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  64. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  65. package/dist/src/genomeSpy/viewDataInit.d.ts +22 -0
  66. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  67. package/dist/src/genomeSpy/viewDataInit.js +160 -0
  68. package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
  69. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
  70. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  71. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  73. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  74. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  76. package/dist/src/genomeSpy.d.ts +17 -71
  77. package/dist/src/genomeSpy.d.ts.map +1 -1
  78. package/dist/src/genomeSpy.js +197 -741
  79. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  80. package/dist/src/gl/dataToVertices.js +16 -4
  81. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  82. package/dist/src/gl/webGLHelper.d.ts +2 -2
  83. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  84. package/dist/src/gl/webGLHelper.js +4 -4
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +2 -12
  87. package/dist/src/marks/mark.d.ts.map +1 -1
  88. package/dist/src/marks/mark.js +4 -2
  89. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  90. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  91. package/dist/src/{view → scales}/axisResolution.js +29 -18
  92. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  93. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  94. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  95. package/dist/src/scales/scaleDomainAggregator.js +167 -0
  96. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  97. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  98. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  99. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  100. package/dist/src/scales/scaleInstanceManager.js +317 -0
  101. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  102. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  103. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  104. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  105. package/dist/src/scales/scaleInteractionController.js +336 -0
  106. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  107. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  108. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  109. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  110. package/dist/src/scales/scalePropsResolver.js +74 -0
  111. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -35
  112. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  113. package/dist/src/scales/scaleResolution.js +732 -0
  114. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  115. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  116. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  117. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  118. package/dist/src/scales/scaleRules.d.ts +16 -0
  119. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  120. package/dist/src/scales/scaleRules.js +103 -0
  121. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  122. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  123. package/dist/src/spec/channel.d.ts +13 -18
  124. package/dist/src/spec/scale.d.ts +6 -0
  125. package/dist/src/types/embedApi.d.ts +5 -0
  126. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  127. package/dist/src/utils/domainArray.d.ts.map +1 -1
  128. package/dist/src/utils/domainArray.js +3 -0
  129. package/dist/src/utils/indexer.d.ts +3 -0
  130. package/dist/src/utils/indexer.d.ts.map +1 -1
  131. package/dist/src/utils/indexer.js +3 -0
  132. package/dist/src/view/concatView.d.ts +18 -0
  133. package/dist/src/view/concatView.d.ts.map +1 -1
  134. package/dist/src/view/concatView.js +73 -0
  135. package/dist/src/view/concatView.test.d.ts +2 -0
  136. package/dist/src/view/concatView.test.d.ts.map +1 -0
  137. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  138. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  139. package/dist/src/view/containerMutationHelper.js +118 -0
  140. package/dist/src/view/containerView.d.ts +0 -7
  141. package/dist/src/view/containerView.d.ts.map +1 -1
  142. package/dist/src/view/containerView.js +0 -10
  143. package/dist/src/view/facetView.d.ts.map +1 -1
  144. package/dist/src/view/facetView.js +0 -15
  145. package/dist/src/view/flowBuilder.d.ts +5 -3
  146. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  147. package/dist/src/view/flowBuilder.js +69 -6
  148. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  149. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  150. package/dist/src/view/gridView/gridChild.js +32 -6
  151. package/dist/src/view/gridView/gridView.d.ts +39 -1
  152. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  153. package/dist/src/view/gridView/gridView.js +106 -48
  154. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  155. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  156. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  157. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  158. package/dist/src/view/gridView/scrollbar.js +184 -69
  159. package/dist/src/view/layerView.d.ts +14 -0
  160. package/dist/src/view/layerView.d.ts.map +1 -1
  161. package/dist/src/view/layerView.js +66 -0
  162. package/dist/src/view/layerView.test.d.ts +2 -0
  163. package/dist/src/view/layerView.test.d.ts.map +1 -0
  164. package/dist/src/view/testUtils.d.ts.map +1 -1
  165. package/dist/src/view/testUtils.js +7 -1
  166. package/dist/src/view/unitView.d.ts.map +1 -1
  167. package/dist/src/view/unitView.js +41 -36
  168. package/dist/src/view/view.d.ts +18 -6
  169. package/dist/src/view/view.d.ts.map +1 -1
  170. package/dist/src/view/view.js +30 -4
  171. package/package.json +2 -2
  172. package/dist/bundle/browser-txUcLy2H.js +0 -123
  173. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  174. package/dist/bundle/index-BhtHKLUo.js +0 -73
  175. package/dist/bundle/index-CCe8rnZz.js +0 -716
  176. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  177. package/dist/src/data/collector.test.js +0 -138
  178. package/dist/src/data/dataFlow.test.js +0 -38
  179. package/dist/src/data/flow.test.js +0 -81
  180. package/dist/src/data/flowInit.test.js +0 -413
  181. package/dist/src/data/flowNode.test.js +0 -50
  182. package/dist/src/data/flowOptimizer.test.js +0 -209
  183. package/dist/src/data/formats/fasta.test.js +0 -27
  184. package/dist/src/data/sources/inlineSource.test.js +0 -63
  185. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  186. package/dist/src/data/transforms/aggregate.test.js +0 -134
  187. package/dist/src/data/transforms/clone.test.js +0 -11
  188. package/dist/src/data/transforms/coverage.test.js +0 -238
  189. package/dist/src/data/transforms/filter.test.js +0 -20
  190. package/dist/src/data/transforms/flatten.test.js +0 -96
  191. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  192. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  193. package/dist/src/data/transforms/formula.test.js +0 -25
  194. package/dist/src/data/transforms/identifier.test.js +0 -92
  195. package/dist/src/data/transforms/pileup.test.js +0 -70
  196. package/dist/src/data/transforms/project.test.js +0 -32
  197. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  198. package/dist/src/data/transforms/regexFold.test.js +0 -201
  199. package/dist/src/data/transforms/sample.test.js +0 -38
  200. package/dist/src/data/transforms/stack.test.js +0 -91
  201. package/dist/src/encoder/accessor.test.js +0 -162
  202. package/dist/src/encoder/encoder.test.js +0 -105
  203. package/dist/src/genome/genome.test.js +0 -268
  204. package/dist/src/genome/genomes.test.js +0 -8
  205. package/dist/src/genome/scaleIndex.test.js +0 -78
  206. package/dist/src/genome/scaleLocus.test.js +0 -4
  207. package/dist/src/scale/scale.test.js +0 -326
  208. package/dist/src/scale/ticks.test.js +0 -46
  209. package/dist/src/selection/selection.test.js +0 -14
  210. package/dist/src/utils/addBaseUrl.test.js +0 -30
  211. package/dist/src/utils/binnedIndex.test.js +0 -201
  212. package/dist/src/utils/cloner.test.js +0 -35
  213. package/dist/src/utils/coalesce.test.js +0 -16
  214. package/dist/src/utils/concatIterables.test.js +0 -8
  215. package/dist/src/utils/domainArray.test.js +0 -130
  216. package/dist/src/utils/indexer.test.js +0 -49
  217. package/dist/src/utils/interactionEvent.test.js +0 -35
  218. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  219. package/dist/src/utils/kWayMerge.test.js +0 -30
  220. package/dist/src/utils/mergeObjects.test.js +0 -42
  221. package/dist/src/utils/numberExtractor.test.js +0 -6
  222. package/dist/src/utils/propertyCacher.test.js +0 -89
  223. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  224. package/dist/src/utils/radixSort.test.js +0 -51
  225. package/dist/src/utils/reservationMap.test.js +0 -20
  226. package/dist/src/utils/ringBuffer.test.js +0 -39
  227. package/dist/src/utils/topK.test.js +0 -54
  228. package/dist/src/utils/trees.test.js +0 -135
  229. package/dist/src/utils/url.test.js +0 -28
  230. package/dist/src/utils/variableTools.test.js +0 -13
  231. package/dist/src/view/axisResolution.d.ts.map +0 -1
  232. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  233. package/dist/src/view/axisResolution.test.js +0 -206
  234. package/dist/src/view/flowBuilder.test.js +0 -125
  235. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  236. package/dist/src/view/layout/flexLayout.test.js +0 -323
  237. package/dist/src/view/layout/grid.test.js +0 -71
  238. package/dist/src/view/layout/rectangle.test.js +0 -192
  239. package/dist/src/view/paramMediator.test.js +0 -282
  240. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  241. package/dist/src/view/scaleResolution.js +0 -1059
  242. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  243. package/dist/src/view/scaleResolution.test.js +0 -645
  244. package/dist/src/view/view.test.js +0 -245
  245. package/dist/src/view/viewDispose.test.js +0 -110
  246. package/dist/src/view/viewFactory.test.js +0 -25
  247. package/dist/src/view/viewUtils.test.js +0 -87
  248. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  249. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"file":"scaleResolution.test.d.ts","sourceRoot":"","sources":["../../../src/view/scaleResolution.test.js"],"names":[],"mappings":"sBAWa,OAAO,oBAAoB,EAAE,OAAO"}
@@ -1,645 +0,0 @@
1
- // @ts-nocheck
2
-
3
- import { describe, expect, test } from "vitest";
4
- import { createAndInitialize } from "./testUtils.js";
5
- import createDomain, { toRegularArray as r } from "../utils/domainArray.js";
6
- import LayerView from "./layerView.js";
7
- import ConcatView from "./concatView.js";
8
- import UnitView from "./unitView.js";
9
- import { primaryPositionalChannels } from "../encoder/encoder.js";
10
-
11
- /**
12
- * @typedef {import("../spec/channel.js").Channel} Channel
13
- */
14
-
15
- // NOTE: The most of these tests don't actually test scaleResolution but the resolution algorithm.
16
-
17
- describe("Scale resolution", () => {
18
- test("Channels with just values (no fields or scales) do not resolve", async () => {
19
- /** @type {import("../spec/view.js").LayerSpec} */
20
- const spec = {
21
- data: { values: [] },
22
-
23
- resolve: {
24
- scale: { x: "shared" },
25
- },
26
-
27
- layer: [
28
- {
29
- mark: "point",
30
- encoding: {
31
- color: { value: "red" },
32
- },
33
- },
34
- {
35
- mark: "point",
36
- encoding: {
37
- color: { value: "green" },
38
- },
39
- },
40
- ],
41
- };
42
- const view = await createAndInitialize(spec, LayerView);
43
- expect(view.children[0].getScaleResolution("color")).toBeUndefined();
44
- expect(view.children[1].getScaleResolution("color")).toBeUndefined();
45
- });
46
-
47
- test("Deeply shared scales are shared", async () => {
48
- /** @type {import("../spec/view.js").LayerSpec} */
49
- const spec = {
50
- data: { values: [] },
51
- encoding: {
52
- x: { field: "data", type: "quantitative" },
53
- },
54
-
55
- resolve: { scale: { x: "shared" } },
56
-
57
- layer: [
58
- {
59
- resolve: { scale: { x: "shared" } },
60
- layer: [{ mark: "point" }, { mark: "point" }],
61
- },
62
- {
63
- resolve: { scale: { x: "shared" } },
64
- layer: [{ mark: "point" }, { mark: "point" }],
65
- },
66
- ],
67
- };
68
-
69
- const view = await createAndInitialize(spec, LayerView);
70
-
71
- expect(view.children[0].children[0].getScaleResolution("x")).toBe(
72
- view.children[1].children[1].getScaleResolution("x")
73
- );
74
- });
75
-
76
- test("Shared branches under an independent branch works as expected", async () => {
77
- /** @type {import("../spec/view.js").LayerSpec} */
78
- const spec = {
79
- data: { values: [] },
80
- encoding: {
81
- x: { field: "data", type: "quantitative" },
82
- },
83
-
84
- resolve: {
85
- scale: { x: "independent" },
86
- // TODO: Axis should be set independent implicitly
87
- axis: { x: "independent" },
88
- },
89
-
90
- layer: [
91
- {
92
- resolve: { scale: { x: "shared" } },
93
- layer: [{ mark: "point" }, { mark: "point" }],
94
- },
95
- {
96
- resolve: { scale: { x: "shared" } },
97
- layer: [{ mark: "point" }, { mark: "point" }],
98
- },
99
- ],
100
- };
101
-
102
- const view = await createAndInitialize(spec, LayerView);
103
-
104
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
105
- view.children[1].children[1].getScaleResolution("x")
106
- );
107
- expect(view.children[0].children[0].getScaleResolution("x")).toBe(
108
- view.children[0].children[1].getScaleResolution("x")
109
- );
110
- expect(view.children[1].children[0].getScaleResolution("x")).toBe(
111
- view.children[1].children[1].getScaleResolution("x")
112
- );
113
- });
114
-
115
- test("Independent branches under a shared branch works as expected", async () => {
116
- /** @type {import("../spec/view.js").LayerSpec} */
117
- const spec = {
118
- data: { values: [] },
119
- encoding: {
120
- x: { field: "data", type: "quantitative" },
121
- },
122
-
123
- resolve: {
124
- scale: { x: "shared" },
125
- },
126
-
127
- layer: [
128
- {
129
- resolve: {
130
- scale: { x: "independent" },
131
- // TODO: Axis should be set independent implicitly
132
- axis: { x: "independent" },
133
- },
134
- layer: [{ mark: "point" }, { mark: "point" }],
135
- },
136
- {
137
- resolve: {
138
- scale: { x: "independent" },
139
- // TODO: Axis should be set independent implicitly
140
- axis: { x: "independent" },
141
- },
142
- layer: [{ mark: "point" }, { mark: "point" }],
143
- },
144
- ],
145
- };
146
-
147
- const view = await createAndInitialize(spec, LayerView);
148
-
149
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
150
- view.children[1].children[0].getScaleResolution("x")
151
- );
152
- expect(view.children[0].children[1].getScaleResolution("x")).not.toBe(
153
- view.children[1].children[1].getScaleResolution("x")
154
- );
155
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
156
- view.children[0].children[1].getScaleResolution("x")
157
- );
158
- expect(view.children[1].children[0].getScaleResolution("x")).not.toBe(
159
- view.children[1].children[1].getScaleResolution("x")
160
- );
161
- });
162
-
163
- test("Excluded resolution is not pushed towards the root but collects from children.", async () => {
164
- /** @type {import("../spec/view.js").LayerSpec} */
165
- const spec = {
166
- data: { values: [] },
167
- encoding: {
168
- x: { field: "data", type: "quantitative" },
169
- },
170
-
171
- resolve: {
172
- scale: { x: "shared" },
173
- },
174
-
175
- layer: [
176
- { mark: "point" },
177
- { mark: "point" },
178
- {
179
- resolve: {
180
- scale: { x: "excluded" },
181
- // TODO: Implicit
182
- axis: { x: "excluded" },
183
- },
184
- layer: [{ mark: "point" }, { mark: "point" }],
185
- },
186
- ],
187
- };
188
-
189
- const view = await createAndInitialize(spec, LayerView);
190
-
191
- expect(view.children[0].getScaleResolution("x")).toBe(
192
- view.children[1].getScaleResolution("x")
193
- );
194
-
195
- expect(view.children[2].children[0].getScaleResolution("x")).toBe(
196
- view.children[2].children[1].getScaleResolution("x")
197
- );
198
-
199
- expect(view.children[0].getScaleResolution("x")).not.toBe(
200
- view.children[2].children[0].getScaleResolution("x")
201
- );
202
- });
203
-
204
- // TODO: Add test for "forced" resolution
205
-
206
- test("Default resolution is configurable", async () => {
207
- /** @type {import("../spec/view.js").LayerSpec} */
208
- const spec = {
209
- data: { values: [] },
210
- encoding: {
211
- x: { field: "data", type: "quantitative" },
212
- y: { field: "data", type: "quantitative" },
213
- },
214
-
215
- resolve: {
216
- scale: {
217
- // The hard default in LayerView is "shared".
218
- default: "independent",
219
- x: "shared",
220
- },
221
- axis: {
222
- // TODO: Implicit
223
- default: "independent",
224
- },
225
- },
226
-
227
- layer: [{ mark: "point" }, { mark: "point" }],
228
- };
229
-
230
- const view = await createAndInitialize(spec, LayerView);
231
-
232
- expect(view.children[0].getScaleResolution("x")).toBe(
233
- view.children[1].getScaleResolution("x")
234
- );
235
-
236
- expect(view.children[0].getScaleResolution("y")).not.toBe(
237
- view.children[1].getScaleResolution("y")
238
- );
239
- });
240
-
241
- describe("Vertical and horizontal concatenations defaults resolutions for positional channels", async () => {
242
- const create = async (
243
- /** @type {"vconcat" | "hconcat" | "concat"} */ viewType
244
- ) => {
245
- return await createAndInitialize(
246
- {
247
- data: { values: [] },
248
- [viewType]: [
249
- {
250
- mark: "point",
251
- encoding: {
252
- x: {
253
- field: "foo",
254
- type: "quantitative",
255
- axis: null,
256
- },
257
- y: {
258
- field: "foo",
259
- type: "quantitative",
260
- axis: null,
261
- },
262
- },
263
- },
264
- ],
265
- },
266
- ConcatView
267
- );
268
- };
269
-
270
- const vconcat = await create("vconcat");
271
-
272
- test('"x" of "vconcat" defaults to "shared"', () => {
273
- expect(vconcat.getDefaultResolution("x", "scale")).toBe("shared");
274
- });
275
-
276
- test('"y" of "vconcat" defaults to "independent"', () => {
277
- expect(vconcat.getDefaultResolution("y", "scale")).toBe(
278
- "independent"
279
- );
280
- });
281
-
282
- const hconcat = await create("hconcat");
283
-
284
- test('"x" of "hconcat" defaults to "independent"', () => {
285
- expect(hconcat.getDefaultResolution("x", "scale")).toBe(
286
- "independent"
287
- );
288
- });
289
-
290
- test('"y" of "hconcat" defaults to "shared"', () => {
291
- expect(hconcat.getDefaultResolution("y", "scale")).toBe("shared");
292
- });
293
-
294
- const concat = await create("concat");
295
-
296
- test('"x" and "y" of "concat" defaults to "independent"', () => {
297
- expect(concat.getDefaultResolution("x", "scale")).toBe(
298
- "independent"
299
- );
300
- expect(concat.getDefaultResolution("y", "scale")).toBe(
301
- "independent"
302
- );
303
- });
304
- });
305
- });
306
-
307
- describe("Domain handling", () => {
308
- test("Scales are shared and explicit domains merged properly", async () => {
309
- const view = await createAndInitialize(
310
- {
311
- data: { values: [] },
312
- resolve: { scale: { default: "independent", y: "shared" } },
313
- layer: [
314
- {
315
- mark: "point",
316
- encoding: {
317
- y: {
318
- field: "a",
319
- type: "quantitative",
320
- scale: { domain: [1, 2] },
321
- },
322
- },
323
- },
324
- {
325
- mark: "point",
326
- encoding: {
327
- y: {
328
- field: "b",
329
- type: "quantitative",
330
- scale: { domain: [4, 5] },
331
- },
332
- },
333
- },
334
- ],
335
- },
336
- LayerView
337
- );
338
-
339
- /** @param {import("./view.js").default} view */
340
- const d = (view) => view.getScaleResolution("y").scale.domain();
341
-
342
- expect(r(d(view))).toEqual([1, 5]);
343
- expect(r(d(view.children[0]))).toEqual([1, 5]);
344
- expect(r(d(view.children[1]))).toEqual([1, 5]);
345
- });
346
-
347
- test("Scales are shared and extracted domains merged properly", async () => {
348
- const view = await createAndInitialize(
349
- {
350
- resolve: { scale: { default: "independent", y: "shared" } },
351
- layer: [
352
- {
353
- data: { values: [1, 2] },
354
- mark: "point",
355
- encoding: {
356
- y: {
357
- field: "data",
358
- type: "quantitative",
359
- scale: { zero: false },
360
- },
361
- },
362
- },
363
- {
364
- data: { values: [4, 5] },
365
- mark: "point",
366
- encoding: {
367
- y: { field: "data", type: "quantitative" },
368
- },
369
- },
370
- ],
371
- },
372
- LayerView
373
- );
374
-
375
- /** @param {import("./view.js").default} view */
376
- const d = (view) => view.getScaleResolution("y").scale.domain();
377
-
378
- expect(r(d(view))).toEqual([1, 5]);
379
- expect(r(d(view.children[0]))).toEqual([1, 5]);
380
- expect(r(d(view.children[1]))).toEqual([1, 5]);
381
- });
382
-
383
- test("Scales of primary and secondary channels are shared and extracted domains merged properly", async () => {
384
- const view = await createAndInitialize(
385
- {
386
- data: {
387
- values: [
388
- { a: 1, b: 4 },
389
- { a: 2, b: 5 },
390
- ],
391
- },
392
- mark: "point",
393
- encoding: {
394
- y: {
395
- field: "a",
396
- type: "quantitative",
397
- scale: { zero: false },
398
- },
399
- y2: {
400
- field: "b",
401
- },
402
- },
403
- },
404
- UnitView
405
- );
406
-
407
- /** @param {import("./view.js").default} view */
408
- const d = (view) => view.getScaleResolution("y").scale.domain();
409
-
410
- // FAILS!!!!!!! TODO: FIX!!
411
- // expect(r(d(view))).toEqual([1, 5]);
412
- });
413
-
414
- test("resolutionChannel property is respected", async () => {
415
- const view = await createAndInitialize(
416
- {
417
- data: { values: [] },
418
- resolve: { scale: { default: "independent", y: "shared" } },
419
- layer: [
420
- {
421
- mark: "point",
422
- encoding: {
423
- y: {
424
- field: "a",
425
- type: "quantitative",
426
- scale: { domain: [1, 2] },
427
- },
428
- },
429
- },
430
- {
431
- mark: "point",
432
- encoding: {
433
- x: {
434
- field: "b",
435
- type: "quantitative",
436
- scale: { domain: [4, 5] },
437
- resolutionChannel: "y",
438
- },
439
- },
440
- },
441
- ],
442
- },
443
- LayerView
444
- );
445
-
446
- /** @param {import("./view.js").default} view */
447
- const d = (view) => view.getScaleResolution("y").scale.domain();
448
-
449
- expect(r(d(view))).toEqual([1, 5]);
450
- expect(r(d(view.children[0]))).toEqual([1, 5]);
451
- expect(r(d(view.children[1]))).toEqual([1, 5]);
452
- });
453
-
454
- test("Channels with quantitative fields include zero in their scale domain by default", async () => {
455
- const view = await createAndInitialize(
456
- {
457
- data: { values: [2, 3] },
458
- mark: "point",
459
- encoding: {
460
- x: { field: "data", type: "quantitative" },
461
- y: { field: "data", type: "quantitative" },
462
- },
463
- },
464
- UnitView
465
- );
466
-
467
- for (const channel of primaryPositionalChannels) {
468
- // Extract domain from data
469
- view.getScaleResolution(channel).reconfigure();
470
- }
471
-
472
- const d = /** @param {import("../spec/channel.js").Channel} channel*/ (
473
- channel
474
- ) => view.getScaleResolution(channel).scale.domain();
475
-
476
- expect(d("x")).toEqual([0, 3]);
477
- expect(d("y")).toEqual([0, 3]);
478
- });
479
-
480
- test("Channels with quantitative fields do not include zero in their scale domain if the domain has been defined explicitly", async () => {
481
- const view = await createAndInitialize(
482
- {
483
- data: { values: [2, 3] },
484
- mark: "point",
485
- encoding: {
486
- x: {
487
- field: "data",
488
- type: "quantitative",
489
- scale: { domain: [1, 4] },
490
- },
491
- y: {
492
- field: "data",
493
- type: "quantitative",
494
- scale: { domain: [1, 4] },
495
- },
496
- },
497
- },
498
- UnitView
499
- );
500
-
501
- const d = /** @param {Channel} channel*/ (channel) =>
502
- view.getScaleResolution(channel).scale.domain();
503
-
504
- expect(d("x")).toEqual([1, 4]);
505
- expect(d("x")).toEqual([1, 4]);
506
- });
507
-
508
- test("Channels with quantitative fields do not include zero in their scale domain if zero is explicitly false", async () => {
509
- const view = await createAndInitialize(
510
- {
511
- data: { values: [2, 3] },
512
- mark: "point",
513
- encoding: {
514
- x: {
515
- field: "data",
516
- type: "quantitative",
517
- scale: { zero: false },
518
- },
519
- y: {
520
- field: "data",
521
- type: "quantitative",
522
- scale: { zero: false },
523
- },
524
- },
525
- },
526
- UnitView
527
- );
528
-
529
- for (const channel of primaryPositionalChannels) {
530
- // Extract domain from data
531
- view.getScaleResolution(channel).reconfigure();
532
- }
533
-
534
- const d = /** @param {Channel} channel*/ (channel) =>
535
- view.getScaleResolution(channel).scale.domain();
536
-
537
- expect(d("x")).toEqual([2, 3]);
538
- expect(d("y")).toEqual([2, 3]);
539
- });
540
- });
541
-
542
- describe("Named scales", () => {
543
- test("Resolution of shared scales with conflicting names fails with an exception", async () => {
544
- return expect(
545
- createAndInitialize(
546
- {
547
- data: { values: [1, 2] },
548
- layer: [
549
- {
550
- mark: "point",
551
- encoding: {
552
- x: {
553
- field: "data",
554
- type: "quantitative",
555
- scale: { name: "scale_1" },
556
- },
557
- },
558
- },
559
- {
560
- mark: "point",
561
- encoding: {
562
- x: {
563
- field: "data",
564
- type: "quantitative",
565
- scale: { name: "scale_2" },
566
- },
567
- },
568
- },
569
- ],
570
- },
571
- LayerView
572
- )
573
- ).rejects.toThrow(/conflicting/);
574
- });
575
-
576
- test("A name is properly registered to the ScaleResolution object", async () => {
577
- expect(
578
- await createAndInitialize(
579
- {
580
- data: { values: [1, 2] },
581
- layer: [
582
- {
583
- mark: "point",
584
- encoding: {
585
- x: {
586
- field: "data",
587
- type: "quantitative",
588
- scale: { name: "scale_1" },
589
- },
590
- },
591
- },
592
- {
593
- mark: "point",
594
- encoding: {
595
- x: {
596
- field: "data",
597
- type: "quantitative",
598
- scale: { name: "scale_1" },
599
- },
600
- },
601
- },
602
- ],
603
- },
604
- LayerView
605
- ).then((view) => view.getScaleResolution("x"))
606
- ).toHaveProperty("name", "scale_1");
607
- });
608
-
609
- test("The scale name must be unique among the scale resolutions", async () => {
610
- return expect(
611
- createAndInitialize(
612
- {
613
- resolve: {
614
- scale: { x: "independent" },
615
- axis: { x: "independent" },
616
- },
617
- data: { values: [1, 2] },
618
- layer: [
619
- {
620
- mark: "point",
621
- encoding: {
622
- x: {
623
- field: "data",
624
- type: "quantitative",
625
- scale: { name: "scale_1" },
626
- },
627
- },
628
- },
629
- {
630
- mark: "point",
631
- encoding: {
632
- x: {
633
- field: "data",
634
- type: "quantitative",
635
- scale: { name: "scale_1" },
636
- },
637
- },
638
- },
639
- ],
640
- },
641
- LayerView
642
- )
643
- ).rejects.toThrow(/multiple/);
644
- });
645
- });