@teselagen/ove 0.3.31 → 0.3.44

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/index.cjs.js CHANGED
@@ -77896,6 +77896,7 @@ const minimumOrfSize$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.de
77896
77896
  minimumOrfSizeUpdate
77897
77897
  }, Symbol.toStringTag, { value: "Module" }));
77898
77898
  const protein_letters = "ACDEFGHIKLMNPQRSTVWY";
77899
+ const protein_letters_withUandX = "ACDEFGHIKLMNPQRSTVWYUX";
77899
77900
  const extended_protein_letters = "ACDEFGHIKLMNPQRSTVWYBXZJUO.*-";
77900
77901
  const ambiguous_dna_letters = "GATCRYWSMKHBVDN";
77901
77902
  const unambiguous_dna_letters = "GATC";
@@ -77964,6 +77965,7 @@ const bioData = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
77964
77965
  extended_protein_letters,
77965
77966
  extended_protein_values,
77966
77967
  protein_letters,
77968
+ protein_letters_withUandX,
77967
77969
  unambiguous_dna_letters,
77968
77970
  unambiguous_rna_letters
77969
77971
  }, Symbol.toStringTag, { value: "Module" }));
@@ -83982,20 +83984,91 @@ const modifiableTypes = [
83982
83984
  "primers",
83983
83985
  "guides"
83984
83986
  ];
