@genome-spy/core 0.29.0 → 0.30.2

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 (234) hide show
  1. package/dist/index.es.js +16373 -0
  2. package/dist/index.js +43 -43
  3. package/package.json +10 -7
  4. package/src/data/collector.js +0 -183
  5. package/src/data/collector.test.js +0 -84
  6. package/src/data/dataFlow.js +0 -148
  7. package/src/data/dataFlow.test.js +0 -5
  8. package/src/data/facetNode.js +0 -17
  9. package/src/data/flow.test.js +0 -72
  10. package/src/data/flowBatch.d.ts +0 -40
  11. package/src/data/flowNode.js +0 -283
  12. package/src/data/flowNode.test.js +0 -50
  13. package/src/data/flowOptimizer.js +0 -123
  14. package/src/data/flowOptimizer.test.js +0 -193
  15. package/src/data/flowTestUtils.js +0 -63
  16. package/src/data/formats/fasta.js +0 -32
  17. package/src/data/formats/fasta.test.js +0 -27
  18. package/src/data/sources/dataSource.js +0 -22
  19. package/src/data/sources/dataSourceFactory.js +0 -24
  20. package/src/data/sources/dataUtils.js +0 -78
  21. package/src/data/sources/dynamicCallbackSource.js +0 -57
  22. package/src/data/sources/dynamicSource.js +0 -37
  23. package/src/data/sources/inlineSource.js +0 -67
  24. package/src/data/sources/inlineSource.test.js +0 -56
  25. package/src/data/sources/namedSource.js +0 -79
  26. package/src/data/sources/sequenceSource.js +0 -46
  27. package/src/data/sources/sequenceSource.test.js +0 -46
  28. package/src/data/sources/urlSource.js +0 -74
  29. package/src/data/transforms/aggregate.js +0 -70
  30. package/src/data/transforms/clone.js +0 -40
  31. package/src/data/transforms/clone.test.js +0 -11
  32. package/src/data/transforms/coverage.js +0 -187
  33. package/src/data/transforms/coverage.test.js +0 -123
  34. package/src/data/transforms/filter.js +0 -37
  35. package/src/data/transforms/filter.test.js +0 -18
  36. package/src/data/transforms/filterScoredLabels.js +0 -134
  37. package/src/data/transforms/flattenCompressedExons.js +0 -57
  38. package/src/data/transforms/flattenDelimited.js +0 -74
  39. package/src/data/transforms/flattenDelimited.test.js +0 -87
  40. package/src/data/transforms/flattenSequence.js +0 -39
  41. package/src/data/transforms/flattenSequence.test.js +0 -34
  42. package/src/data/transforms/formula.js +0 -39
  43. package/src/data/transforms/formula.test.js +0 -19
  44. package/src/data/transforms/identifier.js +0 -108
  45. package/src/data/transforms/identifier.test.js +0 -83
  46. package/src/data/transforms/linearizeGenomicCoordinate.js +0 -101
  47. package/src/data/transforms/measureText.js +0 -44
  48. package/src/data/transforms/pileup.js +0 -128
  49. package/src/data/transforms/pileup.test.js +0 -70
  50. package/src/data/transforms/project.js +0 -41
  51. package/src/data/transforms/project.test.js +0 -32
  52. package/src/data/transforms/regexExtract.js +0 -61
  53. package/src/data/transforms/regexExtract.test.js +0 -67
  54. package/src/data/transforms/regexFold.js +0 -141
  55. package/src/data/transforms/regexFold.test.js +0 -160
  56. package/src/data/transforms/sample.js +0 -101
  57. package/src/data/transforms/sample.test.js +0 -38
  58. package/src/data/transforms/stack.js +0 -137
  59. package/src/data/transforms/stack.test.js +0 -91
  60. package/src/data/transforms/transformFactory.js +0 -60
  61. package/src/embedApi.d.ts +0 -67
  62. package/src/encoder/accessor.js +0 -82
  63. package/src/encoder/accessor.test.js +0 -47
  64. package/src/encoder/encoder.js +0 -394
  65. package/src/encoder/encoder.test.js +0 -98
  66. package/src/fonts/Lato-Regular.json +0 -1267
  67. package/src/fonts/Lato-Regular.png +0 -0
  68. package/src/fonts/OFL.txt +0 -93
  69. package/src/fonts/README.md +0 -3
  70. package/src/fonts/bmFont.d.ts +0 -58
  71. package/src/fonts/bmFontManager.js +0 -357
  72. package/src/fonts/bmFontMetrics.js +0 -108
  73. package/src/genome/genome.js +0 -317
  74. package/src/genome/genome.test.js +0 -188
  75. package/src/genome/genomeStore.js +0 -54
  76. package/src/genome/locusFormat.js +0 -31
  77. package/src/genome/scaleIndex.d.ts +0 -38
  78. package/src/genome/scaleIndex.js +0 -166
  79. package/src/genome/scaleIndex.test.js +0 -78
  80. package/src/genome/scaleLocus.d.ts +0 -11
  81. package/src/genome/scaleLocus.js +0 -108
  82. package/src/genome/scaleLocus.test.js +0 -4
  83. package/src/genomeSpy.js +0 -784
  84. package/src/gl/arrayBuilder.js +0 -199
  85. package/src/gl/dataToVertices.js +0 -636
  86. package/src/gl/includes/common.glsl +0 -63
  87. package/src/gl/includes/picking.fragment.glsl +0 -1
  88. package/src/gl/includes/picking.vertex.glsl +0 -27
  89. package/src/gl/includes/sampleFacet.glsl +0 -107
  90. package/src/gl/includes/scales.glsl +0 -112
  91. package/src/gl/link.fragment.glsl +0 -18
  92. package/src/gl/link.vertex.glsl +0 -111
  93. package/src/gl/point.fragment.glsl +0 -123
  94. package/src/gl/point.vertex.glsl +0 -129
  95. package/src/gl/rect.fragment.glsl +0 -51
  96. package/src/gl/rect.vertex.glsl +0 -114
  97. package/src/gl/rule.fragment.glsl +0 -52
  98. package/src/gl/rule.vertex.glsl +0 -89
  99. package/src/gl/text.fragment.glsl +0 -31
  100. package/src/gl/text.vertex.glsl +0 -246
  101. package/src/gl/webGLHelper.js +0 -489
  102. package/src/img/bowtie.svg +0 -1
  103. package/src/img/genomespy-favicon.svg +0 -34
  104. package/src/index.html +0 -11
  105. package/src/index.js +0 -128
  106. package/src/marks/link.js +0 -175
  107. package/src/marks/mark.js +0 -975
  108. package/src/marks/markUtils.js +0 -125
  109. package/src/marks/pointMark.js +0 -251
  110. package/src/marks/rectMark.js +0 -241
  111. package/src/marks/rule.js +0 -250
  112. package/src/marks/text.js +0 -278
  113. package/src/node_modules/.vitest/results.json +0 -1
  114. package/src/scale/colorUtils.js +0 -184
  115. package/src/scale/glslScaleGenerator.js +0 -488
  116. package/src/scale/scale.js +0 -451
  117. package/src/scale/scale.test.js +0 -324
  118. package/src/scale/ticks.js +0 -203
  119. package/src/scale/ticks.test.js +0 -40
  120. package/src/singlePageApp.js +0 -13
  121. package/src/spec/axis.d.ts +0 -296
  122. package/src/spec/channel.d.ts +0 -430
  123. package/src/spec/data.d.ts +0 -196
  124. package/src/spec/font.d.ts +0 -15
  125. package/src/spec/genome.d.ts +0 -35
  126. package/src/spec/mark.d.ts +0 -429
  127. package/src/spec/root.d.ts +0 -17
  128. package/src/spec/sampleView.d.ts +0 -180
  129. package/src/spec/scale.d.ts +0 -273
  130. package/src/spec/title.d.ts +0 -102
  131. package/src/spec/tooltip.d.ts +0 -9
  132. package/src/spec/transform.d.ts +0 -479
  133. package/src/spec/view.d.ts +0 -201
  134. package/src/styles/genome-spy.scss +0 -153
  135. package/src/tooltip/dataTooltipHandler.js +0 -64
  136. package/src/tooltip/refseqGeneTooltipHandler.js +0 -78
  137. package/src/tooltip/tooltipHandler.ts +0 -12
  138. package/src/types/filetypes.d.ts +0 -14
  139. package/src/types/flatqueue.d.ts +0 -53
  140. package/src/types/glsl.d.ts +0 -4
  141. package/src/types/internmap.d.ts +0 -22
  142. package/src/types/object.d.ts +0 -21
  143. package/src/types/vega-loader.d.ts +0 -1
  144. package/src/types/vega-scale.d.ts +0 -60
  145. package/src/utils/addBaseUrl.js +0 -19
  146. package/src/utils/addBaseUrl.test.js +0 -22
  147. package/src/utils/animator.js +0 -83
  148. package/src/utils/arrayUtils.js +0 -61
  149. package/src/utils/binnedIndex.js +0 -167
  150. package/src/utils/binnedIndex.test.js +0 -155
  151. package/src/utils/clamp.js +0 -8
  152. package/src/utils/cloner.js +0 -34
  153. package/src/utils/cloner.test.js +0 -24
  154. package/src/utils/coalesce.js +0 -11
  155. package/src/utils/coalesce.test.js +0 -16
  156. package/src/utils/concatIterables.js +0 -26
  157. package/src/utils/concatIterables.test.js +0 -8
  158. package/src/utils/debounce.js +0 -37
  159. package/src/utils/domainArray.js +0 -216
  160. package/src/utils/domainArray.test.js +0 -130
  161. package/src/utils/eerp.js +0 -13
  162. package/src/utils/expression.js +0 -32
  163. package/src/utils/field.js +0 -28
  164. package/src/utils/formatObject.js +0 -31
  165. package/src/utils/indexer.js +0 -43
  166. package/src/utils/indexer.test.js +0 -47
  167. package/src/utils/inertia.js +0 -124
  168. package/src/utils/interactionEvent.js +0 -33
  169. package/src/utils/iterateNestedMaps.js +0 -21
  170. package/src/utils/iterateNestedMaps.test.js +0 -33
  171. package/src/utils/kWayMerge.js +0 -42
  172. package/src/utils/kWayMerge.test.js +0 -26
  173. package/src/utils/layout/flexLayout.js +0 -368
  174. package/src/utils/layout/flexLayout.test.js +0 -311
  175. package/src/utils/layout/grid.js +0 -95
  176. package/src/utils/layout/grid.test.js +0 -71
  177. package/src/utils/layout/padding.js +0 -120
  178. package/src/utils/layout/point.js +0 -23
  179. package/src/utils/layout/rectangle.js +0 -288
  180. package/src/utils/layout/rectangle.test.js +0 -172
  181. package/src/utils/mergeObjects.js +0 -99
  182. package/src/utils/mergeObjects.test.js +0 -42
  183. package/src/utils/numberExtractor.js +0 -24
  184. package/src/utils/numberExtractor.test.js +0 -6
  185. package/src/utils/point.js +0 -14
  186. package/src/utils/propertyCacher.js +0 -70
  187. package/src/utils/propertyCacher.test.js +0 -85
  188. package/src/utils/propertyCoalescer.js +0 -42
  189. package/src/utils/propertyCoalescer.test.js +0 -22
  190. package/src/utils/reservationMap.js +0 -103
  191. package/src/utils/reservationMap.test.js +0 -20
  192. package/src/utils/scaleNull.js +0 -19
  193. package/src/utils/setOperations.js +0 -75
  194. package/src/utils/smoothstep.js +0 -10
  195. package/src/utils/throttle.js +0 -34
  196. package/src/utils/topK.js +0 -76
  197. package/src/utils/topK.test.js +0 -64
  198. package/src/utils/transition.js +0 -74
  199. package/src/utils/ui/tooltip.js +0 -189
  200. package/src/utils/url.js +0 -22
  201. package/src/utils/variableTools.js +0 -24
  202. package/src/utils/variableTools.test.js +0 -13
  203. package/src/view/axisResolution.js +0 -140
  204. package/src/view/axisResolution.test.js +0 -201
  205. package/src/view/axisView.js +0 -747
  206. package/src/view/concatView.js +0 -45
  207. package/src/view/containerView.js +0 -159
  208. package/src/view/facetView.js +0 -491
  209. package/src/view/flowBuilder.js +0 -367
  210. package/src/view/flowBuilder.test.js +0 -125
  211. package/src/view/gridView.js +0 -786
  212. package/src/view/implicitRootView.js +0 -14
  213. package/src/view/importView.js +0 -19
  214. package/src/view/layerView.js +0 -74
  215. package/src/view/rendering.d.ts +0 -44
  216. package/src/view/renderingContext/compositeViewRenderingContext.js +0 -51
  217. package/src/view/renderingContext/deferredViewRenderingContext.js +0 -176
  218. package/src/view/renderingContext/layoutRecorderViewRenderingContext.js +0 -128
  219. package/src/view/renderingContext/simpleViewRenderingContext.js +0 -64
  220. package/src/view/renderingContext/svgViewRenderingContext.js +0 -125
  221. package/src/view/renderingContext/viewRenderingContext.js +0 -41
  222. package/src/view/scaleResolution.js +0 -791
  223. package/src/view/scaleResolution.test.js +0 -572
  224. package/src/view/scaleResolutionApi.d.ts +0 -40
  225. package/src/view/testUtils.js +0 -51
  226. package/src/view/title.js +0 -165
  227. package/src/view/unitView.js +0 -382
  228. package/src/view/view.js +0 -612
  229. package/src/view/view.test.js +0 -214
  230. package/src/view/viewContext.d.ts +0 -62
  231. package/src/view/viewFactory.js +0 -181
  232. package/src/view/viewFactory.test.js +0 -17
  233. package/src/view/viewUtils.js +0 -327
  234. package/src/view/zoom.js +0 -89
