@sjcrh/proteinpaint-shared 2.188.1 → 2.190.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 (88) hide show
  1. package/README.md +14 -10
  2. package/dist/src/bulk.cnv.d.ts +2 -0
  3. package/dist/src/bulk.cnv.js +1 -1
  4. package/dist/src/bulk.cnv.js.map +3 -3
  5. package/dist/src/bulk.d.ts +56 -0
  6. package/dist/src/bulk.del.d.ts +2 -0
  7. package/dist/src/bulk.del.js +2 -2
  8. package/dist/src/bulk.del.js.map +3 -3
  9. package/dist/src/bulk.itd.d.ts +2 -0
  10. package/dist/src/bulk.itd.js +2 -2
  11. package/dist/src/bulk.itd.js.map +3 -3
  12. package/dist/src/bulk.js +1 -2
  13. package/dist/src/bulk.js.map +3 -3
  14. package/dist/src/bulk.snv.d.ts +2 -0
  15. package/dist/src/bulk.snv.js +3 -3
  16. package/dist/src/bulk.snv.js.map +3 -3
  17. package/dist/src/bulk.sv.d.ts +3 -0
  18. package/dist/src/bulk.sv.js +1 -1
  19. package/dist/src/bulk.sv.js.map +3 -3
  20. package/dist/src/bulk.svjson.d.ts +2 -0
  21. package/dist/src/bulk.svjson.js +3 -3
  22. package/dist/src/bulk.svjson.js.map +3 -3
  23. package/dist/src/bulk.trunc.d.ts +2 -0
  24. package/dist/src/bulk.trunc.js +1 -1
  25. package/dist/src/bulk.trunc.js.map +3 -3
  26. package/dist/src/clustering.d.ts +10 -0
  27. package/dist/src/clustering.js.map +1 -1
  28. package/dist/src/common.d.ts +431 -0
  29. package/dist/src/common.js +62 -22
  30. package/dist/src/common.js.map +3 -3
  31. package/dist/src/compute.percentile.d.ts +1 -0
  32. package/dist/src/compute.percentile.js.map +1 -1
  33. package/dist/src/fetch-helpers.d.ts +10 -0
  34. package/dist/src/fetch-helpers.js +17 -18
  35. package/dist/src/fetch-helpers.js.map +3 -3
  36. package/dist/src/fileSize.d.ts +1 -0
  37. package/dist/src/fileSize.js.map +1 -1
  38. package/dist/src/hash.d.ts +1 -0
  39. package/dist/src/hash.js.map +1 -1
  40. package/dist/src/helpers.d.ts +14 -0
  41. package/dist/src/helpers.js +3 -4
  42. package/dist/src/helpers.js.map +3 -3
  43. package/dist/src/index.d.ts +1 -2
  44. package/dist/src/index.js +1 -2
  45. package/dist/src/index.js.map +2 -2
  46. package/dist/src/mds3tk.d.ts +6 -0
  47. package/dist/src/mds3tk.js.map +3 -3
  48. package/dist/src/roundValue.d.ts +14 -0
  49. package/dist/src/roundValue.js.map +1 -1
  50. package/dist/src/scatter.d.ts +8 -0
  51. package/dist/src/scatter.js +17 -0
  52. package/dist/src/scatter.js.map +7 -0
  53. package/dist/src/termdb.bins.d.ts +5 -0
  54. package/dist/src/termdb.bins.js +1 -1
  55. package/dist/src/termdb.bins.js.map +3 -3
  56. package/dist/src/termdb.initbinconfig.d.ts +1 -0
  57. package/dist/src/termdb.initbinconfig.js +1 -1
  58. package/dist/src/termdb.initbinconfig.js.map +3 -3
  59. package/dist/src/termdb.usecase.d.ts +2 -0
  60. package/dist/src/termdb.usecase.js.map +3 -3
  61. package/dist/src/terms.d.ts +29 -52
  62. package/dist/src/terms.js +71 -56
  63. package/dist/src/terms.js.map +3 -3
  64. package/dist/src/tree.d.ts +1 -0
  65. package/dist/src/tree.js.map +3 -3
  66. package/dist/src/vcf.ann.d.ts +1 -0
  67. package/dist/src/vcf.ann.js +1 -2
  68. package/dist/src/vcf.ann.js.map +3 -3
  69. package/dist/src/vcf.csq.d.ts +1 -0
  70. package/dist/src/vcf.csq.js +1 -2
  71. package/dist/src/vcf.csq.js.map +3 -3
  72. package/dist/src/vcf.d.ts +2 -0
  73. package/dist/src/vcf.info.d.ts +1 -0
  74. package/dist/src/vcf.info.js.map +1 -1
  75. package/dist/src/vcf.js +47 -42
  76. package/dist/src/vcf.js.map +4 -4
  77. package/dist/src/vcf.type.d.ts +1 -0
  78. package/dist/src/vcf.type.js.map +1 -1
  79. package/package.json +21 -20
  80. package/constants/AiHisto.ts +0 -27
  81. package/constants/README.md +0 -11
  82. package/devTs.ts +0 -3
  83. package/dist/constants/AiHisto.d.ts +0 -23
  84. package/dist/constants/AiHisto.js +0 -31
  85. package/dist/constants/AiHisto.js.map +0 -7
  86. package/dist/src/aiHisto.d.ts +0 -5
  87. package/dist/src/aiHisto.js +0 -15
  88. package/dist/src/aiHisto.js.map +0 -7
