@genome-spy/core 0.65.0 → 0.67.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (249) hide show
  1. package/dist/bundle/browser-BRemItdO.js +138 -0
  2. package/dist/bundle/{index-CD7FLu9x.js → index-BatuyGAI.js} +23 -21
  3. package/dist/bundle/{index-C0llXMqm.js → index-ByuE8dvu.js} +140 -88
  4. package/dist/bundle/index-Cq3QFUxX.js +1781 -0
  5. package/dist/bundle/index-D28m8tSW.js +1607 -0
  6. package/dist/bundle/index-DbJ0oeYM.js +631 -0
  7. package/dist/bundle/index.es.js +15821 -14601
  8. package/dist/bundle/index.js +214 -212
  9. package/dist/bundle/{inflate-DRgHi_KK.js → inflate-GtwLkvSP.js} +222 -224
  10. package/dist/bundle/unzip-NywezaRR.js +1492 -0
  11. package/dist/schema.json +13 -3
  12. package/dist/src/config/scaleDefaults.d.ts +8 -0
  13. package/dist/src/config/scaleDefaults.d.ts.map +1 -0
  14. package/dist/src/config/scaleDefaults.js +45 -0
  15. package/dist/src/data/flowHandle.d.ts +2 -0
  16. package/dist/src/data/flowHandle.d.ts.map +1 -1
  17. package/dist/src/data/flowHandle.js +1 -0
  18. package/dist/src/data/flowInit.d.ts +12 -4
  19. package/dist/src/data/flowInit.d.ts.map +1 -1
  20. package/dist/src/data/flowInit.js +115 -16
  21. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  22. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +1 -1
  23. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/singleAxisLazySource.js +10 -3
  25. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/lazy/singleAxisWindowedSource.js +5 -1
  27. package/dist/src/data/transforms/filterScoredLabels.d.ts +1 -1
  28. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  29. package/dist/src/data/transforms/filterScoredLabels.js +1 -1
  30. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  31. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +2 -1
  32. package/dist/src/encoder/encoder.d.ts +1 -1
  33. package/dist/src/encoder/encoder.d.ts.map +1 -1
  34. package/dist/src/encoder/encoder.js +1 -1
  35. package/dist/src/genome/scaleLocus.d.ts +39 -0
  36. package/dist/src/genome/scaleLocus.d.ts.map +1 -1
  37. package/dist/src/genome/scaleLocus.js +76 -0
  38. package/dist/src/genomeSpy/canvasExport.d.ts +19 -0
  39. package/dist/src/genomeSpy/canvasExport.d.ts.map +1 -0
  40. package/dist/src/genomeSpy/canvasExport.js +66 -0
  41. package/dist/src/genomeSpy/containerUi.d.ts +17 -0
  42. package/dist/src/genomeSpy/containerUi.d.ts.map +1 -0
  43. package/dist/src/genomeSpy/containerUi.js +78 -0
  44. package/dist/src/genomeSpy/eventListenerRegistry.d.ts +19 -0
  45. package/dist/src/genomeSpy/eventListenerRegistry.d.ts.map +1 -0
  46. package/dist/src/genomeSpy/eventListenerRegistry.js +38 -0
  47. package/dist/src/genomeSpy/inputBindingManager.d.ts +14 -0
  48. package/dist/src/genomeSpy/inputBindingManager.d.ts.map +1 -0
  49. package/dist/src/genomeSpy/inputBindingManager.js +63 -0
  50. package/dist/src/genomeSpy/interactionController.d.ts +40 -0
  51. package/dist/src/genomeSpy/interactionController.d.ts.map +1 -0
  52. package/dist/src/genomeSpy/interactionController.js +371 -0
  53. package/dist/src/genomeSpy/keyboardListenerManager.d.ts +10 -0
  54. package/dist/src/genomeSpy/keyboardListenerManager.d.ts.map +1 -0
  55. package/dist/src/genomeSpy/keyboardListenerManager.js +31 -0
  56. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts +15 -0
  57. package/dist/src/genomeSpy/loadingIndicatorManager.d.ts.map +1 -0
  58. package/dist/src/genomeSpy/loadingIndicatorManager.js +92 -0
  59. package/dist/src/genomeSpy/renderCoordinator.d.ts +22 -0
  60. package/dist/src/genomeSpy/renderCoordinator.d.ts.map +1 -0
  61. package/dist/src/genomeSpy/renderCoordinator.js +118 -0
  62. package/dist/src/genomeSpy/viewContextFactory.d.ts +18 -0
  63. package/dist/src/genomeSpy/viewContextFactory.d.ts.map +1 -0
  64. package/dist/src/genomeSpy/viewContextFactory.js +79 -0
  65. package/dist/src/genomeSpy/viewDataInit.d.ts +22 -0
  66. package/dist/src/genomeSpy/viewDataInit.d.ts.map +1 -0
  67. package/dist/src/genomeSpy/viewDataInit.js +160 -0
  68. package/dist/src/genomeSpy/viewDataInit.test.d.ts +2 -0
  69. package/dist/src/genomeSpy/viewDataInit.test.d.ts.map +1 -0
  70. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts +14 -0
  71. package/dist/src/genomeSpy/viewHierarchyConfig.d.ts.map +1 -0
  72. package/dist/src/genomeSpy/viewHierarchyConfig.js +24 -0
  73. package/dist/src/genomeSpy/viewHighlight.d.ts +5 -0
  74. package/dist/src/genomeSpy/viewHighlight.d.ts.map +1 -0
  75. package/dist/src/genomeSpy/viewHighlight.js +30 -0
  76. package/dist/src/genomeSpy.d.ts +17 -71
  77. package/dist/src/genomeSpy.d.ts.map +1 -1
  78. package/dist/src/genomeSpy.js +197 -741
  79. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  80. package/dist/src/gl/dataToVertices.js +16 -4
  81. package/dist/src/gl/glslScaleGenerator.d.ts +1 -1
  82. package/dist/src/gl/webGLHelper.d.ts +2 -2
  83. package/dist/src/gl/webGLHelper.d.ts.map +1 -1
  84. package/dist/src/gl/webGLHelper.js +4 -4
  85. package/dist/src/index.d.ts.map +1 -1
  86. package/dist/src/index.js +2 -12
  87. package/dist/src/marks/mark.d.ts.map +1 -1
  88. package/dist/src/marks/mark.js +4 -2
  89. package/dist/src/{view → scales}/axisResolution.d.ts +9 -16
  90. package/dist/src/scales/axisResolution.d.ts.map +1 -0
  91. package/dist/src/{view → scales}/axisResolution.js +29 -18
  92. package/dist/src/scales/axisResolution.test.d.ts.map +1 -0
  93. package/dist/src/scales/scaleDomainAggregator.d.ts +57 -0
  94. package/dist/src/scales/scaleDomainAggregator.d.ts.map +1 -0
  95. package/dist/src/scales/scaleDomainAggregator.js +167 -0
  96. package/dist/src/scales/scaleDomainAggregator.test.d.ts +2 -0
  97. package/dist/src/scales/scaleDomainAggregator.test.d.ts.map +1 -0
  98. package/dist/src/scales/scaleInstanceManager.d.ts +40 -0
  99. package/dist/src/scales/scaleInstanceManager.d.ts.map +1 -0
  100. package/dist/src/scales/scaleInstanceManager.js +317 -0
  101. package/dist/src/scales/scaleInstanceManager.test.d.ts +2 -0
  102. package/dist/src/scales/scaleInstanceManager.test.d.ts.map +1 -0
  103. package/dist/src/scales/scaleInteractionController.d.ts +73 -0
  104. package/dist/src/scales/scaleInteractionController.d.ts.map +1 -0
  105. package/dist/src/scales/scaleInteractionController.js +336 -0
  106. package/dist/src/scales/scaleInteractionController.test.d.ts +2 -0
  107. package/dist/src/scales/scaleInteractionController.test.d.ts.map +1 -0
  108. package/dist/src/scales/scalePropsResolver.d.ts +23 -0
  109. package/dist/src/scales/scalePropsResolver.d.ts.map +1 -0
  110. package/dist/src/scales/scalePropsResolver.js +74 -0
  111. package/dist/src/{view → scales}/scaleResolution.d.ts +53 -35
  112. package/dist/src/scales/scaleResolution.d.ts.map +1 -0
  113. package/dist/src/scales/scaleResolution.js +732 -0
  114. package/dist/src/scales/scaleResolution.test.d.ts.map +1 -0
  115. package/dist/src/scales/scaleResolutionConstants.d.ts +6 -0
  116. package/dist/src/scales/scaleResolutionConstants.d.ts.map +1 -0
  117. package/dist/src/scales/scaleResolutionConstants.js +5 -0
  118. package/dist/src/scales/scaleRules.d.ts +16 -0
  119. package/dist/src/scales/scaleRules.d.ts.map +1 -0
  120. package/dist/src/scales/scaleRules.js +103 -0
  121. package/dist/src/scales/scaleRules.test.d.ts +2 -0
  122. package/dist/src/scales/scaleRules.test.d.ts.map +1 -0
  123. package/dist/src/spec/channel.d.ts +13 -18
  124. package/dist/src/spec/scale.d.ts +6 -0
  125. package/dist/src/types/embedApi.d.ts +5 -0
  126. package/dist/src/types/scaleResolutionApi.d.ts +1 -1
  127. package/dist/src/utils/domainArray.d.ts.map +1 -1
  128. package/dist/src/utils/domainArray.js +3 -0
  129. package/dist/src/utils/indexer.d.ts +3 -0
  130. package/dist/src/utils/indexer.d.ts.map +1 -1
  131. package/dist/src/utils/indexer.js +3 -0
  132. package/dist/src/view/concatView.d.ts +18 -0
  133. package/dist/src/view/concatView.d.ts.map +1 -1
  134. package/dist/src/view/concatView.js +73 -0
  135. package/dist/src/view/concatView.test.d.ts +2 -0
  136. package/dist/src/view/concatView.test.d.ts.map +1 -0
  137. package/dist/src/view/containerMutationHelper.d.ts +74 -0
  138. package/dist/src/view/containerMutationHelper.d.ts.map +1 -0
  139. package/dist/src/view/containerMutationHelper.js +118 -0
  140. package/dist/src/view/containerView.d.ts +0 -7
  141. package/dist/src/view/containerView.d.ts.map +1 -1
  142. package/dist/src/view/containerView.js +0 -10
  143. package/dist/src/view/facetView.d.ts.map +1 -1
  144. package/dist/src/view/facetView.js +0 -15
  145. package/dist/src/view/flowBuilder.d.ts +5 -3
  146. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  147. package/dist/src/view/flowBuilder.js +69 -6
  148. package/dist/src/view/gridView/gridChild.d.ts +11 -0
  149. package/dist/src/view/gridView/gridChild.d.ts.map +1 -1
  150. package/dist/src/view/gridView/gridChild.js +32 -6
  151. package/dist/src/view/gridView/gridView.d.ts +39 -1
  152. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  153. package/dist/src/view/gridView/gridView.js +106 -48
  154. package/dist/src/view/gridView/gridView.test.d.ts +2 -0
  155. package/dist/src/view/gridView/gridView.test.d.ts.map +1 -0
  156. package/dist/src/view/gridView/scrollbar.d.ts +39 -8
  157. package/dist/src/view/gridView/scrollbar.d.ts.map +1 -1
  158. package/dist/src/view/gridView/scrollbar.js +184 -69
  159. package/dist/src/view/layerView.d.ts +14 -0
  160. package/dist/src/view/layerView.d.ts.map +1 -1
  161. package/dist/src/view/layerView.js +66 -0
  162. package/dist/src/view/layerView.test.d.ts +2 -0
  163. package/dist/src/view/layerView.test.d.ts.map +1 -0
  164. package/dist/src/view/testUtils.d.ts.map +1 -1
  165. package/dist/src/view/testUtils.js +7 -1
  166. package/dist/src/view/unitView.d.ts.map +1 -1
  167. package/dist/src/view/unitView.js +41 -36
  168. package/dist/src/view/view.d.ts +18 -6
  169. package/dist/src/view/view.d.ts.map +1 -1
  170. package/dist/src/view/view.js +30 -4
  171. package/package.json +2 -2
  172. package/dist/bundle/browser-txUcLy2H.js +0 -123
  173. package/dist/bundle/index-BQpbYrv4.js +0 -1712
  174. package/dist/bundle/index-BhtHKLUo.js +0 -73
  175. package/dist/bundle/index-CCe8rnZz.js +0 -716
  176. package/dist/bundle/index-DhcU-Gk-.js +0 -1487
  177. package/dist/src/data/collector.test.js +0 -138
  178. package/dist/src/data/dataFlow.test.js +0 -38
  179. package/dist/src/data/flow.test.js +0 -81
  180. package/dist/src/data/flowInit.test.js +0 -413
  181. package/dist/src/data/flowNode.test.js +0 -50
  182. package/dist/src/data/flowOptimizer.test.js +0 -209
  183. package/dist/src/data/formats/fasta.test.js +0 -27
  184. package/dist/src/data/sources/inlineSource.test.js +0 -63
  185. package/dist/src/data/sources/sequenceSource.test.js +0 -81
  186. package/dist/src/data/transforms/aggregate.test.js +0 -134
  187. package/dist/src/data/transforms/clone.test.js +0 -11
  188. package/dist/src/data/transforms/coverage.test.js +0 -238
  189. package/dist/src/data/transforms/filter.test.js +0 -20
  190. package/dist/src/data/transforms/flatten.test.js +0 -96
  191. package/dist/src/data/transforms/flattenDelimited.test.js +0 -90
  192. package/dist/src/data/transforms/flattenSequence.test.js +0 -34
  193. package/dist/src/data/transforms/formula.test.js +0 -25
  194. package/dist/src/data/transforms/identifier.test.js +0 -92
  195. package/dist/src/data/transforms/pileup.test.js +0 -70
  196. package/dist/src/data/transforms/project.test.js +0 -32
  197. package/dist/src/data/transforms/regexExtract.test.js +0 -70
  198. package/dist/src/data/transforms/regexFold.test.js +0 -201
  199. package/dist/src/data/transforms/sample.test.js +0 -38
  200. package/dist/src/data/transforms/stack.test.js +0 -91
  201. package/dist/src/encoder/accessor.test.js +0 -162
  202. package/dist/src/encoder/encoder.test.js +0 -105
  203. package/dist/src/genome/genome.test.js +0 -268
  204. package/dist/src/genome/genomes.test.js +0 -8
  205. package/dist/src/genome/scaleIndex.test.js +0 -78
  206. package/dist/src/genome/scaleLocus.test.js +0 -4
  207. package/dist/src/scale/scale.test.js +0 -326
  208. package/dist/src/scale/ticks.test.js +0 -46
  209. package/dist/src/selection/selection.test.js +0 -14
  210. package/dist/src/utils/addBaseUrl.test.js +0 -30
  211. package/dist/src/utils/binnedIndex.test.js +0 -201
  212. package/dist/src/utils/cloner.test.js +0 -35
  213. package/dist/src/utils/coalesce.test.js +0 -16
  214. package/dist/src/utils/concatIterables.test.js +0 -8
  215. package/dist/src/utils/domainArray.test.js +0 -130
  216. package/dist/src/utils/indexer.test.js +0 -49
  217. package/dist/src/utils/interactionEvent.test.js +0 -35
  218. package/dist/src/utils/iterateNestedMaps.test.js +0 -33
  219. package/dist/src/utils/kWayMerge.test.js +0 -30
  220. package/dist/src/utils/mergeObjects.test.js +0 -42
  221. package/dist/src/utils/numberExtractor.test.js +0 -6
  222. package/dist/src/utils/propertyCacher.test.js +0 -89
  223. package/dist/src/utils/propertyCoalescer.test.js +0 -25
  224. package/dist/src/utils/radixSort.test.js +0 -51
  225. package/dist/src/utils/reservationMap.test.js +0 -20
  226. package/dist/src/utils/ringBuffer.test.js +0 -39
  227. package/dist/src/utils/topK.test.js +0 -54
  228. package/dist/src/utils/trees.test.js +0 -135
  229. package/dist/src/utils/url.test.js +0 -28
  230. package/dist/src/utils/variableTools.test.js +0 -13
  231. package/dist/src/view/axisResolution.d.ts.map +0 -1
  232. package/dist/src/view/axisResolution.test.d.ts.map +0 -1
  233. package/dist/src/view/axisResolution.test.js +0 -206
  234. package/dist/src/view/flowBuilder.test.js +0 -125
  235. package/dist/src/view/gridView/selectionRect.test.js +0 -87
  236. package/dist/src/view/layout/flexLayout.test.js +0 -323
  237. package/dist/src/view/layout/grid.test.js +0 -71
  238. package/dist/src/view/layout/rectangle.test.js +0 -192
  239. package/dist/src/view/paramMediator.test.js +0 -282
  240. package/dist/src/view/scaleResolution.d.ts.map +0 -1
  241. package/dist/src/view/scaleResolution.js +0 -1059
  242. package/dist/src/view/scaleResolution.test.d.ts.map +0 -1
  243. package/dist/src/view/scaleResolution.test.js +0 -645
  244. package/dist/src/view/view.test.js +0 -245
  245. package/dist/src/view/viewDispose.test.js +0 -110
  246. package/dist/src/view/viewFactory.test.js +0 -25
  247. package/dist/src/view/viewUtils.test.js +0 -87
  248. /package/dist/src/{view → scales}/axisResolution.test.d.ts +0 -0
  249. /package/dist/src/{view → scales}/scaleResolution.test.d.ts +0 -0
