@genome-spy/core 0.53.1 → 0.55.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 (121) hide show
  1. package/dist/bundle/{_commonjsHelpers-BIiJCwQW.js → _commonjsHelpers-DSebQMb9.js} +2 -4
  2. package/dist/bundle/{index-B5cesONJ.js → index-B6haPltu.js} +33 -65
  3. package/dist/bundle/{index-uO0O4Uv-.js → index-BhtH2nrr.js} +3 -5
  4. package/dist/bundle/{index-_tI-fMQF.js → index-BpoXW6_f.js} +5 -6
  5. package/dist/bundle/{index-BywMLhhd.js → index-COovE1Oo.js} +75 -105
  6. package/dist/bundle/{index-BJLu48Hz.js → index-CjesiOz_.js} +2 -2
  7. package/dist/bundle/{index-oqw_s02W.js → index-HGQZ77IK.js} +2 -2
  8. package/dist/bundle/{index-DAJ8JQLE.js → index-WACuLhO6.js} +64 -119
  9. package/dist/bundle/{index-e0oKgZbZ.js → index-_ftu0t0z.js} +2 -3
  10. package/dist/bundle/{index-CSayoXbw.js → index-nCZhu2o-.js} +3 -3
  11. package/dist/bundle/index.es.js +4363 -4313
  12. package/dist/bundle/index.js +105 -99
  13. package/dist/bundle/{long-D4tVjLLz.js → long-BXK3UEks.js} +9 -16
  14. package/dist/bundle/{remoteFile-BkTxwFub.js → remoteFile-DuIsnepi.js} +1 -1
  15. package/dist/schema.json +36 -2
  16. package/dist/src/data/collector.d.ts.map +1 -1
  17. package/dist/src/data/collector.js +4 -0
  18. package/dist/src/data/flowNode.d.ts +14 -5
  19. package/dist/src/data/flowNode.d.ts.map +1 -1
  20. package/dist/src/data/flowNode.js +30 -7
  21. package/dist/src/data/sources/dataSource.d.ts +1 -2
  22. package/dist/src/data/sources/dataSource.d.ts.map +1 -1
  23. package/dist/src/data/sources/dataSource.js +0 -1
  24. package/dist/src/data/sources/inlineSource.d.ts +4 -0
  25. package/dist/src/data/sources/inlineSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/inlineSource.js +18 -0
  27. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -1
  28. package/dist/src/data/sources/lazy/axisGenomeSource.js +4 -0
  29. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -1
  30. package/dist/src/data/sources/lazy/axisTickSource.js +4 -0
  31. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  32. package/dist/src/data/sources/lazy/bamSource.js +4 -0
  33. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  34. package/dist/src/data/sources/lazy/bigBedSource.js +4 -0
  35. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -1
  36. package/dist/src/data/sources/lazy/bigWigSource.js +4 -0
  37. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
  38. package/dist/src/data/sources/lazy/gff3Source.js +4 -0
  39. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
  40. package/dist/src/data/sources/lazy/indexedFastaSource.js +4 -0
  41. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +2 -0
  42. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  43. package/dist/src/data/sources/lazy/singleAxisLazySource.js +2 -0
  44. package/dist/src/data/sources/namedSource.d.ts.map +1 -1
  45. package/dist/src/data/sources/namedSource.js +4 -0
  46. package/dist/src/data/sources/sequenceSource.d.ts.map +1 -1
  47. package/dist/src/data/sources/sequenceSource.js +4 -0
  48. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  49. package/dist/src/data/sources/urlSource.js +4 -0
  50. package/dist/src/data/transforms/aggregate.d.ts +12 -9
  51. package/dist/src/data/transforms/aggregate.d.ts.map +1 -1
  52. package/dist/src/data/transforms/aggregate.js +67 -24
  53. package/dist/src/data/transforms/aggregate.test.d.ts +2 -0
  54. package/dist/src/data/transforms/aggregate.test.d.ts.map +1 -0
  55. package/dist/src/data/transforms/aggregate.test.js +134 -0
  56. package/dist/src/data/transforms/aggregateOps.d.ts +6 -0
  57. package/dist/src/data/transforms/aggregateOps.d.ts.map +1 -0
  58. package/dist/src/data/transforms/aggregateOps.js +17 -0
  59. package/dist/src/data/transforms/clone.d.ts +2 -2
  60. package/dist/src/data/transforms/clone.d.ts.map +1 -1
  61. package/dist/src/data/transforms/clone.js +4 -3
  62. package/dist/src/data/transforms/coverage.d.ts +2 -2
  63. package/dist/src/data/transforms/coverage.d.ts.map +1 -1
  64. package/dist/src/data/transforms/coverage.js +4 -3
  65. package/dist/src/data/transforms/filter.d.ts +2 -2
  66. package/dist/src/data/transforms/filter.d.ts.map +1 -1
  67. package/dist/src/data/transforms/filter.js +3 -3
  68. package/dist/src/data/transforms/filterScoredLabels.d.ts +2 -2
  69. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  70. package/dist/src/data/transforms/filterScoredLabels.js +4 -3
  71. package/dist/src/data/transforms/flatten.d.ts +3 -2
  72. package/dist/src/data/transforms/flatten.d.ts.map +1 -1
  73. package/dist/src/data/transforms/flatten.js +6 -3
  74. package/dist/src/data/transforms/flattenCompressedExons.d.ts +2 -2
  75. package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -1
  76. package/dist/src/data/transforms/flattenCompressedExons.js +4 -3
  77. package/dist/src/data/transforms/flattenDelimited.d.ts +2 -2
  78. package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -1
  79. package/dist/src/data/transforms/flattenDelimited.js +4 -3
  80. package/dist/src/data/transforms/flattenSequence.d.ts +3 -2
  81. package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -1
  82. package/dist/src/data/transforms/flattenSequence.js +6 -3
  83. package/dist/src/data/transforms/formula.d.ts +2 -2
  84. package/dist/src/data/transforms/formula.d.ts.map +1 -1
  85. package/dist/src/data/transforms/formula.js +4 -3
  86. package/dist/src/data/transforms/identifier.d.ts +2 -2
  87. package/dist/src/data/transforms/identifier.d.ts.map +1 -1
  88. package/dist/src/data/transforms/identifier.js +4 -3
  89. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +3 -2
  90. package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -1
  91. package/dist/src/data/transforms/linearizeGenomicCoordinate.js +11 -4
  92. package/dist/src/data/transforms/measureText.d.ts +5 -4
  93. package/dist/src/data/transforms/measureText.d.ts.map +1 -1
  94. package/dist/src/data/transforms/measureText.js +11 -8
  95. package/dist/src/data/transforms/pileup.d.ts +2 -2
  96. package/dist/src/data/transforms/pileup.d.ts.map +1 -1
  97. package/dist/src/data/transforms/pileup.js +4 -3
  98. package/dist/src/data/transforms/project.d.ts +3 -2
  99. package/dist/src/data/transforms/project.d.ts.map +1 -1
  100. package/dist/src/data/transforms/project.js +6 -3
  101. package/dist/src/data/transforms/regexExtract.d.ts +3 -2
  102. package/dist/src/data/transforms/regexExtract.d.ts.map +1 -1
  103. package/dist/src/data/transforms/regexExtract.js +6 -3
  104. package/dist/src/data/transforms/regexFold.d.ts +3 -2
  105. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  106. package/dist/src/data/transforms/regexFold.js +6 -3
  107. package/dist/src/data/transforms/sample.d.ts +3 -2
  108. package/dist/src/data/transforms/sample.d.ts.map +1 -1
  109. package/dist/src/data/transforms/sample.js +5 -3
  110. package/dist/src/data/transforms/stack.d.ts +2 -2
  111. package/dist/src/data/transforms/stack.d.ts.map +1 -1
  112. package/dist/src/data/transforms/stack.js +4 -3
  113. package/dist/src/data/transforms/transform.d.ts +10 -0
  114. package/dist/src/data/transforms/transform.d.ts.map +1 -0
  115. package/dist/src/data/transforms/transform.js +22 -0
  116. package/dist/src/spec/title.d.ts +1 -1
  117. package/dist/src/spec/transform.d.ts +32 -2
  118. package/dist/src/view/axisView.js +2 -2
  119. package/dist/src/view/gridView.d.ts.map +1 -1
  120. package/dist/src/view/gridView.js +7 -3
  121. package/package.json +2 -2
