@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,70 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { processData } from "../flowTestUtils.js";
3
-
4
- import RegexExtractTransform from "./regexExtract.js";
5
-
6
- /**
7
- * @param {import("../../spec/transform.js").RegexExtractParams} params
8
- * @param {any[]} data
9
- */
10
- function transform(params, data) {
11
- return processData(new RegexExtractTransform(params), data);
12
- }
13
-
14
- describe("RegexExtractTransform", () => {
15
- /**
16
- * @typedef {import("../../spec/transform.js").RegexExtractParams} RegexExtractParams
17
- */
18
- const rows = [{ a: "12-34" }, { a: "23-45" }];
19
-
20
- /** @type {RegexExtractParams} */
21
- const params = {
22
- type: "regexExtract",
23
- regex: "^(\\d+)-(\\d+)$",
24
- field: "a",
25
- as: ["b", "c"],
26
- };
27
-
28
- test("Valid config and input", () => {
29
- expect(transform(params, rows)).toEqual([
30
- { a: "12-34", b: "12", c: "34" },
31
- { a: "23-45", b: "23", c: "45" },
32
- ]);
33
- });
34
-
35
- test("Invalid config", () => {
36
- /** @type {RegexExtractParams} */
37
- const config2 = {
38
- type: "regexExtract",
39
- regex: "^(\\d+)-(\\d+)$",
40
- field: "a",
41
- as: ["b", "c", "d"],
42
- };
43
-
44
- expect(() => transform(config2, rows)).toThrow();
45
- });
46
-
47
- test("Invalid data", () => {
48
- const rows2 = [{ a: "12--34" }];
49
-
50
- expect(() => transform(params, rows2)).toThrow();
51
- });
52
-
53
- test("Invalid, non-string data", () => {
54
- const rows2 = [{ a: 123 }];
55
-
56
- expect(() => transform(params, rows2)).toThrow();
57
- });
58
-
59
- test("Skip invalid or non-string data", () => {
60
- const rows2 = [{ a: 123 }, { a: "xyzzy" }, { a: "12-34" }];
61
-
62
- expect(transform({ ...params, skipInvalidInput: true }, rows2)).toEqual(
63
- [
64
- { a: 123, b: undefined, c: undefined },
65
- { a: "xyzzy", b: undefined, c: undefined },
66
- { a: "12-34", b: "12", c: "34" },
67
- ]
68
- );
69
- });
70
- });
@@ -1,201 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { processData } from "../flowTestUtils.js";
3
- import RegexFoldTransform from "./regexFold.js";
4
-
5
- describe("RegexFold", () => {
6
- test("Throws error if the number of capture groups in columnRegex != 1", () => {
7
- /** @type { import("../../spec/transform.js").RegexFoldParams } */
8
- const singleGatherConfig = {
9
- type: "regexFold",
10
- columnRegex: "^.+_a$",
11
- asValue: "a",
12
- };
13
-
14
- expect(() => new RegexFoldTransform(singleGatherConfig)).toThrowError(
15
- `Regex /^.+_a$/ must have exactly one capturing group!`
16
- );
17
- });
18
-
19
- test("Transform single variable", () => {
20
- const sampleData = [
21
- {
22
- row: 1,
23
- sample1_a: "r1s1a",
24
- sample2_a: "r1s2a",
25
- },
26
- {
27
- row: 2,
28
- sample1_a: "r2s1a",
29
- sample2_a: "r2s2a",
30
- },
31
- ];
32
-
33
- /** @type { import("../../spec/transform.js").RegexFoldParams } */
34
- const singleGatherConfig = {
35
- type: "regexFold",
36
- columnRegex: "^(.*)_a$",
37
- asValue: "a",
38
- };
39
-
40
- const result = processData(
41
- new RegexFoldTransform(singleGatherConfig),
42
- sampleData
43
- );
44
-
45
- expect(result).toEqual([
46
- {
47
- row: 1,
48
- sample: "sample1",
49
- a: "r1s1a",
50
- },
51
- {
52
- row: 1,
53
- sample: "sample2",
54
- a: "r1s2a",
55
- },
56
- {
57
- row: 2,
58
- sample: "sample1",
59
- a: "r2s1a",
60
- },
61
- {
62
- row: 2,
63
- sample: "sample2",
64
- a: "r2s2a",
65
- },
66
- ]);
67
- });
68
-
69
- test("Transform single variable and skip specific columns", () => {
70
- const sampleData = [
71
- {
72
- row: 1,
73
- sample1_a: "r1s1a",
74
- sample2_a: "r1s2a",
75
- },
76
- {
77
- row: 2,
78
- sample1_a: "r2s1a",
79
- sample2_a: "r2s2a",
80
- },
81
- ];
82
-
83
- /** @type { import("../../spec/transform.js").RegexFoldParams } */
84
- const singleGatherConfig = {
85
- type: "regexFold",
86
- columnRegex: "^(.*)_a$",
87
- asValue: "a",
88
- skipRegex: "^row$",
89
- };
90
-
91
- const result = processData(
92
- new RegexFoldTransform(singleGatherConfig),
93
- sampleData
94
- );
95
-
96
- expect(result).toEqual([
97
- {
98
- sample: "sample1",
99
- a: "r1s1a",
100
- },
101
- {
102
- sample: "sample2",
103
- a: "r1s2a",
104
- },
105
- {
106
- sample: "sample1",
107
- a: "r2s1a",
108
- },
109
- {
110
- sample: "sample2",
111
- a: "r2s2a",
112
- },
113
- ]);
114
- });
115
-
116
- test("Transform multiple variables", () => {
117
- const sampleData = [
118
- {
119
- row: 1,
120
- sample1_a: "r1s1a",
121
- sample2_a: "r1s2a",
122
- sample1_b: "r1s1b",
123
- sample2_b: "r1s2b",
124
- },
125
- {
126
- row: 2,
127
- sample1_a: "r2s1a",
128
- sample2_a: "r2s2a",
129
- sample1_b: "r2s1b",
130
- sample2_b: "r2s2b",
131
- },
132
- ];
133
-
134
- /** @type { import("../../spec/transform.js").RegexFoldParams } */
135
- const singleGatherConfig = {
136
- type: "regexFold",
137
- columnRegex: ["^(.*)_a$", "^(.*)_b$"],
138
- asValue: ["a", "b"],
139
- };
140
-
141
- const result = processData(
142
- new RegexFoldTransform(singleGatherConfig),
143
- sampleData
144
- );
145
-
146
- expect(result).toEqual([
147
- {
148
- row: 1,
149
- sample: "sample1",
150
- a: "r1s1a",
151
- b: "r1s1b",
152
- },
153
- {
154
- row: 1,
155
- sample: "sample2",
156
- a: "r1s2a",
157
- b: "r1s2b",
158
- },
159
- {
160
- row: 2,
161
- sample: "sample1",
162
- a: "r2s1a",
163
- b: "r2s1b",
164
- },
165
- {
166
- row: 2,
167
- sample: "sample2",
168
- a: "r2s2a",
169
- b: "r2s2b",
170
- },
171
- ]);
172
- });
173
-
174
- test("Throws error if no columns match the regex", () => {
175
- const sampleData = [
176
- {
177
- row: 1,
178
- sample1_a: "r1s1a",
179
- sample2_a: "r1s2a",
180
- },
181
- {
182
- row: 2,
183
- sample1_a: "r2s1a",
184
- sample2_a: "r2s2a",
185
- },
186
- ];
187
-
188
- /** @type { import("../../spec/transform.js").RegexFoldParams } */
189
- const singleGatherConfig = {
190
- type: "regexFold",
191
- columnRegex: "^(.*)_c$",
192
- asValue: "a",
193
- };
194
-
195
- expect(() =>
196
- processData(new RegexFoldTransform(singleGatherConfig), sampleData)
197
- ).toThrowError(
198
- "No columns matching the regex /^(.*)_c$/ found in the data!"
199
- );
200
- });
201
- });
@@ -1,38 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import SampleTransform from "./sample.js";
3
- import { extent } from "d3-array";
4
- import { createChain } from "../../view/flowBuilder.js";
5
-
6
- test("SampleTransform produces roughly uniform distributions", () => {
7
- const size = 10;
8
- const n = 20;
9
- const rounds = 10000;
10
-
11
- const freqs = [];
12
- for (let i = 0; i < n; i++) {
13
- freqs[i] = 0;
14
- }
15
-
16
- const { dataSource, collector } = createChain(
17
- new SampleTransform({ type: "sample", size })
18
- );
19
-
20
- for (let r = 0; r < rounds; r++) {
21
- for (let i = 0; i < n; i++) {
22
- dataSource.handle({ data: i });
23
- }
24
- dataSource.complete();
25
-
26
- for (const datum of collector.getData()) {
27
- freqs[datum.data] = freqs[datum.data] + 1;
28
- }
29
-
30
- dataSource.reset();
31
- }
32
-
33
- const e = extent(freqs);
34
-
35
- // Not a deterministic test! TODO: Come up with some sensical testing method
36
- expect(e[0]).toBeGreaterThan(4800);
37
- expect(e[1]).toBeLessThan(5200);
38
- });
@@ -1,91 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { processData } from "../flowTestUtils.js";
3
- import StackTransform from "./stack.js";
4
-
5
- const sampleData = [
6
- { group: "a", choice: "q", value: 1 },
7
- { group: "b", choice: "x", value: 1 },
8
- { group: "b", choice: "y", value: 3 },
9
- ];
10
-
11
- /** @type {import("../../spec/transform.js").StackParams} */
12
- const baseParams = {
13
- type: "stack",
14
- field: "value",
15
- groupby: ["group"],
16
- sort: {
17
- field: "value",
18
- order: "ascending",
19
- },
20
- offset: "zero",
21
- as: ["z0", "z1"],
22
- };
23
-
24
- /**
25
- *
26
- * @param {import("../../spec/transform.js").StackParams} params
27
- * @param {any[]} data
28
- */
29
- function transform(params, data) {
30
- return processData(new StackTransform(params), data);
31
- }
32
-
33
- describe("Stack transform", () => {
34
- test("No field", () => {
35
- const conf = Object.assign({}, baseParams, {
36
- field: undefined,
37
- });
38
-
39
- expect(transform(conf, sampleData)).toEqual([
40
- { group: "a", choice: "q", value: 1, z0: 0, z1: 1 },
41
- { group: "b", choice: "x", value: 1, z0: 0, z1: 1 },
42
- { group: "b", choice: "y", value: 3, z0: 1, z1: 2 },
43
- ]);
44
- });
45
-
46
- test("Zero offset", () => {
47
- expect(transform(baseParams, sampleData)).toEqual([
48
- { group: "a", choice: "q", value: 1, z0: 0, z1: 1 },
49
- { group: "b", choice: "x", value: 1, z0: 0, z1: 1 },
50
- { group: "b", choice: "y", value: 3, z0: 1, z1: 4 },
51
- ]);
52
- });
53
-
54
- test("Normalize offset", () => {
55
- const conf = Object.assign({}, baseParams, {
56
- offset: "normalize",
57
- });
58
-
59
- expect(transform(conf, sampleData)).toEqual([
60
- { group: "a", choice: "q", value: 1, z0: 0, z1: 1 },
61
- { group: "b", choice: "x", value: 1, z0: 0, z1: 0.25 },
62
- { group: "b", choice: "y", value: 3, z0: 0.25, z1: 1 },
63
- ]);
64
- });
65
-
66
- test("Center offset", () => {
67
- const conf = Object.assign({}, baseParams, {
68
- offset: "center",
69
- });
70
-
71
- expect(transform(conf, sampleData)).toEqual([
72
- { group: "a", choice: "q", value: 1, z0: -0.5, z1: 0.5 },
73
- { group: "b", choice: "x", value: 1, z0: -2, z1: -1 },
74
- { group: "b", choice: "y", value: 3, z0: -1, z1: 2 },
75
- ]);
76
- });
77
-
78
- test("Descending sort", () => {
79
- const conf = Object.assign({}, baseParams, {
80
- sort: {
81
- field: "value",
82
- order: "descending",
83
- },
84
- });
85
- expect(transform(conf, sampleData)).toEqual([
86
- { group: "a", choice: "q", value: 1, z0: 0, z1: 1 },
87
- { group: "b", choice: "y", value: 3, z0: 0, z1: 3 },
88
- { group: "b", choice: "x", value: 1, z0: 3, z1: 4 },
89
- ]);
90
- });
91
- });
@@ -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
- });