@genome-spy/core 0.42.2 → 0.43.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 (66) hide show
  1. package/dist/bundle/index.es.js +2068 -2037
  2. package/dist/bundle/index.js +68 -65
  3. package/dist/schema.json +251 -1
  4. package/dist/src/data/collector.d.ts.map +1 -1
  5. package/dist/src/data/collector.js +28 -2
  6. package/dist/src/data/sources/dataSourceFactory.d.ts +7 -7
  7. package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -1
  8. package/dist/src/data/sources/dataSourceFactory.js +9 -9
  9. package/dist/src/data/sources/{dynamic → lazy}/README.md +2 -2
  10. package/dist/src/data/sources/lazy/axisGenomeSource.d.ts.map +1 -0
  11. package/dist/src/data/sources/lazy/axisTickSource.d.ts.map +1 -0
  12. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -0
  13. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -0
  14. package/dist/src/data/sources/lazy/bigWigSource.d.ts.map +1 -0
  15. package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -0
  16. package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -0
  17. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -0
  18. package/dist/src/data/sources/{dynamic → lazy}/singleAxisLazySource.js +3 -3
  19. package/dist/src/data/sources/lazy/singleAxisWindowedSource.d.ts.map +1 -0
  20. package/dist/src/data/sources/lazy/tabixSource.d.ts.map +1 -0
  21. package/dist/src/data/transforms/regexFold.d.ts.map +1 -1
  22. package/dist/src/data/transforms/regexFold.js +6 -8
  23. package/dist/src/encoder/encoder.d.ts +1 -1
  24. package/dist/src/encoder/encoder.d.ts.map +1 -1
  25. package/dist/src/gl/arrayBuilder.d.ts +0 -1
  26. package/dist/src/gl/arrayBuilder.d.ts.map +1 -1
  27. package/dist/src/gl/arrayBuilder.js +46 -32
  28. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  29. package/dist/src/gl/dataToVertices.js +7 -3
  30. package/dist/src/marks/mark.d.ts.map +1 -1
  31. package/dist/src/marks/mark.js +6 -0
  32. package/dist/src/spec/channel.d.ts +14 -1
  33. package/dist/src/view/flowBuilder.d.ts.map +1 -1
  34. package/dist/src/view/flowBuilder.js +11 -4
  35. package/dist/src/view/unitView.d.ts +1 -1
  36. package/dist/src/view/unitView.d.ts.map +1 -1
  37. package/package.json +2 -2
  38. package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +0 -1
  39. package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +0 -1
  40. package/dist/src/data/sources/dynamic/bamSource.d.ts.map +0 -1
  41. package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +0 -1
  42. package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +0 -1
  43. package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +0 -1
  44. package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +0 -1
  45. package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +0 -1
  46. package/dist/src/data/sources/dynamic/singleAxisWindowedSource.d.ts.map +0 -1
  47. package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +0 -1
  48. /package/dist/src/data/sources/{dynamic → lazy}/axisGenomeSource.d.ts +0 -0
  49. /package/dist/src/data/sources/{dynamic → lazy}/axisGenomeSource.js +0 -0
  50. /package/dist/src/data/sources/{dynamic → lazy}/axisTickSource.d.ts +0 -0
  51. /package/dist/src/data/sources/{dynamic → lazy}/axisTickSource.js +0 -0
  52. /package/dist/src/data/sources/{dynamic → lazy}/bamSource.d.ts +0 -0
  53. /package/dist/src/data/sources/{dynamic → lazy}/bamSource.js +0 -0
  54. /package/dist/src/data/sources/{dynamic → lazy}/bigBedSource.d.ts +0 -0
  55. /package/dist/src/data/sources/{dynamic → lazy}/bigBedSource.js +0 -0
  56. /package/dist/src/data/sources/{dynamic → lazy}/bigWigSource.d.ts +0 -0
  57. /package/dist/src/data/sources/{dynamic → lazy}/bigWigSource.js +0 -0
  58. /package/dist/src/data/sources/{dynamic → lazy}/gff3Source.d.ts +0 -0
  59. /package/dist/src/data/sources/{dynamic → lazy}/gff3Source.js +0 -0
  60. /package/dist/src/data/sources/{dynamic → lazy}/indexedFastaSource.d.ts +0 -0
  61. /package/dist/src/data/sources/{dynamic → lazy}/indexedFastaSource.js +0 -0
  62. /package/dist/src/data/sources/{dynamic → lazy}/singleAxisLazySource.d.ts +0 -0
  63. /package/dist/src/data/sources/{dynamic → lazy}/singleAxisWindowedSource.d.ts +0 -0
  64. /package/dist/src/data/sources/{dynamic → lazy}/singleAxisWindowedSource.js +0 -0
  65. /package/dist/src/data/sources/{dynamic → lazy}/tabixSource.d.ts +0 -0
  66. /package/dist/src/data/sources/{dynamic → lazy}/tabixSource.js +0 -0
