@sjcrh/proteinpaint-shared 2.186.0 → 2.188.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 (117) hide show
  1. package/README.md +10 -2
  2. package/constants/AiHisto.ts +27 -0
  3. package/constants/README.md +11 -0
  4. package/devTs.ts +3 -0
  5. package/dist/constants/AiHisto.d.ts +23 -0
  6. package/dist/constants/AiHisto.js +31 -0
  7. package/dist/constants/AiHisto.js.map +7 -0
  8. package/dist/src/aiHisto.d.ts +5 -0
  9. package/dist/src/aiHisto.js +15 -0
  10. package/dist/src/aiHisto.js.map +7 -0
  11. package/dist/src/bulk.cnv.js +83 -0
  12. package/dist/src/bulk.cnv.js.map +7 -0
  13. package/dist/src/bulk.del.js +119 -0
  14. package/dist/src/bulk.del.js.map +7 -0
  15. package/dist/src/bulk.itd.js +119 -0
  16. package/dist/src/bulk.itd.js.map +7 -0
  17. package/dist/src/bulk.js +183 -0
  18. package/dist/src/bulk.js.map +7 -0
  19. package/dist/src/bulk.snv.js +175 -0
  20. package/dist/src/bulk.snv.js.map +7 -0
  21. package/dist/src/bulk.sv.js +266 -0
  22. package/dist/src/bulk.sv.js.map +7 -0
  23. package/dist/src/bulk.svjson.js +151 -0
  24. package/dist/src/bulk.svjson.js.map +7 -0
  25. package/dist/src/bulk.trunc.js +122 -0
  26. package/dist/src/bulk.trunc.js.map +7 -0
  27. package/dist/src/clustering.js +71 -0
  28. package/dist/src/clustering.js.map +7 -0
  29. package/dist/src/common.js +1302 -0
  30. package/dist/src/common.js.map +7 -0
  31. package/dist/src/compute.percentile.js +10 -0
  32. package/dist/src/compute.percentile.js.map +7 -0
  33. package/dist/src/doc.d.ts +7 -0
  34. package/dist/src/doc.js +10 -0
  35. package/dist/src/doc.js.map +7 -0
  36. package/dist/src/fetch-helpers.js +177 -0
  37. package/dist/src/fetch-helpers.js.map +7 -0
  38. package/dist/src/fileSize.js +10 -0
  39. package/dist/src/fileSize.js.map +7 -0
  40. package/dist/src/filter.d.ts +62 -0
  41. package/dist/src/filter.js +194 -0
  42. package/dist/src/filter.js.map +7 -0
  43. package/dist/src/hash.js +20 -0
  44. package/dist/src/hash.js.map +7 -0
  45. package/dist/src/helpers.js +66 -0
  46. package/dist/src/helpers.js.map +7 -0
  47. package/dist/src/index.d.ts +26 -0
  48. package/dist/src/index.js +27 -0
  49. package/dist/src/index.js.map +7 -0
  50. package/dist/src/joinUrl.d.ts +1 -0
  51. package/dist/src/joinUrl.js +17 -0
  52. package/dist/src/joinUrl.js.map +7 -0
  53. package/dist/src/mds3tk.js +64 -0
  54. package/dist/src/mds3tk.js.map +7 -0
  55. package/dist/src/roundValue.js +57 -0
  56. package/dist/src/roundValue.js.map +7 -0
  57. package/dist/src/termdb.bins.js +272 -0
  58. package/dist/src/termdb.bins.js.map +7 -0
  59. package/dist/src/termdb.initbinconfig.js +79 -0
  60. package/dist/src/termdb.initbinconfig.js.map +7 -0
  61. package/dist/src/termdb.usecase.js +239 -0
  62. package/dist/src/termdb.usecase.js.map +7 -0
  63. package/dist/src/terms.d.ts +83 -0
  64. package/dist/src/terms.js +327 -0
  65. package/dist/src/terms.js.map +7 -0
  66. package/dist/src/time.d.ts +9 -0
  67. package/dist/src/time.js +23 -0
  68. package/dist/src/time.js.map +7 -0
  69. package/dist/src/tree.js +82 -0
  70. package/dist/src/tree.js.map +7 -0
  71. package/dist/src/urljson.d.ts +8 -0
  72. package/dist/src/urljson.js +31 -0
  73. package/dist/src/urljson.js.map +7 -0
  74. package/dist/src/vcf.ann.js +56 -0
  75. package/dist/src/vcf.ann.js.map +7 -0
  76. package/dist/src/vcf.csq.js +82 -0
  77. package/dist/src/vcf.csq.js.map +7 -0
  78. package/dist/src/vcf.info.js +40 -0
  79. package/dist/src/vcf.info.js.map +7 -0
  80. package/dist/src/vcf.js +439 -0
  81. package/dist/src/vcf.js.map +7 -0
  82. package/dist/src/vcf.type.js +17 -0
  83. package/dist/src/vcf.type.js.map +7 -0
  84. package/package.json +20 -11
  85. package/src/bulk.cnv.js +0 -86
  86. package/src/bulk.del.js +0 -124
  87. package/src/bulk.itd.js +0 -123
  88. package/src/bulk.js +0 -197
  89. package/src/bulk.snv.js +0 -271
  90. package/src/bulk.sv.js +0 -276
  91. package/src/bulk.svjson.js +0 -164
  92. package/src/bulk.trunc.js +0 -132
  93. package/src/clustering.js +0 -66
  94. package/src/common.js +0 -1608
  95. package/src/compute.percentile.js +0 -11
  96. package/src/doc.js +0 -6
  97. package/src/fetch-helpers.js +0 -323
  98. package/src/fileSize.js +0 -6
  99. package/src/filter.js +0 -221
  100. package/src/hash.js +0 -21
  101. package/src/helpers.js +0 -88
  102. package/src/index.js +0 -26
  103. package/src/joinUrl.js +0 -14
  104. package/src/mds3tk.js +0 -100
  105. package/src/roundValue.js +0 -94
  106. package/src/termdb.bins.js +0 -456
  107. package/src/termdb.initbinconfig.js +0 -130
  108. package/src/termdb.usecase.js +0 -317
  109. package/src/terms.js +0 -341
  110. package/src/time.js +0 -22
  111. package/src/tree.js +0 -138
  112. package/src/urljson.js +0 -41
  113. package/src/vcf.ann.js +0 -62
  114. package/src/vcf.csq.js +0 -153
  115. package/src/vcf.info.js +0 -50
  116. package/src/vcf.js +0 -654
  117. package/src/vcf.type.js +0 -24