@@ -1,32 +1,65 @@
1
1
  import { group as d3group } from "d3-array";
2
- import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
2
+ import { BEHAVIOR_CLONES } from "../flowNode.js";
3
3
  import { field } from "../../utils/field.js";
4
4
  import iterateNestedMaps from "../../utils/iterateNestedMaps.js";
5
+ import Transform from "./transform.js";
6
+ import AGGREGATE_OPS from "./aggregateOps.js";
5
7
 
6
- /**
7
- * A minimal aggregate transform that just counts grouped (by a single field) data items.
8
- * Work in progress.
9
- *
10
- * Eventually this will implement the most of Vega's aggregate transform:
11
- * https://vega.github.io/vega/docs/transforms/aggregate/
12
- */
13
- export default class AggregateTransform extends FlowNode {
8
+ export default class AggregateTransform extends Transform {
14
9
  get behavior() {
15
10
  return BEHAVIOR_CLONES;
16
11
  }
17
12
 
18
13
  /**
19
14
  * @param {import("../../spec/transform.js").AggregateParams} params
15
+ *
16
+ * @typedef {import("../flowNode.js").Datum} Datum
20
17
  */
21
18
  constructor(params) {
22
- super();
19
+ super(params);
23
20
  this.params = params;
24
21
 
25
22
  /** @type {any[]} */
26
23
  this.buffer = [];
24
+
25
+ /**
26
+ * @type {((arr: Datum[]) => number)[]}
27
+ */
28
+ this.ops = [];
29
+ /**
30
+ * @type {string[]}
31
+ */
32
+ this.as = [];
33
+
34
+ if (params.fields) {
35
+ if (params.fields.length != params.ops.length) {
36
+ throw new Error("Fields and ops must have the same length!");
37
+ }
38
+
39
+ if (params.as && params.as.length != params.ops.length) {
40
+ throw new Error(
41
+ 'If "as" is defined, "fields" and "as" must have the same length!'
42
+ );
43
+ }
44
+
45
+ params.fields.forEach((fieldName, i) => {
46
+ const accessor = field(fieldName);
47
+ const op = AGGREGATE_OPS[params.ops[i]];
48
+ this.ops.push((arr) => op(arr, accessor));
49
+ this.as.push(
50
+ params.as
51
+ ? params.as[i]
52
+ : `${params.ops[i]}_${params.fields[i]}`
53
+ );
54
+ });
55
+ } else {
56
+ this.ops.push((arr) => AGGREGATE_OPS.count(arr));
57
+ this.as.push("count");
58
+ }
27
59
  }
28
60
 
29
61
  reset() {
62
+ super.reset();
30
63
  this.buffer = [];
31
64
  }
32
65
 
@@ -41,26 +74,36 @@ export default class AggregateTransform extends FlowNode {
41
74
  complete() {
42
75
  const params = this.params;
43
76
 
44
- const groupby = params.groupby;
77
+ const groupby = params?.groupby;
78
+
79
+ if (groupby?.length > 0) {
80
+ const groupFieldAccessors = groupby.map((f) => field(f));
45
81
 
46
- const groupFieldAccessors = groupby.map((f) => field(f));
82
+ // There's something strange in d3-array's typings
83
+ const groups = /** @type {Map<any, any>} */ /** @type {any} */ (
84
+ d3group(this.buffer, ...groupFieldAccessors)
85
+ );
47
86
 
48
- // TODO: Fix case where no group fields are specified
87
+ for (const [group, data] of iterateNestedMaps(groups)) {
88
+ /** @type {any} */
89
+ const datum = {};
49
90
 
50
- // There's something strange in d3-array's typings
51
- const groups = /** @type {Map<any, any>} */ /** @type {any} */ (
52
- d3group(this.buffer, ...groupFieldAccessors)
53
- );
91
+ for (let i = 0; i < groupby.length; i++) {
92
+ datum[groupby[i]] = group[i];
93
+ }
54
94
 
55
- for (const [group, data] of iterateNestedMaps(groups)) {
56
- /** @type {any} */
57
- const datum = {
58
- count: data.length,
59
- };
95
+ this.ops.forEach((op, i) => {
96
+ datum[this.as[i]] = op(data);
97
+ });
60
98
 
61
- for (let i = 0; i < groupby.length; i++) {
62
- datum[groupby[i]] = group[i];
99
+ this._propagate(datum);
63
100
  }
101
+ } else {
102
+ /** @type {Datum} */
103
+ const datum = {};
104
+ this.ops.forEach((op, i) => {
105
+ datum[this.as[i]] = op(this.buffer);
106
+ });
64
107
 
65
108
  this._propagate(datum);
66
109
  }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=aggregate.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregate.test.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/aggregate.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,134 @@
1
+ import { describe, expect, test } from "vitest";
2
+ import { processData } from "../flowTestUtils.js";
3
+ import AggregateTransform from "./aggregate.js";
4
+
5
+ /**
6
+ * @param {import("../../spec/transform.js").AggregateParams} params
7
+ * @param {any[]} data
8
+ */
9
+ function transform(params, data) {
10
+ return processData(new AggregateTransform(params), data);
11
+ }
12
+
13
+ describe("Aggregate transform", () => {
14
+ test("Default to count when no data fields or group-by fields are specified", () => {
15
+ const input = [
16
+ { name: "alpha", data: 123 },
17
+ { name: "beta", data: 456 },
18
+ { name: "beta", data: 789 },
19
+ ];
20
+
21
+ expect(transform({ type: "aggregate" }, input)).toEqual([{ count: 3 }]);
22
+ });
23
+
24
+ test("Default to count when no data fields fields are specified", () => {
25
+ const input = [
26
+ { name: "alpha", data: 123 },
27
+ { name: "beta", data: 456 },
28
+ { name: "beta", data: 789 },
29
+ ];
30
+
31
+ expect(
32
+ transform({ type: "aggregate", groupby: ["name"] }, input)
33
+ ).toEqual([
34
+ { name: "alpha", count: 1 },
35
+ { name: "beta", count: 2 },
36
+ ]);
37
+ });
38
+
39
+ test("Compute count, sum, min, max, and mean for groups. Use default output field names.", () => {
40
+ const input = [
41
+ { name: "alpha", data: 123 },
42
+ { name: "beta", data: 456 },
43
+ { name: "beta", data: 789 },
44
+ ];
45
+
46
+ expect(
47
+ transform(
48
+ {
49
+ type: "aggregate",
50
+ groupby: ["name"],
51
+ fields: ["data", "data", "data", "data", "data"],
52
+ ops: ["count", "sum", "min", "max", "mean"],
53
+ },
54
+ input
55
+ )
56
+ ).toEqual([
57
+ {
58
+ name: "alpha",
59
+ count_data: 1,
60
+ sum_data: 123,
61
+ min_data: 123,
62
+ max_data: 123,
63
+ mean_data: 123,
64
+ },
65
+ {
66
+ name: "beta",
67
+ count_data: 2,
68
+ sum_data: 1245,
69
+ min_data: 456,
70
+ max_data: 789,
71
+ mean_data: 622.5,
72
+ },
73
+ ]);
74
+ });
75
+
76
+ test("Allow custom output field names", () => {
77
+ const input = [
78
+ { name: "alpha", data: 123 },
79
+ { name: "beta", data: 456 },
80
+ { name: "beta", data: 789 },
81
+ ];
82
+
83
+ expect(
84
+ transform(
85
+ {
86
+ type: "aggregate",
87
+ fields: ["data", "data", "data", "data", "data"],
88
+ ops: ["count", "sum", "min", "max", "mean"],
89
+ as: ["count", "total", "min", "max", "average"],
90
+ },
91
+ input
92
+ )
93
+ ).toEqual([
94
+ {
95
+ count: 3,
96
+ total: 1368,
97
+ min: 123,
98
+ max: 789,
99
+ average: 456,
100
+ },
101
+ ]);
102
+ });
103
+
104
+ test("Throw if the length of fields and ops does not match", () => {
105
+ const input = [{ name: "beta", data: 789 }];
106
+
107
+ expect(() =>
108
+ transform(
109
+ {
110
+ type: "aggregate",
111
+ fields: ["data", "data", "data", "data"],
112
+ ops: ["count", "sum", "min", "max", "mean"],
113
+ },
114
+ input
115
+ )
116
+ ).toThrow();
117
+ });
118
+
119
+ test("Throw if the length of fields and as does not match", () => {
120
+ const input = [{ name: "beta", data: 789 }];
121
+
122
+ expect(() =>
123
+ transform(
124
+ {
125
+ type: "aggregate",
126
+ fields: ["data"],
127
+ ops: ["count"],
128
+ as: ["count", "total"],
129
+ },
130
+ input
131
+ )
132
+ ).toThrow();
133
+ });
134
+ });
@@ -0,0 +1,6 @@
1
+ export default AGGREGATE_OPS;
2
+ /**
3
+ * @type {Record<import("../../spec/transform.js").AggregateOp, (arr: any[], accessor?: (datum: any) => number) => number>}
4
+ */
5
+ declare const AGGREGATE_OPS: Record<import("../../spec/transform.js").AggregateOp, (arr: any[], accessor?: (datum: any) => number) => number>;
6
+ //# sourceMappingURL=aggregateOps.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aggregateOps.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/aggregateOps.js"],"names":[],"mappings":";AAEA;;GAEG;AACH,6BAFU,OAAO,OAAO,yBAAyB,EAAE,WAAW,EAAE,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,KAAK,MAAM,CAAC,CAWxH"}
@@ -0,0 +1,17 @@
1
+ import { count, max, mean, median, min, sum, variance } from "d3-array";
2
+
3
+ /**
4
+ * @type {Record<import("../../spec/transform.js").AggregateOp, (arr: any[], accessor?: (datum: any) => number) => number>}
5
+ */
6
+ const AGGREGATE_OPS = {
7
+ count: (arr) => arr.length,
8
+ valid: count,
9
+ sum,
10
+ min,
11
+ max,
12
+ mean,
13
+ median,
14
+ variance,
15
+ };
16
+
17
+ export default AGGREGATE_OPS;
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * Clones the data objects that pass through.
3
3
  */
4
- export default class CloneTransform extends FlowNode {
4
+ export default class CloneTransform extends Transform {
5
5
  constructor();
6
6
  /**
7
7
  * Signals that a new batch of data will be propagated.
@@ -11,5 +11,5 @@ export default class CloneTransform extends FlowNode {
11
11
  beginBatch: (flowBatch?: import("../../types/flowBatch.js").FlowBatch) => void;
12
12
  #private;
13
13
  }
14
- import FlowNode from "../flowNode.js";
14
+ import Transform from "./transform.js";
15
15
  //# sourceMappingURL=clone.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/clone.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IAWI,cAmCC;IAXG;;;;OAIG;IACH,yBAFW,OAAO,0BAA0B,EAAE,SAAS,UAOtD;;CAER;qBApDsD,gBAAgB"}
1
+ {"version":3,"file":"clone.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/clone.js"],"names":[],"mappings":"AAKA;;GAEG;AACH;IAWI,cAmCC;IAXG;;;;OAIG;IACH,yBAFW,OAAO,0BAA0B,EAAE,SAAS,UAOtD;;CAER;sBApDqB,gBAAgB"}
@@ -1,11 +1,12 @@
1
1
  import { shallowArrayEquals } from "../../utils/arrayUtils.js";
2
2
  import createCloner, { getAllProperties } from "../../utils/cloner.js";
3
- import FlowNode, { BEHAVIOR_CLONES, isFileBatch } from "../flowNode.js";
3
+ import { BEHAVIOR_CLONES, isFileBatch } from "../flowNode.js";
4
+ import Transform from "./transform.js";
4
5
 
5
6
  /**
6
7
  * Clones the data objects that pass through.
7
8
  */
8
- export default class CloneTransform extends FlowNode {
9
+ export default class CloneTransform extends Transform {
9
10
  get behavior() {
10
11
  return BEHAVIOR_CLONES;
11
12
  }
@@ -17,7 +18,7 @@ export default class CloneTransform extends FlowNode {
17
18
  #clone = (datum) => datum;
18
19
 
19
20
  constructor() {
20
- super();
21
+ super({ type: "clone" });
21
22
 
22
23
  /** @param {import("../flowNode.js").Datum} datum */
23
24
  const setupCloner = (datum) => {
@@ -7,7 +7,7 @@
7
7
  * way to implement it is a separate transform that bins the coverage
8
8
  * segments and calculates weighted averages.
9
9
  */
10
- export default class CoverageTransform extends FlowNode {
10
+ export default class CoverageTransform extends Transform {
11
11
  /**
12
12
  * @typedef {import("../flowNode.js").Datum} Datum
13
13
  */
@@ -36,6 +36,6 @@ export default class CoverageTransform extends FlowNode {
36
36
  */
37
37
  ends: FlatQueue<number>;
38
38
  }
39
- import FlowNode from "../flowNode.js";
39
+ import Transform from "./transform.js";
40
40
  import FlatQueue from "flatqueue";
41
41
  //# sourceMappingURL=coverage.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/coverage.js"],"names":[],"mappings":";AAKA;;;;;;;GAOG;AACH;IAKI;;OAEG;IAEH;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,cAAc,EAgD1D;IA5CG,yDAAoB;IAEpB,mDAAwC;IACxC,iDAAoC;IAEpC,mCAAmC;IACnC,sBADoB,GAAG,KAAE,MAAM,CAGT;IACtB,mCAAmC;IACnC,uBADoB,GAAG,KAAE,MAAM,CACsC;IAErE;;;;;MAKC;IAED,sEACsE,MAAM,oCAgBvE;IAEL;;;;OAIG;IACH,MAFU,UAAU,MAAM,CAAC,CAEA;CA0IlC;qBA7MyC,gBAAgB;sBAHpC,WAAW"}
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/coverage.js"],"names":[],"mappings":";AAMA;;;;;;;GAOG;AACH;IAKI;;OAEG;IAEH;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,cAAc,EAgD1D;IA5CG,yDAAoB;IAEpB,mDAAwC;IACxC,iDAAoC;IAEpC,mCAAmC;IACnC,sBADoB,GAAG,KAAE,MAAM,CAGT;IACtB,mCAAmC;IACnC,uBADoB,GAAG,KAAE,MAAM,CACsC;IAErE;;;;;MAKC;IAED,sEACsE,MAAM,oCAgBvE;IAEL;;;;OAIG;IACH,MAFU,UAAU,MAAM,CAAC,CAEA;CA0IlC;sBA7MqB,gBAAgB;sBAJhB,WAAW"}
@@ -1,7 +1,8 @@
1
1
  import FlatQueue from "flatqueue";
2
2
 
3
3
  import { field } from "../../utils/field.js";
4
- import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
4
+ import { BEHAVIOR_CLONES } from "../flowNode.js";
5
+ import Transform from "./transform.js";
5
6
 
6
7
  /**
7
8
  * Computes coverage for sorted segments
@@ -11,7 +12,7 @@ import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
11
12
  * way to implement it is a separate transform that bins the coverage
12
13
  * segments and calculates weighted averages.
13
14
  */
14
- export default class CoverageTransform extends FlowNode {
15
+ export default class CoverageTransform extends Transform {
15
16
  get behavior() {
16
17
  return BEHAVIOR_CLONES;
17
18
  }
@@ -24,7 +25,7 @@ export default class CoverageTransform extends FlowNode {
24
25
  * @param {import("../../spec/transform.js").CoverageParams} params
25
26
  */
26
27
  constructor(params) {
27
- super();
28
+ super(params);
28
29
  this.params = params;
29
30
 
30
31
  this.startAccessor = field(params.start);
@@ -8,7 +8,7 @@ export function isExprFilterParams(params: import("../../spec/transform.js").Fil
8
8
  * @returns {params is import("../../spec/transform.js").SelectionFilterParams}
9
9
  */
10
10
  export function isSelectionFilterParams(params: import("../../spec/transform.js").FilterParams): params is import("../../spec/transform.js").SelectionFilterParams;
11
- export default class FilterTransform extends FlowNode {
11
+ export default class FilterTransform extends Transform {
12
12
  /**
13
13
  *
14
14
  * @param {import("../../spec/transform.js").FilterParams} params
@@ -19,5 +19,5 @@ export default class FilterTransform extends FlowNode {
19
19
  /** @type {import("../../view/paramMediator.js").ExprRefFunction} */
20
20
  predicate: import("../../view/paramMediator.js").ExprRefFunction;
21
21
  }
22
- import FlowNode from "../flowNode.js";
22
+ import Transform from "./transform.js";
23
23
  //# sourceMappingURL=filter.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filter.js"],"names":[],"mappings":"AA8CA;;;GAGG;AACH,2CAHW,OAAO,yBAAyB,EAAE,YAAY,gEAKxD;AAED;;;GAGG;AACH,gDAHW,OAAO,yBAAyB,EAAE,YAAY,qEAKxD;AAzDD;IACI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,YAAY,yBAC9C,OAAO,gBAAgB,EAAE,qBAAqB,EASxD;IAJG,uDAAoB;IAEpB,oEAAoE;IACpE,WADW,OAAO,6BAA6B,EAAE,eAAe,CACtC;CA6BjC;qBA3CoB,gBAAgB"}
1
+ {"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filter.js"],"names":[],"mappings":"AA8CA;;;GAGG;AACH,2CAHW,OAAO,yBAAyB,EAAE,YAAY,gEAKxD;AAED;;;GAGG;AACH,gDAHW,OAAO,yBAAyB,EAAE,YAAY,qEAKxD;AAzDD;IACI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,YAAY,yBAC9C,OAAO,gBAAgB,EAAE,qBAAqB,EASxD;IAJG,uDAAoB;IAEpB,oEAAoE;IACpE,WADW,OAAO,6BAA6B,EAAE,eAAe,CACtC;CA6BjC;sBA3CqB,gBAAgB"}
@@ -1,14 +1,14 @@
1
1
  import { makeSelectionTestExpression } from "../../selection/selection.js";
2
- import FlowNode from "../flowNode.js";
2
+ import Transform from "./transform.js";
3
3
 
4
- export default class FilterTransform extends FlowNode {
4
+ export default class FilterTransform extends Transform {
5
5
  /**
6
6
  *
7
7
  * @param {import("../../spec/transform.js").FilterParams} params
8
8
  * @param {import("../flowNode.js").ParamMediatorProvider} paramMediatorProvider
9
9
  */
10
10
  constructor(params, paramMediatorProvider) {
11
- super(paramMediatorProvider);
11
+ super(params, paramMediatorProvider);
12
12
 
13
13
  this.params = params;
14
14
 
@@ -1,4 +1,4 @@
1
- export default class FilterScoredLabelsTransform extends FlowNode {
1
+ export default class FilterScoredLabelsTransform extends Transform {
2
2
  /**
3
3
  *
4
4
  * @param {import("../../spec/transform.js").FilterScoredLabelsParams} params
@@ -24,6 +24,6 @@ export default class FilterScoredLabelsTransform extends FlowNode {
24
24
  _filterAndPropagate(): void;
25
25
  groups: Map<any, any>;
26
26
  }
27
- import FlowNode from "../flowNode.js";
27
+ import Transform from "./transform.js";
28
28
  import ReservationMap from "../../utils/reservationMap.js";
29
29
  //# sourceMappingURL=filterScoredLabels.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"filterScoredLabels.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filterScoredLabels.js"],"names":[],"mappings":"AAMA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,wBAAwB,QAC1D,OAAO,oBAAoB,EAAE,OAAO,EA2C9C;IAtCG,mEAAoB;IAEpB,oBAAoB;IACpB,OADW,GAAG,EAAE,CACD;IAEf,mBAAoC;IAMpC,iDAAyC;IACzC,mDAA6C;IAC7C,mDAA6C;IAC7C,mDAA6C;IAC7C,gCAAgC;IAChC,qBADoB,GAAG,KAAE,GAAG,CAGd;IACd,gBAAuC;IAEvC,uCAAuC;IACvC,iBADW,IAAI,GAAG,EAAE,cAAc,CAAC,CACH;IAEhC,4DAAuD;IAIvD,qBAAuE;IAgBvE,eAAiD;IAWrD,4BAyCC;IAKG,sBAAuB;CAU9B;qBAjI2C,gBAAgB;2BAEjC,+BAA+B"}
1
+ {"version":3,"file":"filterScoredLabels.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/filterScoredLabels.js"],"names":[],"mappings":"AAOA;IAKI;;;;OAIG;IACH,oBAHW,OAAO,yBAAyB,EAAE,wBAAwB,QAC1D,OAAO,oBAAoB,EAAE,OAAO,EA2C9C;IAtCG,mEAAoB;IAEpB,oBAAoB;IACpB,OADW,GAAG,EAAE,CACD;IAEf,mBAAoC;IAMpC,iDAAyC;IACzC,mDAA6C;IAC7C,mDAA6C;IAC7C,mDAA6C;IAC7C,gCAAgC;IAChC,qBADoB,GAAG,KAAE,GAAG,CAGd;IACd,gBAAuC;IAEvC,uCAAuC;IACvC,iBADW,IAAI,GAAG,EAAE,cAAc,CAAC,CACH;IAEhC,4DAAuD;IAIvD,qBAAuE;IAgBvE,eAAiD;IAWrD,4BAyCC;IAKG,sBAAuB;CAU9B;sBA9HqB,gBAAgB;2BAFX,+BAA+B"}
@@ -1,10 +1,11 @@
1
1
  import { bisector } from "d3-array";
2
- import FlowNode, { BEHAVIOR_COLLECTS } from "../flowNode.js";
2
+ import { BEHAVIOR_COLLECTS } from "../flowNode.js";
3
3
  import { topKSlice } from "../../utils/topK.js";
4
4
  import ReservationMap from "../../utils/reservationMap.js";
5
5
  import { field } from "../../utils/field.js";
6
+ import Transform from "./transform.js";
6
7
 
7
- export default class FilterScoredLabelsTransform extends FlowNode {
8
+ export default class FilterScoredLabelsTransform extends Transform {
8
9
  get behavior() {
9
10
  return BEHAVIOR_COLLECTS;
10
11
  }
@@ -15,7 +16,7 @@ export default class FilterScoredLabelsTransform extends FlowNode {
15
16
  * @param {import("../../view/view.js").default} view
16
17
  */
17
18
  constructor(params, view) {
18
- super();
19
+ super(params);
19
20
 
20
21
  this.params = params;
21
22
 
@@ -1,10 +1,11 @@
1
- export default class FlattenTransform extends FlowNode {
1
+ export default class FlattenTransform extends Transform {
2
2
  /**
3
3
  * @param {import("../../spec/transform.js").FlattenParams} params
4
4
  */
5
5
  constructor(params: import("../../spec/transform.js").FlattenParams);
6
+ params: import("../../spec/transform.js").FlattenParams;
6
7
  /** @param {any[]} datum */
7
8
  handle: (datum: any[]) => void;
8
9
  }
9
- import FlowNode from "../flowNode.js";
10
+ import Transform from "./transform.js";
10
11
  //# sourceMappingURL=flatten.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flatten.js"],"names":[],"mappings":"AAIA;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,aAAa,EAwDzD;IAvCO,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAwBhB;CAgBZ;qBAjEyC,gBAAgB"}
1
+ {"version":3,"file":"flatten.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flatten.js"],"names":[],"mappings":"AAKA;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,aAAa,EA0DzD;IArDG,wDAAoB;IAchB,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAwBhB;CAgBZ;sBAnEqB,gBAAgB"}
@@ -1,8 +1,9 @@
1
1
  import { asArray } from "../../utils/arrayUtils.js";
2
2
  import { field } from "../../utils/field.js";
3
- import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
3
+ import { BEHAVIOR_CLONES } from "../flowNode.js";
4
+ import Transform from "./transform.js";
4
5
 
5
- export default class FlattenTransform extends FlowNode {
6
+ export default class FlattenTransform extends Transform {
6
7
  get behavior() {
7
8
  return BEHAVIOR_CLONES;
8
9
  }
@@ -11,7 +12,9 @@ export default class FlattenTransform extends FlowNode {
11
12
  * @param {import("../../spec/transform.js").FlattenParams} params
12
13
  */
13
14
  constructor(params) {
14
- super();
15
+ super(params);
16
+
17
+ this.params = params;
15
18
 
16
19
  const indexField = params.index;
17
20
 
@@ -3,7 +3,7 @@
3
3
  * coordinate of the gene body and a comma-delimited string of alternating
4
4
  * intron and exon lengths. A new datum is created for each exon.
5
5
  */
6
- export default class FlattenCompressedExonsTransform extends FlowNode {
6
+ export default class FlattenCompressedExonsTransform extends Transform {
7
7
  /**
8
8
  *
9
9
  * @param {import("../../spec/transform.js").FlattenCompressedExonsParams} params
@@ -15,5 +15,5 @@ export default class FlattenCompressedExonsTransform extends FlowNode {
15
15
  */
16
16
  handle: (datum: any) => void;
17
17
  }
18
- import FlowNode from "../flowNode.js";
18
+ import Transform from "./transform.js";
19
19
  //# sourceMappingURL=flattenCompressedExons.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flattenCompressedExons.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenCompressedExons.js"],"names":[],"mappings":"AAIA;;;;GAIG;AACH;IAKI;;;OAGG;IACH,oBAFW,OAAO,yBAAyB,EAAE,4BAA4B,EAmCxE;IA1BG;;;OAGG;IACH,gBAFW,GAAG,UAuBb;CAER;qBAlDyC,gBAAgB"}
1
+ {"version":3,"file":"flattenCompressedExons.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenCompressedExons.js"],"names":[],"mappings":"AAKA;;;;GAIG;AACH;IAKI;;;OAGG;IACH,oBAFW,OAAO,yBAAyB,EAAE,4BAA4B,EAmCxE;IA1BG;;;OAGG;IACH,gBAFW,GAAG,UAuBb;CAER;sBAlDqB,gBAAgB"}
@@ -1,13 +1,14 @@
1
1
  import { field } from "../../utils/field.js";
2
2
  import numberExtractor from "../../utils/numberExtractor.js";
3
- import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
3
+ import { BEHAVIOR_CLONES } from "../flowNode.js";
4
+ import Transform from "./transform.js";
4
5
 
5
6
  /**
6
7
  * Flattens "run-length encoded" exons. The transforms inputs the start
7
8
  * coordinate of the gene body and a comma-delimited string of alternating
8
9
  * intron and exon lengths. A new datum is created for each exon.
9
10
  */
10
- export default class FlattenCompressedExonsTransform extends FlowNode {
11
+ export default class FlattenCompressedExonsTransform extends Transform {
11
12
  get behavior() {
12
13
  return BEHAVIOR_CLONES;
13
14
  }
@@ -17,7 +18,7 @@ export default class FlattenCompressedExonsTransform extends FlowNode {
17
18
  * @param {import("../../spec/transform.js").FlattenCompressedExonsParams} params
18
19
  */
19
20
  constructor(params) {
20
- super();
21
+ super(params);
21
22
 
22
23
  const exonsAccessor = field(params.exons ?? "exons");
23
24
  const startAccessor = field(params.start ?? "start");
@@ -1,4 +1,4 @@
1
- export default class FlattenDelimitedTransform extends FlowNode {
1
+ export default class FlattenDelimitedTransform extends Transform {
2
2
  /**
3
3
  * @param {import("../../spec/transform.js").FlattenDelimitedParams} params
4
4
  */
@@ -6,5 +6,5 @@ export default class FlattenDelimitedTransform extends FlowNode {
6
6
  /** @param {any[]} datum */
7
7
  handle: (datum: any[]) => void;
8
8
  }
9
- import FlowNode from "../flowNode.js";
9
+ import Transform from "./transform.js";
10
10
  //# sourceMappingURL=flattenDelimited.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flattenDelimited.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenDelimited.js"],"names":[],"mappings":"AAIA;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,sBAAsB,EAuClE;IAnBG,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAkBhB;CAER;qBAhDyC,gBAAgB"}
1
+ {"version":3,"file":"flattenDelimited.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenDelimited.js"],"names":[],"mappings":"AAKA;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,sBAAsB,EAuClE;IAnBG,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAkBhB;CAER;sBAhDqB,gBAAgB"}
@@ -1,8 +1,9 @@
1
1
  import { asArray } from "../../utils/arrayUtils.js";
2
2
  import { field } from "../../utils/field.js";
3
- import FlowNode, { BEHAVIOR_CLONES } from "../flowNode.js";
3
+ import { BEHAVIOR_CLONES } from "../flowNode.js";
4
+ import Transform from "./transform.js";
4
5
 
5
- export default class FlattenDelimitedTransform extends FlowNode {
6
+ export default class FlattenDelimitedTransform extends Transform {
6
7
  get behavior() {
7
8
  return BEHAVIOR_CLONES;
8
9
  }
@@ -11,7 +12,7 @@ export default class FlattenDelimitedTransform extends FlowNode {
11
12
  * @param {import("../../spec/transform.js").FlattenDelimitedParams} params
12
13
  */
13
14
  constructor(params) {
14
- super();
15
+ super(params);
15
16
 
16
17
  // TODO: Validate config. string elements, etc...
17
18
 
@@ -1,11 +1,12 @@
1
- export default class FlattenSequenceTransform extends FlowNode {
1
+ export default class FlattenSequenceTransform extends Transform {
2
2
  /**
3
3
  *
4
4
  * @param {import("../../spec/transform.js").FlattenSequenceParams} params
5
5
  */
6
6
  constructor(params: import("../../spec/transform.js").FlattenSequenceParams);
7
+ params: import("../../spec/transform.js").FlattenSequenceParams;
7
8
  /** @param {any[]} datum */
8
9
  handle: (datum: any[]) => void;
9
10
  }
10
- import FlowNode from "../flowNode.js";
11
+ import Transform from "./transform.js";
11
12
  //# sourceMappingURL=flattenSequence.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"flattenSequence.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenSequence.js"],"names":[],"mappings":"AAGA;IAKI;;;OAGG;IACH,oBAFW,OAAO,yBAAyB,EAAE,qBAAqB,EAuBjE;IAfG,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAchB;CAER;qBAjCyC,gBAAgB"}
1
+ {"version":3,"file":"flattenSequence.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/flattenSequence.js"],"names":[],"mappings":"AAIA;IAKI;;;OAGG;IACH,oBAFW,OAAO,yBAAyB,EAAE,qBAAqB,EAyBjE;IApBG,gEAAoB;IAKpB,2BAA2B;IAC3B,gBADY,GAAG,EAAE,UAchB;CAER;sBAnCqB,gBAAgB"}