@genome-spy/core 0.64.0 → 0.65.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/{index-CCJIjehY.js → AbortablePromiseCache-CcuMrnn7.js} +22 -91
- package/dist/bundle/browser-txUcLy2H.js +123 -0
- package/dist/bundle/index-BQpbYrv4.js +1712 -0
- package/dist/bundle/index-BhtHKLUo.js +73 -0
- package/dist/bundle/index-C0llXMqm.js +280 -0
- package/dist/bundle/index-CCe8rnZz.js +716 -0
- package/dist/bundle/index-CD7FLu9x.js +269 -0
- package/dist/bundle/{index-C08YCM2T.js → index-D-w7Mmt9.js} +246 -126
- package/dist/bundle/index-D74H8TTz.js +508 -0
- package/dist/bundle/index-DhcU-Gk-.js +1487 -0
- package/dist/bundle/index.es.js +4878 -4680
- package/dist/bundle/index.js +151 -167
- package/dist/bundle/inflate-DRgHi_KK.js +1050 -0
- package/dist/schema.json +9 -1
- package/dist/src/data/collector.d.ts +7 -2
- package/dist/src/data/collector.d.ts.map +1 -1
- package/dist/src/data/collector.js +13 -2
- package/dist/src/data/dataFlow.d.ts +20 -42
- package/dist/src/data/dataFlow.d.ts.map +1 -1
- package/dist/src/data/dataFlow.js +57 -80
- package/dist/src/data/dataFlow.test.js +35 -2
- package/dist/src/data/flowHandle.d.ts +15 -0
- package/dist/src/data/flowHandle.d.ts.map +1 -0
- package/dist/src/data/flowHandle.js +13 -0
- package/dist/src/data/flowInit.d.ts +85 -0
- package/dist/src/data/flowInit.d.ts.map +1 -0
- package/dist/src/data/flowInit.js +238 -0
- package/dist/src/data/flowInit.test.d.ts +2 -0
- package/dist/src/data/flowInit.test.d.ts.map +1 -0
- package/dist/src/data/flowInit.test.js +413 -0
- package/dist/src/data/flowOptimizer.d.ts +6 -4
- package/dist/src/data/flowOptimizer.d.ts.map +1 -1
- package/dist/src/data/flowOptimizer.js +29 -14
- package/dist/src/data/flowOptimizer.test.js +20 -15
- package/dist/src/data/sources/lazy/bamSource.js +1 -1
- package/dist/src/data/sources/lazy/bigBedSource.js +1 -1
- package/dist/src/data/sources/lazy/bigWigSource.js +1 -1
- package/dist/src/data/sources/lazy/gff3Source.d.ts +2 -6
- package/dist/src/data/sources/lazy/gff3Source.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/gff3Source.js +4 -8
- package/dist/src/data/sources/lazy/indexedFastaSource.d.ts.map +1 -1
- package/dist/src/data/sources/lazy/indexedFastaSource.js +17 -17
- package/dist/src/data/sources/lazy/tabixSource.js +1 -1
- package/dist/src/genomeSpy.d.ts +1 -1
- package/dist/src/genomeSpy.d.ts.map +1 -1
- package/dist/src/genomeSpy.js +18 -61
- package/dist/src/marks/mark.d.ts +1 -0
- package/dist/src/marks/mark.d.ts.map +1 -1
- package/dist/src/marks/mark.js +22 -1
- package/dist/src/spec/sampleView.d.ts +3 -2
- package/dist/src/types/viewContext.d.ts +1 -1
- package/dist/src/view/axisResolution.d.ts +5 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -1
- package/dist/src/view/axisResolution.js +16 -1
- package/dist/src/view/facetView.d.ts.map +1 -1
- package/dist/src/view/facetView.js +1 -0
- package/dist/src/view/flowBuilder.d.ts +2 -2
- package/dist/src/view/flowBuilder.d.ts.map +1 -1
- package/dist/src/view/flowBuilder.js +21 -4
- package/dist/src/view/gridView/gridView.d.ts.map +1 -1
- package/dist/src/view/gridView/gridView.js +13 -0
- package/dist/src/view/gridView/selectionRect.d.ts +8 -4
- package/dist/src/view/gridView/selectionRect.d.ts.map +1 -1
- package/dist/src/view/gridView/selectionRect.js +28 -3
- package/dist/src/view/gridView/selectionRect.test.d.ts +2 -0
- package/dist/src/view/gridView/selectionRect.test.d.ts.map +1 -0
- package/dist/src/view/gridView/selectionRect.test.js +87 -0
- package/dist/src/view/paramMediator.d.ts +2 -1
- package/dist/src/view/paramMediator.d.ts.map +1 -1
- package/dist/src/view/paramMediator.js +13 -1
- package/dist/src/view/paramMediator.test.js +22 -0
- package/dist/src/view/scaleResolution.d.ts +5 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -1
- package/dist/src/view/scaleResolution.js +10 -0
- package/dist/src/view/testUtils.d.ts.map +1 -1
- package/dist/src/view/testUtils.js +16 -4
- package/dist/src/view/unitView.d.ts.map +1 -1
- package/dist/src/view/unitView.js +58 -8
- package/dist/src/view/view.d.ts +17 -1
- package/dist/src/view/view.d.ts.map +1 -1
- package/dist/src/view/view.js +57 -1
- package/dist/src/view/viewDispose.test.d.ts +2 -0
- package/dist/src/view/viewDispose.test.d.ts.map +1 -0
- package/dist/src/view/viewDispose.test.js +110 -0
- package/dist/src/view/viewUtils.d.ts +4 -4
- package/dist/src/view/viewUtils.d.ts.map +1 -1
- package/dist/src/view/viewUtils.js +19 -15
- package/dist/src/view/viewUtils.test.d.ts +2 -0
- package/dist/src/view/viewUtils.test.d.ts.map +1 -0
- package/dist/src/view/viewUtils.test.js +87 -0
- package/package.json +10 -10
- package/dist/bundle/__vite-browser-external-C--ziKoh.js +0 -8
- package/dist/bundle/_commonjsHelpers-DjF3Plf2.js +0 -26
- package/dist/bundle/index-5ajWdKly.js +0 -1319
- package/dist/bundle/index-B03-Om4z.js +0 -274
- package/dist/bundle/index-BftNdA0O.js +0 -27
- package/dist/bundle/index-Bg7C4Xat.js +0 -2750
- package/dist/bundle/index-C3QR8Lv6.js +0 -2131
- package/dist/bundle/index-DTcHjAHp.js +0 -505
- package/dist/bundle/index-DnIkxb0L.js +0 -1025
- package/dist/bundle/index-Ww3TAo6_.js +0 -71
- package/dist/bundle/index-g8iXgW0W.js +0 -651
- package/dist/bundle/long-B-FASCSo.js +0 -2387
- package/dist/bundle/remoteFile-BuaqFGWk.js +0 -94
|
@@ -1,4 +1,78 @@
|
|
|
1
|
-
|
|
1
|
+
function R(d, t, e) {
|
|
2
|
+
const r = /* @__PURE__ */ Object.create(null), i = e.length, a = t.length, l = 9, s = 58;
|
|
3
|
+
let n = 0;
|
|
4
|
+
if (d === "GT") {
|
|
5
|
+
for (let o = 0; o < i; o++) {
|
|
6
|
+
const p = n;
|
|
7
|
+
for (; n < a && t.charCodeAt(n) !== l; )
|
|
8
|
+
n++;
|
|
9
|
+
r[e[o]] = t.slice(p, n), n++;
|
|
10
|
+
}
|
|
11
|
+
return r;
|
|
12
|
+
}
|
|
13
|
+
const c = d.indexOf("GT");
|
|
14
|
+
if (c === -1)
|
|
15
|
+
return r;
|
|
16
|
+
if (c === 0) {
|
|
17
|
+
for (let o = 0; o < i; o++) {
|
|
18
|
+
const p = n;
|
|
19
|
+
for (; n < a && t.charCodeAt(n) !== s && t.charCodeAt(n) !== l; )
|
|
20
|
+
n++;
|
|
21
|
+
for (r[e[o]] = t.slice(p, n); n < a && t.charCodeAt(n) !== l; )
|
|
22
|
+
n++;
|
|
23
|
+
n++;
|
|
24
|
+
}
|
|
25
|
+
return r;
|
|
26
|
+
}
|
|
27
|
+
let b = 0;
|
|
28
|
+
for (let o = 0; o < c; o++)
|
|
29
|
+
d.charCodeAt(o) === s && b++;
|
|
30
|
+
for (let o = 0; o < i; o++) {
|
|
31
|
+
const p = n;
|
|
32
|
+
let u = n;
|
|
33
|
+
for (; u < a && t.charCodeAt(u) !== l; )
|
|
34
|
+
u++;
|
|
35
|
+
let g = 0, N = p;
|
|
36
|
+
for (let h = p; h <= u; h++)
|
|
37
|
+
if (h === u || t.charCodeAt(h) === s) {
|
|
38
|
+
if (g === b) {
|
|
39
|
+
r[e[o]] = t.slice(N, h);
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
g++, N = h + 1;
|
|
43
|
+
}
|
|
44
|
+
n = u + 1;
|
|
45
|
+
}
|
|
46
|
+
return r;
|
|
47
|
+
}
|
|
48
|
+
function E(d) {
|
|
49
|
+
const t = [], e = [];
|
|
50
|
+
let r = !1, i = !1;
|
|
51
|
+
const a = d.length;
|
|
52
|
+
for (let l = 0; l < a; l++) {
|
|
53
|
+
const s = d[l];
|
|
54
|
+
s === '"' ? (r = !r, e.push(s)) : s === "[" ? (i = !0, e.push(s)) : s === "]" ? (i = !1, e.push(s)) : s === "," && !r && !i ? (t.push(e.join("").trim()), e.length = 0) : e.push(s);
|
|
55
|
+
}
|
|
56
|
+
return e.length > 0 && t.push(e.join("").trim()), t;
|
|
57
|
+
}
|
|
58
|
+
function F(d, t) {
|
|
59
|
+
const e = d.indexOf(t);
|
|
60
|
+
return [d.slice(0, e), d.slice(e + 1)];
|
|
61
|
+
}
|
|
62
|
+
function C(d) {
|
|
63
|
+
const t = d.slice(1, -1), e = E(t), r = [];
|
|
64
|
+
for (let i = 0; i < e.length; i++) {
|
|
65
|
+
const a = e[i], [l, s] = F(a, "=");
|
|
66
|
+
if (s && s.startsWith("[") && s.endsWith("]")) {
|
|
67
|
+
const n = s.slice(1, -1).split(",");
|
|
68
|
+
for (let c = 0; c < n.length; c++)
|
|
69
|
+
n[c] = n[c].trim();
|
|
70
|
+
r.push([l, n]);
|
|
71
|
+
} else s && s.startsWith('"') && s.endsWith('"') ? r.push([l, s.slice(1, -1)]) : r.push([l, s]);
|
|
72
|
+
}
|
|
73
|
+
return Object.fromEntries(r);
|
|
74
|
+
}
|
|
75
|
+
const S = {
|
|
2
76
|
// INFO fields
|
|
3
77
|
InfoFields: {
|
|
4
78
|
// from the VCF4.3 spec, https://samtools.github.io/hts-specs/VCFv4.3.pdf
|
|
@@ -343,35 +417,37 @@ const h = {
|
|
|
343
417
|
}
|
|
344
418
|
}
|
|
345
419
|
};
|
|
346
|
-
function
|
|
420
|
+
function L(d) {
|
|
347
421
|
try {
|
|
348
|
-
return decodeURIComponent(
|
|
422
|
+
return decodeURIComponent(d);
|
|
349
423
|
} catch {
|
|
350
|
-
return
|
|
424
|
+
return d;
|
|
351
425
|
}
|
|
352
426
|
}
|
|
353
427
|
class M {
|
|
354
|
-
constructor({ header:
|
|
355
|
-
if (!
|
|
428
|
+
constructor({ header: t = "", strict: e = !0 }) {
|
|
429
|
+
if (!t.length)
|
|
356
430
|
throw new Error("empty header received");
|
|
357
|
-
const
|
|
358
|
-
if (!
|
|
431
|
+
const r = t.split(/[\r\n]+/).filter(Boolean);
|
|
432
|
+
if (!r.length)
|
|
359
433
|
throw new Error("no non-empty header lines specified");
|
|
360
|
-
this.strict =
|
|
361
|
-
INFO:
|
|
362
|
-
FORMAT:
|
|
363
|
-
ALT:
|
|
364
|
-
FILTER:
|
|
365
|
-
}
|
|
366
|
-
let
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
434
|
+
this.strict = e, this.metadata = {
|
|
435
|
+
INFO: { ...S.InfoFields },
|
|
436
|
+
FORMAT: { ...S.GenotypeFields },
|
|
437
|
+
ALT: { ...S.AltTypes },
|
|
438
|
+
FILTER: { ...S.FilterTypes }
|
|
439
|
+
};
|
|
440
|
+
let i;
|
|
441
|
+
for (let n = 0; n < r.length; n++) {
|
|
442
|
+
const c = r[n];
|
|
443
|
+
if (c.startsWith("#"))
|
|
444
|
+
c.startsWith("##") ? this.parseMetadata(c) : i = c;
|
|
370
445
|
else throw new Error(`Bad line in header:
|
|
371
|
-
${
|
|
372
|
-
}
|
|
446
|
+
${c}`);
|
|
447
|
+
}
|
|
448
|
+
if (!i)
|
|
373
449
|
throw new Error("No format line found in header");
|
|
374
|
-
const
|
|
450
|
+
const a = i.trim().split(" "), l = a.slice(0, 8), s = [
|
|
375
451
|
"#CHROM",
|
|
376
452
|
"POS",
|
|
377
453
|
"ID",
|
|
@@ -381,54 +457,88 @@ ${o}`);
|
|
|
381
457
|
"FILTER",
|
|
382
458
|
"INFO"
|
|
383
459
|
];
|
|
384
|
-
if (
|
|
460
|
+
if (a.length < 8)
|
|
385
461
|
throw new Error(`VCF header missing columns:
|
|
386
|
-
${
|
|
387
|
-
if (
|
|
462
|
+
${i}`);
|
|
463
|
+
if (l.length !== s.length || !l.every((n, c) => n === s[c]))
|
|
388
464
|
throw new Error(`VCF column headers not correct:
|
|
389
|
-
${
|
|
390
|
-
this.samples =
|
|
465
|
+
${i}`);
|
|
466
|
+
this.samples = a.slice(9);
|
|
391
467
|
}
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
const
|
|
403
|
-
|
|
404
|
-
const
|
|
405
|
-
|
|
468
|
+
parseInfo(t) {
|
|
469
|
+
var s;
|
|
470
|
+
const e = {}, r = t.includes("%"), i = t.split(";"), a = this.metadata.INFO, l = i.length;
|
|
471
|
+
for (let n = 0; n < l; n++) {
|
|
472
|
+
const c = i[n], b = c.indexOf("="), o = b === -1 ? c : c.slice(0, b), p = b === -1 ? void 0 : c.slice(b + 1), u = (s = a[o]) == null ? void 0 : s.Type;
|
|
473
|
+
if (u === "Flag")
|
|
474
|
+
e[o] = !0;
|
|
475
|
+
else if (!p)
|
|
476
|
+
e[o] = !0;
|
|
477
|
+
else {
|
|
478
|
+
const g = u === "Integer" || u === "Float", N = p.split(","), h = N.length;
|
|
479
|
+
if (r) {
|
|
480
|
+
const f = [];
|
|
481
|
+
for (let m = 0; m < h; m++) {
|
|
482
|
+
const y = N[m];
|
|
483
|
+
if (y === ".")
|
|
484
|
+
f.push(void 0);
|
|
485
|
+
else {
|
|
486
|
+
const D = L(y);
|
|
487
|
+
f.push(g ? Number(D) : D);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
e[o] = f;
|
|
491
|
+
} else {
|
|
492
|
+
const f = [];
|
|
493
|
+
for (let m = 0; m < h; m++) {
|
|
494
|
+
const y = N[m];
|
|
495
|
+
y === "." ? f.push(void 0) : f.push(g ? Number(y) : y);
|
|
496
|
+
}
|
|
497
|
+
e[o] = f;
|
|
406
498
|
}
|
|
407
499
|
}
|
|
408
500
|
}
|
|
409
|
-
return
|
|
501
|
+
return e;
|
|
410
502
|
}
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
for (
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
503
|
+
parseSamples(t, e) {
|
|
504
|
+
var i;
|
|
505
|
+
const r = {};
|
|
506
|
+
if (t) {
|
|
507
|
+
const a = e.split(" "), l = t.split(":"), s = this.metadata.FORMAT, n = [];
|
|
508
|
+
for (let o = 0; o < l.length; o++) {
|
|
509
|
+
const p = (i = s[l[o]]) == null ? void 0 : i.Type;
|
|
510
|
+
n.push(p === "Integer" || p === "Float");
|
|
511
|
+
}
|
|
512
|
+
const c = l.length, b = this.samples.length;
|
|
513
|
+
for (let o = 0; o < b; o++) {
|
|
514
|
+
const p = this.samples[o], u = {}, g = a[o], N = g.length;
|
|
515
|
+
let h = 0, f = 0;
|
|
516
|
+
for (let m = 0; m <= N; m++)
|
|
517
|
+
if (m === N || g[m] === ":") {
|
|
518
|
+
const y = g.slice(h, m);
|
|
519
|
+
if (y === "" || y === ".")
|
|
520
|
+
u[l[f]] = void 0;
|
|
521
|
+
else {
|
|
522
|
+
const D = y.split(","), I = [];
|
|
523
|
+
if (n[f])
|
|
524
|
+
for (let T = 0; T < D.length; T++) {
|
|
525
|
+
const A = D[T];
|
|
526
|
+
I.push(A === "." ? void 0 : +A);
|
|
527
|
+
}
|
|
528
|
+
else
|
|
529
|
+
for (let T = 0; T < D.length; T++) {
|
|
530
|
+
const A = D[T];
|
|
531
|
+
I.push(A === "." ? void 0 : A);
|
|
532
|
+
}
|
|
533
|
+
u[l[f]] = I;
|
|
534
|
+
}
|
|
535
|
+
if (h = m + 1, f += 1, f >= c)
|
|
536
|
+
break;
|
|
537
|
+
}
|
|
538
|
+
r[p] = u;
|
|
539
|
+
}
|
|
430
540
|
}
|
|
431
|
-
return
|
|
541
|
+
return r;
|
|
432
542
|
}
|
|
433
543
|
/**
|
|
434
544
|
* Parse a VCF metadata line (i.e. a line that starts with "##") and add its
|
|
@@ -437,17 +547,17 @@ ${e}`);
|
|
|
437
547
|
* @param {string} line - A line from the VCF. Supports both LF and CRLF
|
|
438
548
|
* newlines.
|
|
439
549
|
*/
|
|
440
|
-
parseMetadata(
|
|
441
|
-
const
|
|
442
|
-
if (!
|
|
443
|
-
throw new Error(`Line is not a valid metadata line: ${
|
|
444
|
-
const [
|
|
445
|
-
if (
|
|
446
|
-
|
|
447
|
-
const [
|
|
448
|
-
this.metadata[
|
|
550
|
+
parseMetadata(t) {
|
|
551
|
+
const e = /^##(.+?)=(.*)/.exec(t.trim());
|
|
552
|
+
if (!e)
|
|
553
|
+
throw new Error(`Line is not a valid metadata line: ${t}`);
|
|
554
|
+
const [r, i] = e.slice(1, 3), a = r;
|
|
555
|
+
if (i != null && i.startsWith("<")) {
|
|
556
|
+
a in this.metadata || (this.metadata[a] = {});
|
|
557
|
+
const [l, s] = this.parseStructuredMetaVal(i);
|
|
558
|
+
l ? this.metadata[a][l] = s : this.metadata[a] = s;
|
|
449
559
|
} else
|
|
450
|
-
this.metadata[
|
|
560
|
+
this.metadata[a] = i;
|
|
451
561
|
}
|
|
452
562
|
/**
|
|
453
563
|
* Parse a VCF header structured meta string (i.e. a meta value that starts
|
|
@@ -458,9 +568,9 @@ ${e}`);
|
|
|
458
568
|
* @returns {Array} - Array with two entries, 1) a string of the metadata ID
|
|
459
569
|
* and 2) an object with the other key-value pairs in the metadata
|
|
460
570
|
*/
|
|
461
|
-
parseStructuredMetaVal(
|
|
462
|
-
const
|
|
463
|
-
return delete
|
|
571
|
+
parseStructuredMetaVal(t) {
|
|
572
|
+
const e = C(t), r = e.ID;
|
|
573
|
+
return delete e.ID, "Number" in e && (Number.isNaN(Number(e.Number)) || (e.Number = Number(e.Number))), [r, e];
|
|
464
574
|
}
|
|
465
575
|
/**
|
|
466
576
|
* Get metadata filtered by the elements in args. For example, can pass
|
|
@@ -471,66 +581,76 @@ ${e}`);
|
|
|
471
581
|
*
|
|
472
582
|
* @returns {any} An object, string, or number, depending on the filtering
|
|
473
583
|
*/
|
|
474
|
-
getMetadata(...
|
|
475
|
-
let
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
584
|
+
getMetadata(...t) {
|
|
585
|
+
let e = this.metadata;
|
|
586
|
+
const r = t.length;
|
|
587
|
+
for (let i = 0; i < r; i++)
|
|
588
|
+
if (e = e[t[i]], !e)
|
|
589
|
+
return e;
|
|
590
|
+
return e;
|
|
480
591
|
}
|
|
481
592
|
/**
|
|
482
|
-
*
|
|
483
|
-
* value if it's in quotes, like:
|
|
484
|
-
* 'ID=DB,Number=0,Type=Flag,Description="dbSNP membership, build 129"'
|
|
593
|
+
* Parse a VCF line into an object like
|
|
485
594
|
*
|
|
486
|
-
*
|
|
487
|
-
*
|
|
488
|
-
* '
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
*
|
|
499
|
-
*
|
|
595
|
+
* ```typescript
|
|
596
|
+
* {
|
|
597
|
+
* CHROM: 'contigA',
|
|
598
|
+
* POS: 3000,
|
|
599
|
+
* ID: ['rs17883296'],
|
|
600
|
+
* REF: 'G',
|
|
601
|
+
* ALT: ['T', 'A'],
|
|
602
|
+
* QUAL: 100,
|
|
603
|
+
* FILTER: 'PASS',
|
|
604
|
+
* INFO: {
|
|
605
|
+
* NS: [3],
|
|
606
|
+
* DP: [14],
|
|
607
|
+
* AF: [0.5],
|
|
608
|
+
* DB: true,
|
|
609
|
+
* XYZ: ['5'],
|
|
610
|
+
* },
|
|
611
|
+
* SAMPLES: () => ({
|
|
612
|
+
* HG00096: {
|
|
613
|
+
* GT: ['0|0'],
|
|
614
|
+
* AP: ['0.000', '0.000'],
|
|
615
|
+
* }
|
|
616
|
+
* }),
|
|
617
|
+
* GENOTYPES: () => ({
|
|
618
|
+
* HG00096: '0|0'
|
|
619
|
+
* })
|
|
620
|
+
* }
|
|
621
|
+
* ```
|
|
622
|
+
*
|
|
623
|
+
* SAMPLES and GENOTYPES methods are functions instead of static data fields
|
|
624
|
+
* because it avoids parsing the potentially long list of samples from e.g.
|
|
625
|
+
* 1000 genotypes data unless requested.
|
|
500
626
|
*
|
|
501
|
-
*
|
|
502
|
-
*
|
|
627
|
+
* The SAMPLES function gives all info about the samples
|
|
628
|
+
*
|
|
629
|
+
* The GENOTYPES function only extracts the raw GT string if it exists, for
|
|
630
|
+
* potentially optimized parsing by programs that need it
|
|
631
|
+
*
|
|
632
|
+
* @param {string} line - A string of a line from a VCF
|
|
503
633
|
*/
|
|
504
|
-
parseLine(
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
if (this.strict && !t[7])
|
|
634
|
+
parseLine(t) {
|
|
635
|
+
let e = 0, r = 0;
|
|
636
|
+
for (; e < t.length && r < 9; )
|
|
637
|
+
t[e] === " " && (r += 1), e += 1;
|
|
638
|
+
const i = r === 9 ? e - 1 : e, a = t.slice(0, i).split(" "), l = t.slice(i + 1), [s, n, c, b, o, p, u] = a, g = s, N = +n, h = c === "." ? void 0 : c.split(";"), f = b, m = o === "." ? void 0 : o.split(","), y = p === "." ? void 0 : +p, D = u === "." ? void 0 : u.split(";"), I = a[8];
|
|
639
|
+
if (this.strict && !a[7])
|
|
511
640
|
throw new Error("no INFO field specified, must contain at least a '.' (turn off strict mode to allow)");
|
|
512
|
-
const
|
|
513
|
-
for (const l of Object.keys(f)) {
|
|
514
|
-
const D = (n = f[l]) === null || n === void 0 ? void 0 : n.split(",").map((d) => d === "." ? void 0 : d).map((d) => d && F ? v(d) : d), N = this.getMetadata("INFO", l, "Type");
|
|
515
|
-
N === "Integer" || N === "Float" ? f[l] = D == null ? void 0 : D.map((d) => d === void 0 ? void 0 : Number(d)) : N === "Flag" ? f[l] = !0 : f[l] = D;
|
|
516
|
-
}
|
|
641
|
+
const T = a[7] === void 0 || a[7] === "." ? {} : this.parseInfo(a[7]);
|
|
517
642
|
return {
|
|
518
643
|
CHROM: g,
|
|
519
|
-
POS:
|
|
520
|
-
ALT:
|
|
521
|
-
INFO:
|
|
522
|
-
REF:
|
|
523
|
-
FILTER:
|
|
524
|
-
ID:
|
|
525
|
-
QUAL:
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
},
|
|
530
|
-
GENOTYPES: () => {
|
|
531
|
-
var l;
|
|
532
|
-
return this.parseGenotypesOnly((l = t[8]) !== null && l !== void 0 ? l : "", s);
|
|
533
|
-
}
|
|
644
|
+
POS: N,
|
|
645
|
+
ALT: m,
|
|
646
|
+
INFO: T,
|
|
647
|
+
REF: f,
|
|
648
|
+
FILTER: (D == null ? void 0 : D.length) === 1 && D[0] === "PASS" ? "PASS" : D,
|
|
649
|
+
ID: h,
|
|
650
|
+
QUAL: y,
|
|
651
|
+
FORMAT: I,
|
|
652
|
+
SAMPLES: () => this.parseSamples(a[8] ?? "", l),
|
|
653
|
+
GENOTYPES: () => R(a[8] ?? "", l, this.samples)
|
|
534
654
|
};
|
|
535
655
|
}
|
|
536
656
|
}
|