@genome-spy/core 0.51.0 → 0.53.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 (78) hide show
  1. package/dist/bundle/{index-C8lYPtq_.js → index-B5cesONJ.js} +21 -21
  2. package/dist/bundle/index-BJLu48Hz.js +274 -0
  3. package/dist/bundle/{index-Sk-Wtwdn.js → index-BywMLhhd.js} +963 -989
  4. package/dist/bundle/{index-BwFvhduA.js → index-CSayoXbw.js} +7 -9
  5. package/dist/bundle/{index-CkI3Kd2P.js → index-DAJ8JQLE.js} +6 -5
  6. package/dist/bundle/{index-BtRKzKhM.js → index-_tI-fMQF.js} +414 -415
  7. package/dist/bundle/{index-CmBp-spD.js → index-e0oKgZbZ.js} +36 -36
  8. package/dist/bundle/{index-Z7JiNsFI.js → index-oqw_s02W.js} +10 -11
  9. package/dist/bundle/{index-mihmTLo-.js → index-uO0O4Uv-.js} +22 -22
  10. package/dist/bundle/index.es.js +4088 -4006
  11. package/dist/bundle/index.js +233 -112
  12. package/dist/bundle/{long-CYrAUkxh.js → long-D4tVjLLz.js} +5 -5
  13. package/dist/bundle/remoteFile-BkTxwFub.js +90 -0
  14. package/dist/schema.json +53 -12
  15. package/dist/src/data/sources/dataUtils.d.ts +5 -0
  16. package/dist/src/data/sources/dataUtils.d.ts.map +1 -1
  17. package/dist/src/data/sources/dataUtils.js +9 -0
  18. package/dist/src/data/sources/lazy/axisTickSource.js +1 -1
  19. package/dist/src/data/sources/lazy/bamSource.d.ts.map +1 -1
  20. package/dist/src/data/sources/lazy/bigBedSource.d.ts.map +1 -1
  21. package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
  22. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts +4 -6
  23. package/dist/src/data/sources/lazy/singleAxisLazySource.d.ts.map +1 -1
  24. package/dist/src/data/sources/lazy/singleAxisLazySource.js +4 -18
  25. package/dist/src/data/sources/urlSource.d.ts.map +1 -1
  26. package/dist/src/data/sources/urlSource.js +12 -7
  27. package/dist/src/data/transforms/clone.d.ts +1 -2
  28. package/dist/src/data/transforms/clone.d.ts.map +1 -1
  29. package/dist/src/data/transforms/clone.js +19 -4
  30. package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -1
  31. package/dist/src/data/transforms/filterScoredLabels.js +1 -4
  32. package/dist/src/data/transforms/transformFactory.d.ts.map +1 -1
  33. package/dist/src/encoder/encoder.d.ts +1 -1
  34. package/dist/src/encoder/encoder.d.ts.map +1 -1
  35. package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -1
  36. package/dist/src/genome/genome.d.ts +24 -2
  37. package/dist/src/genome/genome.d.ts.map +1 -1
  38. package/dist/src/genome/genome.js +66 -28
  39. package/dist/src/genome/genome.test.js +43 -1
  40. package/dist/src/genome/genomes.d.ts +8 -0
  41. package/dist/src/genome/genomes.d.ts.map +1 -0
  42. package/dist/src/genome/genomes.js +164 -0
  43. package/dist/src/genome/genomes.test.d.ts +2 -0
  44. package/dist/src/genome/genomes.test.d.ts.map +1 -0
  45. package/dist/src/genome/genomes.test.js +8 -0
  46. package/dist/src/genomeSpy.d.ts.map +1 -1
  47. package/dist/src/gl/dataToVertices.d.ts.map +1 -1
  48. package/dist/src/gl/glslScaleGenerator.d.ts.map +1 -1
  49. package/dist/src/spec/axis.d.ts +0 -2
  50. package/dist/src/spec/genome.d.ts +19 -6
  51. package/dist/src/spec/scale.d.ts +1 -1
  52. package/dist/src/utils/addBaseUrl.d.ts +6 -0
  53. package/dist/src/utils/addBaseUrl.d.ts.map +1 -1
  54. package/dist/src/utils/addBaseUrl.js +18 -0
  55. package/dist/src/utils/addBaseUrl.test.js +9 -1
  56. package/dist/src/utils/cloner.d.ts +8 -2
  57. package/dist/src/utils/cloner.d.ts.map +1 -1
  58. package/dist/src/utils/cloner.js +19 -2
  59. package/dist/src/utils/cloner.test.js +16 -5
  60. package/dist/src/utils/expression.d.ts.map +1 -1
  61. package/dist/src/utils/ui/tooltip.d.ts +1 -1
  62. package/dist/src/utils/ui/tooltip.d.ts.map +1 -1
  63. package/dist/src/view/layerView.d.ts.map +1 -1
  64. package/dist/src/view/layerView.js +4 -1
  65. package/dist/src/view/paramMediator.d.ts +8 -3
  66. package/dist/src/view/paramMediator.d.ts.map +1 -1
  67. package/dist/src/view/paramMediator.js +3 -1
  68. package/dist/src/view/scaleResolution.d.ts +9 -0
  69. package/dist/src/view/scaleResolution.d.ts.map +1 -1
  70. package/dist/src/view/scaleResolution.js +30 -0
  71. package/dist/src/view/view.d.ts +20 -3
  72. package/dist/src/view/view.d.ts.map +1 -1
  73. package/dist/src/view/view.js +30 -2
  74. package/dist/src/view/view.test.js +15 -5
  75. package/dist/src/view/zoom.d.ts.map +1 -1
  76. package/package.json +2 -2
  77. package/dist/bundle/index-Dixm7K89.js +0 -279
  78. package/dist/bundle/remoteFile-1_eCK3VV.js +0 -96
