@teselagen/sequence-utils 0.3.7 → 0.3.9

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 (108) hide show
  1. package/README.md +89 -0
  2. package/bioData.d.ts +1 -339
  3. package/filterSequenceString.d.ts +26 -1
  4. package/index.d.ts +7 -8
  5. package/index.js +329 -413
  6. package/index.mjs +329 -413
  7. package/index.umd.js +329 -413
  8. package/package.json +1 -2
  9. package/src/addGapsToSeqReads.js +2 -2
  10. package/src/adjustAnnotationsToInsert.js +3 -3
  11. package/src/adjustBpsToReplaceOrInsert.js +3 -3
  12. package/src/adjustBpsToReplaceOrInsert.test.js +0 -1
  13. package/src/aminoAcidToDnaRna.test.js +1 -1
  14. package/src/annotateSingleSeq.js +1 -1
  15. package/src/annotateSingleSeq.test.js +1 -4
  16. package/src/autoAnnotate.js +5 -2
  17. package/src/autoAnnotate.test.js +6 -30
  18. package/src/bioData.js +1 -366
  19. package/src/calculateNebTa.js +1 -1
  20. package/src/calculateNebTm.js +1 -1
  21. package/src/calculatePercentGC.js +2 -2
  22. package/src/calculateTm.js +19 -102
  23. package/src/computeDigestFragments.js +7 -4
  24. package/src/computeDigestFragments.test.js +1 -1
  25. package/src/condensePairwiseAlignmentDifferences.js +1 -1
  26. package/src/convertAACaretPositionOrRangeToDna.js +1 -1
  27. package/src/convertDnaCaretPositionOrRangeToAA.js +1 -1
  28. package/src/cutSequenceByRestrictionEnzyme.js +3 -3
  29. package/src/cutSequenceByRestrictionEnzyme.test.js +0 -1
  30. package/src/degenerateDnaToAminoAcidMap.js +1 -1
  31. package/src/degenerateRnaToAminoAcidMap.js +1 -1
  32. package/src/deleteSequenceDataAtRange.js +1 -1
  33. package/src/deleteSequenceDataAtRange.test.js +23 -9
  34. package/src/diffUtils.js +4 -4
  35. package/src/diffUtils.test.js +2 -2
  36. package/src/doesEnzymeChopOutsideOfRecognitionSite.js +1 -1
  37. package/src/doesEnzymeChopOutsideOfRecognitionSite.test.js +0 -2
  38. package/src/featureTypesAndColors.js +5 -5
  39. package/src/featureTypesAndColors.test.js +1 -1
  40. package/src/filterSequenceString.js +111 -16
  41. package/src/filterSequenceString.test.js +62 -3
  42. package/src/findNearestRangeOfSequenceOverlapToPosition.js +1 -1
  43. package/src/findOrfsInPlasmid.js +1 -1
  44. package/src/findSequenceMatches.js +9 -10
  45. package/src/generateAnnotations.js +1 -1
  46. package/src/generateSequenceData.js +1 -1
  47. package/src/generateSequenceData.test.js +1 -1
  48. package/src/getAllInsertionsInSeqReads.js +1 -1
  49. package/src/getAminoAcidDataForEachBaseOfDna.js +2 -2
  50. package/src/getAminoAcidDataForEachBaseOfDna.test.js +0 -2
  51. package/src/getAminoAcidFromSequenceTriplet.js +1 -1
  52. package/src/getAminoAcidStringFromSequenceString.js +1 -1
  53. package/src/getCodonRangeForAASliver.js +1 -1
  54. package/src/getComplementAminoAcidStringFromSequenceString.js +2 -5
  55. package/src/getComplementSequenceAndAnnotations.js +1 -2
  56. package/src/getComplementSequenceString.js +5 -3
  57. package/src/getComplementSequenceString.test.js +6 -6
  58. package/src/getCutsiteType.js +1 -1
  59. package/src/getCutsitesFromSequence.js +1 -1
  60. package/src/getDegenerateDnaStringFromAAString.js +1 -1
  61. package/src/getDegenerateRnaStringFromAAString.js +1 -1
  62. package/src/getDigestFragmentsForCutsites.js +5 -2
  63. package/src/getDigestFragmentsForRestrictionEnzymes.js +2 -2
  64. package/src/getInsertBetweenVals.js +2 -2
  65. package/src/getLeftAndRightOfSequenceInRangeGivenPosition.js +2 -2
  66. package/src/getLeftAndRightOfSequenceInRangeGivenPosition.test.js +0 -2
  67. package/src/getMassOfAaString.js +4 -1
  68. package/src/getMassofAaString.test.js +9 -8
  69. package/src/getOrfsFromSequence.js +1 -2
  70. package/src/getOrfsFromSequence.test.js +1 -3
  71. package/src/getOverlapBetweenTwoSequences.js +3 -3
  72. package/src/getOverlapBetweenTwoSequences.test.js +1 -1
  73. package/src/getPossiblePartsFromSequenceAndEnzymes.js +2 -2
  74. package/src/getReverseAminoAcidStringFromSequenceString.js +1 -1
  75. package/src/getReverseComplementAminoAcidStringFromSequenceString.js +9 -6
  76. package/src/getReverseComplementAnnotation.js +1 -1
  77. package/src/getReverseComplementSequenceAndAnnotations.js +2 -3
  78. package/src/getReverseComplementSequenceString.js +1 -2
  79. package/src/getReverseSequenceString.js +1 -1
  80. package/src/getSequenceDataBetweenRange.js +7 -4
  81. package/src/getSequenceDataBetweenRange.test.js +0 -1
  82. package/src/getVirtualDigest.js +6 -3
  83. package/src/guessIfSequenceIsDnaAndNotProtein.js +2 -2
  84. package/src/index.js +79 -80
  85. package/src/index.test.js +5 -4
  86. package/src/insertGapsIntoRefSeq.js +1 -1
  87. package/src/insertSequenceDataAtPosition.test.js +4 -2
  88. package/src/insertSequenceDataAtPositionOrRange.js +5 -5
  89. package/src/insertSequenceDataAtPositionOrRange.test.js +3 -17
  90. package/src/isEnzymeType2S.js +1 -1
  91. package/src/mapAnnotationsToRows.js +3 -3
  92. package/src/mapAnnotationsToRows.test.js +1 -3
  93. package/src/prepareCircularViewData.js +5 -5
  94. package/src/prepareCircularViewData.test.js +1 -1
  95. package/src/prepareRowData.js +1 -2
  96. package/src/prepareRowData.test.js +1 -3
  97. package/src/prepareRowData_output1.json +381 -381
  98. package/src/proteinAlphabet.js +31 -26
  99. package/src/rotateBpsToPosition.js +7 -11
  100. package/src/rotateBpsToPosition.test.js +6 -6
  101. package/src/rotateSequenceDataToPosition.js +4 -4
  102. package/src/shiftAnnotationsByLen.js +2 -2
  103. package/src/tidyUpAnnotation.js +8 -7
  104. package/src/tidyUpSequenceData.js +15 -18
  105. package/filterAminoAcidSequenceString.d.ts +0 -1
  106. package/filterAminoAcidSequenceString.test.d.ts +0 -1
  107. package/src/filterAminoAcidSequenceString.js +0 -13
  108. package/src/filterAminoAcidSequenceString.test.js +0 -22
package/index.js CHANGED
@@ -5999,31 +5999,8 @@ lodash.exports;
5999
5999
  })(lodash, lodash.exports);
6000
6000
  var lodashExports = lodash.exports;