package/dist/src/vcf.js CHANGED
@@ -9,7 +9,12 @@ for (const k in mclass) {
9
9
  mclasslabel2key[mclass[k].label.toUpperCase()] = k;
10
10
  }
11
11
  function vcfparsemeta(lines) {
12
- let sample = [], errlst = [], info = {}, hasinfo = false, format = {}, hasformat = false;
12
+ let sample = [];
13
+ const errlst = [];
14
+ const info = {};
15
+ let hasinfo = false;
16
+ const format = {};
17
+ let hasformat = false;
13
18
  for (const line of lines) {
14
19
  if (!line.startsWith("#")) {
15
20
  continue;
@@ -207,7 +212,7 @@ function parse_FORMAT2(lst, m, vcf) {
207
212
  }
208
213
  }
209
214
  const sampleidx = _sampleidx - 9;
210
- for (let i2 = 1; i2 < m.alleles.length; i2++) {
215
+ for (let i = 1; i < m.alleles.length; i++) {
211
216
  const sobj = {};
212
217
  if (vcf.samples && vcf.samples[sampleidx]) {
213
218
  for (const k in vcf.samples[sampleidx]) {
@@ -216,7 +221,7 @@ function parse_FORMAT2(lst, m, vcf) {
216
221
  } else {
217
222
  sobj.name = "missing_samplename_from_vcf_header";
218
223
  }
219
- m.alleles[i2].sampledata.push({
224
+ m.alleles[i].sampledata.push({
220
225
  sampleobj: sobj
221
226
  });
222
227
  }
@@ -231,12 +236,12 @@ function parse_FORMAT2(lst, m, vcf) {
231
236
  let gtsum = 0;
232
237
  let unknowngt = false;
233
238
  const gtalleles = [];
234
- for (const i2 of value.split(splitter)) {
235
- if (i2 == ".") {
239
+ for (const i of value.split(splitter)) {
240
+ if (i == ".") {
236
241
  unknowngt = true;
237
242
  continue;
238
243
  }
239
- const j = Number.parseInt(i2);
244
+ const j = Number.parseInt(i);
240
245
  if (Number.isNaN(j)) {
241
246
  unknowngt = true;
242
247
  continue;
@@ -252,8 +257,8 @@ function parse_FORMAT2(lst, m, vcf) {
252
257
  gtallref = gtsum == 0;
253
258
  }
254
259
  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];
260
+ for (let i = 1; i < m.alleles.length; i++) {
261
+ const ms = m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1];
257
262
  ms.GT = value;
258
263
  ms.genotype = genotype;
259
264
  if (gtallref) {
@@ -265,48 +270,48 @@ function parse_FORMAT2(lst, m, vcf) {
265
270
  }
266
271
  const formatdesc = vcf.format ? vcf.format[field] : null;
267
272
  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;
273
+ for (let i = 1; i < m.alleles.length; i++) {
274
+ m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value;
270
275
  }
271
276
  continue;
272
277
  }
273
278
  const isinteger = formatdesc.Type == "Integer";
274
279
  const isfloat = formatdesc.Type == "Float";
275
280
  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;
281
+ const fvlst = value.split(",").map((i) => {
282
+ if (isinteger) return Number.parseInt(i);
283
+ if (isfloat) return Number.parseFloat(i);
284
+ return i;
280
285
  });
281
- for (let i2 = 1; i2 < m.alleles.length; i2++) {
282
- if (fvlst[i2] != void 0) {
283
- const m2 = m.alleles[i2];
286
+ for (let i = 1; i < m.alleles.length; i++) {
287
+ if (fvlst[i] != void 0) {
288
+ const m2 = m.alleles[i];
284
289
  const m2s = m2.sampledata[m2.sampledata.length - 1];
285
290
  m2s[field] = {};
286
291
  m2s[field][m2.ref] = fvlst[0];
287
- m2s[field][m2.allele] = fvlst[i2];
292
+ m2s[field][m2.allele] = fvlst[i];
288
293
  }
289
294
  }
290
295
  continue;
291
296
  }
292
297
  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;
298
+ const fvlst = value.split(",").map((i) => {
299
+ if (isinteger) return Number.parseInt(i);
300
+ if (isfloat) return Number.parseFloat(i);
301
+ return i;
297
302
  });
298
- for (let i2 = 1; i2 < m.alleles.length; i2++) {
299
- if (fvlst[i2 - 1] != void 0) {
300
- const m2 = m.alleles[i2];
303
+ for (let i = 1; i < m.alleles.length; i++) {
304
+ if (fvlst[i - 1] != void 0) {
305
+ const m2 = m.alleles[i];
301
306
  const m2s = m2.sampledata[m2.sampledata.length - 1];
302
307
  m2s[field] = {};
303
- m2s[field][m2.allele] = fvlst[i2 - 1];
308
+ m2s[field][m2.allele] = fvlst[i - 1];
304
309
  }
305
310
  }
306
311
  continue;
307
312
  }
308
- for (let i2 = 1; i2 < m.alleles.length; i2++) {
309
- m.alleles[i2].sampledata[m.alleles[i2].sampledata.length - 1][field] = value;
313
+ for (let i = 1; i < m.alleles.length; i++) {
314
+ m.alleles[i].sampledata[m.alleles[i].sampledata.length - 1][field] = value;
310
315
  }
311
316
  }
312
317
  }
@@ -324,15 +329,15 @@ function parse_FORMAT2(lst, m, vcf) {
324
329
  function tohash(s, hash) {
325
330
  const h = {}, err = [];
326
331
  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++;
332
+ for (let i = 0; i < s.length; i++) {
333
+ if (s[i] == '"') {
334
+ i++;
335
+ const thisstart = i;
336
+ while (s[i] != '"') {
337
+ i++;
333
338
  }
334
339
  if (k) {
335
- h[k] = s.substring(thisstart, i2);
340
+ h[k] = s.substring(thisstart, i);
336
341
  k = null;
337
342
  } else {
338
343
  err.push("k undefined before double quotes");
@@ -340,28 +345,28 @@ function tohash(s, hash) {
340
345
  prevdoublequote = true;
341
346
  continue;
342
347
  }
343
- if (s[i2] == "=") {
344
- k = s.substring(prev, i2);
345
- prev = i2 + 1;
348
+ if (s[i] == "=") {
349
+ k = s.substring(prev, i);
350
+ prev = i + 1;
346
351
  continue;
347
352
  }
348
- if (s[i2] == ",") {
353
+ if (s[i] == ",") {
349
354
  if (prevdoublequote) {
350
355
  prevdoublequote = false;
351
356
  } else {
352
357
  if (k) {
353
- h[k] = s.substring(prev, i2);
358
+ h[k] = s.substring(prev, i);
354
359
  k = null;
355
360
  } else {
356
361
  err.push("k undefined");
357
362
  }
358
363
  }
359
- prev = i2 + 1;
364
+ prev = i + 1;
360
365
  continue;
361
366
  }
362
367
  }
363
368
  if (k) {
364
- h[k] = s.substring(prev, i);
369
+ h[k] = s.substring(prev);
365
370
  }
366
371
  if (h.ID) {
367
372
  hash[h.ID] = h;
@@ -1,7 +1,7 @@
1
1
  {
2
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"]
3
+ "sources": ["../../src/vcf.ts"],
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\tconst errlst: string[] = []\n\tconst info: Record<string, any> = {}\n\tlet hasinfo = false\n\tconst format: Record<string, any> = {}\n\tlet hasformat = 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: any[] = []\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: Record<string, any> = {\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: string[] = []\n\tfor (const alt of lst[5 - 1].split(',')) {\n\t\tconst a: Record<string, any> = {\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: string[] = []\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: any[] = []\n\tfor (const a of m.alleles) {\n\t\tconst m2: Record<string, any> = {}\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: Record<string, any> = {}\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: string[] = []\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: Record<string, any> = {},\n\t\terr: string[] = []\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)\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: string[] = []\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"]
7
7
  }
@@ -0,0 +1 @@
1
+ export declare function getVariantType(ref: any, alt: any): "X" | "snv" | "mnv" | "insertion" | "deletion";
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../../src/vcf.type.js"],
3
+ "sources": ["../../src/vcf.type.ts"],
4
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
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
6
  "names": []
package/package.json CHANGED
@@ -1,43 +1,44 @@
1
1
  {
2
2
  "name": "@sjcrh/proteinpaint-shared",
3
- "version": "2.188.1",
3
+ "version": "2.190.0",
4
4
  "description": "ProteinPaint code that is shared between server and client-side workspaces",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
7
7
  "imports": {
8
8
  "#types": "@sjcrh/proteinpaint-types",
9
- "#types/*": "@sjcrh/proteinpaint-types/*",
10
- "#types/checkers": "@sjcrh/proteinpaint-types/checkers"
9
+ "#types/*": "@sjcrh/proteinpaint-types/*"
11
10
  },
12
- "//": "all export aliases below are meant for runtime code, except for devTs-aliased subpaths",
11
+ "//": "all export aliases below are meant for runtime code, except for the devTs-aliased subpath",
13
12
  "exports": {
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/*"
13
+ ".": {
14
+ "sjpp/dev": "./src/index.ts",
15
+ "default": "./dist/src/index.js"
16
+ },
17
+ "./*.ts": {
18
+ "sjpp/dev": "./src/*.ts",
19
+ "default": "./*.ts_SHOULD_BE_js"
20
+ },
21
+ "./*": {
22
+ "sjpp/dev": "./src/*",
23
+ "default": "./dist/src/*"
24
+ }
21
25
  },
22
26
  "scripts": {
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'",
27
+ "ts2js": "esbuild src/*.* src/**/*.* --platform=node --outdir=dist/src --format=esm --sourcemap",
28
+ "build": "rm -rf dist && npm run ts2js && rm -rf dist/**/*.spec.* dist/**/test && tsc --sourcemap --skipLibCheck",
29
+ "prepack": "npm run build",
30
+ "dev0": "rm -rf dist && 'npx tsc --watch --skipLibCheck --preserveWatchOutput'",
31
+ "dev": "echo '--- now using raw shared/utils/src exports under conditions=sjpp/dev ---\n'",
26
32
  "pretest": "mkdir -p test && node emitImports > test/internals-test.ts",
27
- "test": "tsx test/internals-test.ts",
33
+ "test": "tsx --conditions=sjpp/dev test/internals-test.ts",
28
34
  "test-x": "ls src/test/*.spec* | xargs -I % bash -c '{ tsx %; sleep 0.001; }'",
29
35
  "spec:coverage": "node test/relevant.js"
30
36
  },
31
37
  "author": "",
32
38
  "license": "ISC",
33
39
  "files": [
34
- "constants",
35
- "devTs.ts",
36
40
  "dist"
37
41
  ],
38
- "devDependencies": {
39
- "esbuild": "^0.25.9"
40
- },
41
42
  "repository": {
42
43
  "type": "git",
43
44
  "url": "https://github.com/stjude/proteinpaint",
@@ -1,27 +0,0 @@
1
- export enum FlagStatus {
2
- Normal = 0,
3
- Skipped = 1,
4
- Flagged = 2,
5
- Deleted = 3
6
- }
7
-
8
- export enum FeaturePrefixes {
9
- Star = 'annotation-star-',
10
- Square = 'annotation-square-',
11
- Border = 'annotation-border-',
12
- PredBorder = 'prediction-border-'
13
- }
14
-
15
- export const SelectionPrefixes = {
16
- TileSelection: 'ts_',
17
- Prediction: 'pred_',
18
- Annotation: 'anno_'
19
- } as const
20
-
21
- export type SelectionPrefixValues = (typeof SelectionPrefixes)[keyof typeof SelectionPrefixes]
22
-
23
- export const FlagStatusMessages = {
24
- [FlagStatus.Normal]: '',
25
- [FlagStatus.Skipped]: '(Skipped)',
26
- [FlagStatus.Flagged]: '(Flagged)'
27
- }
@@ -1,11 +0,0 @@
1
- # Shared Constants
2
-
3
- The goal of the `constants` code is to allow shared/types code to be able to import type definitions
4
- from shared/utils with no bundling or tsc compilation issues. Ideally, there would be a separate
5
- `shared/constants` workspace. However, due to time constraints and effort required to set up a
6
- new workspace, this `shared/utils/constants` directory was created instead.
7
-
8
- The code files in proteinpaint/shared/utils/constants:
9
- - typescript files
10
- - must have no imports from outside this folder, to prevent cyclical references/imports that crash bundling and/or tsc compilation
11
- - must export constants that can be transitively exported to devTs.ts file and shared/utils/src/index.js
package/devTs.ts DELETED
@@ -1,3 +0,0 @@
1
- // please list in alphanumeric order for readability
2
- // use .ts file extension for all code files below
3
- export * from './constants/AiHisto.ts'
@@ -1,23 +0,0 @@
1
- export declare enum FlagStatus {
2
- Normal = 0,
3
- Skipped = 1,
4
- Flagged = 2,
5
- Deleted = 3
6
- }
7
- export declare enum FeaturePrefixes {
8
- Star = "annotation-star-",
9
- Square = "annotation-square-",
10
- Border = "annotation-border-",
11
- PredBorder = "prediction-border-"
12
- }
13
- export declare const SelectionPrefixes: {
14
- readonly TileSelection: "ts_";
15
- readonly Prediction: "pred_";
16
- readonly Annotation: "anno_";
17
- };
18
- export type SelectionPrefixValues = (typeof SelectionPrefixes)[keyof typeof SelectionPrefixes];
19
- export declare const FlagStatusMessages: {
20
- 0: string;
21
- 1: string;
22
- 2: string;
23
- };
@@ -1,31 +0,0 @@
1
- var FlagStatus = /* @__PURE__ */ ((FlagStatus2) => {
2
- FlagStatus2[FlagStatus2["Normal"] = 0] = "Normal";
3
- FlagStatus2[FlagStatus2["Skipped"] = 1] = "Skipped";
4
- FlagStatus2[FlagStatus2["Flagged"] = 2] = "Flagged";
5
- FlagStatus2[FlagStatus2["Deleted"] = 3] = "Deleted";
6
- return FlagStatus2;
7
- })(FlagStatus || {});
8
- var FeaturePrefixes = /* @__PURE__ */ ((FeaturePrefixes2) => {
9
- FeaturePrefixes2["Star"] = "annotation-star-";
10
- FeaturePrefixes2["Square"] = "annotation-square-";
11
- FeaturePrefixes2["Border"] = "annotation-border-";
12
- FeaturePrefixes2["PredBorder"] = "prediction-border-";
13
- return FeaturePrefixes2;
14
- })(FeaturePrefixes || {});
15
- const SelectionPrefixes = {
16
- TileSelection: "ts_",
17
- Prediction: "pred_",
18
- Annotation: "anno_"
19
- };
20
- const FlagStatusMessages = {
21
- [0 /* Normal */]: "",
22
- [1 /* Skipped */]: "(Skipped)",
23
- [2 /* Flagged */]: "(Flagged)"
24
- };
25
- export {
26
- FeaturePrefixes,
27
- FlagStatus,
28
- FlagStatusMessages,
29
- SelectionPrefixes
30
- };
31
- //# sourceMappingURL=AiHisto.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../constants/AiHisto.ts"],
4
- "sourcesContent": ["export enum FlagStatus {\n\tNormal = 0,\n\tSkipped = 1,\n\tFlagged = 2,\n\tDeleted = 3\n}\n\nexport enum FeaturePrefixes {\n\tStar = 'annotation-star-',\n\tSquare = 'annotation-square-',\n\tBorder = 'annotation-border-',\n\tPredBorder = 'prediction-border-'\n}\n\nexport const SelectionPrefixes = {\n\tTileSelection: 'ts_',\n\tPrediction: 'pred_',\n\tAnnotation: 'anno_'\n} as const\n\nexport type SelectionPrefixValues = (typeof SelectionPrefixes)[keyof typeof SelectionPrefixes]\n\nexport const FlagStatusMessages = {\n\t[FlagStatus.Normal]: '',\n\t[FlagStatus.Skipped]: '(Skipped)',\n\t[FlagStatus.Flagged]: '(Flagged)'\n}\n"],
5
- "mappings": "AAAO,IAAK,aAAL,kBAAKA,gBAAL;AACN,EAAAA,wBAAA,YAAS,KAAT;AACA,EAAAA,wBAAA,aAAU,KAAV;AACA,EAAAA,wBAAA,aAAU,KAAV;AACA,EAAAA,wBAAA,aAAU,KAAV;AAJW,SAAAA;AAAA,GAAA;AAOL,IAAK,kBAAL,kBAAKC,qBAAL;AACN,EAAAA,iBAAA,UAAO;AACP,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,YAAS;AACT,EAAAA,iBAAA,gBAAa;AAJF,SAAAA;AAAA,GAAA;AAOL,MAAM,oBAAoB;AAAA,EAChC,eAAe;AAAA,EACf,YAAY;AAAA,EACZ,YAAY;AACb;AAIO,MAAM,qBAAqB;AAAA,EACjC,CAAC,cAAiB,GAAG;AAAA,EACrB,CAAC,eAAkB,GAAG;AAAA,EACtB,CAAC,eAAkB,GAAG;AACvB;",
6
- "names": ["FlagStatus", "FeaturePrefixes"]
7
- }
@@ -1,5 +0,0 @@
1
- import { type TileSelection } from '@sjcrh/proteinpaint-types';
2
- import type { FeaturePrefixes, SelectionPrefixValues } from '../constants/AiHisto.js';
3
- export declare function createSelectionID(prefix: SelectionPrefixValues, coordinates: [number, number]): string;
4
- export declare function checkSelectionType(tileSelection: TileSelection, suspectedPrefix: SelectionPrefixValues): boolean;
5
- export declare function createFeatureID(featurePrefix: FeaturePrefixes, coords: [number, number]): string;
@@ -1,15 +0,0 @@
1
- function createSelectionID(prefix, coordinates) {
2
- return prefix + JSON.stringify(coordinates);
3
- }
4
- function checkSelectionType(tileSelection, suspectedPrefix) {
5
- return tileSelection.id.startsWith(suspectedPrefix);
6
- }
7
- function createFeatureID(featurePrefix, coords) {
8
- return featurePrefix + JSON.stringify(coords);
9
- }
10
- export {
11
- checkSelectionType,
12
- createFeatureID,
13
- createSelectionID
14
- };
15
- //# sourceMappingURL=aiHisto.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/aiHisto.ts"],
4
- "sourcesContent": ["import { type TileSelection } from '@sjcrh/proteinpaint-types'\nimport type { FeaturePrefixes, SelectionPrefixValues } from '../constants/AiHisto.js'\n\nexport function createSelectionID(prefix: SelectionPrefixValues, coordinates: [number, number]): string {\n\treturn prefix + JSON.stringify(coordinates)\n}\n\nexport function checkSelectionType(tileSelection: TileSelection, suspectedPrefix: SelectionPrefixValues): boolean {\n\treturn tileSelection.id.startsWith(suspectedPrefix)\n}\n\nexport function createFeatureID(featurePrefix: FeaturePrefixes, coords: [number, number]) {\n\treturn featurePrefix + JSON.stringify(coords)\n}\n"],
5
- "mappings": "AAGO,SAAS,kBAAkB,QAA+B,aAAuC;AACvG,SAAO,SAAS,KAAK,UAAU,WAAW;AAC3C;AAEO,SAAS,mBAAmB,eAA8B,iBAAiD;AACjH,SAAO,cAAc,GAAG,WAAW,eAAe;AACnD;AAEO,SAAS,gBAAgB,eAAgC,QAA0B;AACzF,SAAO,gBAAgB,KAAK,UAAU,MAAM;AAC7C;",
6
- "names": []
7
- }