@@ -1,6 +1,12 @@
1
1
  import { isNumber } from "vega-util";
2
2
  import { ATTRIBUTE_PREFIX } from "./glslScaleGenerator.js";
3
3
 
4
+ /** Unrolling appears to give a 20% performance boost on Chrome but compiling the
5
+ * dynamically generated code takes time and is thus not great for small dynamic data.
6
+ * Unrolling probably allows the JS engine to inline pusher calls.
7
+ */
8
+ const UNROLL_LIMIT = 10000;
9
+
4
10
  /**
5
11
  * @typedef {Object} ConverterMetadata
6
12
  * A function that extracts a raw attribute from a datum (optionally) converts
@@ -135,37 +141,22 @@ export default class ArrayBuilder {
135
141
  return updater;
136
142
  }
137
143
 
138
- _unrollPushAll() {
139
- let preps = "";
140
- let pushs = "";
141
-
142
- for (let i = 0; i < this.pushers.length; i++) {
143
- preps += `const p${i} = that.pushers[${i}];\n`;
144
- pushs += `p${i}();\n`;
145
- }
146
-
147
- // eslint-disable-next-line no-new-func
148
- const createUnrolled = new Function(
149
- "that",
150
- `${preps}
151
-
152
- return function unrolledPushAll() {
153
- ${pushs}
154
- that.vertexCount++;
155
- };
156
- `
157
- );
158
-
159
- this.pushAll = createUnrolled(this);
160
- }
161
-
162
144
  pushAll() {
163
- // Unrolling appears to give a 20% performance boost on Chrome but compiling the
164
- // dynamically generated code takes time and is thus not great for small dynamic data.
165
- // Unrolling probably allows the JS engine to inline pusher calls.
166
- const unroll = this.size > 100000;
167
- if (unroll) {
168
- this._unrollPushAll();
145
+ if (this.size > UNROLL_LIMIT) {
146
+ const preps = this.pushers
147
+ .map((_v, i) => `const p${i} = that.pushers[${i}];`)
148
+ .join("\n");
149
+ const pushs = this.pushers.map((_v, i) => ` p${i}();`).join("\n");
150
+
151
+ // eslint-disable-next-line no-new-func
152
+ this.pushAll = new Function(
153
+ "that",
154
+ `${preps}
155
+ return function unrolledPushAll() {
156
+ ${pushs}
157
+ that.vertexCount++;
158
+ };`
159
+ )(this);
169
160
  } else {
170
161
  this.pushAll = () => {
171
162
  for (let i = 0; i < this.pushers.length; i++) {
@@ -183,9 +174,32 @@ export default class ArrayBuilder {
183
174
  * @param {object} datum
184
175
  */
