@genome-spy/core 0.64.0 → 0.65.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 (104) hide show
  1. package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
  2. package/dist/bundle/browser-txUcLy2H.js +123 -0
  3. package/dist/bundle/index-BQpbYrv4.js +1712 -0
  4. package/dist/bundle/index-BhtHKLUo.js +73 -0
  5. package/dist/bundle/index-C0llXMqm.js +280 -0
  6. package/dist/bundle/index-CCe8rnZz.js +716 -0
  7. package/dist/bundle/index-CD7FLu9x.js +269 -0
  8. package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
  9. package/dist/bundle/index-D74H8TTz.js +508 -0
  10. package/dist/bundle/index-DhcU-Gk-.js +1487 -0
  11. package/dist/bundle/index.es.js +4878 -4680
  12. package/dist/bundle/index.js +151 -167
  13. package/dist/bundle/inflate-DRgHi_KK.js +1050 -0
  14. package/dist/schema.json +9 -1
  15. package/dist/src/data/collector.d.ts +7 -2
  16. package/dist/src/data/collector.d.ts.map +1 -1
  17. package/dist/src/data/collector.js +13 -2
  18. package/dist/src/data/dataFlow.d.ts +20 -42
  19. package/dist/src/data/dataFlow.d.ts.map +1 -1
  20. package/dist/src/data/dataFlow.js +57 -80
  21. package/dist/src/data/dataFlow.test.js +35 -2
  22. package/dist/src/data/flowHandle.d.ts +15 -0
  23. package/dist/src/data/flowHandle.d.ts.map +1 -0
  24. package/dist/src/data/flowHandle.js +13 -0
  25. package/dist/src/data/flowInit.d.ts +85 -0
  26. package/dist/src/data/flowInit.d.ts.map +1 -0
  27. package/dist/src/data/flowInit.js +238 -0
  28. package/dist/src/data/flowInit.test.d.ts +2 -0
  29. package/dist/src/data/flowInit.test.d.ts.map +1 -0
  30. package/dist/src/data/flowInit.test.js +413 -0
  31. package/dist/src/data/flowOptimizer.d.ts +6 -4
  32. package/dist/src/data/flowOptimizer.d.ts.map +1 -1
  33. package/dist/src/data/flowOptimizer.js +29 -14
  34. package/dist/src/data/flowOptimizer.test.js +20 -15
  35. package/dist/src/data/sources/lazy/bamSource.js +1 -1
  36. package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
  37. package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
  38. package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
  39. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  40. package/dist/src/data/sources/lazy/gff3Source.js +4 -8
  41. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  42. package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
  43. package/dist/src/data/sources/lazy/tabixSource.js +1 -1
  44. package/dist/src/genomeSpy.d.ts +1 -1
  45. package/dist/src/genomeSpy.d.ts.map +1 -1
  46. package/dist/src/genomeSpy.js +18 -61
  47. package/dist/src/marks/mark.d.ts +1 -0
  48. package/dist/src/marks/mark.d.ts.map +1 -1
  49. package/dist/src/marks/mark.js +22 -1
  50. package/dist/src/spec/sampleView.d.ts +3 -2
  51. package/dist/src/types/viewContext.d.ts +1 -1
  52. package/dist/src/view/axisResolution.d.ts +5 -0
  53. package/dist/src/view/axisResolution.d.ts.map +1 -1
  54. package/dist/src/view/axisResolution.js +16 -1
  55. package/dist/src/view/facetView.d.ts.map +1 -1
  56. package/dist/src/view/facetView.js +1 -0
  57. package/dist/src/view/flowBuilder.d.ts +2 -2
  58. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  59. package/dist/src/view/flowBuilder.js +21 -4
  60. package/dist/src/view/gridView/gridView.d.ts.map +1 -1
  61. package/dist/src/view/gridView/gridView.js +13 -0
  62. package/dist/src/view/gridView/selectionRect.d.ts +8 -4
  63. package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
  64. package/dist/src/view/gridView/selectionRect.js +28 -3
  65. package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
  66. package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
  67. package/dist/src/view/gridView/selectionRect.test.js +87 -0
  68. package/dist/src/view/paramMediator.d.ts +2 -1
  69. package/dist/src/view/paramMediator.d.ts.map +1 -1
  70. package/dist/src/view/paramMediator.js +13 -1
  71. package/dist/src/view/paramMediator.test.js +22 -0
  72. package/dist/src/view/scaleResolution.d.ts +5 -0
  73. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  74. package/dist/src/view/scaleResolution.js +10 -0
  75. package/dist/src/view/testUtils.d.ts.map +1 -1
  76. package/dist/src/view/testUtils.js +16 -4
  77. package/dist/src/view/unitView.d.ts.map +1 -1
  78. package/dist/src/view/unitView.js +58 -8
  79. package/dist/src/view/view.d.ts +17 -1
  80. package/dist/src/view/view.d.ts.map +1 -1
  81. package/dist/src/view/view.js +57 -1
  82. package/dist/src/view/viewDispose.test.d.ts +2 -0
  83. package/dist/src/view/viewDispose.test.d.ts.map +1 -0
  84. package/dist/src/view/viewDispose.test.js +110 -0
  85. package/dist/src/view/viewUtils.d.ts +4 -4
  86. package/dist/src/view/viewUtils.d.ts.map +1 -1
  87. package/dist/src/view/viewUtils.js +19 -15
  88. package/dist/src/view/viewUtils.test.d.ts +2 -0
  89. package/dist/src/view/viewUtils.test.d.ts.map +1 -0
  90. package/dist/src/view/viewUtils.test.js +87 -0
  91. package/package.json +10 -10
  92. package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
  93. package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
  94. package/dist/bundle/index-5ajWdKly.js +0 -1319
  95. package/dist/bundle/index-B03-Om4z.js +0 -274
  96. package/dist/bundle/index-BftNdA0O.js +0 -27
  97. package/dist/bundle/index-Bg7C4Xat.js +0 -2750
  98. package/dist/bundle/index-C3QR8Lv6.js +0 -2131
  99. package/dist/bundle/index-DTcHjAHp.js +0 -505
  100. package/dist/bundle/index-DnIkxb0L.js +0 -1025
  101. package/dist/bundle/index-Ww3TAo6_.js +0 -71
  102. package/dist/bundle/index-g8iXgW0W.js +0 -651
  103. package/dist/bundle/long-B-FASCSo.js +0 -2387
  104. package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