83985
- function filterSequenceString(sequenceString, additionalValidChars = "", charOverrides) {
83986
- if (sequenceString) {
83987
- return sequenceString.replace(
83988
- new RegExp(
83989
- `[^${charOverrides || `atgcyrswkmbvdhnu${additionalValidChars.split("").join("\\")}`}]`,
83990
- "gi"
83991
- ),
83992
- ""
83987
+ function filterSequenceString(sequenceString, {
83988
+ additionalValidChars = "",
83989
+ isOligo: isOligo2,
83990
+ name: name2,
83991
+ isProtein: isProtein2,
83992
+ isRna: isRna2,
83993
+ isMixedRnaAndDna,
83994
+ includeStopCodon
83995
+ } = {}) {
83996
+ const acceptedChars = getAcceptedChars({
83997
+ isOligo: isOligo2,
83998
+ isProtein: isProtein2,
83999
+ isRna: isRna2,
84000
+ isMixedRnaAndDna,
84001
+ includeStopCodon
84002
+ });
84003
+ const replaceChars = getReplaceChars({
84004
+ isOligo: isOligo2,
84005
+ isProtein: isProtein2,
84006
+ isRna: isRna2,
84007
+ isMixedRnaAndDna
84008
+ });
84009
+ let sanitizedVal = "";
84010
+ const invalidChars = [];
84011
+ const chars2 = `${acceptedChars}${additionalValidChars.split("").join("\\")}`;
84012
+ const warnings = [];
84013
+ const replaceCount = {};
84014
+ sequenceString.split("").forEach((letter) => {
84015
+ const lowerLetter = letter.toLowerCase();
84016
+ if (replaceChars && replaceChars[lowerLetter]) {
84017
+ if (!replaceCount[lowerLetter]) {
84018
+ replaceCount[lowerLetter] = 0;
84019
+ }
84020
+ replaceCount[lowerLetter]++;
84021
+ const isUpper = lowerLetter !== letter;
84022
+ sanitizedVal += isUpper ? replaceChars[lowerLetter].toUpperCase() : replaceChars[lowerLetter];
84023
+ } else if (chars2.includes(lowerLetter)) {
84024
+ sanitizedVal += letter;
84025
+ } else {
84026
+ invalidChars.push(letter);
84027
+ }
84028
+ });
84029
+ Object.keys(replaceCount).forEach((letter) => {
84030
+ warnings.push(
84031
+ `Replaced "${letter}" with "${replaceChars[letter]}"${replaceCount[letter] > 1 ? ` ${replaceCount[letter]} times` : ""}`
84032
+ );
84033
+ });
84034
+ if (sequenceString.length !== sanitizedVal.length) {
84035
+ warnings.push(
84036
+ `${name2 ? `Sequence ${name2}: ` : ""}Invalid character(s) detected and removed: ${invalidChars.slice(0, 100).join(", ")} `
83993
84037
  );
83994
- } else {
83995
- return sequenceString;
83996
84038
  }
84039
+ if (typeof window !== "undefined" && window.toastr && warnings.length) {
84040
+ warnings.forEach((warning2) => {
84041
+ window.toastr.warning(warning2);
84042
+ });
84043
+ }
84044
+ return [sanitizedVal, warnings];
83997
84045
  }
83998
84046
  __name(filterSequenceString, "filterSequenceString");
84047
+ function getAcceptedChars({
84048
+ isOligo: isOligo2,
84049
+ isProtein: isProtein2,
84050
+ isRna: isRna2,
84051
+ isMixedRnaAndDna,
84052
+ includeStopCodon
84053
+ } = {}) {
84054
+ return isProtein2 ? `${protein_letters_withUandX.toLowerCase()}${includeStopCodon ? "*." : ""}}` : isOligo2 ? ambiguous_rna_letters.toLowerCase() + "t" : isRna2 ? ambiguous_rna_letters.toLowerCase() + "t" : isMixedRnaAndDna ? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase() : (
84055
+ //just plain old dna
84056
+ ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase()
84057
+ );
84058
+ }
84059
+ __name(getAcceptedChars, "getAcceptedChars");
84060
+ function getReplaceChars({
84061
+ isOligo: isOligo2,
84062
+ isProtein: isProtein2,
84063
+ isRna: isRna2,
84064
+ isMixedRnaAndDna
84065
+ } = {}) {
84066
+ return isProtein2 ? {} : isOligo2 ? {} : isRna2 ? { t: "u" } : isMixedRnaAndDna ? {} : (
84067
+ //just plain old dna
84068
+ {}
84069
+ );
84070
+ }
84071
+ __name(getReplaceChars, "getReplaceChars");
83999
84072
  function tidyUpAnnotation(_annotation, {
84000
84073
  sequenceData: sequenceData2 = {},
84001
84074
  convertAnnotationsFromAAIndices,
@@ -84124,14 +84197,6 @@ function coerceLocation({
84124
84197
  }
84125
84198
  }
84126
84199
  __name(coerceLocation, "coerceLocation");
84127
- function filterAminoAcidSequenceString(sequenceString, options) {
84128
- options = options || {};
84129
- if (options.includeStopCodon) {
84130
- return sequenceString == null ? void 0 : sequenceString.replace(/[^xtgalmfwkqespvicyhrndu.*]/gi, "");
84131
- }
84132
- return sequenceString == null ? void 0 : sequenceString.replace(/[^xtgalmfwkqespvicyhrndu]/gi, "");
84133
- }
84134
- __name(filterAminoAcidSequenceString, "filterAminoAcidSequenceString");
84135
84200
  function getDegenerateDnaStringFromAAString(aaString) {
84136
84201
  return aaString.split("").map((char) => aminoAcidToDegenerateDnaMap[char.toLowerCase()] || "nnn").join("");
84137
84202
  }
@@ -84143,11 +84208,10 @@ function tidyUpSequenceData(pSeqData, options = {}) {
84143
84208
  removeUnwantedChars,
84144
84209
  additionalValidChars,
84145
84210
  noTranslationData,
84146
- charOverrides,
84147
84211
  doNotProvideIdsForAnnotations,
84148
- proteinFilterOptions,
84149
84212
  noCdsTranslations,
84150
- convertAnnotationsFromAAIndices
84213
+ convertAnnotationsFromAAIndices,
84214
+ topLevelSeqData
84151
84215
  } = options;
84152
84216
  let seqData = lodashExports.cloneDeep(pSeqData);
84153
84217
  const response = {
@@ -84177,16 +84241,15 @@ function tidyUpSequenceData(pSeqData, options = {}) {
84177
84241
  }
84178
84242
  if (removeUnwantedChars) {
84179
84243
  if (seqData.isProtein) {
84180
- seqData.proteinSequence = filterAminoAcidSequenceString(
84181
- seqData.proteinSequence,
84182
- __spreadValues({ includeStopCodon: true }, proteinFilterOptions)
84183
- );
84244
+ const [newSeq] = filterSequenceString(seqData.proteinSequence, __spreadValues({
84245
+ includeStopCodon: true
84246
+ }, topLevelSeqData || seqData));
84247
+ seqData.proteinSequence = newSeq;
84184
84248
  } else {
84185
- seqData.sequence = filterSequenceString(
84186
- seqData.sequence,
84187
- `${additionalValidChars || ""}${seqData.isRna || seqData.isMixedRnaAndDna ? "u" : ""}`,
84188
- charOverrides
84189
- );
84249
+ const [newSeq] = filterSequenceString(seqData.sequence, __spreadValues({
84250
+ additionalValidChars
84251
+ }, topLevelSeqData || seqData));
84252
+ seqData.sequence = newSeq;
84190
84253
  }
84191
84254
  }
84192
84255
  if (seqData.isProtein) {
@@ -93533,7 +93596,8 @@ function validateSequence(sequence2, options = {}) {
93533
93596
  inclusive1BasedEnd,
93534
93597
  additionalValidChars,
93535
93598
  allowOverflowAnnotations,
93536
- coerceFeatureTypes
93599
+ coerceFeatureTypes,
93600
+ includeStopCodon
93537
93601
  } = options;
93538
93602
  [
93539
93603
  "isDNA",
@@ -93583,7 +93647,6 @@ function validateSequence(sequence2, options = {}) {
93583
93647
  response.messages.push("No sequence detected");
93584
93648
  sequence2.sequence = "";
93585
93649
  }
93586
- let validChars;
93587
93650
  if (sequence2.isProtein === void 0 && guessIfProtein) {
93588
93651
  sequence2.isProtein = !guessIfSequenceIsDnaAndNotProtein(
93589
93652
  sequence2.sequence,
@@ -93591,12 +93654,15 @@ function validateSequence(sequence2, options = {}) {
93591
93654
  );
93592
93655
  }
93593
93656
  if (sequence2.isProtein) {
93594
- validChars = filterAminoAcidSequenceString(sequence2.sequence);
93657
+ const [validChars, warnings] = filterSequenceString(sequence2.sequence, {
93658
+ name: sequence2.name,
93659
+ isProtein: true,
93660
+ additionalValidChars,
93661
+ includeStopCodon
93662
+ });
93595
93663
  if (validChars !== sequence2.sequence) {
93596
93664
  sequence2.sequence = validChars;
93597
- response.messages.push(
93598
- "Import Error: Illegal character(s) detected and removed from amino acid sequence. Allowed characters are: xtgalmfwkqespvicyhrndu"
93599
- );
93665
+ response.messages.push(...warnings);
93600
93666
  }
93601
93667
  sequence2.type = "PROTEIN";
93602
93668
  sequence2.isProtein = true;
@@ -93618,12 +93684,12 @@ function validateSequence(sequence2, options = {}) {
93618
93684
  } else {
93619
93685
  sequence2.type = "DNA";
93620
93686
  }
93621
- validChars = filterSequenceString(sequence2.sequence, additionalValidChars);
93687
+ const [validChars, warnings] = filterSequenceString(sequence2.sequence, __spreadValues({
93688
+ additionalValidChars
93689
+ }, sequence2));
93622
93690
  if (validChars !== sequence2.sequence) {
93623
93691
  sequence2.sequence = validChars;
93624
- response.messages.push(
93625
- "Import Error: Illegal character(s) detected and removed from sequence. Allowed characters are: atgcyrswkmbvdhn"
93626
- );
93692
+ response.messages.push(...warnings);
93627
93693
  }
93628
93694
  }
93629
93695
  if (!sequence2.size) {
@@ -109105,18 +109171,6 @@ function getSelFromWrappedAddon(selectionLayer2, sequenceLength) {
109105
109171
  return selToUse;
109106
109172
  }
109107
109173
  __name(getSelFromWrappedAddon, "getSelFromWrappedAddon");
109108
- function getAcceptedChars({
109109
- isOligo: isOligo2,
109110
- isProtein: isProtein2,
109111
- isRna: isRna2,
109112
- isMixedRnaAndDna
109113
- } = {}) {
109114
- return isProtein2 ? extended_protein_letters.toLowerCase() : isOligo2 ? ambiguous_rna_letters.toLowerCase() + "t" : isRna2 ? ambiguous_rna_letters.toLowerCase() : isMixedRnaAndDna ? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase() : (
109115
- //just plain old dna
109116
- ambiguous_dna_letters.toLowerCase()
109117
- );
109118
- }
109119
- __name(getAcceptedChars, "getAcceptedChars");
109120
109174
  function getStripedPattern({ color: color2 }) {
109121
109175
  return /* @__PURE__ */ React$2.createElement(
109122
109176
  "pattern",
@@ -125723,7 +125777,7 @@ function showFileDialog({ multiple = false, onSelect }) {
125723
125777
  }
125724
125778
  __name(showFileDialog, "showFileDialog");
125725
125779
  const name = "@teselagen/ove";
125726
- const version = "0.3.30";
125780
+ const version = "0.3.43";
125727
125781
  const main = "./src/index.js";
125728
125782
  const exports$1 = {
125729
125783
  ".": {
@@ -129476,9 +129530,8 @@ const _SequenceInputNoHotkeys = class _SequenceInputNoHotkeys extends React$2.Co
129476
129530
  selectionLayer: selectionLayer2,
129477
129531
  sequenceLength,
129478
129532
  isProtein: isProtein2,
129479
- replaceChars,
129480
129533
  caretPosition: caretPosition2,
129481
- acceptedChars,
129534
+ sequenceData: sequenceData2,
129482
129535
  maxInsertSize
129483
129536
  } = this.props;
129484
129537
  const { charsToInsert, hasTempError } = this.state;
@@ -129511,17 +129564,13 @@ const _SequenceInputNoHotkeys = class _SequenceInputNoHotkeys extends React$2.Co
129511
129564
  autoFocus: true,
129512
129565
  style: hasTempError ? { borderColor: "red" } : {},
129513
129566
  onChange: (e2) => {
129514
- let sanitizedVal = "";
129515
- e2.target.value.split("").forEach((letter) => {
129516
- const lowerLetter = letter.toLowerCase();
129517
- if (replaceChars && replaceChars[lowerLetter]) {
129518
- const isUpper = lowerLetter !== letter;
129519
- sanitizedVal += isUpper ? replaceChars[lowerLetter].toUpperCase() : replaceChars[lowerLetter];
129520
- } else if (acceptedChars.includes(lowerLetter)) {
129521
- sanitizedVal += letter;
129522
- }
129523
- });
129524
- if (e2.target.value.length !== sanitizedVal.length) {
129567
+ const [sanitizedVal, warnings] = filterSequenceString(
129568
+ e2.target.value,
129569
+ __spreadProps(__spreadValues({}, sequenceData2), {
129570
+ name: void 0
129571
+ })
129572
+ );
129573
+ if (warnings.length) {
129525
129574
  this.setState({
129526
129575
  hasTempError: true
129527
129576
  });
@@ -130396,7 +130445,8 @@ function VectorInteractionHOC(Component) {
130396
130445
  selectionLayer: selectionLayer2 = { start: -1, end: -1 },
130397
130446
  readOnly: readOnly2,
130398
130447
  onPaste,
130399
- disableBpEditing
130448
+ disableBpEditing,
130449
+ sequenceData: sequenceData2
130400
130450
  } = this.props;
130401
130451
  if (disableBpEditing) {
130402
130452
  return window.toastr.warning("Sorry the underlying sequence is locked");
@@ -130421,6 +130471,7 @@ function VectorInteractionHOC(Component) {
130421
130471
  };
130422
130472
  }
130423
130473
  seqDataToInsert = tidyUpSequenceData(seqDataToInsert, {
130474
+ topLevelSeqData: sequenceData2,
130424
130475
  provideNewIdsForAnnotations: true,
130425
130476
  annotationsAsObjects: true,
130426
130477
  removeUnwantedChars: true,
@@ -130516,8 +130567,7 @@ function VectorInteractionHOC(Component) {
130516
130567
  createSequenceInputPopup({
130517
130568
  useEventPositioning,
130518
130569
  isReplace,
130519
- replaceChars: sequenceData2.isRna ? { t: "u" } : void 0,
130520
- acceptedChars: getAcceptedChars(sequenceData2),
130570
+ sequenceData: sequenceData2,
130521
130571
  isProtein: sequenceData2.isProtein,
130522
130572
  selectionLayer: selectionLayer2,
130523
130573
  sequenceLength,
@@ -142010,14 +142060,8 @@ const CustomContentEditable = generateField(/* @__PURE__ */ __name(function Cust
142010
142060
  const newVal2 = e2.target.innerText;
142011
142061
  const savedCaretPosition = EditCaretPositioning.saveSelection(e2.currentTarget);
142012
142062
  setCaretPosition(savedCaretPosition);
142013
- const acceptedChars = getAcceptedChars(sequenceData2);
142014
- let newBases = "";
142015
- newVal2.split("").forEach((letter) => {
142016
- if (acceptedChars.includes(letter.toLowerCase())) {
142017
- newBases += letter;
142018
- }
142019
- });
142020
- if (newVal2.length !== newBases.length) {
142063
+ const [newBases, warnings] = filterSequenceString(newVal2, sequenceData2);
142064
+ if (warnings.length) {
142021
142065
  setTempError(true);
142022
142066
  setTimeout(() => {
142023
142067
  setTempError(false);
package/index.es.js CHANGED
@@ -77878,6 +77878,7 @@ const minimumOrfSize$1 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.de
77878
77878
  minimumOrfSizeUpdate
77879
77879
  }, Symbol.toStringTag, { value: "Module" }));
77880
77880
  const protein_letters = "ACDEFGHIKLMNPQRSTVWY";
77881
+ const protein_letters_withUandX = "ACDEFGHIKLMNPQRSTVWYUX";
77881
77882
  const extended_protein_letters = "ACDEFGHIKLMNPQRSTVWYBXZJUO.*-";
77882
77883
  const ambiguous_dna_letters = "GATCRYWSMKHBVDN";
77883
77884
  const unambiguous_dna_letters = "GATC";
@@ -77946,6 +77947,7 @@ const bioData = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.definePrope
77946
77947
  extended_protein_letters,
77947
77948
  extended_protein_values,
77948
77949
  protein_letters,
77950
+ protein_letters_withUandX,
77949
77951
  unambiguous_dna_letters,
77950
77952
  unambiguous_rna_letters
77951
77953
  }, Symbol.toStringTag, { value: "Module" }));
@@ -83964,20 +83966,91 @@ const modifiableTypes = [
83964
83966
  "primers",
83965
83967
  "guides"
83966
83968
  ];
83967
- function filterSequenceString(sequenceString, additionalValidChars = "", charOverrides) {
83968
- if (sequenceString) {
83969
- return sequenceString.replace(
83970
- new RegExp(
83971
- `[^${charOverrides || `atgcyrswkmbvdhnu${additionalValidChars.split("").join("\\")}`}]`,
83972
- "gi"
83973
- ),
83974
- ""
83969
+ function filterSequenceString(sequenceString, {
83970
+ additionalValidChars = "",
83971
+ isOligo: isOligo2,
83972
+ name: name2,
83973
+ isProtein: isProtein2,
83974
+ isRna: isRna2,
83975
+ isMixedRnaAndDna,
83976
+ includeStopCodon
83977
+ } = {}) {
83978
+ const acceptedChars = getAcceptedChars({
83979
+ isOligo: isOligo2,
83980
+ isProtein: isProtein2,
83981
+ isRna: isRna2,
83982
+ isMixedRnaAndDna,
83983
+ includeStopCodon
83984
+ });
83985
+ const replaceChars = getReplaceChars({
83986
+ isOligo: isOligo2,
83987
+ isProtein: isProtein2,
83988
+ isRna: isRna2,
83989
+ isMixedRnaAndDna
83990
+ });
83991
+ let sanitizedVal = "";
83992
+ const invalidChars = [];
83993
+ const chars2 = `${acceptedChars}${additionalValidChars.split("").join("\\")}`;
83994
+ const warnings = [];
83995
+ const replaceCount = {};
83996
+ sequenceString.split("").forEach((letter) => {
83997
+ const lowerLetter = letter.toLowerCase();
83998
+ if (replaceChars && replaceChars[lowerLetter]) {
83999
+ if (!replaceCount[lowerLetter]) {
84000
+ replaceCount[lowerLetter] = 0;
84001
+ }
84002
+ replaceCount[lowerLetter]++;
84003
+ const isUpper = lowerLetter !== letter;
84004
+ sanitizedVal += isUpper ? replaceChars[lowerLetter].toUpperCase() : replaceChars[lowerLetter];
84005
+ } else if (chars2.includes(lowerLetter)) {
84006
+ sanitizedVal += letter;
84007
+ } else {
84008
+ invalidChars.push(letter);
84009
+ }
84010
+ });
84011
+ Object.keys(replaceCount).forEach((letter) => {
84012
+ warnings.push(
84013
+ `Replaced "${letter}" with "${replaceChars[letter]}"${replaceCount[letter] > 1 ? ` ${replaceCount[letter]} times` : ""}`
84014
+ );
84015
+ });
84016
+ if (sequenceString.length !== sanitizedVal.length) {
84017
+ warnings.push(
84018
+ `${name2 ? `Sequence ${name2}: ` : ""}Invalid character(s) detected and removed: ${invalidChars.slice(0, 100).join(", ")} `
83975
84019
  );
83976
- } else {
83977
- return sequenceString;
83978
84020
  }
84021
+ if (typeof window !== "undefined" && window.toastr && warnings.length) {
84022
+ warnings.forEach((warning2) => {
84023
+ window.toastr.warning(warning2);
84024
+ });
84025
+ }
84026
+ return [sanitizedVal, warnings];
83979
84027
  }
83980
84028
  __name(filterSequenceString, "filterSequenceString");
84029
+ function getAcceptedChars({
84030
+ isOligo: isOligo2,
84031
+ isProtein: isProtein2,
84032
+ isRna: isRna2,
84033
+ isMixedRnaAndDna,
84034
+ includeStopCodon
84035
+ } = {}) {
84036
+ return isProtein2 ? `${protein_letters_withUandX.toLowerCase()}${includeStopCodon ? "*." : ""}}` : isOligo2 ? ambiguous_rna_letters.toLowerCase() + "t" : isRna2 ? ambiguous_rna_letters.toLowerCase() + "t" : isMixedRnaAndDna ? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase() : (
84037
+ //just plain old dna
84038
+ ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase()
84039
+ );
84040
+ }
84041
+ __name(getAcceptedChars, "getAcceptedChars");
84042
+ function getReplaceChars({
84043
+ isOligo: isOligo2,
84044
+ isProtein: isProtein2,
84045
+ isRna: isRna2,
84046
+ isMixedRnaAndDna
84047
+ } = {}) {
84048
+ return isProtein2 ? {} : isOligo2 ? {} : isRna2 ? { t: "u" } : isMixedRnaAndDna ? {} : (
84049
+ //just plain old dna
84050
+ {}
84051
+ );
84052
+ }
84053
+ __name(getReplaceChars, "getReplaceChars");
83981
84054
  function tidyUpAnnotation(_annotation, {
83982
84055
  sequenceData: sequenceData2 = {},
83983
84056
  convertAnnotationsFromAAIndices,
@@ -84106,14 +84179,6 @@ function coerceLocation({
84106
84179
  }
84107
84180
  }
84108
84181
  __name(coerceLocation, "coerceLocation");
84109
- function filterAminoAcidSequenceString(sequenceString, options) {
84110
- options = options || {};
84111
- if (options.includeStopCodon) {
84112
- return sequenceString == null ? void 0 : sequenceString.replace(/[^xtgalmfwkqespvicyhrndu.*]/gi, "");
84113
- }
84114
- return sequenceString == null ? void 0 : sequenceString.replace(/[^xtgalmfwkqespvicyhrndu]/gi, "");
84115
- }
84116
- __name(filterAminoAcidSequenceString, "filterAminoAcidSequenceString");
84117
84182
  function getDegenerateDnaStringFromAAString(aaString) {
84118
84183
  return aaString.split("").map((char) => aminoAcidToDegenerateDnaMap[char.toLowerCase()] || "nnn").join("");
84119
84184
  }
@@ -84125,11 +84190,10 @@ function tidyUpSequenceData(pSeqData, options = {}) {
84125
84190
  removeUnwantedChars,
84126
84191
  additionalValidChars,
84127
84192
  noTranslationData,
84128
- charOverrides,
84129
84193
  doNotProvideIdsForAnnotations,
84130
- proteinFilterOptions,
84131
84194
  noCdsTranslations,
84132
- convertAnnotationsFromAAIndices
84195
+ convertAnnotationsFromAAIndices,
84196
+ topLevelSeqData
84133
84197
  } = options;
84134
84198
  let seqData = lodashExports.cloneDeep(pSeqData);
84135
84199
  const response = {
@@ -84159,16 +84223,15 @@ function tidyUpSequenceData(pSeqData, options = {}) {
84159
84223
  }
84160
84224
  if (removeUnwantedChars) {
84161
84225
  if (seqData.isProtein) {
84162
- seqData.proteinSequence = filterAminoAcidSequenceString(
84163
- seqData.proteinSequence,
84164
- __spreadValues({ includeStopCodon: true }, proteinFilterOptions)
84165
- );
84226
+ const [newSeq] = filterSequenceString(seqData.proteinSequence, __spreadValues({
84227
+ includeStopCodon: true
84228
+ }, topLevelSeqData || seqData));
84229
+ seqData.proteinSequence = newSeq;
84166
84230
  } else {
84167
- seqData.sequence = filterSequenceString(
84168
- seqData.sequence,
84169
- `${additionalValidChars || ""}${seqData.isRna || seqData.isMixedRnaAndDna ? "u" : ""}`,
84170
- charOverrides
84171
- );
84231
+ const [newSeq] = filterSequenceString(seqData.sequence, __spreadValues({
84232
+ additionalValidChars
84233
+ }, topLevelSeqData || seqData));
84234
+ seqData.sequence = newSeq;
84172
84235
  }
84173
84236
  }
84174
84237
  if (seqData.isProtein) {
@@ -93515,7 +93578,8 @@ function validateSequence(sequence2, options = {}) {
93515
93578
  inclusive1BasedEnd,
93516
93579
  additionalValidChars,
93517
93580
  allowOverflowAnnotations,
93518
- coerceFeatureTypes
93581
+ coerceFeatureTypes,
93582
+ includeStopCodon
93519
93583
  } = options;
93520
93584
  [
93521
93585
  "isDNA",
@@ -93565,7 +93629,6 @@ function validateSequence(sequence2, options = {}) {
93565
93629
  response.messages.push("No sequence detected");
93566
93630
  sequence2.sequence = "";
93567
93631
  }
93568
- let validChars;
93569
93632
  if (sequence2.isProtein === void 0 && guessIfProtein) {
93570
93633
  sequence2.isProtein = !guessIfSequenceIsDnaAndNotProtein(
93571
93634
  sequence2.sequence,
@@ -93573,12 +93636,15 @@ function validateSequence(sequence2, options = {}) {
93573
93636
  );
93574
93637
  }
93575
93638
  if (sequence2.isProtein) {
93576
- validChars = filterAminoAcidSequenceString(sequence2.sequence);
93639
+ const [validChars, warnings] = filterSequenceString(sequence2.sequence, {
93640
+ name: sequence2.name,
93641
+ isProtein: true,
93642
+ additionalValidChars,
93643
+ includeStopCodon
93644
+ });
93577
93645
  if (validChars !== sequence2.sequence) {
93578
93646
  sequence2.sequence = validChars;
93579
- response.messages.push(
93580
- "Import Error: Illegal character(s) detected and removed from amino acid sequence. Allowed characters are: xtgalmfwkqespvicyhrndu"
93581
- );
93647
+ response.messages.push(...warnings);
93582
93648
  }
93583
93649
  sequence2.type = "PROTEIN";
93584
93650
  sequence2.isProtein = true;
@@ -93600,12 +93666,12 @@ function validateSequence(sequence2, options = {}) {
93600
93666
  } else {
93601
93667
  sequence2.type = "DNA";
93602
93668
  }
93603
- validChars = filterSequenceString(sequence2.sequence, additionalValidChars);
93669
+ const [validChars, warnings] = filterSequenceString(sequence2.sequence, __spreadValues({
93670
+ additionalValidChars
93671
+ }, sequence2));
93604
93672
  if (validChars !== sequence2.sequence) {
93605
93673
  sequence2.sequence = validChars;
93606
- response.messages.push(
93607
- "Import Error: Illegal character(s) detected and removed from sequence. Allowed characters are: atgcyrswkmbvdhn"
93608
- );
93674
+ response.messages.push(...warnings);
93609
93675
  }
93610
93676
  }
93611
93677
  if (!sequence2.size) {
@@ -109087,18 +109153,6 @@ function getSelFromWrappedAddon(selectionLayer2, sequenceLength) {
109087
109153
  return selToUse;
109088
109154
  }
109089
109155
  __name(getSelFromWrappedAddon, "getSelFromWrappedAddon");
109090
- function getAcceptedChars({
109091
- isOligo: isOligo2,
109092
- isProtein: isProtein2,
109093
- isRna: isRna2,
109094
- isMixedRnaAndDna
109095
- } = {}) {
109096
- return isProtein2 ? extended_protein_letters.toLowerCase() : isOligo2 ? ambiguous_rna_letters.toLowerCase() + "t" : isRna2 ? ambiguous_rna_letters.toLowerCase() : isMixedRnaAndDna ? ambiguous_rna_letters.toLowerCase() + ambiguous_dna_letters.toLowerCase() : (
109097
- //just plain old dna
109098
- ambiguous_dna_letters.toLowerCase()
109099
- );
109100
- }
109101
- __name(getAcceptedChars, "getAcceptedChars");
109102
109156
  function getStripedPattern({ color: color2 }) {
109103
109157
  return /* @__PURE__ */ React__default$1.createElement(
109104
109158
  "pattern",
@@ -125705,7 +125759,7 @@ function showFileDialog({ multiple = false, onSelect }) {
125705
125759
  }
125706
125760
  __name(showFileDialog, "showFileDialog");
125707
125761
  const name = "@teselagen/ove";
125708
- const version = "0.3.30";
125762
+ const version = "0.3.43";
125709
125763
  const main = "./src/index.js";
125710
125764
  const exports$1 = {
125711
125765
  ".": {
@@ -129458,9 +129512,8 @@ const _SequenceInputNoHotkeys = class _SequenceInputNoHotkeys extends React__def
129458
129512
  selectionLayer: selectionLayer2,
129459
129513
  sequenceLength,
129460
129514
  isProtein: isProtein2,
129461
- replaceChars,
129462
129515
  caretPosition: caretPosition2,
129463
- acceptedChars,
129516
+ sequenceData: sequenceData2,
129464
129517
  maxInsertSize
129465
129518
  } = this.props;
129466
129519
  const { charsToInsert, hasTempError } = this.state;
@@ -129493,17 +129546,13 @@ const _SequenceInputNoHotkeys = class _SequenceInputNoHotkeys extends React__def
129493
129546
  autoFocus: true,
129494
129547
  style: hasTempError ? { borderColor: "red" } : {},
129495
129548
  onChange: (e2) => {
129496
- let sanitizedVal = "";
129497
- e2.target.value.split("").forEach((letter) => {
129498
- const lowerLetter = letter.toLowerCase();
129499
- if (replaceChars && replaceChars[lowerLetter]) {
129500
- const isUpper = lowerLetter !== letter;
129501
- sanitizedVal += isUpper ? replaceChars[lowerLetter].toUpperCase() : replaceChars[lowerLetter];
129502
- } else if (acceptedChars.includes(lowerLetter)) {
129503
- sanitizedVal += letter;
129504
- }
129505
- });
129506
- if (e2.target.value.length !== sanitizedVal.length) {
129549
+ const [sanitizedVal, warnings] = filterSequenceString(
129550
+ e2.target.value,
129551
+ __spreadProps(__spreadValues({}, sequenceData2), {
129552
+ name: void 0
129553
+ })
129554
+ );
129555
+ if (warnings.length) {
129507
129556
  this.setState({
129508
129557
  hasTempError: true
129509
129558
  });
@@ -130378,7 +130427,8 @@ function VectorInteractionHOC(Component2) {
130378
130427
  selectionLayer: selectionLayer2 = { start: -1, end: -1 },
130379
130428
  readOnly: readOnly2,
130380
130429
  onPaste,
130381
- disableBpEditing
130430
+ disableBpEditing,
130431
+ sequenceData: sequenceData2
130382
130432
  } = this.props;
130383
130433
  if (disableBpEditing) {
130384
130434
  return window.toastr.warning("Sorry the underlying sequence is locked");
@@ -130403,6 +130453,7 @@ function VectorInteractionHOC(Component2) {
130403
130453
  };
130404
130454
  }
130405
130455
  seqDataToInsert = tidyUpSequenceData(seqDataToInsert, {
130456
+ topLevelSeqData: sequenceData2,
130406
130457
  provideNewIdsForAnnotations: true,
130407
130458
  annotationsAsObjects: true,
130408
130459
  removeUnwantedChars: true,
@@ -130498,8 +130549,7 @@ function VectorInteractionHOC(Component2) {
130498
130549
  createSequenceInputPopup({
130499
130550
  useEventPositioning,
130500
130551
  isReplace,
130501
- replaceChars: sequenceData2.isRna ? { t: "u" } : void 0,
130502
- acceptedChars: getAcceptedChars(sequenceData2),
130552
+ sequenceData: sequenceData2,
130503
130553
  isProtein: sequenceData2.isProtein,
130504
130554
  selectionLayer: selectionLayer2,
130505
130555
  sequenceLength,
@@ -141992,14 +142042,8 @@ const CustomContentEditable = generateField(/* @__PURE__ */ __name(function Cust
141992
142042
  const newVal2 = e2.target.innerText;
141993
142043
  const savedCaretPosition = EditCaretPositioning.saveSelection(e2.currentTarget);
141994
142044
  setCaretPosition(savedCaretPosition);
141995
- const acceptedChars = getAcceptedChars(sequenceData2);
141996
- let newBases = "";
141997
- newVal2.split("").forEach((letter) => {
141998
- if (acceptedChars.includes(letter.toLowerCase())) {
141999
- newBases += letter;
142000
- }
142001
- });
142002
- if (newVal2.length !== newBases.length) {
142045
+ const [newBases, warnings] = filterSequenceString(newVal2, sequenceData2);
142046
+ if (warnings.length) {
142003
142047
  setTempError(true);
142004
142048
  setTimeout(() => {
142005
142049
  setTempError(false);