6001
6001
  const protein_letters = "ACDEFGHIKLMNPQRSTVWY";
6002
+ const protein_letters_withUandX = "ACDEFGHIKLMNPQRSTVWYUX";
6002
6003
  const extended_protein_letters = "ACDEFGHIKLMNPQRSTVWYBXZJUO.*-";
6003
- const protein_letters_1to3 = {
6004
- A: "Ala",
6005
- C: "Cys",
6006
- D: "Asp",
6007
- E: "Glu",
6008
- F: "Phe",
6009
- G: "Gly",
6010
- H: "His",
6011
- I: "Ile",
6012
- K: "Lys",
6013
- L: "Leu",
6014
- M: "Met",
6015
- N: "Asn",
6016
- P: "Pro",
6017
- Q: "Gln",
6018
- R: "Arg",
6019
- S: "Ser",
6020
- T: "Thr",
6021
- V: "Val",
6022
- W: "Trp",
6023
- Y: "Tyr",
6024
- O: "Pyl",
6025
- U: "Sec"
6026
- };
6027
6004
  const ambiguous_dna_letters = "GATCRYWSMKHBVDN";
6028
6005
  const unambiguous_dna_letters = "GATC";
6029
6006
  const ambiguous_rna_letters = "GAUCRYWSMKHBVDN";
@@ -6048,135 +6025,6 @@ const ambiguous_dna_values = {
6048
6025
  X: "GATC",
6049
6026
  N: "GATC"
6050
6027
  };
6051
- const ambiguous_rna_values = {
6052
- ".": ".",
6053
- A: "A",
6054
- C: "C",
6055
- G: "G",
6056
- U: "U",
6057
- M: "AC",
6058
- R: "AG",
6059
- W: "AU",
6060
- S: "CG",
6061
- Y: "CU",
6062
- K: "GU",
6063
- V: "ACG",
6064
- H: "ACU",
6065
- D: "AGU",
6066
- B: "CGU",
6067
- X: "GAUC",
6068
- N: "GAUC"
6069
- };
6070
- const ambiguous_dna_complement = {
6071
- ".": ".",
6072
- A: "T",
6073
- C: "G",
6074
- G: "C",
6075
- T: "A",
6076
- M: "K",
6077
- R: "Y",
6078
- W: "W",
6079
- S: "S",
6080
- Y: "R",
6081
- K: "M",
6082
- V: "B",
6083
- H: "D",
6084
- D: "H",
6085
- B: "V",
6086
- X: "X",
6087
- N: "N"
6088
- };
6089
- const ambiguous_rna_complement = {
6090
- ".": ".",
6091
- A: "U",
6092
- C: "G",
6093
- G: "C",
6094
- U: "A",
6095
- M: "K",
6096
- R: "Y",
6097
- W: "W",
6098
- S: "S",
6099
- Y: "R",
6100
- K: "M",
6101
- V: "B",
6102
- H: "D",
6103
- D: "H",
6104
- B: "V",
6105
- X: "X",
6106
- N: "N"
6107
- };
6108
- const unambiguous_dna_weights = {
6109
- A: 331.2218,
6110
- C: 307.1971,
6111
- G: 347.2212,
6112
- T: 322.2085
6113
- };
6114
- const monoisotopic_unambiguous_dna_weights = {
6115
- A: 331.06817,
6116
- C: 307.056936,
6117
- G: 347.063084,
6118
- T: 322.056602
6119
- };
6120
- const unambiguous_rna_weights = {
6121
- A: 347.2212,
6122
- C: 323.1965,
6123
- G: 363.2206,
6124
- U: 324.1813
6125
- };
6126
- const monoisotopic_unambiguous_rna_weights = {
6127
- A: 347.063084,
6128
- C: 323.051851,
6129
- G: 363.057999,
6130
- U: 324.035867
6131
- };
6132
- const protein_weights = {
6133
- A: 89.0932,
6134
- C: 121.1582,
6135
- D: 133.1027,
6136
- E: 147.1293,
6137
- F: 165.1891,
6138
- G: 75.0666,
6139
- H: 155.1546,
6140
- I: 131.1729,
6141
- K: 146.1876,
6142
- L: 131.1729,
6143
- M: 149.2113,
6144
- N: 132.1179,
6145
- O: 255.3134,
6146
- P: 115.1305,
6147
- Q: 146.1445,
6148
- R: 174.201,
6149
- S: 105.0926,
6150
- T: 119.1192,
6151
- U: 168.0532,
6152
- V: 117.1463,
6153
- W: 204.2252,
6154
- Y: 181.1885
6155
- };
6156
- const monoisotopic_protein_weights = {
6157
- A: 89.047678,
6158
- C: 121.019749,
6159
- D: 133.037508,
6160
- E: 147.053158,
6161
- F: 165.078979,
6162
- G: 75.032028,
6163
- H: 155.069477,
6164
- I: 131.094629,
6165
- K: 146.105528,
6166
- L: 131.094629,
6167
- M: 149.051049,
6168
- N: 132.053492,
6169
- O: 255.158292,
6170
- P: 115.063329,
6171
- Q: 146.069142,
6172
- R: 174.111676,
6173
- S: 105.042593,
6174
- T: 119.058243,
6175
- U: 168.964203,
6176
- V: 117.078979,
6177
- W: 204.089878,
6178
- Y: 181.073893
6179
- };
6180
6028
  const extended_protein_values = {
6181
6029
  A: "A",
6182
6030
  B: "ND",
@@ -6211,140 +6059,18 @@ const extended_protein_values = {
6211
6059
  ".": "\\.\\.",
6212
6060
  "-": "\\-"
6213
6061
  };
6214
- const atom_weights = {
6215
- H: 1.00794,
6216
- D: 2.0141,
6217
- He: 4.002602,
6218
- Li: 6.941,
6219
- Be: 9.012182,
6220
- B: 10.811,
6221
- C: 12.0107,
6222
- N: 14.0067,
6223
- O: 15.9994,
6224
- F: 18.9984032,
6225
- Ne: 20.1797,
6226
- Na: 22.98977,
6227
- Mg: 24.305,
6228
- Al: 26.981538,
6229
- Si: 28.0855,
6230
- P: 30.973761,
6231
- S: 32.065,
6232
- Cl: 35.453,
6233
- Ar: 39.948,
6234
- K: 39.0983,
6235
- Ca: 40.078,
6236
- Sc: 44.95591,
6237
- Ti: 47.867,
6238
- V: 50.9415,
6239
- Cr: 51.9961,
6240
- Mn: 54.938049,
6241
- Fe: 55.845,
6242
- Co: 58.9332,
6243
- Ni: 58.6934,
6244
- Cu: 63.546,
6245
- Zn: 65.39,
6246
- Ga: 69.723,
6247
- Ge: 72.64,
6248
- As: 74.9216,
6249
- Se: 78.96,
6250
- Br: 79.904,
6251
- Kr: 83.8,
6252
- Rb: 85.4678,
6253
- Sr: 87.62,
6254
- Y: 88.90585,
6255
- Zr: 91.224,
6256
- Nb: 92.90638,
6257
- Mo: 95.94,
6258
- Tc: 98,
6259
- Ru: 101.07,
6260
- Rh: 102.9055,
6261
- Pd: 106.42,
6262
- Ag: 107.8682,
6263
- Cd: 112.411,
6264
- In: 114.818,
6265
- Sn: 118.71,
6266
- Sb: 121.76,
6267
- Te: 127.6,
6268
- I: 126.90447,
6269
- Xe: 131.293,
6270
- Cs: 132.90545,
6271
- Ba: 137.327,
6272
- La: 138.9055,
6273
- Ce: 140.116,
6274
- Pr: 140.90765,
6275
- Nd: 144.24,
6276
- Pm: 145,
6277
- Sm: 150.36,
6278
- Eu: 151.964,
6279
- Gd: 157.25,
6280
- Tb: 158.92534,
6281
- Dy: 162.5,
6282
- Ho: 164.93032,
6283
- Er: 167.259,
6284
- Tm: 168.93421,
6285
- Yb: 173.04,
6286
- Lu: 174.967,
6287
- Hf: 178.49,
6288
- Ta: 180.9479,
6289
- W: 183.84,
6290
- Re: 186.207,
6291
- Os: 190.23,
6292
- Ir: 192.217,
6293
- Pt: 195.078,
6294
- Au: 196.96655,
6295
- Hg: 200.59,
6296
- Tl: 204.3833,
6297
- Pb: 207.2,
6298
- Bi: 208.98038,
6299
- Po: 208.98,
6300
- At: 209.99,
6301
- Rn: 222.02,
6302
- Fr: 223.02,
6303
- Ra: 226.03,
6304
- Ac: 227.03,
6305
- Th: 232.0381,
6306
- Pa: 231.03588,
6307
- U: 238.02891,
6308
- Np: 237.05,
6309
- Pu: 244.06,
6310
- Am: 243.06,
6311
- Cm: 247.07,
6312
- Bk: 247.07,
6313
- Cf: 251.08,
6314
- Es: 252.08,
6315
- Fm: 257.1,
6316
- Md: 258.1,
6317
- No: 259.1,
6318
- Lr: 262.11,
6319
- Rf: 261.11,
6320
- Db: 262.11,
6321
- Sg: 266.12,
6322
- Bh: 264.12,
6323
- Hs: 269.13,
6324
- Mt: 268.14
6325
- };
6326
6062
  const bioData = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
6327
6063
  __proto__: null,
6328
- ambiguous_dna_complement,
6329
6064
  ambiguous_dna_letters,
6330
6065
  ambiguous_dna_values,
6331
- ambiguous_rna_complement,
6332
6066
  ambiguous_rna_letters,
6333
- ambiguous_rna_values,
6334
- atom_weights,
6335
6067
  extended_dna_letters,
6336
6068
  extended_protein_letters,
6337
6069
  extended_protein_values,
6338
- monoisotopic_protein_weights,
6339
- monoisotopic_unambiguous_dna_weights,
6340
- monoisotopic_unambiguous_rna_weights,
6341
6070
  protein_letters,
6342
- protein_letters_1to3,
6343
- protein_weights,
6071
+ protein_letters_withUandX,
6344
6072
  unambiguous_dna_letters,
6345
- unambiguous_dna_weights,
6346
- unambiguous_rna_letters,
6347
- unambiguous_rna_weights
6073
+ unambiguous_rna_letters
6348
6074
  }, Symbol.toStringTag, { value: "Module" }));
