@genome-spy/core 0.64.0 → 0.66.1

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 (285) hide show
  1. package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
  2. package/dist/bundle/browser-BRemItdO.js +138 -0
  3. package/dist/bundle/index-BatuyGAI.js +271 -0
  4. package/dist/bundle/index-ByuE8dvu.js +332 -0
  5. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  6. package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
  7. package/dist/bundle/index-D28m8tSW.js +1607 -0
  8. package/dist/bundle/index-D74H8TTz.js +508 -0
  9. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  10. package/dist/bundle/index.es.js +15034 -13842
  11. package/dist/bundle/index.js +223 -237
  12. package/dist/bundle/inflate-GtwLkvSP.js +1048 -0
  13. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  14. package/dist/schema.json +22 -4
  15. package/dist/src/config/scaleDefaults.d.ts +8 -0
  16. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  17. package/dist/src/config/scaleDefaults.js +45 -0
  18. package/dist/src/data/collector.d.ts +7 -2
  19. package/dist/src/data/collector.d.ts.map +1 -1
  20. package/dist/src/data/collector.js +13 -2
  21. package/dist/src/data/dataFlow.d.ts +20 -42
  22. package/dist/src/data/dataFlow.d.ts.map +1 -1
  23. package/dist/src/data/dataFlow.js +57 -80
  24. package/dist/src/data/flowHandle.d.ts +15 -0
  25. package/dist/src/data/flowHandle.d.ts.map +1 -0
  26. package/dist/src/data/flowHandle.js +13 -0
  27. package/dist/src/data/flowInit.d.ts +85 -0
  28. package/dist/src/data/flowInit.d.ts.map +1 -0
  29. package/dist/src/data/flowInit.js +238 -0
  30. package/dist/src/data/flowInit.test.d.ts +2 -0
  31. package/dist/src/data/flowInit.test.d.ts.map +1 -0
  32. package/dist/src/data/flowOptimizer.d.ts +6 -4
  33. package/dist/src/data/flowOptimizer.d.ts.map +1 -1
  34. package/dist/src/data/flowOptimizer.js +29 -14
  35. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  36. package/dist/src/data/sources/lazy/bamSource.js +1 -1
  37. package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
  38. package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
  39. package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
  40. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  41. package/dist/src/data/sources/lazy/gff3Source.js +4 -8
  42. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  43. package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
  44. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  45. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  46. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  47. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  48. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  49. package/dist/src/data/sources/lazy/tabixSource.js +1 -1
  50. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  51. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  52. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  53. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  54. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  55. package/dist/src/encoder/encoder.d.ts +1 -1
  56. package/dist/src/encoder/encoder.d.ts.map +1 -1
  57. package/dist/src/encoder/encoder.js +1 -1
  58. package/dist/src/genome/scaleLocus.d.ts +39 -0
  59. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  60. package/dist/src/genome/scaleLocus.js +76 -0
  61. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  62. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  63. package/dist/src/genomeSpy/canvasExport.js +66 -0
  64. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  65. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  66. package/dist/src/genomeSpy/containerUi.js +78 -0
  67. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  68. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  69. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  70. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  71. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  73. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  74. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/interactionController.js +371 -0
  76. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  77. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  78. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  79. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  80. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  81. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  82. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  83. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  84. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  85. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  86. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  87. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  88. package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
  89. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  90. package/dist/src/genomeSpy/viewDataInit.js +41 -0
  91. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  92. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  93. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  94. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  95. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  96. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  97. package/dist/src/genomeSpy.d.ts +17 -72
  98. package/dist/src/genomeSpy.d.ts.map +1 -1
  99. package/dist/src/genomeSpy.js +180 -789
  100. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  101. package/dist/src/gl/webGLHelper.d.ts +2 -2
  102. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  103. package/dist/src/gl/webGLHelper.js +4 -4
  104. package/dist/src/index.d.ts.map +1 -1
  105. package/dist/src/index.js +2 -12
  106. package/dist/src/marks/mark.d.ts +1 -0
  107. package/dist/src/marks/mark.d.ts.map +1 -1
  108. package/dist/src/marks/mark.js +26 -3
  109. package/dist/src/{view → scales}/axisResolution.d.ts +12 -14
  110. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  111. package/dist/src/{view → scales}/axisResolution.js +38 -12
  112. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  113. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  114. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  115. package/dist/src/scales/scaleDomainAggregator.js +162 -0
  116. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  117. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  118. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  119. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  120. package/dist/src/scales/scaleInstanceManager.js +313 -0
  121. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  122. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  123. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  124. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  125. package/dist/src/scales/scaleInteractionController.js +336 -0
  126. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  127. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  128. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  129. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  130. package/dist/src/scales/scalePropsResolver.js +74 -0
  131. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -31
  132. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  133. package/dist/src/scales/scaleResolution.js +658 -0
  134. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  135. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  136. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  137. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  138. package/dist/src/scales/scaleRules.d.ts +16 -0
  139. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  140. package/dist/src/scales/scaleRules.js +103 -0
  141. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  142. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  143. package/dist/src/spec/channel.d.ts +13 -18
  144. package/dist/src/spec/sampleView.d.ts +3 -2
  145. package/dist/src/spec/scale.d.ts +6 -0
  146. package/dist/src/types/embedApi.d.ts +5 -0
  147. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  148. package/dist/src/types/viewContext.d.ts +1 -1
  149. package/dist/src/view/concatView.d.ts +18 -0
  150. package/dist/src/view/concatView.d.ts.map +1 -1
  151. package/dist/src/view/concatView.js +73 -0
  152. package/dist/src/view/concatView.test.d.ts +2 -0
  153. package/dist/src/view/concatView.test.d.ts.map +1 -0
  154. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  155. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  156. package/dist/src/view/containerMutationHelper.js +114 -0
  157. package/dist/src/view/containerView.d.ts +0 -7
  158. package/dist/src/view/containerView.d.ts.map +1 -1
  159. package/dist/src/view/containerView.js +0 -10
  160. package/dist/src/view/facetView.d.ts.map +1 -1
  161. package/dist/src/view/facetView.js +0 -14
  162. package/dist/src/view/flowBuilder.d.ts +2 -2
  163. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  164. package/dist/src/view/flowBuilder.js +21 -4
  165. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  166. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  167. package/dist/src/view/gridView/gridChild.js +32 -6
  168. package/dist/src/view/gridView/gridView.d.ts +39 -1
  169. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  170. package/dist/src/view/gridView/gridView.js +113 -42
  171. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  172. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  173. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  174. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  175. package/dist/src/view/gridView/scrollbar.js +184 -69
  176. package/dist/src/view/gridView/selectionRect.d.ts +8 -4
  177. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  178. package/dist/src/view/gridView/selectionRect.js +28 -3
  179. package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
  180. package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
  181. package/dist/src/view/layerView.d.ts +14 -0
  182. package/dist/src/view/layerView.d.ts.map +1 -1
  183. package/dist/src/view/layerView.js +66 -0
  184. package/dist/src/view/layerView.test.d.ts +2 -0
  185. package/dist/src/view/layerView.test.d.ts.map +1 -0
  186. package/dist/src/view/paramMediator.d.ts +2 -1
  187. package/dist/src/view/paramMediator.d.ts.map +1 -1
  188. package/dist/src/view/paramMediator.js +13 -1
  189. package/dist/src/view/testUtils.d.ts.map +1 -1
  190. package/dist/src/view/testUtils.js +18 -5
  191. package/dist/src/view/unitView.d.ts.map +1 -1
  192. package/dist/src/view/unitView.js +52 -12
  193. package/dist/src/view/view.d.ts +23 -7
  194. package/dist/src/view/view.d.ts.map +1 -1
  195. package/dist/src/view/view.js +61 -5
  196. package/dist/src/view/viewDispose.test.d.ts +2 -0
  197. package/dist/src/view/viewDispose.test.d.ts.map +1 -0
  198. package/dist/src/view/viewUtils.d.ts +4 -4
  199. package/dist/src/view/viewUtils.d.ts.map +1 -1
  200. package/dist/src/view/viewUtils.js +19 -15
  201. package/dist/src/view/viewUtils.test.d.ts +2 -0
  202. package/dist/src/view/viewUtils.test.d.ts.map +1 -0
  203. package/package.json +10 -10
  204. package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
  205. package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
  206. package/dist/bundle/index-5ajWdKly.js +0 -1319
  207. package/dist/bundle/index-B03-Om4z.js +0 -274
  208. package/dist/bundle/index-BftNdA0O.js +0 -27
  209. package/dist/bundle/index-Bg7C4Xat.js +0 -2750
  210. package/dist/bundle/index-C3QR8Lv6.js +0 -2131
  211. package/dist/bundle/index-DTcHjAHp.js +0 -505
  212. package/dist/bundle/index-DnIkxb0L.js +0 -1025
  213. package/dist/bundle/index-Ww3TAo6_.js +0 -71
  214. package/dist/bundle/index-g8iXgW0W.js +0 -651
  215. package/dist/bundle/long-B-FASCSo.js +0 -2387
  216. package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
  217. package/dist/src/data/collector.test.js +0 -138
  218. package/dist/src/data/dataFlow.test.js +0 -5
  219. package/dist/src/data/flow.test.js +0 -81
  220. package/dist/src/data/flowNode.test.js +0 -50
  221. package/dist/src/data/flowOptimizer.test.js +0 -204
  222. package/dist/src/data/formats/fasta.test.js +0 -27
  223. package/dist/src/data/sources/inlineSource.test.js +0 -63
  224. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  225. package/dist/src/data/transforms/aggregate.test.js +0 -134
  226. package/dist/src/data/transforms/clone.test.js +0 -11
  227. package/dist/src/data/transforms/coverage.test.js +0 -238
  228. package/dist/src/data/transforms/filter.test.js +0 -20
  229. package/dist/src/data/transforms/flatten.test.js +0 -96
  230. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  231. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  232. package/dist/src/data/transforms/formula.test.js +0 -25
  233. package/dist/src/data/transforms/identifier.test.js +0 -92
  234. package/dist/src/data/transforms/pileup.test.js +0 -70
  235. package/dist/src/data/transforms/project.test.js +0 -32
  236. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  237. package/dist/src/data/transforms/regexFold.test.js +0 -201
  238. package/dist/src/data/transforms/sample.test.js +0 -38
  239. package/dist/src/data/transforms/stack.test.js +0 -91
  240. package/dist/src/encoder/accessor.test.js +0 -162
  241. package/dist/src/encoder/encoder.test.js +0 -105
  242. package/dist/src/genome/genome.test.js +0 -268
  243. package/dist/src/genome/genomes.test.js +0 -8
  244. package/dist/src/genome/scaleIndex.test.js +0 -78
  245. package/dist/src/genome/scaleLocus.test.js +0 -4
  246. package/dist/src/scale/scale.test.js +0 -326
  247. package/dist/src/scale/ticks.test.js +0 -46
  248. package/dist/src/selection/selection.test.js +0 -14
  249. package/dist/src/utils/addBaseUrl.test.js +0 -30
  250. package/dist/src/utils/binnedIndex.test.js +0 -201
  251. package/dist/src/utils/cloner.test.js +0 -35
  252. package/dist/src/utils/coalesce.test.js +0 -16
  253. package/dist/src/utils/concatIterables.test.js +0 -8
  254. package/dist/src/utils/domainArray.test.js +0 -130
  255. package/dist/src/utils/indexer.test.js +0 -49
  256. package/dist/src/utils/interactionEvent.test.js +0 -35
  257. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  258. package/dist/src/utils/kWayMerge.test.js +0 -30
  259. package/dist/src/utils/mergeObjects.test.js +0 -42
  260. package/dist/src/utils/numberExtractor.test.js +0 -6
  261. package/dist/src/utils/propertyCacher.test.js +0 -89
  262. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  263. package/dist/src/utils/radixSort.test.js +0 -51
  264. package/dist/src/utils/reservationMap.test.js +0 -20
  265. package/dist/src/utils/ringBuffer.test.js +0 -39
  266. package/dist/src/utils/topK.test.js +0 -54
  267. package/dist/src/utils/trees.test.js +0 -135
  268. package/dist/src/utils/url.test.js +0 -28
  269. package/dist/src/utils/variableTools.test.js +0 -13
  270. package/dist/src/view/axisResolution.d.ts.map +0 -1
  271. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  272. package/dist/src/view/axisResolution.test.js +0 -206
  273. package/dist/src/view/flowBuilder.test.js +0 -125
  274. package/dist/src/view/layout/flexLayout.test.js +0 -323
  275. package/dist/src/view/layout/grid.test.js +0 -71
  276. package/dist/src/view/layout/rectangle.test.js +0 -192
  277. package/dist/src/view/paramMediator.test.js +0 -260
  278. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  279. package/dist/src/view/scaleResolution.js +0 -1049
  280. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  281. package/dist/src/view/scaleResolution.test.js +0 -645
  282. package/dist/src/view/view.test.js +0 -245
  283. package/dist/src/view/viewFactory.test.js +0 -25
  284. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  285. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -1,162 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import ParamMediator from "../view/paramMediator.js";