@@ -86,6 +86,11 @@ export default class View {
86
86
  */
87
87
  opacityFunction = defaultOpacityFunction;
88
88
 
89
+ /**
90
+ * @type {(() => void)[]}
91
+ */
92
+ #disposers = [];
93
+
89
94
  /**
90
95
  * Coords of the view for each facet, recorded during the last layout rendering pass.
91
96
  * Most views have only one facet, so the map is usually of size 1.
@@ -136,6 +141,11 @@ export default class View {
136
141
  ...options,
137
142
  };
138
143
 
144
+ /**
145
+ * @type {import("../data/flowHandle.js").FlowHandle | undefined}
146
+ */
147
+ this.flowHandle = undefined;
148
+
139
149
  /**
140
150
  * Whether GridView or equivalent should draw axis and grid lines for this view.
141
151
  * TODO: Use view options for this.
@@ -497,7 +507,7 @@ export default class View {
497
507
  }
498
508
 
499
509
  /**
500
- * Get all descendants of this view in depth-first order.
510
+ * Get this view and all descendants in depth-first order.
501
511
  */
502
512
  getDescendants() {
503
513
  /** @type {View[]} */
@@ -508,6 +518,52 @@ export default class View {
508
518
  return descendants;
509
519
  }
510
520
 
521
+ /**
522
+ * Release resources owned by this view.
523
+ */
524
+ dispose() {
525
+ for (const disposer of this.#disposers) {
526
+ disposer();
527
+ }
528
+ this.#disposers.length = 0;
529
+
530
+ const handle = this.flowHandle;
531
+
532
+ if (handle?.collector) {
533
+ this.context.dataFlow.pruneCollectorBranch(handle.collector);
534
+ this.context.dataFlow.removeCollector(handle.collector);
535
+ }
536
+
537
+ if (
538
+ handle?.dataSource &&
539
+ handle.dataSource.view === this &&
540
+ !handle.dataSource.identifier
541
+ ) {
542
+ this.context.dataFlow.removeDataSource(handle.dataSource);
543
+ }
544
+
545
+ this.flowHandle = undefined;
546
+ }
547
+
548
+ /**
549
+ * @param {() => void} disposer
550
+ */
551
+ registerDisposer(disposer) {
552
+ this.#disposers.push(disposer);
553
+ }
554
+
555
+ /**
556
+ * Dispose this view and all descendants in post-order.
557
+ */
558
+ disposeSubtree() {
559
+ /** @type {Visitor} */
560
+ const visitor = () => undefined;
561
+ visitor.postOrder = (view) => {
562
+ view.dispose();
563
+ };
564
+ this.visit(visitor);
565
+ }
566
+
511
567
  /**
512
568
  * Called after all scales in the view hierarchy have been resolved.
513
569
  */
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=viewDispose.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewDispose.test.d.ts","sourceRoot":"","sources":["../../../src/view/viewDispose.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,110 @@
1
+ import { describe, expect, test } from "vitest";
2
+
3
+ import ConcatView from "./concatView.js";
4
+ import DataSource from "../data/sources/dataSource.js";
5
+ import UnitView from "./unitView.js";
6
+ import View from "./view.js";
7
+ import { create, createTestViewContext } from "./testUtils.js";
8
+
9
+ class DisposableView extends View {
10
+ /** @type {boolean} */
11
+ disposed = false;
12
+
13
+ /**
14
+ * @param {string} name
15
+ * @param {import("../types/viewContext.js").default} context
16
+ * @param {import("./containerView.js").default} layoutParent
17
+ * @param {import("./view.js").default} dataParent
18
+ */
19
+ constructor(name, context, layoutParent, dataParent) {
20
+ /** @type {import("../spec/view.js").LayerSpec} */
21
+ const spec = { name, layer: [] };
22
+ super(spec, context, layoutParent, dataParent, name);
23
+ }
24
+
25
+ dispose() {
26
+ super.dispose();
27
+ this.disposed = true;
28
+ }
29
+ }
30
+
31
+ describe("View disposal", () => {
32
+ test("removes scale and axis resolutions for disposed unit views", async () => {
33
+ /** @type {import("../spec/view.js").UnitSpec} */
34
+ const spec = {
35
+ data: {
36
+ values: [
37
+ {
38
+ x: 1,
39
+ y: 2,
40
+ },
41
+ ],
42
+ },
43
+ mark: "point",
44
+ encoding: {
45
+ x: { field: "x", type: "quantitative" },
46
+ y: { field: "y", type: "quantitative" },
47
+ },
48
+ };
49
+
50
+ const view = await create(spec, UnitView);
51
+
52
+ expect(view.getScaleResolution("x")).toBeDefined();
53
+ expect(view.getAxisResolution("x")).toBeDefined();
54
+
55
+ view.disposeSubtree();
56
+
57
+ expect(view.getScaleResolution("x")).toBeUndefined();
58
+ expect(view.getAxisResolution("x")).toBeUndefined();
59
+ });
60
+
61
+ test("disposes replaced grid children", () => {
62
+ const context = createTestViewContext();
63
+ const parent = new ConcatView(
64
+ { hconcat: [] },
65
+ context,
66
+ null,
67
+ null,
68
+ "c"
69
+ );
70
+
71
+ const childA = new DisposableView("a", context, parent, parent);
72
+ const childB = new DisposableView("b", context, parent, parent);
73
+ parent.setChildren([childA, childB]);
74
+
75
+ const childC = new DisposableView("c", context, parent, parent);
76
+ parent.setChildren([childC]);
77
+
78
+ expect(childA.disposed).toBe(true);
79
+ expect(childB.disposed).toBe(true);
80
+ expect(childC.disposed).toBe(false);
81
+
82
+ const childD = new DisposableView("d", context, parent, parent);
83
+ parent.replaceChild(childC, childD);
84
+
85
+ expect(childC.disposed).toBe(true);
86
+ expect(childD.disposed).toBe(false);
87
+ });
88
+
89
+ test("removes dataflow hosts on dispose", () => {
90
+ const context = createTestViewContext();
91
+ const parent = new ConcatView(
92
+ { hconcat: [] },
93
+ context,
94
+ null,
95
+ null,
96
+ "c"
97
+ );
98
+ const child = new DisposableView("a", context, parent, parent);
99
+
100
+ const dataSource = new DataSource(child);
101
+ context.dataFlow.addDataSource(dataSource);
102
+ child.flowHandle = { dataSource };
103
+
104
+ expect(child.flowHandle.dataSource).toBe(dataSource);
105
+
106
+ child.disposeSubtree();
107
+
108
+ expect(child.flowHandle).toBeUndefined();
109
+ });
110
+ });
@@ -35,11 +35,11 @@ export function checkForDuplicateScaleNames(root: View): void;
35
35
  */
36
36
  export function setImplicitScaleNames(root: View): void;
37
37
  /**
38
- * @param {View} root
39
- * @param {import("../data/dataFlow.js").default<View>} [existingFlow] Add data flow
40
- * graphs to an existing DataFlow object.
38
+ * @param {Promise<import("../marks/mark.js").default>[]} graphicsPromises
39
+ * @param {() => boolean} [shouldFinalize]
40
+ * @returns {Promise<void>}
41
41
  */
42
- export function initializeData(root: View, existingFlow?: import("../data/dataFlow.js").default<View>): Promise<import("../data/dataFlow.js").default<View>>;
42
+ export function finalizeSubtreeGraphics(graphicsPromises: Promise<import("../marks/mark.js").default>[], shouldFinalize?: () => boolean): Promise<void>;
43
43
  /**
44
44
  *
45
45
  * @param {View} view
@@ -1 +1 @@
1
- {"version":3,"file":"viewUtils.d.ts","sourceRoot":"","sources":["../../../src/view/viewUtils.js"],"names":[],"mappings":"AAWA;;;;GAIG;AACH,qCAHW,OAAO,oBAAoB,EAAE,UAAU,GAAG,OAAO,iBAAiB,EAAE,YAAY,GAC9E,IAAI,IAAI,aAAa,CAIjC;AAED;;;;GAIG;AACH,oCAHW,OAAO,oBAAoB,EAAE,aAAa,GAAG,OAAO,iBAAiB,EAAE,YAAY,GACjF,IAAI,IAAI,YAAY,CAOhC;AAED;;;GAGG;AACH,+BAFW,IAAI,6EAMd;AAED;;;;GAIG;AACH,wCAFW,IAAI,UASd;AAED;;GAEG;AACH,kDAFW,IAAI,QAiBd;AAED;;;;;;;GAOG;AACH,4CAFW,IAAI,QAUd;AAED;;;;GAIG;AACH,qCAJW,IAAI,iBACJ,OAAO,qBAAqB,EAAE,OAAO,CAAC,IAAI,CAAC,wDAcrD;AAED;;;GAGG;AACH,wCAFW,IAAI;UAGO,QAAQ;aAAW,OAAO,oBAAoB,EAAE,OAAO;WAAS,OAAO,oBAAoB,EAAE,KAAK;UAAQ,OAAO,oBAAoB,EAAE,IAAI;IAqBhK;AAED;;;;;GAKG;AACH,2CALW,OAAO,iBAAiB,EAAE,UAAU,WACpC,MAAM,eACN,OAAO,yBAAyB,EAAE,OAAO,GACvC,OAAO,CAAC,OAAO,iBAAiB,EAAE,QAAQ,CAAC,CAsCvD;AAED;;GAEG;AACH,yCAFW,CAAS,IAAI,EAAJ,IAAI,EAAE,IAAM,EAAN,IAAI,EAAE,KAAE,IAAI,+BAkBrC;AAED;;;;;;GAMG;AACH,4CAJW,IAAI,QACJ,MAAM,GACJ,IAAI,EAAE,CAalB;AAED;;;GAGG;AACH,0CAFW,IAAI,eAqBd;AAED;;GAEG;AACH,8CAFW,OAAO,WAAW,EAAE,OAAO;;;EAoBrC;iBA3Q4C,WAAW;qBAFnC,eAAe"}
1
+ {"version":3,"file":"viewUtils.d.ts","sourceRoot":"","sources":["../../../src/view/viewUtils.js"],"names":[],"mappings":"AASA;;;;GAIG;AACH,qCAHW,OAAO,oBAAoB,EAAE,UAAU,GAAG,OAAO,iBAAiB,EAAE,YAAY,GAC9E,IAAI,IAAI,aAAa,CAIjC;AAED;;;;GAIG;AACH,oCAHW,OAAO,oBAAoB,EAAE,aAAa,GAAG,OAAO,iBAAiB,EAAE,YAAY,GACjF,IAAI,IAAI,YAAY,CAOhC;AAED;;;GAGG;AACH,+BAFW,IAAI,6EAMd;AAED;;;;GAIG;AACH,wCAFW,IAAI,UASd;AAED;;GAEG;AACH,kDAFW,IAAI,QAiBd;AAED;;;;;;;GAOG;AACH,4CAFW,IAAI,QAUd;AAED;;;;GAIG;AACH,0DAJW,OAAO,CAAC,OAAO,kBAAkB,EAAE,OAAO,CAAC,EAAE,mBAC7C,MAAM,OAAO,GACX,OAAO,CAAC,IAAI,CAAC,CAmBzB;AAED;;;GAGG;AACH,wCAFW,IAAI;UAGO,QAAQ;aAAW,OAAO,oBAAoB,EAAE,OAAO;WAAS,OAAO,oBAAoB,EAAE,KAAK;UAAQ,OAAO,oBAAoB,EAAE,IAAI;IAqBhK;AAED;;;;;GAKG;AACH,2CALW,OAAO,iBAAiB,EAAE,UAAU,WACpC,MAAM,eACN,OAAO,yBAAyB,EAAE,OAAO,GACvC,OAAO,CAAC,OAAO,iBAAiB,EAAE,QAAQ,CAAC,CAsCvD;AAED;;GAEG;AACH,yCAFW,CAAS,IAAI,EAAJ,IAAI,EAAE,IAAM,EAAN,IAAI,EAAE,KAAE,IAAI,+BAkBrC;AAED;;;;;;GAMG;AACH,4CAJW,IAAI,QACJ,MAAM,GACJ,IAAI,EAAE,CAalB;AAED;;;GAGG;AACH,0CAFW,IAAI,eAqBd;AAED;;GAEG;AACH,8CAFW,OAAO,WAAW,EAAE,OAAO;;;EAoBrC;iBA/Q4C,WAAW;qBAFnC,eAAe"}
@@ -3,8 +3,6 @@ import { isObject, isString } from "vega-util";
3
3
  import UnitView from "./unitView.js";
4
4
  // eslint-disable-next-line no-unused-vars
5
5
  import View, { VISIT_SKIP, VISIT_STOP } from "./view.js";
6
- import { buildDataFlow } from "./flowBuilder.js";
7
- import { optimizeDataFlow } from "../data/flowOptimizer.js";
8
6
  import { isFieldDef, primaryPositionalChannels } from "../encoder/encoder.js";
9
7
  import { rollup } from "d3-array";
10
8
  import { concatUrl, getDirectory } from "../utils/url.js";
@@ -93,21 +91,27 @@ export function setImplicitScaleNames(root) {
93
91
  }
94
92
 
95
93
  /**
96
- * @param {View} root
97
- * @param {import("../data/dataFlow.js").default<View>} [existingFlow] Add data flow
98
- * graphs to an existing DataFlow object.
94
+ * @param {Promise<import("../marks/mark.js").default>[]} graphicsPromises
95
+ * @param {() => boolean} [shouldFinalize]
96
+ * @returns {Promise<void>}
99
97
  */
100
- export async function initializeData(root, existingFlow) {
101
- const flow = buildDataFlow(root, existingFlow);
102
- optimizeDataFlow(flow);
103
- flow.initialize();
104
-
105
- /** @type {Promise<void>[]} */
106
- const promises = flow.dataSources.map((dataSource) => dataSource.load());
107
-
108
- await Promise.all(promises);
98
+ export function finalizeSubtreeGraphics(
99
+ graphicsPromises,
100
+ shouldFinalize = () => true
101
+ ) {
102
+ return Promise.allSettled(graphicsPromises).then((results) => {
103
+ if (!shouldFinalize()) {
104
+ return;
105
+ }
109
106
 
110
- return flow;
107
+ for (const result of results) {
108
+ if ("value" in result) {
109
+ result.value.finalizeGraphicsInitialization();
110
+ } else if ("reason" in result) {
111
+ console.error(result.reason);
112
+ }
113
+ }
114
+ });
111
115
  }
112
116
 
113
117
  /**
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=viewUtils.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"viewUtils.test.d.ts","sourceRoot":"","sources":["../../../src/view/viewUtils.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,87 @@
1
+ import { describe, expect, test, vi } from "vitest";
2
+
3
+ import { createTestViewContext } from "./testUtils.js";
4
+ import { finalizeSubtreeGraphics } from "./viewUtils.js";
5
+ import { initializeViewSubtree } from "../data/flowInit.js";
6
+
7
+ describe("initializeViewSubtree", () => {
8
+ test("initializes data flow for a subtree only", async () => {
9
+ const context = createTestViewContext();
10
+
11
+ /** @type {import("../spec/view.js").HConcatSpec} */
12
+ const spec = {
13
+ hconcat: [
14
+ {
15
+ data: {
16
+ values: [{ x: 1 }],
17
+ },
18
+ mark: "point",
19
+ encoding: {
20
+ x: { field: "x", type: "quantitative" },
21
+ },
22
+ },
23
+ {
24
+ data: {
25
+ values: [{ x: 2 }],
26
+ },
27
+ mark: "point",
28
+ encoding: {
29
+ x: { field: "x", type: "quantitative" },
30
+ },
31
+ },
32
+ ],
33
+ };
34
+
35
+ const root = await context.createOrImportView(spec, null, null, "root");
36
+ const concatRoot = /** @type {import("./concatView.js").default} */ (
37
+ root
38
+ );
39
+ const child = concatRoot.children[0];
40
+ const otherChild = concatRoot.children[1];
41
+
42
+ const { dataSources, graphicsPromises, unitViews } =
43
+ initializeViewSubtree(child, context.dataFlow);
44
+
45
+ expect(dataSources.size).toBe(1);
46
+ expect(unitViews.length).toBe(1);
47
+ expect(graphicsPromises.length).toBe(0);
48
+
49
+ expect(child.flowHandle?.dataSource).toBeDefined();
50
+ expect(otherChild.flowHandle?.dataSource).toBeUndefined();
51
+ });
52
+ });
53
+
54
+ describe("finalizeSubtreeGraphics", () => {
55
+ test("finalizes marks when allowed", async () => {
56
+ const markA = /** @type {import("../marks/mark.js").default} */ (
57
+ /** @type {unknown} */ ({
58
+ finalizeGraphicsInitialization: vi.fn(),
59
+ })
60
+ );
61
+ const markB = /** @type {import("../marks/mark.js").default} */ (
62
+ /** @type {unknown} */ ({
63
+ finalizeGraphicsInitialization: vi.fn(),
64
+ })
65
+ );
66
+
67
+ await finalizeSubtreeGraphics([
68
+ Promise.resolve(markA),
69
+ Promise.resolve(markB),
70
+ ]);
71
+
72
+ expect(markA.finalizeGraphicsInitialization).toHaveBeenCalledTimes(1);
73
+ expect(markB.finalizeGraphicsInitialization).toHaveBeenCalledTimes(1);
74
+ });
75
+
76
+ test("skips finalization when predicate is false", async () => {
77
+ const mark = /** @type {import("../marks/mark.js").default} */ (
78
+ /** @type {unknown} */ ({
79
+ finalizeGraphicsInitialization: vi.fn(),
80
+ })
81
+ );
82
+
83
+ await finalizeSubtreeGraphics([Promise.resolve(mark)], () => false);
84
+
85
+ expect(mark.finalizeGraphicsInitialization).not.toHaveBeenCalled();
86
+ });
87
+ });
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.64.0",
10
+ "version": "0.65.0",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -36,14 +36,12 @@
36
36
  "postpack": "node scripts/postpack.mjs"