@@ -1,572 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { createAndInitialize } from "./testUtils";
3
- import createDomain, { toRegularArray as r } from "../utils/domainArray";
4
- import LayerView from "./layerView";
5
- import UnitView from "./unitView";
6
- import { primaryPositionalChannels } from "../encoder/encoder";
7
-
8
- /**
9
- * @typedef {import("../spec/channel").Channel} Channel
10
- */
11
-
12
- // NOTE: The most of these tests don't actually test scaleResolution but the resolution algorithm.
13
-
14
- describe("Scale resolution", () => {
15
- test("Channels with just values (no fields or scales) do not resolve", async () => {
16
- /** @type {import("../spec/view").LayerSpec} */
17
- const spec = {
18
- data: { values: [] },
19
-
20
- resolve: {
21
- scale: { x: "shared" },
22
- },
23
-
24
- layer: [
25
- {
26
- mark: "point",
27
- encoding: {
28
- color: { value: "red" },
29
- },
30
- },
31
- {
32
- mark: "point",
33
- encoding: {
34
- color: { value: "green" },
35
- },
36
- },
37
- ],
38
- };
39
- const view = await createAndInitialize(spec, LayerView);
40
- expect(view.children[0].getScaleResolution("color")).toBeUndefined();
41
- expect(view.children[1].getScaleResolution("color")).toBeUndefined();
42
- });
43
-
44
- test("Deeply shared scales are shared", async () => {
45
- /** @type {import("../spec/view").LayerSpec} */
46
- const spec = {
47
- data: { values: [] },
48
- encoding: {
49
- x: { field: "data", type: "quantitative" },
50
- },
51
-
52
- resolve: { scale: { x: "shared" } },
53
-
54
- layer: [
55
- {
56
- resolve: { scale: { x: "shared" } },
57
- layer: [{ mark: "point" }, { mark: "point" }],
58
- },
59
- {
60
- resolve: { scale: { x: "shared" } },
61
- layer: [{ mark: "point" }, { mark: "point" }],
62
- },
63
- ],
64
- };
65
-
66
- const view = await createAndInitialize(spec, LayerView);
67
-
68
- expect(view.children[0].children[0].getScaleResolution("x")).toBe(
69
- view.children[1].children[1].getScaleResolution("x")
70
- );
71
- });
72
-
73
- test("Shared branches under an independent branch works as expected", async () => {
74
- /** @type {import("../spec/view").LayerSpec} */
75
- const spec = {
76
- data: { values: [] },
77
- encoding: {
78
- x: { field: "data", type: "quantitative" },
79
- },
80
-
81
- resolve: {
82
- scale: { x: "independent" },
83
- // TODO: Axis should be set independent implicitly
84
- axis: { x: "independent" },
85
- },
86
-
87
- layer: [
88
- {
89
- resolve: { scale: { x: "shared" } },
90
- layer: [{ mark: "point" }, { mark: "point" }],
91
- },
92
- {
93
- resolve: { scale: { x: "shared" } },
94
- layer: [{ mark: "point" }, { mark: "point" }],
95
- },
96
- ],
97
- };
98
-
99
- const view = await createAndInitialize(spec, LayerView);
100
-
101
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
102
- view.children[1].children[1].getScaleResolution("x")
103
- );
104
- expect(view.children[0].children[0].getScaleResolution("x")).toBe(
105
- view.children[0].children[1].getScaleResolution("x")
106
- );
107
- expect(view.children[1].children[0].getScaleResolution("x")).toBe(
108
- view.children[1].children[1].getScaleResolution("x")
109
- );
110
- });
111
-
112
- test("Independent branches under a shared branch works as expected", async () => {
113
- /** @type {import("../spec/view").LayerSpec} */
114
- const spec = {
115
- data: { values: [] },
116
- encoding: {
117
- x: { field: "data", type: "quantitative" },
118
- },
119
-
120
- resolve: {
121
- scale: { x: "shared" },
122
- },
123
-
124
- layer: [
125
- {
126
- resolve: {
127
- scale: { x: "independent" },
128
- // TODO: Axis should be set independent implicitly
129
- axis: { x: "independent" },
130
- },
131
- layer: [{ mark: "point" }, { mark: "point" }],
132
- },
133
- {
134
- resolve: {
135
- scale: { x: "independent" },
136
- // TODO: Axis should be set independent implicitly
137
- axis: { x: "independent" },
138
- },
139
- layer: [{ mark: "point" }, { mark: "point" }],
140
- },
141
- ],
142
- };
143
-
144
- const view = await createAndInitialize(spec, LayerView);
145
-
146
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
147
- view.children[1].children[0].getScaleResolution("x")
148
- );
149
- expect(view.children[0].children[1].getScaleResolution("x")).not.toBe(
150
- view.children[1].children[1].getScaleResolution("x")
151
- );
152
- expect(view.children[0].children[0].getScaleResolution("x")).not.toBe(
153
- view.children[0].children[1].getScaleResolution("x")
154
- );
155
- expect(view.children[1].children[0].getScaleResolution("x")).not.toBe(
156
- view.children[1].children[1].getScaleResolution("x")
157
- );
158
- });
159
-
160
- test("Excluded resolution is not pushed towards the root but collects from children.", async () => {
161
- /** @type {import("../spec/view").LayerSpec} */
162
- const spec = {
163
- data: { values: [] },
164
- encoding: {
165
- x: { field: "data", type: "quantitative" },
166
- },
167
-
168
- resolve: {
169
- scale: { x: "shared" },
170
- },
171
-
172
- layer: [
173
- { mark: "point" },
174
- { mark: "point" },
175
- {
176
- resolve: {
177
- scale: { x: "excluded" },
178
- // TODO: Implicit
179
- axis: { x: "excluded" },
180
- },
181
- layer: [{ mark: "point" }, { mark: "point" }],
182
- },
183
- ],
184
- };
185
-
186
- const view = await createAndInitialize(spec, LayerView);
187
-
188
- expect(view.children[0].getScaleResolution("x")).toBe(
189
- view.children[1].getScaleResolution("x")
190
- );
191
-
192
- expect(view.children[2].children[0].getScaleResolution("x")).toBe(
193
- view.children[2].children[1].getScaleResolution("x")
194
- );
195
-
196
- expect(view.children[0].getScaleResolution("x")).not.toBe(
197
- view.children[2].children[0].getScaleResolution("x")
198
- );
199
- });
200
-
201
- test("Default resolution is configurable", async () => {
202
- /** @type {import("../spec/view").LayerSpec} */
203
- const spec = {
204
- data: { values: [] },
205
- encoding: {
206
- x: { field: "data", type: "quantitative" },
207
- y: { field: "data", type: "quantitative" },
208
- },
209
-
210
- resolve: {
211
- scale: {
212
- // The hard default in LayerView is "shared".
213
- default: "independent",
214
- x: "shared",
215
- },
216
- axis: {
217
- // TODO: Implicit
218
- default: "independent",
219
- },
220
- },
221
-
222
- layer: [{ mark: "point" }, { mark: "point" }],
223
- };
224
-
225
- const view = await createAndInitialize(spec, LayerView);
226
-
227
- expect(view.children[0].getScaleResolution("x")).toBe(
228
- view.children[1].getScaleResolution("x")
229
- );
230
-
231
- expect(view.children[0].getScaleResolution("y")).not.toBe(
232
- view.children[1].getScaleResolution("y")
233
- );
234
- });
235
- });
236
-
237
- describe("Domain handling", () => {
238
- test("Scales are shared and explicit domains merged properly", async () => {
239
- const view = await createAndInitialize(
240
- {
241
- data: { values: [] },
242
- resolve: { scale: { default: "independent", y: "shared" } },
243
- layer: [
244
- {
245
- mark: "point",
246
- encoding: {
247
- y: {
248
- field: "a",
249
- type: "quantitative",
250
- scale: { domain: [1, 2] },
251
- },
252
- },
253
- },
254
- {
255
- mark: "point",
256
- encoding: {
257
- y: {
258
- field: "b",
259
- type: "quantitative",
260
- scale: { domain: [4, 5] },
261
- },
262
- },
263
- },
264
- ],
265
- },
266
- LayerView
267
- );
268
-
269
- /** @param {import("./view").default} view */
270
- const d = (view) => view.getScaleResolution("y").getScale().domain();
271
-
272
- expect(r(d(view))).toEqual([1, 5]);
273
- expect(r(d(view.children[0]))).toEqual([1, 5]);
274
- expect(r(d(view.children[1]))).toEqual([1, 5]);
275
- });
276
-
277
- test("Scales are shared and extracted domains merged properly", async () => {
278
- const view = await createAndInitialize(
279
- {
280
- resolve: { scale: { default: "independent", y: "shared" } },
281
- layer: [
282
- {
283
- data: { values: [1, 2] },
284
- mark: "point",
285
- encoding: {
286
- y: {
287
- field: "data",
288
- type: "quantitative",
289
- scale: { zero: false },
290
- },
291
- },
292
- },
293
- {
294
- data: { values: [4, 5] },
295
- mark: "point",
296
- encoding: {
297
- y: { field: "data", type: "quantitative" },
298
- },
299
- },
300
- ],
301
- },
302
- LayerView
303
- );
304
-
305
- /** @param {import("./view").default} view */
306
- const d = (view) => view.getScaleResolution("y").getScale().domain();
307
-
308
- expect(r(d(view))).toEqual([1, 5]);
309
- expect(r(d(view.children[0]))).toEqual([1, 5]);
310
- expect(r(d(view.children[1]))).toEqual([1, 5]);
311
- });
312
-
313
- test("Scales of primary and secondary channels are shared and extracted domains merged properly", async () => {
314
- const view = await createAndInitialize(
315
- {
316
- data: {
317
- values: [
318
- { a: 1, b: 4 },
319
- { a: 2, b: 5 },
320
- ],
321
- },
322
- mark: "point",
323
- encoding: {
324
- y: {
325
- field: "a",
326
- type: "quantitative",
327
- scale: { zero: false },
328
- },
329
- y2: {
330
- field: "b",
331
- },
332
- },
333
- },
334
- UnitView
335
- );
336
-
337
- /** @param {import("./view").default} view */
338
- const d = (view) => view.getScaleResolution("y").getScale().domain();
339
-
340
- // FAILS!!!!!!! TODO: FIX!!
341
- // expect(r(d(view))).toEqual([1, 5]);
342
- });
343
-
344
- test("resolutionChannel property is respected", async () => {
345
- const view = await createAndInitialize(
346
- {
347
- data: { values: [] },
348
- resolve: { scale: { default: "independent", y: "shared" } },
349
- layer: [
350
- {
351
- mark: "point",
352
- encoding: {
353
- y: {
354
- field: "a",
355
- type: "quantitative",
356
- scale: { domain: [1, 2] },
357
- },
358
- },
359
- },
360
- {
361
- mark: "point",
362
- encoding: {
363
- x: {
364
- field: "b",
365
- type: "quantitative",
366
- scale: { domain: [4, 5] },
367
- resolutionChannel: "y",
368
- },
369
- },
370
- },
371
- ],
372
- },
373
- LayerView
374
- );
375
-
376
- /** @param {import("./view").default} view */
377
- const d = (view) => view.getScaleResolution("y").getScale().domain();
378
-
379
- expect(r(d(view))).toEqual([1, 5]);
380
- expect(r(d(view.children[0]))).toEqual([1, 5]);
381
- expect(r(d(view.children[1]))).toEqual([1, 5]);
382
- });
383
-
384
- test("Channels with quantitative fields include zero in their scale domain by default", async () => {
385
- const view = await createAndInitialize(
386
- {
387
- data: { values: [2, 3] },
388
- mark: "point",
389
- encoding: {
390
- x: { field: "data", type: "quantitative" },
391
- y: { field: "data", type: "quantitative" },
392
- },
393
- },
394
- UnitView
395
- );
396
-
397
- for (const channel of primaryPositionalChannels) {
398
- // Extract domain from data
399
- view.getScaleResolution(channel).reconfigure();
400
- }
401
-
402
- const d = /** @param {import("../spec/channel").Channel} channel*/ (
403
- channel
404
- ) => view.getScaleResolution(channel).getScale().domain();
405
-
406
- expect(d("x")).toEqual([0, 3]);
407
- expect(d("y")).toEqual([0, 3]);
408
- });
409
-
410
- test("Channels with quantitative fields do not include zero in their scale domain if the domain has been defined explicitly", async () => {
411
- const view = await createAndInitialize(
412
- {
413
- data: { values: [2, 3] },
414
- mark: "point",
415
- encoding: {
416
- x: {
417
- field: "data",
418
- type: "quantitative",
419
- scale: { domain: [1, 4] },
420
- },
421
- y: {
422
- field: "data",
423
- type: "quantitative",
424
- scale: { domain: [1, 4] },
425
- },
426
- },
427
- },
428
- UnitView
429
- );
430
-
431
- const d = /** @param {Channel} channel*/ (channel) =>
432
- view.getScaleResolution(channel).getScale().domain();
433
-
434
- expect(d("x")).toEqual([1, 4]);
435
- expect(d("x")).toEqual([1, 4]);
436
- });
437
-
438
- test("Channels with quantitative fields do not include zero in their scale domain if zero is explicitly false", async () => {
439
- const view = await createAndInitialize(
440
- {
441
- data: { values: [2, 3] },
442
- mark: "point",
443
- encoding: {
444
- x: {
445
- field: "data",
446
- type: "quantitative",
447
- scale: { zero: false },
448
- },
449
- y: {
450
- field: "data",
451
- type: "quantitative",
452
- scale: { zero: false },
453
- },
454
- },
455
- },
456
- UnitView
457
- );
458
-
459
- for (const channel of primaryPositionalChannels) {
460
- // Extract domain from data
461
- view.getScaleResolution(channel).reconfigure();
462
- }
463
-
464
- const d = /** @param {Channel} channel*/ (channel) =>
465
- view.getScaleResolution(channel).getScale().domain();
466
-
467
- expect(d("x")).toEqual([2, 3]);
468
- expect(d("y")).toEqual([2, 3]);
469
- });
470
- });
471
-
472
- describe("Named scales", () => {
473
- test("Resolution of shared scales with conflicting names fails with an exception", async () => {
474
- return expect(
475
- createAndInitialize(
476
- {
477
- data: { values: [1, 2] },
478
- layer: [
479
- {
480
- mark: "point",
481
- encoding: {
482
- x: {
483
- field: "data",
484
- type: "quantitative",
485
- scale: { name: "scale_1" },
486
- },
487
- },
488
- },
489
- {
490
- mark: "point",
491
- encoding: {
492
- x: {
493
- field: "data",
494
- type: "quantitative",
495
- scale: { name: "scale_2" },
496
- },
497
- },
498
- },
499
- ],
500
- },
501
- LayerView
502
- )
503
- ).rejects.toThrow(/conflicting/);
504
- });
505
-
506
- test("A name is properly registered to the ScaleResolution object", async () => {
507
- expect(
508
- await createAndInitialize(
509
- {
510
- data: { values: [1, 2] },
511
- layer: [
512
- {
513
- mark: "point",
514
- encoding: {
515
- x: {
516
- field: "data",
517
- type: "quantitative",
518
- scale: { name: "scale_1" },
519
- },
520
- },
521
- },
522
- {
523
- mark: "point",
524
- encoding: {
525
- x: {
526
- field: "data",
527
- type: "quantitative",
528
- scale: { name: "scale_1" },
529
- },
530
- },
531
- },
532
- ],
533
- },
534
- LayerView
535
- ).then((view) => view.getScaleResolution("x"))
536
- ).toHaveProperty("name", "scale_1");
537
- });
538
-
539
- test("The scale name must be unique among the scale resolutions", async () => {
540
- return expect(
541
- createAndInitialize(
542
- {
543
- resolve: { scale: { x: "independent" } },
544
- data: { values: [1, 2] },
545
- layer: [
546
- {
547
- mark: "point",
548
- encoding: {
549
- x: {
550
- field: "data",
551
- type: "quantitative",
552
- scale: { name: "scale_1" },
553
- },
554
- },
555
- },
556
- {
557
- mark: "point",
558
- encoding: {
559
- x: {
560
- field: "data",
561
- type: "quantitative",
562
- scale: { name: "scale_1" },
563
- },
564
- },
565
- },
566
- ],
567
- },
568
- LayerView
569
- )
570
- ).rejects.toThrow(/multiple/);
571
- });
572
- });
@@ -1,40 +0,0 @@
1
- import { ComplexDomain, NumericDomain } from "../spec/scale";
2
- import ScaleResolution from "./scaleResolution";
3
-
4
- export interface ScaleResolutionEvent {
5
- type: "domain";
6
-
7
- scaleResolution: ScaleResolution;
8
- }
9
-
10
- export type ScaleResolutionListener = (event: ScaleResolutionEvent) => void;
11
-
12
- /**
13
- * A public API for ScaleResolution
14
- */
15
- export interface ScaleResolutionApi {
16
- addEventListener(type: "domain", listener: ScaleResolutionListener): void;
17
-
18
- removeEventListener(
19
- type: "domain",
20
- listener: ScaleResolutionListener
21
- ): void;
22
-
23
- /**
24
- * Returns the current, possible zoomed domain.
25
- */
26
- getDomain(): any[];
27
-
28
- /**
29
- * Returns the current, possible zoomed domain converted into complex objects
30
- * such as genomic coordinates.
31
- */
32
- getComplexDomain(): NumericDomain | ComplexDomain;
33
-
34
- isZoomable(): boolean;
35
-
36
- zoomTo(
37
- domain: number[] | ComplexDomain,
38
- duration?: boolean | number
39
- ): Promise<void>;
40
- }
@@ -1,51 +0,0 @@
1
- /**
2
- * Utils for Jest tests
3
- * TODO: Find a better place and convention
4
- *
5
- * @typedef {import("./view").default} View
6
- * @typedef {import("../spec/view").ViewSpec} ViewSpec
7
- * @typedef {import("./viewContext").default} ViewContext
8
- */
9
-
10
- import { resolveScalesAndAxes, initializeData } from "./viewUtils";
11
- import AccessorFactory from "../encoder/accessor";
12
- import DataFlow from "../data/dataFlow";
13
- import { ViewFactory } from "./viewFactory";
14
-
15
- /** @type {<V extends View>(spec: ViewSpec, viewClass: { new(...args: any[]): V }, context?: ViewContext) => V} */
16
- export function create(spec, viewClass, context = undefined) {
17
- const viewTypeRegistry = new ViewFactory();
18
-
19
- const c = /** @type {ViewContext} */ ({
20
- ...(context || {}),
21
- accessorFactory: new AccessorFactory(),
22
-
23
- createView: function (spec, parent, defaultName) {
24
- return viewTypeRegistry.createView(spec, c, parent, defaultName);
25
- },
26
- });
27
-
28
- const view = c.createView(spec, null, "root");
29
-
30
- if (!(view instanceof viewClass)) {
31
- throw new Error("ViewClass and the spec do not match!");
32
- }
33
-
34
- return view;
35
- }
36
-
37
- /** @type {<V extends View>(spec: ViewSpec, viewClass: { new(...args: any[]): V }, context?: ViewContext) => Promise<V>} */
38
- export async function createAndInitialize(
39
- spec,
40
- viewClass,
41
- context = undefined
42
- ) {
43
- context = /** @type {ViewContext} */ ({
44
- ...(context || {}),
45
- dataFlow: new DataFlow(),
46
- });
47
- const view = create(spec, viewClass, context);
48
- resolveScalesAndAxes(view);
49
- await initializeData(view, context.dataFlow);
50
- return view;
51
- }