3
- import { createAccessor, createConditionalAccessors } from "./accessor.js";
4
- import { UNIQUE_ID_KEY } from "../data/transforms/identifier.js";
5
- import { createSinglePointSelection } from "../selection/selection.js";
6
-
7
- const datum = {
8
- a: 1,
9
- b: 2,
10
- "x.c": 3,
11
- };
12
-
13
- describe("Accessors for different encoding types", () => {
14
- test("Creates a field accessor", () => {
15
- const a = createAccessor("x", { field: "a" }, new ParamMediator());
16
- expect(a(datum)).toEqual(1);
17
- expect(a.constant).toBeFalsy();
18
- expect(a.fields).toEqual(["a"]);
19
- });
20
-
21
- test("Creates an expression accessor", () => {
22
- const a = createAccessor(
23
- "x",
24
- { expr: `datum.b + datum['x\.c']` },
25
- new ParamMediator()
26
- );
27
- expect(a(datum)).toEqual(5);
28
- expect(a.constant).toBeFalsy();
29
- expect(a.fields.sort()).toEqual(["b", "x.c"].sort());
30
- });
31
-
32
- test("Creates a constant accessor", () => {
33
- const a = createAccessor("x", { datum: 0 }, new ParamMediator());
34
- expect(a(datum)).toEqual(0);
35
- expect(a.constant).toBeTruthy();
36
- expect(a.fields).toEqual([]);
37
- });
38
-
39
- test("Creates a value accessor", () => {
40
- const a = createAccessor("x", { value: 123 }, new ParamMediator());
41
- expect(a(datum)).toEqual(123);
42
- expect(a.constant).toBeTruthy();
43
- expect(a.fields).toEqual([]);
44
- });
45
- });
46
-
47
- test("Throws on incomplete encoding spec", () => {
48
- expect(() => createAccessor("x", {}, new ParamMediator())).toThrow();
49
- });
50
-
51
- // TODO: Refactor and fix conditional accessors
52
- describe.skip("createConditionalAccessors", () => {
53
- const data = [
54
- { a: 1, b: 2, [UNIQUE_ID_KEY]: 0 },
55
- { a: 3, b: 4, [UNIQUE_ID_KEY]: 1 },
56
- ];
57
-
58
- const paramMediator = new ParamMediator();
59
- paramMediator.allocateSetter("p", createSinglePointSelection(data[0]));
60
-
61
- const a = createConditionalAccessors(
62
- "x",
63
- {
64
- field: "a",
65
- type: "quantitative",
66
- condition: { param: "p", value: 123 },
67
- },
68
- paramMediator
69
- );
70
-
71
- const b = createConditionalAccessors(
72
- "x",
73
- {
74
- field: "a",
75
- type: "quantitative",
76
- condition: [
77
- { param: "p", value: 123 },
78
- { param: "p", value: 234 },
79
- ],
80
- },
81
- paramMediator
82
- );
83
-
84
- const c = createConditionalAccessors(
85
- "x",
86
- {
87
- value: 123,
88
- condition: {
89
- param: "p",
90
- field: "a",
91
- type: "quantitative",
92
- },
93
- },
94
- paramMediator
95
- );
96
-
97
- // TODO: Add more combinations of datum, field, expr, etc
98
-
99
- test("Creates a correct number of accessors", () => {
100
- expect(a.length).toBe(2);
101
- expect(b.length).toBe(3);
102
- expect(c.length).toBe(2);
103
- });
104
-
105
- // Conditional accessor
106
- test("Conditional accessor accesses the correct field", () => {
107
- expect(a[0](data[0])).toEqual(123);
108
- expect(a[0].predicate.param).toEqual("p");
109
- });
110
-
111
- test("Conditional predicate is true only for the selected datum", () => {
112
- expect(a[0].predicate(data[0])).toBeTruthy();
113
- expect(a[0].predicate(data[1])).toBeFalsy();
114
- });
115
-
116
- // Default accessor
117
- test("Default accessor accesses the correct field", () => {
118
- expect(a[1](data[0])).toEqual(1);
119
- expect(a[1].predicate.param).toBeFalsy();
120
- });
121
-
122
- test("Default predicate is true for all data", () => {
123
- expect(a[1].predicate(data[0])).toBeTruthy();
124
- expect(a[1].predicate(data[1])).toBeTruthy();
125
- });
126
-
127
- test("Throws if multiple non-constant accessors are used", () => {
128
- expect(() =>
129
- createConditionalAccessors(
130
- "x",
131
- {
132
- field: "a",
133
- type: "quantitative",
134
- condition: {
135
- param: "p",
136
- // @ts-expect-error
137
- field: "b",
138
- type: "quantitative",
139
- },
140
- },
141
- paramMediator
142
- )
143
- ).toThrow();
144
-
145
- expect(() =>
146
- createConditionalAccessors(
147
- "x",
148
- {
149
- field: "a",
150
- type: "quantitative",
151
- condition: {
152
- param: "p",
153
- // @ts-expect-error
154
- expr: "datum.b",
155
- type: "quantitative",
156
- },
157
- },
158
- paramMediator
159
- )
160
- ).toThrow();
161
- });
162
- });
@@ -1,105 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
-
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",
41
- }
42
- );
43
- };
44
-
45
- const datum = {
46
- a: 100,
47
- b: 6,
48
- c: "Pink Floyd",
49
- [UNIQUE_ID_KEY]: 1234,
50
- };
51
-
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
- });
65
-
66
- test("provides a data accessor for a FieldDef", () =>
67
- expect(e.y.dataAccessor.fields).toContain("a"));
68
-
69
- test("doesn't provide a data accessor for a ValueDef", () =>
70
- expect(e.x.dataAccessor).toBeUndefined());
71
-
72
- test("returns a value", () => expect(e.x(datum)).toEqual(42));
73
-
74
- test("accesses a field and uses a scale", () => expect(e.y(datum)).toBe(1));
75
-
76
- // TODO: Text ExprRef
77
- });
78
-
79
- // TODO: Refactor and fix conditional encoders
80
- describe.skip("Conditional encoder with a field and a conditional value", () => {
81
- const pm = new ParamMediator();
82
- const setter = pm.allocateSetter("p", createSinglePointSelection(null));
83
-
84
- const e = createSimpleOrConditionalEncoder(
85
- createConditionalAccessors("size", encoding.size, pm),
86
- scaleSource
87
- );
88
-
89
- test("has multiple accessors", () => {
90
- expect(e.accessors.length).toBe(2);
91
- });
92
-
93
- test("accesses the field using the dataAccessor", () =>
94
- expect(e.dataAccessor(datum)).toBe(100));
95
-
96
- test("encodes the default when a predicate is false", () => {
97
- setter(createSinglePointSelection(null));
98
- expect(e(datum)).toBe(10);
99
- });
100
-
101
- test("encodes the conditional value when a predicate is true", () => {
102
- setter(createSinglePointSelection(datum));
103
- expect(e(datum)).toBe(5000);
104
- });
105
- });
@@ -1,268 +0,0 @@
1
- import { afterAll, describe, expect, test, vi } from "vitest";
2
- import Genome from "./genome.js";
3
-
4
- describe("Human genome, chromosome names prefixed with 'chr'", () => {
5
- // Actually, the chromosomes are just named as in hg38, for example
6
- const chromosomes = [
7
- { name: "chr1", size: 10 },
8
- { name: "chr2", size: 20 },
9
- { name: "chr3", size: 30 },
10
- { name: "chrX", size: 40 },
11
- ];
12
-
13
- const g = new Genome({ name: "random", contigs: chromosomes });
14
-
15
- test("Maps chromosome names to continuous", () => {
16
- expect(() => g.toContinuous("chr0", 2)).toThrow();
17
- expect(g.toContinuous("chr1", 0)).toEqual(0);
18
- expect(g.toContinuous("chr1", 2)).toEqual(2);
19
- expect(g.toContinuous("chr2", 2)).toEqual(12);
20
- expect(g.toContinuous("chrX", 2)).toEqual(62);
21
- // TODO: Should this throw to alert about invalid data..?
22
- // TODO: expect(m.toContinuous("chrX", 40)).toBeUndefined();
23
- });
24
-
25
- test("Maps chromosome numbers to continuous", () => {
26
- expect(() => g.toContinuous(0, 2)).toThrow();
27
- expect(g.toContinuous(1, 2)).toEqual(2);
28
- expect(g.toContinuous(2, 2)).toEqual(12);
29
- expect(g.toContinuous(4, 2)).toEqual(62);
30
- expect(() => g.toContinuous(5, 2)).toThrow();
31
- });
32
-
33
- test("Maps unprefixed names to continuous", () => {
34
- expect(() => g.toContinuous("0", 2)).toThrow();
35
- expect(g.toContinuous("1", 2)).toEqual(2);
36
- expect(g.toContinuous("2", 2)).toEqual(12);
37
- expect(g.toContinuous("X", 2)).toEqual(62);
38
- expect(() => g.toContinuous("Y", 2)).toThrow();
39
- });
40
-
41
- test("Maps string positions to continuous", () => {
42
- expect(g.toContinuous("2", /** @type {any} */ ("2"))).toEqual(12);
43
- });
44
-
45
- test("Maps continuous to chromosome and locus", () => {
46
- expect(g.toChromosomal(-1)).toBeUndefined();
47
- expect(g.toChromosomal(0)).toEqual({ chrom: "chr1", pos: 0 });
48
- expect(g.toChromosomal(12)).toEqual({ chrom: "chr2", pos: 2 });
49
- expect(g.toChromosomal(29)).toEqual({ chrom: "chr2", pos: 19 });
50
- expect(g.toChromosomal(30)).toEqual({ chrom: "chr3", pos: 0 });
51
- expect(g.toChromosomal(62)).toEqual({ chrom: "chrX", pos: 2 });
52
- expect(g.toChromosomal(99)).toEqual({ chrom: "chrX", pos: 39 });
53
-
54
- // Special handling for the end of the genome. Pos 40 does not exist in chrX
55
- // but we need for the endpoint of half-open interval covering the whole genome.
56
- expect(g.toChromosomal(100)).toEqual({ chrom: "chrX", pos: 40 });
57
- expect(g.toChromosomal(101)).toBeUndefined();
58
- });
59
-
60
- // Testing half-open intervals
61
- test("Maps continuous interval to chromosomal interval", () => {
62
- expect(g.toChromosomalInterval([0, 10])).toEqual([
63
- { chrom: "chr1", pos: 0 },
64
- { chrom: "chr1", pos: 10 },
65
- ]);
66
- expect(g.toChromosomalInterval([10, 100])).toEqual([
67
- { chrom: "chr2", pos: 0 },
68
- { chrom: "chrX", pos: 40 },
69
- ]);
70
- expect(g.toChromosomalInterval([0, 100])).toEqual([
71
- { chrom: "chr1", pos: 0 },
72
- { chrom: "chrX", pos: 40 },
73
- ]);
74
- });
75
-
76
- test("Maps interval with fractional parts to chromosomal interval", () => {
77
- expect(g.toChromosomalInterval([0.1, 99.9])).toEqual([
78
- { chrom: "chr1", pos: 0 },
79
- { chrom: "chrX", pos: 40 },
80
- ]);
81
- expect(g.toChromosomalInterval([0.6, 99.4])).toEqual([
82
- { chrom: "chr1", pos: 1 },
83
- { chrom: "chrX", pos: 39 },
84
- ]);
85
- });
86
-
87
- test("Maps chromosomal interval to continuous interval", () => {
88
- expect(
89
- g.toContinuousInterval([
90
- { chrom: "chr1", pos: 0 },
91
- { chrom: "chr1", pos: 10 },
92
- ])
93
- ).toEqual([0, 10]);
94
- expect(
95
- g.toContinuousInterval([
96
- { chrom: "chr1", pos: 1 },
97
- { chrom: "chr1", pos: 9 },
98
- ])
99
- ).toEqual([1, 9]);
100
- expect(
101
- g.toContinuousInterval([
102
- { chrom: "chr2", pos: 0 },
103
- { chrom: "chrX", pos: 40 },
104
- ])
105
- ).toEqual([10, 100]);
106
- expect(
107
- g.toContinuousInterval([
108
- { chrom: "chr1", pos: 0 },
109
- { chrom: "chrX", pos: 40 },
110
- ])
111
- ).toEqual([0, 100]);
112
- });
113
-
114
- test("Maps chromosomal interval without positions to continuous interval", () => {
115
- expect(
116
- g.toContinuousInterval([{ chrom: "chr1" }, { chrom: "chr1" }])
117
- ).toEqual([0, 10]);
118
- expect(
119
- g.toContinuousInterval([{ chrom: "chr2" }, { chrom: "chrX" }])
120
- ).toEqual([10, 100]);
121
- });
122
-
123
- test("Returns a properly annotated chromosomes array", () => {
124
- expect(g.chromosomes[1]).toEqual({
125
- name: "chr2",
126
- size: 20,
127
- index: 1,
128
- number: 2,
129
- continuousStart: 10,
130
- continuousEnd: 30,
131
- continuousInterval: [10, 30],
132
- odd: false,
133
- });
134
- });
135
-
136
- test("Splits a genomic interval into discrete chromosome intervals, single chromosome", () => {
137
- expect(
138
- g.toDiscreteChromosomeIntervals([
139
- { chrom: "chr2", pos: 5 },
140
- { chrom: "chr2", pos: 15 },
141
- ])
142
- ).toEqual([{ chrom: "chr2", startPos: 5, endPos: 15 }]);
143
- });
144
-
145
- test("Splits a genomic interval into discrete chromosome intervals, two chromosomes", () => {
146
- expect(
147
- g.toDiscreteChromosomeIntervals([
148
- { chrom: "chr2", pos: 5 },
149
- { chrom: "chr3", pos: 15 },
150
- ])
151
- ).toEqual([
152
- { chrom: "chr2", startPos: 5, endPos: 20 },
153
- { chrom: "chr3", startPos: 0, endPos: 15 },
154
- ]);
155
- });
156
-
157
- test("Splits a genomic interval into discrete chromosome intervals, three chromosomes", () => {
158
- expect(
159
- g.toDiscreteChromosomeIntervals([
160
- { chrom: "chr2", pos: 5 },
161
- { chrom: "chrX", pos: 15 },
162
- ])
163
- ).toEqual([
164
- { chrom: "chr2", startPos: 5, endPos: 20 },
165
- { chrom: "chr3", startPos: 0, endPos: 30 },
166
- { chrom: "chrX", startPos: 0, endPos: 15 },
167
- ]);
168
- });
169
- });
170
-
171
- describe("C. elegans genome, chromosome names prefixed with 'chr'", () => {
172
- const chromosomes = [
173
- { name: "chrI", size: 15072434 },
174
- { name: "chrII", size: 15279421 },
175
- { name: "chrIII", size: 13783801 },
176
- { name: "chrIV", size: 17493829 },
177
- { name: "chrV", size: 20924180 },
178
- { name: "chrX", size: 17718942 },
179
- { name: "chrM", size: 13794 },
180
- ];
181
-
182
- const g = new Genome({ name: "random", contigs: chromosomes });
183
-
184
- test("Maps chromosome names to continuous", () => {
185
- expect(g.toContinuous("chrIII", 10)).toEqual(30351865);
186
- });
187
-
188
- test("Maps unprefixed names to continuous", () => {
189
- expect(g.toContinuous("III", 10)).toEqual(30351865);
190
- });
191
- });
192
-
193
- describe("Load chrom.sizes file from a URL", () => {
194
- const fetchSpy = vi.spyOn(global, "fetch");
195
- fetchSpy.mockImplementation((/** @type {string} */ url) => {
196
- if (url !== "http://example.com/chrom.sizes") {
197
- throw new Error(`Unexpected URL: ${url}`);
198
- }
199
- return Promise.resolve(
200
- // @ts-expect-error
201
- {
202
- text() {
203
- return Promise.resolve(
204
- "chr1\t1000\nchr2\t2000\nchr3\t3000\nchrX\t4000"
205
- );
206
- },
207
- ok: true,
208
- }
209
- );
210
- });
211
-
212
- afterAll(() => {
213
- fetchSpy.mockRestore();
214
- });
215
-
216
- test("Throw if the deprecated baseUrl property is provided", () => {
217
- expect(
218
- () =>
219
- new Genome({
220
- name: "random",
221
- // @ts-expect-error
222
- baseUrl: "http://example.com",
223
- })
224
- ).toThrow(/removed/);
225
- });
226
-
227
- test("Loads and parses a genome", async () => {
228
- const g = new Genome({ name: "random", url: "chrom.sizes" });
229
- await g.load("http://example.com");
230
-
231
- expect(g.parseInterval("chr2")).toEqual([1000, 3000]);
232
- });
233
- });
234
-
235
- describe("Parse interval strings", () => {
236
- const chromosomes = [
237
- { name: "chr1", size: 1000 },
238
- { name: "chr2", size: 2000 },
239
- { name: "chr3", size: 3000 },
240
- { name: "chrX", size: 4000 },
241
- ];
242
-
243
- const g = new Genome({ name: "random", contigs: chromosomes });
244
-
245
- test("Parses a single chromosome, returns an interval spanning the chromosome", () => {
246
- expect(g.parseInterval("chr2")).toEqual([1000, 3000]);
247
- });
248
-
249
- test("Returns undefined on unknown chromosome", () => {
250
- expect(g.parseInterval("chrZ")).toBeUndefined();
251
- });
252
-
253
- test("Parses a single coordinate without a thousand separator", () => {
254
- expect(g.parseInterval("chr2:1500")).toEqual([2499, 2500]);
255
- });
256
-
257
- test("Parses a single coordinate with a thousand separator", () => {
258
- expect(g.parseInterval("chr2:1,500")).toEqual([2499, 2500]);
259
- });
260
-
261
- test("Parses an interval within a single chromosome", () => {
262
- expect(g.parseInterval("chr2:1,500-1,700")).toEqual([2499, 2700]);
263
- });
264
-
265
- test("Parses an interval spanning multiple chromosomes", () => {
266
- expect(g.parseInterval("chr2:1,500-chr3:1,500")).toEqual([2499, 4500]);
267
- });
268
- });
@@ -1,8 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import { getContigs } from "./genomes.js";
3
-
4
- test("getContigs", () => {
5
- expect(getContigs("mm10")[0]).toEqual({ name: "chr1", size: 195471971 });
6
- expect(getContigs("mm10")[5]).toEqual({ name: "chr6", size: 149736546 });
7
- expect(getContigs("hg38")[19]).toEqual({ name: "chr20", size: 64444167 });
8
- });
@@ -1,78 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import scaleIndex from "./scaleIndex.js";
3
-
4
- test("Scale with defaults works as expected", () => {
5
- const scale = scaleIndex();
6
-
7
- // Align is 0.5 by default
8
- expect(scale(-1)).toEqual(-0.5);
9
- expect(scale(0)).toEqual(0.5);
10
- expect(scale(1)).toEqual(1.5);
11
- expect(scale(2)).toEqual(2.5);
12
- });
13
-
14
- test("Scale scales correctly with custom domain and range", () => {
15
- const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.0);
16
-
17
- expect(scale(0)).toEqual(100);
18
- expect(scale(10)).toEqual(200);
19
- });
20
-
21
- test("Invert works as expected", () => {
22
- const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.0);
23
-
24
- expect(scale.invert(scale(0))).toEqual(0);
25
- expect(scale.invert(scale(5))).toEqual(5);
26
- expect(scale.invert(scale(10))).toEqual(10);
27
- });
28
-
29
- test("Scale scales correctly with custom domain, range, and align", () => {
30
- const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.5);
31
-
32
- expect(scale(0)).toEqual(105);
33
- expect(scale(10)).toEqual(205);
34
- });
35
-
36
- test("Invert works as expected with align", () => {
37
- const scale = scaleIndex().domain([0, 10]).range([100, 200]).align(0.5);
38
-
39
- expect(scale.invert(scale(0))).toEqual(0);
40
- expect(scale.invert(scale(5))).toEqual(5);
41
- expect(scale.invert(scale(10))).toEqual(10);
42
- });
43
-
44
- test("domain() accepts numeric ordinal domain and computes its extent", () => {
45
- const scale = scaleIndex().domain([7, 3, 5, 9, 8]);
46
- expect(scale.domain()).toEqual([3, 9]);
47
- });
48
-
49
- test("domain() clamps the minimum domain span to one", () => {
50
- const scale = scaleIndex().domain([1.25, 1.75]);
51
- expect(scale.domain()).toEqual([1, 2]);
52
-
53
- scale.domain([1.75, 2.25]);
54
- expect(scale.domain()).toEqual([1.5, 2.5]);
55
- });
56
-
57
- test("ticks() produces integer values", () => {
58
- const scale = scaleIndex().domain([0, 5]).numberingOffset(0);
59
-
60
- expect(scale.ticks(5)).toEqual([0, 1, 2, 3, 4]);
61
- expect(scale.ticks(100)).toEqual([0, 1, 2, 3, 4]);
62
- });
63
-
64
- test("ticks() take numberingOffset into account", () => {
65
- const scale = scaleIndex().domain([10, 15]).numberingOffset(1);
66
-
67
- // The ticks have been offset so that nice labels can be generated (5, 10, 15, ...)
68
- expect(scale.ticks(5)).toEqual([10, 11, 12, 13, 14]);
69
- });
70
-
71
- test("tickFormat() takes numberingOffset into account", () => {
72
- const scale = scaleIndex().domain([10, 15]).numberingOffset(1);
73
-
74
- const format = scale.tickFormat(5);
75
-
76
- // Although the ticks have been offset, the labels should be nice
77
- expect(scale.ticks(5).map(format)).toEqual(["11", "12", "13", "14", "15"]);
78
- });
@@ -1,4 +0,0 @@
1
- import { test } from "vitest";
2
- import scaleLocus from "./scaleLocus.js";
3
-
4
- test.todo("Write some tests!");