@genome-spy/core 0.65.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 (232) 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 +17587 -16593
  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/flowInit.js +2 -2
  16. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  17. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  18. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  19. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  20. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  21. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  22. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  23. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  24. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  25. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  26. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  27. package/dist/src/encoder/encoder.d.ts +1 -1
  28. package/dist/src/encoder/encoder.d.ts.map +1 -1
  29. package/dist/src/encoder/encoder.js +1 -1
  30. package/dist/src/genome/scaleLocus.d.ts +39 -0
  31. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  32. package/dist/src/genome/scaleLocus.js +76 -0
  33. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  34. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  35. package/dist/src/genomeSpy/canvasExport.js +66 -0
  36. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  37. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  38. package/dist/src/genomeSpy/containerUi.js +78 -0
  39. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  40. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  41. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  42. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  43. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  44. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  45. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  46. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  47. package/dist/src/genomeSpy/interactionController.js +371 -0
  48. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  49. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  50. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  51. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  52. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  53. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  54. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  55. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  56. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  57. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  58. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  59. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  60. package/dist/src/genomeSpy/viewDataInit.d.ts +12 -0
  61. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  62. package/dist/src/genomeSpy/viewDataInit.js +41 -0
  63. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  64. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  65. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  66. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  67. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  68. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  69. package/dist/src/genomeSpy.d.ts +16 -71
  70. package/dist/src/genomeSpy.d.ts.map +1 -1
  71. package/dist/src/genomeSpy.js +179 -745
  72. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  73. package/dist/src/gl/webGLHelper.d.ts +2 -2
  74. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  75. package/dist/src/gl/webGLHelper.js +4 -4
  76. package/dist/src/index.d.ts.map +1 -1
  77. package/dist/src/index.js +2 -12
  78. package/dist/src/marks/mark.d.ts.map +1 -1
  79. package/dist/src/marks/mark.js +4 -2
  80. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  81. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  82. package/dist/src/{view → scales}/axisResolution.js +29 -18
  83. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  84. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  85. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  86. package/dist/src/scales/scaleDomainAggregator.js +162 -0
  87. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  88. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  89. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  90. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  91. package/dist/src/scales/scaleInstanceManager.js +313 -0
  92. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  93. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  94. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  95. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  96. package/dist/src/scales/scaleInteractionController.js +336 -0
  97. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  98. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  99. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  100. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  101. package/dist/src/scales/scalePropsResolver.js +74 -0
  102. package/dist/src/{view → scales}/scaleResolution.d.ts +52 -35
  103. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  104. package/dist/src/scales/scaleResolution.js +658 -0
  105. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  106. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  107. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  108. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  109. package/dist/src/scales/scaleRules.d.ts +16 -0
  110. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  111. package/dist/src/scales/scaleRules.js +103 -0
  112. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  113. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  114. package/dist/src/spec/channel.d.ts +13 -18
  115. package/dist/src/spec/scale.d.ts +6 -0
  116. package/dist/src/types/embedApi.d.ts +5 -0
  117. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  118. package/dist/src/view/concatView.d.ts +18 -0
  119. package/dist/src/view/concatView.d.ts.map +1 -1
  120. package/dist/src/view/concatView.js +73 -0
  121. package/dist/src/view/concatView.test.d.ts +2 -0
  122. package/dist/src/view/concatView.test.d.ts.map +1 -0
  123. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  124. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  125. package/dist/src/view/containerMutationHelper.js +114 -0
  126. package/dist/src/view/containerView.d.ts +0 -7
  127. package/dist/src/view/containerView.d.ts.map +1 -1
  128. package/dist/src/view/containerView.js +0 -10
  129. package/dist/src/view/facetView.d.ts.map +1 -1
  130. package/dist/src/view/facetView.js +0 -15
  131. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  132. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  133. package/dist/src/view/gridView/gridChild.js +32 -6
  134. package/dist/src/view/gridView/gridView.d.ts +39 -1
  135. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  136. package/dist/src/view/gridView/gridView.js +106 -48
  137. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  138. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  139. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  140. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  141. package/dist/src/view/gridView/scrollbar.js +184 -69
  142. package/dist/src/view/layerView.d.ts +14 -0
  143. package/dist/src/view/layerView.d.ts.map +1 -1
  144. package/dist/src/view/layerView.js +66 -0
  145. package/dist/src/view/layerView.test.d.ts +2 -0
  146. package/dist/src/view/layerView.test.d.ts.map +1 -0
  147. package/dist/src/view/testUtils.d.ts.map +1 -1
  148. package/dist/src/view/testUtils.js +2 -1
  149. package/dist/src/view/unitView.d.ts.map +1 -1
  150. package/dist/src/view/unitView.js +24 -34
  151. package/dist/src/view/view.d.ts +6 -6
  152. package/dist/src/view/view.d.ts.map +1 -1
  153. package/dist/src/view/view.js +4 -4
  154. package/package.json +2 -2
  155. package/dist/bundle/browser-txUcLy2H.js +0 -123
  156. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  157. package/dist/bundle/index-BhtHKLUo.js +0 -73
  158. package/dist/bundle/index-CCe8rnZz.js +0 -716
  159. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  160. package/dist/src/data/collector.test.js +0 -138
  161. package/dist/src/data/dataFlow.test.js +0 -38
  162. package/dist/src/data/flow.test.js +0 -81
  163. package/dist/src/data/flowInit.test.js +0 -413
  164. package/dist/src/data/flowNode.test.js +0 -50
  165. package/dist/src/data/flowOptimizer.test.js +0 -209
  166. package/dist/src/data/formats/fasta.test.js +0 -27
  167. package/dist/src/data/sources/inlineSource.test.js +0 -63
  168. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  169. package/dist/src/data/transforms/aggregate.test.js +0 -134
  170. package/dist/src/data/transforms/clone.test.js +0 -11
  171. package/dist/src/data/transforms/coverage.test.js +0 -238
  172. package/dist/src/data/transforms/filter.test.js +0 -20
  173. package/dist/src/data/transforms/flatten.test.js +0 -96
  174. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  175. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  176. package/dist/src/data/transforms/formula.test.js +0 -25
  177. package/dist/src/data/transforms/identifier.test.js +0 -92
  178. package/dist/src/data/transforms/pileup.test.js +0 -70
  179. package/dist/src/data/transforms/project.test.js +0 -32
  180. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  181. package/dist/src/data/transforms/regexFold.test.js +0 -201
  182. package/dist/src/data/transforms/sample.test.js +0 -38
  183. package/dist/src/data/transforms/stack.test.js +0 -91
  184. package/dist/src/encoder/accessor.test.js +0 -162
  185. package/dist/src/encoder/encoder.test.js +0 -105
  186. package/dist/src/genome/genome.test.js +0 -268
  187. package/dist/src/genome/genomes.test.js +0 -8
  188. package/dist/src/genome/scaleIndex.test.js +0 -78
  189. package/dist/src/genome/scaleLocus.test.js +0 -4
  190. package/dist/src/scale/scale.test.js +0 -326
  191. package/dist/src/scale/ticks.test.js +0 -46
  192. package/dist/src/selection/selection.test.js +0 -14
  193. package/dist/src/utils/addBaseUrl.test.js +0 -30
  194. package/dist/src/utils/binnedIndex.test.js +0 -201
  195. package/dist/src/utils/cloner.test.js +0 -35
  196. package/dist/src/utils/coalesce.test.js +0 -16
  197. package/dist/src/utils/concatIterables.test.js +0 -8
  198. package/dist/src/utils/domainArray.test.js +0 -130
  199. package/dist/src/utils/indexer.test.js +0 -49
  200. package/dist/src/utils/interactionEvent.test.js +0 -35
  201. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  202. package/dist/src/utils/kWayMerge.test.js +0 -30
  203. package/dist/src/utils/mergeObjects.test.js +0 -42
  204. package/dist/src/utils/numberExtractor.test.js +0 -6
  205. package/dist/src/utils/propertyCacher.test.js +0 -89
  206. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  207. package/dist/src/utils/radixSort.test.js +0 -51
  208. package/dist/src/utils/reservationMap.test.js +0 -20
  209. package/dist/src/utils/ringBuffer.test.js +0 -39
  210. package/dist/src/utils/topK.test.js +0 -54
  211. package/dist/src/utils/trees.test.js +0 -135
  212. package/dist/src/utils/url.test.js +0 -28
  213. package/dist/src/utils/variableTools.test.js +0 -13
  214. package/dist/src/view/axisResolution.d.ts.map +0 -1
  215. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  216. package/dist/src/view/axisResolution.test.js +0 -206
  217. package/dist/src/view/flowBuilder.test.js +0 -125
  218. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  219. package/dist/src/view/layout/flexLayout.test.js +0 -323
  220. package/dist/src/view/layout/grid.test.js +0 -71
  221. package/dist/src/view/layout/rectangle.test.js +0 -192
  222. package/dist/src/view/paramMediator.test.js +0 -282
  223. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  224. package/dist/src/view/scaleResolution.js +0 -1059
  225. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  226. package/dist/src/view/scaleResolution.test.js +0 -645
  227. package/dist/src/view/view.test.js +0 -245
  228. package/dist/src/view/viewDispose.test.js +0 -110
  229. package/dist/src/view/viewFactory.test.js +0 -25
  230. package/dist/src/view/viewUtils.test.js +0 -87
  231. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  232. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -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!");
