@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,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
- });