igv 3.2.5 → 3.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/igv.js CHANGED
@@ -10952,7 +10952,7 @@
10952
10952
  return list;
10953
10953
  }
10954
10954
 
10955
- /*! @license DOMPurify 3.2.4 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.4/LICENSE */
10955
+ /*! @license DOMPurify 3.2.5 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.5/LICENSE */
10956
10956
 
10957
10957
  const {
10958
10958
  entries,
@@ -11012,6 +11012,9 @@
11012
11012
  */
11013
11013
  function unapply(func) {
11014
11014
  return function (thisArg) {
11015
+ if (thisArg instanceof RegExp) {
11016
+ thisArg.lastIndex = 0;
11017
+ }
11015
11018
  for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
11016
11019
  args[_key - 1] = arguments[_key];
11017
11020
  }
@@ -11250,7 +11253,7 @@
11250
11253
  function createDOMPurify() {
11251
11254
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
11252
11255
  const DOMPurify = root => createDOMPurify(root);
11253
- DOMPurify.version = '3.2.4';
11256
+ DOMPurify.version = '3.2.5';
11254
11257
  DOMPurify.removed = [];
11255
11258
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
11256
11259
  // Not running in a browser, provide a factory function
@@ -11855,7 +11858,7 @@
11855
11858
  allowedTags: ALLOWED_TAGS
11856
11859
  });
11857
11860
  /* Detect mXSS attempts abusing namespace confusion */
11858
- if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w]/g, currentNode.innerHTML) && regExpTest(/<[/\w]/g, currentNode.textContent)) {
11861
+ if (currentNode.hasChildNodes() && !_isNode(currentNode.firstElementChild) && regExpTest(/<[/\w!]/g, currentNode.innerHTML) && regExpTest(/<[/\w!]/g, currentNode.textContent)) {
11859
11862
  _forceRemove(currentNode);
11860
11863
  return true;
11861
11864
  }
@@ -16349,7 +16352,10 @@
16349
16352
  }
16350
16353
  } else {
16351
16354
  // All directives that could change the format, and thus decoder, should have been read by now.
16352
- this.setDecoder(header.format);
16355
+ // Set the decoder, unless it is explicitly set in the track configuration (not common)
16356
+ if(!this.config.decode) {
16357
+ this.setDecoder(header.format);
16358
+ }
16353
16359
 
16354
16360
  // If the line can be parsed as a feature assume we are beyond the header, if any
16355
16361
  const tokens = line.split(this.delimiter || "\t");
@@ -30858,7 +30864,7 @@
30858
30864
  }
30859
30865
 
30860
30866
  const DEFAULT_GENOMES_URL = "https://igv.org/genomes/genomes.json";
30861
- const BACKUP_GENOMES_URL = "https://raw.githubusercontent.com/igvteam/igv.js/main/packages/igv/src/genomes/genomes.json";
30867
+ const BACKUP_GENOMES_URL = "https://raw.githubusercontent.com/igvteam/igv-genomes/refs/heads/main/dist/genomes.json";
30862
30868
 