37
37
  },
38
38
  "dependencies": {
39
- "@gmod/bam": "^4.0.1",
40
- "@gmod/bbi": "^5.0.2",
41
- "@gmod/bed": "^2.1.3",
42
- "@gmod/bgzf-filehandle": "^1.5.5",
43
- "@gmod/gff": "^1.3.0",
44
- "@gmod/indexedfasta": "^2.1.1",
45
- "@gmod/tabix": "^1.6.1",
46
- "@gmod/vcf": "^6.0.0",
39
+ "@gmod/bam": "^7.0.5",
40
+ "@gmod/bbi": "^7.1.0",
41
+ "@gmod/bed": "^2.1.7",
42
+ "@gmod/indexedfasta": "^4.0.7",
43
+ "@gmod/tabix": "^3.1.2",
44
+ "@gmod/vcf": "^6.1.0",
47
45
  "@types/d3-array": "^3.2.2",
48
46
  "@types/d3-dsv": "^3.0.7",
49
47
  "@types/d3-ease": "^3.0.2",
@@ -56,6 +54,8 @@
56
54
  "d3-format": "^3.1.0",
57
55
  "events": "^3.3.0",
58
56
  "flatqueue": "^2.0.3",
57
+ "generic-filehandle2": "^2.0.14",
58
+ "gff-nostream": "^2.0.0",
59
59
  "internmap": "^2.0.3",
60
60
  "lit": "^3.3.0",
61
61
  "twgl.js": "^4.19.1",
@@ -67,5 +67,5 @@
67
67
  "devDependencies": {
68
68
  "@types/long": "^4.0.1"
69
69
  },
70
- "gitHead": "a1edb39d7a50b3a2b05c9ee0d860170065fd5ad6"
70
+ "gitHead": "15ad2aca88eff4e1ba45a6956c3f2a04a01e6d26"
71
71
  }
@@ -1,8 +0,0 @@
1
- const e = {}, t = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
2
- __proto__: null,
3
- default: e
4
- }, Symbol.toStringTag, { value: "Module" }));
5
- export {
6
- e as L,
7
- t as _
8
- };
@@ -1,26 +0,0 @@
1
- function n(e) {
2
- return e && e.__esModule && Object.prototype.hasOwnProperty.call(e, "default") ? e.default : e;
3
- }
4
- function c(e) {
5
- if (e.__esModule) return e;
6
- var o = e.default;
7
- if (typeof o == "function") {
8
- var t = function r() {
9
- return this instanceof r ? Reflect.construct(o, arguments, this.constructor) : o.apply(this, arguments);
10
- };
11
- t.prototype = o.prototype;
12
- } else t = {};
13
- return Object.defineProperty(t, "__esModule", { value: !0 }), Object.keys(e).forEach(function(r) {
14
- var u = Object.getOwnPropertyDescriptor(e, r);
15
- Object.defineProperty(t, r, u.get ? u : {
16
- enumerable: !0,
17
- get: function() {
18
- return e[r];
19
- }
20
- });
21
- }), t;
22
- }
23
- export {
24
- c as a,
25
- n as g
26
- };