@@ -1,46 +0,0 @@
1
- import { expect, test } from "vitest";
2
- /*!
3
- * Adapted from vega-encode:
4
- * https://github.com/vega/vega/blob/master/packages/vega-encode/test/scale-test.js
5
- *
6
- * Copyright (c) 2015-2018, University of Washington Interactive Data Lab
7
- * All rights reserved.
8
- *
9
- * BSD-3-Clause License: https://github.com/vega/vega-lite/blob/master/LICENSE
10
- */
11
-
12
- /* eslint-disable */
13
-
14
- import { validTicks } from "./ticks.js";
15
-
16
- test("validTicks uses count correctly", function () {
17
- var data = [0, 1, 2, 3, 4, 5, 6, 7];
18
-
19
- /**
20
- *
21
- * @param {T} x
22
- * @returns {T}
23
- * @template T
24
- */
25
- var identity = function (x) {
26
- return x;
27
- };
28
- identity.range = function () {
29
- return [0, 10];
30
- };
31
-
32
- var t1 = validTicks(identity, data, 5);
33
- expect(t1).toEqual([0, 2, 4, 6]);
34
-
35
- // don't change ticks if count is large
36
- var t2 = validTicks(identity, data, 100);
37
- expect(t2).toEqual(data);
38
-
39
- // special case for low number of ticks
40
- var t3 = validTicks(identity, data, 3);
41
- expect(t3).toEqual([0, 7]);
42
-
43
- // single tick should pass through
44
- var t5 = validTicks(identity, [1], 5);
45
- expect(t5).toEqual([1]);
46
- });
@@ -1,14 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { asEventConfig } from "./selection.js";
3
-
4
- describe("asEventSpec", () => {
5
- it("parses a simple string event type", () => {
6
- const res = asEventConfig("click");
7
- expect(res).toEqual({ type: "click" });
8
- });
9
-
10
- it("parses a string event type with bracket filter", () => {
11
- const res = asEventConfig("click[event.shiftKey]");
12
- expect(res).toEqual({ type: "click", filter: "event.shiftKey" });
13
- });
14
- });
@@ -1,30 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import addBaseUrl, { endWithSlash } from "./addBaseUrl.js";
3
-
4
- test("addBaseUrl adds baseUrl when needed", () => {
5
- expect(addBaseUrl("foo.html", "https://site.com/")).toEqual(
6
- "https://site.com/foo.html"
7
- );
8
- expect(addBaseUrl("foo.html", "https://site.com")).toEqual(
9
- "https://site.com/foo.html"
10
- );
11
- expect(addBaseUrl("bar/foo.html", "https://site.com/")).toEqual(
12
- "https://site.com/bar/foo.html"
13
- );
14
- expect(addBaseUrl("../foo.html", "https://site.com/bar/")).toEqual(
15
- "https://site.com/bar/../foo.html"
16
- );
17
- });
18
-
19
- test("addBaseUrl doesn't add baseUrl when not needed", () => {
20
- expect(addBaseUrl("/foo.html", "https://site.com/")).toEqual("/foo.html");
21
- expect(addBaseUrl("foo.html", undefined)).toEqual("foo.html");
22
- });
23
-
24
- test("endWithSlash adds slash when needed", () => {
25
- expect(endWithSlash(null)).toBeNull();
26
- expect(endWithSlash("https://site.com")).toEqual("https://site.com/");
27
- expect(endWithSlash("https://site.com/")).toEqual("https://site.com/");
28
- expect(() => endWithSlash("https://site.com/foo?bar")).toThrow();
29
- expect(() => endWithSlash("https://site.com/foo#bar")).toThrow();
30
- });
@@ -1,201 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import { createBinningRangeIndexer } from "./binnedIndex.js";
3
-
4
- describe("Binning Indexer", () => {
5
- test("Single point is binned correctly", () => {
6
- const items = [25];
7
- const indexer = createBinningRangeIndexer(10, [0, 100], (x) => x);
8
-
9
- // Each item uses two vertices
10
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
11
-
12
- const index = indexer.getIndex();
13
-
14
- expect(index(1, 4)).toEqual([0, 0]);
15
- expect(index(23, 27)).toEqual([0, 2]);
16
- expect(index(13, 37)).toEqual([0, 2]);
17
- // TODO: MAX_INT could be replaced with the actual maximum vertex number
18
- expect(index(40, 42)).toEqual([2147483647, 2147483647]);
19
- });
20
-
21
- test("Multiple points are binned correctly", () => {
22
- const items = [0, 1, 4, 10, 35, 35, 36, 80];
23
- const indexer = createBinningRangeIndexer(10, [0, 100], (x) => x);
24
-
25
- // Each item uses two vertices
26
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
27
-
28
- const index = indexer.getIndex();
29
-
30
- expect(index(0, 0)).toEqual([0, 6]);
31
- expect(index(0, 1)).toEqual([0, 6]);
32
- expect(index(1, 2)).toEqual([0, 6]);
33
- expect(index(1, 15)).toEqual([0, 8]);
34
- expect(index(3, 6)).toEqual([0, 6]);
35
- expect(index(10, 15)).toEqual([6, 8]);
36
- expect(index(11, 38)).toEqual([6, 14]);
37
- expect(index(11, 45)).toEqual([6, 14]);
38
- expect(index(34, 36)).toEqual([8, 14]);
39
- expect(index(35.5, 36.5)).toEqual([8, 14]);
40
- expect(index(40, 50)).toEqual([14, 14]);
41
- expect(index(40, 85)).toEqual([14, 16]);
42
- expect(index(90, 100)).toEqual([16, 16]);
43
-
44
- expect(index(0, 100)).toEqual([0, 16]);
45
- expect(index(-1, 100)).toEqual([0, 16]);
46
- expect(index(0, 101)).toEqual([0, 16]);
47
- });
48
-
49
- test("Non-overlapping ranges are binned correctly", () => {
50
- const items = [
51
- [0, 5],
52
- [25, 48],
53
- [50, 55],
54
- [64, 67],
55
- [72, 75],
56
- [75, 78],
57
- [86, 90],
58
- [90, 93],
59
- ];
60
- const indexer = createBinningRangeIndexer(
61
- 10,
62
- [0, 100],
63
- (x) => x[0],
64
- (x) => x[1]
65
- );
66
-
67
- // Each item uses two vertices
68
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
69
-
70
- const index = indexer.getIndex();
71
-
72
- expect(index(0, 1)).toEqual([0, 2]);
73
- expect(index(3, 40)).toEqual([0, 4]);
74
- expect(index(6, 40)).toEqual([0, 4]);
75
- expect(index(15, 30)).toEqual([2, 4]);
76
- expect(index(50, 57)).toEqual([4, 6]);
77
- expect(index(62, 69)).toEqual([6, 8]);
78
- expect(index(69, 71)).toEqual([6, 12]);
79
- expect(index(69, 79)).toEqual([6, 12]);
80
-
81
- expect(index(80, 90)).toEqual([12, 14]);
82
- expect(index(90, 100)).toEqual([14, 16]);
83
-
84
- expect(index(0, 99)).toEqual([0, 16]);
85
- expect(index(0, 100)).toEqual([0, 16]);
86
- });
87
-
88
- test("Overlapping ranges with the same start coordinate are binned correctly", () => {
89
- const items = [
90
- // Increasing lengths
91
- [0, 5],
92
- [0, 64],
93
- [0, 80],
94
- // Decreasing lengths
95
- [100, 191],
96
- [100, 167],
97
- [100, 123],
98
- ];
99
- const indexer = createBinningRangeIndexer(
100
- 100,
101
- [0, 1000],
102
- (x) => x[0],
103
- (x) => x[1]
104
- );
105
-
106
- // Each item uses two vertices
107
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
108
-
109
- const index = indexer.getIndex();
110
-
111
- expect(index(0, 1)).toEqual([0, 6]);
112
- expect(index(3, 40)).toEqual([0, 6]);
113
- expect(index(0, 100)).toEqual([0, 6]);
114
- expect(index(77, 78)).toEqual([4, 6]);
115
-
116
- expect(index(90, 205)).toEqual([6, 12]);
117
- expect(index(111, 115)).toEqual([6, 12]);
118
- // Not optimal. Should be [6, 8], but [6, 12] is not wrong
119
- expect(index(180, 190)).toEqual([6, 12]);
120
- });
121
-
122
- test("Overlapping ranges are binned correctly", () => {
123
- const items = [
124
- [10, 30],
125
- [25, 50],
126
-
127
- [102, 129],
128
- [112, 139],
129
- [121, 149],
130
- ];
131
- const indexer = createBinningRangeIndexer(
132
- 100,
133
- [0, 1000],
134
- (x) => x[0],
135
- (x) => x[1]
136
- );
137
-
138
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
139
-
140
- const index = indexer.getIndex();
141
-
142
- // TODO: More tests
143
-
144
- expect(index(0, 5)).toEqual([0, 0]);
145
- expect(index(0, 15)).toEqual([0, 2]);
146
- expect(index(27, 40)).toEqual([0, 4]);
147
- expect(index(40, 50)).toEqual([2, 4]);
148
- expect(index(40, 80)).toEqual([2, 4]);
149
- expect(index(10, 29)).toEqual([0, 4]);
150
-
151
- expect(index(90, 160)).toEqual([4, 10]);
152
- expect(index(115, 116)).toEqual([4, 8]);
153
- expect(index(135, 145)).toEqual([6, 10]);
154
- });
155
-
156
- test("Unordered ranges disable the index", () => {
157
- const items = [
158
- [10, 30],
159
- [25, 50],
160
-
161
- [112, 139],
162
- [102, 129], // <- Unordered!
163
- [121, 149],
164
- ];
165
- const indexer = createBinningRangeIndexer(
166
- 100,
167
- [0, 1000],
168
- (x) => x[0],
169
- (x) => x[1]
170
- );
171
-
172
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
173
-
174
- const index = indexer.getIndex();
175
-
176
- expect(index).toBeUndefined();
177
- });
178
-
179
- test("Inverted ranges disable the index", () => {
180
- const items = [
181
- [10, 30],
182
- [25, 50],
183
-
184
- [102, 129],
185
- [139, 112], // <- Inverted!
186
- [121, 149],
187
- ];
188
- const indexer = createBinningRangeIndexer(
189
- 100,
190
- [0, 1000],
191
- (x) => x[0],
192
- (x) => x[1]
193
- );
194
-
195
- items.forEach((x, i) => indexer(x, i * 2, (i + 1) * 2));
196
-
197
- const index = indexer.getIndex();
198
-
199
- expect(index).toBeUndefined();
200
- });
201
- });
@@ -1,35 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import createCloner, { getAllProperties } from "./cloner.js";
3
-
4
- const template = {
5
- 1: "iddqd",
6
- a: 1,
7
- c: "xyzzy",
8
- b: "idclip",
9
- };
10
-
11
- test("Cloner clones object properly", () => {
12
- const makeClone = createCloner(template);
13
-
14
- expect(makeClone(template)).toEqual(template);
15
- expect(makeClone(template)).not.toBe(template);
16
-
17
- const another = {
18
- 1: "hello",
19
- a: 2,
20
- c: "idkfa",
21
- b: "idclip",
22
- };
23
-
24
- expect(makeClone(another)).toEqual(another);
25
- expect(makeClone(another)).not.toBe(another);
26
- });
27
-
28
- test("getAllProperties", () => {
29
- expect(getAllProperties(template)).toEqual(["1", "a", "c", "b"]);
30
-
31
- const obj = Object.create(template);
32
- obj.d = 42;
33
-
34
- expect(getAllProperties(obj)).toEqual(["d", "1", "a", "c", "b"]);
35
- });
@@ -1,16 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import coalesce from "./coalesce.js";
3
-
4
- test("Coalesce returns first defined value", () => {
5
- expect(coalesce(0, 1, 2, 3)).toEqual(0);
6
- expect(coalesce(undefined, 1, 2, 3)).toEqual(1);
7
- expect(coalesce(undefined, undefined, 2, 3)).toEqual(2);
8
- });
9
-
10
- test("Coalesce returns undefined if input is all-undefined", () => {
11
- expect(coalesce(undefined, undefined)).toBeUndefined();
12
- });
13
-
14
- test("Coalesce returns undefined on empty input", () => {
15
- expect(coalesce()).toBeUndefined();
16
- });
@@ -1,8 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import concatIterables from "./concatIterables.js";
3
-
4
- test("ConcatIterables yields all elements in the correct order", () => {
5
- expect([...concatIterables([1, 2], [3, 4], [5, 6, 7], [-1000])]).toEqual([
6
- 1, 2, 3, 4, 5, 6, 7, -1000,
7
- ]);
8
- });
@@ -1,130 +0,0 @@
1
- import { describe, expect, test } from "vitest";
2
- import createDomain, {
3
- toRegularArray as r,
4
- PiecewiseDomain,
5
- } from "./domainArray.js";
6
-
7
- describe("Build quantitative domains", () => {
8
- test("Empty domain", () => {
9
- const b = createDomain("quantitative");
10
- expect(r(b)).toEqual([]);
11
- });
12
-
13
- test("Extends by one value at a time", () => {
14
- const b = createDomain("quantitative");
15
- b.extend(2);
16
- b.extend(1);
17
- b.extend(null);
18
- b.extend(undefined);
19
- b.extend(NaN);
20
- b.extend(5);
21
- b.extend(4);
22
- expect(r(b)).toEqual([1, 5]);
23
- });
24
-
25
- test("Extends with an iterable", () => {
26
- const b = createDomain("quantitative");
27
- b.extendAll([2, 1, null, undefined, NaN, 5, 4]);
28
- expect(r(b)).toEqual([1, 5]);
29
- });
30
-
31
- test("Extends with an iterable and an accessor", () => {
32
- const b = createDomain("quantitative");
33
- b.extendAllWithAccessor(
34
- [
35
- { x: 2 },
36
- { x: 1 },
37
- { x: null },
38
- { x: undefined },
39
- { x: NaN },
40
- { x: 5 },
41
- { x: 4 },
42
- ],
43
- (d) => d.x
44
- );
45
- expect(r(b)).toEqual([1, 5]);
46
- });
47
-
48
- test("Coerces to number", () => {
49
- const b = createDomain("quantitative");
50
- expect(r(b.extend("123"))).toEqual([123, 123]);
51
- });
52
- });
53
-
54
- describe("Build ordinal domains", () => {
55
- // Note: nominal is an unordered abstraction of ordinal. Testing just ordinal is enough.
56
-
57
- test("Empty domain", () => {
58
- const b = createDomain("ordinal");
59
- expect(r(b)).toEqual([]);
60
- });
61
-
62
- test("Extends by one value at a time, preserves order", () => {
63
- const b = createDomain("ordinal");
64
- b.extend("a");
65
- b.extend("b");
66
- b.extend("c");
67
- b.extend("b");
68
- b.extend(null);
69
- b.extend(undefined);
70
- b.extend(NaN);
71
- b.extend("d");
72
- expect(r(b)).toEqual(["a", "b", "c", "d"]);
73
- });
74
- });
75
-
76
- describe("Build piecewise domains", () => {
77
- test("Creates a piecewise domain", () => {
78
- expect(createDomain("quantitative", [1])).toBeInstanceOf(
79
- PiecewiseDomain
80
- );
81
- expect(createDomain("quantitative", [1, 2, 3])).toBeInstanceOf(
82
- PiecewiseDomain
83
- );
84
- expect(createDomain("quantitative", [1, 2, 3, 4])).toBeInstanceOf(
85
- PiecewiseDomain
86
- );
87
- expect(createDomain("quantitative", [3, 2, 1])).toBeInstanceOf(
88
- PiecewiseDomain
89
- );
90
- expect(r(createDomain("quantitative", [3, 2, 1]))).toEqual([3, 2, 1]);
91
- });
92
-
93
- test("Throws on domain that is not stricly increasing or decreasing", () => {
94
- expect(() => createDomain("quantitative", [2, 1, 3])).toThrow();
95
- expect(() => createDomain("quantitative", [2, 3, 1])).toThrow();
96
- expect(() => createDomain("quantitative", [3, 0, 2])).toThrow();
97
- expect(() => createDomain("quantitative", [0, 3, 2])).toThrow();
98
- expect(() => createDomain("quantitative", [1, 2, 2, 3])).toThrow();
99
- });
100
-
101
- test("Throws on mutation attempts", () => {
102
- expect(() =>
103
- createDomain("quantitative", [1, 2, 3]).extend(4)
104
- ).toThrow();
105
- });
106
-
107
- test("Does not throw when extending with existing value", () => {
108
- expect(r(createDomain("quantitative", [1, 2, 3]).extend(2))).toEqual([
109
- 1, 2, 3,
110
- ]);
111
- });
112
- });
113
-
114
- describe("Annotations", () => {
115
- test("Quantitative domain is annotated", () =>
116
- expect(createDomain("quantitative").type).toEqual("quantitative"));
117
-
118
- test("Ordinal domain is annotated", () =>
119
- expect(createDomain("ordinal").type).toEqual("ordinal"));
120
-
121
- test("Nominal domain is annotated", () =>
122
- expect(createDomain("nominal").type).toEqual("nominal"));
123
- });
124
-
125
- describe("Other stuff", () => {
126
- test("Throws on extending by other type of domain array", () =>
127
- expect(() =>
128
- createDomain("quantitative").extendAll(createDomain("nominal"))
129
- ).toThrow());
130
- });
@@ -1,49 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import createIndexer from "./indexer.js";
3
-
4
- test("Index values one by one", () => {
5
- const indexer = createIndexer();
6
-
7
- expect(indexer("a")).toEqual(0);
8
- expect(indexer("b")).toEqual(1);
9
- expect(indexer("c")).toEqual(2);
10
- expect(indexer("a")).toEqual(0);
11
- expect(indexer("a")).toEqual(0);
12
- expect(indexer("c")).toEqual(2);
13
- expect(indexer("c")).toEqual(2);
14
- });
15
-
16
- test("Index multiple values (predefined domain)", () => {
17
- const indexer = createIndexer();
18
-
19
- indexer.addAll(["a", "b", "c"]);
20
-
21
- expect(indexer("d")).toEqual(3);
22
- expect(indexer("a")).toEqual(0);
23
- expect(indexer("b")).toEqual(1);
24
- expect(indexer("c")).toEqual(2);
25
- expect(indexer("d")).toEqual(3);
26
- });
27
-
28
- test("Indexer inverts index numbers", () => {
29
- const indexer = createIndexer();
30
-
31
- indexer.addAll(["a", "b", "c"]);
32
-
33
- expect(indexer.invert(0)).toEqual("a");
34
- expect(indexer.invert(1)).toEqual("b");
35
- expect(indexer.invert(2)).toEqual("c");
36
- expect(indexer.invert(3)).toBeUndefined();
37
- });
38
-
39
- test("Indexer return correct domain", () => {
40
- const indexer = createIndexer();
41
-
42
- expect(indexer("a")).toEqual(0);
43
- expect(indexer("b")).toEqual(1);
44
- expect(indexer("c")).toEqual(2);
45
- expect(indexer("a")).toEqual(0);
46
- expect(indexer("c")).toEqual(2);
47
-
48
- expect(indexer.domain()).toEqual(["a", "b", "c"]);
49
- });
@@ -1,35 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import { createPrimitiveEventProxy } from "./interactionEvent.js";
3
-
4
- describe("createPrimitiveEventProxy", () => {
5
- it("exposes primitive properties and hides non-primitives", () => {
6
- const mock = {
7
- type: "click",
8
- clientX: 42,
9
- meta: { foo: "bar" },
10
- nested: { a: 1 },
11
- };
12
-
13
- /** @type {any} */
14
- const proxy = createPrimitiveEventProxy(mock);
15
-
16
- // allowed primitives
17
- expect(proxy.type).toBe("click");
18
- expect(proxy.clientX).toBe(42);
19
-
20
- // non-primitive access throws
21
- expect(() => proxy.meta).toThrow(/non-primitive/);
22
-
23
- // keys enumeration hides non-primitives
24
- const keys = Object.keys(proxy);
25
- expect(keys).toContain("type");
26
- expect(keys).not.toContain("meta");
27
-
28
- // `in` operator respects the policy
29
- expect("type" in proxy).toBe(true);
30
- expect("meta" in proxy).toBe(false);
31
-
32
- // prototype is hidden
33
- expect(Object.getPrototypeOf(proxy)).toBeNull();
34
- });
35
- });
@@ -1,33 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import { group } from "d3-array";
3
- import iterateNestedMaps from "./iterateNestedMaps.js";
4
-
5
- const data = [
6
- { name: "jim", amount: "34.0", date: "11/12/2015" },
7
- { name: "carl", amount: "120.11", date: "11/12/2015" },
8
- { name: "stacy", amount: "12.01", date: "01/04/2016" },
9
- { name: "stacy", amount: "34.05", date: "01/04/2016" },
10
- { name: "stacy", amount: "1.5", date: "02/04/2016" },
11
- ];
12
-
13
- const groups = group(
14
- data,
15
- (d) => d.name,
16
- (d) => d.date
17
- );
18
-
19
- test("iterateNestedMaps iterates correctly", () => {
20
- const expected = [
21
- [["jim", "11/12/2015"], [data[0]]],
22
- [["carl", "11/12/2015"], [data[1]]],
23
- [
24
- ["stacy", "01/04/2016"],
25
- [data[2], data[3]],
26
- ],
27
- [["stacy", "02/04/2016"], [data[4]]],
28
- ];
29
-
30
- const result = [...iterateNestedMaps(groups)];
31
-
32
- expect(result).toEqual(expected);
33
- });
@@ -1,30 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import kWayMerge from "./kWayMerge.js";
3
-
4
- test("k-way merge merges multiple sorted arrays", () => {
5
- /** @type {{a: number}[][]} */
6
- const arrays = [];
7
-
8
- for (let a = 0; a < 20; a++) {
9
- /** @type {{a: number}[]} */
10
- const array = [];
11
- arrays.push(array);
12
-
13
- let x = 0;
14
- for (let i = 0; i < a; i++) {
15
- x += Math.floor(Math.random() * 10);
16
- array.push({ a: x });
17
- }
18
- }
19
-
20
- const sorted = arrays.flat().sort((a, b) => a.a - b.a);
21
-
22
- /** @type {function(any):number} */
23
- const accessor = (d) => d.a;
24
-
25
- /** @type {{a: number}[]} */
26
- const result = [];
27
- kWayMerge(arrays, (d) => result.push(d), accessor);
28
-
29
- expect(result).toEqual(sorted);
30
- });
@@ -1,42 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import mergeObjects from "./mergeObjects.js";
3
-
4
- test("Merges non-conflicting properties", () => {
5
- expect(mergeObjects([{ a: 1 }, { b: 2 }], "test")).toEqual({ a: 1, b: 2 });
6
-
7
- expect(mergeObjects([{ a: [0, 1] }, { b: [2, 3] }], "test")).toEqual({
8
- a: [0, 1],
9
- b: [2, 3],
10
- });
11
- });
12
-
13
- test("Skips conflicting properties", () => {
14
- expect(
15
- mergeObjects(
16
- [
17
- { a: 1, b: 2, c: 3 },
18
- { b: 5, d: 4 },
19
- ],
20
- "test"
21
- )
22
- ).toEqual({ a: 1, b: 2, c: 3, d: 4 });
23
- });
24
-
25
- test("Null is handled correctly", () => {
26
- expect(mergeObjects([null, null, null], "test")).toBeNull();
27
- expect(() => mergeObjects([{ a: 1 }, null, { b: 2 }], "test")).toThrow();
28
- });
29
-
30
- test("Nested objects are merged", () => {
31
- expect(
32
- mergeObjects([{ nested: { a: 1 } }, { nested: { b: 2 } }], "test")
33
- ).toEqual({ nested: { a: 1, b: 2 } });
34
-
35
- expect(
36
- mergeObjects([{ nested: { a: 1 } }, { nested: true }], "test")
37
- ).toEqual({ nested: { a: 1 } });
38
-
39
- expect(
40
- mergeObjects([{ nested: true }, { nested: { a: 1 } }], "test")
41
- ).toEqual({ nested: { a: 1 } });
42
- });
@@ -1,6 +0,0 @@
1
- import { expect, test } from "vitest";
2
- import numberExtractor from "./numberExtractor.js";
3
-
4
- test("NumberExtractor parses delimited integers", () => {
5
- expect([...numberExtractor("23,12345,2345")]).toEqual([23, 12345, 2345]);
6
- });