30863
30869
  const GenomeUtils = {
30864
30870
 
@@ -30866,7 +30872,7 @@
30866
30872
 
30867
30873
  if (!GenomeUtils.KNOWN_GENOMES) {
30868
30874
 
30869
- GenomeUtils.KNOWN_GENOMES = {};
30875
+ let table = {};
30870
30876
 
30871
30877
  const processJson = (jsonArray, table) => {
30872
30878
  jsonArray.forEach(function (json) {
@@ -30879,12 +30885,12 @@
30879
30885
  if (config.loadDefaultGenomes !== false) {
30880
30886
  try {
30881
30887
  const jsonArray = await igvxhr.loadJson(DEFAULT_GENOMES_URL, {timeout: 2000});
30882
- processJson(jsonArray, GenomeUtils.KNOWN_GENOMES);
30888
+ processJson(jsonArray, table);
30883
30889
  } catch (error) {
30884
30890
  try {
30885
30891
  console.error("Error initializing default genomes:", error);
30886
30892
  const jsonArray = await igvxhr.loadJson(BACKUP_GENOMES_URL, {timeout: 2000});
30887
- processJson(jsonArray, GenomeUtils.KNOWN_GENOMES);
30893
+ processJson(jsonArray, table);
30888
30894
  } catch (e) {
30889
30895
  console.error("Error initializing backup genomes:", error);
30890
30896
  }
@@ -30896,11 +30902,12 @@
30896
30902
  if (genomeList) {
30897
30903
  if (typeof genomeList === 'string') {
30898
30904
  const jsonArray = await igvxhr.loadJson(genomeList, {});
30899
- processJson(jsonArray, GenomeUtils.KNOWN_GENOMES);
30905
+ processJson(jsonArray, table);
30900
30906
  } else {
30901
- processJson(genomeList, GenomeUtils.KNOWN_GENOMES);
30907
+ processJson(genomeList, table);
30902
30908
  }
30903
30909
  }
30910
+ GenomeUtils.KNOWN_GENOMES = table;
30904
30911
  }
30905
30912
  },
30906
30913
 
@@ -47627,7 +47634,7 @@
47627
47634
  if (!this.colorBy) {
47628
47635
  this.colorBy = this.hasPairs ? "unexpectedPair" : "none";
47629
47636
  }
47630
-
47637
+
47631
47638
  let pixelTop = options.pixelTop - BAMTrack.coverageTrackHeight;
47632
47639
  if (this.top) {
47633
47640
  ctx.translate(0, this.top);
@@ -48334,7 +48341,12 @@
48334
48341
  this.trackView.repaintViews();
48335
48342
  }
48336
48343
 
48337
- return {name: undefined, element: createCheckbox(menuItem.label, showCheck), click: clickHandler, init: undefined}
48344
+ return {
48345
+ name: undefined,
48346
+ element: createCheckbox(menuItem.label, showCheck),
48347
+ click: clickHandler,
48348
+ init: undefined
48349
+ }
48338
48350
  }
48339
48351
 
48340
48352
 
@@ -48381,7 +48393,12 @@
48381
48393
  }
48382
48394
  }
48383
48395
 
48384
- return {name: undefined, element: createCheckbox(menuItem.label, showCheck), dialog: clickHandler, init: undefined}
48396
+ return {
48397
+ name: undefined,
48398
+ element: createCheckbox(menuItem.label, showCheck),
48399
+ dialog: clickHandler,
48400
+ init: undefined
48401
+ }
48385
48402
 
48386
48403
  }
48387
48404
 
@@ -48503,38 +48520,88 @@
48503
48520
  });
48504
48521
  }
48505
48522
 
48523
+ list.push('<hr/>');
48524
+ const softClips = clickedAlignment.softClippedBlocks();
48506
48525
  list.push({
48507
48526
  label: 'View read sequence',
48508
48527
  click: () => {
48509
- const seqstring = clickedAlignment.seq; //.map(b => String.fromCharCode(b)).join("");
48510
- if (!seqstring || "*" === seqstring) {
48511
- this.browser.alert.present("Read sequence: *");
48512
- } else {
48513
- this.browser.alert.present(seqstring);
48514
- }
48528
+ const seqstring = clickedAlignment.seq;
48529
+ this.browser.alert.present(seqstring && seqstring !== "*" ? seqstring : "Read sequence: *");
48515
48530
  }
48516
48531
  });
48517
48532
 