@@ -1,10 +1,9 @@
1
1
  import { bisect } from "d3-array";
2
2
  import { tsvParseRows } from "d3-dsv";
3
- import { loader } from "vega-loader";
4
3
  import { isObject } from "vega-util";
5
4
  import { formatRange } from "./locusFormat.js";
6
-
7
- const defaultBaseUrl = "https://genomespy.app/data/genomes/";
5
+ import { getContigs } from "./genomes.js";
6
+ import { concatUrl } from "../utils/url.js";
8
7
 
9
8
  /**
10
9
  * @typedef {import("../spec/genome.js").GenomeConfig} GenomeConfig
@@ -33,11 +32,17 @@ export default class Genome {
33
32
  * @param {GenomeConfig} config
34
33
  */
35
34
  constructor(config) {
36
- this.config = config;
35
+ this.config = { name: "custom", ...config };
36
+
37
+ if ("baseUrl" in config) {
38
+ throw new Error(
39
+ "The `baseUrl` property in genome config has been removed in GenomeSpy v0.52.0. Use `url` instead. See https://genomespy.app/docs/genomic-data/genomic-coordinates/."
40
+ );
41
+ }
37
42
 
38
- if (!this.config.contigs && typeof this.config.name !== "string") {
43
+ if (!isGenomeConfig(config)) {
39
44
  throw new Error(
40
- "No name has been defined for the genome assembly!"
45
+ "Not a genome configuration: " + JSON.stringify(config)
41
46
  );
42
47
  }
43
48
 
@@ -55,8 +60,19 @@ export default class Genome {
55
60
 
56
61
  this.totalSize = 0;
57
62
 
58
- if (this.config.contigs) {
63
+ if (isInlineGenomeConfig(this.config)) {
59
64
  this.setChromSizes(this.config.contigs);
65
+ } else if (isUrlGenomeConfig(this.config)) {
66
+ // Nop
67
+ } else {
68
+ const contigs = getContigs(this.config.name);
69
+ if (contigs) {
70
+ this.setChromSizes(contigs);
71
+ } else {
72
+ throw new Error(
73
+ `Unknown genome: ${this.config.name}. Please provide contigs or a URL. See https://genomespy.app/docs/genomic-data/genomic-coordinates/.`
74
+ );
75
+ }
60
76
  }
61
77
  }
62
78
 
@@ -68,28 +84,21 @@ export default class Genome {
68
84
  * @param {string} baseUrl
69
85
  */
70
86
  async load(baseUrl) {
71
- if (this.config.contigs) {
87
+ if (!isUrlGenomeConfig(this.config)) {
72
88
  return;
73
89
  }
74
90
 
75
- if (this.config.baseUrl) {
76
- this.baseUrl = /^http(s)?/.test(this.config.baseUrl)
77
- ? this.config.baseUrl
78
- : baseUrl + "/" + this.config.baseUrl;
79
- } else {
80
- this.baseUrl = defaultBaseUrl;
81
- }
82
-
83
91
  try {
84
- this.setChromSizes(
85
- parseChromSizes(
86
- await loader({ baseURL: this.baseUrl }).load(
87
- `${this.config.name}/${this.name}.chrom.sizes`
88
- )
89
- )
90
- );
92
+ const fullUrl = concatUrl(baseUrl, this.config.url);
93
+ const result = await fetch(fullUrl);
94
+ if (!result.ok) {
95
+ throw new Error(`${result.status} ${result.statusText}`);
96
+ }
97
+ this.setChromSizes(parseChromSizes(await result.text()));
91
98
  } catch (e) {
92
- throw new Error(`Could not load chrom sizes: ${e.message}`);
99
+ throw new Error(
100
+ `Could not load chrom sizes: ${this.config.url}. Reason: ${e.message}`
101
+ );
93
102
  }
94
103
  }
95
104
 
@@ -354,10 +363,10 @@ export default class Genome {
354
363
  * @param {string} chromSizesData
355
364
  */
356
365
  export function parseChromSizes(chromSizesData) {
357
- // TODO: Support other organisms too
358
- return tsvParseRows(chromSizesData)
359
- .filter((row) => /^chr[0-9A-Z]+$/.test(row[0]))
360
- .map(([name, size]) => ({ name, size: parseInt(size) }));
366
+ return tsvParseRows(chromSizesData).map(([name, size]) => ({
367
+ name,
368
+ size: parseInt(size),
369
+ }));
361
370
  }
362
371
 
363
372
  /**
@@ -377,3 +386,32 @@ export function isChromosomalLocus(value) {
377
386
  export function isChromosomalLocusInterval(value) {
378
387
  return value.every(isChromosomalLocus);
379
388
  }
389
+
390
+ /**
391
+ * @param {any} value
392
+ * @returns {value is GenomeConfig}
393
+ */
394
+ export function isGenomeConfig(value) {
395
+ return (
396
+ isObject(value) &&
397
+ ("name" in value ||
398
+ isUrlGenomeConfig(value) ||
399
+ isInlineGenomeConfig(value))
400
+ );
401
+ }
402
+
403
+ /**
404
+ * @param {any} value
405
+ * @returns {value is import("../spec/genome.js").UrlGenomeConfig }
406
+ */
407
+ export function isUrlGenomeConfig(value) {
408
+ return isGenomeConfig(value) && "url" in value;
409
+ }
410
+
411
+ /**
412
+ * @param {any} value
413
+ * @returns {value is import("../spec/genome.js").InlineGenomeConfig}
414
+ */
415
+ export function isInlineGenomeConfig(value) {
416
+ return isGenomeConfig(value) && "contigs" in value;
417
+ }
@@ -1,4 +1,4 @@
1
- import { describe, expect, test } from "vitest";
1
+ import { afterAll, describe, expect, test, vi } from "vitest";
2
2
  import Genome from "./genome.js";
3
3
 
4
4
  describe("Human genome, chromosome names prefixed with 'chr'", () => {
@@ -190,6 +190,48 @@ describe("C. elegans genome, chromosome names prefixed with 'chr'", () => {
190
190
  });
191
191
  });
192
192
 
193
+ describe("Load chrom.sizes file from a URL", () => {
194
+ const fetchSpy = vi.spyOn(global, "fetch");
195
+ fetchSpy.mockImplementation((/** @type {string} */ url) => {
196
+ if (url !== "http://example.com/chrom.sizes") {
197
+ throw new Error(`Unexpected URL: ${url}`);
198
+ }
199
+ return Promise.resolve(
200
+ // @ts-expect-error
201
+ {
202
+ text() {
203
+ return Promise.resolve(
204
+ "chr1\t1000\nchr2\t2000\nchr3\t3000\nchrX\t4000"
205
+ );
206
+ },
207
+ ok: true,
208
+ }
209
+ );
210
+ });
211
+
212
+ afterAll(() => {
213
+ fetchSpy.mockRestore();
214
+ });
215
+
216
+ test("Throw if the deprecated baseUrl property is provided", () => {
217
+ expect(
218
+ () =>
219
+ new Genome({
220
+ name: "random",
221
+ // @ts-expect-error
222
+ baseUrl: "http://example.com",
223
+ })
224
+ ).toThrow(/removed/);
225
+ });
226
+
227
+ test("Loads and parses a genome", async () => {
228
+ const g = new Genome({ name: "random", url: "chrom.sizes" });
229
+ await g.load("http://example.com");
230
+
231
+ expect(g.parseInterval("chr2")).toEqual([1000, 3000]);
232
+ });
233
+ });
234
+
193
235
  describe("Parse interval strings", () => {
194
236
  const chromosomes = [
195
237
  { name: "chr1", size: 1000 },
@@ -0,0 +1,8 @@
1
+ /**
2
+ * @param {string} assembly
3
+ */
4
+ export function getContigs(assembly: string): {
5
+ name: string;
6
+ size: number;
7
+ }[];
8
+ //# sourceMappingURL=genomes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genomes.d.ts","sourceRoot":"","sources":["../../../src/genome/genomes.js"],"names":[],"mappings":"AAwJA;;GAEG;AACH,qCAFW,MAAM;;;IAUhB"}
@@ -0,0 +1,164 @@
1
+ /*
2
+ * Based on chrom.sizes files from UCSC Genome Browser
3
+ * https://hgdownload.cse.ucsc.edu/goldenpath/
4
+ *
5
+ * Alternative loci, patches, and random contigs are not included.
6
+ */
7
+
8
+ const dm6 = `chr3R 32079331
9
+ chr3L 28110227
10
+ chr2R 25286936
11
+ chrX 23542271
12
+ chr2L 23513712
13
+ chrY 3667352
14
+ chr4 1348131
15
+ chrM 19524`;
16
+
17
+ const hg18 = `chr1 247249719
18
+ chr2 242951149
19
+ chr3 199501827
20
+ chr4 191273063
21
+ chr5 180857866
22
+ chr6 170899992
23
+ chr7 158821424
24
+ chr8 146274826
25
+ chr9 140273252
26
+ chr10 135374737
27
+ chr11 134452384
28
+ chr12 132349534
29
+ chr13 114142980
30
+ chr14 106368585
31
+ chr15 100338915
32
+ chr16 88827254
33
+ chr17 78774742
34
+ chr18 76117153
35
+ chr19 63811651
36
+ chr20 62435964
37
+ chr21 46944323
38
+ chr22 49691432
39
+ chrX 154913754
40
+ chrY 57772954
41
+ chrM 16571`;
42
+
43
+ const hg19 = `chr1 249250621
44
+ chr2 243199373
45
+ chr3 198022430
46
+ chr4 191154276
47
+ chr5 180915260
48
+ chr6 171115067
49
+ chr7 159138663
50
+ chr8 146364022
51
+ chr9 141213431
52
+ chr10 135534747
53
+ chr11 135006516
54
+ chr12 133851895
55
+ chr13 115169878
56
+ chr14 107349540
57
+ chr15 102531392
58
+ chr16 90354753
59
+ chr17 81195210
60
+ chr18 78077248
61
+ chr19 59128983
62
+ chr20 63025520
63
+ chr21 48129895
64
+ chr22 51304566
65
+ chrX 155270560
66
+ chrY 59373566
67
+ chrM 16571`;
68
+
69
+ const hg38 = `chr1 248956422
70
+ chr2 242193529
71
+ chr3 198295559
72
+ chr4 190214555
73
+ chr5 181538259
74
+ chr6 170805979
75
+ chr7 159345973
76
+ chr8 145138636
77
+ chr9 138394717
78
+ chr10 133797422
79
+ chr11 135086622
80
+ chr12 133275309
81
+ chr13 114364328
82
+ chr14 107043718
83
+ chr15 101991189
84
+ chr16 90338345
85
+ chr17 83257441
86
+ chr18 80373285
87
+ chr19 58617616
88
+ chr20 64444167
89
+ chr21 46709983
90
+ chr22 50818468
91
+ chrX 156040895
92
+ chrY 57227415
93
+ chrM 16569`;
94
+
95
+ const mm9 = `chr1 197195432
96
+ chr2 181748087
97
+ chr3 159599783
98
+ chr4 155630120
99
+ chr5 152537259
100
+ chr6 149517037
101
+ chr7 152524553
102
+ chr8 131738871
103
+ chr9 124076172
104
+ chr10 129993255
105
+ chr11 121843856
106
+ chr12 121257530
107
+ chr13 120284312
108
+ chr14 125194864
109
+ chr15 103494974
110
+ chr16 98319150
111
+ chr17 95272651
112
+ chr18 90772031
113
+ chr19 61342430
114
+ chrX 166650296
115
+ chrY 15902555
116
+ chrM 16299`;
117
+
118
+ const mm10 = `chr1 195471971
119
+ chr2 182113224
120
+ chr3 160039680
121
+ chr4 156508116
122
+ chr5 151834684
123
+ chr6 149736546
124
+ chr7 145441459
125
+ chr8 129401213
126
+ chr9 124595110
127
+ chr10 130694993
128
+ chr11 122082543
129
+ chr12 120129022
130
+ chr13 120421639
131
+ chr14 124902244
132
+ chr15 104043685
133
+ chr16 98207768
134
+ chr17 94987271
135
+ chr18 90702639
136
+ chr19 61431566
137
+ chrX 171031299
138
+ chrY 91744698
139
+ chrM 16299`;
140
+
141
+ /**
142
+ * @type {Record<string, string>}
143
+ */
144
+ const assemblies = {
145
+ dm6,
146
+ hg18,
147
+ hg19,
148
+ hg38,
149
+ mm9,
150
+ mm10,
151
+ };
152
+
153
+ /**
154
+ * @param {string} assembly
155
+ */
156
+ export function getContigs(assembly) {
157
+ if (!(assembly in assemblies))
158
+ throw new Error(`Unknown assembly: ${assembly}`);
159
+
160
+ return assemblies[assembly].split("\n").map((line) => {
161
+ const arr = line.split("\t");
162
+ return { name: arr[0], size: parseInt(arr[1]) };
163
+ });
164
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=genomes.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"genomes.test.d.ts","sourceRoot":"","sources":["../../../src/genome/genomes.test.js"],"names":[],"mappings":""}
@@ -0,0 +1,8 @@
1
+ import { expect, test } from "vitest";
2
+ import { getContigs } from "./genomes.js";
3
+
4
+ test("getContigs", () => {
5
+ expect(getContigs("mm10")[0]).toEqual({ name: "chr1", size: 195471971 });
6
+ expect(getContigs("mm10")[5]).toEqual({ name: "chr6", size: 149736546 });
7
+ expect(getContigs("hg38")[19]).toEqual({ name: "chr20", size: 64444167 });
8
+ });
@@ -1 +1 @@
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,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,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;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;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,iCAwDC;IA4DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAA0C;IAW9C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAt8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBATzB,uBAAuB;qBAOtB,oBAAoB"}
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,EA6FpD;IA1FG,uBAA0B;IAC1B,oDAAsB;IAItB,6BAA6B;IAC7B,uBADW,CAAC,MAAM,IAAI,CAAC,EAAE,CACM;IAE/B,sCAAsC;IACtC,wCAAgB;IAEhB,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,iBAFU,IAAI,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAEhB;IAEhC;;;OAGG;IACH,0BAFU,IAAI,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC,CAAC,CAEP;IAEzC,oFAAoF;IACpF,iBADW,OAAO,MAAM,EAAE,OAAO,6BAA6B,EAAE,cAAc,CAAC,CAK9E;IAED,mBAAmB;IACnB,2CAAyB;IAEzB;;;;OAIG;IACH;gBAF8B,OAAO,wBAAwB,EAAE,iBAAiB;iBAAW,MAAM;OAEnE;IAE9B;;OAEG;IACH,wBAFU,WAAW,CAEkB;IAEvC,oBAAoB;IACpB,kBADW,KAAK,CACiB;IA2CrC;;;OAGG;IACH,oCAFW,CAAC,IAAI,EAAE,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,iCAwDC;IA4DG,uBAQC;IAGD,mCAGE;IAOF,sCAEE;IAGF,iBAA0C;IAW9C;;OAEG;IACH,gBAuBC;IAED,sCA6MC;IAED;;;OAGG;IACH,UAFa,QAAQ,OAAO,CAAC,CA6B5B;IAED,4BA8JC;IAvIe,iCAAoC;IAyIpD;;;OAGG;IACH,kBAHW,MAAM,KACN,MAAM,QAqEhB;IAED;;;;;;;OAOG;IACH,oDAHuB,QAAQ,MAAM,GAAG,WAAW,GAAG,OAAO,KAAK,EAAE,cAAc,CAAC,QAYlF;IAED,sBA6CC;IAED,kBAIC;IAED,iCAOC;IAED,iCASC;IAED,qFAWC;;CACJ;;;;iCAt8BY,eAAe,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB;4BAP7B,uBAAuB;qBAZ9C,qBAAqB;wBAIlB,yBAAyB;yCARR,yDAAyD;oBAYvD,oBAAoB;kBAT7C,wBAAwB;wBALlB,qBAAqB;oBATzB,uBAAuB;qBAOtB,oBAAoB"}
@@ -1 +1 @@
1
- {"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH;IACI;;;OAGG;IAEH;;;;;;OAMG;IACH;;qBAJW,MAAM,EAAE;sBACR,MAAM;OAyFhB;IArFG,8FAAwB;IAIxB,sGAQK;IAQL,0BAAoC;IAEpC,8BAAoD;IA2DpD,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,QAgEhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IAhEO;;;MAAyB;IAkEjC;QAEQ,kJAAkJ;gBAAvI,OAAO,MAAM,EAAE;YAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC;QAE9I,8BAA8B;;QAE9B,8CAA8C;;;MAIrD;CACJ;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OA+BhB;IAnBG,qBAkBW;CA8BlB;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;gCACR,MAAM;uBAEN,MAAM,EAAE;mBACR,MAAM;OAwBhB;IARG,uBAAgC;IAEhC,8BAA8D;IAE9D,6CAA+D;IAC/D,4CAA6D;CA6CpE;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CACJ;AAED;IACI;;;;;OAKG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CAYJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;qBACR,OAAO,2BAA2B,EAAE,aAAa;oBACjD,OAAO,MAAM,EAAE,GAAG,CAAC;wBACnB,MAAM;sBACN,OAAO;OA6CjB;IA9BG,4DAA2B;IAC3B,2DAA0B;IAE1B,gCAA4B;IAO5B,qCAAqC;IACrC,sBADmB,GAAG,KAAK,MAAM,CAMf;IAElB,oDAGC;IACD,qDAGC;IAED,8CAAiE;CAgJxE;;;;;;;;YAnnBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAjBzB,mBAAmB"}
1
+ {"version":3,"file":"dataToVertices.d.ts","sourceRoot":"","sources":["../../../src/gl/dataToVertices.js"],"names":[],"mappings":"AAgBA;;;;;GAKG;AACH;IACI;;;OAGG;IAEH;;;;;;OAMG;IACH;;qBAJW,MAAM,EAAE;sBACR,MAAM;OAyFhB;IArFG,8FAAwB;IAIxB,sGAQK;IAQL,0BAAoC;IAEpC,8BAAoD;IA2DpD,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,QAgEhB;IAED;;;;;OAKG;IACH,mBAFW,OAAO,qBAAqB,EAAE,KAAK,QAI7C;IAhEO;;;MAAyB;IAkEjC;QAEQ,kJAAkJ;gBAAvI,OAAO,MAAM,EAAE;YAAC,IAAI,EAAE,WAAW,GAAG,UAAU,GAAG,WAAW,GAAG,UAAU,GAAG,YAAY,CAAC;YAAC,aAAa,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAC,CAAC;QAE9I,8BAA8B;;QAE9B,8CAA8C;;;MAIrD;CACJ;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OA+BhB;IAnBG,qBAkBW;CA8BlB;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;gCACR,MAAM;uBAEN,MAAM,EAAE;mBACR,MAAM;OAwBhB;IARG,uBAAgC;IAEhC,8BAA8D;IAE9D,6CAA+D;IAC/D,4CAA6D;CA6CpE;AAED;IACI;;;;;;OAMG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CACJ;AAED;IACI;;;;;OAKG;IACH;;oBAHW,MAAM,EAAE;mBACR,MAAM;OAShB;CAYJ;AAED;IACI;;;;;;;;;OASG;IACH;;oBANW,MAAM,EAAE;qBACR,OAAO,2BAA2B,EAAE,aAAa;oBACjD,OAAO,MAAM,EAAE,GAAG,CAAC;wBACnB,MAAM;sBACN,OAAO;OA6CjB;IA9BG,4DAA2B;IAC3B,2DAA0B;IAE1B,gCAA4B;IAO5B,qCAAqC;IACrC,cADW,CAAC,KAAK,EAAE,GAAG,KAAK,MAAM,CAMf;IAElB,oDAGC;IACD,qDAGC;IAED,8CAAiE;CAgJxE;;;;;;;;YAnnBS,MAAM;;;;WACN,MAAM;YACN,OAAO,yBAAyB,EAAE,MAAM;;yBAjBzB,mBAAmB"}
@@ -1 +1 @@
1
- {"version":3,"file":"glslScaleGenerator.d.ts","sourceRoot":"","sources":["../../../src/gl/glslScaleGenerator.js"],"names":[],"mappings":";AAqDA;;;;;GAKG;AACH,kDAJW,OAAO,mBACP,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,mDALW,OAAO,mBACP,MAAM,SACN,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,GAClC,aAAa,CA4CzB;AAED;;;;;;;GAOG;AACH,4DAJW,OAAO,mBACP,MAAM,GACJ,aAAa,CAkCzB;AAED;;;;;;GAMG;AACH,0CANW,OAAO,SACP,GAAG,mBACH,MAAM,+BACN,OAAO,EAAE,GACP,aAAa,CA+BzB;AACD;;;;;GAKG;AACH,qDALW,OAAO,SACP,GAAG,mBACH,MAAM,GACJ,aAAa,CAyBzB;AAED;;;;;GAKG;AAEH,2CALW,OAAO,SACP,GAAG,cACH,OAAO,oBAAoB,EAAE,UAAU;;;;;;EAwQjD;AAED;;;;GAIG;AACH,wDAHW,OAAO,aACP,OAAO,qBAAqB,EAAE,QAAQ,EAAE,UAuClD;AAmED;;GAEG;AACH,qDAFW,OAAO,6BAQjB;AA+CD;;;;GAIG;AACH,iDAHW,OAAO,qBAAqB,EAAE,SAAS,WACvC,OAAO,oBAAoB,EAAE,OAAO;mBAQjB,MAAM;sBAAoB,sBAAsB,GAAG,sBAAsB,GAAG,uBAAuB;;;;;;EAkBhI;AAED;;;;GAIG;AACH,2CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,sCAFW,MAAM,EAAE,WAIlB;AAMD;;;GAGG;AACH,sCAHW,MAAM,QACN,MAAM,EAAE,YAYlB;AAED;;;GAGG;AACH,2CAHW,MAAM,QACN,MAAM,EAAE,YAUlB;AAYD;;GAEG;AACH,qDAFW,MAAM,EAAE,YAIlB;AAED;;GAEG;AAEH;;;;;GAKG;AACH,+CAFW,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC,+DA4BtG;AAED;;GAEG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,GAAG,OAAO,oBAAoB,EAAE,OAAO,EAAE,UAIvF;AAwBD;;;;GAIG;AACH,uCAJW,MAAM,EAAE,cACR,MAAM,EAAE,GACN,MAAM,CAgClB;AAr1BD,uCAAwC;AACxC,uCAAwC;AACxC,oCAAqC;AACrC,mDAAoD;AACpD,6CAA8C;AAC9C,kDAAmD;AACnD,oDAAqD;AACrD,qCAAsC;AAmyB/B,uCAJI,GAAG,WACH,OAAO,GACL,MAAM,EAAE,CAQF;sBAnyBN,OAAO,oBAAoB,EAAE,OAAO;;aA+BvC,OAAO;kBACP,MAAM;0BACN,MAAM;oBACN,MAAM;oBACN,MAAM;kBACN,MAAM;kBACN,MAAM;mBACF,GAAG,KAAK,GAAG;;;;;8BA6fZ,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;;;;uBAgMhD,CAAC,MAAM,EAAE,OAAO,CAAC;0BApvBJ,WAAW"}
1
+ {"version":3,"file":"glslScaleGenerator.d.ts","sourceRoot":"","sources":["../../../src/gl/glslScaleGenerator.js"],"names":[],"mappings":";AAqDA;;;;;GAKG;AACH,kDAJW,OAAO,mBACP,MAAM,GACJ,MAAM,CAIlB;AAED;;;;;;;;;;GAUG;AAEH;;;;;;;GAOG;AACH,mDALW,OAAO,mBACP,MAAM,SACN,MAAM,GAAG,MAAM,EAAE,GAAG,MAAM,GAAG,OAAO,GAClC,aAAa,CA4CzB;AAED;;;;;;;GAOG;AACH,4DAJW,OAAO,mBACP,MAAM,GACJ,aAAa,CAkCzB;AAED;;;;;;GAMG;AACH,0CANW,OAAO,SACP,GAAG,mBACH,MAAM,+BACN,OAAO,EAAE,GACP,aAAa,CA+BzB;AACD;;;;;GAKG;AACH,qDALW,OAAO,SACP,GAAG,mBACH,MAAM,GACJ,aAAa,CAyBzB;AAED;;;;;GAKG;AAEH,2CALW,OAAO,SACP,GAAG,cACH,OAAO,oBAAoB,EAAE,UAAU;;;;;;EAwQjD;AAED;;;;GAIG;AACH,wDAHW,OAAO,aACP,OAAO,qBAAqB,EAAE,QAAQ,EAAE,UAuClD;AAmED;;GAEG;AACH,qDAFW,OAAO,6BAQjB;AA+CD;;;;GAIG;AACH,iDAHW,OAAO,qBAAqB,EAAE,SAAS,WACvC,OAAO,oBAAoB,EAAE,OAAO;mBAQjB,MAAM;sBAAoB,sBAAsB,GAAG,sBAAsB,GAAG,uBAAuB;;;;;;EAkBhI;AAED;;;;GAIG;AACH,2CAFW,MAAM,WAIhB;AAED;;;;GAIG;AACH,sCAFW,MAAM,EAAE,WAIlB;AAMD;;;GAGG;AACH,sCAHW,MAAM,QACN,MAAM,EAAE,YAYlB;AAED;;;GAGG;AACH,2CAHW,MAAM,QACN,MAAM,EAAE,YAUlB;AAYD;;GAEG;AACH,qDAFW,MAAM,EAAE,YAIlB;AAED;;GAEG;AAEH;;;;;GAKG;AACH,+CAFW,QAAQ,OAAO,OAAO,oBAAoB,EAAE,OAAO,EAAE,OAAO,qBAAqB,EAAE,OAAO,CAAC,CAAC,+DA4BtG;AAED;;GAEG;AACH,2CAFW,OAAO,oBAAoB,EAAE,OAAO,GAAG,OAAO,oBAAoB,EAAE,OAAO,EAAE,UAIvF;AAwBD;;;;GAIG;AACH,uCAJW,MAAM,EAAE,cACR,MAAM,EAAE,GACN,MAAM,CAgClB;AAr1BD,uCAAwC;AACxC,uCAAwC;AACxC,oCAAqC;AACrC,mDAAoD;AACpD,6CAA8C;AAC9C,kDAAmD;AACnD,oDAAqD;AACrD,qCAAsC;AAmyB/B,uCAJI,GAAG,WACH,OAAO,GACL,MAAM,EAAE,CAQF;sBAnyBN,OAAO,oBAAoB,EAAE,OAAO;;aA+BvC,OAAO;kBACP,MAAM;0BACN,MAAM;oBACN,MAAM;oBACN,MAAM;kBACN,MAAM;kBACN,MAAM;eACN,CAAC,CAAC,EAAE,GAAG,KAAK,GAAG;;;;;8BA6fZ,MAAM,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE;;;;uBAgMhD,CAAC,MAAM,EAAE,OAAO,CAAC;0BApvBJ,WAAW"}
@@ -135,9 +135,7 @@ export interface Axis extends BaseAxis {
135
135
 
136
136
  export interface BaseAxis<
137
137
  N = number,
138
- NS = number,
139
138
  B = boolean,
140
- BNS = number | boolean,
141
139
  S = string,
142
140
  C = string,
143
141
  FW = string,
@@ -3,25 +3,38 @@ export interface Contig {
3
3
  size: number;
4
4
  }
5
5
 
6
- export interface GenomeConfig {
6
+ export interface GenomeConfigBase {
7
7
  /**
8
8
  * Name of the genome assembly, e.g., `hg19` or `hg38`.
9
9
  */
10
10
  name: string;
11
+ }
11
12
 
13
+ export interface UrlGenomeConfig extends GenomeConfigBase {
12
14
  /**
13
- * Base url of data files: chromsizes, cytobands, and gene annotations.
15
+ * A URL to a `chrom.sizes` file, which is a tab-separated file with two
16
+ * columns: the sequence name and its size.
17
+ *
18
+ * You may want to strip alternative loci, haplotypes, and other
19
+ * non-canonical contigs from the file.
14
20
  *
15
- * **Default:** `"https://genomespy.app/data/genomes/"`
21
+ * Example: `"https://genomespy.app/data/genomes/hg19/chrom.sizes"`
16
22
  */
17
- baseUrl?: string;
23
+ url: string;
24
+ }
18
25
 
26
+ export interface InlineGenomeConfig extends GenomeConfigBase {
19
27
  /**
20
- * As an alternative for chromSizes, the contigs can be provided inline.
28
+ * An array of contigs/sequences in the genome assembly.
21
29
  */
22
- contigs?: Contig[];
30
+ contigs: Contig[];
23
31
  }
24
32
 
33
+ export type GenomeConfig =
34
+ | UrlGenomeConfig
35
+ | InlineGenomeConfig
36
+ | GenomeConfigBase;
37
+
25
38
  export interface ChromosomalLocus {
26
39
  /**
27
40
  * The name of the chromosome. For example: `"chr1"`, `"CHR1"`, or `"1"`.
@@ -130,7 +130,7 @@ export interface Scale {
130
130
  round?: boolean;
131
131
 
132
132
  /**
133
- * For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.
133
+ * For _[continuous](https://vega.github.io/vega-lite/docs/scale.html#continuous)_ scales, expands the scale domain to accommodate the specified number of pixels on each of the scale range. The scale range must represent pixels for this parameter to function as intended. Padding adjustment is performed prior to all other adjustments, including the effects of the `zero`, `nice`, `domainMin`, and `domainMax` properties.
134
134
  *
135
135
  * For _[band](https://vega.github.io/vega-lite/docs/scale.html#band)_ scales, shortcut for setting `paddingInner` and `paddingOuter` to the same value.
136
136
  *
@@ -3,4 +3,10 @@
3
3
  * @param {string} baseUrl
4
4
  */
5
5
  export default function addBaseUrl(url: string, baseUrl: string): string;
6
+ /**
7
+ *
8
+ * @param {string} url
9
+ * @returns {string}
10
+ */
11
+ export function endWithSlash(url: string): string;
6
12
  //# sourceMappingURL=addBaseUrl.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"addBaseUrl.d.ts","sourceRoot":"","sources":["../../../src/utils/addBaseUrl.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wCAHW,MAAM,WACN,MAAM,UAgBhB"}
1
+ {"version":3,"file":"addBaseUrl.d.ts","sourceRoot":"","sources":["../../../src/utils/addBaseUrl.js"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wCAHW,MAAM,WACN,MAAM,UAgBhB;AAED;;;;GAIG;AACH,kCAHW,MAAM,GACJ,MAAM,CAalB"}
@@ -17,3 +17,21 @@ export default function addBaseUrl(url, baseUrl) {
17
17
 
18
18
  return url;
19
19
  }
20
+
21
+ /**
22
+ *
23
+ * @param {string} url
24
+ * @returns {string}
25
+ */
26
+ export function endWithSlash(url) {
27
+ if (!url) {
28
+ return url;
29
+ }
30
+
31
+ if (/[?#]/.test(url)) {
32
+ throw new Error(
33
+ `Invalid base URL: ${url} - cannot contain query or hash.`
34
+ );
35
+ }
36
+ return url.endsWith("/") ? url : url + "/";
37
+ }
@@ -1,5 +1,5 @@
1
1
  import { expect, test } from "vitest";
2
- import addBaseUrl from "./addBaseUrl.js";
2
+ import addBaseUrl, { endWithSlash } from "./addBaseUrl.js";
3
3
 
4
4
  test("addBaseUrl adds baseUrl when needed", () => {
5
5
  expect(addBaseUrl("foo.html", "https://site.com/")).toEqual(
@@ -20,3 +20,11 @@ test("addBaseUrl doesn't add baseUrl when not needed", () => {
20
20
  expect(addBaseUrl("/foo.html", "https://site.com/")).toEqual("/foo.html");
21
21
  expect(addBaseUrl("foo.html", undefined)).toEqual("foo.html");
22
22
  });
23
+
24
+ test("endWithSlash adds slash when needed", () => {
25
+ expect(endWithSlash(null)).toBeNull();
26
+ expect(endWithSlash("https://site.com")).toEqual("https://site.com/");
27
+ expect(endWithSlash("https://site.com/")).toEqual("https://site.com/");
28
+ expect(() => endWithSlash("https://site.com/foo?bar")).toThrow();
29
+ expect(() => endWithSlash("https://site.com/foo#bar")).toThrow();
30
+ });
@@ -8,9 +8,15 @@
8
8
  *
9
9
  * @param {T} template The template object that
10
10
  * @returns {(function(T):T) & { properties: string[] }}
11
- * @template T
11
+ * @template {object} [T=object]
12
12
  */
13
- export default function createCloner<T>(template: T): ((arg0: T) => T) & {
13
+ export default function createCloner<T extends object = object>(template: T): ((arg0: T) => T) & {
14
14
  properties: string[];
15
15
  };
16
+ /**
17
+ * Needed for proxied Apache Arrow tables.
18
+ *
19
+ * @param {object} obj
20
+ */
21
+ export function getAllProperties(obj: object): string[];
16
22
  //# sourceMappingURL=cloner.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cloner.d.ts","sourceRoot":"","sources":["../../../src/utils/cloner.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH;gBAH6C,MAAM,EAAE;EAwBpD"}
1
+ {"version":3,"file":"cloner.d.ts","sourceRoot":"","sources":["../../../src/utils/cloner.js"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH;gBAH6C,MAAM,EAAE;EAwBpD;AAED;;;;GAIG;AACH,sCAFW,MAAM,YAYhB"}
@@ -8,12 +8,12 @@
8
8
  *
9
9
  * @param {T} template The template object that
10
10
  * @returns {(function(T):T) & { properties: string[] }}
11
- * @template T
11
+ * @template {object} [T=object]
12
12
  */
13
13
  export default function createCloner(template) {
14
14
  // TODO: Check that only properties, not methods get cloned
15
15
  const properties = /** @type {string[]} */ (
16
- Object.keys(template).filter((k) => typeof k == "string")
16
+ getAllProperties(template).filter((k) => typeof k == "string")
17
17
  );
18
18
 
19
19
  const cloner = /** @type {(function(T):T) & { properties: string[] }} */ (
@@ -32,3 +32,20 @@ export default function createCloner(template) {
32
32
 
33
33
  return cloner;
34
34
  }
35
+
36
+ /**
37
+ * Needed for proxied Apache Arrow tables.
38
+ *
39
+ * @param {object} obj
40
+ */
41
+ export function getAllProperties(obj) {
42
+ /** @type {string[]} */
43
+ let props = [];
44
+ do {
45
+ props = props.concat(Object.keys(obj));
46
+ obj = Object.getPrototypeOf(obj);
47
+ } while (obj && obj !== Object.prototype); // Traverse until the end of the prototype chain
48
+
49
+ const uniqueProps = Array.from(new Set(props));
50
+ return uniqueProps;
51
+ }
@@ -1,10 +1,11 @@
1
1
  import { expect, test } from "vitest";
2
- import createCloner from "./cloner.js";
2
+ import createCloner, { getAllProperties } from "./cloner.js";
3
3
 
4
4
  const template = {
5
+ 1: "iddqd",
5
6
  a: 1,
6
- b: "xyzzy",
7
- 3: "iddqd",
7
+ c: "xyzzy",
8
+ b: "idclip",
8
9
  };
9
10
 
10
11
  test("Cloner clones object properly", () => {
@@ -14,11 +15,21 @@ test("Cloner clones object properly", () => {
14
15
  expect(makeClone(template)).not.toBe(template);
15
16
 
16
17
  const another = {
18
+ 1: "hello",
17
19
  a: 2,
18
- b: "idkfa",
19
- 3: "hello",
20
+ c: "idkfa",
21
+ b: "idclip",
20
22
  };
21
23
 
22
24
  expect(makeClone(another)).toEqual(another);
23
25
  expect(makeClone(another)).not.toBe(another);
24
26
  });
27
+
28
+ test("getAllProperties", () => {
29
+ expect(getAllProperties(template)).toEqual(["1", "a", "c", "b"]);
30
+
31
+ const obj = Object.create(template);
32
+ obj.d = 42;
33
+
34
+ expect(getAllProperties(obj)).toEqual(["d", "1", "a", "c", "b"]);
35
+ });
@@ -1 +1 @@
1
- {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../../src/utils/expression.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;GAUG;AACH,6CAHW,MAAM,sBACJ,kBAAkB,CAgC9B;;YAvCU,MAAM,EAAE;aACR,MAAM,EAAE;UACR,MAAM;;2CAEO,OAAO,qBAAqB,EAAE,KAAK,KAAK,GAAG"}
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../../../src/utils/expression.js"],"names":[],"mappings":"AA2DA;;;;;;;;;;GAUG;AACH,6CAHW,MAAM,sBACJ,kBAAkB,CAgC9B;;YAvCU,MAAM,EAAE;aACR,MAAM,EAAE;UACR,MAAM;;iCAEH,CAAC,CAAC,KAAK,CAAC,EAAE,OAAO,qBAAqB,EAAE,KAAK,KAAK,GAAG,CAAC,GAAG,eAAe"}
@@ -17,7 +17,7 @@ export default class Tooltip {
17
17
  /**
18
18
  * @param {boolean} visible
19
19
  */
20
- set visible(arg: boolean);
20
+ set visible(visible: boolean);
21
21
  get visible(): boolean;
22
22
  get enabled(): boolean;
23
23
  /**