185
176
  updateFromDatum(datum) {
186
- for (let i = 0; i < this.dataUpdaters.length; i++) {
187
- this.dataUpdaters[i](datum);
177
+ if (this.size > UNROLL_LIMIT) {
178
+ const preps = this.dataUpdaters
179
+ .map((_v, i) => `const u${i} = that.dataUpdaters[${i}];`)
180
+ .join("\n");
181
+ const updates = this.dataUpdaters
182
+ .map((_v, i) => ` u${i}(datum);`)
183
+ .join("\n");
184
+
185
+ // eslint-disable-next-line no-new-func
186
+ this.updateFromDatum = new Function(
187
+ "that",
188
+ "datum",
189
+ `${preps}
190
+ return function unrolledUpdateFromDatum(datum) {
191
+ ${updates}
192
+ };`
193
+ )(this);
194
+ } else {
195
+ this.updateFromDatum = (datum) => {
196
+ for (let i = 0; i < this.dataUpdaters.length; i++) {
197
+ this.dataUpdaters[i](datum);
198
+ }
199
+ };
188
200
  }
201
+
202
+ this.updateFromDatum(datum);
189
203
  }
190
204
 
191
205
  /**
@@ -1 +1 @@
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"}
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;OAuEhB;IAnEG,gEAAwB;IAGxB;;MAKC;IAQD,0BAAoC;IAEpC,8BAAoD;IA6CpD,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,QA+DhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IA/DO;;;MAAyB;IAiEjC;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;;;;;;;;YAzkBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAhBzB,mBAAmB"}
@@ -54,8 +54,6 @@ export class GeometryBuilder {
54
54
  this.variableBuilder = new ArrayBuilder(numVertices);
55
55
 
56
56
  // Create converters and updaters for all variable channels.
57
- // TODO: If more than one channels use the same field with the same data type, convert the field only once.
58
-
59
57
  for (const [channel, ce] of Object.entries(this.variableEncoders)) {
60
58
  // Only add the first of the shared channels as all the rest are same
61
59
  // For example, if both x and x2 are using the same field, only x is
@@ -164,7 +162,13 @@ export class GeometryBuilder {
164
162
  this.xIndexer = undefined;
165
163
  };
166
164
 
167
- if (!data.length || hi - lo < 0) {
165
+ const channelDef = this.encoders.x?.channelDef;
166
+ if (
167
+ !("buildIndex" in channelDef) ||
168
+ !channelDef.buildIndex ||
169
+ !data.length ||
170
+ hi - lo < 0
171
+ ) {
168
172
  disable();
169
173
  return;
170
174
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mark.d.ts","sourceRoot":"","sources":["../../../src/marks/mark.js"],"names":[],"mappings":"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"}
@@ -258,6 +258,12 @@ export default class Mark {
258
258
  }
259
259
  }
260
260
 
261
+ if (encoding.x) {
262
+ // Building the x index is rarely necessary, but it's safer to build
263
+ // it by default.
264
+ encoding.x.buildIndex ??= true;
265
+ }
266
+
261
267
  return encoding;
262
268
  });
263
269
  }
@@ -314,13 +314,26 @@ export type ChannelDef<F extends Field = string> =
314
314
  // TODO: Does this make sense?
315
315
  export type ChannelDefWithScale = ScaleMixins & TypeMixins<Type>;
316
316
 
317
+ export interface XIndexDef {
318
+ /**
319
+ * Builds and index for efficient rendering of subsets of the data. This
320
+ * setting is useful when rendering large amounts of data and often
321
+ * only a small subset of the data is visible. An example of such a
322
+ * situation is a scatter plot spanning the whole genome.
323
+ *
324
+ * This setting implicitly sorts the data by the field assigned
325
+ * on the `x` channel.
326
+ */
327
+ buildIndex?: boolean;
328
+ }
329
+
317
330
  export interface Encoding<F extends Field = string> {
318
331
  /**
319
332
  * X coordinates of the marks.
320
333
  *
321
334
  * The `value` of this channel can be a number between zero and one.
322
335
  */
323
- x?: PositionDef<F>;
336
+ x?: PositionDef<F> & XIndexDef;
324
337
 
325
338
  /**
326
339
  * Y coordinates of the marks.
@@ -1 +1 @@
1
- {"version":3,"file":"flowBuilder.d.ts","sourceRoot":"","sources":["../../../src/view/flowBuilder.js"],"names":[],"mappings":"AAuBA;;;;GAIG;AACH,8JAkKC;AAED;;;;;;GAMG;AACH;;;IAgGc;;;OAGG;;EAYhB;AA0BD;;;;;;GAMG;AACH;;;0BAqB0B,QAAQ,SAAS,OAAO,qBAAqB,EAAE,KAAK,CAAC,CAAC;EAkB/E;qBAxXoB,qBAAqB;sBANpB,sBAAsB"}
1
+ {"version":3,"file":"flowBuilder.d.ts","sourceRoot":"","sources":["../../../src/view/flowBuilder.js"],"names":[],"mappings":"AAwBA;;;;GAIG;AACH,8JAkKC;AAED;;;;;;GAMG;AACH;;;IAgGc;;;OAGG;;EAYhB;AAgCD;;;;;;GAMG;AACH;;;0BAqB0B,QAAQ,SAAS,OAAO,qBAAqB,EAAE,KAAK,CAAC,CAAC;EAkB/E;qBA/XoB,qBAAqB;sBANpB,sBAAsB"}
@@ -13,6 +13,7 @@ import {
13
13
  isFieldDef,
14
14
  isPositionalChannel,
15
15
  getPrimaryChannel,
16
+ isExprDef,
16
17
  } from "../encoder/encoder.js";
17
18
  import LinearizeGenomicCoordinate from "../data/transforms/linearizeGenomicCoordinate.js";
18
19
  import { group } from "d3-array";
@@ -311,20 +312,26 @@ export function linearizeLocusAccess(view) {
311
312
  }
312
313
 
313
314
  /**
314
- * @param {import("./view.js").default} view
315
+ * @param {import("./unitView.js").default} view
315
316
  * @param {import("../spec/channel.js").Encoding} [encoding]
316
317
  * @returns {import("../spec/transform.js").CompareParams}
317
318
  */
318
319
  function getCompareParamsForView(view, encoding) {
319
- // TODO: Should sort by min(x, x2).
320
320
  const e = { ...view.getEncoding(), ...encoding }.x;
321
321
  if (isChannelDefWithScale(e)) {
322
322
  if (view.getScaleResolution("x")?.isZoomable()) {
323
323
  if (isFieldDef(e)) {
324
- return { field: e.field };
324
+ // TODO: Don't sort if the data is already sorted.
325
+ // The sort status should be tracked in the data flow.
326
+ // For instance, genomic data is typically already sorted
327
+ // by position within a chromosome (but not necessarily
328
+ // across chromosomes).
329
+ return "buildIndex" in e && e.buildIndex
330
+ ? { field: e.field }
331
+ : null;
325
332
  } else if (isDatumDef(e)) {
326
333
  // Nop
327
- } else {
334
+ } else if (isExprDef(e)) {
328
335
  // TODO: Support expr by inserting a Formula transform
329
336
  throw new Error(
330
337
  "A zoomable x channel must be mapped to a field."
@@ -54,7 +54,7 @@ export default class UnitView extends ContainerView {
54
54
  /**
55
55
  * @param {Channel} channel A primary channel
56
56
  */
57
- _validateDomainQuery(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>;
57
+ _validateDomainQuery(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").ChromPosDefBase & import("../spec/channel.js").TitleMixins & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").TypeMixins<"locus"> & import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").XIndexDef) | (import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").DatumDefBase & import("../spec/channel.js").TitleMixins & import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type> & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").XIndexDef) | 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").FieldDefBase<string> & import("../spec/channel.js").TitleMixins & import("../spec/channel.js").TypeMixins<import("../spec/channel.js").Type> & import("../spec/channel.js").ScaleMixins & import("../spec/channel.js").PositionMixins & import("../spec/channel.js").XIndexDef) | import("../spec/channel.js").MarkPropFieldDef<string, import("../spec/channel.js").TypeForShape>;
58
58
  /**
59
59
  * Returns the domain of the specified channel of this domain/mark.
60
60
  *
@@ -1 +1 @@
1
- {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH;QAHkB,MAAM,GAAE,cAAc,kBAAkB,EAAE,OAAO;EASjE;AAEF;IACI;;;;;;;OAOG;IACH;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAkBzC;IAbG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAUlC;;;;OAIG;IACH,gBAJW,OAAO,4CAA4C,EAAE,OAAO,UAC5D,OAAO,uBAAuB,EAAE,OAAO,YACvC,OAAO,uBAAuB,EAAE,gBAAgB,QAY1D;IAED,kDAIC;IAED;;;;;OAKG;IACH,iEAyEC;IAED;;;OAGG;IACH,mGASC;IAkBD;;OAEG;IACH,uDAEC;IAED;;OAEG;IACH,opBAcC;IAED;;;;;OAKG;IACH,6BAHW,OAAO,oBAAoB,EAAE,gBAAgB,iDAkBvD;IAED;;;;;;;;;;;;OAYG;IACH,gHA2CC;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;CACJ;0BAnVyB,oBAAoB"}
1
+ {"version":3,"file":"unitView.d.ts","sourceRoot":"","sources":["../../../src/view/unitView.js"],"names":[],"mappings":"AAqBA;;;;GAIG;AACH;QAHkB,MAAM,GAAE,cAAc,kBAAkB,EAAE,OAAO;EASjE;AAEF;IACI;;;;;;;OAOG;IACH;;;;;;;;OAQG;IACH,kBAPW,OAAO,iBAAiB,EAAE,QAAQ,WAClC,OAAO,yBAAyB,EAAE,OAAO,gBACzC,OAAO,oBAAoB,EAAE,OAAO,cACpC,OAAO,WAAW,EAAE,OAAO,QAC3B,MAAM,YACN,OAAO,WAAW,EAAE,WAAW,EAkBzC;IAbG,yCAAgB;IAIZ,iDAAiD;IACjD,MADW,OAAO,kBAAkB,EAAE,OAAO,CACnB;IAUlC;;;;OAIG;IACH,gBAJW,OAAO,4CAA4C,EAAE,OAAO,UAC5D,OAAO,uBAAuB,EAAE,OAAO,YACvC,OAAO,uBAAuB,EAAE,gBAAgB,QAY1D;IAED,kDAIC;IAED;;;;;OAKG;IACH,iEAyEC;IAED;;;OAGG;IACH,mGASC;IAkBD;;OAEG;IACH,uDAEC;IAED;;OAEG;IACH,6/CAcC;IAED;;;;;OAKG;IACH,6BAHW,OAAO,oBAAoB,EAAE,gBAAgB,iDAkBvD;IAED;;;;;;;;;;;;OAYG;IACH,gHA2CC;IAED,uBAQC;IAgBD;;;;OAIG;IACH,8BAJW,MAAM,+DAEJ,OAAO,iBAAiB,EAAE,kBAAkB,CAKxD;CACJ;0BAnVyB,oBAAoB"}
package/package.json CHANGED
@@ -7,7 +7,7 @@
7
7
  },
8
8
  "contributors": [],
9
9
  "license": "MIT",
10
- "version": "0.42.2",
10
+ "version": "0.43.0",
11
11
  "jsdelivr": "dist/bundle/index.js",
12
12
  "unpkg": "dist/bundle/index.js",
13
13
  "browser": "dist/bundle/index.js",
@@ -65,5 +65,5 @@
65
65
  "vega-scale": "^7.1.1",
66
66
  "vega-util": "^1.16.0"
67
67
  },
68
- "gitHead": "dfeb11779563fcc77e9e82f6f536c6512136b550"
68
+ "gitHead": "5df2d5459b3ece0218135411e6e7d8d20639f587"
69
69
  }
@@ -1 +0,0 @@
1
- {"version":3,"file":"axisGenomeSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/axisGenomeSource.js"],"names":[],"mappings":"AAEA;;;GAGG;AACH;IACI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,cAAc,QAC9C,OAAO,uBAAuB,EAAE,OAAO,EAIjD;CAKJ;iCAlBgC,2BAA2B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"axisTickSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/axisTickSource.js"],"names":[],"mappings":"AAYA;;GAEG;AACH;IAMI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,aAAa,QAC7C,OAAO,uBAAuB,EAAE,OAAO,EAYjD;IAnBD;;OAEG;IACH,OAFU,OAAO,0BAA0B,EAAE,MAAM,EAAE,CAE1C;IAeP,sDAAoB;IAGxB,iCAkCC;CACJ;iCA9DgC,2BAA2B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bamSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/bamSource.js"],"names":[],"mappings":"AAGA;IAeI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,OAAO,QACvC,OAAO,uBAAuB,EAAE,OAAO,EAmDjD;IAhED;;;;;;;;OAQG;IACH,sBAFgB,MAAM,KAAK,MAAM,CAEH;IAkB1B,gDAAgC;IAQhC,iCA4BE;;CAmCT;qCAxGoC,+BAA+B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bigBedSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/bigBedSource.js"],"names":[],"mappings":"AAGA;IAOI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,UAAU,QAC1C,OAAO,uBAAuB,EAAE,OAAO,EA4CjD;IApDD,0CAA0C;IAC1C,QADW,OAAO,WAAW,EAAE,OAAO,CAC/B;IAEP,yCAAyC;IACzC,KADW,OAAO,WAAW,EAAE,MAAM,CACjC;IAkBA,mDAAgC;IAQhC,iCAqBE;CA4BT;qCAlFoC,+BAA+B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"bigWigSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/bigWigSource.js"],"names":[],"mappings":"AAGA;;GAEG;AACH;IAOI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,UAAU,QAC1C,OAAO,uBAAuB,EAAE,OAAO,EAiDjD;IAnCG,mDAAgC;IAQhC,iCA0BE;IA+BN;;;OAGG;IAEH,uBAJW,MAAM,EAAE,kBACR,MAAM,iBA0BhB;;CACJ;qCA1HoC,+BAA+B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"gff3Source.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/gff3Source.js"],"names":[],"mappings":"AAEA;;GAEG;AACH;IAII;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,SAAS,QACzC,OAAO,uBAAuB,EAAE,OAAO,EASjD;IAED;;OAEG;IACH,sBAFW,MAAM,EAAE,OAUlB;;CACJ;wBAlCuB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"indexedFastaSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/indexedFastaSource.js"],"names":[],"mappings":"AAGA;IACI;;;OAGG;IACH,oBAHW,OAAO,uBAAuB,EAAE,gBAAgB,QAChD,OAAO,uBAAuB,EAAE,OAAO,EA+CjD;IAjCG,yDAAgC;IAQhC,iCAwBE;IATM,iDAKE;CA6BjB;qCA5EoC,+BAA+B"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleAxisLazySource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/singleAxisLazySource.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IAOI;;;OAGG;IACH,kBAHW,OAAO,uBAAuB,EAAE,OAAO,WACvC,OAAO,0BAA0B,EAAE,wBAAwB,EAiDrE;IAzDD;;;OAGG;IACH,4CAAuC;IASnC,8CAAgB;IAYhB,2EAA2E;IAC3E,SADW,OAAO,0BAA0B,EAAE,wBAAwB,CAChD;IAEtB,oEAA4D;IA+BhE;;;OAGG;IACH,wBAWC;IAED;;;;OAIG;IACH,oEAEC;IAED;;;;;;OAMG;IACH,wBAJW,MAAM,EAAE,iBACR,OAAO,yBAAyB,EAAE,gBAAgB,EAAE,iBAK9D;IAED;;;;;OAKG;IACH,mCAHW,OAAO,QAKjB;IAED;;;;;OAKG;IACH,gCAGC;IAQD;;;;;OAKG;IACH,8BAHW,OAAO,mBAAmB,EAAE,KAAK,EAAE,EAAE,QAkB/C;CACJ;uBAxJsB,kBAAkB"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"singleAxisWindowedSource.d.ts","sourceRoot":"","sources":["../../../../../src/data/sources/dynamic/singleAxisWindowedSource.js"],"names":[],"mappings":"AAIA;;GAEG;AACH;IAQI;;;OAGG;IACH,kBAHU;QAAC,UAAU,CAAC,EAAE,MAAM,CAAA;KAAC,CAGxB;IAEP;;;OAGG;IACH,0CAHW,OAAO,uBAAuB,EAAE,aAAa,QAmBvD;IAED;;;;OAIG;IACH,wBAFW,MAAM,EAAE,iBAiBlB;IAED;;;;;OAKG;IACH,iCAHW,MAAM,EAAE,iBAKlB;IAED;;;;;;;;;OASG;IACH,yCANW,MAAM,EAAE,4BACU,OAAO,mCAAmC,EAAE,0BAA0B,UAAU,WAAW,+BAqCvH;IAED;;;;;;;;OAQG;IACH,qCAJW,MAAM,EAAE,cACR,MAAM,YAWhB;IAED;;;;OAIG;IACH,+CAHW,MAAM,EAAE,WAUlB;;CACJ;iCAvJgC,2BAA2B"}
@@ -1 +0,0 @@
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"}