48533
+ if (softClips.left && softClips.left.len > 0) {
48534
+ list.push({
48535
+ label: 'View left soft-clipped sequence',
48536
+ click: () => {
48537
+ const clippedSequence = clickedAlignment.seq.substring(softClips.left.seqOffset, softClips.left.seqOffset + softClips.left.len);
48538
+ this.browser.alert.present(clippedSequence);
48539
+ }
48540
+ });
48541
+ }
48542
+
48543
+ if (softClips.right && softClips.right.len > 0) {
48544
+ list.push({
48545
+ label: 'View right soft-clipped sequence',
48546
+ click: () => {
48547
+ const clippedSequence = clickedAlignment.seq.substring(softClips.right.seqOffset, softClips.right.seqOffset + softClips.right.len);
48548
+ this.browser.alert.present(clippedSequence);
48549
+ }
48550
+ });
48551
+ }
48552
+
48553
+ list.push('<hr/>');
48554
+
48518
48555
  if (isSecureContext()) {
48519
48556
  list.push({
48520
48557
  label: 'Copy read sequence',
48521
48558
  click: async () => {
48522
- const seq = clickedAlignment.seq; //.map(b => String.fromCharCode(b)).join("");
48523
48559
  try {
48524
- await navigator.clipboard.writeText(seq);
48560
+ await navigator.clipboard.writeText(clickedAlignment.seq);
48525
48561
  } catch (e) {
48526
48562
  console.error(e);
48527
48563
  this.browser.alert.present(`error copying sequence to clipboard ${e}`);
48528
48564
  }
48529
-
48530
48565
  }
48531
48566
  });
48567
+
48568
+ if (softClips.left && softClips.left.len > 0) {
48569
+ list.push({
48570
+ label: 'Copy left soft-clipped sequence',
48571
+ click: async () => {
48572
+ try {
48573
+ const clippedSequence = clickedAlignment.seq.substring(softClips.left.seqOffset, softClips.left.seqOffset + softClips.left.len);
48574
+ await navigator.clipboard.writeText(clippedSequence);
48575
+ } catch (e) {
48576
+ console.error(e);
48577
+ this.browser.alert.present(`error copying sequence to clipboard ${e}`);
48578
+ }
48579
+ }
48580
+ });
48581
+ }
48582
+
48583
+ if (softClips.right && softClips.right.len > 0) {
48584
+ list.push({
48585
+ label: 'Copy right soft-clipped sequence',
48586
+ click: async () => {
48587
+ try {
48588
+ const clippedSequence = clickedAlignment.seq.substring(softClips.right.seqOffset, softClips.right.seqOffset + softClips.right.len);
48589
+ await navigator.clipboard.writeText(clippedSequence);
48590
+ } catch (e) {
48591
+ console.error(e);
48592
+ this.browser.alert.present(`error copying sequence to clipboard ${e}`);
48593
+ }
48594
+ }
48595
+ });
48596
+ }
48532
48597
  }
48533
48598
 
48534
- // TODO if genome supports blat
48599
+ // TODO test if genome supports blat
48535
48600
  const seqstring = clickedAlignment.seq;
48536
48601
  if (seqstring && "*" !== seqstring) {
48537
48602
 
48603
+ list.push('<hr/>');
48604
+
48538
48605
  if (seqstring.length < maxSequenceSize$1) {
48539
48606
  list.push({
48540
48607
  label: 'BLAT read sequence',
@@ -48552,7 +48619,7 @@
48552
48619
  list.push({
48553
48620
  label: 'BLAT left soft-clipped sequence',
48554
48621
  click: () => {
48555
- const clippedSequence = seqstring.substr(softClips.left.seqOffset, softClips.left.len);
48622
+ const clippedSequence = seqstring.substring(softClips.left.seqOffset, softClips.left.seqOffset + softClips.left.len);
48556
48623
  const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(clippedSequence) : clippedSequence;
48557
48624
  const name = `${clickedAlignment.readName} - blat left clip`;
48558
48625
  const title = `${this.name} - ${name}`;
@@ -48564,7 +48631,7 @@
48564
48631
  list.push({
48565
48632
  label: 'BLAT right soft-clipped sequence',
48566
48633
  click: () => {
48567
- const clippedSequence = seqstring.substr(softClips.right.seqOffset, softClips.right.len);
48634
+ const clippedSequence = seqstring.substring(softClips.right.seqOffset, softClips.right.seqOffset + softClips.right.len);
48568
48635
  const sequence = clickedAlignment.isNegativeStrand() ? reverseComplementSequence(clippedSequence) : clippedSequence;
48569
48636
  const name = `${clickedAlignment.readName} - blat right clip`;
48570
48637
  const title = `${this.name} - ${name}`;
@@ -48613,7 +48680,7 @@
48613
48680
  const offsetY = y - this.top;
48614
48681
  const genomicLocation = clickState.genomicLocation;
48615
48682
 
48616
- if(features.packedGroups) {
48683
+ if (features.packedGroups) {
48617
48684
  let minGroupY = Number.MAX_VALUE;
48618
48685
  for (let group of features.packedGroups.values()) {
48619
48686
  minGroupY = Math.min(minGroupY, group.pixelTop);
@@ -69452,7 +69519,7 @@ ${indent}columns: ${matrix.columns}
69452
69519
  })
69453
69520
  }
69454
69521
 
69455
- const _version = "3.2.5";
69522
+ const _version = "3.2.6";
69456
69523
  function version() {
69457
69524
  return _version
69458
69525
  }