@@ -1,326 +0,0 @@
1
- // @ts-nocheck
2
-
3
- import { expect, test } from "vitest";
4
- /*!
5
- * Adapted from vega-encode:
6
- * https://github.com/vega/vega/blob/master/packages/vega-encode/test/scale-test.js
7
- *
8
- * Copyright (c) 2015-2018, University of Washington Interactive Data Lab
9
- * All rights reserved.
10
- *
11
- * BSD-3-Clause License: https://github.com/vega/vega-lite/blob/master/LICENSE
12
- */
13
-
14
- /* eslint-disable */
15
-
16
- import * as util from "vega-util";
17
- import * as vs from "vega-scale";
18
- import createScale from "./scale.js";
19
-
20
- // Suppress warnings by default
21
- const scale = (params, logger) =>
22
- createScale(params, logger || { warn: () => {} });
23
-
24
- test("Scale respects domain configuration", function () {
25
- var s,
26
- params = {
27
- type: "linear",
28
- domain: [1, 9.5],
29
- };
30
-
31
- // test zero inclusion
32
- s = scale(params);
33
- expect(s.domain()).toEqual([0, 9.5]);
34
- s = scale(util.extend({ zero: true }, params));
35
- expect(s.domain()).toEqual([0, 9.5]);
36
- s = scale(util.extend({ zero: false }, params));
37
- expect(s.domain()).toEqual([1, 9.5]);
38
-
39
- // test nice domain
40
- s = scale(util.extend({ nice: true }, params));
41
- expect(s.domain()).toEqual([0, 10]);
42
-
43
- // test domain min/max
44
- s = scale(util.extend({ domainMin: -1, domainMax: 10 }, params));
45
- expect(s.domain()).toEqual([-1, 10]);
46
-
47
- // domain min overrides zero
48
- s = scale(
49
- util.extend({ zero: true, domainMin: 0.5, domainMax: 10 }, params)
50
- );
51
- expect(s.domain()).toEqual([0.5, 10]);
52
-
53
- // test domain mid
54
- s = scale(util.extend({ domainMid: 5 }, params));
55
- expect(s.domain()).toEqual([0, 5, 9.5]);
56
-
57
- // test domain raw
58
- s = scale(util.extend({ domainRaw: [2, 11] }, params));
59
- expect(s.domain()).toEqual([2, 11]);
60
- });
61
-
62
- test("Scale respects domain padding", function () {
63
- var d;
64
-
65
- // test linear scale padding
66
- d = scale({
67
- type: "linear",
68
- domain: [5, 95],
69
- range: [0, 100],
70
- padding: 5,
71
- zero: false,
72
- }).domain();
73
- expect(d).toEqual([0, 100]);
74
-
75
- // test log scale padding
76
- d = scale({
77
- type: "log",
78
- domain: [1, 10],
79
- range: [0, 60],
80
- padding: 20,
81
- zero: false,
82
- }).domain();
83
- expect(Math.abs(d[0] - 0.1) < 1e-8).toBeTruthy();
84
- expect(Math.abs(d[1] - 100) < 1e-8).toBeTruthy();
85
-
86
- // test sqrt scale padding
87
- d = scale({
88
- type: "sqrt",
89
- domain: [2 * 2, 3 * 3],
90
- range: [0, 60],
91
- padding: 20,
92
- zero: false,
93
- }).domain();
94
- expect(Math.abs(d[0] - 1 * 1) < 1e-8).toBeTruthy();
95
- expect(Math.abs(d[1] - 4 * 4) < 1e-8).toBeTruthy();
96
-
97
- // test power scale padding
98
- d = scale({
99
- type: "pow",
100
- exponent: 1 / 3,
101
- domain: [2 * 2 * 2, 3 * 3 * 3],
102
- range: [0, 60],
103
- padding: 20,
104
- zero: false,
105
- }).domain();
106
- expect(Math.abs(d[0] - 1 * 1 * 1) < 1e-8).toBeTruthy();
107
- expect(Math.abs(d[1] - 4 * 4 * 4) < 1e-8).toBeTruthy();
108
- });
109
-
110
- test("Ordinal scale respects domainImplicit", function () {
111
- var s,
112
- params = {
113
- type: "ordinal",
114
- domain: [],
115
- range: ["a", "b", "c"],
116
- };
117
-
118
- s = scale(params);
119
- expect(s("foo")).toBe(undefined);
120
- expect(s("bar")).toBe(undefined);
121
- expect(s("foo")).toBe(undefined);
122
-
123
- s = scale(util.extend({ domainImplicit: false }, params));
124
- expect(s("foo")).toBe(undefined);
125
- expect(s("bar")).toBe(undefined);
126
- expect(s("foo")).toBe(undefined);
127
-
128
- s = scale(util.extend({ domainImplicit: true }, params));
129
- expect(s("foo")).toBe("a");
130
- expect(s("bar")).toBe("b");
131
- expect(s("foo")).toBe("a");
132
- });
133
-
134
- test("Scale respects range configuration", function () {
135
- var s,
136
- params = {
137
- type: "linear",
138
- domain: [0, 10],
139
- range: [0, 10],
140
- };
141
-
142
- // round
143
- s = scale(params);
144
- expect(s(0.5)).toBe(0.5);
145
- s = scale(util.extend({ round: true }, params));
146
- expect(s(0.5)).toBe(1);
147
-
148
- // reverse
149
- s = scale(util.extend({ reverse: true }, params));
150
- expect(s.range()).toEqual([10, 0]);
151
-
152
- // rangeStep
153
- params = {
154
- type: "band",
155
- domain: ["a", "b", "c"],
156
- rangeStep: 20,
157
- padding: 0,
158
- };
159
- s = scale(params);
160
- expect(s.range()).toEqual([0, 60]);
161
- expect(s.bandwidth()).toBe(20);
162
-
163
- s = expect(function () {
164
- scale(util.extend({}, params, { type: "linear" }));
165
- }).toThrow();
166
- });
167
-
168
- test("Scale respects range color schemes", function () {
169
- var s, u, v;
170
-
171
- // performs scheme lookup
172
- s = scale({ type: "ordinal", scheme: "category10" });
173
- expect(s.range().length).toBe(10);
174
-
175
- // throws on invalid scheme
176
- expect(function () {
177
- scale({ type: "ordinal", scheme: "foobarbaz" });
178
- }).toThrow();
179
- expect(function () {
180
- scale({ type: "sequential", scheme: "foobarbaz" });
181
- }).toThrow();
182
-
183
- // handles interpolating schemes and extents
184
- s = scale({ type: "sequential", scheme: "viridis" });
185
- u = s.interpolator();
186
- expect(typeof u).toBe("function");
187
-
188
- s = scale({
189
- type: "sequential",
190
- scheme: "viridis",
191
- schemeExtent: [0.2, 0.9],
192
- });
193
- v = s.interpolator();
194
- expect(typeof v).toBe("function");
195
- expect(v(0)).toBe(u(0.2));
196
- expect(v(1)).toBe(u(0.9));
197
-
198
- s = scale({
199
- type: "sequential",
200
- scheme: "viridis",
201
- schemeExtent: [0.2, 0.9],
202
- reverse: true,
203
- });
204
- v = s.interpolator();
205
- expect(typeof v).toBe("function");
206
- expect(v(0)).toBe(u(0.9));
207
- expect(v(1)).toBe(u(0.2));
208
-
209
- // generate interpolator as needed
210
- s = scale({ type: "sequential", range: ["#000", "#f00"] });
211
- v = s.interpolator();
212
- expect(typeof v).toBe("function");
213
- expect(v(0)).toBe("rgb(0, 0, 0)");
214
- expect(v(1)).toBe("rgb(255, 0, 0)");
215
-
216
- // quantize to provided scheme count
217
- s = scale({ type: "quantize", scheme: "viridis", schemeCount: 3 });
218
- v = s.range();
219
- expect(v.length).toBe(3);
220
- expect(v[0]).toBe(u(1 / 4));
221
- expect(v[1]).toBe(u(2 / 4));
222
- expect(v[2]).toBe(u(3 / 4));
223
- });
224
-
225
- test("Scale warns for zero in log domain", function () {
226
- function logScale(domain) {
227
- const logger = {
228
- count: 0,
229
- warn: function (msg) {
230
- this.count++;
231
- },
232
- };
233
-
234
- return function () {
235
- scale({ type: "log", domain: domain }, logger);
236
- if (logger.count) {
237
- throw new Error();
238
- }
239
- };
240
- }
241
-
242
- expect(logScale([0, 1])).toThrow();
243
- expect(logScale([-1, 0])).toThrow();
244
- expect(logScale([-1, 1])).toThrow();
245
- expect(logScale([1, 0, 2])).toThrow();
246
- expect(logScale([1, 2])).not.toThrow();
247
- expect(logScale([-2, -1])).not.toThrow();
248
- });
249
-
250
- test("Scale infers scale key from type, domain, and range", function () {
251
- function key(params) {
252
- return scale(params).type;
253
- }
254
-
255
- // numeric domain scales should adapt
256
- [vs.Linear, vs.Log, vs.Pow, vs.Sqrt, vs.Symlog].forEach(function (st) {
257
- expect(key({ type: st, domain: [0, 1], range: [0, 1] })).toBe(st);
258
- expect(key({ type: st, domain: [0, 1], range: [true, false] })).toBe(
259
- st
260
- );
261
-
262
- // direct color range specification
263
- expect(key({ type: st, domain: [0, 1], range: ["blue", "red"] })).toBe(
264
- `${vs.Sequential}-${st}`
265
- );
266
- expect(
267
- key({ type: st, domain: [0, 1, 2], range: ["blue", "red"] })
268
- ).toBe(`${vs.Diverging}-${st}`);
269
- expect(
270
- key({ type: st, domain: [0, 1, 2, 3], range: ["blue", "red"] })
271
- ).toBe(st);
272
-
273
- // color scheme range specification
274
- expect(key({ type: st, domain: [0, 1], scheme: "blues" })).toBe(
275
- `${vs.Sequential}-${st}`
276
- );
277
- expect(key({ type: st, domain: [0, 1, 2], scheme: "blues" })).toBe(
278
- `${vs.Diverging}-${st}`
279
- );
280
- expect(key({ type: st, domain: [0, 1, 2, 3], scheme: "blues" })).toBe(
281
- st
282
- );
283
- });
284
-
285
- // temporal domain scales should not adapt
286
- [vs.Time, vs.UTC].forEach(function (st) {
287
- const t0 = new Date(2010, 0, 1),
288
- t1 = new Date(2011, 0, 1),
289
- t2 = new Date(2012, 0, 1),
290
- t3 = new Date(2013, 0, 1);
291
-
292
- expect(key({ type: st, domain: [t0, t1], range: [0, 1] })).toBe(st);
293
- expect(key({ type: st, domain: [t0, t1], range: [true, false] })).toBe(
294
- st
295
- );
296
-
297
- // direct color range specification
298
- expect(
299
- key({ type: st, domain: [t0, t1], range: ["blue", "red"] })
300
- ).toBe(st);
301
- expect(
302
- key({ type: st, domain: [t0, t1, t2], range: ["blue", "red"] })
303
- ).toBe(st);
304
- expect(
305
- key({ type: st, domain: [t0, t1, t2, t3], range: ["blue", "red"] })
306
- ).toBe(st);
307
-
308
- // color scheme range specification
309
- expect(key({ type: st, domain: [t0, t1], scheme: "blues" })).toBe(st);
310
- expect(key({ type: st, domain: [t0, t1, t2], scheme: "blues" })).toBe(
311
- st
312
- );
313
- expect(
314
- key({ type: st, domain: [t0, t1, t2, t3], scheme: "blues" })
315
- ).toBe(st);
316
- });
317
-
318
- // sequential should work for backwards compatibility
319
- const st = vs.Sequential;
320
- expect(key({ type: st, domain: [0, 1], range: ["blue", "red"] })).toBe(
321
- `${st}-${vs.Linear}`
322
- );
323
- expect(key({ type: st, domain: [0, 1], scheme: "blues" })).toBe(
324
- `${st}-${vs.Linear}`
325
- );
326
- });