6349
6075
  const aminoAcidToDegenerateDnaMap = {
6350
6076
  "-": "---",
@@ -6458,8 +6184,8 @@ function getOverlapsOfPotentiallyCircularRanges(rangeA, rangeB, maxRangeLength,
6458
6184
  maxRangeLength
6459
6185
  );
6460
6186
  let overlaps = [];
6461
- normalizedRangeA.forEach(function(nonCircularRangeA, iA) {
6462
- normalizedRangeB.forEach(function(nonCircularRangeB, iB) {
6187
+ normalizedRangeA.forEach(function(nonCircularRangeA) {
6188
+ normalizedRangeB.forEach(function(nonCircularRangeB) {
6463
6189
  const overlap = getOverlapOfNonCircularRanges(
6464
6190
  nonCircularRangeA,
6465
6191
  nonCircularRangeB
@@ -6471,7 +6197,7 @@ function getOverlapsOfPotentiallyCircularRanges(rangeA, rangeB, maxRangeLength,
6471
6197
  });
6472
6198
  if (joinIfPossible && normalizedRangeA.length === 2 && normalizedRangeB.length === 2 && maxRangeLength) {
6473
6199
  const joinedOverlap = {};
6474
- overlaps = lodashExports.flatMap(overlaps, (o, i) => {
6200
+ overlaps = lodashExports.flatMap(overlaps, (o) => {
6475
6201
  if (o.start === 0) {
6476
6202
  joinedOverlap.end = o.end;
6477
6203
  return [];
@@ -6569,12 +6295,14 @@ function trimRangeByAnotherRange(rangeToBeTrimmed, trimmingRange, sequenceLength
6569
6295
  });
6570
6296
  splitRangesToBeTrimmed[index] = nonCircularRangeToBeTrimmed;
6571
6297
  });
6572
- const outputSplitRanges = splitRangesToBeTrimmed.filter(function(trimmedRange) {
6573
- if (trimmedRange) {
6574
- return true;
6298
+ const outputSplitRanges = splitRangesToBeTrimmed.filter(
6299
+ function(trimmedRange) {
6300
+ if (trimmedRange) {
6301
+ return true;
6302
+ }
6303
+ return false;
6575
6304
  }
6576
- return false;
6577
- });
6305
+ );
6578
6306
  let outputTrimmedRange;
6579
6307
  if (outputSplitRanges.length < 0)
6580
6308
  ;
@@ -6673,11 +6401,19 @@ function checkIfNonCircularRangesOverlap(range, comparisonRange) {
6673
6401
  }
6674
6402
  __name(checkIfNonCircularRangesOverlap, "checkIfNonCircularRangesOverlap");
6675
6403
  function checkIfPotentiallyCircularRangesOverlap(range, comparisonRange) {
6676
- return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(function(splitRange) {
6677
- return splitRangeIntoTwoPartsIfItIsCircular(comparisonRange, Infinity).some(function(splitComparisonRange) {
6678
- return checkIfNonCircularRangesOverlap(splitRange, splitComparisonRange);
6679
- });
6680
- });
6404
+ return splitRangeIntoTwoPartsIfItIsCircular(range, Infinity).some(
6405
+ function(splitRange) {
6406
+ return splitRangeIntoTwoPartsIfItIsCircular(
6407
+ comparisonRange,
6408
+ Infinity
6409
+ ).some(function(splitComparisonRange) {
6410
+ return checkIfNonCircularRangesOverlap(
6411
+ splitRange,
6412
+ splitComparisonRange
6413
+ );
6414
+ });
6415
+ }
6416
+ );
6681
6417
  }
6682
6418
  __name(checkIfPotentiallyCircularRangesOverlap, "checkIfPotentiallyCircularRangesOverlap");
6683
6419
  function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequenceLength, optionalOriginalRange) {
@@ -6686,15 +6422,19 @@ function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequen
6686
6422
  return overlaps;
6687
6423
  } else if (overlaps.length === 2) {
6688
6424
  if (overlaps[0].start === 0 && overlaps[1].end + 1 === sequenceLength && !originalRangeLinear) {
6689
- return [{
6690
- start: overlaps[1].start,
6691
- end: overlaps[0].end
6692
- }];
6425
+ return [
6426
+ {
6427
+ start: overlaps[1].start,
6428
+ end: overlaps[0].end
6429
+ }
6430
+ ];
6693
6431
  } else if (overlaps[1].start === 0 && overlaps[0].end + 1 === sequenceLength && !originalRangeLinear) {
6694
- return [{
6695
- start: overlaps[0].start,
6696
- end: overlaps[1].end
6697
- }];
6432
+ return [
6433
+ {
6434
+ start: overlaps[0].start,
6435
+ end: overlaps[1].end
6436
+ }
6437
+ ];
6698
6438
  } else {
6699
6439
  return overlaps;
6700
6440
  }
@@ -6702,17 +6442,29 @@ function collapseOverlapsGeneratedFromRangeComparisonIfPossible(overlaps, sequen
6702
6442
  const firstOverlap = overlaps[0];
6703
6443
  const secondOverlap = overlaps[1];
6704
6444
  const thirdOverlap = overlaps[2];
6705
- let collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible([firstOverlap, secondOverlap], sequenceLength, optionalOriginalRange);
6445
+ let collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
6446
+ [firstOverlap, secondOverlap],
6447
+ sequenceLength,
6448
+ optionalOriginalRange
6449
+ );
6706
6450
  if (collapsedOverlaps.length === 1) {
6707
6451
  collapsedOverlaps.push(thirdOverlap);
6708
6452
  return collapsedOverlaps;
6709
6453
  } else {
6710
- collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible([firstOverlap, thirdOverlap], sequenceLength, optionalOriginalRange);
6454
+ collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
6455
+ [firstOverlap, thirdOverlap],
6456
+ sequenceLength,
6457
+ optionalOriginalRange
6458
+ );
6711
6459
  if (collapsedOverlaps.length === 1) {
6712
6460
  collapsedOverlaps.push(secondOverlap);
6713
6461
  return collapsedOverlaps;
6714
6462
  } else {
6715
- collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible([secondOverlap, thirdOverlap], sequenceLength, optionalOriginalRange);
6463
+ collapsedOverlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
6464
+ [secondOverlap, thirdOverlap],
6465
+ sequenceLength,
6466
+ optionalOriginalRange
6467
+ );
6716
6468
  if (collapsedOverlaps.length === 1) {
6717
6469
  collapsedOverlaps.push(firstOverlap);
6718
6470
  return collapsedOverlaps;
@@ -6819,13 +6571,23 @@ function expandOrContractRangeByLength(range, shiftBy, shiftStart, sequenceLengt
6819
6571
  __name(expandOrContractRangeByLength, "expandOrContractRangeByLength");
6820
6572
  function translateRange(rangeToBeAdjusted, translateBy, rangeLength) {
6821
6573
  return lodashExports.assign({}, rangeToBeAdjusted, {
6822
- start: normalizePositionByRangeLength(rangeToBeAdjusted.start + translateBy, rangeLength),
6823
- end: normalizePositionByRangeLength(rangeToBeAdjusted.end + translateBy, rangeLength)
6574
+ start: normalizePositionByRangeLength(
6575
+ rangeToBeAdjusted.start + translateBy,
6576
+ rangeLength
6577
+ ),
6578
+ end: normalizePositionByRangeLength(
6579
+ rangeToBeAdjusted.end + translateBy,
6580
+ rangeLength
6581
+ )
6824
6582
  });
6825
6583
  }
6826
6584
  __name(translateRange, "translateRange");
6827
- function flipRelativeRange(innerRange, outerRange, sequenceLength, options) {
6828
- const isFullyContained = isRangeWithinRange(innerRange, outerRange, sequenceLength);
6585
+ function flipRelativeRange(innerRange, outerRange, sequenceLength) {
6586
+ const isFullyContained = isRangeWithinRange(
6587
+ innerRange,
6588
+ outerRange,
6589
+ sequenceLength
6590
+ );
6829
6591
  if (isFullyContained) {
6830
6592
  return flipFullyContainedRange(innerRange, outerRange, sequenceLength);
6831
6593
  } else {
@@ -6833,42 +6595,92 @@ function flipRelativeRange(innerRange, outerRange, sequenceLength, options) {
6833
6595
  }
6834
6596
  }
6835
6597
  __name(flipRelativeRange, "flipRelativeRange");
6836
- function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength, options) {
6837
- const outerFullyContained = isRangeWithinRange(outerRange, innerRange, sequenceLength);
6598
+ function flipNonFullyContainedRange(innerRange, outerRange, sequenceLength) {
6599
+ const outerFullyContained = isRangeWithinRange(
6600
+ outerRange,
6601
+ innerRange,
6602
+ sequenceLength
6603
+ );
6838
6604
  let flippedInnerRange;
6839
6605
  if (outerFullyContained) {
6840
- const expandBy1 = getRangeLength({
6841
- start: innerRange.start,
6842
- end: outerRange.start
6843
- }, sequenceLength) - 1;
6844
- flippedInnerRange = expandOrContractRangeByLength(outerRange, expandBy1, false, sequenceLength);
6845
- const expandBy2 = getRangeLength({
6846
- end: innerRange.end,
6847
- start: outerRange.end
6848
- }, sequenceLength) - 1;
6849
- flippedInnerRange = expandOrContractRangeByLength(flippedInnerRange, expandBy2, true, sequenceLength);
6606
+ const expandBy1 = getRangeLength(
6607
+ {
6608
+ start: innerRange.start,
6609
+ end: outerRange.start
6610
+ },
6611
+ sequenceLength
6612
+ ) - 1;
6613
+ flippedInnerRange = expandOrContractRangeByLength(
6614
+ outerRange,
6615
+ expandBy1,
6616
+ false,
6617
+ sequenceLength
6618
+ );
6619
+ const expandBy2 = getRangeLength(
6620
+ {
6621
+ end: innerRange.end,
6622
+ start: outerRange.end
6623
+ },
6624
+ sequenceLength
6625
+ ) - 1;
6626
+ flippedInnerRange = expandOrContractRangeByLength(
6627
+ flippedInnerRange,
6628
+ expandBy2,
6629
+ true,
6630
+ sequenceLength
6631
+ );
6850
6632
  } else {
6851
- const overlaps = getOverlapsOfPotentiallyCircularRanges(innerRange, outerRange, sequenceLength);
6633
+ const overlaps = getOverlapsOfPotentiallyCircularRanges(
6634
+ innerRange,
6635
+ outerRange,
6636
+ sequenceLength
6637
+ );
6852
6638
  if (overlaps.length >= 1) {
6853
- let overlapExtendsForward;
6854
6639
  const firstOverlap = overlaps[0];
6855
- overlapExtendsForward = firstOverlap.start !== outerRange.start;
6856
- const flippedTruncatedInner = flipFullyContainedRange(firstOverlap, outerRange, sequenceLength);
6640
+ const overlapExtendsForward = firstOverlap.start !== outerRange.start;
6641
+ const flippedTruncatedInner = flipFullyContainedRange(
6642
+ firstOverlap,
6643
+ outerRange,
6644
+ sequenceLength
6645
+ );
6857
6646
  const lengthToExtend = getRangeLength(innerRange, sequenceLength) - getRangeLength(flippedTruncatedInner, sequenceLength);
6858
- flippedInnerRange = expandOrContractRangeByLength(flippedTruncatedInner, lengthToExtend, overlapExtendsForward, sequenceLength);
6647
+ flippedInnerRange = expandOrContractRangeByLength(
6648
+ flippedTruncatedInner,
6649
+ lengthToExtend,
6650
+ overlapExtendsForward,
6651
+ sequenceLength
6652
+ );
6859
6653
  } else {
6860
- throw new Error("This case (relative ranges that do not overlap) is unsupported! ");
6654
+ throw new Error(
6655
+ "This case (relative ranges that do not overlap) is unsupported! "
6656
+ );
6861
6657
  }
6862
6658
  }
6863
6659
  return flippedInnerRange;
6864
6660
  }
6865
6661
  __name(flipNonFullyContainedRange, "flipNonFullyContainedRange");
6866
- function flipFullyContainedRange(innerRange, outerRange, sequenceLength, options) {
6662
+ function flipFullyContainedRange(innerRange, outerRange, sequenceLength) {
6867
6663
  const translateBy = -outerRange.start;
6868
- const translatedOuterRange = translateRange(outerRange, translateBy, sequenceLength);
6869
- const translatedInnerRange = translateRange(innerRange, translateBy, sequenceLength);
6870
- const translatedFlippedInnerRange = flipNonOriginSpanningContainedRange(translatedInnerRange, translatedOuterRange, sequenceLength);
6871
- const flippedInnerRange = translateRange(translatedFlippedInnerRange, -translateBy, sequenceLength);
6664
+ const translatedOuterRange = translateRange(
6665
+ outerRange,
6666
+ translateBy,
6667
+ sequenceLength
6668
+ );
6669
+ const translatedInnerRange = translateRange(
6670
+ innerRange,
6671
+ translateBy,
6672
+ sequenceLength
6673
+ );
6674
+ const translatedFlippedInnerRange = flipNonOriginSpanningContainedRange(
6675
+ translatedInnerRange,
6676
+ translatedOuterRange,
6677
+ sequenceLength
6678
+ );
6679
+ const flippedInnerRange = translateRange(
6680
+ translatedFlippedInnerRange,
6681
+ -translateBy,
6682
+ sequenceLength
6683
+ );
6872
6684
  return flippedInnerRange;
6873
6685
  }
6874
6686
  __name(flipFullyContainedRange, "flipFullyContainedRange");
@@ -6886,7 +6698,10 @@ function generateRandomRange(minStart, maxEnd, maxLength) {
6886
6698
  const start = getRandomInt$1(minStart, maxEnd);
6887
6699
  let end;
6888
6700
  if (maxLength) {
6889
- end = normalizePositionByRangeLength(getRandomInt$1(start, start + maxLength), maxEnd);
6701
+ end = normalizePositionByRangeLength(
6702
+ getRandomInt$1(start, start + maxLength),
6703
+ maxEnd
6704
+ );
6890
6705
  } else {
6891
6706
  end = getRandomInt$1(minStart, maxEnd);
6892
6707
  }
@@ -6929,18 +6744,26 @@ function getShortestDistanceBetweenTwoPositions(position1, position2, sequenceLe
6929
6744
  __name(getShortestDistanceBetweenTwoPositions, "getShortestDistanceBetweenTwoPositions");
6930
6745
  function getYOffsetForPotentiallyCircularRange(range, YOffsetLevelsWithRanges, assignYOffsetToRange) {
6931
6746
  let yOffset = [];
6932
- const openYOffsetFound = YOffsetLevelsWithRanges.some(function(rangesAlreadyAddedToYOffset, index) {
6933
- const rangeBlocked = rangesAlreadyAddedToYOffset.some(function(comparisonRange) {
6934
- return checkIfPotentiallyCircularRangesOverlap(range, comparisonRange);
6935
- });
6936
- if (!rangeBlocked) {
6937
- yOffset = index;
6938
- if (assignYOffsetToRange)
6939
- range.yOffset = index;
6940
- rangesAlreadyAddedToYOffset.push(range);
6941
- return true;
6747
+ const openYOffsetFound = YOffsetLevelsWithRanges.some(
6748
+ function(rangesAlreadyAddedToYOffset, index) {
6749
+ const rangeBlocked = rangesAlreadyAddedToYOffset.some(
6750
+ function(comparisonRange) {
6751
+ return checkIfPotentiallyCircularRangesOverlap(
6752
+ range,
6753
+ comparisonRange
6754
+ );
6755
+ }
6756
+ );
6757
+ if (!rangeBlocked) {
6758
+ yOffset = index;
6759
+ if (assignYOffsetToRange)
6760
+ range.yOffset = index;
6761
+ rangesAlreadyAddedToYOffset.push(range);
6762
+ return true;
6763
+ }
6764
+ return false;
6942
6765
  }
6943
- });
6766
+ );
6944
6767
  if (!openYOffsetFound) {
6945
6768
  yOffset = YOffsetLevelsWithRanges.length;
6946
6769
  if (assignYOffsetToRange)
@@ -6954,7 +6777,11 @@ function getYOffsetsForPotentiallyCircularRanges(ranges, assignYOffsetToRange) {
6954
6777
  let maxYOffset = 0;
6955
6778
  const yOffsetLevels = [];
6956
6779
  ranges.forEach(function(range) {
6957
- const yOffset = getYOffsetForPotentiallyCircularRange(range, yOffsetLevels, assignYOffsetToRange);
6780
+ const yOffset = getYOffsetForPotentiallyCircularRange(
6781
+ range,
6782
+ yOffsetLevels,
6783
+ assignYOffsetToRange
6784
+ );
6958
6785
  yOffsets.push(yOffset);
6959
6786
  if (yOffset > maxYOffset) {
6960
6787
  maxYOffset = yOffset;
@@ -6987,8 +6814,16 @@ function invertRange$1(rangeOrCaret, rangeMax) {
6987
6814
  }
6988
6815
  __name(invertRange$1, "invertRange$1");
6989
6816
  function isPositionCloserToRangeStartThanRangeEnd(position, range, maxLength) {
6990
- const distanceFromStart = getShortestDistanceBetweenTwoPositions(range.start, position, maxLength);
6991
- const distanceFromEnd = getShortestDistanceBetweenTwoPositions(range.end, position, maxLength);
6817
+ const distanceFromStart = getShortestDistanceBetweenTwoPositions(
6818
+ range.start,
6819
+ position,
6820
+ maxLength
6821
+ );
6822
+ const distanceFromEnd = getShortestDistanceBetweenTwoPositions(
6823
+ range.end,
6824
+ position,
6825
+ maxLength
6826
+ );
6992
6827
  return distanceFromStart <= distanceFromEnd;
6993
6828
  }
6994
6829
  __name(isPositionCloserToRangeStartThanRangeEnd, "isPositionCloserToRangeStartThanRangeEnd");
@@ -7019,9 +6854,15 @@ function reversePositionInRange(position, rangeLength, isInBetweenPositions) {
7019
6854
  }
7020
6855
  __name(reversePositionInRange, "reversePositionInRange");
7021
6856
  function zeroSubrangeByContainerRange(subRange, containerRange, sequenceLength) {
7022
- const trimmedSubRange = trimRangeByAnotherRange(subRange, containerRange, sequenceLength);
6857
+ const trimmedSubRange = trimRangeByAnotherRange(
6858
+ subRange,
6859
+ containerRange,
6860
+ sequenceLength
6861
+ );
7023
6862
  if (trimmedSubRange) {
7024
- throw new Error("subRange must be fully contained by containerRange! Otherwise this function does not make sense");
6863
+ throw new Error(
6864
+ "subRange must be fully contained by containerRange! Otherwise this function does not make sense"
6865
+ );
7025
6866
  }
7026
6867
  const newSubrange = {};
7027
6868
  newSubrange.start = subRange.start - containerRange.start;
@@ -7049,12 +6890,24 @@ function modulo(n, m) {
7049
6890
  }
7050
6891
  __name(modulo, "modulo");
7051
6892
  function getZeroedRangeOverlaps(annotation, selection, sequenceLength) {
7052
- const overlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(getOverlapsOfPotentiallyCircularRanges(annotation, selection, sequenceLength), sequenceLength, annotation);
6893
+ const overlaps = collapseOverlapsGeneratedFromRangeComparisonIfPossible(
6894
+ getOverlapsOfPotentiallyCircularRanges(
6895
+ annotation,
6896
+ selection,
6897
+ sequenceLength
6898
+ ),
6899
+ sequenceLength,
6900
+ annotation
6901
+ );
7053
6902
  const zeroedOverlaps = overlaps.map((overlap) => {
7054
- return zeroSubrangeByContainerRange(overlap, {
7055
- start: selection.start,
7056
- end: normalizePositionByRangeLength(selection.start - 1, sequenceLength)
7057
- }, sequenceLength);
6903
+ return zeroSubrangeByContainerRange(
6904
+ overlap,
6905
+ {
6906
+ start: selection.start,
6907
+ end: normalizePositionByRangeLength(selection.start - 1, sequenceLength)
6908
+ },
6909
+ sequenceLength
6910
+ );
7058
6911
  });
7059
6912
  return zeroedOverlaps;
7060
6913
  }
@@ -11962,7 +11815,7 @@ const proteinAlphabet = {
11962
11815
  hydrophobicity: 1.8,
11963
11816
  colorByFamily: "#00FFFF",
11964
11817
  color: "hsl(327.3, 100%, 69%)",
11965
- mass: 89.1
11818
+ mass: 71.0779
11966
11819
  },
11967
11820
  R: {
11968
11821
  value: "R",
@@ -11971,7 +11824,7 @@ const proteinAlphabet = {
11971
11824
  hydrophobicity: -4.5,
11972
11825
  colorByFamily: "#FFC0CB",
11973
11826
  color: "hsl(258.1, 100%, 69%)",
11974
- mass: 174.2
11827
+ mass: 156.18568
11975
11828
  },
11976
11829
  N: {
11977
11830
  value: "N",
@@ -11980,7 +11833,7 @@ const proteinAlphabet = {
11980
11833
  hydrophobicity: -3.5,
11981
11834
  colorByFamily: "#D3D3D3",
11982
11835
  color: "hsl(268.9, 100%, 69%)",
11983
- mass: 132.1
11836
+ mass: 114.10264
11984
11837
  },
11985
11838
  D: {
11986
11839
  value: "D",
@@ -11989,7 +11842,7 @@ const proteinAlphabet = {
11989
11842
  hydrophobicity: -3.5,
11990
11843
  colorByFamily: "#EE82EE",
11991
11844
  color: "hsl(268.9, 100%, 69%)",
11992
- mass: 133.1
11845
+ mass: 115.0874
11993
11846
  },
11994
11847
  C: {
11995
11848
  value: "C",
@@ -11998,7 +11851,7 @@ const proteinAlphabet = {
11998
11851
  hydrophobicity: 2.5,
11999
11852
  colorByFamily: "#FFFF00",
12000
11853
  color: "hsl(335.1, 100%, 69%)",
12001
- mass: 121.2
11854
+ mass: 103.1429
12002
11855
  },
12003
11856
  E: {
12004
11857
  value: "E",
@@ -12007,7 +11860,7 @@ const proteinAlphabet = {
12007
11860
  hydrophobicity: -3.5,
12008
11861
  colorByFamily: "#EE82EE",
12009
11862
  color: "hsl(268.9, 100%, 69%)",
12010
- mass: 147.1
11863
+ mass: 129.11398
12011
11864
  },
12012
11865
  Q: {
12013
11866
  value: "Q",
@@ -12016,7 +11869,7 @@ const proteinAlphabet = {
12016
11869
  hydrophobicity: -3.5,
12017
11870
  colorByFamily: "#D3D3D3",
12018
11871
  color: "hsl(268.9, 100%, 69%)",
12019
- mass: 146.2
11872
+ mass: 128.12922
12020
11873
  },
12021
11874
  G: {
12022
11875
  value: "G",
@@ -12025,7 +11878,7 @@ const proteinAlphabet = {
12025
11878
  hydrophobicity: -0.4,
12026
11879
  colorByFamily: "#00FFFF",
12027
11880
  color: "hsl(303.1, 100%, 69%)",
12028
- mass: 75.1
11881
+ mass: 57.05132
12029
11882
  },
12030
11883
  H: {
12031
11884
  value: "H",
@@ -12034,7 +11887,7 @@ const proteinAlphabet = {
12034
11887
  hydrophobicity: -3.2,
12035
11888
  colorByFamily: "#FFC0CB",
12036
11889
  color: "hsl(272.2, 100%, 69%)",
12037
- mass: 155.2
11890
+ mass: 137.13928
12038
11891
  },
12039
11892
  I: {
12040
11893
  value: "I",
@@ -12043,7 +11896,7 @@ const proteinAlphabet = {
12043
11896
  hydrophobicity: 4.5,
12044
11897
  colorByFamily: "#00FFFF",
12045
11898
  color: "hsl(356.9, 100%, 69%)",
12046
- mass: 131.2
11899
+ mass: 113.15764
12047
11900
  },
12048
11901
  L: {
12049
11902
  value: "L",
@@ -12052,7 +11905,7 @@ const proteinAlphabet = {
12052
11905
  hydrophobicity: 3.8,
12053
11906
  colorByFamily: "#00FFFF",
12054
11907
  color: "hsl(349.4, 100%, 69%)",
12055
- mass: 131.2
11908
+ mass: 113.15764
12056
11909
  },
12057
11910
  K: {
12058
11911
  value: "K",
@@ -12061,7 +11914,7 @@ const proteinAlphabet = {
12061
11914
  hydrophobicity: -3.9,
12062
11915
  colorByFamily: "#FFC0CB",
12063
11916
  color: "hsl(264.7, 100%, 69%)",
12064
- mass: 146.2
11917
+ mass: 128.17228
12065
11918
  },
12066
11919
  M: {
12067
11920
  value: "M",
@@ -12070,7 +11923,7 @@ const proteinAlphabet = {
12070
11923
  hydrophobicity: 1.9,
12071
11924
  colorByFamily: "#FFFF00",
12072
11925
  color: "hsl(328.5, 100%, 69%)",
12073
- mass: 149.2
11926
+ mass: 131.19606
12074
11927
  },
12075
11928
  F: {
12076
11929
  value: "F",
@@ -12079,7 +11932,7 @@ const proteinAlphabet = {
12079
11932
  hydrophobicity: 2.8,
12080
11933
  colorByFamily: "#FFA500",
12081
11934
  color: "hsl(338.4, 100%, 69%)",
12082
- mass: 165.2
11935
+ mass: 147.17386
12083
11936
  },
12084
11937
  P: {
12085
11938
  value: "P",
@@ -12088,7 +11941,7 @@ const proteinAlphabet = {
12088
11941
  hydrophobicity: -1.6,
12089
11942
  colorByFamily: "#00FFFF",
12090
11943
  color: "hsl(289.9, 100%, 69%)",
12091
- mass: 115.1
11944
+ mass: 97.11518
12092
11945
  },
12093
11946
  S: {
12094
11947
  value: "S",
@@ -12097,7 +11950,7 @@ const proteinAlphabet = {
12097
11950
  hydrophobicity: -0.8,
12098
11951
  colorByFamily: "#90EE90",
12099
11952
  color: "hsl(298.6, 100%, 69%)",
12100
- mass: 105.1
11953
+ mass: 87.0773
12101
11954
  },
12102
11955
  T: {
12103
11956
  value: "T",
@@ -12106,7 +11959,7 @@ const proteinAlphabet = {
12106
11959
  hydrophobicity: -0.7,
12107
11960
  colorByFamily: "#90EE90",
12108
11961
  color: "hsl(299.8, 100%, 69%)",
12109
- mass: 119.1
11962
+ mass: 101.10388
12110
11963
  },
12111
11964
  U: {
12112
11965
  value: "U",
@@ -12114,7 +11967,7 @@ const proteinAlphabet = {
12114
11967
  threeLettersName: "Sec",
12115
11968
  colorByFamily: "#FF0000",
12116
11969
  color: "hsl(0, 100%, 69%)",
12117
- mass: 168.1
11970
+ mass: 150.3079
12118
11971
  },
12119
11972
  W: {
12120
11973
  value: "W",
@@ -12123,7 +11976,7 @@ const proteinAlphabet = {
12123
11976
  hydrophobicity: -0.9,
12124
11977
  colorByFamily: "#FFA500",
12125
11978
  color: "hsl(297.6, 100%, 69%)",
12126
- mass: 204.2
11979
+ mass: 186.2099
12127
11980
  },
12128
11981
  Y: {
12129
11982
  value: "Y",
@@ -12132,7 +11985,7 @@ const proteinAlphabet = {
12132
11985
  hydrophobicity: -1.3,
12133
11986
  colorByFamily: "#FFA500",
12134
11987
  color: "hsl(293.2, 100%, 69%)",
12135
- mass: 181.2
11988
+ mass: 163.17326
12136
11989
  },
12137
11990
  V: {
12138
11991
  value: "V",
@@ -12141,7 +11994,7 @@ const proteinAlphabet = {
12141
11994
  hydrophobicity: 4.2,
12142
11995
  colorByFamily: "#00FFFF",
12143
11996
  color: "hsl(353.6, 100%, 69%)",
12144
- mass: 117.1
11997
+ mass: 99.13106
12145
11998
  },
12146
11999
  "*": {
12147
12000
  value: "*",
@@ -12470,20 +12323,91 @@ const modifiableTypes = [
12470
12323
  "primers",
12471
12324
  "guides"
12472
12325
  ];
12473
- function filterSequenceString(sequenceString, additionalValidChars = "", charOverrides) {
12474
- if (sequenceString) {
12475
- return sequenceString.replace(
12476
- new RegExp(
12477
- `[^${charOverrides || `atgcyrswkmbvdhnu${additionalValidChars.split("").join("\\")}`}]`,
12478
- "gi"
12479
- ),
12480
- ""
12326
+ function filterSequenceString(sequenceString, {
12327
+ additionalValidChars = "",
12328
+ isOligo,
12329
+ name,
12330
+ isProtein,
12331
+ isRna,
12332
+ isMixedRnaAndDna,
12333
+ includeStopCodon
12334
+ } = {}) {
12335
+ const acceptedChars = getAcceptedChars({
12336
+ isOligo,
12337
+ isProtein,
12338
+ isRna,
12339
+ isMixedRnaAndDna,
12340
+ includeStopCodon
12341
+ });
12342
+ const replaceChars = getReplaceChars({
12343
+ isOligo,
12344
+ isProtein,
12345
+ isRna,
12346
+ isMixedRnaAndDna
12347
+ });
12348
+ let sanitizedVal = "";
12349
+ const invalidChars = [];
12350
+ const chars = `${acceptedChars}${additionalValidChars.split("").join("\\")}`;
12351
+ const warnings = [];
12352
+ const replaceCount = {};
12353
+ sequenceString.split("").forEach((letter) => {
12354
+ const lowerLetter = letter.toLowerCase();
12355
+ if (replaceChars && replaceChars[lowerLetter]) {
12356
+ if (!replaceCount[lowerLetter]) {
12357
+ replaceCount[lowerLetter] = 0;
12358
+ }
12359
+ replaceCount[lowerLetter]++;
12360
+ const isUpper = lowerLetter !== letter;
12361
+ sanitizedVal += isUpper ? replaceChars[lowerLetter].toUpperCase() : replaceChars[lowerLetter];
12362
+ } else if (chars.includes(lowerLetter)) {
12363
+ sanitizedVal += letter;
12364
+ } else {
12365
+ invalidChars.push(letter);
12366
+ }
12367
+ });
12368
+ Object.keys(replaceCount).forEach((letter) => {
12369
+ warnings.push(
12370
+ `Replaced "${letter}" with "${replaceChars[letter]}"${replaceCount[letter] > 1 ? ` ${replaceCount[letter]} times` : ""}`
12481
12371
  );
12482
- } else {
12483
- return sequenceString;
12372
+ });
12373
+ if (sequenceString.length !== sanitizedVal.length) {
12374
+ warnings.push(
12375
+ `${name ? `Sequence ${name}: ` : ""}Invalid character(s) detected and removed: ${invalidChars.slice(0, 100).join(", ")} `
12376
+ );
12377
+ }
12378
+ if (typeof window !== "undefined" && window.toastr && warnings.length) {
12379
+ warnings.forEach((warning) => {
12380
+ window.toastr.warning(warning);
12381
+ });
12484
12382
  }
12383
+ return [sanitizedVal, warnings];
12485
12384
  }
12486
12385
  __name(filterSequenceString, "filterSequenceString");
12386
+ function getAcceptedChars({
12387
+ isOligo,
12388
+ isProtein,
12389
+ isRna,
12390
+ isMixedRnaAndDna,
12391
+ includeStopCodon
12392
+ } = {}) {
12393
+ return isProtein ? `${protein_letters_withUandX.toLowerCase()}${includeStopCodon ? "*." : ""}}` : isOligo ? ambiguous_rna_letters.toLowerCase() + "t" : isRna ? ambiguous_rna_letters.toLowerCase() + "t" : isMixedRnaAndDna ? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase() : (
12394
+ //just plain old dna
12395
+ ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase()
12396
+ );
12397
+ }
12398
+ __name(getAcceptedChars, "getAcceptedChars");
12399
+ function getReplaceChars({
12400
+ isOligo,
12401
+ isProtein,
12402
+ isRna,
12403
+ isMixedRnaAndDna
12404
+ } = {}) {
12405
+ return isProtein ? {} : isOligo ? {} : isRna ? { t: "u" } : isMixedRnaAndDna ? {} : (
12406
+ //just plain old dna
12407
+ {}
12408
+ );
12409
+ }
12410
+ __name(getReplaceChars, "getReplaceChars");
12487
12411
  function tidyUpAnnotation(_annotation, {
12488
12412
  sequenceData = {},
12489
12413
  convertAnnotationsFromAAIndices,
@@ -12596,13 +12520,13 @@ function coerceLocation({
12596
12520
  messages.push(
12597
12521
  "Invalid annotation start: " + location.start + " detected for " + location.name + " and set to size: " + size
12598
12522
  );
12599
- location.start = size - (isProtein ? 3 : 1);
12523
+ location.start = Math.max(0, size - (isProtein ? 3 : 1));
12600
12524
  }
12601
12525
  if (location.end < 0 || !(location.end <= size - 1) || location.end > size - 1) {
12602
12526
  messages.push(
12603
12527
  "Invalid annotation end: " + location.end + " detected for " + location.name + " and set to seq size: " + size
12604
12528
  );
12605
- location.end = size - 1;
12529
+ location.end = Math.max(0, size - 1);
12606
12530
  }
12607
12531
  if (location.start > location.end && circular === false) {
12608
12532
  messages.push(
@@ -12612,14 +12536,6 @@ function coerceLocation({
12612
12536
  }
12613
12537
  }
12614
12538
  __name(coerceLocation, "coerceLocation");
12615
- function filterAminoAcidSequenceString(sequenceString, options) {
12616
- options = options || {};
12617
- if (options.includeStopCodon) {
12618
- return sequenceString.replace(/[^xtgalmfwkqespvicyhrndu.*]/gi, "");
12619
- }
12620
- return sequenceString.replace(/[^xtgalmfwkqespvicyhrndu]/gi, "");
12621
- }
12622
- __name(filterAminoAcidSequenceString, "filterAminoAcidSequenceString");
12623
12539
  function getDegenerateDnaStringFromAAString(aaString) {
12624
12540
  return aaString.split("").map((char) => aminoAcidToDegenerateDnaMap[char.toLowerCase()] || "nnn").join("");
12625
12541
  }
@@ -12631,11 +12547,10 @@ function tidyUpSequenceData(pSeqData, options = {}) {
12631
12547
  removeUnwantedChars,
12632
12548
  additionalValidChars,
12633
12549
  noTranslationData,
12634
- charOverrides,
12635
12550
  doNotProvideIdsForAnnotations,
12636
- proteinFilterOptions,
12637
12551
  noCdsTranslations,
12638
- convertAnnotationsFromAAIndices
12552
+ convertAnnotationsFromAAIndices,
12553
+ topLevelSeqData
12639
12554
  } = options;
12640
12555
  let seqData = lodashExports.cloneDeep(pSeqData);
12641
12556
  const response = {
@@ -12665,16 +12580,15 @@ function tidyUpSequenceData(pSeqData, options = {}) {
12665
12580
  }
12666
12581
  if (removeUnwantedChars) {
12667
12582
  if (seqData.isProtein) {
12668
- seqData.proteinSequence = filterAminoAcidSequenceString(
12669
- seqData.proteinSequence,
12670
- __spreadValues({ includeStopCodon: true }, proteinFilterOptions)
12671
- );
12583
+ const [newSeq] = filterSequenceString(seqData.proteinSequence, __spreadValues({
12584
+ includeStopCodon: true
12585
+ }, topLevelSeqData || seqData));
12586
+ seqData.proteinSequence = newSeq;
12672
12587
  } else {
12673
- seqData.sequence = filterSequenceString(
12674
- seqData.sequence,
12675
- `${additionalValidChars || ""}${seqData.isRna || seqData.isMixedRnaAndDna ? "u" : ""}`,
12676
- charOverrides
12677
- );
12588
+ const [newSeq] = filterSequenceString(seqData.sequence, __spreadValues({
12589
+ additionalValidChars
12590
+ }, topLevelSeqData || seqData));
12591
+ seqData.sequence = newSeq;
12678
12592
  }
12679
12593
  }
12680
12594
  if (seqData.isProtein) {
@@ -13108,7 +13022,7 @@ const calcTmMethods = {
13108
13022
  calculateTemperature: function(sequence, type, A, R, C, Na) {
13109
13023
  if (typeof type === "undefined") {
13110
13024
  type = this.TABLE_BRESLAUER;
13111
- } else if (type != this.TABLE_BRESLAUER && (type != this.TABLE_UNIFIED && type != this.TABLE_SUGIMOTO)) {
13025
+ } else if (type != this.TABLE_BRESLAUER && type != this.TABLE_UNIFIED && type != this.TABLE_SUGIMOTO) {
13112
13026
  throw new Error("Invalid table type!");
13113
13027
  }
13114
13028
  if (!A) {
@@ -21470,12 +21384,7 @@ function findSequenceMatches(sequence, searchString, options = {}) {
21470
21384
  }
21471
21385
  __name(findSequenceMatches, "findSequenceMatches");
21472
21386
  function findSequenceMatchesTopStrand(sequence, searchString, options = {}) {
21473
- const {
21474
- isCircular,
21475
- isAmbiguous,
21476
- isProteinSequence,
21477
- isProteinSearch
21478
- } = options;
21387
+ const { isCircular, isAmbiguous, isProteinSequence, isProteinSearch } = options;
21479
21388
  let searchStringToUse = escapeStringRegexp(searchString);
21480
21389
  if (isAmbiguous) {
21481
21390
  if (isProteinSearch || isProteinSequence) {
@@ -21608,7 +21517,10 @@ function getComplementAminoAcidStringFromSequenceString(sequenceString) {
21608
21517
  __name(getComplementAminoAcidStringFromSequenceString, "getComplementAminoAcidStringFromSequenceString");
21609
21518
  function getComplementSequenceString(sequence, isRna) {
21610
21519
  let complementSeqString = "";
21611
- const complementMap = lodashExports.merge(DNAComplementMap, isRna ? { a: "u", A: "U" } : { a: "t", A: "T" });
21520
+ const complementMap = lodashExports.merge(
21521
+ DNAComplementMap,
21522
+ isRna ? { a: "u", A: "U" } : { a: "t", A: "T" }
21523
+ );
21612
21524
  for (let i = 0; i < sequence.length; i++) {
21613
21525
  let complementChar = complementMap[sequence[i]];
21614
21526
  if (!complementChar) {
@@ -21912,7 +21824,9 @@ function getReverseAminoAcidStringFromSequenceString(sequenceString) {
21912
21824
  }
21913
21825
  __name(getReverseAminoAcidStringFromSequenceString, "getReverseAminoAcidStringFromSequenceString");
21914
21826
  function getReverseComplementAminoAcidStringFromSequenceString(sequenceString) {
21915
- return getAminoAcidStringFromSequenceString(getReverseComplementSequenceString(sequenceString));
21827
+ return getAminoAcidStringFromSequenceString(
21828
+ getReverseComplementSequenceString(sequenceString)
21829
+ );
21916
21830
  }
21917
21831
  __name(getReverseComplementAminoAcidStringFromSequenceString, "getReverseComplementAminoAcidStringFromSequenceString");
21918
21832
  function getReverseComplementAnnotation(annotation, sequenceLength) {
@@ -22762,6 +22676,9 @@ function getMassOfAaString(aaString, numsAfterDecimal = 2, divideByThree = false
22762
22676
  if (divideByThree) {
22763
22677
  sumMass /= 3;
22764
22678
  }
22679
+ if (aaString.length > 0) {
22680
+ sumMass = sumMass + 18.0153;
22681
+ }
22765
22682
  return Math.round(sumMass * __pow(10, numsAfterDecimal)) / __pow(10, numsAfterDecimal);
22766
22683
  }
22767
22684
  __name(getMassOfAaString, "getMassOfAaString");
@@ -22811,7 +22728,6 @@ exports.degenerateRnaToAminoAcidMap = degenerateRnaToAminoAcidMap;
22811
22728
  exports.deleteSequenceDataAtRange = deleteSequenceDataAtRange;
22812
22729
  exports.doesEnzymeChopOutsideOfRecognitionSite = doesEnzymeChopOutsideOfRecognitionSite;
22813
22730
  exports.featureColors = featureColors;
22814
- exports.filterAminoAcidSequenceString = filterAminoAcidSequenceString;
22815
22731
  exports.filterSequenceString = filterSequenceString;
22816
22732
  exports.findNearestRangeOfSequenceOverlapToPosition = findNearestRangeOfSequenceOverlapToPosition;
22817
22733
  exports.findOrfsInPlasmid = findOrfsInPlasmid;