@@ -0,0 +1,439 @@
1
+ import { mclass } from "./common.js";
2
+ import { dissect_INFO } from "./vcf.info.js";
3
+ import { parse_CSQ } from "./vcf.csq.js";
4
+ import { parse_ANN } from "./vcf.ann.js";
5
+ import { getVariantType } from "./vcf.type.js";
6
+ const getallelename = new RegExp(/<(.+)>/);
7
+ const mclasslabel2key = {};
8
+ for (const k in mclass) {
9
+ mclasslabel2key[mclass[k].label.toUpperCase()] = k;
10
+ }
11
+ function vcfparsemeta(lines) {
12
+ let sample = [], errlst = [], info = {}, hasinfo = false, format = {}, hasformat = false;
13
+ for (const line of lines) {
14
+ if (!line.startsWith("#")) {
15
+ continue;
16
+ }
17
+ if (line.startsWith("#C")) {
18
+ sample = line.split(" ").slice(9);
19
+ continue;
20
+ }
21
+ if (line.startsWith("##INFO")) {
22
+ const e = tohash(line.substring(8, line.length - 1), info);
23
+ if (e) {
24
+ errlst.push("INFO error: " + e);
25
+ } else {
26
+ hasinfo = true;
27
+ }
28
+ continue;
29
+ }
30
+ if (line.startsWith("##FORMAT")) {
31
+ const e = tohash(line.substring(10, line.length - 1), format);
32
+ if (e) {
33
+ errlst.push("FORMAT error: " + e);
34
+ } else {
35
+ hasformat = true;
36
+ }
37
+ }
38
+ }
39
+ const sampleobjlst = [];
40
+ for (const samplename of sample) {
41
+ const a = { name: samplename };
42
+ sampleobjlst.push(a);
43
+ }
44
+ if (info.CSQ) {
45
+ const lst = info.CSQ.Description.split(" Format: ");
46
+ if (lst[1]) {
47
+ const lst2 = lst[1].split("|");
48
+ if (lst2.length > 1) {
49
+ info.CSQ.csqheader = [];
50
+ for (const str of lst2) {
51
+ const attr = { name: str };
52
+ info.CSQ.csqheader.push(attr);
53
+ }
54
+ } else {
55
+ errlst.push("unknown format for CSQ header: " + info.CSQ.Description);
56
+ }
57
+ } else {
58
+ errlst.push("unknown format for CSQ header: " + info.CSQ.Description);
59
+ }
60
+ }
61
+ if (info.ANN) {
62
+ const lst = info.ANN.Description.split("'");
63
+ if (lst[1]) {
64
+ const lst2 = lst[1].split(" | ");
65
+ if (lst2.length) {
66
+ info.ANN.annheader = [];
67
+ for (const s of lst2) {
68
+ const attr = { name: s };
69
+ info.ANN.annheader.push(attr);
70
+ }
71
+ } else {
72
+ errlst.push('no " | " joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description);
73
+ }
74
+ } else {
75
+ errlst.push("no single-quote enclosed annotation fields for ANN (snpEff annotation): " + info.ANN.Description);
76
+ }
77
+ }
78
+ return [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null];
79
+ }
80
+ function vcfparseline(line, vcf) {
81
+ const lst = line.split(" ");
82
+ if (lst.length < 8) {
83
+ return ["line has less than 8 fields", null, null];
84
+ }
85
+ const rawpos = Number.parseInt(lst[2 - 1]);
86
+ if (!Number.isInteger(rawpos)) {
87
+ return ["invalid value for genomic position", null, null];
88
+ }
89
+ const refallele = lst[4 - 1];
90
+ const m = {
91
+ vcf_ID: lst[3 - 1],
92
+ chr: (vcf.nochr ? "chr" : "") + lst[1 - 1],
93
+ pos: rawpos - 1,
94
+ ref: refallele,
95
+ //refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, "refstr" is required for matching in FORMAT
96
+ altstr: lst[5 - 1],
97
+ alleles: [
98
+ {
99
+ /*
100
+ ref allele only a placeholder, to be removed, this array only contains alt alleles
101
+ this is a must
102
+ also allows GT allele index to work
103
+ */
104
+ allele: refallele,
105
+ sampledata: []
106
+ }
107
+ ],
108
+ info: {},
109
+ // locus info, do not contain allele info
110
+ name: lst[3 - 1] == "." ? null : lst[3 - 1]
111
+ };
112
+ const altinvalid = [];
113
+ for (const alt of lst[5 - 1].split(",")) {
114
+ const a = {
115
+ ref: m.ref,
116
+ // may be corrected just below!
117
+ allele: alt,
118
+ // 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele
119
+ allele_original: alt,
120
+ sampledata: [],
121
+ _m: m,
122
+ info: {}
123
+ // allele info, do not contain locus info
124
+ };
125
+ m.alleles.push(a);
126
+ if (alt[0] == "<") {
127
+ const tmp2 = alt.match(getallelename);
128
+ if (!tmp2) {
129
+ altinvalid.push(alt);
130
+ continue;
131
+ }
132
+ a.type = tmp2[1];
133
+ a.allele = tmp2[1];
134
+ a.issymbolicallele = true;
135
+ } else {
136
+ const [p, ref, alt2] = correctRefAlt(m.pos, m.ref, a.allele);
137
+ a.pos = p;
138
+ a.ref = ref;
139
+ a.allele = alt2;
140
+ }
141
+ }
142
+ if (lst[9 - 1] && lst[10 - 1]) {
143
+ parse_FORMAT2(lst, m, vcf);
144
+ }
145
+ m.alleles.shift();
146
+ const tmp = lst[8 - 1] == "." ? [] : dissect_INFO(lst[8 - 1]);
147
+ let badinfokeys = [];
148
+ if (vcf.info) {
149
+ badinfokeys = parse_INFO(tmp, m, vcf);
150
+ } else {
151
+ m.info = tmp;
152
+ }
153
+ const mlst = [];
154
+ for (const a of m.alleles) {
155
+ const m2 = {};
156
+ for (const k in m) {
157
+ if (k != "alleles") {
158
+ m2[k] = m[k];
159
+ }
160
+ }
161
+ for (const k in a) {
162
+ if (k == "allele") {
163
+ m2.alt = a[k];
164
+ } else if (k == "info") {
165
+ m2.altinfo = a[k];
166
+ } else {
167
+ m2[k] = a[k];
168
+ }
169
+ }
170
+ if (!m2.issymbolicallele && m2.alt != "NON_REF") {
171
+ m2.type = getVariantType(m2.ref, m2.alt);
172
+ }
173
+ mlst.push(m2);
174
+ }
175
+ return [
176
+ badinfokeys.length ? "unknown info keys: " + badinfokeys.join(",") : null,
177
+ mlst,
178
+ altinvalid.length > 0 ? altinvalid : null
179
+ ];
180
+ }
181
+ function correctRefAlt(p, ref, alt) {
182
+ while (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {
183
+ ref = ref.substr(0, ref.length - 1);
184
+ alt = alt.substr(0, alt.length - 1);
185
+ }
186
+ while (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {
187
+ ref = ref.substr(1);
188
+ alt = alt.substr(1);
189
+ p++;
190
+ }
191
+ return [p, ref, alt];
192
+ }
193
+ function parse_FORMAT2(lst, m, vcf) {
194
+ const formatfields = lst[9 - 1].split(":");
195
+ for (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {
196
+ const valuelst = lst[_sampleidx].split(":");
197
+ {
198
+ let none = true;
199
+ for (const v of valuelst) {
200
+ if (v != ".") {
201
+ none = false;
202
+ break;
203
+ }
204
+ }
205
+ if (none) {
206
+ continue;
207
+ }
208
+ }
209
+ const sampleidx = _sampleidx - 9;
210
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
211
+ const sobj = {};
212
+ if (vcf.samples && vcf.samples[sampleidx]) {
213
+ for (const k in vcf.samples[sampleidx]) {
214
+ sobj[k] = vcf.samples[sampleidx][k];
215
+ }
216
+ } else {
217
+ sobj.name = "missing_samplename_from_vcf_header";
218
+ }
219
+ m.alleles[i2].sampledata.push({
220
+ sampleobj: sobj
221
+ });
222
+ }
223
+ for (let fi = 0; fi < formatfields.length; fi++) {
224
+ const field = formatfields[fi];
225
+ const value = valuelst[fi];
226
+ if (value == ".") {
227
+ continue;
228
+ }
229
+ if (field == "GT") {
230
+ const splitter = value.indexOf("/") != -1 ? "/" : "|";
231
+ let gtsum = 0;
232
+ let unknowngt = false;
233
+ const gtalleles = [];
234
+ for (const i2 of value.split(splitter)) {
235
+ if (i2 == ".") {
236
+ unknowngt = true;
237
+ continue;
238
+ }
239
+ const j = Number.parseInt(i2);
240
+ if (Number.isNaN(j)) {
241
+ unknowngt = true;
242
+ continue;
243
+ }
244
+ gtsum += j;
245
+ const ale = m.alleles[j];
246
+ if (ale) {
247
+ gtalleles.push(ale.allele);
248
+ }
249
+ }
250
+ let gtallref = false;
251
+ if (!unknowngt) {
252
+ gtallref = gtsum == 0;
253
+ }
254
+ const genotype = gtalleles.join(splitter);
255
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
256
+ const ms = m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1];
257
+ ms.GT = value;
258
+ ms.genotype = genotype;
259
+ if (gtallref) {
260
+ ms.gtallref = true;
261
+ }
262
+ ms.__gtalleles = gtalleles;
263
+ }
264
+ continue;
265
+ }
266
+ const formatdesc = vcf.format ? vcf.format[field] : null;
267
+ if (!formatdesc) {
268
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
269
+ m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1][field] = value;
270
+ }
271
+ continue;
272
+ }
273
+ const isinteger = formatdesc.Type == "Integer";
274
+ const isfloat = formatdesc.Type == "Float";
275
+ if (formatdesc.Number && formatdesc.Number == "R" || field == "AD") {
276
+ const fvlst = value.split(",").map((i2) => {
277
+ if (isinteger) return Number.parseInt(i2);
278
+ if (isfloat) return Number.parseFloat(i2);
279
+ return i2;
280
+ });
281
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
282
+ if (fvlst[i2] != void 0) {
283
+ const m2 = m.alleles[i2];
284
+ const m2s = m2.sampledata[m2.sampledata.length - 1];
285
+ m2s[field] = {};
286
+ m2s[field][m2.ref] = fvlst[0];
287
+ m2s[field][m2.allele] = fvlst[i2];
288
+ }
289
+ }
290
+ continue;
291
+ }
292
+ if (formatdesc.Number && formatdesc.Number == "A") {
293
+ const fvlst = value.split(",").map((i2) => {
294
+ if (isinteger) return Number.parseInt(i2);
295
+ if (isfloat) return Number.parseFloat(i2);
296
+ return i2;
297
+ });
298
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
299
+ if (fvlst[i2 - 1] != void 0) {
300
+ const m2 = m.alleles[i2];
301
+ const m2s = m2.sampledata[m2.sampledata.length - 1];
302
+ m2s[field] = {};
303
+ m2s[field][m2.allele] = fvlst[i2 - 1];
304
+ }
305
+ }
306
+ continue;
307
+ }
308
+ for (let i2 = 1; i2 < m.alleles.length; i2++) {
309
+ m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1][field] = value;
310
+ }
311
+ }
312
+ }
313
+ for (const a of m.alleles) {
314
+ for (const s of a.sampledata) {
315
+ if (s.AD) {
316
+ s.allele2readcount = {};
317
+ for (const k in s.AD) {
318
+ s.allele2readcount[k] = s.AD[k];
319
+ }
320
+ }
321
+ }
322
+ }
323
+ }
324
+ function tohash(s, hash) {
325
+ const h = {}, err = [];
326
+ let prev = 0, prevdoublequote = false, k = null;
327
+ for (let i2 = 0; i2 < s.length; i2++) {
328
+ if (s[i2] == '"') {
329
+ i2++;
330
+ const thisstart = i2;
331
+ while (s[i2] != '"') {
332
+ i2++;
333
+ }
334
+ if (k) {
335
+ h[k] = s.substring(thisstart, i2);
336
+ k = null;
337
+ } else {
338
+ err.push("k undefined before double quotes");
339
+ }
340
+ prevdoublequote = true;
341
+ continue;
342
+ }
343
+ if (s[i2] == "=") {
344
+ k = s.substring(prev, i2);
345
+ prev = i2 + 1;
346
+ continue;
347
+ }
348
+ if (s[i2] == ",") {
349
+ if (prevdoublequote) {
350
+ prevdoublequote = false;
351
+ } else {
352
+ if (k) {
353
+ h[k] = s.substring(prev, i2);
354
+ k = null;
355
+ } else {
356
+ err.push("k undefined");
357
+ }
358
+ }
359
+ prev = i2 + 1;
360
+ continue;
361
+ }
362
+ }
363
+ if (k) {
364
+ h[k] = s.substring(prev, i);
365
+ }
366
+ if (h.ID) {
367
+ hash[h.ID] = h;
368
+ } else {
369
+ return "no ID";
370
+ }
371
+ if (err.length) return err.join("\n");
372
+ }
373
+ function parse_INFO(tmp, m, vcf) {
374
+ const badinfokeys = [];
375
+ for (const key in tmp) {
376
+ if (vcf.info[key] == void 0) {
377
+ badinfokeys.push(key);
378
+ continue;
379
+ }
380
+ const value = tmp[key];
381
+ if (key == "CSQ") {
382
+ const okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m);
383
+ if (!okay) {
384
+ m.info[key] = value;
385
+ }
386
+ continue;
387
+ }
388
+ if (key == "ANN") {
389
+ const okay = parse_ANN(value, vcf.info.ANN.annheader, m);
390
+ if (!okay) {
391
+ m.info[key] = value;
392
+ }
393
+ continue;
394
+ }
395
+ if (vcf.info[key].Type == "Flag") {
396
+ m.info[key] = key;
397
+ continue;
398
+ }
399
+ const __number = vcf.info[key].Number;
400
+ const isinteger = vcf.info[key].Type == "Integer";
401
+ const isfloat = vcf.info[key].Type == "Float";
402
+ if (__number == "0") {
403
+ m.info[key] = key;
404
+ continue;
405
+ }
406
+ if (__number == "A") {
407
+ const tt = value.split(",");
408
+ for (let j = 0; j < tt.length; j++) {
409
+ if (m.alleles[j]) {
410
+ m.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j];
411
+ }
412
+ }
413
+ continue;
414
+ }
415
+ if (__number == "R") {
416
+ }
417
+ if (__number == "1") {
418
+ m.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value;
419
+ continue;
420
+ }
421
+ if (!value.split) {
422
+ continue;
423
+ }
424
+ const lst = value.split(",");
425
+ if (isinteger) {
426
+ m.info[key] = lst.map(Number.parseInt);
427
+ } else if (isfloat) {
428
+ m.info[key] = lst.map(Number.parseFloat);
429
+ } else {
430
+ m.info[key] = lst;
431
+ }
432
+ }
433
+ return badinfokeys;
434
+ }
435
+ export {
436
+ vcfparseline,
437
+ vcfparsemeta
438
+ };
439
+ //# sourceMappingURL=vcf.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/vcf.js"],
4
+ "sourcesContent": ["import { mclass } from './common.js'\nimport { dissect_INFO } from './vcf.info.js'\nimport { parse_CSQ } from './vcf.csq.js'\nimport { parse_ANN } from './vcf.ann.js'\nimport { getVariantType } from './vcf.type.js'\n\n/*\nOnly for parsing vcf files\nis not involved in creating vcf tracks\n\nshared between client-server\n*/\n\n// for telling symbolic alleles e.g. <*:DEL>\nconst getallelename = new RegExp(/<(.+)>/)\n\nconst mclasslabel2key = {}\nfor (const k in mclass) {\n\tmclasslabel2key[mclass[k].label.toUpperCase()] = k\n}\n\nexport function vcfparsemeta(lines) {\n\t/*\n\tinput: array of string, as lines separated by linebreak\n\n\t##INFO for meta lines\n\t#CHROM for header, to get samples\n\n\t*/\n\n\tlet sample = [],\n\t\terrlst = [],\n\t\tinfo = {},\n\t\thasinfo = false,\n\t\tformat = {},\n\t\thasformat = false\n\n\tfor (const line of lines) {\n\t\tif (!line.startsWith('#')) {\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('#C')) {\n\t\t\t// header, get samples\n\t\t\tsample = line.split('\\t').slice(9)\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##INFO')) {\n\t\t\tconst e = tohash(line.substring(8, line.length - 1), info)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('INFO error: ' + e)\n\t\t\t} else {\n\t\t\t\thasinfo = true\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (line.startsWith('##FORMAT')) {\n\t\t\tconst e = tohash(line.substring(10, line.length - 1), format)\n\t\t\tif (e) {\n\t\t\t\terrlst.push('FORMAT error: ' + e)\n\t\t\t} else {\n\t\t\t\thasformat = true\n\t\t\t}\n\t\t}\n\t}\n\n\tconst sampleobjlst = []\n\tfor (const samplename of sample) {\n\t\tconst a = { name: samplename }\n\n\t\t// this enables adding key4annotation to match with .ds.cohort.annotation\n\n\t\tsampleobjlst.push(a)\n\t}\n\n\t// reserved INFO fields\n\tif (info.CSQ) {\n\t\tconst lst = info.CSQ.Description.split(' Format: ')\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split('|')\n\t\t\tif (lst2.length > 1) {\n\t\t\t\t// fix csq headers so to allow configuring show/hide of csq fields\n\t\t\t\tinfo.CSQ.csqheader = []\n\t\t\t\tfor (const str of lst2) {\n\t\t\t\t\tconst attr = { name: str }\n\t\t\t\t\tinfo.CSQ.csqheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('unknown format for CSQ header: ' + info.CSQ.Description)\n\t\t}\n\t}\n\n\tif (info.ANN) {\n\t\tconst lst = info.ANN.Description.split(\"'\")\n\t\tif (lst[1]) {\n\t\t\tconst lst2 = lst[1].split(' | ')\n\t\t\tif (lst2.length) {\n\t\t\t\tinfo.ANN.annheader = []\n\t\t\t\tfor (const s of lst2) {\n\t\t\t\t\tconst attr = { name: s }\n\t\t\t\t\tinfo.ANN.annheader.push(attr)\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\terrlst.push('no \" | \" joined annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t\t}\n\t\t} else {\n\t\t\terrlst.push('no single-quote enclosed annotation fields for ANN (snpEff annotation): ' + info.ANN.Description)\n\t\t}\n\t}\n\n\treturn [hasinfo ? info : null, hasformat ? format : null, sampleobjlst, errlst.length ? errlst : null]\n}\n\nexport function vcfparseline(line, vcf) {\n\t/*\n\tvcf, samples/info is generated by vcfparsemeta()\n\t\t.nochr BOOL\n\t\t.samples [ {} ]\n\t\t\t.name\n\t\t.info {}\n\t\t.format {}\n\n\treturn:\n\t\terror message STR\n\t\taltinvalid []\n\t\tmlst [ m ] one m per alt allele\n\t\t\tchr\n\t\t\tpos\n\t\t\tname\n\t\t\ttype\n\t\t\tref\n\t\t\talt\n\t\t\taltstr\n\t\t\tsampledata []\n\t\t\taltinfo\n\t*/\n\n\tconst lst = line.split('\\t')\n\tif (lst.length < 8) {\n\t\t// no good\n\t\treturn ['line has less than 8 fields', null, null]\n\t}\n\n\tconst rawpos = Number.parseInt(lst[2 - 1])\n\tif (!Number.isInteger(rawpos)) {\n\t\treturn ['invalid value for genomic position', null, null]\n\t}\n\n\tconst refallele = lst[4 - 1]\n\n\tconst m = {\n\t\tvcf_ID: lst[3 - 1],\n\t\tchr: (vcf.nochr ? 'chr' : '') + lst[1 - 1],\n\t\tpos: rawpos - 1,\n\t\tref: refallele,\n\t\t//refstr:refallele, // e.g. GA>GCC, ref:A, refstr:GA, \"refstr\" is required for matching in FORMAT\n\t\taltstr: lst[5 - 1],\n\t\talleles: [\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\tref allele only a placeholder, to be removed, this array only contains alt alleles\n\t\t\t\tthis is a must\n\t\t\t\talso allows GT allele index to work\n\t\t\t\t*/\n\t\t\t\tallele: refallele,\n\t\t\t\tsampledata: []\n\t\t\t}\n\t\t],\n\n\t\tinfo: {}, // locus info, do not contain allele info\n\n\t\tname: lst[3 - 1] == '.' ? null : lst[3 - 1]\n\t}\n\n\t// parse alt\n\tconst altinvalid = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a = {\n\t\t\tref: m.ref, // may be corrected just below!\n\t\t\tallele: alt,\n\t\t\t// 5078356.TATCAGAGAA.GGGAGGA keep original allele for matching with csq which hardcodes original allele\n\t\t\tallele_original: alt,\n\t\t\tsampledata: [],\n\t\t\t_m: m,\n\t\t\tinfo: {} // allele info, do not contain locus info\n\t\t}\n\t\tm.alleles.push(a)\n\t\tif (alt[0] == '<') {\n\t\t\t/*\n\t\t\tsymbolic allele, show text within <> as name\n\t\t\tFIXME match INFO\n\t\t\t*/\n\t\t\tconst tmp = alt.match(getallelename)\n\t\t\tif (!tmp) {\n\t\t\t\taltinvalid.push(alt)\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\ta.type = tmp[1]\n\n\t\t\ta.allele = tmp[1]\n\t\t\ta.issymbolicallele = true\n\t\t} else {\n\t\t\t// normal nucleotide\n\n\t\t\tconst [p, ref, alt] = correctRefAlt(m.pos, m.ref, a.allele)\n\t\t\ta.pos = p\n\t\t\ta.ref = ref\n\t\t\ta.allele = alt\n\t\t}\n\t}\n\n\tif (lst[9 - 1] && lst[10 - 1]) {\n\t\tparse_FORMAT2(lst, m, vcf)\n\t}\n\n\t/*\n\tremove ref allele so it only contain alternative alleles\n\tso that parse_INFO can safely apply Number=A fields to m.alleles\n\t*/\n\tm.alleles.shift()\n\n\t// info\n\tconst tmp = lst[8 - 1] == '.' ? [] : dissect_INFO(lst[8 - 1])\n\tlet badinfokeys = []\n\n\tif (vcf.info) {\n\t\tbadinfokeys = parse_INFO(tmp, m, vcf)\n\t} else {\n\t\t// vcf meta lines told nothing about INFO, do not parse\n\t\tm.info = tmp\n\t}\n\n\tconst mlst = []\n\tfor (const a of m.alleles) {\n\t\tconst m2 = {}\n\t\tfor (const k in m) {\n\t\t\tif (k != 'alleles') {\n\t\t\t\tm2[k] = m[k]\n\t\t\t}\n\t\t}\n\t\tfor (const k in a) {\n\t\t\tif (k == 'allele') {\n\t\t\t\tm2.alt = a[k]\n\t\t\t} else if (k == 'info') {\n\t\t\t\tm2.altinfo = a[k]\n\t\t\t} else {\n\t\t\t\tm2[k] = a[k]\n\t\t\t}\n\t\t}\n\t\tif (!m2.issymbolicallele && m2.alt != 'NON_REF') {\n\t\t\tm2.type = getVariantType(m2.ref, m2.alt)\n\t\t\t/*\n\t\t\t// valid alt allele, apply Dr. J's cool method\n\t\t\tconst [p,ref,alt]=correctRefAlt(m2.pos, m2.ref, m2.alt)\n\t\t\tm2.pos=p\n\t\t\tm2.ref=ref\n\t\t\tm2.alt=alt\n\t\t\t*/\n\t\t}\n\t\tmlst.push(m2)\n\t}\n\treturn [\n\t\tbadinfokeys.length ? 'unknown info keys: ' + badinfokeys.join(',') : null,\n\t\tmlst,\n\t\taltinvalid.length > 0 ? altinvalid : null\n\t]\n}\n\nfunction correctRefAlt(p, ref, alt) {\n\t// for oligos, always trim the last identical base\n\twhile (ref.length > 1 && alt.length > 1 && ref[ref.length - 1] == alt[alt.length - 1]) {\n\t\tref = ref.substr(0, ref.length - 1)\n\t\talt = alt.substr(0, alt.length - 1)\n\t}\n\t// move position up as long as first positions are equal\n\twhile (ref.length > 1 && alt.length > 1 && ref[0] == alt[0]) {\n\t\tref = ref.substr(1)\n\t\talt = alt.substr(1)\n\t\tp++\n\t}\n\treturn [p, ref, alt]\n}\n\nfunction parse_FORMAT2(lst, m, vcf) {\n\t/*\n\tm.alleles[0] is ref allele\n\n\teach allele:\n\t\t.ref\n\t\t.allele\n\t\t.allele_original\n\t\t.sampledata[] blank array\n\t*/\n\tconst formatfields = lst[9 - 1].split(':')\n\n\tfor (let _sampleidx = 9; _sampleidx < lst.length; _sampleidx++) {\n\t\t// for each sample\n\n\t\tconst valuelst = lst[_sampleidx].split(':')\n\t\t{\n\t\t\t// tell if this sample have any data in this line (variant), if .:., then skip\n\t\t\tlet none = true\n\t\t\tfor (const v of valuelst) {\n\t\t\t\tif (v != '.') {\n\t\t\t\t\tnone = false\n\t\t\t\t\tbreak\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (none) {\n\t\t\t\t// this sample has no format value\n\t\t\t\tcontinue\n\t\t\t}\n\t\t}\n\n\t\t/* should create an object of {format:value} of this sample\n\t\twith this object, for each alt allele this sample has,\n\t\tput a copy in m.allele[x].sampledata[]\n\t\t*/\n\n\t\tconst sampleidx = _sampleidx - 9\n\n\t\t/*\n\t\tfor each alt allele, initialize obj of this sample and store in this allele\n\t\tlater, to iterate over format fields and put in appropriate values\n\t\tnote that this sample may not actually have this allele\n\t\t*/\n\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\tconst sobj = {}\n\t\t\tif (vcf.samples && vcf.samples[sampleidx]) {\n\t\t\t\tfor (const k in vcf.samples[sampleidx]) {\n\t\t\t\t\tsobj[k] = vcf.samples[sampleidx][k]\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tsobj.name = 'missing_samplename_from_vcf_header'\n\t\t\t}\n\t\t\tm.alleles[i].sampledata.push({\n\t\t\t\tsampleobj: sobj\n\t\t\t})\n\t\t}\n\n\t\tfor (let fi = 0; fi < formatfields.length; fi++) {\n\t\t\t// for each field of this sample\n\n\t\t\tconst field = formatfields[fi]\n\t\t\tconst value = valuelst[fi]\n\t\t\tif (value == '.') {\n\t\t\t\t// no value for this field\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tif (field == 'GT') {\n\t\t\t\tconst splitter = value.indexOf('/') != -1 ? '/' : '|'\n\t\t\t\tlet gtsum = 0 // for calculating gtallref=true, old\n\t\t\t\tlet unknowngt = false // if any is '.', then won't calculate gtallref\n\t\t\t\tconst gtalleles = []\n\t\t\t\tfor (const i of value.split(splitter)) {\n\t\t\t\t\tif (i == '.') {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tconst j = Number.parseInt(i)\n\t\t\t\t\tif (Number.isNaN(j)) {\n\t\t\t\t\t\tunknowngt = true\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tgtsum += j\n\t\t\t\t\tconst ale = m.alleles[j]\n\t\t\t\t\tif (ale) {\n\t\t\t\t\t\tgtalleles.push(ale.allele)\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tlet gtallref = false\n\t\t\t\tif (!unknowngt) {\n\t\t\t\t\tgtallref = gtsum == 0\n\t\t\t\t}\n\n\t\t\t\tconst genotype = gtalleles.join(splitter)\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tconst ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1]\n\t\t\t\t\tms.GT = value\n\t\t\t\t\tms.genotype = genotype\n\t\t\t\t\tif (gtallref) {\n\t\t\t\t\t\tms.gtallref = true\n\t\t\t\t\t}\n\n\t\t\t\t\t// for mds vcf to drop out samples that do not have this alt allele\n\t\t\t\t\tms.__gtalleles = gtalleles\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\t// other data fields\n\t\t\tconst formatdesc = vcf.format ? vcf.format[field] : null\n\t\t\tif (!formatdesc) {\n\t\t\t\t// unspecified field, put to all alt alleles\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\n\t\t\tconst isinteger = formatdesc.Type == 'Integer'\n\t\t\tconst isfloat = formatdesc.Type == 'Float'\n\n\t\t\tif ((formatdesc.Number && formatdesc.Number == 'R') || field == 'AD') {\n\t\t\t\t/*\n\t\t\t\tper-allele value, including ref\n\t\t\t\tv4.1 has AD not with \"R\", must process as R\n\t\t\t\t*/\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.ref] = fvlst[0]\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\tif (formatdesc.Number && formatdesc.Number == 'A') {\n\t\t\t\t// per alt-allele value\n\t\t\t\tconst fvlst = value.split(',').map(i => {\n\t\t\t\t\tif (isinteger) return Number.parseInt(i)\n\t\t\t\t\tif (isfloat) return Number.parseFloat(i)\n\t\t\t\t\treturn i\n\t\t\t\t})\n\t\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\t\tif (fvlst[i - 1] != undefined) {\n\t\t\t\t\t\t// this allele has value\n\t\t\t\t\t\tconst m2 = m.alleles[i]\n\t\t\t\t\t\tconst m2s = m2.sampledata[m2.sampledata.length - 1]\n\t\t\t\t\t\t// use this allele's ref/alt (after nt trimming)\n\t\t\t\t\t\tm2s[field] = {}\n\t\t\t\t\t\tm2s[field][m2.allele] = fvlst[i - 1]\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tcontinue\n\t\t\t}\n\t\t\t// otherwise, append this field to all alt\n\t\t\tfor (let i = 1; i < m.alleles.length; i++) {\n\t\t\t\tm.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value\n\t\t\t}\n\t\t}\n\t}\n\n\t// compatible with old ds: make allele2readcount from AD\n\tfor (const a of m.alleles) {\n\t\tfor (const s of a.sampledata) {\n\t\t\tif (s.AD) {\n\t\t\t\ts.allele2readcount = {}\n\t\t\t\tfor (const k in s.AD) {\n\t\t\t\t\ts.allele2readcount[k] = s.AD[k]\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction tohash(s, hash) {\n\t/*\n\tparse INFO\n\t*/\n\tconst h = {},\n\t\terr = []\n\tlet prev = 0,\n\t\tprevdoublequote = false,\n\t\tk = null\n\tfor (let i = 0; i < s.length; i++) {\n\t\tif (s[i] == '\"') {\n\t\t\ti++\n\t\t\tconst thisstart = i\n\t\t\twhile (s[i] != '\"') {\n\t\t\t\ti++\n\t\t\t}\n\t\t\tif (k) {\n\t\t\t\th[k] = s.substring(thisstart, i)\n\t\t\t\tk = null\n\t\t\t} else {\n\t\t\t\terr.push('k undefined before double quotes')\n\t\t\t}\n\t\t\tprevdoublequote = true\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == '=') {\n\t\t\tk = s.substring(prev, i)\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t\tif (s[i] == ',') {\n\t\t\tif (prevdoublequote) {\n\t\t\t\tprevdoublequote = false\n\t\t\t} else {\n\t\t\t\tif (k) {\n\t\t\t\t\th[k] = s.substring(prev, i)\n\t\t\t\t\tk = null\n\t\t\t\t} else {\n\t\t\t\t\terr.push('k undefined')\n\t\t\t\t}\n\t\t\t}\n\t\t\tprev = i + 1\n\t\t\tcontinue\n\t\t}\n\t}\n\tif (k) {\n\t\th[k] = s.substring(prev, i)\n\t}\n\tif (h.ID) {\n\t\thash[h.ID] = h\n\t} else {\n\t\treturn 'no ID'\n\t}\n\tif (err.length) return err.join('\\n')\n}\n\nfunction parse_INFO(tmp, m, vcf) {\n\t/*\n\tthis function fills in both m.info{} and m.alleles[].info{}\n\n\tthe m.alleles[] will later be converted to [m], each carrying one alt allele\n\teach m will have .info{} for locus info, and .altinfo{} for alt allele info\n\n\t*/\n\n\tconst badinfokeys = []\n\n\tfor (const key in tmp) {\n\t\tif (vcf.info[key] == undefined) {\n\t\t\tbadinfokeys.push(key)\n\t\t\tcontinue\n\t\t}\n\n\t\tconst value = tmp[key]\n\n\t\t////////////////// hard-coded fields\n\n\t\tif (key == 'CSQ') {\n\t\t\tconst okay = parse_CSQ(value, vcf.info.CSQ.csqheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\t\tif (key == 'ANN') {\n\t\t\tconst okay = parse_ANN(value, vcf.info.ANN.annheader, m)\n\t\t\tif (!okay) {\n\t\t\t\tm.info[key] = value\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\t////////////////// end of hardcoded fields\n\n\t\tif (vcf.info[key].Type == 'Flag') {\n\t\t\t// flag has no value\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tconst __number = vcf.info[key].Number\n\t\tconst isinteger = vcf.info[key].Type == 'Integer'\n\t\tconst isfloat = vcf.info[key].Type == 'Float'\n\n\t\tif (__number == '0') {\n\t\t\t/*\n\t\t\tno value, should be a Flag\n\t\t\t*/\n\t\t\tm.info[key] = key\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'A') {\n\t\t\t/*\n\t\t\tper alt allele\n\t\t\t*/\n\t\t\tconst tt = value.split(',')\n\t\t\tfor (let j = 0; j < tt.length; j++) {\n\t\t\t\tif (m.alleles[j]) {\n\t\t\t\t\tm.alleles[j].info[key] = isinteger ? Number.parseInt(tt[j]) : isfloat ? Number.parseFloat(tt[j]) : tt[j]\n\t\t\t\t}\n\t\t\t}\n\t\t\tcontinue\n\t\t}\n\n\t\tif (__number == 'R') {\n\t\t\t/*\n\t\t\tFIXME \"R\" is not considered, m.alleles only contain alt, which .info{} for each\n\t\t\tthe current datastructure does not support info for ref allele!\n\t\t\t*/\n\t\t}\n\n\t\tif (__number == '1') {\n\t\t\t/*\n\t\t\tsingle value\n\t\t\t*/\n\t\t\tm.info[key] = isinteger ? Number.parseInt(value) : isfloat ? Number.parseFloat(value) : value\n\t\t\tcontinue\n\t\t}\n\n\t\tif (!value.split) {\n\t\t\t// unknown error\n\t\t\tcontinue\n\t\t}\n\n\t\t// number of values unknown, \"commas are permitted only as delimiters for lists of values\"\n\n\t\tconst lst = value.split(',') // value is always array!!\n\t\tif (isinteger) {\n\t\t\tm.info[key] = lst.map(Number.parseInt)\n\t\t} else if (isfloat) {\n\t\t\tm.info[key] = lst.map(Number.parseFloat)\n\t\t} else {\n\t\t\tm.info[key] = lst\n\t\t}\n\t}\n\treturn badinfokeys\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["tmp", "alt", "i"]
7
+ }
@@ -0,0 +1,17 @@
1
+ import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from "./common.js";
2
+ function getVariantType(ref, alt) {
3
+ if (ref.length == 1 && alt.length == 1) {
4
+ if (alt == ".") {
5
+ return mclassdeletion;
6
+ }
7
+ return mclasssnv;
8
+ }
9
+ if (ref.length == alt.length) return mclassmnv;
10
+ if (ref.length < alt.length) return mclassinsertion;
11
+ if (ref.length > alt.length) return mclassdeletion;
12
+ return mclassnonstandard;
13
+ }
14
+ export {
15
+ getVariantType
16
+ };
17
+ //# sourceMappingURL=vcf.type.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../src/vcf.type.js"],
4
+ "sourcesContent": ["import { mclassdeletion, mclasssnv, mclassmnv, mclassinsertion, mclassnonstandard } from './common.js'\n\nexport function getVariantType(ref, alt) {\n\tif (ref.length == 1 && alt.length == 1) {\n\t\t// both alleles length of 1\n\t\tif (alt == '.') {\n\t\t\t// alt is missing\n\t\t\treturn mclassdeletion\n\t\t}\n\t\t// snv\n\t\treturn mclasssnv\n\t}\n\tif (ref.length == alt.length) return mclassmnv\n\t// FIXME only when empty length of one allele\n\tif (ref.length < alt.length) return mclassinsertion\n\tif (ref.length > alt.length) return mclassdeletion\n\treturn mclassnonstandard\n}\n"],
5
+ "mappings": "AAAA,SAAS,gBAAgB,WAAW,WAAW,iBAAiB,yBAAyB;AAElF,SAAS,eAAe,KAAK,KAAK;AACxC,MAAI,IAAI,UAAU,KAAK,IAAI,UAAU,GAAG;AAEvC,QAAI,OAAO,KAAK;AAEf,aAAO;AAAA,IACR;AAEA,WAAO;AAAA,EACR;AACA,MAAI,IAAI,UAAU,IAAI,OAAQ,QAAO;AAErC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,MAAI,IAAI,SAAS,IAAI,OAAQ,QAAO;AACpC,SAAO;AACR;",
6
+ "names": []
7
+ }
package/package.json CHANGED
@@ -1,30 +1,39 @@
1
1
  {
2
2
  "name": "@sjcrh/proteinpaint-shared",
3
- "version": "2.186.0",
3
+ "version": "2.188.0",
4
4
  "description": "ProteinPaint code that is shared between server and client-side workspaces",
5
5
  "type": "module",
6
- "main": "src/index.js",
6
+ "main": "dist/src/index.js",
7
7
  "imports": {
8
8
  "#types": "@sjcrh/proteinpaint-types",
9
- "#types/*": "@sjcrh/proteinpaint-types/*"
9
+ "#types/*": "@sjcrh/proteinpaint-types/*",
10
+ "#types/checkers": "@sjcrh/proteinpaint-types/checkers"
10
11
  },
12
+ "//": "all export aliases are meant for runtime code, except for devTs-aliased subpaths",
11
13
  "exports": {
12
- ".": "./src/index.js",
13
- "./*.ts": "./src/*.ts_SHOULD_BE_js",
14
- "./*": "./src/*"
14
+ ".": "./dist/src/index.js",
15
+ "./*.ts": "./*.ts_SHOULD_BE_js",
16
+ "./constants/*.ts": "./dist/constants/*.ts_SHOULD_BE_js",
17
+ "./*": "./dist/src/*",
18
+ "./constants/*": "./dist/constants/*",
19
+ "./devTs": "./devTs.ts",
20
+ "./devTs/*": "./constants/*"
15
21
  },
16
22
  "scripts": {
17
- "build": "esbuild src/*.ts --platform=node --outdir=src/ --format=esm && prettier --no-semi --use-tabs --write src/*.js",
18
- "prepack": "npm run build",
23
+ "build": "esbuild src/*.* constants/*.ts --platform=node --outdir=dist --format=esm --sourcemap",
24
+ "prepack": "rm -rf dist && npm run build && tsc --sourcemap --skipLibCheck --preserveWatchOutput",
25
+ "dev": "rm -rf dist && concurrently 'npm run build -- --watch' 'npx tsc --watch --skipLibCheck --preserveWatchOutput'",
19
26
  "pretest": "mkdir -p test && node emitImports > test/internals-test.ts",
20
- "spec:coverage": "node test/relevant.js",
21
27
  "test": "tsx test/internals-test.ts",
22
- "test-x": "ls src/test/*.spec* | xargs -I % bash -c '{ tsx %; sleep 0.001; }'"
28
+ "test-x": "ls src/test/*.spec* | xargs -I % bash -c '{ tsx %; sleep 0.001; }'",
29
+ "spec:coverage": "node test/relevant.js"
23
30
  },
24
31
  "author": "",
25
32
  "license": "ISC",
26
33
  "files": [
27
- "src/*.js"
34
+ "constants",
35
+ "devTs.ts",
36
+ "dist"
28
37
  ],
29
38
  "devDependencies": {
30
39
  "esbuild": "^0.25.9"
package/src/bulk.cnv.js DELETED
@@ -1,86 +0,0 @@
1
- ////////////////////////////////////
2
- //
3
- // shared between client and server
4
- //
5
- ////////////////////////////////////
6
-
7
- import * as common from "./common.js"
8
- import * as bulk from "./bulk.js"
9
-
10
- export function parseheader(line, flag) {
11
- const header = line.toLowerCase().split("\t")
12
- if (header.length <= 1) return "invalid file header for CNV"
13
- const htry = (...lst) => {
14
- for (const i of lst) {
15
- const j = header.indexOf(i)
16
- if (j != -1) return j
17
- }
18
- return -1
19
- }
20
- let i = htry("gene")
21
- if (i == -1) return "gene missing from header"
22
- header[i] = "gene"
23
- i = htry("cnv")
24
- if (i == -1) return "CNV missing from header"
25
- header[i] = "cnv"
26
- i = htry("sample", "sample_name", "tumor_sample_barcode")
27
- if (i != -1) header[i] = "sample"
28
- i = htry("patient", "donor", "target_case_id")
29
- if (i != -1) header[i] = "patient"
30
- i = htry("disease")
31
- if (i != -1) header[i] = "disease"
32
- i = htry("origin")
33
- if (i != -1) header[i] = "origin"
34
- i = htry("sampletype", "sample type", "sample_type")
35
- if (i != -1) header[i] = "sampletype"
36
- flag.cnv.header = header
37
- flag.cnv.loaded = true
38
- return false
39
- }
40
-
41
- export function parseline(i, line, flag) {
42
- if (line == "" || line[0] == "#") return
43
- const lst = line.split("\t")
44
- const m = {}
45
- for (let j = 0; j < flag.cnv.header.length; j++) {
46
- m[flag.cnv.header[j]] = lst[j]
47
- }
48
- if (!m.gene) {
49
- flag.cnv.badlines.push([i, "missing gene", lst])
50
- return
51
- }
52
- if (!m.cnv) {
53
- flag.cnv.badlines.push([i, "missing cnv value", lst])
54
- return
55
- }
56
- const value = m.cnv.toLowerCase()
57
- switch (value) {
58
- case "amplification":
59
- case "gain":
60
- m.class = common.mclasscnvgain
61
- break
62
- case "deletion":
63
- case "loss":
64
- m.class = common.mclasscnvloss
65
- break
66
- case "loh":
67
- m.class = common.mclasscnvloh
68
- break
69
- default:
70
- flag.cnv.badlines.push([i, "invalid cnv value: " + m.cnv, lst])
71
- m.class = null
72
- }
73
- if (!m.class) {
74
- return
75
- }
76
- if (bulk.parsesample(m, flag, i, lst, flag.cnv.badlines)) {
77
- return
78
- }
79
- m.dt = common.dtcnv
80
- flag.good++
81
- const n = flag.geneToUpper ? m.gene.toUpperCase() : m.gene
82
- if (!(n in flag.data)) {
83
- flag.data[n] = []
84
- }
85
- flag.data[n].push(m)
86
- }