@genome-spy/core 0.41.0 → 0.42.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.
- package/dist/bundle/index--cKb-dKG.js +615 -0
- package/dist/bundle/{index-gn8bhQ8w.js → index-d7k3kkin.js} +365 -366
- package/dist/bundle/index.es.js +4225 -4040
- package/dist/bundle/index.js +122 -79
- package/dist/schema.json +58 -6
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +1 -1
- package/dist/src/data/sources/dynamic/axisTickSource.js +3 -3
- package/dist/src/data/sources/dynamic/bamSource.d.ts +3 -21
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/bamSource.js +38 -55
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +2 -38
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/bigBedSource.js +14 -71
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +4 -42
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/bigWigSource.js +23 -60
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/gff3Source.js +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +2 -20
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +23 -41
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +23 -4
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +29 -4
- package/dist/src/data/sources/dynamic/singleAxisWindowedSource.d.ts +60 -0
- package/dist/src/data/sources/dynamic/singleAxisWindowedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisWindowedSource.js +152 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +6 -40
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -1
- package/dist/src/data/sources/dynamic/tabixSource.js +29 -78
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
- package/dist/src/data/transforms/regexFold.js +8 -0
- package/dist/src/data/transforms/regexFold.test.js +28 -0
- package/dist/src/encoder/encoder.d.ts +6 -1
- package/dist/src/encoder/encoder.d.ts.map +1 -1
- package/dist/src/encoder/encoder.js +10 -0
- package/dist/src/genomeSpy.d.ts +14 -0
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +114 -8
- package/dist/src/gl/arrayBuilder.js +1 -1
- package/dist/src/gl/colorUtils.d.ts.map +1 -0
- package/dist/src/{scale → gl}/colorUtils.js +1 -1
- package/dist/src/gl/dataToVertices.d.ts +1 -9
- package/dist/src/gl/dataToVertices.d.ts.map +1 -1
- package/dist/src/gl/dataToVertices.js +33 -73
- package/dist/src/{scale → gl}/glslScaleGenerator.d.ts +23 -1
- package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/{scale → gl}/glslScaleGenerator.js +59 -8
- package/dist/src/gl/webGLHelper.d.ts +6 -21
- package/dist/src/gl/webGLHelper.d.ts.map +1 -1
- package/dist/src/gl/webGLHelper.js +8 -39
- package/dist/src/img/90-ring-with-bg.svg +1 -0
- package/dist/src/img/README.md +5 -0
- package/dist/src/marks/link.d.ts +7 -0
- package/dist/src/marks/link.d.ts.map +1 -1
- package/dist/src/marks/link.js +74 -39
- package/dist/src/marks/mark.d.ts +2 -1
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +31 -2
- package/dist/src/marks/{pointMark.d.ts → point.d.ts} +1 -1
- package/dist/src/marks/point.d.ts.map +1 -0
- package/dist/src/marks/{pointMark.js → point.js} +3 -3
- package/dist/src/marks/{rectMark.d.ts → rect.d.ts} +1 -1
- package/dist/src/marks/rect.d.ts.map +1 -0
- package/dist/src/marks/{rectMark.js → rect.js} +2 -3
- package/dist/src/marks/rect.vertex.glsl.js +2 -0
- package/dist/src/marks/rule.js +3 -3
- package/dist/src/marks/text.d.ts.map +1 -1
- package/dist/src/marks/text.js +19 -20
- package/dist/src/spec/data.d.ts +28 -13
- package/dist/src/spec/mark.d.ts +0 -8
- package/dist/src/styles/genome-spy.css.d.ts +1 -1
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -1
- package/dist/src/styles/genome-spy.css.js +33 -4
- package/dist/src/styles/genome-spy.scss +40 -4
- package/dist/src/types/viewContext.d.ts +9 -0
- package/dist/src/utils/binnedIndex.d.ts +2 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -1
- package/dist/src/utils/binnedIndex.js +59 -10
- package/dist/src/utils/binnedIndex.test.js +46 -0
- package/dist/src/utils/indexer.d.ts.map +1 -1
- package/dist/src/utils/indexer.js +10 -1
- package/dist/src/utils/indexer.test.js +2 -0
- package/dist/src/view/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView.js +2 -0
- package/dist/src/view/layerView.d.ts.map +1 -1
- package/dist/src/view/layerView.js +2 -0
- package/dist/src/view/unitView.d.ts +1 -7
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +4 -11
- package/dist/src/view/view.d.ts +6 -0
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +11 -0
- package/dist/src/view/view.test.js +1 -1
- package/package.json +3 -3
- package/dist/bundle/index-Cbz74kpR.js +0 -638
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +0 -32
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +0 -1
- package/dist/src/data/sources/dynamic/windowedMixin.js +0 -53
- package/dist/src/gl/rect.vertex.glsl.js +0 -2
- package/dist/src/marks/pointMark.d.ts.map +0 -1
- package/dist/src/marks/rectMark.d.ts.map +0 -1
- package/dist/src/scale/colorUtils.d.ts.map +0 -1
- package/dist/src/scale/glslScaleGenerator.d.ts.map +0 -1
- /package/dist/src/{scale → gl}/colorUtils.d.ts +0 -0
- /package/dist/src/{gl → marks}/link.fragment.glsl.js +0 -0
- /package/dist/src/{gl → marks}/link.vertex.glsl.js +0 -0
- /package/dist/src/{gl → marks}/point.common.glsl.js +0 -0
- /package/dist/src/{gl → marks}/point.fragment.glsl.js +0 -0
- /package/dist/src/{gl → marks}/point.vertex.glsl.js +0 -0
- /package/dist/src/{gl → marks}/rect.fragment.glsl.js +0 -0
- /package/dist/src/{gl → marks}/rule.common.glsl.js +0 -0
- /package/dist/src/{gl → marks}/rule.fragment.glsl.js +0 -0
- /package/dist/src/{gl → marks}/rule.vertex.glsl.js +0 -0
- /package/dist/src/{gl → marks}/text.common.glsl.js +0 -0
- /package/dist/src/{gl → marks}/text.fragment.glsl.js +0 -0
- /package/dist/src/{gl → marks}/text.vertex.glsl.js +0 -0
|
@@ -1,57 +1,23 @@
|
|
|
1
|
-
declare const TabixSource_base: {
|
|
2
|
-
new (...args: any[]): {
|
|
3
|
-
[x: string]: any;
|
|
4
|
-
lastQuantizedInterval: number[]; /**
|
|
5
|
-
* @param {import("../../../spec/data.js").TabixData} params
|
|
6
|
-
* @param {import("../../../view/view.js").default} view
|
|
7
|
-
*/
|
|
8
|
-
quantizeInterval(interval: number[], windowSize: number): number[];
|
|
9
|
-
checkAndUpdateLastInterval(interval: number[]): boolean;
|
|
10
|
-
};
|
|
11
|
-
} & typeof SingleAxisLazySource;
|
|
12
1
|
/**
|
|
13
2
|
* @template T
|
|
3
|
+
* @abstract
|
|
14
4
|
*/
|
|
15
|
-
export default class TabixSource<T> extends
|
|
5
|
+
export default class TabixSource<T> extends SingleAxisWindowedSource {
|
|
16
6
|
/**
|
|
17
7
|
* @param {import("../../../spec/data.js").TabixData} params
|
|
18
8
|
* @param {import("../../../view/view.js").default} view
|
|
19
9
|
*/
|
|
20
10
|
constructor(params: import("../../../spec/data.js").TabixData, view: import("../../../view/view.js").default);
|
|
21
|
-
/** Keep track of the order of the requests */
|
|
22
|
-
lastRequestId: number;
|
|
23
|
-
/** @type {import("@gmod/tabix").TabixIndexedFile} */
|
|
24
|
-
tbiIndex: import("@gmod/tabix").TabixIndexedFile;
|
|
25
11
|
params: import("../../../spec/data.js").TabixData;
|
|
26
|
-
/**
|
|
27
|
-
* Listen to the domain change event and update data when the covered windows change.
|
|
28
|
-
*
|
|
29
|
-
* @param {number[]} domain Linearized domain
|
|
30
|
-
*/
|
|
31
|
-
onDomainChanged(domain: number[]): Promise<void>;
|
|
32
12
|
initializedPromise: Promise<any>;
|
|
33
|
-
/**
|
|
34
|
-
* Listen to the domain change event and update data when the covered windows change.
|
|
35
|
-
*
|
|
36
|
-
* @param {number[]} interval linearized domain
|
|
37
|
-
*/
|
|
38
|
-
doRequest(interval: number[]): Promise<void>;
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
* @param {number[]} interval
|
|
42
|
-
*/
|
|
43
|
-
getFeatures(interval: number[]): Promise<{
|
|
44
|
-
requestId: number;
|
|
45
|
-
abort: () => void;
|
|
46
|
-
features: T[];
|
|
47
|
-
}>;
|
|
48
13
|
/**
|
|
49
14
|
* @abstract
|
|
15
|
+
* @protected
|
|
50
16
|
* @param {string[]} lines
|
|
51
17
|
* @returns {T[]}
|
|
52
18
|
*/
|
|
53
|
-
_parseFeatures(lines: string[]): T[];
|
|
19
|
+
protected _parseFeatures(lines: string[]): T[];
|
|
20
|
+
#private;
|
|
54
21
|
}
|
|
55
|
-
import
|
|
56
|
-
export {};
|
|
22
|
+
import SingleAxisWindowedSource from "./singleAxisWindowedSource.js";
|
|
57
23
|
//# sourceMappingURL=tabixSource.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tabixSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/tabixSource.js"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"tabixSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/tabixSource.js"],"names":[],"mappings":"AAGA;;;GAGG;AACH;IAII;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,SAAS,QACzC,OAAO,uBAAuB,EAAE,OAAO,EA8CjD;IAhCG,kDAAgC;IAQhC,iCAuBE;IAoCN;;;;;OAKG;IACH,gCAHW,MAAM,EAAE,GACN,CAAC,EAAE,CAKf;;CACJ;qCAvGoC,+BAA+B"}
|
|
@@ -1,17 +1,13 @@
|
|
|
1
|
-
import SingleAxisLazySource from "./singleAxisLazySource.js";
|
|
2
|
-
import windowedMixin from "./windowedMixin.js";
|
|
3
|
-
import { debounce } from "../../../utils/debounce.js";
|
|
4
1
|
import addBaseUrl from "../../../utils/addBaseUrl.js";
|
|
2
|
+
import SingleAxisWindowedSource from "./singleAxisWindowedSource.js";
|
|
5
3
|
|
|
6
4
|
/**
|
|
7
5
|
* @template T
|
|
6
|
+
* @abstract
|
|
8
7
|
*/
|
|
9
|
-
export default class TabixSource extends
|
|
10
|
-
/** Keep track of the order of the requests */
|
|
11
|
-
lastRequestId = 0;
|
|
12
|
-
|
|
8
|
+
export default class TabixSource extends SingleAxisWindowedSource {
|
|
13
9
|
/** @type {import("@gmod/tabix").TabixIndexedFile} */
|
|
14
|
-
tbiIndex;
|
|
10
|
+
#tbiIndex;
|
|
15
11
|
|
|
16
12
|
/**
|
|
17
13
|
* @param {import("../../../spec/data.js").TabixData} params
|
|
@@ -22,7 +18,8 @@ export default class TabixSource extends windowedMixin(SingleAxisLazySource) {
|
|
|
22
18
|
const paramsWithDefaults = {
|
|
23
19
|
channel: "x",
|
|
24
20
|
windowSize: 3_000_000,
|
|
25
|
-
|
|
21
|
+
debounce: 200,
|
|
22
|
+
debounceMode: "domain",
|
|
26
23
|
...params,
|
|
27
24
|
};
|
|
28
25
|
|
|
@@ -34,13 +31,7 @@ export default class TabixSource extends windowedMixin(SingleAxisLazySource) {
|
|
|
34
31
|
throw new Error("No URL provided for TabixSource");
|
|
35
32
|
}
|
|
36
33
|
|
|
37
|
-
|
|
38
|
-
this.onDomainChanged = debounce(
|
|
39
|
-
this.onDomainChanged.bind(this),
|
|
40
|
-
this.params.debounceDomainChange,
|
|
41
|
-
false
|
|
42
|
-
);
|
|
43
|
-
}
|
|
34
|
+
this.setupDebouncing(this.params);
|
|
44
35
|
|
|
45
36
|
this.initializedPromise = new Promise((resolve) => {
|
|
46
37
|
Promise.all([
|
|
@@ -56,7 +47,7 @@ export default class TabixSource extends windowedMixin(SingleAxisLazySource) {
|
|
|
56
47
|
const withBase = (/** @type {string} */ uri) =>
|
|
57
48
|
new RemoteFile(addBaseUrl(uri, this.view.getBaseUrl()));
|
|
58
49
|
|
|
59
|
-
this
|
|
50
|
+
this.#tbiIndex = new TabixIndexedFile({
|
|
60
51
|
filehandle: withBase(this.params.url),
|
|
61
52
|
tbiFilehandle: withBase(
|
|
62
53
|
this.params.indexUrl ?? this.params.url + ".tbi"
|
|
@@ -68,87 +59,47 @@ export default class TabixSource extends windowedMixin(SingleAxisLazySource) {
|
|
|
68
59
|
});
|
|
69
60
|
}
|
|
70
61
|
|
|
71
|
-
/**
|
|
72
|
-
* Listen to the domain change event and update data when the covered windows change.
|
|
73
|
-
*
|
|
74
|
-
* @param {number[]} domain Linearized domain
|
|
75
|
-
*/
|
|
76
|
-
async onDomainChanged(domain) {
|
|
77
|
-
const windowSize = this.params.windowSize;
|
|
78
|
-
|
|
79
|
-
if (domain[1] - domain[0] > windowSize) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const quantizedInterval = this.quantizeInterval(domain, windowSize);
|
|
84
|
-
|
|
85
|
-
if (this.checkAndUpdateLastInterval(quantizedInterval)) {
|
|
86
|
-
this.doRequest(quantizedInterval);
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
62
|
/**
|
|
91
63
|
* Listen to the domain change event and update data when the covered windows change.
|
|
92
64
|
*
|
|
93
65
|
* @param {number[]} interval linearized domain
|
|
94
66
|
*/
|
|
95
|
-
async
|
|
96
|
-
const
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
if (featureResponse.requestId < this.lastRequestId) {
|
|
100
|
-
return;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
this.publishData(featureResponse.features);
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
/**
|
|
107
|
-
*
|
|
108
|
-
* @param {number[]} interval
|
|
109
|
-
*/
|
|
110
|
-
async getFeatures(interval) {
|
|
111
|
-
await this.initializedPromise;
|
|
112
|
-
|
|
113
|
-
let requestId = ++this.lastRequestId;
|
|
114
|
-
|
|
115
|
-
// TODO: Abort previous requests
|
|
116
|
-
const abortController = new AbortController();
|
|
117
|
-
|
|
118
|
-
const discreteChromosomeIntervals =
|
|
119
|
-
this.genome.continuousToDiscreteChromosomeIntervals(interval);
|
|
120
|
-
|
|
121
|
-
// TODO: Error handling
|
|
122
|
-
const featuresWithChrom = await Promise.all(
|
|
123
|
-
discreteChromosomeIntervals.map(async (d) => {
|
|
67
|
+
async loadInterval(interval) {
|
|
68
|
+
const featureChunks = await this.discretizeAndLoad(
|
|
69
|
+
interval,
|
|
70
|
+
async (discreteInterval, signal) => {
|
|
124
71
|
/** @type {string[]} */
|
|
125
72
|
const lines = [];
|
|
126
73
|
|
|
127
|
-
await this
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
74
|
+
await this.#tbiIndex.getLines(
|
|
75
|
+
discreteInterval.chrom,
|
|
76
|
+
discreteInterval.startPos,
|
|
77
|
+
discreteInterval.endPos,
|
|
78
|
+
{
|
|
79
|
+
lineCallback: (line) => {
|
|
80
|
+
lines.push(line);
|
|
81
|
+
},
|
|
82
|
+
signal,
|
|
83
|
+
}
|
|
84
|
+
);
|
|
133
85
|
|
|
134
|
-
// Hmm. It's silly that we have to first collect individual lines and then join them.
|
|
135
86
|
return this._parseFeatures(lines);
|
|
136
|
-
}
|
|
87
|
+
}
|
|
137
88
|
);
|
|
138
89
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
features: featuresWithChrom.flat(), // TODO: Use batches, not flat
|
|
143
|
-
};
|
|
90
|
+
if (featureChunks) {
|
|
91
|
+
this.publishData(featureChunks);
|
|
92
|
+
}
|
|
144
93
|
}
|
|
145
94
|
|
|
146
95
|
/**
|
|
147
96
|
* @abstract
|
|
97
|
+
* @protected
|
|
148
98
|
* @param {string[]} lines
|
|
149
99
|
* @returns {T[]}
|
|
150
100
|
*/
|
|
151
101
|
_parseFeatures(lines) {
|
|
102
|
+
// Override me
|
|
152
103
|
return [];
|
|
153
104
|
}
|
|
154
105
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"regexFold.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/regexFold.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,eAAe,
|
|
1
|
+
{"version":3,"file":"regexFold.d.ts","sourceRoot":"","sources":["../../../../src/data/transforms/regexFold.js"],"names":[],"mappings":"AAGA;;;;GAIG;AACH;IAKI;;OAEG;IACH,oBAFW,OAAO,yBAAyB,EAAE,eAAe,EAmI3D;IAfO,gBALO,GAAG,UAKe;CAgBpC;qBAjJsD,gBAAgB"}
|
|
@@ -48,6 +48,14 @@ export default class RegexFoldTransform extends FlowNode {
|
|
|
48
48
|
const detectColumns = (datum) => {
|
|
49
49
|
const colNames = /** @type {string[]} */ (Object.keys(datum));
|
|
50
50
|
|
|
51
|
+
for (const re of columnRegex) {
|
|
52
|
+
if (!colNames.some((colName) => re.test(colName))) {
|
|
53
|
+
throw new Error(
|
|
54
|
+
`No columns matching the regex ${re.toString()} found in the data!`
|
|
55
|
+
);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
|
|
51
59
|
/** @type {Map<string, string[]>} */
|
|
52
60
|
const sampleColMap = new Map();
|
|
53
61
|
|
|
@@ -157,4 +157,32 @@ describe("RegexFold", () => {
|
|
|
157
157
|
},
|
|
158
158
|
]);
|
|
159
159
|
});
|
|
160
|
+
|
|
161
|
+
test("Throws error if no columns match the regex", () => {
|
|
162
|
+
const sampleData = [
|
|
163
|
+
{
|
|
164
|
+
row: 1,
|
|
165
|
+
sample1_a: "r1s1a",
|
|
166
|
+
sample2_a: "r1s2a",
|
|
167
|
+
},
|
|
168
|
+
{
|
|
169
|
+
row: 2,
|
|
170
|
+
sample1_a: "r2s1a",
|
|
171
|
+
sample2_a: "r2s2a",
|
|
172
|
+
},
|
|
173
|
+
];
|
|
174
|
+
|
|
175
|
+
/** @type { import("../../spec/transform.js").RegexFoldParams } */
|
|
176
|
+
const singleGatherConfig = {
|
|
177
|
+
type: "regexFold",
|
|
178
|
+
columnRegex: "^(.*)_c$",
|
|
179
|
+
asValue: "a",
|
|
180
|
+
};
|
|
181
|
+
|
|
182
|
+
expect(() =>
|
|
183
|
+
processData(new RegexFoldTransform(singleGatherConfig), sampleData)
|
|
184
|
+
).toThrowError(
|
|
185
|
+
"No columns matching the regex /^(.*)_c$/ found in the data!"
|
|
186
|
+
);
|
|
187
|
+
});
|
|
160
188
|
});
|
|
@@ -45,7 +45,12 @@ export function isChannelDefWithScale(channelDef: import("../spec/channel.js").C
|
|
|
45
45
|
* @param {import("../view/unitView.js").default} view
|
|
46
46
|
* @param {import("../spec/channel.js").Channel} channel
|
|
47
47
|
*/
|
|
48
|
-
export function getChannelDefWithScale(view: import("../view/unitView.js").default, channel: import("../spec/channel.js").Channel): import("../spec/channel.js").
|
|
48
|
+
export function getChannelDefWithScale(view: import("../view/unitView.js").default, channel: import("../spec/channel.js").Channel): import("../spec/channel.js").MarkPropExprDef<import("../spec/channel.js").Type> | import("../spec/channel.js").MarkPropDatumDef<import("../spec/channel.js").Type> | import("../spec/channel.js").ChromPosDef | import("../spec/channel.js").PositionDatumDef | import("../spec/channel.js").MarkPropDatumDef<import("../spec/channel.js").TypeForShape> | import("../spec/channel.js").MarkPropFieldDef<string, import("../spec/channel.js").Type> | import("../spec/channel.js").PositionFieldDef<string> | import("../spec/channel.js").MarkPropFieldDef<string, import("../spec/channel.js").TypeForShape>;
|
|
49
|
+
/**
|
|
50
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
51
|
+
* @returns {channelDef is import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type>}
|
|
52
|
+
*/
|
|
53
|
+
export function isChannelDefWithType(channelDef: import("../spec/channel.js").ChannelDef): channelDef is import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type>;
|
|
49
54
|
/**
|
|
50
55
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
51
56
|
* @returns {channelDef is import("../spec/channel.js").ChromPosDef}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.js"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,6CAJW,OAAO,kBAAkB,EAAE,OAAO,aAClC,OAAO,oBAAoB,EAAE,QAAQ,gGAsC/C;AAED;;;;;;;GAOG;AACH,0CANW,OAAO,oBAAoB,EAAE,UAAU,SACvC,GAAG,
|
|
1
|
+
{"version":3,"file":"encoder.d.ts","sourceRoot":"","sources":["../../../src/encoder/encoder.js"],"names":[],"mappings":"AAIA;;;;;;;;;;GAUG;AACH,6CAJW,OAAO,kBAAkB,EAAE,OAAO,aAClC,OAAO,oBAAoB,EAAE,QAAQ,gGAsC/C;AAED;;;;;;;GAOG;AACH,0CANW,OAAO,oBAAoB,EAAE,UAAU,SACvC,GAAG,0IA2Fb;AAED;;;;;GAKG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,4FAKjD;AAED;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,mEAKjD;AAED;;;GAGG;AACH,uCAHW,OAAO,oBAAoB,EAAE,UAAU,uDAKjD;AAED;;;GAGG;AACH,kDAHW,OAAO,oBAAoB,EAAE,UAAU,kEAWjD;AAED;;;GAGG;AACH,6CAHW,OAAO,qBAAqB,EAAE,OAAO,WACrC,OAAO,oBAAoB,EAAE,OAAO,klBAS9C;AAED;;;GAGG;AACH,iDAHW,OAAO,oBAAoB,EAAE,UAAU,4FAKjD;AAED;;;GAGG;AACH,0CAHW,OAAO,oBAAoB,EAAE,UAAU,0DAKjD;AAED;;;GAGG;AACH,sCAHW,OAAO,oBAAoB,EAAE,UAAU,sDAKjD;AAoBD;;;GAGG;AACH,oDAHW,OAAO,oBAAoB,EAAE,OAAO,oEAM9C;AAED;;;GAGG;AACH,6CAHW,OAAO,oBAAoB,EAAE,OAAO,6DAM9C;AAqBD;;;GAGG;AACH,4CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,oDAFW,OAAO,oBAAoB,EAAE,OAAO,2DAS9C;AAED;;;;;GAKG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,wCAI9C;AAED;;;;GAIG;AACH,kDAFW,OAAO,oBAAoB,EAAE,OAAO,0CAM9C;AAED;;GAEG;AACH,wCAFW,OAAO,oBAAoB,EAAE,OAAO,WAI9C;AAED;;;;GAIG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,WAI9C;AAED;;;GAGG;AACH,4CAHW,OAAO,oBAAoB,EAAE,OAAO,4DAuB9C;AAED;;;;;GAKG;AACH,0CAHW,OAAO,oBAAoB,EAAE,OAAO,GAClC,GAAG,EAAE,CAsBjB;AAED;;;GAGG;AACH,gDAHW,OAAO,oBAAoB,EAAE,OAAO,UACzB,GAAG,KAAE,MAAM,CAmBhC;AA7LD;;GAEG;AACH,wCAFU,OAAO,oBAAoB,EAAE,wBAAwB,EAAE,CAEb;AAEpD;;GAEG;AACH,0CAFU,OAAO,oBAAoB,EAAE,0BAA0B,EAAE,CAEX;AAExD;;GAEG;AACH,iCAFU,OAAO,oBAAoB,EAAE,iBAAiB,EAAE,CAKxD;AAoBF;;;;GAIG;AACH,gCAFU,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,oBAAoB,EAAE,0BAA0B,CAAC,CAAC,CAKtH;AAEF;;;;GAIG;AACH,8BAFU,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,oBAAoB,EAAE,OAAO,CAAC,CAAC,CAInG"}
|
|
@@ -101,6 +101,8 @@ export function createEncoder(channelDef, scale, accessor, channel) {
|
|
|
101
101
|
if (isDiscrete(scale.type)) {
|
|
102
102
|
// TODO: pass the found values back to the scale/resolution
|
|
103
103
|
const indexer = createIndexer();
|
|
104
|
+
// Warning: There's a chance that the domain and indexer get out of sync.
|
|
105
|
+
// TODO: Make this more robust
|
|
104
106
|
indexer.addAll(scale.domain());
|
|
105
107
|
encoder.indexer = indexer;
|
|
106
108
|
}
|
|
@@ -197,6 +199,14 @@ export function getChannelDefWithScale(view, channel) {
|
|
|
197
199
|
}
|
|
198
200
|
}
|
|
199
201
|
|
|
202
|
+
/**
|
|
203
|
+
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
204
|
+
* @returns {channelDef is import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type>}
|
|
205
|
+
*/
|
|
206
|
+
export function isChannelDefWithType(channelDef) {
|
|
207
|
+
return channelDef && "type" in channelDef;
|
|
208
|
+
}
|
|
209
|
+
|
|
200
210
|
/**
|
|
201
211
|
* @param {import("../spec/channel.js").ChannelDef} channelDef
|
|
202
212
|
* @returns {channelDef is import("../spec/channel.js").ChromPosDef}
|
package/dist/src/genomeSpy.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export default class GenomeSpy {
|
|
|
13
13
|
*/
|
|
14
14
|
constructor(container: HTMLElement, spec: import("./spec/root.js").RootSpec, options?: import("./types/embedApi.js").EmbedOptions);
|
|
15
15
|
container: HTMLElement;
|
|
16
|
+
/** @type {(() => void)[]} */
|
|
17
|
+
_destructionCallbacks: (() => void)[];
|
|
16
18
|
/** Root level configuration object */
|
|
17
19
|
spec: import("./spec/root.js").RootSpec;
|
|
18
20
|
accessorFactory: AccessorFactory;
|
|
@@ -68,6 +70,12 @@ export default class GenomeSpy {
|
|
|
68
70
|
/** @type {View} */
|
|
69
71
|
viewRoot: import("./view/view.js").default;
|
|
70
72
|
_paramBroker: ParamBroker;
|
|
73
|
+
/**
|
|
74
|
+
* Views that are currently loading data using lazy sources.
|
|
75
|
+
*
|
|
76
|
+
* @type {Map<View, boolean>}
|
|
77
|
+
*/
|
|
78
|
+
_loadingViews: Map<import("./view/view.js").default, boolean>;
|
|
71
79
|
/**
|
|
72
80
|
*
|
|
73
81
|
* @param {(name: string) => any[]} provider
|
|
@@ -90,9 +98,15 @@ export default class GenomeSpy {
|
|
|
90
98
|
* @param {any} [payload]
|
|
91
99
|
*/
|
|
92
100
|
broadcast(type: BroadcastEventType, payload?: any): void;
|
|
101
|
+
/**
|
|
102
|
+
* Draw some layers on top of the canvas. It's easier to do fancy spinning
|
|
103
|
+
* animations with html elements than with WebGL.
|
|
104
|
+
*/
|
|
105
|
+
_updateLoadingIndicators(): void;
|
|
93
106
|
_prepareContainer(): void;
|
|
94
107
|
_glHelper: WebGLHelper;
|
|
95
108
|
loadingMessageElement: HTMLDivElement;
|
|
109
|
+
loadingIndicatorsElement: HTMLDivElement;
|
|
96
110
|
tooltip: Tooltip;
|
|
97
111
|
/**
|
|
98
112
|
* Unregisters all listeners, removes all created dom elements, removes all css classes from the container
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"genomeSpy.d.ts","sourceRoot":"","sources":["../../src/genomeSpy.js"],"names":[],"mappings":"AA6CA;IACI;;;;;OAKG;IAEH;;;;;OAKG;IACH,uBAJW,WAAW,qDAEX,OAAO,qBAAqB,EAAE,YAAY,EAyFpD;IAtFG,uBAA0B;IAE1B,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAM/B,sCAAsC;IACtC,wCAAgB;IAEhB,iCAA4C;IAC5C,yBAAoC;IAEpC,4CAA4C;IAC5C,oBADW,QAAU,MAAM,KAAE,MAAM,EAAE,CAAC,EAAE,CACZ;IAE5B,mBAAoD;IAEpD,0BAA0B;IAC1B,aADW,WAAW,CACM;IAE5B;;;;;OAKG;IACH,qEAF0B,OAAO,CAE8B;IAE/D,2CAA2C;IAC3C,mBADW,4BAA4B,CACL;IAClC,2CAA2C;IAC3C,iBADW,4BAA4B,CACP;IAEhC,oDAAoD;IACpD,6BAAgC;IAEhC;;;OAGG;IACH,eAFU;QAAE,IAAI,EAAE,OAAO,iBAAiB,EAAE,OAAO,CAAC;QAAC,KAAK,EAAE,OAAO,oBAAoB,EAAE,KAAK,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAEpF;IAE9B,uBAA+C;IAE/C;;;OAGG;IACH,oBAFU,IAAI,MAAM,EAAE,QAAU,aAAa,KAAE,IAAI,CAAC,EAAE,CAAC,CAEpB;IAEnC;;;;;;OAMG;IACH,yCAFkC,GAAG,KAAK,IAAI,GAEd;IAEhC;;;OAGG;IACH,kDAFkC,GAAG,KAAK,IAAI,GAEL;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB,0BAAqC;IAErC;;;;OAIG;IACH,8DAA8B;IAGlC;;;OAGG;IACH,2CAFkB,MAAM,KAAK,GAAG,EAAE,QAIjC;IAED;;OAEG;IACH,+BAFW,MAAM,YAShB;IAED;;;;OAIG;IACH,sBAHW,MAAM,QACN,GAAG,EAAE,QAaf;IAED;;;;;OAKG;IACH,gBAHW,kBAAkB,YAClB,GAAG,QAQb;IAED;;;OAGG;IACH,iCAyCC;IAED,0BA0EC;IAtEG,uBAOC;IAyCD,sCAA0D;IAS1D,yCAA6D;IAI7D,iBAA0C;IAW9C;;OAEG;IACH,gBAmBC;IAED,sCA8MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA6IC;IAjIe,iCAAoC;IAmIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAiEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBAyCC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;CACJ;;;;iCA51BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAhC7C,uBAAuB;4BA0BP,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;wBAMvC,kBAAkB;wBApBlB,qBAAqB;oBAVzB,uBAAuB;qBAQtB,oBAAoB"}
|
package/dist/src/genomeSpy.js
CHANGED
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
import { formats as vegaFormats } from "vega-loader";
|
|
2
|
+
import { html, render } from "lit-html";
|
|
3
|
+
import { styleMap } from "lit/directives/style-map.js";
|
|
4
|
+
import SPINNER from "./img/90-ring-with-bg.svg";
|
|
2
5
|
|
|
3
6
|
import css from "./styles/genome-spy.css.js";
|
|
4
7
|
import Tooltip from "./utils/ui/tooltip.js";
|
|
@@ -57,6 +60,9 @@ export default class GenomeSpy {
|
|
|
57
60
|
constructor(container, spec, options = {}) {
|
|
58
61
|
this.container = container;
|
|
59
62
|
|
|
63
|
+
/** @type {(() => void)[]} */
|
|
64
|
+
this._destructionCallbacks = [];
|
|
65
|
+
|
|
60
66
|
const styleElement = document.createElement("style");
|
|
61
67
|
styleElement.innerHTML = css;
|
|
62
68
|
container.appendChild(styleElement);
|
|
@@ -131,6 +137,13 @@ export default class GenomeSpy {
|
|
|
131
137
|
this.viewRoot = undefined;
|
|
132
138
|
|
|
133
139
|
this._paramBroker = new ParamBroker();
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Views that are currently loading data using lazy sources.
|
|
143
|
+
*
|
|
144
|
+
* @type {Map<View, boolean>}
|
|
145
|
+
*/
|
|
146
|
+
this._loadingViews = new Map();
|
|
134
147
|
}
|
|
135
148
|
|
|
136
149
|
/**
|
|
@@ -185,6 +198,53 @@ export default class GenomeSpy {
|
|
|
185
198
|
?.forEach((listener) => listener(message));
|
|
186
199
|
}
|
|
187
200
|
|
|
201
|
+
/**
|
|
202
|
+
* Draw some layers on top of the canvas. It's easier to do fancy spinning
|
|
203
|
+
* animations with html elements than with WebGL.
|
|
204
|
+
*/
|
|
205
|
+
_updateLoadingIndicators() {
|
|
206
|
+
/** @type {import("lit-html").TemplateResult[]} */
|
|
207
|
+
const indicators = [];
|
|
208
|
+
|
|
209
|
+
const isSomethingVisible = () =>
|
|
210
|
+
[...this._loadingViews.values()].some((v) => v);
|
|
211
|
+
|
|
212
|
+
for (const [view, status] of this._loadingViews) {
|
|
213
|
+
const c = view.coords;
|
|
214
|
+
if (c) {
|
|
215
|
+
const style = {
|
|
216
|
+
left: `${c.x}px`,
|
|
217
|
+
top: `${c.y}px`,
|
|
218
|
+
width: `${c.width}px`,
|
|
219
|
+
height: `${c.height}px`,
|
|
220
|
+
};
|
|
221
|
+
indicators.push(
|
|
222
|
+
html`<div style=${styleMap(style)}>
|
|
223
|
+
<div class=${status ? "loading" : ""}>
|
|
224
|
+
<img src="${SPINNER}" alt="" />
|
|
225
|
+
<span>Loading...</span>
|
|
226
|
+
</div>
|
|
227
|
+
</div>`
|
|
228
|
+
);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Do some hacks to stop css animations of the loading indicators.
|
|
233
|
+
// Otherwise they fire animation frames even when their opacity is zero.
|
|
234
|
+
if (isSomethingVisible()) {
|
|
235
|
+
this.loadingIndicatorsElement.style.display = "block";
|
|
236
|
+
} else {
|
|
237
|
+
// TODO: Clear previous timeout
|
|
238
|
+
setTimeout(() => {
|
|
239
|
+
if (!isSomethingVisible()) {
|
|
240
|
+
this.loadingIndicatorsElement.style.display = "none";
|
|
241
|
+
}
|
|
242
|
+
}, 3000);
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
render(indicators, this.loadingIndicatorsElement);
|
|
246
|
+
}
|
|
247
|
+
|
|
188
248
|
_prepareContainer() {
|
|
189
249
|
this.container.classList.add("genome-spy");
|
|
190
250
|
this.container.classList.add("loading");
|
|
@@ -198,11 +258,58 @@ export default class GenomeSpy {
|
|
|
198
258
|
this.spec.background
|
|
199
259
|
);
|
|
200
260
|
|
|
261
|
+
const resizeCallback = () => {
|
|
262
|
+
this._glHelper.invalidateSize();
|
|
263
|
+
dprSetter(window.devicePixelRatio);
|
|
264
|
+
this.computeLayout();
|
|
265
|
+
// Render immediately, without RAF
|
|
266
|
+
this.renderAll();
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
// TODO: Size should be observed only if the content is not absolutely sized
|
|
270
|
+
const resizeObserver = new ResizeObserver(resizeCallback);
|
|
271
|
+
resizeObserver.observe(this.container);
|
|
272
|
+
this._destructionCallbacks.push(() => resizeObserver.disconnect());
|
|
273
|
+
|
|
274
|
+
const dprSetter = this._paramBroker.allocateSetter("devicePixelRatio");
|
|
275
|
+
dprSetter(window.devicePixelRatio);
|
|
276
|
+
|
|
277
|
+
/** @type {() => void} */
|
|
278
|
+
let remove = null;
|
|
279
|
+
|
|
280
|
+
const updatePixelRatio = () => {
|
|
281
|
+
if (remove != null) {
|
|
282
|
+
remove();
|
|
283
|
+
resizeCallback();
|
|
284
|
+
}
|
|
285
|
+
const media = matchMedia(
|
|
286
|
+
`(resolution: ${window.devicePixelRatio}dppx)`
|
|
287
|
+
);
|
|
288
|
+
media.addEventListener("change", updatePixelRatio);
|
|
289
|
+
remove = () => {
|
|
290
|
+
media.removeEventListener("change", updatePixelRatio);
|
|
291
|
+
};
|
|
292
|
+
};
|
|
293
|
+
updatePixelRatio();
|
|
294
|
+
|
|
295
|
+
if (remove) {
|
|
296
|
+
this._destructionCallbacks.push(remove);
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
// The initial loading message that is shown until the first frame is rendered
|
|
201
300
|
this.loadingMessageElement = document.createElement("div");
|
|
202
301
|
this.loadingMessageElement.className = "loading-message";
|
|
203
302
|
this.loadingMessageElement.innerHTML = `<div class="message">Loading<span class="ellipsis">...</span></div>`;
|
|
204
303
|
this.container.appendChild(this.loadingMessageElement);
|
|
205
304
|
|
|
305
|
+
// A container for loading indicators (for lazy data sources.)
|
|
306
|
+
// These could alternatively be included in the view hierarchy,
|
|
307
|
+
// but it's easier this way – particularly if we want to show
|
|
308
|
+
// some fancy animated spinners.
|
|
309
|
+
this.loadingIndicatorsElement = document.createElement("div");
|
|
310
|
+
this.loadingIndicatorsElement.className = "loading-indicators";
|
|
311
|
+
this.container.appendChild(this.loadingIndicatorsElement);
|
|
312
|
+
|
|
206
313
|
this.tooltip = new Tooltip(this.container);
|
|
207
314
|
|
|
208
315
|
this.loadingMessageElement
|
|
@@ -229,6 +336,8 @@ export default class GenomeSpy {
|
|
|
229
336
|
}
|
|
230
337
|
}
|
|
231
338
|
|
|
339
|
+
this._destructionCallbacks.forEach((callback) => callback());
|
|
340
|
+
|
|
232
341
|
this._glHelper.finalize();
|
|
233
342
|
|
|
234
343
|
while (this.container.firstChild) {
|
|
@@ -267,6 +376,11 @@ export default class GenomeSpy {
|
|
|
267
376
|
getNamedDataFromProvider: this.getNamedDataFromProvider.bind(this),
|
|
268
377
|
getCurrentHover: () => this._currentHover,
|
|
269
378
|
|
|
379
|
+
setDataLoadingStatus: (view, status) => {
|
|
380
|
+
this._loadingViews.set(view, status);
|
|
381
|
+
this._updateLoadingIndicators();
|
|
382
|
+
},
|
|
383
|
+
|
|
270
384
|
addKeyboardListener: (type, listener) => {
|
|
271
385
|
// TODO: Listeners should be called only when the mouse pointer is inside the
|
|
272
386
|
// container or the app covers the full document.
|
|
@@ -454,14 +568,6 @@ export default class GenomeSpy {
|
|
|
454
568
|
this.computeLayout();
|
|
455
569
|
this.animator.requestRender();
|
|
456
570
|
|
|
457
|
-
// Register resize listener after the initial layout computation to prevent
|
|
458
|
-
// incomplete layouts from accidentally polluting any caches related to sizes.
|
|
459
|
-
this._glHelper.addEventListener("resize", () => {
|
|
460
|
-
this.computeLayout();
|
|
461
|
-
// Render immediately, without RAF
|
|
462
|
-
this.renderAll();
|
|
463
|
-
});
|
|
464
|
-
|
|
465
571
|
return true;
|
|
466
572
|
} catch (reason) {
|
|
467
573
|
const message = `${
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"colorUtils.d.ts","sourceRoot":"","sources":["../../../src/gl/colorUtils.js"],"names":[],"mappings":"AAOA;;;;;GAKG;AACH,kDALW,MAAM,GAAG,OAAO,kBAAkB,EAAE,YAAY,MAChD,sBAAsB,UACtB,MAAM,oBACN,YAAY,gBAqCtB;AAED;;;;;GAKG;AACH,uDALW,MAAM,EAAE,qBACR,OAAO,kBAAkB,EAAE,gBAAgB,GAAG,OAAO,kBAAkB,EAAE,sBAAsB,MAC/F,sBAAsB,oBACtB,YAAY,gBA6BtB;AAED;;;;;;;;GAQG;AACH,6CALW,MAAM,EAAE,MACR,sBAAsB,UACtB,MAAM,oBACN,YAAY,gBAqBtB;AAED;;;;;;;GAOG;AACH,mDALW,MAAM,EAAE,MACR,sBAAsB,UACtB,MAAM,oBACN,YAAY,gBActB"}
|
|
@@ -3,7 +3,7 @@ import { range } from "d3-array";
|
|
|
3
3
|
import { scheme as vegaScheme, interpolateColors } from "vega-scale";
|
|
4
4
|
import { isString, isArray, isFunction } from "vega-util";
|
|
5
5
|
import { peek } from "../utils/arrayUtils.js";
|
|
6
|
-
import { createOrUpdateTexture } from "
|
|
6
|
+
import { createOrUpdateTexture } from "./webGLHelper.js";
|
|
7
7
|
|
|
8
8
|
/**
|
|
9
9
|
* @param {string | import("../spec/scale.js").SchemeParams} schemeParams
|
|
@@ -82,21 +82,13 @@ export class RectVertexBuilder extends GeometryBuilder {
|
|
|
82
82
|
* @param {Object} object
|
|
83
83
|
* @param {Record<string, Encoder>} object.encoders
|
|
84
84
|
* @param {string[]} object.attributes
|
|
85
|
-
* @param {number} [object.tessellationThreshold]
|
|
86
|
-
* If the rect is wider than the threshold, tessellate it into pieces
|
|
87
|
-
* @param {number[]} [object.visibleRange]
|
|
88
85
|
* @param {number} [object.numItems] Number of data items
|
|
89
86
|
*/
|
|
90
|
-
constructor({ encoders, attributes,
|
|
87
|
+
constructor({ encoders, attributes, numItems }: {
|
|
91
88
|
encoders: Record<string, import("../types/encoder.js").Encoder>;
|
|
92
89
|
attributes: string[];
|
|
93
|
-
tessellationThreshold?: number;
|
|
94
|
-
visibleRange?: number[];
|
|
95
90
|
numItems?: number;
|
|
96
91
|
});
|
|
97
|
-
visibleRange: number[];
|
|
98
|
-
tessellationThreshold: number;
|
|
99
|
-
updateFrac: (arg0: number | number[]) => any;
|
|
100
92
|
}
|
|
101
93
|
export class RuleVertexBuilder extends GeometryBuilder {
|
|
102
94
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"AAeA;;;;;GAKG;AACH;IACI;;;OAGG;IAEH;;;;;;OAMG;IACH;;qBAJW,MAAM,EAAE;sBACR,MAAM;OAyEhB;IArEG,gEAAwB;IAGxB;;MAKC;IAQD,0BAAoC;IAEpC,8BAAoD;IA+CpD,mBAAmB;IAEnB,yFAAyF;IACzF,UADW,IAAI,GAAG,EAAE,UAAU,CAAC,CACkB;IAGrD;;;;OAIG;IACH,mBAFW,GAAG,QAcb;IAED;;OAEG;IACH,oBAFW,IAAI,GAAG,EAAE,MAAM,EAAE,CAAC,QAM5B;IAED;;;OAGG;IACH,cAHW,GAAG,QACH,MAAM,EAAE,kCAYlB;IAED;;;;OAIG;IACH,sBAJW,OAAO,qBAAqB,EAAE,IAAI,OAClC,MAAM,OACN,MAAM,QAyDhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IAzDO;;;MAAyB;IA2DjC;QAEQ,uGAAuG;gBAA5F,OAAO,MAAM,EAAE;YAAC,IAAI,EAAE,MAAM,EAAE,GAAG,YAAY,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC;QAEnG,8BAA8B;;QAE9B,8CAA8C;;;MAIrD;CACJ;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAQhB;CAkCJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;gCACR,MAAM;uBAEN,MAAM,EAAE;mBACR,MAAM;OAsBhB;IANG,uBAAgC;IAEhC,8BAA8D;IAE9D,6CAA+D;IAC/D,4CAA6D;CA2CpE;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAQhB;CACJ;AAED;IACI;;;;;OAKG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAQhB;CAYJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;qBACR,OAAO,2BAA2B,EAAE,aAAa;oBACjD,OAAO,MAAM,EAAE,GAAG,CAAC;wBACnB,MAAM;sBACN,OAAO;OA4CjB;IA7BG,4DAA2B;IAC3B,2DAA0B;IAE1B,gCAA4B;IAQ5B,qCAAqC;IACrC,sBADmB,GAAG,KAAK,MAAM,CAMf;IAElB,oDAGC;IACD,qDAGC;IAED,8CAAiE;CA8IxE;;;;;;;;YArkBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAhBzB,mBAAmB"}
|